chore(release): v0.40.0

Version bump via changesets.
This commit is contained in:
gsxdsm
2026-06-10 17:58:39 -07:00
parent 6b136b5f2d
commit 9f38b0d090
215 changed files with 1725 additions and 1171 deletions

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add a guarded interpreter-authoritative workflow cutover for coding-task lifecycle execution. The new capability stays default-off behind `experimentalFeatures.workflowInterpreterAuthoritative` and only activates when rollout-readiness checks pass, preserving legacy execution as the fallback path.

View File

@@ -1,10 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix custom-provider model resolution in the bundled engine for OpenAI Responses API providers.
- Align custom-provider reads with global settings directory resolution (including legacy `~/.pi/fusion` and `~/.pi/kb` migration paths), so providers persist across restart and remain visible during agent session creation.
- Ensure custom provider registration diagnostics include enough detail for troubleshooting registration failures.
- Improve configured-model resolution errors to clearly identify the failing `provider/model` selection while retaining the existing `"was not found in the pi model registry"` matcher substring and pointing users to Settings → Custom Providers.
- Add regression tests covering legacy settings-path custom-provider loading and openai-responses provider model resolution.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add mission↔goal linkage tooling across Fusion surfaces: REST mission goal endpoints, `fn mission goals|link-goal|unlink-goal` CLI commands, and `fn_mission_list_goals|fn_mission_link_goal|fn_mission_unlink_goal` pi-extension tools.

View File

@@ -1,10 +0,0 @@
---
"@runfusion/fusion": minor
---
Add mission↔goal batch linking support across REST, CLI, and pi-extension surfaces.
- `POST /api/missions` and `PATCH /api/missions/:missionId` now accept optional `goalIds: string[]` for mission goal linking on create and update.
- `fn mission create --goal <id>` supports repeatable goal flags to link goals during mission creation.
- Mission goal link surfaces now reject archived goals with `GOAL_ARCHIVED` while preserving `404` for missing goals.
- Unlink paths remain permissive so archived goals can still be removed from missions.

View File

@@ -1,7 +0,0 @@
---
"@runfusion/fusion": patch
---
Make `fn_goal_list` and `fn_goal_show` available in engine agent sessions, including executor, heartbeat, and triage runs.
Also make `fn_goal_list` output concise by truncating descriptions to short single-line snippets while keeping full goal descriptions available through `fn_goal_show`.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix mission→goal link write paths to return `400 { code: "GOAL_NOT_FOUND" }` instead of 404 for unknown goals, aligning the API, CLI, and pi tool contract.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix built-in workflow editor graph edge visibility so read-only built-in workflows render connected, clickable React Flow edges for success, failure, and rework paths.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Built-in coding workflow catalog (`builtin:coding`) now exposes the canonical `BUILTIN_CODING_WORKFLOW_IR` used by resolver/runtime fallback paths, removing drift between workflow surfaces.

View File

@@ -1,17 +0,0 @@
---
"@runfusion/fusion": minor
---
Add an ACP (Agent Client Protocol) client runtime plugin (`runtimeId: "acp"`)
that drives any external ACP-compatible agent over JSON-RPC/stdio, built on the
official `@agentclientprotocol/sdk`. Installed on demand (experimental).
The agent runs as an untrusted subprocess that calls back into Fusion, so the
integration ships a defense-in-depth security floor: per-category permission
gating against the live policy (never a preset shortcut; `allow_once` only;
unmappable kinds and missing policy default-deny), an unrestricted-risk
acknowledgement that escalates blanket allows to approval under the allow-all
default, an opt-in filesystem capability behind a real symlink-resolving cwd jail
(realpath + `O_NOFOLLOW`, secret/`.git` deny-list, writes gated through the
permission policy), untrusted-output sanitization and bounds, and an env
allow-list for the subprocess.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Agent-created tasks without explicit titles now request AI title summarization regardless of the project auto-summarize setting.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Harden AI merge temporary worktree cleanup with same-task pre-merge pruning and task-aware stale tempdir sweeping for completed or deleted tasks.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Initialize missing Git repositories automatically when registering Fusion projects.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Expose the dashboard file viewer to plugin views and use it for Compound Engineering artifact documents.

View File

@@ -1,13 +0,0 @@
---
"@runfusion/fusion": patch
---
Add the Codex, Droid, and Pi CLI agent adapters (U5).
Three new launch adapters join the engine's CLI agent executor, each declaring honest, verified capability flags so surfaces can render tier differences:
- **Codex** (hybrid tier): native turn-complete via the session-scoped `notify` config program (`-c notify=[…]`), capturing `thread-id` as the native session id; waiting-on-input is inferred from ANSI-stripped PTY prompt-pattern heuristics (approval menus, idle composer markers, with a spinner/working override) because Codex has no native waiting signal; resume via `codex resume <thread-id>`; rollout JSONL transcript tailed by probing (not hardcoding) the sessions directory for the file matching the thread-id.
- **Droid** (native tier): Claude-style hooks (`SessionStart`, `Stop`, `Notification`, tool-activity) delivering `session_id`/`transcript_path`/`permission_mode`; a message classifier splits the conflated `Notification` event into permission-request vs idle sub-reasons (both treated as waiting-on-input); resume via interactive `droid --resume <id>` or headless `droid exec -s <id>` — never the bare `-r` that means `--reasoning-effort` in exec mode.
- **Pi** (native tier): telemetry and transcript from session-JSONL tailing under a session-scoped `--session-dir`; lifecycle events (turn/agent start→busy, end→done, input-request→waiting) plus message rows→transcript; resume via `pi --session <path|partial-uuid>`.
A new `session-jsonl` transcript source is added to the adapter capability union for Pi.

View File

@@ -1,27 +0,0 @@
---
"@runfusion/fusion": minor
---
Wire the CLI Agent Executor as a selectable executor kind for the task execute
path (U7). A workflow node with `config.executor === "cli-agent"` (plus
`cliAdapterId` and optional `cliAutonomy`/`cliNotify`) now drives an engine-owned
CLI coding agent (Claude Code / Codex / Droid / Pi / generic) through the execute
step inside the task worktree.
The new `cli-agent/task-session.ts` orchestrates the task↔session lifecycle:
spawn in the worktree, mint the per-session hook token and write the hook scripts,
inject the task prompt after readiness, subscribe to the authoritative state
machine, and resolve on a positive completion signal (origin R20 gating — a
native `done` advances the pipeline; the generic tier never auto-advances on idle
and exposes a `confirmAdvance()` affordance instead). The resolved executor config
is snapshotted at launch, so a mid-run node-config edit applies to the next run
only. The PTY is reaped (recorded `completed`) at the execute→in-review handoff.
Lifecycle semantics honor the existing contracts: a hard cancel
(`moveTask(in-progress→todo)` / column-exit abort) SIGKILLs the CLI session via
the same dispose/abort path API sessions use and marks it `killed` (never
resume-eligible); a re-plan/RETHINK re-entry kills any prior live session and
launches fresh; a follow-up to a done task resumes the recorded native session id
when the adapter supports resume, else launches fresh. A PTY-pool ceiling
(`CliConcurrencyLimitError`) surfaces as a clear queued/rejected task state rather
than a silent stall.

View File

@@ -1,7 +0,0 @@
---
"@runfusion/fusion": patch
---
Add the generic heuristic-tier CLI agent adapter (U6).
Arbitrary user-configured CLI commands can now run as engine-owned PTY sessions. The generic adapter declares every native capability disabled (no native done/waiting signal, no transcript) and infers state purely from the terminal byte stream: busy while output progresses or a spinner animates, and a synthetic idle after a configurable quiet window when a prompt-like glyph is showing and no spinner overrides it. Per the completion-gating decision (origin R20) the generic tier NEVER reports done — idle surfaces a "looks idle — confirm to advance" affordance via a new busy-equivalent idle sub-state and never advances the pipeline.

View File

@@ -1,24 +0,0 @@
---
"@runfusion/fusion": minor
---
Add the CLI Agent Executor hook ingestion route and per-session hook scripts
(U17). The dashboard now serves a localhost-only `POST /api/cli-agent/hooks`
endpoint that authenticates per-session hook POSTs from a spawned CLI agent and
forwards the validated payload in-process to the engine telemetry hub (the engine
has no HTTP server — only the dashboard serves HTTP).
The route is hardened because localhost is not a trust boundary: it validates the
high-entropy per-session token against the engine-held registry (a session id
alone is never sufficient, and a token for one session never validates for
another), rejects browser-context requests via Origin/Host CSRF checks, caps the
payload size, and treats an unknown/non-live session as a 200 no-op rather than a
crash. It is exempt from the daemon bearer-token middleware (hook scripts only
hold the per-session token) but authenticates with that token instead.
The engine gains `hook-scripts.ts`: it generates the per-session hook script and
notify shim (Orca `agent-hooks` shape — `curl` POST of the stdin JSON with the
session token header, short timeouts, always exit 0), writes them into a
session-scoped config dir (owner-only, executable), and deletes that dir on
session end (the token is registry-invalidated at the same moment, bounding its
at-rest exposure to the session lifetime).

View File

@@ -1,20 +0,0 @@
---
"@runfusion/fusion": minor
---
CLI-agent hybrid chat (U12): a chat session can select a cli-agent executor and
be driven by a long-lived CLI agent process. Adapter transcript telemetry maps
to durable chat_messages rows at user/assistant/tool-summary granularity (raw
tool noise stays in the terminal), with the shared `redactSecrets` pass applied
before persistence so transcripts never become a secret store. Composer sends
route through the inject path with FIFO queueing; the flush decision re-fetches
authoritative session state rather than trusting a cached busy flag. The chat
surface gains a transcript ↔ raw-terminal toggle (terminal owns input, composer
hidden in terminal mode); generic-tier sessions render terminal-only with no
toggle. New per-session `cliExecutorAdapterId` linkage on chat_sessions.
ChatView now mounts `CliChatSurface` for cli-backed sessions (the message-pane +
composer region is delegated to it; regular sessions keep the standard composer),
and the engine `TelemetryHub` gains a narrow optional `onEvent` tap (settable via
`setEventListener`) so the chat transcript runner can observe the same sanitized
events the hook route already feeds, without the hub becoming a subscriber bus.

View File

@@ -1,22 +0,0 @@
---
"@runfusion/fusion": minor
---
Mobile terminal interaction for cli-agent sessions (U13). `SessionTerminal` now
detects mobile viewports via the canonical breakpoint
(`(max-width: 768px), (max-height: 480px)`) and renders a bottom input model in
place of relying on xterm's hidden-textarea (unreliable on mobile): a visible
text input that forwards typed text + `\r` as input frames on submit, plus an
accessory key bar emitting exact control sequences — Esc (`0x1B`), Tab (`0x09`),
a dedicated Ctrl-C (`0x03`), ANSI CSI cursor arrows (`CSI A/B/C/D`), and a sticky
Ctrl modifier whose next key combines into a control byte (Ctrl-C `0x03`,
Ctrl-D `0x04`, Ctrl-Z `0x1A`) with a visible active state.
Bar keys apply the iOS composer survival pattern (pointerdown/mousedown
preventDefault, action on click) so the input keeps focus, and the bar behaves as
a fixed footer that lifts above the virtual keyboard via `useMobileKeyboard`
(including its pinch-zoom `vv.scale > 1` guard, which is not treated as
keyboard-open). xterm `onData` input stays attached (the bar is primary, not
exclusive). Bar keys and the input are deliberate user keystrokes routed straight
to the session input path. All new strings are localized in the `app` i18n
catalog.

View File

@@ -1,21 +0,0 @@
---
"@runfusion/fusion": minor
---
Add CLI-agent one-shot sessions for the validator, planning, and CE plugin
surfaces (U9). A one-shot session runs an adapter's non-interactive invocation
(`claude -p`, `codex exec --json`, `droid exec --output-format json`,
`pi --print`) to completion in a working directory, streams output to a
read-only terminal (input disabled server-side via the durable
`autonomyPosture.readOnly` flag the transport's `isReadOnlySession` honors),
parses the adapter's structured JSON result, and reaps the PTY on exit.
The new `cli-agent/one-shot-session.ts` returns a typed result: a success with
the parsed payload, or a typed failure (`nonzero-exit` / `unparseable` /
`spawn-failed`) carrying a bounded output tail. The validator integration
(`cli-agent-validator.ts`) maps results into the existing
pass/fail/blocked/error verdict contract — a malformed or unparseable result
maps to `error`, NEVER a silent pass. A planning seam (`runCliAgentPlanning`)
maps one-shot output into the same `PlanningResponse` shape a model run
produces, and the CE plugin's orchestrator threads an `executor` option
(`model` | `cli-agent`) end-to-end to its resolver.

View File

@@ -1,24 +0,0 @@
---
"@runfusion/fusion": minor
---
Add the CLI agent resume coordinator and self-healing integration (U8). On
engine start, sessions persisted as live (starting / ready / busy /
waitingOnInput) are classified `engineDeath` and queued for resume respecting
the session-manager concurrency ceiling. Resume verifies the recorded worktree
still exists (missing → needsAttention, never a CLI spawned into a vanished
directory), detects a dirty worktree (logged + flagged on the session record,
resume proceeds), relaunches via the adapter's `buildResume` with the recorded
native session id in the recorded worktree, re-attaches telemetry, and
re-injects no prompt. Only `crashed`/`engineDeath` are resume-eligible
(`killed`/`userExited`/`authFailed`/`completed` never); attempts are capped at 2
with backoff; exhaustion, an unsupported adapter, a missing vendor session
store, or an immediate spawn error route to needsAttention (a permanent-failure
path, not a retry loop).
Self-healing idle-worktree sweeps (`enforceWorktreeCap`, `cleanupOrphans`,
unregistered-orphan reap) now skip a worktree backing a resume-eligible
`cli_sessions` record via a narrow `isWorktreeResumeReserved` seam, and the
stuck-task detector suppresses stuck/inactivity flagging while a task's CLI
session is `waitingOnInput` via a narrow `isCliSessionWaitingOnInput` seam — the
U3 stall backstop remains the only escalation while genuinely waiting.

View File

@@ -1,25 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix a batch of CLI Agent Executor review defects:
- **Schema-version gate**: bump `SCHEMA_VERSION` to 110 so a DB already at 109
runs migration 110 and gains the `chat_sessions.cliExecutorAdapterId` column
(it was previously short-circuited). Add the column to the compat-fingerprint
`MIGRATION_ONLY_TABLE_SCHEMAS.chat_sessions` entry so the fingerprint matches.
- **Generic adapter double-wrap**: `formatInjection` no longer re-wraps injected
text in bracketed-paste markers when `bracketedPasteActive`; the session
manager's security path is the sole wrapper, so the generic adapter (like every
native one) only appends a carriage return.
- **Output-filter cross-boundary bypass**: thread one carry buffer across the
scrollback→live seam in the CLI session WS bridge so a dangerous escape (e.g.
OSC 52) split across the seam is fully neutralized instead of the held
introducer being flushed verbatim into the scrollback frame.
- **Output-filter overflow leak**: when an over-length carry begins with a
recognized dangerous introducer (OSC `ESC ]` / DCS `ESC P`), drop the
introducer instead of flushing it as literal, so it cannot recombine with a
later terminator at the client.
- **Follow-up never resolves**: `followUp()` now drives the authoritative state
machine `done→busy` before injecting, so the re-armed result promise resolves
on the next positive `done` instead of hanging on an idempotent done.

View File

@@ -1,11 +0,0 @@
---
"@runfusion/fusion": minor
---
Bootstrap the CLI Agent Executor runtime and wire it end-to-end.
A new `createCliAgentRuntime` factory (engine) constructs the per-project bundle — a `CliSessionStore` over the project's existing core Database, a per-runtime adapter registry with all five bundled adapters, the `CliSessionManager` (PTY lifecycle), the `TelemetryHub` (per-session token registry rebuilt from live records), and the `CliResumeCoordinator` (relaunch re-mints a hook token + rewrites hook scripts) — returning the executor bundle, the `isWorktreeResumeReserved` / `isCliSessionWaitingOnInput` predicates, and a scoped `dispose`.
The runtime is instantiated per project in `InProcessRuntime` behind the `experimentalFeatures.cliAgentExecutor` flag (opt-in, matching the `workflowGraphExecutor` precedent): the bundle threads into `TaskExecutorOptions.cliAgentRuntime`, the predicates feed the self-healing idle-worktree sweep and the stuck-task detector, and `resumeCoordinator.recoverOnStart()` runs non-blocking after engine start (errors logged, never thrown). The dashboard hook endpoint URL is derived from a server-threaded option, falling back to a localhost URL from `FUSION_DASHBOARD_PORT` (default 4040).
The dashboard now resolves the project's `TelemetryHub` via `cliAgentHubResolver`, mounts the cli-sessions transport from the runtime's manager + store, and brokers cli-backed chat sends: a chat session with a `cliExecutorAdapterId` routes composer sends to a `CliChatSessionRunner` (instead of the model agent loop), and the hub's sanitized telemetry is routed per-session into the runner's transcript handler.

View File

@@ -1,14 +0,0 @@
---
"@runfusion/fusion": minor
---
CLI agent session transport (U10): authenticated cli-sessions REST routes
(list, single-use session-scoped attach tickets, inject, confirm-advance), a
distinct `/api/cli-sessions/ws` WebSocket attach handler (daemon-token + Origin
allowlist + single-use ticket gate, scrollback replay then live byte frames,
ACK-credit flow control driving engine pause/resume, latest-active-client
resize, server-side read-only enforcement, input-source attribution), a
streaming-safe outbound output filter (`neutralizeTerminalOutput`) that strips
OSC 52 clipboard writes, non-http(s) OSC 8 hyperlink URIs, and device-status /
query sequences, and a throttled `cli:session:state` SSE event with
Last-Event-ID replay.

View File

@@ -1,32 +0,0 @@
---
"@runfusion/fusion": minor
---
Add CLI-agent adapter launch settings, an autonomy approval gate, and workflow
node-editor configuration for the CLI Agent Executor (U15).
A new `cliAgents` slice of global settings holds per-adapter operator launch
config — command override, extra args, autonomy mode, and env allowlist
additions — validated and sanitized at the write boundary (unknown adapter ids
and invalid fields are dropped). Shipped defaults are owned by the adapters.
The autonomy gate closes the "adjacent settings" bypass: elevation requested
through ANY channel (the autonomy field, extra args such as
`--dangerously-skip-permissions`, an autonomy-toggling env var, or a non-default
command override) is detected over the FULLY RESOLVED argv + env via per-adapter
elevation markers plus a shared generic env-pattern set. `resolveEffectivePosture`
derives the posture chip from the resolved invocation — never the autonomy field
alone — and the effective posture is denormalized onto the session record at
spawn. An elevated launch without a stored per-project approval fails with a
typed `CliAutonomyNotApprovedError` instead of stalling. Approvals are per-project
+ per-adapter (mirroring the raw workflow-CLI-command approval precedent) and the
approving principal in v1 is the daemon-token holder.
The dashboard adds daemon-token-authed routes
(`/api/cli-agents`, `/api/cli-agents/settings`,
`/api/cli-agents/:adapterId/approve-autonomy` + revoke), a Settings section for
per-adapter launch config with an explicit confirmation flow before elevated
autonomy is approved, and a workflow node-editor block that surfaces an adapter
picker (with native/hybrid/generic tier labels), an autonomy toggle, and the
waiting-on-input notification mode (banner / banner+notify) when a node's executor
is `cli-agent`. All new strings are localized in the `app` i18n catalog.

View File

@@ -1,15 +0,0 @@
---
"@runfusion/fusion": minor
---
CLI agent terminal UI (U11): a shared `SessionTerminal` component (lazy-loaded
xterm + fit/webgl/unicode11) that attaches to the U10 cli-sessions WebSocket
with ACK flow control, a posture chip (baseline vs elevated), a read-only
badge, session-idle/ended replay states, and a generic-tier confirm-advance
strip. Adds a `terminal` tab to the task detail view driven by the lifecycle
visibility matrix (live / read-only live / replay-idle / replay-ended / hidden)
with live `cli:session:state` SSE merging, waiting-on-input and needs-attention
task-card badges (distinct from staleness/stall badges), and extends
`SessionNotificationBanner` with a `cli-agent` session type plus the pinned
needs-attention variants (userExited / authFailed / resume-exhausted) and their
actions. All new strings flow through the i18n catalogs.

View File

@@ -1,13 +0,0 @@
---
"@runfusion/fusion": minor
---
Add full-screen TUI attach to cli-agent sessions (U14). The Ink dashboard TUI
can hand the terminal to a CLI agent session as a raw passthrough: it enters the
alternate screen, streams WebSocket terminal bytes to stdout and stdin keystrokes
back as input frames, propagates resizes, and ACKs consumed bytes for flow
control. The detach chord (Ctrl-]) restores the TUI cleanly, and a dropped
connection surfaces an error and restores the terminal. Untrusted terminal output
is neutralized through the same hardening filter the dashboard WS bridge uses
(OSC 52 clipboard writes, non-http(s) OSC 8 links, and device-status queries are
stripped before reaching the host TTY).

View File

@@ -1,12 +0,0 @@
---
"@runfusion/fusion": minor
---
Add the Compound Engineering bundled plugin: a dedicated dashboard surface for compound-engineering artifacts and interactive `ce-*` sessions, a work→board bridge, and bidirectional board↔pipeline sync. Sessions are fully multi-session: a Sessions panel lists every run with stage/status/last-activity, lets you open and switch between concurrent sessions (each keeps running server-side), resume interrupted ones, and discard settled ones (`DELETE /sessions/:id` disposes the live handle before deleting the row).
Sessions show the agent's full working output live (streamed thinking/tool activity with an inactivity-based stall timeout instead of a fixed turn timeout), the user can steer mid-stage with free-text guidance (attached to an answer or sent on its own), and the transcript renders past questions/answers/working traces as a proper chat surface.
This also adds two reusable host capabilities that any plugin benefits from:
- **Interactive agent sessions for plugin routes** (`ctx.createInteractiveAiSession`), with skill-discovery forwarding (`requestedSkillNames` / `additionalSkillPaths`) and live mid-turn progress streaming (`onProgress`: thinking/text deltas + tool markers) so a plugin can load a bundled skill into a live session and surface its work in real time.
- **Real plugin event push over SSE**: a plugin's `ctx.emitEvent` calls are forwarded to connected `/api/events` clients as project-scoped `plugin:custom` events, and dashboard views can consume them via the new `subscribePluginEvents` view-context capability.

View File

@@ -1,17 +0,0 @@
---
"@runfusion/fusion": minor
---
Add "New folder" button to DirectoryPicker for project setup
The directory picker in the project setup flow now includes a "New folder"
button that lets users create folders directly when selecting a project path.
This includes:
- New `POST /api/create-directory` endpoint for creating directories
- Create folder UI in DirectoryPicker with inline error handling
- Keyboard support (Enter to create, Escape to cancel)
- Client-side validation for folder names (no path separators or traversal)
Also fixes a bug where navigating into an empty folder would revert to the
previous directory.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Recover failed Planning Mode session loads into the existing retryable error view instead of dropping back to the empty planner. Failed or malformed persisted planning sessions now keep their session id so Retry/Dismiss recovery remains available, while deleted sessions still quietly fall back to a new session.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix in-review tasks showing other tasks' files in the "files changed" list. `baseCommitSha` was captured as `merge-base(HEAD, origin/main)` at task start, but task branches fork from local main — when local main was ahead by merged-but-unpushed task commits, the recorded base rewound past them, and after the post-merge rebase-and-push rewrote their SHAs the diff range permanently swept the predecessors' files into the new task's diff. The capture now measures against local main first (origin/main as fallback), matching the contamination-base sites.

View File

@@ -1,9 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix mission triage silently stranding features when two missions share a base branch.
`branch_groups.branchName` is globally unique, but `ensureBranchGroupForSource` only checked for an existing group by `(sourceType, sourceId)`. When a second mission's shared-branch triage resolved to a base branch (e.g. `main`) that another mission already owned a branch group for, `createBranchGroup` threw `UNIQUE constraint failed: branch_groups.branchName`. That error escaped `triageFeature` and was swallowed by both of its callers (the validation-failure auto-triage and the startup/maintenance reconcile sweep), leaving the mission's `defined` features — including auto-generated fix features — permanently un-triaged and the mission unable to progress.
`ensureBranchGroupForSource` now reuses an existing open group for the same branch name (matching the established `getBranchGroupByBranchName(...) ?? ensureBranchGroupForSource(...)` idiom) instead of colliding on the unique constraint.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix the bundled Compound Engineering dashboard plugin build so its CSS is included in `dist`.

View File

@@ -1,11 +0,0 @@
---
"@fusion/dashboard": patch
---
Unfreeze dashboard spinners and pulse/enter animations. Transition tokens
(`--transition-slow: 0.3s ease`) bundle a duration and an easing; 15 animation
declarations reused them as bare durations, which made the whole `animation`
declaration invalid at computed-value time and silently resolved it to
`animation: none`. Animation rules now use new duration-only tokens
(`--duration-instant/fast/normal/slow`), with the transition tokens derived
from them, and a repo-wide CSS regression test forbids the pattern.

View File

@@ -1,15 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix opencode-go model sync: pass API key to CLI and strip provider prefix from model IDs
Two bugs when using OpenCode Go as a provider:
1. **Model discovery only returned free models** — the saved Go API key was never passed as `OPENCODE_API_KEY` to the spawned `opencode models opencode --refresh` process. The CLI's internal plugin checks this env var and, when absent, disables all paid models (those with `cost.input > 0`). Only 20 free models appeared instead of all 67.
2. **API requests failed with 401** — `normalizeOpencodeGoModel` was registering models with prefixed IDs like `opencode-go/deepseek-v4-flash`. The Pi SDK sends `model.id` verbatim in API requests; the OpenCode API expects bare model names (e.g. `deepseek-v4-flash`). The prefix is now stripped during normalization.
Also deduplicates models when the CLI emits both `opencode/foo` and `opencode-go/foo` for the same model, guards against empty model IDs, and refactors the duplicated `onApiKeySaved` handler into a shared `handleOpencodeGoApiKeySaved` helper.
After this change, users must re-select their opencode-go model in Settings because model IDs have changed from prefixed to bare names.

View File

@@ -1,9 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix missions stalling when a feature is marked `done` but stranded mid-loop.
A mission feature could be left `status: "done"` while its `loopState` never advanced past `"implementing"` and it had no linked board task (so it was never validated). The slice-completion gate (`MissionStore.computeSliceStatus`) correctly refuses to count an assertion-linked `done` feature until its validator passes, but nothing re-drove a task-less feature, so the slice — and the whole mission — could never auto-progress.
Active-mission recovery now detects these stranded `done` features and re-runs assertion validation directly (no board task), so the gate can resolve: on pass the feature becomes legitimately complete, on fail the normal fix-feature flow takes over. The feature-validation path was extracted into a shared `runFeatureValidation` helper used by both task-completion and recovery.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix project selector review regressions around optional selection handlers and bookmarked search matches, and tighten retry/backoff timeout and rate-limit handling.

View File

@@ -1,7 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix a spurious Settings → Plugins error for the bundled Dependency Graph plugin where plugin startup could fail with `Invalid state transition from "started" to "started"`.
Plugin state transitions now treat same-state updates as idempotent no-ops, while still allowing same-state calls with an explicit error payload to update the persisted error field without emitting a state-changed transition.

View File

@@ -1,8 +0,0 @@
---
"@runfusion/fusion": patch
---
Fixes the UsageIndicator popup hidden-window recovery flow by preventing hide/show controls from acting as implicit form-submit buttons.
- Sets the per-window hide control and provider-level **Show hidden (N)** control to `type="button"` so they do not trigger parent form submits.
- Adds a regression test that verifies clicking **Show hidden** reveals hidden windows, persists the unhidden state, and remains correct after rerender/state re-sync.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Repair dropped spaces after sentence-ending punctuation when streamed agent text is split across separate assistant messages by tool-call round-trips (chat and agent logs), by tracking a per-session running tail at the shared engine streaming-delta chokepoints. Completes FN-5789, which only covered within-message boundaries.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add `fn onboard` command: a sequential, prompt-based onboarding wizard covering central DB creation, AI provider setup (API key), first project init, core settings defaults, and a next-steps tour. Persists a `cliOnboardingCompletedAt` completion marker in global settings (distinct from the dashboard `setupComplete` first-run flag).

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
`fn onboard` now allows each onboarding step to be skipped individually without aborting the overall wizard. Skipping steps still marks onboarding as completed, while interactive cancellation behavior remains unchanged.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add a safe onboarding auto-launch hook in the CLI bootstrap path. When the central DB is missing, interactive TTY commands now trigger `fn onboard` automatically before command dispatch, while non-interactive contexts (non-TTY, `serve`, `daemon`, explicit skip signals) remain unchanged and never block execution.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Harden CLI onboarding auto-launch backward compatibility by adding an explicit skip when both the central DB and local project DB already exist. This preserves established agent/headless behavior by ensuring non-TTY, `serve`, and `daemon` invocations continue without onboarding prompts or blocking.

View File

@@ -1,9 +0,0 @@
---
"@runfusion/fusion": patch
---
Refine onboarding auto-launch bypass behavior by treating `--skip-onboarding` and `FUSION_SKIP_ONBOARDING` as first-class skip paths.
- Parse `FUSION_SKIP_ONBOARDING` with strict truthiness (`1`, `true`, `yes`, `on` only).
- Return distinct auto-launch skip reasons for flag (`skip-flag`) and env (`skip-env`).
- Strip `--skip-onboarding` as a global CLI flag so it never leaks into downstream command parsers while still informing onboarding gate decisions.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Add orchestrator-level regression coverage and CLI docs that guarantee onboarding auto-launch never blocks existing projects, non-TTY/headless workflows, or agent-run `fn` commands.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Update `fn onboard` CLI HELP text and CLI reference docs to match shipped onboarding behavior, including auto-launch conditions, skip paths, and onboarding escape hatches (`--skip-onboarding`, `FUSION_SKIP_ONBOARDING`).

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add `fn onboard`: an explicit, user-invoked onboarding command that runs a sequential, prompt-based wizard for central DB creation, AI provider setup (API key), first project init (`fn init`), core settings defaults (global `testMode` and project `maxConcurrent`), and a next-steps tour. It persists a `cliOnboardingCompletedAt` completion marker in global settings so later runs are skipped unless `--force` is passed.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fixes a mobile dashboard crash path where toggling the in-review auto-merge switch could blank the UI until refresh on some Android/legacy WebView environments.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix shared branch-group execution to always derive per-task working branches (`fusion/<task-id>`) for checkout/worktree operations while keeping the branch-group branch as the merge target.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add dashboard shared branch-group visibility and controls: branch-group list/show/assign/promote API routes, grouped task surfacing, and a completion-gated branch-group card that only reveals PR/merge actions once all members are landed.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add a dedicated dashboard Group Task Modal for shared branch groups. Grouped badges in task cards and subtask planning now open a modal showing shared branch status, member landed progress, tracked PR state, member-task quick links, and completion-gated promote actions.

View File

@@ -1,7 +0,0 @@
---
"@runfusion/fusion": minor
---
Add a new New Task branch strategy option, **Merge into a shared feature branch** (`shared-group`).
When selected, task creation now joins an existing open branch group by shared branch name (or creates a `new-task` sourced group when missing), links `branchContext` with `assignmentMode: "shared"`, and derives a per-task working branch from the shared branch instead of running directly on the shared integration branch.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add shared branch-group completion-gate promotion machinery so grouped shared branches promote to the default branch exactly once after all members land. This includes idempotent promotion re-evaluation, finalized branch-group status/PR tracking persistence, and lifecycle wiring that keeps member integration and shared→default promotion as separate phases.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Classify provider 400 errors for unsupported `messages.[n].role` values as operator-actionable agent errors, and annotate prompt-boundary failures with a clear model/provider compatibility hint. This stops invisible retry loops and makes misconfigured imported agent model/provider combinations fail fast with actionable diagnostics.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Custom OpenAI-compatible providers now register with explicit conservative role compatibility: Fusion defaults `compat.supportsDeveloperRole` to `false` so reasoning-capable models emit the legacy `system` role instead of relying on provider URL auto-detection. Advanced users can opt in per provider with `supportsDeveloperRole: true` when their endpoint explicitly supports the `developer` role.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Reuse imported GitHub source issues as task tracking links when GitHub tracking is enabled, instead of creating a duplicate issue. Tasks imported from GitHub now link their existing `sourceIssue` (when valid) as `githubTracking.issue` with no GitHub auth or issue creation call required.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add the external plugin authoring loop for published Fusion installs: `@runfusion/fusion/plugin-sdk` is available as the public SDK subpath, `fn plugin new <name>` scaffolds standalone publishable plugin packages, and `fn plugin dev <path>` builds, installs, watches, and hot-reloads local plugins during development.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix mobile Task Detail Logs scrolling for branch-group tasks by making the branch-group card collapsible and re-pinning the agent log viewer when its container height changes.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix shared-branch-group member finalization so routed members land on the group's shared branch instead of being auto-finalized against the project default branch. Also harden already-landed commit attribution so the recovery detector never claims a commit that merely mentions a task ID in prose (2026-05-23 lost-work regression): the `git log --grep` ancestry fallback is now ownership-anchored on a Fusion trailer or a task-scoped conventional-commit subject.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
CLI auto-launch now honors the persisted `cliOnboardingCompletedAt` marker so onboarding fires only once, even when the Central DB step was skipped during `fn onboard`.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix `fn_goal_list` and `fn_goal_show` so tool calls made from Fusion worktree directories resolve the canonical project database and return goals created through the dashboard UI.

View File

@@ -1,9 +0,0 @@
---
"@runfusion/fusion": patch
---
Stop queued chat messages from disappearing after back-navigation while the assistant is still responding (GitHub #1279).
Re-entering a chat restored the queued follow-up and immediately flushed it based on the client's local `isGenerating` flag — which is stale mid-generation (it is a route-level enrichment the `chat:session:updated` SSE payload lacks). The premature send aborted the live generation server-side and could lose the queued message entirely, since its persisted copy was deleted before the send.
The restore path in both Chat and Quick Chat now confirms with the server before flushing: if a generation is still in flight it re-attaches to the stream and lets completion deliver the queued message; the message is sent immediately only when the server reports no active generation. On a failed check the queued bubble is kept for a later flush trigger.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix the dashboard skills interface so enabled and disabled skill toggles persist across refreshes for both top-level and package-scoped skills. The adapter now normalizes stored skill paths consistently when writing settings and when rediscovering installed skills.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix the desktop quick chat panel so moving the FAB while the panel is closed no longer shrinks or overwrites the saved panel size before the next reopen.

View File

@@ -1,7 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix chat message sends with file attachments by parsing multipart form bodies on the chat messages SSE endpoint.
Uploaded message attachments are now validated, persisted to the session attachment directory, converted into chat attachment metadata, and forwarded to the chat manager while JSON-only message sends continue to work unchanged.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Bump `@earendil-works/pi-coding-agent` and `@earendil-works/pi-ai` from `^0.77.0` to `^0.78.0`. See the upstream pi coding agent changelog for [`0.78.0` (2026-05-29)](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/CHANGELOG.md#0780---2026-05-29).

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Clear stale active-session registry entries when PR-mode merge cleanup removes a task worktree.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Recover mission interview drafts that were sent to the background from the final summary step. Plan-ready `complete` mission interview sessions now remain resumable across the dashboard, `fn mission list`, and `fn_mission_list` until they are approved into a mission or discarded.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix Planning Mode single-task session history so completed sessions remain restorable from the summary view after task creation.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix agent-created ntfy task notifications so they include the task description when a title has not been assigned yet.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix Planning Mode session history so duplicate AI-session rows are collapsed by session id and deleting a history entry only succeeds when the server-side delete persists.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Persist mission↔goal many-to-many links with a new `mission_goals` join table, MissionStore link/unlink/list helpers, and a project schema version bump from 100 to 101.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Surface mission-linked goals across mission read paths, including `fn_mission_show`, mission detail API payloads, and dashboard mission detail navigation into anchored goal cards.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Document mission-to-goal linkage behavior, including the explicit no-backfill decision for existing missions, and surface an Unlinked badge for active missions without linked goals in Mission Manager.

View File

@@ -1,7 +0,0 @@
---
"@runfusion/fusion": minor
---
Add self-healing recovery for stale mission validator runs that are left in `running` after their owning execution disappears.
Stale validator runs are now reaped to the existing terminal `error` status (rather than introducing a new `cancelled` status), the reap reason is stored in the run summary, active mission features are moved back to `needs_fix` so validation can re-trigger, and startup/maintenance sweeps emit `mission:validator-run-reaped` audit events for recovered rows.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Mission validation now AI-validates all mission criteria by lazily ensuring a per-feature managed assertion at runtime and removing the zero-assertion auto-pass path. Milestone acceptance criteria are threaded into validator prompts, and the dashboard now presents mission criteria as AI-validated instead of informational-only.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix a Planning Mode reliability bug where creating a single task could fail with a browser-level `Failed to fetch` error when post-create side effects threw or rejected before the dashboard finished responding.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Run the configured `worktreeInitCommand` on merge worktrees before AI merge verification across warm and cold integration modes, so merge verification uses the same project-specific bootstrap as executor worktrees.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Move agent logs out of the SQLite `agentLogEntries` table into per-task `.fusion/tasks/{ID}/agent-log.jsonl` files, add one-time migration + source-ref rewrite support, preserve soft-deleted log files for forensics while hiding them from live reads, and switch goal-citation source refs to `agentLog:{taskId}:{lineNo}`.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix fresh-install `pnpm install` bin-link warnings by pointing the published `fn`/`fusion` bins at a committed `bin.mjs` launcher that forwards to the built CLI output.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix the dashboard OAuth login flow for ChatGPT Plus/Pro (Codex Subscription) so multi-option provider selection prompts no longer cancel the login before browser auth starts.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
persist the OAuth expiry alert/notification throttle so users are alerted at most once per provider every 12 hours, even across server restarts.

View File

@@ -1,7 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix the dashboard auto-merge toggle blanking on mobile by keeping board stabilization tied to viewport events instead of a one-shot resize listener.
The in-review board now stays visible when auto-merge is toggled across Android mobile, iOS mobile, tablet, and desktop layouts, with regression coverage for populated and empty columns plus rollback and error-boundary paths.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Clear the in-review stall deadlock auto-pause on user-initiated retry so dashboard, CLI, and extension retries can actually resume merge/execution work without overriding manual pauses.

View File

@@ -1,12 +0,0 @@
---
"@runfusion/fusion": patch
---
Stop missions from silently looping or stalling when agents can't run their tasks (GitHub #1261).
Importing a catalog ("company") agent assigns it the role `custom`, which the scheduler never auto-assigns mission/queue work to. Combined with a model/provider that rejects the `developer` system role, this surfaced to users as an invisible, repeating failure loop.
- **Auto-recover from incompatible roles:** an "unsupported message role" provider rejection (e.g. a reasoning model sending the `developer` role to a provider that only accepts `system`/`user`/`assistant`/`tool`) is now treated as a model-selection error, so a configured fallback model is tried once before the task is marked failed. The single-swap guard keeps an incompatible fallback from looping.
- **Stop the retry loop:** operator-actionable failures (unsupported role, auth, quota) now block the mission feature immediately with a clear event instead of burning the full retry budget re-running the same cryptic error.
- **Preflight mission start:** when ephemeral agents are disabled and no eligible executor agent exists, starting a mission now fails fast with an actionable message instead of queueing tasks forever.
- **Warn on import:** importing only `custom`-role agents now surfaces a warning that they won't be auto-assigned mission work unless one is given the `executor` role.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add AI-assisted conflict resolution to the dashboard Create PR flow so users can resolve task-branch merge conflicts against the selected base branch, push the updated branch, and continue PR creation without leaving Fusion.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add an in-app Create PR remediation that pushes the task branch to `origin`, refreshes preflight status, and unblocks PR creation without leaving Fusion.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Streamline the Task Changes tab header controls on mobile so diff navigation and actions use a more compact layout.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix the dashboard mobile auto-merge toggle blank-screen regression by restoring shared mobile breakpoint coverage and strengthening the regression suite across mobile, tablet, desktop, rollback, and task-review detail surfaces.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix duplicate GitHub tracking issues and harden GitHub issue import deduping.

View File

@@ -1,7 +0,0 @@
---
"@runfusion/fusion": patch
---
Allow failed agents to be stopped and deleted consistently across the dashboard and CLI guidance.
Agents in the error state can now transition to paused, the dashboard exposes delete actions for failed agents in list/detail views, and regression coverage protects the updated behavior.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Fix auto-merge toggle not appearing on the built-in coding workflow's in-review column. The builtin:coding IR now carries the correct column traits (merge-blocker, human-review) so the dashboard resolves and passes the auto-merge toggle to the in-review column.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Restore terminal task notifications for workflow/PR-backed completions that move tasks to done before emitting the canonical merged lifecycle event.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add workflow `notify` nodes so custom workflows can dispatch templated notifications through configured providers.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Harden dependency security floors by forcing protobufjs resolutions to patched versions and upgrading Vitest tooling to the patched 4.1 line.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Removed the `collapsible`, `collapseStorageKey`, and `collapsedLabel` props from `WorkflowSelector`. Callers should stop passing these props; workflow selectors now always render expanded.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Open the workflow editor on the selected board workflow when using the workflow-mode edit action.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Add `workflow_id` support to agent task creation, delegation, and update tools so agents can select or clear task workflows directly.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Right-align the task-card promote action at the end of the card action row.

Some files were not shown because too many files have changed in this diff Show More