diff --git a/.changeset/fix-quick-add-model-filter.md b/.changeset/fix-quick-add-model-filter.md new file mode 100644 index 0000000000..b47f22fcc5 --- /dev/null +++ b/.changeset/fix-quick-add-model-filter.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Fix the Quick Add model dropdown filter box so typing narrows the model list. +category: fix +dev: The quick-entry model menu's blanket onMouseDown preventDefault crossed the React portal boundary and suppressed focus on CustomModelDropdown's search input. diff --git a/.changeset/fn-9007-pi-0-84-1.md b/.changeset/fn-9007-pi-0-84-1.md new file mode 100644 index 0000000000..d0dd5c1a02 --- /dev/null +++ b/.changeset/fn-9007-pi-0-84-1.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Upgrade the bundled Pi runtime to 0.84.1 for updated provider and model support. +category: internal +dev: Advance the exact Pi closure from 0.82.1 to 0.84.1 and guard pi-client, pi-protocol, and pi-telemetry. diff --git a/.changeset/fn-9008-grok-4-6.md b/.changeset/fn-9008-grok-4-6.md new file mode 100644 index 0000000000..4bddf16026 --- /dev/null +++ b/.changeset/fn-9008-grok-4-6.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": minor +--- + +summary: Add Grok 4.6 to the built-in Grok model catalog across every model picker. +category: feature +dev: Registers Grok 4.6 in `GROK_PROVIDER_REGISTRATION` in `packages/core/src/ai/grok-provider.ts`, which fans out through `seedDashboardProviders` and `pi.ts`. diff --git a/.changeset/fn-9009-quick-add-merger-label.md b/.changeset/fn-9009-quick-add-merger-label.md new file mode 100644 index 0000000000..296716f5b8 --- /dev/null +++ b/.changeset/fn-9009-quick-add-merger-label.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Quick Add model menu now labels the merger row “Merger” with spacing matching other roles. +category: fix +dev: Adds the tasks.modelMerger translation key for the top-level Quick Add menu row. diff --git a/.changeset/fn-9011-model-dropdown-toggle.md b/.changeset/fn-9011-model-dropdown-toggle.md new file mode 100644 index 0000000000..4fb9407c9a --- /dev/null +++ b/.changeset/fn-9011-model-dropdown-toggle.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Fix the collapse/expand toggle in model selection dropdowns. +category: fix +dev: Stop portal-bound pointer and mouse events before document-level outside-close handlers can unmount CustomModelDropdown. diff --git a/.changeset/fn-9012-recommendations-tab-visibility.md b/.changeset/fn-9012-recommendations-tab-visibility.md new file mode 100644 index 0000000000..36421c5add --- /dev/null +++ b/.changeset/fn-9012-recommendations-tab-visibility.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Show the task Recommendations tab only when a completed task has recommendations. +category: fix +dev: TaskDetailModal gates hasRecommendations on task-owned recommendations (fullDetail?.id === task.id, else the live prop); tab reconciliation waits for that same proof, not detailLoading. diff --git a/.changeset/fn-9013-scheduler-listfeatures-receiver.md b/.changeset/fn-9013-scheduler-listfeatures-receiver.md new file mode 100644 index 0000000000..b29ea333ca --- /dev/null +++ b/.changeset/fn-9013-scheduler-listfeatures-receiver.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Fix mission reconciliation failing every cycle with an internal scheduler error. +category: fix +dev: Preserves the listFeatures receiver and contains per-slice failures in Scheduler.reconcileActiveMissionAutomation. diff --git a/.changeset/fn-9014-message-archive.md b/.changeset/fn-9014-message-archive.md new file mode 100644 index 0000000000..10716927eb --- /dev/null +++ b/.changeset/fn-9014-message-archive.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": minor +--- + +summary: Add archive and restore views for mailbox messages and chat conversations. +category: feature +dev: Adds project.messages.archived via migration 0058 and POST /messages/:id/archive|unarchive routes. diff --git a/.changeset/fn-9016-manager-eval-tools.md b/.changeset/fn-9016-manager-eval-tools.md new file mode 100644 index 0000000000..2716afd18f --- /dev/null +++ b/.changeset/fn-9016-manager-eval-tools.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": minor +--- + +summary: Let managers review and coach evaluation results for agents in their reporting tree. +category: feature +dev: Adds `fn_agent_read_evaluations` and `fn_agent_evaluation_followup`, reusing the management-subtree boundary and action-gate classification. diff --git a/.changeset/pre.json b/.changeset/pre.json index dbdad81ca9..84de0b284b 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -2,110 +2,201 @@ "mode": "pre", "tag": "beta", "initialVersions": { - "@runfusion/fusion": "0.76.0", - "runfusion.ai": "0.76.0", - "@fusion/core": "0.76.0", - "@fusion/dashboard": "0.76.0", - "@fusion/desktop": "0.76.0", - "@fusion/droid-cli": "0.11.61", - "@fusion/engine": "0.76.0", - "@fusion/i18n": "0.39.35", - "@fusion/mobile": "0.76.0", - "@fusion/pi-claude-cli": "0.76.0", + "@runfusion/fusion": "0.75.1", + "runfusion.ai": "0.75.1", + "@fusion/core": "0.75.1", + "@fusion/dashboard": "0.75.1", + "@fusion/desktop": "0.75.1", + "@fusion/droid-cli": "0.11.60", + "@fusion/engine": "0.75.1", + "@fusion/i18n": "0.39.34", + "@fusion/mobile": "0.75.1", + "@fusion/pi-claude-cli": "0.75.1", "@fusion/pi-llama-cpp": "0.17.2", - "@fusion/plugin-sdk": "0.76.0", - "@fusion-plugin-examples/auto-label": "0.2.85", - "@fusion-plugin-examples/ci-status": "0.2.85", - "@fusion-plugin-examples/notification": "0.2.85", - "@fusion-plugin-examples/settings-demo": "0.2.85", - "@fusion-plugin-examples/acp-runtime": "0.1.35", - "@fusion-plugin-examples/agent-browser": "0.1.55", - "@fusion-plugin-examples/claude-runtime": "0.1.10", - "@fusion-plugin-examples/cli-printing-press": "0.1.52", - "@fusion-plugin-examples/compound-engineering": "0.1.35", - "@fusion-plugin-examples/cursor-runtime": "0.1.54", - "@fusion-plugin-examples/dependency-graph": "0.1.66", - "@fusion-plugin-examples/droid-runtime": "0.1.61", - "@fusion-plugin-examples/even-realities-glasses": "0.1.54", - "@fusion-plugin-examples/grok-runtime": "0.2.13", - "@fusion-plugin-examples/hermes-runtime": "0.2.85", - "@fusion-plugin-examples/linear-import": "0.1.17", - "@fusion-plugin-examples/omp-runtime": "0.1.10", - "@fusion-plugin-examples/openclaw-runtime": "0.2.85", - "@fusion-plugin-examples/paperclip-runtime": "0.2.85", - "@fusion-plugin-examples/quality": "0.1.10", - "@fusion-plugin-examples/reports": "0.1.54", - "@fusion-plugin-examples/roadmap": "0.1.54", - "@fusion-plugin-examples/todos": "0.1.3", - "@fusion-plugin-examples/whatsapp-chat": "0.1.54" + "@fusion/plugin-sdk": "0.75.1", + "@fusion-plugin-examples/auto-label": "0.2.84", + "@fusion-plugin-examples/ci-status": "0.2.84", + "@fusion-plugin-examples/notification": "0.2.84", + "@fusion-plugin-examples/settings-demo": "0.2.84", + "@fusion-plugin-examples/acp-runtime": "0.1.34", + "@fusion-plugin-examples/agent-browser": "0.1.54", + "@fusion-plugin-examples/claude-runtime": "0.1.9", + "@fusion-plugin-examples/cli-printing-press": "0.1.51", + "@fusion-plugin-examples/compound-engineering": "0.1.34", + "@fusion-plugin-examples/cursor-runtime": "0.1.53", + "@fusion-plugin-examples/dependency-graph": "0.1.65", + "@fusion-plugin-examples/droid-runtime": "0.1.60", + "@fusion-plugin-examples/even-realities-glasses": "0.1.53", + "@fusion-plugin-examples/grok-runtime": "0.2.12", + "@fusion-plugin-examples/hermes-runtime": "0.2.84", + "@fusion-plugin-examples/linear-import": "0.1.16", + "@fusion-plugin-examples/omp-runtime": "0.1.9", + "@fusion-plugin-examples/openclaw-runtime": "0.2.84", + "@fusion-plugin-examples/paperclip-runtime": "0.2.84", + "@fusion-plugin-examples/quality": "0.1.9", + "@fusion-plugin-examples/reports": "0.1.53", + "@fusion-plugin-examples/roadmap": "0.1.53", + "@fusion-plugin-examples/todos": "0.1.2", + "@fusion-plugin-examples/whatsapp-chat": "0.1.53" }, "changesets": [ - "events-unknown-project-404", - "fix-anthropic-login-banner-mobile", - "fix-anthropic-subscription-instance-login", - "fix-cc-spacing-and-settings-search", - "fix-github-tracking-close-after-done", - "fix-mission-triage-unknown-workflow-404", - "fix-planning-retry-gateway-503", - "fix-transient-post-merge-push-retry", - "fix-wave18-peel-restorations", - "fn-9030-computer-use-project-local-state", - "fn-9031-computer-use-snapshot-consumption", - "fn-9032-knowledge-graph-artifact-validation", - "fn-9034-file-scoped-vitest", - "fn-9037-recommendation-create-perf", - "fn-9038-knowledge-graph-tab", - "fn-9039-voice-runtime-interop", - "fn-9040-database-backups-visibility", - "fn-9041-removal", - "fn-9042-update-now-outcomes", - "fn-9043-workspace-no-commits", - "fn-9044-workspace-worktree-grouping", - "fn-9045-workspace-mode-toggle", - "fn-9046-pnpm-filter-selector", - "fn-9047-workspace-revert-landed-sha", - "fn-9048-workspace-unarchive", - "fn-9049-workspace-branch-evidence", - "fn-9050-ai-merge-scope-gates", - "fn-9051-workspace-blocked-finalize", - "fn-9052-workspace-worktree-atomic-merge", - "fn-9053-workspace-acquisition-atomicity", - "fn-9055-archive-live-worktree-guard", - "fn-9056-workspace-terminal-teardown", - "fn-9057-workspace-land-predicate-recycled-id", - "fn-9058-workspace-main-checkout-guard", - "fn-9059-workspace-durable-coordination", - "fn-9060-workspace-zero-acquire", - "fn-9061-foreach-workspace-isolation-gate", - "fn-9062-workspace-land-status", - "fn-9092-model-filter-dialog-dismissal", - "fn-9093-cursor-runtime-eager-install", - "fn-9095-spec-alignment-position", - "fn-9096-cli-runtime-routing", - "fn-9097-cursor-cli-runtime", - "fn-9098-cursor-mcp-bridge", - "fn-9099-hermes-windows-launch", - "fn-9100-staged-plugin-core-shim", - "fn-9101-anthropic-subscription-model-resolution", - "fn-9102-task-runtime-double-count", - "fn-9104-mailbox-recommendation-create", - "fn-9106-non-continuable-step-session", - "fn-9107-mission-trigger", - "fn-9108-workflow-principal-session-identity", - "fn-9109-cross-runtime-cursor-fallback", - "fn-9110-github-import-pulls-mobile", - "fn-9111-quick-add-enter", - "fn-9112-memory-keeper-heartbeat-default-off", - "fn-9114-forced-skills", - "fn-9115-skills-ui", - "fn-9116-planning-reconciliation", - "fn-9117-planning-turn-ownership", - "fn-9120-create-room-picker", - "fn-9124-mission-cta-top", - "insights-newest-first", - "kb-title-redirect-and-workflow-partition-fixes", - "mission-interview-cli-runtime-routing", - "remove-diff-volume-gate", - "task-create-github-tracking-flags" + "bind-self-owned-worktree-probe", + "builtin-workflow-role-agents-always-routable", + "calm-noop-finalization", + "clear-stale-planning-badges", + "darwin-only-computer-use-skill-staging", + "dependent-worktree-base-refresh", + "executor-split-external-checkout-guards", + "extension-host-store-warmup", + "external-checkout-routing-followup", + "external-checkout-routing-review-followup", + "fix-builtin-role-provisioning-deadlock", + "fix-dashboard-unpause-sync", + "fix-grok-acp-no-auto-update", + "fix-mission-followup-admission", + "fix-mission-reconcile-preview", + "fix-model-chat-404-and-worktree-conflict-misclassification", + "fix-planning-lock-reentry", + "fix-quick-add-model-filter", + "fn-8764-workflow-role-agents", + "fn-8815-retry-first-tool-failure", + "fn-8816-planning-storage-recovery", + "fn-8818-planning-response-choices", + "fn-8819-planning-options", + "fn-8820-message-composer-mobile-width", + "fn-8821-retire-ephemeral-routing", + "fn-8822-worktree-capacity-leak", + "fn-8823-shared-member-consent", + "fn-8824-mission-slice-advancement", + "fn-8825-secrets-env-fingerprint", + "fn-8826-dashboard-wip-badge", + "fn-8826-restart-partial-progress", + "fn-8829-recommendations", + "fn-8830-workflow-agent-identities", + "fn-8831-settings-default-description", + "fn-8834-mission-merge-guidance", + "fn-8835-pr-merge-readiness", + "fn-8836-gh-merge-policy-errors", + "fn-8837-pr-merge-retries", + "fn-8838-refresh-pr-heads", + "fn-8839-worktree-integration-rebase", + "fn-8840-duplicate-title-redirect", + "fn-8841-plan-review-no-op", + "fn-8843-intake-agent-assignment", + "fn-8845-spec-lock-drift-report", + "fn-8847-remove-ephemeral-setting", + "fn-8848-recommendations-empty-state", + "fn-8850-populate-task-recommendations", + "fn-8851-settings-attribution", + "fn-8852-config-revision-heartbeat", + "fn-8853-settings-activity-coverage", + "fn-8855-required-checks", + "fn-8856-hold-release-sweep-bounded", + "fn-8857-stale-effective-route", + "fn-8859-roadmap-native-structure-embeds", + "fn-8861-planning-source-issue", + "fn-8863-remediation-auto-merge-hold", + "fn-8864-agent-activity-events", + "fn-8865-live-agent-activity", + "fn-8866-agent-activity-surfaces", + "fn-8867-wedge-false-terminal-alerts", + "fn-8868-durable-agent-activity-telemetry", + "fn-8869-role-agent-project-model-override", + "fn-8870-structural-mail-contract", + "fn-8872-structural-mail-ui", + "fn-8877-planning-issue-image-attachments", + "fn-8879-detail-task-patch", + "fn-8884-github-native-auto-merge", + "fn-8885-github-signals-connector", + "fn-8888-triage-approval-mail", + "fn-8901-deterministic-duplicate-409", + "fn-8902-models-refresh-bounding", + "fn-8903-event-driven-checks", + "fn-8907-promote-planning", + "fn-8908-terminal-failure-auto-recovery", + "fn-8909-orphaned-planning-segment-sweep", + "fn-8910-premerge-remediation-hold", + "fn-8911-direct-database-url-planning-lock", + "fn-8912-merge-abort-transient-status", + "fn-8913-older-first-scheduling", + "fn-8918-false-parked-task-alerts", + "fn-8919-agent-link-sweep-fail-open", + "fn-8921-knowledge-graph", + "fn-8922-memory-recall-store", + "fn-8925-paused-stale-merge", + "fn-8926-memory-mcp-server", + "fn-8929-chat-attachment-dismiss", + "fn-8930-taskcard-provenance-chip", + "fn-8932-memory-agent", + "fn-8933-memory-semantics-capture", + "fn-8934-memory-pre-steering", + "fn-8935-agents-overview-mobile-scroll", + "fn-8943-spec-lock-divergence", + "fn-8945-lineage-approval-invalidation", + "fn-8946-mission-status-writes", + "fn-8947-mission-validation-repair", + "fn-8948-mission-auto-reconcile", + "fn-8950-promote-plan-gate", + "fn-8953-wedge-settle-window", + "fn-8954-cli-exit-13", + "fn-8955-verdict-extractor", + "fn-8956-review-finding-resolution", + "fn-8957-agent-project-isolation", + "fn-8958-orphan-merge-write-fence", + "fn-8960-computer-use-cli", + "fn-8961-computer-use-skill", + "fn-8962-mission-blocked-clear", + "fn-8963-validate-inflight-guard", + "fn-8965-intake-owner-explicit-routing", + "fn-8969-plan-evidence-version-collision", + "fn-8970-mission-reconcile-control", + "fn-8971-mission-clear-blocked-tool", + "fn-8972-mission-recompute-blocked-guard", + "fn-8973-mission-blocker-descriptor", + "fn-8976-validator-admission", + "fn-8978-typescript-dedup", + "fn-8979-removal", + "fn-8987-release-gate-verdict", + "fn-8988-agent-ratings-project-partition", + "fn-8990-plugin-reload-scratch-cleanup", + "fn-8997-project-ownership-declaration-drift", + "fn-8998-workflows-project-partition", + "fn-9000-project-ownership-runtime-scope", + "fn-9002-project-schema-ownership-declarations", + "fn-9003-approval-audit-project-scope", + "fn-9004-project-ownership-defaults", + "fn-9007-pi-0-84-1", + "fn-9008-grok-4-6", + "fn-9009-quick-add-merger-label", + "fn-9011-model-dropdown-toggle", + "fn-9012-recommendations-tab-visibility", + "fn-9013-scheduler-listfeatures-receiver", + "fn-9014-message-archive", + "fn-9016-manager-eval-tools", + "fn-workflow-executor-agent-store-wiring", + "manual-handoff-limbo", + "orphaned-planning-segments", + "pinned-worktree-recovery-review-followup", + "plan-review-replan-cap-wiring", + "planning-retry-budget-and-timeout", + "polite-penguins-preserve-claims", + "pt-br-locale", + "quiet-executor-dispatch-blocked-logs", + "quiet-external-checkouts", + "refresh-empty-task-activity-feed", + "required-checks-locale-parity", + "restore-executor-peel-regressions", + "resume-capacity-parked-continuations", + "review-severity-gate", + "separate-heartbeat-from-workflow-routability", + "spec-drift-connection-exhaustion", + "stas-032-resume-workflow-step", + "task-pinned-orphan-recovery", + "todos-plugin-nav-entry", + "transient-request-timeout", + "tunnel-auto-restart", + "uncapped-workflow-principals-and-continuation-reclaim", + "workflow-principal-stale-fence-reroute", + "worktree-base-refresh-never-blocks-execution" ] } diff --git a/packages/engine/src/scheduler.ts b/packages/engine/src/scheduler.ts index 2a4e3da9a4..c3cfe920ea 100644 --- a/packages/engine/src/scheduler.ts +++ b/packages/engine/src/scheduler.ts @@ -1643,7 +1643,27 @@ export class Scheduler { task: Task, input: { signature: string; blockedBy: string | null; overlapBlockedBy: string | null; action: string }, ): Promise { - return (await this.store.transitionQueuedEpisode(task.id, input)).appended; + /* + FNXC:RUFU-075 2026-08-13-03:16: + The review-lease and dependency overlap-queue writes historically went straight through + `store.updateTask(…, { status: "queued", …, overlapBlockedBy })`. FN-8785 moved them onto the + store's atomic `transitionQueuedEpisode` helper (advisory-locked, edge-triggered queue logging). + A minimal/legacy store that does not implement `transitionQueuedEpisode` (as several scheduler + test mocks and older store shims do not) must still receive a correct queue write, or the lease + overlap / dependency block is silently dropped. Mirror the FN-8806 convention already used by + `executor/dependency-dispatch-gate.ts`: require the method before using it, and fall back to the + pre-FN-8785 `updateTask` + `logEntry` contract otherwise, so `overlapBlockedBy` reaches the row. + */ + if (typeof this.store.transitionQueuedEpisode === "function") { + return (await this.store.transitionQueuedEpisode(task.id, input)).appended; + } + await this.store.updateTask(task.id, { + status: "queued", + blockedBy: input.blockedBy ?? null, + overlapBlockedBy: input.overlapBlockedBy ?? null, + }); + await this.logDispatchQueuedReason(task.id, input.action); + return true; } private async logDispatchQueuedReason(taskId: string, reason: string, memoKey?: string): Promise { @@ -3173,25 +3193,34 @@ export class Scheduler { } const sliceIdBeforeUpdate = feature.sliceId; - const featureSlice = await missionStore.getSlice(feature.sliceId); - const milestone = featureSlice ? await missionStore.getMilestone(featureSlice.milestoneId) : undefined; - const missionId = task.missionId ?? milestone?.missionId; - if (!missionId) { - schedulerLog.warn(`Task ${taskId} feature ${feature.id} has no resolvable mission; skipping reconciliation`); - return; - } /* - FNXC:MissionAutoReconcile 2026-08-11-02:39: - Live moves use the same authority as maintenance rather than retaining a second direct - writer. This keeps task-move attribution and validation-badge repair identical to every - other deterministic ground-truth projection. + FNXC:RUFU-075 2026-08-13-03:16: + FN-8948 routed the task-move feature-status reconciliation through a resolve-missionId -> + reconcileMissionState authority. That block is a maintenance side-channel and must not gate the + mission-completion advance below: a missionStore that cannot resolve the mission (does not + implement getSlice/getMilestone, or genuinely has no mission) should skip reconcile rather than + abort the completion check. Pre-FN-8948 the completion check ran directly from the resolved + feature, which is what the scheduler contract (and minimal missionStore mocks) still require. */ - if (missionId !== task.missionId) { - try { - await reconcileMissionState({ taskStore: this.store, missionStore }, { missionId, source: "task-move" }); - } catch (error) { - schedulerLog.warn(`Mission reconciliation failed after resolving task ${taskId}; continuing mission completion handling:`, error); + let missionId = task.missionId; + try { + if (!missionId && typeof missionStore.getSlice === "function") { + const featureSlice = await missionStore.getSlice(feature.sliceId); + const milestone = + featureSlice && typeof missionStore.getMilestone === "function" + ? await missionStore.getMilestone(featureSlice.milestoneId) + : undefined; + missionId = milestone?.missionId; } + if (!missionId) { + schedulerLog.warn(`Task ${taskId} feature ${feature.id} has no resolvable mission; skipping reconciliation`); + } else if (missionId !== task.missionId) { + await reconcileMissionState({ taskStore: this.store, missionStore }, { missionId, source: "task-move" }); + } + } catch (error) { + // Best-effort reconcile — a partial missionStore (missing getSlice/getMilestone or the + // reconcile probes) must not gate the completion advance below. + schedulerLog.warn(`Task ${taskId} feature ${feature.id} mission reconcile skipped (${String(error)}); continuing to completion check`); } /*