Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
1671834
top on a desk
icecrasher321 Jul 18, 2026
36ddb56
fix auth stuff
icecrasher321 Jul 18, 2026
37df74b
intermediate state
Sg312 Jul 18, 2026
a8da276
update
Sg312 Jul 18, 2026
68f5857
local filesystem fixes
Sg312 Jul 18, 2026
fb4c2de
Merge remote-tracking branch 'origin/staging' into staging-v4
icecrasher321 Jul 18, 2026
0b00bf6
Huge
Sg312 Jul 18, 2026
6d929c0
fix banner
icecrasher321 Jul 18, 2026
fafeaf7
Merge branch 'staging-v4' of github.com:simstudioai/sim into staging-v4
icecrasher321 Jul 18, 2026
061c5cb
ci: disable desktop release + e2e in CI for now
icecrasher321 Jul 19, 2026
9b263a5
ci: exempt electron from the release-age gate (time-boxed)
icecrasher321 Jul 19, 2026
5e67313
desktop: brand app icon (packaged + dev Dock)
icecrasher321 Jul 19, 2026
f8e5f9e
desktop: switch app icon to the b&w brand mark
icecrasher321 Jul 19, 2026
34dd7c4
fix banner
icecrasher321 Jul 19, 2026
df802ab
Fix
Sg312 Jul 19, 2026
e20d836
Merge branch 'staging-v4' of github.com:simstudioai/sim into staging-v4
icecrasher321 Jul 19, 2026
c5b44bb
clean up launcher
Sg312 Jul 19, 2026
a79a31b
fix oauth
icecrasher321 Jul 19, 2026
57911c8
Merge branch 'staging-v4' of github.com:simstudioai/sim into staging-v4
icecrasher321 Jul 19, 2026
178ac98
update desktop app
Sg312 Jul 19, 2026
d41919d
Improve browser use and consolidate desktop app
Sg312 Jul 19, 2026
97ef2af
Desktop app ui cleanup
Sg312 Jul 20, 2026
96b74ee
Updates
Sg312 Jul 20, 2026
6498381
Updates
Sg312 Jul 20, 2026
2dacf52
remove dev tool option
Sg312 Jul 20, 2026
fec8b4b
Browser updates
Sg312 Jul 20, 2026
46a62bd
Fix electron bug
Sg312 Jul 20, 2026
39c9fe6
Browser shortcuts
Sg312 Jul 20, 2026
911c0d7
lifecycle
Sg312 Jul 20, 2026
8ae3d60
feat(desktop): SSRF hardening + shared @sim/security/ssrf (re-home of…
waleedlatif1 Jul 21, 2026
7430094
refactor: split pure host helpers into @sim/security/hostnames (ipadd…
waleedlatif1 Jul 21, 2026
2453f36
Desktop app fullscreen mode
Sg312 Jul 21, 2026
c8a65d0
fix(copilot): report closed browser session as a distinct terminal to…
Sg312 Jul 22, 2026
78b3b41
fix(desktop): route Cmd+W to focused browser tabs
Sg312 Jul 22, 2026
ac633f5
fix(desktop): reserve macOS title bar safe area
Sg312 Jul 22, 2026
4510963
fix(desktop): limit title bar safe area to login
Sg312 Jul 23, 2026
9c791c5
fix install script
icecrasher321 Jul 23, 2026
927c767
Merge branch 'staging-v4' of github.com:simstudioai/sim into staging-v4
icecrasher321 Jul 23, 2026
3154713
feat(desktop): improve local folder settings
Sg312 Jul 23, 2026
dc8c39c
feat(desktop): harden local capabilities and window chrome
Sg312 Jul 23, 2026
36bb046
fix(invitations): live refetches
icecrasher321 Jul 23, 2026
329e413
Merge branch 'staging-v4' of github.com:simstudioai/sim into staging-v4
icecrasher321 Jul 23, 2026
4d7cde9
fix(desktop): make manual update checks use updater state
Sg312 Jul 23, 2026
b314160
fix(desktop): review fixes — OAuth error handling, query freshness, i…
icecrasher321 Jul 23, 2026
997ae73
updates
Sg312 Jul 24, 2026
d2cce12
fix(desktop): use workflow colors for environment icons
Sg312 Jul 24, 2026
1217c70
fix(desktop): use orange for dev icon border
Sg312 Jul 24, 2026
3a3bb88
fix(login): change one time token generation to GET
TheodoreSpeaks Jul 24, 2026
6e7211b
improvement(desktop): reveal local folders from settings
TheodoreSpeaks Jul 24, 2026
0148922
improvement(desktop): row actions menu for folder grants, larger vers…
TheodoreSpeaks Jul 24, 2026
ff39812
feat(desktop): improve browser tab usability
Sg312 Jul 24, 2026
2f2d219
fix(desktop): thicken environment icon borders
Sg312 Jul 24, 2026
6ab3aa0
fix(desktop): strengthen environment icon borders
Sg312 Jul 24, 2026
dc5d1b5
feat(desktop): support multiple windows and harden the agent browser
Sg312 Jul 24, 2026
a151d0a
fix(desktop): close clipboard, glob DoS, and authorization holes
Sg312 Jul 24, 2026
a5e15f2
fix(desktop): stop double sign-out, stranded retries, and redundant w…
Sg312 Jul 24, 2026
2ac89be
fix(desktop): leaked timers, silent grep failures, and crashed tabs
Sg312 Jul 24, 2026
4529d5d
fix(desktop): reach framed elements and harden the loopback sign-in
Sg312 Jul 24, 2026
2b7a509
refactor(desktop): drop duplicated helpers and stop logging query str…
Sg312 Jul 24, 2026
60ebcbe
refactor(desktop): move browser compositing out of the session module
Sg312 Jul 24, 2026
b0c2d66
refactor: drop the legacy local_* filesystem tool shim
Sg312 Jul 24, 2026
ac55b1f
refactor(copilot): remove the plan/changelog VFS artifacts and workfl…
Sg312 Jul 24, 2026
c432ee9
refactor(copilot): remove the dead planArtifact column plumbing
Sg312 Jul 24, 2026
fb2132e
chore(copilot): sync the tool catalog for load_skill
Sg312 Jul 24, 2026
68b5366
refactor(copilot): follow the load_custom_tool rename to load_mcp_tool
Sg312 Jul 24, 2026
8690cab
chore(copilot): sync the tool catalog and hide load_skill in the UI
Sg312 Jul 24, 2026
a3f39e3
fix(auth): handle session expiry in the app, not the desktop shell
TheodoreSpeaks Jul 24, 2026
270ca93
fix(copilot): port the scheduled-task and VFS fixes onto staging-v4
Sg312 Jul 25, 2026
bc48f0d
feat(desktop): let the model actually see browser screenshots
Sg312 Jul 25, 2026
2b34864
fix(desktop): polish browser panel and environment tray icon
Sg312 Jul 25, 2026
3d20666
fix(desktop): enlarge environment tray markers
Sg312 Jul 25, 2026
1666f33
fix(desktop): smooth environment tray markers
Sg312 Jul 25, 2026
4621a6d
refactor(copilot): consolidate resource mutation tools
Sg312 Jul 25, 2026
3795a89
chore(copilot): clean up VFS follow-ups
Sg312 Jul 25, 2026
d42666d
fix(desktop): round the dev tray marker
Sg312 Jul 25, 2026
d078cd0
feat(desktop): add integrated terminal resources
Sg312 Jul 25, 2026
93de905
Fix electron app resize causing glitchy browser frames
TheodoreSpeaks Jul 25, 2026
791aa59
feat(copilot): add persistent tool permissions
Sg312 Jul 25, 2026
ec3f997
fix(copilot): retire stale tool permission prompts
Sg312 Jul 25, 2026
abc7a36
fix(desktop): keep terminal rendering responsive
Sg312 Jul 25, 2026
ffe603a
fix(desktop): preserve resource rendering continuity
Sg312 Jul 25, 2026
98e796a
feat(desktop): add browser tab duplication actions
Sg312 Jul 25, 2026
055b7b4
feat(desktop): add terminal tab context actions
Sg312 Jul 25, 2026
39754e7
fix(desktop): allow browser agent localhost navigation
Sg312 Jul 25, 2026
d8f7970
feat(desktop): add tmux-backed terminal sessions
Sg312 Jul 25, 2026
db6eab4
fix(desktop): restore terminal scrollback per view
Sg312 Jul 25, 2026
aafa050
chore(copilot): sync updated wait tool contract
Sg312 Jul 25, 2026
859e1d7
poll terminal session state for non regular shells
icecrasher321 Jul 25, 2026
8ef6749
Merge branch 'staging-v4' of github.com:simstudioai/sim into staging-v4
icecrasher321 Jul 25, 2026
2381ef7
add terminal right click menu
icecrasher321 Jul 25, 2026
6edd6e8
feat(desktop): add terminal handoff and key batching
Sg312 Jul 25, 2026
8e92133
fix(desktop): reserve the traffic-light lane from the platform
TheodoreSpeaks Jul 25, 2026
4ba5456
fix(desktop): avoid transient terminal tab labels
Sg312 Jul 25, 2026
fb28fff
feat(copilot): attach browser and terminal tab context
Sg312 Jul 25, 2026
2dc58e6
feat(desktop): close tmux panes from terminal tools
Sg312 Jul 25, 2026
edadf4e
fix(desktop): keep terminal tab icons stable
Sg312 Jul 25, 2026
436ffd6
add right click to browser and cleanup terminal right click options
icecrasher321 Jul 25, 2026
1e210f4
Merge branch 'staging-v4' of github.com:simstudioai/sim into staging-v4
icecrasher321 Jul 25, 2026
7c146c6
fix(desktop): reduce hidden panel background work
Sg312 Jul 26, 2026
d49fa58
perf(desktop): shrink browser panel snapshots
Sg312 Jul 26, 2026
98a818d
perf(desktop): reduce terminal main process overhead
Sg312 Jul 26, 2026
a7539dc
perf(terminal): pause work for hidden sessions
Sg312 Jul 26, 2026
096e2f7
fix session arch for desktop
icecrasher321 Jul 26, 2026
984fba7
Merge branch 'staging-v4' of github.com:simstudioai/sim into staging-v4
icecrasher321 Jul 26, 2026
d7a4647
fix(desktop): replace exited terminal sessions
Sg312 Jul 26, 2026
f822a52
feat(copilot): persist desktop resources across chats
Sg312 Jul 26, 2026
18fa325
fix(emcn): keep resource tab widths consistent
Sg312 Jul 26, 2026
6839966
fix(copilot): restore active client panels
Sg312 Jul 26, 2026
8f45b0c
feat(desktop): import Chrome browser data
Sg312 Jul 26, 2026
7ef8ae7
fix(copilot): close resources before chat creation
Sg312 Jul 26, 2026
9b22924
feat(desktop): suggest imported browser sites
Sg312 Jul 26, 2026
bd59c5c
fix(desktop): autofill identifier-first sign-ins
Sg312 Jul 26, 2026
6117140
fix resizing issues + cookies source
icecrasher321 Jul 27, 2026
7ea6747
fix visits marking
icecrasher321 Jul 27, 2026
8f52988
chore(db): drop branch migrations ahead of staging merge
icecrasher321 Jul 27, 2026
b804c24
Merge origin/staging into staging-v4
icecrasher321 Jul 27, 2026
4602221
feat(db): regenerate copilot tool-permission migration on top of staging
icecrasher321 Jul 27, 2026
df3ba63
add cmd f
icecrasher321 Jul 28, 2026
8ab978a
review pass
icecrasher321 Jul 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
211 changes: 211 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,48 @@ jobs:
echo "ℹ️ Not a release commit"
fi

# Detect shell-code changes on dev/staging pushes. Web-only changes never
# need a desktop build (installed shells load the web app live); changes to
# the Electron app or the bridge packages trigger a per-env prerelease build
# (dev → alpha channel, staging → beta) that the env's update feed
# (/api/desktop/update) starts offering automatically.
detect-desktop-changes:
name: Detect Desktop Changes
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 5
if: github.event_name == 'push' && (github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/staging')
outputs:
changed: ${{ steps.diff.outputs.changed }}
steps:
- name: Checkout code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
fetch-depth: 50

- name: Diff desktop paths
id: diff
env:
BEFORE: ${{ github.event.before }}
run: |
# Force pushes (dev resets) can reference a BEFORE we don't have;
# fall back to the previous commit, and to no build when even that
# is unavailable.
if [ -z "$BEFORE" ] || ! git cat-file -e "$BEFORE" 2>/dev/null; then
BEFORE="$(git rev-parse HEAD^ 2>/dev/null || echo '')"
fi
if [ -z "$BEFORE" ]; then
echo "changed=false" >> "$GITHUB_OUTPUT"
echo "ℹ️ No comparable base commit; skipping desktop prerelease"
exit 0
fi
if git diff --name-only "$BEFORE" HEAD | grep -qE '^(apps/desktop/|packages/desktop-bridge/|packages/browser-protocol/)'; then
echo "changed=true" >> "$GITHUB_OUTPUT"
echo "✅ Desktop shell code changed"
else
echo "changed=false" >> "$GITHUB_OUTPUT"
echo "ℹ️ No desktop shell changes"
fi

# Run database migrations before images are promoted: the ECR latest/staging
# tag push triggers CodePipeline, so migrating first guarantees the schema is
# in place before the new app version deploys (replaces the removed ECS
Expand Down Expand Up @@ -590,3 +632,172 @@ jobs:
env:
GH_PAT: ${{ secrets.GITHUB_TOKEN }}
run: bun run scripts/create-single-release.ts ${{ needs.detect-version.outputs.version }}

# Desktop release: builds, signs, notarizes, and attaches the macOS app to
# the GitHub release created above. Gated on the Apple signing secrets so a
# release pipeline run skips cleanly (instead of failing) until the Apple
# Developer account is provisioned — the moment the six secrets exist, the
# next vX.Y.Z release ships desktop artifacts with no further changes.
# Job-level `if:` cannot read the secrets context, hence the probe job.
check-desktop-signing:
name: Check Desktop Signing Secrets
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 2
needs: [detect-version, detect-desktop-changes]
# !cancelled(): detect-desktop-changes is skipped on main (and
# detect-version tags only on main); either path may need the probe.
if: ${{ !cancelled() && (needs.detect-version.outputs.is_release == 'true' || needs.detect-desktop-changes.outputs.changed == 'true') }}
outputs:
configured: ${{ steps.check.outputs.configured }}
steps:
- name: Probe Apple signing secrets
id: check
env:
CONFIGURED: ${{ secrets.CSC_LINK != '' && secrets.CSC_KEY_PASSWORD != '' && secrets.APPLE_API_KEY_P8 != '' && secrets.APPLE_API_KEY_ID != '' && secrets.APPLE_API_ISSUER != '' && secrets.APPLE_TEAM_ID != '' }}
run: |
echo "configured=${CONFIGURED}" >> "$GITHUB_OUTPUT"
if [ "$CONFIGURED" != "true" ]; then
echo "::warning::Desktop release skipped: Apple signing secrets are not configured (CSC_LINK, CSC_KEY_PASSWORD, APPLE_API_KEY_P8, APPLE_API_KEY_ID, APPLE_API_ISSUER, APPLE_TEAM_ID)."
fi

desktop-release:
name: Desktop Release
needs: [create-release, check-desktop-signing, detect-version]
if: needs.check-desktop-signing.outputs.configured == 'true'
permissions:
contents: write
uses: ./.github/workflows/desktop-release.yml
with:
version: ${{ needs.detect-version.outputs.version }}
publish: true
secrets: inherit

# Per-env desktop prereleases: a dev/staging push that touches shell code
# publishes a channel-tagged GitHub prerelease (vX.Y.Z-alpha.N from dev,
# vX.Y.Z-beta.N from staging). Each environment's /api/desktop/update feed
# offers only its channel, so dev-pointed shells pick up alpha builds,
# staging-pointed shells beta builds, and prod-pointed shells stable
# releases — independently. Unlike stable releases, prereleases build even
# before the Apple signing secrets exist — unsigned, so the update pipeline
# is testable end to end; installed shells detect the missing Developer ID
# and offer a manual download instead of a Squirrel install.
create-desktop-prerelease:
name: Create Desktop Prerelease
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 5
needs: [detect-desktop-changes, check-desktop-signing]
# Requires the signing probe to have actually succeeded (not just "not
# cancelled") so a probe failure can't produce a release with no build.
if: ${{ !cancelled() && needs.detect-desktop-changes.outputs.changed == 'true' && needs.check-desktop-signing.result == 'success' }}
permissions:
contents: write
outputs:
version: ${{ steps.version.outputs.version }}
steps:
- name: Checkout code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- name: Compute prerelease version and create draft release
id: version
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
SIGNED: ${{ needs.check-desktop-signing.outputs.configured }}
run: |
if [ "$GITHUB_REF" = "refs/heads/dev" ]; then CHANNEL=alpha; APP_NAME="Sim Dev"; else CHANNEL=beta; APP_NAME="Sim Staging"; fi
# Prerelease core = next patch after the latest stable release, so
# channel builds always outrank the stable they are built on top of
# and are always superseded by the next stable. The run-attempt
# suffix keeps re-runs of the same workflow from colliding on the
# tag while preserving semver ordering.
LATEST="$(gh release list --exclude-pre-releases --limit 1 --json tagName --jq '.[0].tagName' || true)"
LATEST="${LATEST:-v0.0.0}"
IFS='.' read -r MAJOR MINOR PATCH <<< "${LATEST#v}"
TAG="v${MAJOR}.${MINOR}.$((PATCH + 1))-${CHANNEL}.${GITHUB_RUN_NUMBER}.${GITHUB_RUN_ATTEMPT}"
NOTES="Automated ${CHANNEL}-channel desktop build from ${GITHUB_REF_NAME} @ ${GITHUB_SHA::7}."
if [ "$SIGNED" != "true" ]; then
NOTES="$NOTES

⚠️ Unsigned test build (Apple signing secrets not configured). Gatekeeper will quarantine a downloaded copy: right-click → Open, or clear the flag with \`xattr -dr com.apple.quarantine \"/Applications/${APP_NAME}.app\"\`."
fi
# Draft until the build uploads its artifacts: drafts are invisible
# to the update feed, so a failed or in-flight build can never take
# the channel down with an assetless release. Publishing later also
# defers tag creation, so failed builds strand no tags.
gh release create "$TAG" \
--draft \
--prerelease \
--target "$GITHUB_SHA" \
--title "$TAG" \
--notes "$NOTES"
echo "version=$TAG" >> "$GITHUB_OUTPUT"
echo "✅ Created draft prerelease $TAG"

desktop-prerelease:
name: Desktop Prerelease Build
needs: [create-desktop-prerelease, check-desktop-signing]
permissions:
contents: write
uses: ./.github/workflows/desktop-release.yml
with:
version: ${{ needs.create-desktop-prerelease.outputs.version }}
publish: true
sign: ${{ needs.check-desktop-signing.outputs.configured == 'true' }}
secrets: inherit

# The draft only becomes visible to the update feed once its artifacts are
# attached — this is what makes a dev/staging push atomic from the shell's
# point of view.
publish-desktop-prerelease:
name: Publish Desktop Prerelease
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 5
needs: [create-desktop-prerelease, desktop-prerelease]
permissions:
contents: write
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
TAG: ${{ needs.create-desktop-prerelease.outputs.version }}
steps:
- name: Publish the draft release
run: gh release edit "$TAG" --draft=false

# Keep the release list tidy: per channel, retain the newest 5 prereleases
# and delete the rest (with their tags, so dev force-resets don't strand
# commits behind stale tags). Leftover drafts (failed or superseded builds)
# are always garbage by this point — the current run's release is published.
prune-desktop-prereleases:
name: Prune Desktop Prereleases
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 5
needs: [publish-desktop-prerelease]
permissions:
contents: write
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
steps:
- name: Delete stale prereleases
run: |
if [ "$GITHUB_REF" = "refs/heads/dev" ]; then CHANNEL=alpha; else CHANNEL=beta; fi
gh release list --limit 100 --json tagName,isPrerelease,isDraft,createdAt \
--jq "[.[] | select(.isPrerelease and (.isDraft | not) and (.tagName | test(\"-${CHANNEL}\\\\.\")))] | sort_by(.createdAt) | reverse | .[5:] | .[].tagName" |
while read -r TAG; do
[ -n "$TAG" ] || continue
echo "Deleting stale prerelease $TAG"
gh release delete "$TAG" --cleanup-tag --yes
done

- name: Delete leftover draft prereleases
run: |
if [ "$GITHUB_REF" = "refs/heads/dev" ]; then CHANNEL=alpha; else CHANNEL=beta; fi
# Drafts have no tag ref, so delete by release id via the API
# (gh release delete resolves by tag, which is ambiguous for drafts).
gh api "repos/${GH_REPO}/releases?per_page=100" \
--jq ".[] | select(.draft and (.tag_name | test(\"-${CHANNEL}\\\\.\"))) | .id" |
while read -r ID; do
[ -n "$ID" ] || continue
echo "Deleting leftover draft release $ID"
gh api -X DELETE "repos/${GH_REPO}/releases/${ID}"
done
85 changes: 85 additions & 0 deletions .github/workflows/desktop-e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
name: Desktop E2E

# Smoke coverage of the real Electron shell, plus an advisory canary leg
# against electron@latest so Chromium-cadence breakage surfaces before an
# upgrade is attempted (U18/U22).
#
# Manual-only for now: the desktop app is tested locally, so the
# pull_request trigger is disabled until desktop CI is turned back on.

on:
workflow_dispatch:

concurrency:
group: desktop-e2e-${{ github.ref }}
cancel-in-progress: true

jobs:
e2e:
name: E2E (${{ matrix.electron }})
runs-on: macos-14
strategy:
fail-fast: false
matrix:
electron: [pinned, latest]
continue-on-error: ${{ matrix.electron == 'latest' }}
steps:
- name: Checkout code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: 1.3.13

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Switch to electron@latest (canary)
if: matrix.electron == 'latest'
working-directory: apps/desktop
run: bun add -d electron@latest

- name: Bundle main and preload
working-directory: apps/desktop
run: bun run build

- name: Run Playwright _electron smoke suite
working-directory: apps/desktop
run: bunx playwright test

- name: Upload test results
if: failure()
uses: actions/upload-artifact@v4
with:
name: desktop-e2e-results-${{ matrix.electron }}
path: apps/desktop/test-results
retention-days: 7

package-smoke:
name: Unsigned package smoke
runs-on: macos-14
steps:
- name: Checkout code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: 1.3.13

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 22

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Bundle and package unsigned
working-directory: apps/desktop
env:
CSC_IDENTITY_AUTO_DISCOVERY: 'false'
run: |
bun run build
bunx electron-builder --mac dir --publish never
Loading
Loading