Commit Graph

7033 Commits

Author SHA1 Message Date
Fusion (runfusion.ai)
dde2d062f0 feat(FN-4912): complete Step 10 — delivery artifacts
Fusion-Task-Id: FN-4912
Fusion-Task-Lineage: 943d0651-052a-41b5-8069-4c60f4db1ba7
2026-05-17 23:29:21 -07:00
Fusion (runfusion.ai)
48caf28148 test(FN-4912): complete Step 9 — add env materialization verification coverage
Fusion-Task-Id: FN-4912
Fusion-Task-Lineage: 943d0651-052a-41b5-8069-4c60f4db1ba7
2026-05-17 23:29:21 -07:00
Fusion (runfusion.ai)
ffd4d83c09 feat(FN-4912): complete Step 8 — update secrets env docs
Fusion-Task-Id: FN-4912
Fusion-Task-Lineage: 943d0651-052a-41b5-8069-4c60f4db1ba7
2026-05-17 23:29:21 -07:00
Fusion (runfusion.ai)
59023b7f50 feat(FN-4912): complete Step 7 — add orphan cleanup env teardown
Fusion-Task-Id: FN-4912
Fusion-Task-Lineage: 943d0651-052a-41b5-8069-4c60f4db1ba7
2026-05-17 23:29:20 -07:00
Fusion (runfusion.ai)
c8d01ca80d feat(FN-4912): complete Step 6 — wire env writes into acquisition
Fusion-Task-Id: FN-4912
Fusion-Task-Lineage: 943d0651-052a-41b5-8069-4c60f4db1ba7
2026-05-17 23:29:20 -07:00
Fusion (runfusion.ai)
a8615ecf6c feat(FN-4912): complete Step 5 — add secrets env writer helpers
Fusion-Task-Id: FN-4912
Fusion-Task-Lineage: 943d0651-052a-41b5-8069-4c60f4db1ba7
2026-05-17 23:29:20 -07:00
Fusion (runfusion.ai)
4ab60aefb4 feat(FN-4912): complete Step 4 — document env audit metadata
Fusion-Task-Id: FN-4912
Fusion-Task-Lineage: 943d0651-052a-41b5-8069-4c60f4db1ba7
2026-05-17 23:29:20 -07:00
Fusion (runfusion.ai)
cbac381f65 feat(FN-4912): complete Step 3 — secrets env export listing
Fusion-Task-Id: FN-4912
Fusion-Task-Lineage: 943d0651-052a-41b5-8069-4c60f4db1ba7
2026-05-17 23:29:20 -07:00
Fusion (runfusion.ai)
ec51e71289 feat(FN-4912): complete Step 2 — settings surface
Fusion-Task-Id: FN-4912
Fusion-Task-Lineage: 943d0651-052a-41b5-8069-4c60f4db1ba7
2026-05-17 23:29:20 -07:00
gsxdsm
aeee05ddc4 test: skip slow github copilot panel test and two flaky file-scope tests
- SettingsModal "renders github copilot device code panel" was the
  single slowest dashboard test (~4s wall) due to userEvent + a 5s
  waitFor. Skipping per request.
- merger-file-scope-invariant.test.ts "accepts declared scope as a
  single changeset file" / "as a changeset glob" flake under
  workspace-concurrent runs: the vi.mock of node:child_process
  occasionally doesn't take effect, so execAsync("git diff --cached
  --name-only") reaches the real git binary and reports unrelated
  staged files. Same logic remains covered by the real-git fixture
  tests in reliability-interactions/workflow-and-file-scope.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 23:25:26 -07:00
Fusion (runfusion.ai)
307cf0c4b6 feat(FN-4908): complete Step 6 — add changeset and delivery notes
Fusion-Task-Id: FN-4908
Fusion-Task-Lineage: 97d96ea4-8618-43cc-8448-0132cd57974e
2026-05-17 23:21:35 -07:00
Fusion (runfusion.ai)
507da28fba feat(FN-4908): complete Step 3 — switch reliability route to SQL aggregations
Fusion-Task-Id: FN-4908
Fusion-Task-Lineage: 97d96ea4-8618-43cc-8448-0132cd57974e
2026-05-17 23:21:34 -07:00
Fusion (runfusion.ai)
3037bbf9d6 feat(FN-4908): complete Step 1 — add SQL reliability aggregations
Fusion-Task-Id: FN-4908
Fusion-Task-Lineage: 97d96ea4-8618-43cc-8448-0132cd57974e
2026-05-17 23:21:34 -07:00
gsxdsm
b1d1221ba6 fix(desktop): build preload as CJS so contextBridge actually fires
esbuild was emitting preload.js as ESM (format:"esm"), but Electron
loads preload scripts via its sandboxed Node context, which is CJS.
With an ESM preload, the contextBridge.exposeInMainWorld calls
silently no-op, leaving window.fusionShell / window.fusionAPI
undefined in the renderer — which is why the dashboard always fell
through to "Can't reach the Fusion backend" and DesktopLaunchGate
always logged "window.fusionShell unavailable; bypassing".

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 23:18:30 -07:00
gsxdsm
9730190569 chore: ignore desktop binary distribution artifacts
Untrack the 461MB packages/desktop/fusion-desktop-0.31.0.tgz and broaden
.gitignore to cover desktop packager outputs (.tgz, .zip, .pkg, .msi,
.deb, .rpm, .snap, .blockmap, latest*.yml, builder-debug.yml) so future
electron-builder/pnpm-pack output is not committed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 23:09:30 -07:00
Fusion (runfusion.ai)
07fe2cd91d test(FN-5006): complete Step 2 — add changeset-only scope overlap regressions
Fusion-Task-Id: FN-5006
Fusion-Task-Lineage: 30b6651f-8b0b-4918-aec9-77c4cb59cb85
2026-05-17 23:05:23 -07:00
Fusion (runfusion.ai)
e9a1c103ea fix(FN-5006): complete Step 1 — fix changeset scope overlap logic
Fusion-Task-Id: FN-5006
Fusion-Task-Lineage: 30b6651f-8b0b-4918-aec9-77c4cb59cb85
2026-05-17 23:05:23 -07:00
gsxdsm
2e9c819dd5 fix(desktop): include onChangeLaunchMode in buildAppMenu assertion
The recently added "Change Launch Mode…" menu wiring made main.ts pass
an extra onChangeLaunchMode callback to buildAppMenu(). The
main-integration test still asserted the old exact-shape {mainWindow,
appName} payload, so it failed once concurrent test load made
ordering matter. Switched to expect.objectContaining so future
buildAppMenu props don't break this test.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 23:04:19 -07:00
gsxdsm
3e944ed620 chore(changeset): add FN-4767 PR creation flow entry
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 23:02:44 -07:00
gsxdsm
10d5afdb8e fix(desktop): Change Launch Mode menu performs reset entirely in main
Replace the renderer-event approach (which silently failed when the
renderer-side listener wasn't yet registered) with an onChangeLaunchMode
callback wired through AppMenuOptions. The callback runs
resetLaunchModeAndReload in main: writes shell settings to clear the
chosen mode, stops the embedded runtime, then navigates the window
directly to the renderer entrypoint with no cached query params so the
launch gate re-prompts.

Also surface the same flow from the dashboard's BackendConnectionErrorPage:
when running inside the desktop shell, the "Can't reach the Fusion backend"
page now offers a "Change Launch Mode…" button alongside Retry, so a user
who chose a broken backend isn't stuck without the Electron menubar.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 22:58:34 -07:00
gsxdsm
02ba659dd8 feat(FN-4969): merge fusion/fn-4969 2026-05-17 22:57:15 -07:00
Fusion (runfusion.ai)
e2938114c0 feat(FN-5003): complete Step 8 — document invariant and finalize tests
Fusion-Task-Id: FN-5003
Fusion-Task-Lineage: c5f1f326-934b-4cfc-8ba9-a2ac70a4f4f4
2026-05-17 22:49:55 -07:00
Fusion (runfusion.ai)
a61dfd3f5d test(FN-5003): assert noop audit emission in merge recovery
Fusion-Task-Id: FN-5003
Fusion-Task-Lineage: c5f1f326-934b-4cfc-8ba9-a2ac70a4f4f4
2026-05-17 22:49:55 -07:00
Fusion (runfusion.ai)
18e827dc81 test(FN-5003): add post-finalize noop status-write race coverage
Fusion-Task-Id: FN-5003
Fusion-Task-Lineage: c5f1f326-934b-4cfc-8ba9-a2ac70a4f4f4
2026-05-17 22:49:55 -07:00
Fusion (runfusion.ai)
9ca7a5b90e fix(FN-5003): register post-finalize noop audit mutation
Fusion-Task-Id: FN-5003
Fusion-Task-Lineage: c5f1f326-934b-4cfc-8ba9-a2ac70a4f4f4
2026-05-17 22:49:55 -07:00
Fusion (runfusion.ai)
064e42c347 feat(FN-5003): complete Step 2 — add pre-write noop guards
Fusion-Task-Id: FN-5003
Fusion-Task-Lineage: c5f1f326-934b-4cfc-8ba9-a2ac70a4f4f4
2026-05-17 22:49:55 -07:00
gsxdsm
f40accd4bc perf(cli): cut test suite from 32s to 11s wall
Two heavy CLI tests were dominating wall time:
- chat.test.ts "--once exits with timeout note" waited the real 30s
  reply-timeout floor. Added a replyTimeoutMs option to
  runChatInteractive so the test can use 200ms.
- bundled-plugin-install.test.ts "loads the real bundled dependency
  graph plugin" runs esbuild and a live PluginLoader (~18s). Gated
  behind FUSION_RUN_SLOW_TESTS=1; the install/upgrade logic is covered
  by mocked unit tests in the same file.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 22:47:53 -07:00
gsxdsm
1f0bb7e018 fix(core): skip real keychain in tests to stop 15s keytar hangs
MasterKeyManager.loadKeytar() now bails out early when
FUSION_MASTER_KEY_DISABLE_KEYCHAIN=1, and the core vitest setup sets that
flag for every worker. Eight tests across master-key/secrets-store/
secrets-sync-passphrase were timing out at exactly the 15s testTimeout
because they constructed MasterKeyManager without injecting a fake
KeytarLike, which made loadKeytar() reach the real OS keychain.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 22:45:29 -07:00
gsxdsm
51e28fb7ca fix(desktop): re-show hidden window on dock/Finder activate + log gate flow
The close handler hides the BrowserWindow instead of destroying it, so
once closed, subsequent dock or Finder activations were no-ops because
the activate handler only created a new window when mainWindow === null.
Show + focus the existing window if it's hidden so relaunch behaves as
expected. Also add console.log breadcrumbs in DesktopLaunchGate so we
can diagnose why the chooser sometimes appears not to render.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 22:24:40 -07:00
gsxdsm
75a712771e feat(desktop): Connection → Change Launch Mode menu item
Adds a "Connection" submenu with a "Change Launch Mode…" item that lets
users switch between Run Locally and Connect to Remote after the initial
chooser. The menu sends shell:reset-desktop-mode-request to the renderer;
the dashboard's DesktopLaunchGate listens, calls the new
shell:resetDesktopMode IPC (clears hasCompletedModeSelection, stops the
embedded runtime), strips the cached serverBaseUrl/shellMode query params,
and reloads so the gate re-prompts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 22:16:27 -07:00
gsxdsm
3cae2a30b9 feat(FN-5000): merge fusion/fn-5000 2026-05-17 22:11:42 -07:00
gsxdsm
b143f6c88b feat(dashboard): desktop launch gate for run-local vs connect-remote
Wrap <App /> in a DesktopLaunchGate that runs only inside the Electron shell.
On first run it shows a chooser (Run Locally / Connect Remote). On "local"
it calls setDesktopMode("local") so main starts the embedded runtime, polls
shell:getState until localRuntime.state === "running", then reloads with
?serverBaseUrl=http://127.0.0.1:<port> so the dashboard's API calls route
to the embedded server (file:// origins can't resolve relative /api). On
"remote" it opens the existing connection manager. Replaces the dead-end
"can't reach backend" landing in the packaged desktop app.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 22:10:58 -07:00
gsxdsm
e5af9c93ae fix(desktop): packaged macOS app launched with no window / blank white screen
In packaged Electron builds, `process.argv[1]` is undefined (Electron loads
the main script via package.json `main`, not via argv), so the bottom-of-file
guard never invoked `run()` and the app started without creating a window.
Also build the dashboard client with `--base ./` so its `file://`-loaded
index.html resolves `./assets/*` from inside the asar instead of the
filesystem root, which was producing a blank white window.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 22:01:51 -07:00
Fusion (runfusion.ai)
56a7178aca feat(FN-4959): complete Step 5 — add changeset for fn_task_update priority
Fusion-Task-Id: FN-4959
Fusion-Task-Lineage: 59a0c481-5a2d-4a2f-9230-3a5437b687a6
2026-05-17 21:46:58 -07:00
Fusion (runfusion.ai)
ceacad78a1 chore(FN-4959): complete Step 4 — regenerate fusion skill tool references
Fusion-Task-Id: FN-4959
Fusion-Task-Lineage: 59a0c481-5a2d-4a2f-9230-3a5437b687a6
2026-05-17 21:46:58 -07:00
Fusion (runfusion.ai)
716a45a96b test(FN-4959): complete Step 3 — cover priority updates on fn_task_update
Fusion-Task-Id: FN-4959
Fusion-Task-Lineage: 59a0c481-5a2d-4a2f-9230-3a5437b687a6
2026-05-17 21:46:58 -07:00
Fusion (runfusion.ai)
e0e0bc5bef feat(FN-4959): complete Step 2 — extend fn_task_update priority support
Fusion-Task-Id: FN-4959
Fusion-Task-Lineage: 59a0c481-5a2d-4a2f-9230-3a5437b687a6
2026-05-17 21:46:58 -07:00
Fusion (runfusion.ai)
53e0372bc9 test(FN-4986): complete Step 3 — update footer cluster alignment assertions
Fusion-Task-Id: FN-4986
Fusion-Task-Lineage: d7a2c969-f3ea-4f93-bcdb-f86521845fce
2026-05-17 21:34:06 -07:00
Fusion (runfusion.ai)
10d00423a4 feat(FN-4986): complete Step 2 — align footer chip cluster via first-chip anchor
Fusion-Task-Id: FN-4986
Fusion-Task-Lineage: d7a2c969-f3ea-4f93-bcdb-f86521845fce
2026-05-17 21:34:06 -07:00
Fusion (runfusion.ai)
d856788d55 feat(FN-4954): complete Step 8 — documentation and changeset
Fusion-Task-Id: FN-4954
Fusion-Task-Lineage: b3dd2d2f-3aa3-48f1-8a56-56e66518d139
2026-05-17 21:17:38 -07:00
Fusion (runfusion.ai)
b8514b658e test(FN-4954): cover pool double-lease throw and fresh fallback
Fusion-Task-Id: FN-4954
Fusion-Task-Lineage: b3dd2d2f-3aa3-48f1-8a56-56e66518d139
2026-05-17 21:17:38 -07:00
Fusion (runfusion.ai)
c6453ca956 fix(FN-4954): complete Step 7 — restore green verification gates
Fusion-Task-Id: FN-4954
Fusion-Task-Lineage: b3dd2d2f-3aa3-48f1-8a56-56e66518d139
2026-05-17 21:17:38 -07:00
Fusion (runfusion.ai)
c15a74e187 fix(FN-4954): correct runtime pool invariant audit emission
Fusion-Task-Id: FN-4954
Fusion-Task-Lineage: b3dd2d2f-3aa3-48f1-8a56-56e66518d139
2026-05-17 21:17:38 -07:00
Fusion (runfusion.ai)
04b965dbef test(FN-4954): complete Step 6 — add merger/pool reliability backstop
Fusion-Task-Id: FN-4954
Fusion-Task-Lineage: b3dd2d2f-3aa3-48f1-8a56-56e66518d139
2026-05-17 21:17:38 -07:00
Fusion (runfusion.ai)
7e90bce8bb feat(FN-4954): harden pool leasing invariants and wire runtime auditing
Fusion-Task-Id: FN-4954
Fusion-Task-Lineage: b3dd2d2f-3aa3-48f1-8a56-56e66518d139
2026-05-17 21:17:38 -07:00
Fusion (runfusion.ai)
0606e3aaea feat(FN-4954): complete Step 3 — add pool double-lease audit mutation type
Fusion-Task-Id: FN-4954
Fusion-Task-Lineage: b3dd2d2f-3aa3-48f1-8a56-56e66518d139
2026-05-17 21:17:38 -07:00
Fusion (runfusion.ai)
dd234d21e6 test(FN-4954): complete Step 2 — reproduce pool rehydrate double-lease race
Fusion-Task-Id: FN-4954
Fusion-Task-Lineage: b3dd2d2f-3aa3-48f1-8a56-56e66518d139
2026-05-17 21:17:38 -07:00
Fusion (runfusion.ai)
296262b07a test(FN-4987): align session-start interaction tests with recovery contract
Fusion-Task-Id: FN-4987
Fusion-Task-Lineage: 7825b364-d7b2-45fd-8eb1-94b7a08fa7ba
2026-05-17 20:10:17 -07:00
Fusion (runfusion.ai)
d2a5ff95c2 test(FN-4987): complete Step 5 — tighten unrelated failure guard assertions
Fusion-Task-Id: FN-4987
Fusion-Task-Lineage: 7825b364-d7b2-45fd-8eb1-94b7a08fa7ba
2026-05-17 20:10:16 -07:00
Fusion (runfusion.ai)
34d196c3f0 test(FN-4987): complete Step 4 — assert exhausted retry-cap behavior
Fusion-Task-Id: FN-4987
Fusion-Task-Lineage: 7825b364-d7b2-45fd-8eb1-94b7a08fa7ba
2026-05-17 20:10:16 -07:00