@runfusion/fusion 0.77.0-beta.8 → 0.77.0-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +8697 -4843
- package/dist/child-process-worker.js +8099 -4942
- package/dist/client/.vite/manifest.json +252 -252
- package/dist/client/assets/{AgentDetailView-DsMRc-aH.js → AgentDetailView-DLzgMG5W.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-BXJ52YpO.js → AgentPermissionPolicyEditor-CHoQs5wt.js} +1 -1
- package/dist/client/assets/{AgentsView-DO-25nlB.js → AgentsView-LDH9ih8-.js} +3 -3
- package/dist/client/assets/{CommandCenter-BMXMg_I2.js → CommandCenter-DQ2Wjfo6.js} +1 -1
- package/dist/client/assets/{DevServerView-DAeL5TYz.js → DevServerView-NunavHb5.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-Cw-XRjAa.js → DirectoryPicker-FymMYoLf.js} +1 -1
- package/dist/client/assets/{DocumentsView-CusClN9u.js → DocumentsView-By9SHDrK.js} +1 -1
- package/dist/client/assets/{EvalsView-gNdeUDww.js → EvalsView-KHDm_jIP.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-Bmzbqzhs.js → ExperimentalAgentOnboardingModal-CXZXL44D.js} +1 -1
- package/dist/client/assets/{GoalsView-J8JMsoLn.js → GoalsView-CXJQllGu.js} +1 -1
- package/dist/client/assets/{InsightsView-BVbv56K0.js → InsightsView-PSlbun5-.js} +1 -1
- package/dist/client/assets/{MemoryView-DNvJFoDu.js → MemoryView-Bj31SvJV.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-BPMexS34.js → PiExtensionsManager-CbEnWrEb.js} +1 -1
- package/dist/client/assets/{PluginManager-DGEv-ptu.js → PluginManager-Ncr6jySY.js} +1 -1
- package/dist/client/assets/{PullRequestView-CF7fx-Uo.js → PullRequestView-3cR6DptH.js} +1 -1
- package/dist/client/assets/{ReportModal-B8S5BFgn.js → ReportModal-0cDRUWOi.js} +1 -1
- package/dist/client/assets/{ResearchView-CBeXsevy.js → ResearchView-rnrVF79-.js} +1 -1
- package/dist/client/assets/{SecretsView-Dmi9wZkv.js → SecretsView-kF17RkhO.js} +1 -1
- package/dist/client/assets/{SettingsModal-DSW3xnGk.js → SettingsModal-BQdO_hEg.js} +1 -1
- package/dist/client/assets/SettingsModal-DZdXfRcf.css +1 -0
- package/dist/client/assets/SettingsModal-DsA3Vg3y.js +21 -0
- package/dist/client/assets/{SettingsTextareaRow-CLab4Vcd.js → SettingsTextareaRow-BmxrECAt.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-Ct6juX9x.js → SetupWizardModal-Dlgtw7CJ.js} +2 -2
- package/dist/client/assets/{SkillsView-Dn0bwT6i.js → SkillsView-D6BmZdru.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-cvReMlG-.js → WorkflowNodeEditor-CVHHMqvn.js} +1 -1
- package/dist/client/assets/{agent-import-generation-C8_ewVzC.js → agent-import-generation-CnrRwmdq.js} +1 -1
- package/dist/client/assets/{agentsOrgChartLayout-p1i6XROQ.js → agentsOrgChartLayout-purG_-3A.js} +1 -1
- package/dist/client/assets/app-BE1XE5i8.js +5 -0
- package/dist/client/assets/app-BZBG5TsV.js +5 -0
- package/dist/client/assets/app-BZk9L8ul.js +13 -0
- package/dist/client/assets/app-CSFGL3vj.js +13 -0
- package/dist/client/assets/app-CfwwdZoX.js +13 -0
- package/dist/client/assets/app-CtSn_Ct1.js +13 -0
- package/dist/client/assets/app-CyJ_qBtM.js +13 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-CzCk1QdH.js → architectureDiagram-3BPJPVTR-D_oUETkg.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-74Rj-5ov.js → blockDiagram-GPEHLZMM-SeVvCFBr.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-B570qYH-.js → c4Diagram-AAUBKEIU-C-bOAkwQ.js} +1 -1
- package/dist/client/assets/channel-CxElf6wV.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-DejJkxt6.js → chunk-2J33WTMH-Dfy3ok0u.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-DlgxkBuE.js → chunk-4BX2VUAB-CJhw204d.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-XCfE8PwC.js → chunk-55IACEB6-Sgt6UphC.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-D-nDw0Bi.js → chunk-727SXJPM-BvQJpRvs.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-C4KySao0.js → chunk-AQP2D5EJ-Cthfrcwy.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-CXKdLygA.js → chunk-FMBD7UC4-Cz3x993o.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-bNYWWGVJ.js → chunk-ND2GUHAM-PNcjW0Zw.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-cfBQJ-MX.js → chunk-QZHKN3VN-4nKyNxvF.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CtVaR4ZF.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CtVaR4ZF.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-CiZrg3mQ.js → cose-bilkent-S5V4N54A-Ceay49Yk.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-Bckph2U4.js → dagre-BM42HDAG-D9VGvuIj.js} +1 -1
- package/dist/client/assets/{dashboard-view-DDRKwfFs.js → dashboard-view-BBWCZOq1.js} +1 -1
- package/dist/client/assets/{dashboard-view-IuPjDVGa.js → dashboard-view-RQ4TPddv.js} +1 -1
- package/dist/client/assets/{dashboard-view-CVYHQZwx.js → dashboard-view-ZGUl38Cw.js} +1 -1
- package/dist/client/assets/{dashboard-view-CN_fkDM1.js → dashboard-view-gpkvNzBo.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-Bnaurex7.js → diagram-2AECGRRQ-Q5XXKnnv.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-BKz1omVN.js → diagram-5GNKFQAL-ByGKtZN7.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-C51lEZwo.js → diagram-KO2AKTUF-B5wCSTUz.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-BYm5gql7.js → diagram-LMA3HP47-C4eGtq1N.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-B9CFA4ha.js → diagram-OG6HWLK6-BxTb4tZr.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-BLyCSssl.js → erDiagram-TEJ5UH35-CWt1TSp9.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-yDVmpkro.js → flowDiagram-I6XJVG4X-DUAfL604.js} +1 -1
- package/dist/client/assets/{folder-open-Cf2NA9nV.js → folder-open-CihApyzT.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-mC9YPFcx.js → ganttDiagram-6RSMTGT7-DBS31zRY.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DS0bEccv.js → gitGraphDiagram-PVQCEYII-BmYxNXvm.js} +1 -1
- package/dist/client/assets/index-BN0mudGK.js +2898 -0
- package/dist/client/assets/index-Bi6-k7Mt.css +1 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-CuuNZITP.js → infoDiagram-5YYISTIA-oeqISHuE.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-MBSaC94m.js → ishikawaDiagram-YF4QCWOH-De7HSTs3.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-DkaAow9E.js → journeyDiagram-JHISSGLW-CnOQgak6.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-DSf5OLtq.js → kanban-definition-UN3LZRKU-DkkSXQc1.js} +1 -1
- package/dist/client/assets/{mermaid.core-HmTn21MF.js → mermaid.core-DPtpszZ3.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-sv0Dl8aI.js → mindmap-definition-RKZ34NQL-CTVye-HX.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-BDK2IQNq.js → pieDiagram-4H26LBE5-Dls6obgy.js} +1 -1
- package/dist/client/assets/{puzzle-D00mP67o.js → puzzle-o6sQbTzB.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CiWAhwf1.js → quadrantDiagram-W4KKPZXB-BPHggPTG.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DwC99D35.js → requirementDiagram-4Y6WPE33-Cdtv6VSz.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-CQn8z721.js → sankeyDiagram-5OEKKPKP-CgQ4VG36.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B0CT8-vw.js → sequenceDiagram-3UESZ5HK-DllpS820.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-BIBO_Prr.js → standing-instructions-template-BpjTC7lE.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-BYAB_dFF.js → stateDiagram-AJRCARHV-BjDL2xGC.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Cd19uJBk.js → stateDiagram-v2-BHNVJYJU-CvKLFCGR.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-DQLh8XkY.js → timeline-definition-PNZ67QCA-BHlmiUIC.js} +1 -1
- package/dist/client/assets/{upload-D4pkNOz2.js → upload-Bn7DjmMR.js} +1 -1
- package/dist/client/assets/{users-COgviS_S.js → users-CAwUf5mJ.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-BmwG1Wud.js → vennDiagram-CIIHVFJN-_pYBvG2q.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-BiO7jkmj.js → wardley-L42UT6IY-Cnu65RLv.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-Dq0IPg5H.js → wardleyDiagram-YWT4CUSO-DQC_N8jk.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-BlMOlSBc.js → xychartDiagram-2RQKCTM6-CMaINq7s.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +7907 -4576
- package/dist/migrations/0066_chat_session_memory_focus.sql +20 -0
- package/dist/migrations/0067_fn_179_session_contention_wait_state.sql +3 -0
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +53 -3
- package/dist/plugin-sdk/index.js +319 -2
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +337 -20
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +332 -15
- package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +332 -15
- package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +332 -15
- package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-quality/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-quality/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-todos/bundled.js +319 -2
- package/dist/plugins/fusion-plugin-todos/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +422 -6468
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/dist/client/assets/SettingsModal-D2kXP7Um.js +0 -21
- package/dist/client/assets/SettingsModal-Ds0Yj47X.css +0 -1
- package/dist/client/assets/app-BOvA34XN.js +0 -13
- package/dist/client/assets/app-Bic4iWXQ.js +0 -13
- package/dist/client/assets/app-BlbH7Tir.js +0 -5
- package/dist/client/assets/app-C6TctczU.js +0 -13
- package/dist/client/assets/app-D3qZmEIu.js +0 -13
- package/dist/client/assets/app-DLnMkUt5.js +0 -5
- package/dist/client/assets/app-mNy0DeDM.js +0 -13
- package/dist/client/assets/channel-DWAK5y-J.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-WTkXRkfm.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-WTkXRkfm.js +0 -1
- package/dist/client/assets/index-BjM7LxzY.js +0 -2805
- package/dist/client/assets/index-DcKIzuMk.css +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
-- FNXC:MemoryFocus 2026-08-13-15:57:
|
|
2
|
+
-- RUFU-068: per-conversation read-time memory FOCUS/TOPIC layer over the
|
|
3
|
+
-- per-project Stash scope (ported from clean-rebase's 0049_chat_session_memory_focus.sql
|
|
4
|
+
-- and renumbered to 0060). Adds chat_sessions.memory_focus so the active topic
|
|
5
|
+
-- persists across reconnects and scopes fn_memory_search + proactive recall to a
|
|
6
|
+
-- working topic within the project. NULL/empty ('' normalized to NULL) means the
|
|
7
|
+
-- conversation inherits the whole-project scope. This column is a read-time focus
|
|
8
|
+
-- filter only — capture stays write-anywhere and cross-project isolation is
|
|
9
|
+
-- untouched (Stash owner_user_id SQL scope is orthogonal).
|
|
10
|
+
-- Sequence provenance (migration is 0066): it started at 0059, moved to 0060 when
|
|
11
|
+
-- origin/main concurrently landed FN-9037's 0059_fn_9037_tasks_source_agent_index.sql
|
|
12
|
+
-- (2026-08-14), to 0061 on 2026-08-15 (FN-9059's workspace coordination leases own
|
|
13
|
+
-- 0060), and the upstream 2026-08-20 batch (FN-066..FN-094) claiming 0061-0064
|
|
14
|
+
-- pinned it at 0065 (the next free sequence above SCHEMA_BASELINE_VERSION "0064").
|
|
15
|
+
-- Renumbered to 0066 on 2026-08-23 (rebase onto origin/main 3f448f7292): upstream's
|
|
16
|
+
-- FN-149 shipped 0065_fn_149_review_convergence_stage.sql, claiming 0065 canonically.
|
|
17
|
+
-- Upstream's 0065 is already released, so this migration takes the next free sequence.
|
|
18
|
+
-- Production ledgers that applied the memory-focus SQL under the old row "0065"
|
|
19
|
+
-- (v17-era) need a one-time 0065->0066 ledger remap before first 0066-ceiling boot.
|
|
20
|
+
ALTER TABLE IF EXISTS project.chat_sessions ADD COLUMN IF NOT EXISTS memory_focus text;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
-- FNXC:WorkspaceContention 2026-08-24-03:34: Persist the bounded scheduling wait at 0067 because released chat memory focus owns 0066; restart cannot reset a live-holder budget or leave an unowned badge.
|
|
2
|
+
ALTER TABLE project.tasks ADD COLUMN IF NOT EXISTS session_contention_hold_count integer DEFAULT 0;
|
|
3
|
+
ALTER TABLE project.tasks ADD COLUMN IF NOT EXISTS session_contention_wait_reason text;
|
|
@@ -607,6 +607,8 @@ interface TaskRow {
|
|
|
607
607
|
postReviewFixCount: number | null;
|
|
608
608
|
planReviewReplanCount: number | null;
|
|
609
609
|
recoveryRetryCount: number | null;
|
|
610
|
+
sessionContentionHoldCount: number | null;
|
|
611
|
+
sessionContentionWaitReason: string | null;
|
|
610
612
|
taskDoneRetryCount: number | null;
|
|
611
613
|
bulkCompletionRefusalAt: string | null;
|
|
612
614
|
workflowIrPin: string | null;
|
|
@@ -3503,6 +3505,15 @@ type AuthMaterialSnapshot = SharedSnapshotEnvelope<{
|
|
|
3503
3505
|
providerAuth?: Record<string, ProviderAuthEntry>;
|
|
3504
3506
|
}>;
|
|
3505
3507
|
|
|
3508
|
+
type IntegrationBranchSource = "configured" | "origin-head" | "well-known-local" | "current-head" | "sole-local" | "remote-tracking";
|
|
3509
|
+
interface IntegrationBranchReconciliation {
|
|
3510
|
+
repoRelPath: string;
|
|
3511
|
+
branch: string;
|
|
3512
|
+
source: IntegrationBranchSource | "fallback";
|
|
3513
|
+
action: "existing" | "created-from-remote" | "created-from-head" | "unavailable";
|
|
3514
|
+
reason?: string;
|
|
3515
|
+
}
|
|
3516
|
+
|
|
3506
3517
|
type GitRepositoryEnsureOutcome = "existing" | "initialized";
|
|
3507
3518
|
interface GitRepositoryCommandResult {
|
|
3508
3519
|
stdout: string;
|
|
@@ -3517,6 +3528,11 @@ interface EnsureGitRepositoryOptions {
|
|
|
3517
3528
|
runner?: GitRepositoryCommandRunner;
|
|
3518
3529
|
timeoutMs?: number;
|
|
3519
3530
|
}
|
|
3531
|
+
interface ProjectGitReadiness {
|
|
3532
|
+
outcome: GitRepositoryEnsureOutcome;
|
|
3533
|
+
integrationBranches: IntegrationBranchReconciliation[];
|
|
3534
|
+
}
|
|
3535
|
+
declare function ensureProjectGitReadiness(projectPath: string, options?: EnsureGitRepositoryOptions): Promise<ProjectGitReadiness>;
|
|
3520
3536
|
declare function ensureGitRepositoryForProjectPath(projectPath: string, options?: EnsureGitRepositoryOptions): Promise<GitRepositoryEnsureOutcome>;
|
|
3521
3537
|
|
|
3522
3538
|
type RunningAgentCountSource = (projectIds: readonly string[]) => Promise<Record<string, number>> | Record<string, number>;
|
|
@@ -3585,9 +3601,11 @@ interface EnsureProjectForPathResult {
|
|
|
3585
3601
|
reattached: boolean;
|
|
3586
3602
|
outcome: "existing" | "reattached" | "registered";
|
|
3587
3603
|
gitRepository?: GitRepositoryEnsureOutcome;
|
|
3604
|
+
integrationBranches?: IntegrationBranchReconciliation[];
|
|
3588
3605
|
}
|
|
3589
3606
|
interface CentralCoreOptions {
|
|
3590
3607
|
ensureGitRepositoryForProjectPath?: typeof ensureGitRepositoryForProjectPath;
|
|
3608
|
+
ensureProjectGitReadiness?: typeof ensureProjectGitReadiness;
|
|
3591
3609
|
asyncLayer?: AsyncDataLayer;
|
|
3592
3610
|
}
|
|
3593
3611
|
declare class CentralCore extends EventEmitter<CentralCoreEvents> {
|
|
@@ -3597,7 +3615,7 @@ declare class CentralCore extends EventEmitter<CentralCoreEvents> {
|
|
|
3597
3615
|
private nodeDiscovery;
|
|
3598
3616
|
private discoveryConfig;
|
|
3599
3617
|
private readonly discoveredNodes;
|
|
3600
|
-
private readonly
|
|
3618
|
+
private readonly ensureProjectGitReadiness;
|
|
3601
3619
|
private ownedBackendShutdown;
|
|
3602
3620
|
private ownedBackendReleaseConnections;
|
|
3603
3621
|
private initializationPromise;
|
|
@@ -4326,6 +4344,16 @@ declare function reclaimWorkspaceLeaseAsync(store: TaskStore, input: {
|
|
|
4326
4344
|
outcome: WorkspaceLeaseReclaimOutcome;
|
|
4327
4345
|
}>;
|
|
4328
4346
|
|
|
4347
|
+
interface AppendRemediationStepsOptions {
|
|
4348
|
+
wave?: number;
|
|
4349
|
+
}
|
|
4350
|
+
interface AppendRemediationStepsResult {
|
|
4351
|
+
task: Task;
|
|
4352
|
+
appended: TaskStep[];
|
|
4353
|
+
appendedCount: number;
|
|
4354
|
+
wave: number;
|
|
4355
|
+
}
|
|
4356
|
+
|
|
4329
4357
|
declare const TASK_DELETE_CALLER_KINDS: readonly ["operator-ui", "operator-cli", "agent-tool", "engine", "api-unattributed"];
|
|
4330
4358
|
type TaskDeleteCallerKind = (typeof TASK_DELETE_CALLER_KINDS)[number];
|
|
4331
4359
|
interface TaskDeleteAuditContext {
|
|
@@ -4960,6 +4988,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
4960
4988
|
private pluginPostgresSchemaExecutor;
|
|
4961
4989
|
private handoffMergeQueueFailureInjectorForTesting;
|
|
4962
4990
|
get backendMode(): boolean;
|
|
4991
|
+
getProjectId(): string | null;
|
|
4963
4992
|
watcher: FSWatcher | null;
|
|
4964
4993
|
taskCache: Map<string, Task>;
|
|
4965
4994
|
readonly laneCache: TaskLaneCache;
|
|
@@ -5152,7 +5181,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
5152
5181
|
leaseKey: string;
|
|
5153
5182
|
owner: WorkspaceLeaseOwner;
|
|
5154
5183
|
fenceToken: bigint;
|
|
5155
|
-
}): Promise<"unknown" | "
|
|
5184
|
+
}): Promise<"unknown" | "missing" | "superseded" | "valid">;
|
|
5156
5185
|
recordWorkspaceLeaseFenceRef(input: {
|
|
5157
5186
|
handle: WorkspaceLeaseHandle;
|
|
5158
5187
|
fenceRefName: string;
|
|
@@ -5592,6 +5621,8 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
5592
5621
|
postReviewFixCount?: number | null;
|
|
5593
5622
|
planReviewReplanCount?: number | null;
|
|
5594
5623
|
recoveryRetryCount?: number | null;
|
|
5624
|
+
sessionContentionHoldCount?: number | null;
|
|
5625
|
+
sessionContentionWaitReason?: string | null;
|
|
5595
5626
|
taskDoneRetryCount?: number | null;
|
|
5596
5627
|
bulkCompletionRefusalAt?: string | null;
|
|
5597
5628
|
workflowIrPin?: string | null;
|
|
@@ -5711,6 +5742,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
5711
5742
|
claimNextToolFailureRetry(taskId: string, expectedCursor: number, maxRetries: number): Promise<ToolFailureRetryClaim>;
|
|
5712
5743
|
markToolFailureRetryExhaustedAudit(taskId: string): Promise<boolean>;
|
|
5713
5744
|
updateTaskAtomic(id: string, updater: (current: Task) => Parameters<TaskStore["updateTask"]>[1] | null | undefined | Promise<Parameters<TaskStore["updateTask"]>[1] | null | undefined>, runContext?: RunMutationContext): Promise<Task>;
|
|
5745
|
+
appendRemediationSteps(taskId: string, steps: readonly TaskStep[], options?: AppendRemediationStepsOptions): Promise<AppendRemediationStepsResult>;
|
|
5714
5746
|
dismissAiMergeReviewFinding(taskId: string, findingId: string, reason: string, actor?: string): Promise<Task>;
|
|
5715
5747
|
linkTaskRecommendation(id: string, recommendationId: string, createdTaskId: string, completeColumns?: ReadonlySet<string>): Promise<Task>;
|
|
5716
5748
|
normalizeWorkspaceTaskWorktreeMetadata(id: string): Promise<Task>;
|
|
@@ -6966,6 +6998,16 @@ type StepStatus = "pending" | "in-progress" | "done" | "skipped";
|
|
|
6966
6998
|
interface TaskStep {
|
|
6967
6999
|
name: string;
|
|
6968
7000
|
status: StepStatus;
|
|
7001
|
+
remediation?: {
|
|
7002
|
+
wave: number;
|
|
7003
|
+
gate: string;
|
|
7004
|
+
gateStepId: string;
|
|
7005
|
+
findingId?: string;
|
|
7006
|
+
filePath?: string;
|
|
7007
|
+
line?: number;
|
|
7008
|
+
detail?: string;
|
|
7009
|
+
declaredFiles?: string[];
|
|
7010
|
+
};
|
|
6969
7011
|
dependsOn?: number[];
|
|
6970
7012
|
}
|
|
6971
7013
|
interface RunMutationContext {
|
|
@@ -7808,6 +7850,8 @@ interface Task {
|
|
|
7808
7850
|
postReviewFixCount?: number;
|
|
7809
7851
|
planReviewReplanCount?: number;
|
|
7810
7852
|
recoveryRetryCount?: number;
|
|
7853
|
+
sessionContentionHoldCount?: number;
|
|
7854
|
+
sessionContentionWaitReason?: string;
|
|
7811
7855
|
taskDoneRetryCount?: number;
|
|
7812
7856
|
bulkCompletionRefusalAt?: string;
|
|
7813
7857
|
workflowIrPin?: string;
|
|
@@ -8210,6 +8254,7 @@ interface GlobalSettings {
|
|
|
8210
8254
|
defaultProjectId?: string;
|
|
8211
8255
|
setupComplete?: boolean;
|
|
8212
8256
|
cliOnboardingCompletedAt?: string;
|
|
8257
|
+
githubStarPromptDismissedAt?: string;
|
|
8213
8258
|
favoriteProviders?: string[];
|
|
8214
8259
|
favoriteModels?: string[];
|
|
8215
8260
|
openrouterModelSync?: boolean;
|
|
@@ -8244,7 +8289,6 @@ interface GlobalSettings {
|
|
|
8244
8289
|
autoUpdateAndRestart?: boolean;
|
|
8245
8290
|
autoUpdateEnabled?: boolean;
|
|
8246
8291
|
autoRestartAfterUpdate?: boolean;
|
|
8247
|
-
autoReloadOnVersionChange?: boolean;
|
|
8248
8292
|
modelOnboardingComplete?: boolean;
|
|
8249
8293
|
useClaudeCli?: boolean;
|
|
8250
8294
|
useDroidCli?: boolean;
|
|
@@ -8690,6 +8734,12 @@ interface ProjectSettings {
|
|
|
8690
8734
|
insightExtractionMinIntervalMs?: number;
|
|
8691
8735
|
memoryEnabled?: boolean;
|
|
8692
8736
|
memoryBackendType?: string;
|
|
8737
|
+
stashUrl?: string;
|
|
8738
|
+
stashApiKey?: string;
|
|
8739
|
+
stashVectorSearch?: boolean;
|
|
8740
|
+
executorSessionCaptureEnabled?: boolean;
|
|
8741
|
+
executorSessionCaptureMaxEvents?: number;
|
|
8742
|
+
executorSessionCaptureIncludeStatus?: boolean;
|
|
8693
8743
|
memoryAutoSummarizeEnabled?: boolean;
|
|
8694
8744
|
memoryAutoSummarizeThresholdChars?: number;
|
|
8695
8745
|
memoryAutoSummarizeSchedule?: string;
|
package/dist/plugin-sdk/index.js
CHANGED
|
@@ -5850,6 +5850,8 @@ var tasks = projectSchema.table("tasks", {
|
|
|
5850
5850
|
executeRequeueLoopCount: integer("execute_requeue_loop_count").default(0),
|
|
5851
5851
|
executeRequeueLoopSignature: text("execute_requeue_loop_signature"),
|
|
5852
5852
|
recoveryRetryCount: integer("recovery_retry_count"),
|
|
5853
|
+
sessionContentionHoldCount: integer("session_contention_hold_count").default(0),
|
|
5854
|
+
sessionContentionWaitReason: text("session_contention_wait_reason"),
|
|
5853
5855
|
taskDoneRetryCount: integer("task_done_retry_count").default(0),
|
|
5854
5856
|
// FNXC:Lifecycle 2026-07-16-21:40: FN-8141 skip-bypass taint marker (nullable ISO timestamp).
|
|
5855
5857
|
bulkCompletionRefusalAt: text("bulk_completion_refusal_at"),
|
|
@@ -7772,6 +7774,12 @@ var chatSessions = projectSchema.table("chat_sessions", {
|
|
|
7772
7774
|
// FNXC:ChatPinned 2026-07-16-12:00: nullable timestamp persists the active
|
|
7773
7775
|
// Direct-session pin; the ChatStore enforces the per-scope max-three invariant.
|
|
7774
7776
|
pinnedAt: text("pinned_at"),
|
|
7777
|
+
// FNXC:MemoryFocus 2026-08-13-15:57: per-conversation read-time memory FOCUS/TOPIC
|
|
7778
|
+
// (migration 0059). NULL/empty ('' normalized to NULL) means the conversation
|
|
7779
|
+
// inherits the whole-project scope; otherwise it scopes fn_memory_search +
|
|
7780
|
+
// proactive recall to this topic. It is a read-time filter only — Stash capture
|
|
7781
|
+
// stays write-anywhere across every conversation.
|
|
7782
|
+
memoryFocus: text("memory_focus"),
|
|
7775
7783
|
cliSessionFile: text("cli_session_file"),
|
|
7776
7784
|
inFlightGeneration: jsonb("in_flight_generation"),
|
|
7777
7785
|
cliExecutorAdapterId: text("cli_executor_adapter_id")
|
|
@@ -8210,7 +8218,33 @@ var projectTableNames = [
|
|
|
8210
8218
|
land report the previous test's successor as the busy holder), and health compaction skipped them.
|
|
8211
8219
|
*/
|
|
8212
8220
|
"workspace_coordination_leases",
|
|
8213
|
-
"workspace_land_intents"
|
|
8221
|
+
"workspace_land_intents",
|
|
8222
|
+
/*
|
|
8223
|
+
FNXC:PgTableRegistry 2026-08-23-16:05:
|
|
8224
|
+
Second occurrence of the FN-9059 omission above, found by a leaking `current_plan_evidence` row:
|
|
8225
|
+
a task's plan-evidence version counter continued across tests (a fresh KB-002 started at v2), so
|
|
8226
|
+
`task-dependency-mutation.pg` asserted version 2 and read 3 in a whole-file run while passing in
|
|
8227
|
+
isolation. Every table declared with `projectSchema.table(...)` must be registered here — the
|
|
8228
|
+
harness reset and health compaction both drive off this list, and an unregistered table is simply
|
|
8229
|
+
never cleaned. `project-table-registry.test.ts` now fails when the two drift apart.
|
|
8230
|
+
*/
|
|
8231
|
+
"chat_session_tags",
|
|
8232
|
+
"chat_tags",
|
|
8233
|
+
"configuration_revisions",
|
|
8234
|
+
"current_plan_evidence",
|
|
8235
|
+
"mission_lineage_stops",
|
|
8236
|
+
"spec_drift_reports",
|
|
8237
|
+
"spec_locks",
|
|
8238
|
+
"symbol_locks",
|
|
8239
|
+
"task_lifecycle_consumer_cursors",
|
|
8240
|
+
"task_lifecycle_consumer_dead_letters",
|
|
8241
|
+
"task_lifecycle_consumer_receipts",
|
|
8242
|
+
"task_lifecycle_consumer_registrations",
|
|
8243
|
+
"task_lifecycle_event_seq",
|
|
8244
|
+
"task_lifecycle_events",
|
|
8245
|
+
"task_verification_requests",
|
|
8246
|
+
"unplanned_execution_blocks",
|
|
8247
|
+
"workflow_agent_capacity_leases"
|
|
8214
8248
|
];
|
|
8215
8249
|
|
|
8216
8250
|
// ../core/src/postgres/schema/central.ts
|
|
@@ -8981,6 +9015,7 @@ var DEFAULT_GLOBAL_SETTINGS = {
|
|
|
8981
9015
|
defaultProjectId: void 0,
|
|
8982
9016
|
setupComplete: void 0,
|
|
8983
9017
|
cliOnboardingCompletedAt: void 0,
|
|
9018
|
+
githubStarPromptDismissedAt: void 0,
|
|
8984
9019
|
favoriteProviders: void 0,
|
|
8985
9020
|
favoriteModels: void 0,
|
|
8986
9021
|
openrouterModelSync: true,
|
|
@@ -9010,7 +9045,10 @@ var DEFAULT_GLOBAL_SETTINGS = {
|
|
|
9010
9045
|
/* FNXC:UpdateAutomation 2026-08-21-02:48: Keep these schema keys unset because defaults merge into effective settings and `undefined` is distinct from explicit false. */
|
|
9011
9046
|
autoUpdateEnabled: void 0,
|
|
9012
9047
|
autoRestartAfterUpdate: void 0,
|
|
9013
|
-
|
|
9048
|
+
/*
|
|
9049
|
+
FNXC:VersionAutoReload 2026-08-23-04:03:
|
|
9050
|
+
Version-change reload is mandatory, so its key is retired. Older persisted values are ignored because GLOBAL_SETTINGS_KEYS derives from this object and rejects unknown keys before save patches.
|
|
9051
|
+
*/
|
|
9014
9052
|
githubTrackingDefaultRepo: void 0,
|
|
9015
9053
|
reportRoadmapDedupeEnabled: void 0,
|
|
9016
9054
|
reportRoadmapLabel: void 0,
|
|
@@ -9605,6 +9643,40 @@ var DEFAULT_PROJECT_SETTINGS = {
|
|
|
9605
9643
|
taskEvaluationRetention: void 0,
|
|
9606
9644
|
memoryEnabled: true,
|
|
9607
9645
|
memoryBackendType: "qmd",
|
|
9646
|
+
// FNXC:StashConfig 2026-08-13-16:35: (RUFU-068) Optional per-project Stash LCM
|
|
9647
|
+
// memory backend config. stashUrl points at the operator's Stash server
|
|
9648
|
+
// (default http://127.0.0.1:3457). stashApiKey is an override for hard
|
|
9649
|
+
// isolation (separate Stash instance/account); the PRIMARY API key lives in
|
|
9650
|
+
// the global secrets store ("stash-api-key") and is NEVER committed. Project
|
|
9651
|
+
// value wins over global. TencentDB's URL setting is intentionally NOT ported.
|
|
9652
|
+
stashUrl: "",
|
|
9653
|
+
stashApiKey: "",
|
|
9654
|
+
/*
|
|
9655
|
+
FNXC:Rufu126VectorSearch 2026-08-19-10:50:
|
|
9656
|
+
RUFU-126 (D3): opt-in vector (semantic) recall for the Stash memory backend.
|
|
9657
|
+
Default OFF — zero behavior change until the operator enables it (this is a
|
|
9658
|
+
prototype; rejected alternative was automatic capability detection, which
|
|
9659
|
+
would change default behavior and pay a per-process 404 round-trip against
|
|
9660
|
+
unpatched servers). When true, multi-word (≥2 tokens) recall queries try the
|
|
9661
|
+
Stash GET /api/v1/me/sessions/events/semantic-search endpoint first and fall
|
|
9662
|
+
back byte-identically to the RUFU-121 keyword path on any vector failure
|
|
9663
|
+
(see memory-backend-stash.ts search() + docs/research/stash-vector-search-evaluation.md
|
|
9664
|
+
for D1–D5). Schema-only, consistent with stashUrl/stashApiKey (no UI row).
|
|
9665
|
+
*/
|
|
9666
|
+
stashVectorSearch: false,
|
|
9667
|
+
/*
|
|
9668
|
+
FNXC:StashSessionCapture 2026-08-19-04:37:
|
|
9669
|
+
(RUFU-122) Task-terminal transcript upload defaults. All are inert unless
|
|
9670
|
+
memoryBackendType === "stash". executorSessionCaptureEnabled gates ONLY the
|
|
9671
|
+
transcript upload (the RUFU-068 terminal anchor event still fires when it is
|
|
9672
|
+
off) and defaults ON. executorSessionCaptureMaxEvents caps transcript events
|
|
9673
|
+
per task; the engine keeps the most recent N (default 20000).
|
|
9674
|
+
executorSessionCaptureIncludeStatus is the schema-only "keep a setting" for
|
|
9675
|
+
uploading `status` log entries (default off; no UI row).
|
|
9676
|
+
*/
|
|
9677
|
+
executorSessionCaptureEnabled: true,
|
|
9678
|
+
executorSessionCaptureMaxEvents: 2e4,
|
|
9679
|
+
executorSessionCaptureIncludeStatus: false,
|
|
9608
9680
|
memoryAutoSummarizeEnabled: false,
|
|
9609
9681
|
memoryAutoSummarizeThresholdChars: 5e4,
|
|
9610
9682
|
memoryAutoSummarizeSchedule: "0 3 * * *",
|
|
@@ -13941,10 +14013,59 @@ var DEFAULT_TRIAGE_PROMPT = BUILTIN_AGENT_PROMPTS.find((prompt) => prompt.id ===
|
|
|
13941
14013
|
var DEFAULT_TRIAGE_FAST_PROMPT = BUILTIN_AGENT_PROMPTS.find((prompt) => prompt.id === "default-triage-fast")?.prompt ?? "";
|
|
13942
14014
|
var DEFAULT_REVIEWER_PROMPT = BUILTIN_AGENT_PROMPTS.find((prompt) => prompt.role === "reviewer")?.prompt ?? "";
|
|
13943
14015
|
var DEFAULT_MERGER_PROMPT = BUILTIN_AGENT_PROMPTS.find((prompt) => prompt.role === "merger")?.prompt ?? "";
|
|
14016
|
+
var REVIEW_GATE_STEP_TEMPLATE_START = "### Step {N-1}: Testing & Verification";
|
|
14017
|
+
var REVIEW_GATE_STEP_TEMPLATE_END = "## Documentation Requirements";
|
|
14018
|
+
var REVIEW_GATED_STEP_CONTRACT = `## Review-gated step contract (OVERRIDES the step template above)
|
|
14019
|
+
|
|
14020
|
+
This workflow runs testing, verification, documentation, and delivery as REVIEW-COLUMN GATES after
|
|
14021
|
+
implementation. They are not task steps here.
|
|
14022
|
+
|
|
14023
|
+
- Do NOT emit a "Testing & Verification" step.
|
|
14024
|
+
- Do NOT emit a "Documentation & Delivery" step.
|
|
14025
|
+
- Emit implementation steps only, ending with the last implementation step.
|
|
14026
|
+
- Per-step verification bullets stay: each implementation step still runs its own targeted tests.
|
|
14027
|
+
|
|
14028
|
+
`;
|
|
14029
|
+
function applyReviewGatedStepContract(prompt) {
|
|
14030
|
+
const start = prompt.indexOf(REVIEW_GATE_STEP_TEMPLATE_START);
|
|
14031
|
+
const end = prompt.indexOf(REVIEW_GATE_STEP_TEMPLATE_END);
|
|
14032
|
+
if (start < 0 || end < 0 || end <= start) {
|
|
14033
|
+
return `${prompt}
|
|
14034
|
+
|
|
14035
|
+
${REVIEW_GATED_STEP_CONTRACT}`;
|
|
14036
|
+
}
|
|
14037
|
+
return `${prompt.slice(0, start)}${REVIEW_GATED_STEP_CONTRACT}${prompt.slice(end)}`;
|
|
14038
|
+
}
|
|
14039
|
+
var DOCUMENTATION_STEP_TEMPLATE_START = "### Step {N}: Documentation & Delivery";
|
|
14040
|
+
var DOCUMENTATION_STEP_TEMPLATE_END = "## Documentation Requirements";
|
|
14041
|
+
var NO_DOCUMENTATION_STEP_CONTRACT = `## Documentation is not a step (OVERRIDES the step template above)
|
|
14042
|
+
|
|
14043
|
+
Do NOT emit a "Documentation & Delivery" step. "Testing & Verification" is the LAST step.
|
|
14044
|
+
|
|
14045
|
+
- **Repository documentation is implementation work.** When a change makes an existing doc wrong,
|
|
14046
|
+
update that doc inside the step that made the change, so it is reviewed together with the code.
|
|
14047
|
+
Never plan it as its own step, and never gate completion on it when the change documents nothing.
|
|
14048
|
+
- **Fusion-side delivery is not yours to plan.** The card summary, the delivery note, artifact
|
|
14049
|
+
registration, and out-of-scope follow-up tasks are produced by a review-column milestone after the
|
|
14050
|
+
review passes. Do not emit steps or checklist items for any of them.
|
|
14051
|
+
|
|
14052
|
+
`;
|
|
14053
|
+
function stripDocumentationDeliveryStep(prompt) {
|
|
14054
|
+
const start = prompt.indexOf(DOCUMENTATION_STEP_TEMPLATE_START);
|
|
14055
|
+
const end = prompt.indexOf(DOCUMENTATION_STEP_TEMPLATE_END);
|
|
14056
|
+
if (start < 0 || end < 0 || end <= start) {
|
|
14057
|
+
return `${prompt}
|
|
14058
|
+
|
|
14059
|
+
${NO_DOCUMENTATION_STEP_CONTRACT}`;
|
|
14060
|
+
}
|
|
14061
|
+
return `${prompt.slice(0, start)}${NO_DOCUMENTATION_STEP_CONTRACT}${prompt.slice(end)}`;
|
|
14062
|
+
}
|
|
13944
14063
|
var BUILTIN_SEAM_PROMPTS = {
|
|
13945
14064
|
execute: DEFAULT_EXECUTOR_PROMPT,
|
|
13946
14065
|
planning: DEFAULT_TRIAGE_PROMPT,
|
|
13947
14066
|
"planning-fast": DEFAULT_TRIAGE_FAST_PROMPT,
|
|
14067
|
+
/* Review-gated tasks keep test and delivery work in review-column gates. */
|
|
14068
|
+
"planning-implementation-only": applyReviewGatedStepContract(DEFAULT_TRIAGE_PROMPT),
|
|
13948
14069
|
"step-execute": DEFAULT_EXECUTOR_PROMPT,
|
|
13949
14070
|
review: DEFAULT_REVIEWER_PROMPT,
|
|
13950
14071
|
merge: DEFAULT_MERGER_PROMPT
|
|
@@ -14212,6 +14333,7 @@ function postMergeVerificationOptionalGroupNode(column = "done") {
|
|
|
14212
14333
|
}
|
|
14213
14334
|
|
|
14214
14335
|
// ../core/src/workflows/builtin-plan-review-group.ts
|
|
14336
|
+
var IMPLEMENTATION_ONLY_STEPS_CRITERION = "\n\n## Review-gated implementation steps\nREVISE when the proposed task-step list includes testing, verification, documentation, or delivery work. Those are review-column gates in this workflow, not implementation steps.";
|
|
14215
14337
|
var PLAN_REVIEW_GROUP_ID = "plan-review";
|
|
14216
14338
|
var PLAN_REVIEW_STEP_NODE_ID = "plan-review-step";
|
|
14217
14339
|
var PLAN_REVIEW_NAME = "Plan Review";
|
|
@@ -14253,6 +14375,10 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
14253
14375
|
toolMode: "readonly",
|
|
14254
14376
|
gateMode: "gate"
|
|
14255
14377
|
};
|
|
14378
|
+
if (options.requireImplementationOnlySteps === true) {
|
|
14379
|
+
promptConfig.prompt = `${PLAN_REVIEW_PROMPT}${IMPLEMENTATION_ONLY_STEPS_CRITERION}`;
|
|
14380
|
+
promptConfig.requireImplementationOnlySteps = true;
|
|
14381
|
+
}
|
|
14256
14382
|
if (options.requireExternalIntegrationEvidence === true) {
|
|
14257
14383
|
promptConfig.requireExternalIntegrationEvidence = true;
|
|
14258
14384
|
}
|
|
@@ -14293,6 +14419,7 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
14293
14419
|
var PLAN_REPLAN_NODE_ID = "plan-replan";
|
|
14294
14420
|
var BROWSER_VERIFICATION_REMEDIATION_NODE_ID = "browser-verification-remediation";
|
|
14295
14421
|
var CODE_REVIEW_REMEDIATION_NODE_ID = "code-review-remediation";
|
|
14422
|
+
var REVIEW_GATED_CODE_REVIEW_REMEDIATION_NODE_ID = "code-review-remediation-steps";
|
|
14296
14423
|
function planReplanNode(column = "triage") {
|
|
14297
14424
|
return {
|
|
14298
14425
|
id: PLAN_REPLAN_NODE_ID,
|
|
@@ -14319,6 +14446,14 @@ function browserVerificationRemediationNode(column = "in-progress") {
|
|
|
14319
14446
|
}
|
|
14320
14447
|
};
|
|
14321
14448
|
}
|
|
14449
|
+
function codeReviewRemediationStepsNode(column = "in-progress") {
|
|
14450
|
+
return {
|
|
14451
|
+
id: REVIEW_GATED_CODE_REVIEW_REMEDIATION_NODE_ID,
|
|
14452
|
+
kind: "prompt",
|
|
14453
|
+
column,
|
|
14454
|
+
config: { name: "Code review remediation", workflowAction: "review-remediation-steps", forWorkflowStepId: "code-review", toolMode: "readonly" }
|
|
14455
|
+
};
|
|
14456
|
+
}
|
|
14322
14457
|
function codeReviewRemediationNode(column = "in-progress") {
|
|
14323
14458
|
return {
|
|
14324
14459
|
id: CODE_REVIEW_REMEDIATION_NODE_ID,
|
|
@@ -14967,6 +15102,147 @@ var RAW_BUILTIN_CODING_IDEAS_WORKFLOW_IR = (() => {
|
|
|
14967
15102
|
})();
|
|
14968
15103
|
var BUILTIN_CODING_IDEAS_WORKFLOW_IR = parseWorkflowIr(RAW_BUILTIN_CODING_IDEAS_WORKFLOW_IR);
|
|
14969
15104
|
|
|
15105
|
+
// ../core/src/workflows/builtin-documentation-delivery-group.ts
|
|
15106
|
+
var DOCUMENTATION_DELIVERY_GROUP_ID = "documentation-delivery";
|
|
15107
|
+
var DOCUMENTATION_DELIVERY_PROMPT = `Report on the accepted implementation exactly once, for the operator who reads this card later.
|
|
15108
|
+
|
|
15109
|
+
You have NO writer. This session can read, search and list \u2014 nothing else. Everything durable you
|
|
15110
|
+
produce is the text you output here. Do not call a tool to save it, do not claim you saved anything,
|
|
15111
|
+
and do not modify repository files: the code has already been reviewed and must not change now.
|
|
15112
|
+
|
|
15113
|
+
## 1. The card summary (always)
|
|
15114
|
+
|
|
15115
|
+
Open with 2-4 sentences of plain prose an operator can read to know what shipped and why. Mention
|
|
15116
|
+
user-visible behaviour or important files when they matter, and how it was verified. No headings, no
|
|
15117
|
+
bullet lists, no process narration, no verdict. This text becomes the task's summary.
|
|
15118
|
+
|
|
15119
|
+
## 2. Follow-up proposals (only when they genuinely exist)
|
|
15120
|
+
|
|
15121
|
+
If the work surfaced worthwhile follow-up ideas OUTSIDE this task's scope, end your output with one
|
|
15122
|
+
fenced JSON block, and nothing after it:
|
|
15123
|
+
|
|
15124
|
+
\`\`\`json
|
|
15125
|
+
{"recommendations":[{"id":"stable-slug","title":"short title","description":"what to do and why","category":"improvement"}]}
|
|
15126
|
+
\`\`\`
|
|
15127
|
+
|
|
15128
|
+
- \`category\` is one of: improvement, feature, bug, other.
|
|
15129
|
+
- Each \`id\` must be unique and stable.
|
|
15130
|
+
- These are PROPOSALS for a human, not work orders and not tasks: an operator decides which become
|
|
15131
|
+
tasks. You cannot create tasks and must not try.
|
|
15132
|
+
- Ground every entry in something you actually saw. Omit the block entirely rather than invent work,
|
|
15133
|
+
restate this task, or pad the list. Fewer, real proposals are the correct answer.
|
|
15134
|
+
- Never put commands, shell syntax, credentials or secrets in a proposal.
|
|
15135
|
+
|
|
15136
|
+
You cannot block this card and you have no verdict to give. If something is missing or you could not
|
|
15137
|
+
determine it, say so plainly in the summary and finish.`;
|
|
15138
|
+
function documentationDeliveryOptionalGroupNode(column) {
|
|
15139
|
+
return {
|
|
15140
|
+
id: DOCUMENTATION_DELIVERY_GROUP_ID,
|
|
15141
|
+
kind: "optional-group",
|
|
15142
|
+
column,
|
|
15143
|
+
config: {
|
|
15144
|
+
name: "Documentation",
|
|
15145
|
+
defaultOn: true,
|
|
15146
|
+
/*
|
|
15147
|
+
FNXC:ReportingOnlyGroup 2026-08-26-06:56:
|
|
15148
|
+
Documentation ONLY documents. `gateMode: "advisory"` on the inner node was not enough and the
|
|
15149
|
+
gap was measured on a real card: its REVISE recorded `advisory_failure`, which held the merge
|
|
15150
|
+
door ("no current approval") AND bounced the card to implementation with no work to do, where
|
|
15151
|
+
it re-ran Code Review against an unchanged tree and merged on the second pass by luck.
|
|
15152
|
+
`reportingOnly` states the contract once: no approval to withhold, no remediation to request.
|
|
15153
|
+
*/
|
|
15154
|
+
reportingOnly: true,
|
|
15155
|
+
template: {
|
|
15156
|
+
nodes: [{
|
|
15157
|
+
id: "documentation-delivery-step",
|
|
15158
|
+
kind: "prompt",
|
|
15159
|
+
config: {
|
|
15160
|
+
name: "Documentation",
|
|
15161
|
+
prompt: DOCUMENTATION_DELIVERY_PROMPT,
|
|
15162
|
+
toolMode: "readonly",
|
|
15163
|
+
gateMode: "advisory",
|
|
15164
|
+
workflowAction: "documentation-delivery",
|
|
15165
|
+
/* The two projection contracts that give a writer-less node durable output. */
|
|
15166
|
+
summaryTarget: "task",
|
|
15167
|
+
recommendationsTarget: "task"
|
|
15168
|
+
}
|
|
15169
|
+
}],
|
|
15170
|
+
edges: []
|
|
15171
|
+
}
|
|
15172
|
+
}
|
|
15173
|
+
};
|
|
15174
|
+
}
|
|
15175
|
+
|
|
15176
|
+
// ../core/src/workflows/builtin-coding-ideas-v2-workflow-ir.ts
|
|
15177
|
+
var clone = (ir) => JSON.parse(JSON.stringify(ir));
|
|
15178
|
+
var RAW_BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR = (() => {
|
|
15179
|
+
const ir = clone(BUILTIN_CODING_IDEAS_WORKFLOW_IR);
|
|
15180
|
+
ir.name = "builtin-coding-ideas-v2";
|
|
15181
|
+
const plan = ir.nodes.find((node) => node.id === "plan");
|
|
15182
|
+
if (!plan?.config) throw new Error("coding-ideas-v2 requires the inherited planning node");
|
|
15183
|
+
plan.config.prompt = stripDocumentationDeliveryStep(String(plan.config.prompt ?? ""));
|
|
15184
|
+
const parse = ir.nodes.find((node) => node.id === "parse");
|
|
15185
|
+
if (parse) parse.config = { ...parse.config, implementationOnlySteps: true, preserveRemediationSteps: true };
|
|
15186
|
+
const codeReviewRemediation = ir.nodes.find((node) => node.id === "code-review-remediation");
|
|
15187
|
+
if (codeReviewRemediation) {
|
|
15188
|
+
codeReviewRemediation.config = {
|
|
15189
|
+
...codeReviewRemediation.config,
|
|
15190
|
+
...codeReviewRemediationStepsNode().config,
|
|
15191
|
+
name: "Code Review Remediation"
|
|
15192
|
+
};
|
|
15193
|
+
}
|
|
15194
|
+
const codeReviewIndex = ir.nodes.findIndex((node) => node.id === "code-review");
|
|
15195
|
+
if (codeReviewIndex < 0) throw new Error("coding-ideas-v2 requires the inherited code-review gate");
|
|
15196
|
+
const codeReviewStep = ir.nodes[codeReviewIndex]?.config?.template?.nodes?.find((node) => node.id === "code-review-step");
|
|
15197
|
+
if (!codeReviewStep?.config) throw new Error("coding-ideas-v2 requires the inherited code-review-step template node");
|
|
15198
|
+
codeReviewStep.config.prompt = `${String(codeReviewStep.config.prompt ?? "")}
|
|
15199
|
+
|
|
15200
|
+
## Step 0: Judge the TESTS before you judge the code
|
|
15201
|
+
|
|
15202
|
+
You cannot run anything: this session is read-only, \`bash\` is denied and no verification tool is
|
|
15203
|
+
available to you. Do not claim you ran lint, tests or a build, and do not ask for a command to be
|
|
15204
|
+
run. The executor already wrote and ran the tests; your job is to rule on whether that work is
|
|
15205
|
+
sound.
|
|
15206
|
+
|
|
15207
|
+
Read the test files in the diff and rule on FOUR things:
|
|
15208
|
+
|
|
15209
|
+
1. **They exist.** A behavioural change with no test is a REVISE. Say which change is uncovered.
|
|
15210
|
+
2. **They are real tests.** Assertions executed by a test runner. A typecheck is not a test, a build
|
|
15211
|
+
is not a test, and manual verification is not a test.
|
|
15212
|
+
3. **They assert BEHAVIOUR.** Never a comment, a date stamp, or prose lifted from source. Asserting
|
|
15213
|
+
that a comment exists tests nothing a user or caller can observe. Code-construct guards
|
|
15214
|
+
(call-site allowlists, architectural ratchets) are legitimate and stay.
|
|
15215
|
+
4. **They cover the INVARIANT, not just the reported case.** For a bug fix, a test that only
|
|
15216
|
+
reproduces the single reported symptom is incomplete: require every known surface. If this task
|
|
15217
|
+
CHANGED, GATED or REMOVED behaviour, the tests that encoded the OLD behaviour must have been
|
|
15218
|
+
updated or deleted in the same change \u2014 they live outside the File Scope and targeted
|
|
15219
|
+
verification will not have surfaced them.
|
|
15220
|
+
|
|
15221
|
+
Then review the code itself for what tests do not catch: logic errors, broken edge cases, and
|
|
15222
|
+
unhandled failure modes.`;
|
|
15223
|
+
ir.nodes.splice(codeReviewIndex + 1, 0, documentationDeliveryOptionalGroupNode("in-review"));
|
|
15224
|
+
const summaryIndex = ir.nodes.findIndex((node) => node.id === "completion-summary");
|
|
15225
|
+
if (summaryIndex >= 0) ir.nodes.splice(summaryIndex, 1);
|
|
15226
|
+
ir.edges = ir.edges.filter((edge) => edge.from !== "completion-summary" && edge.to !== "completion-summary");
|
|
15227
|
+
ir.edges = ir.edges.filter((edge) => !(edge.from === "code-review" && edge.to === "merge-gate"));
|
|
15228
|
+
ir.edges.push(
|
|
15229
|
+
{ from: "steps", to: "code-review", condition: "success" },
|
|
15230
|
+
{ from: "code-review", to: "documentation-delivery", condition: "success" },
|
|
15231
|
+
{ from: "documentation-delivery", to: "merge-gate", condition: "success" },
|
|
15232
|
+
/*
|
|
15233
|
+
FNXC:CodingIdeasV2Workflow 2026-08-25-10:20:
|
|
15234
|
+
Documentation is ADVISORY: it reports, it never vetoes. Its failure edge reaches the merge gate
|
|
15235
|
+
exactly like its success edge, so a delivery note that could not be written cannot strand a
|
|
15236
|
+
card whose code is already approved. Measured why: as a blocking gate it bounced a task whose
|
|
15237
|
+
own plan said not to implement anything ("No task-specific implementation is present"), and the
|
|
15238
|
+
card looped through the review lane every five minutes indefinitely.
|
|
15239
|
+
*/
|
|
15240
|
+
{ from: "documentation-delivery", to: "merge-gate", condition: "failure" }
|
|
15241
|
+
);
|
|
15242
|
+
return ir;
|
|
15243
|
+
})();
|
|
15244
|
+
var BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR = parseWorkflowIr(RAW_BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR);
|
|
15245
|
+
|
|
14970
15246
|
// ../core/src/workflows/builtin-brainstorming-workflow-ir.ts
|
|
14971
15247
|
var APPROVAL_PHRASE = "looks good";
|
|
14972
15248
|
var RAW_BUILTIN_BRAINSTORMING_WORKFLOW_IR = (() => {
|
|
@@ -15722,6 +15998,47 @@ var BUILTIN_WORKFLOWS = [
|
|
|
15722
15998
|
createdAt: BUILTIN_TS,
|
|
15723
15999
|
updatedAt: BUILTIN_TS
|
|
15724
16000
|
},
|
|
16001
|
+
/*
|
|
16002
|
+
* FNXC:CodingIdeasV2Workflow 2026-08-26-05:56:
|
|
16003
|
+
* Same Ideas board as builtin:coding-ideas, with one rule: in-review NEVER writes code.
|
|
16004
|
+
* Implementation and its tests finish in `in-progress` — the executor's own final verification
|
|
16005
|
+
* runs the project's configured test/build commands there, and a red result appends named fix
|
|
16006
|
+
* steps rather than letting the card advance. `in-review` is then three read-only milestones:
|
|
16007
|
+
* Code Review judges, Documentation reports, and the merge is the last thing that happens.
|
|
16008
|
+
* The layout is ordered left-to-right in that same sequence so the editor's diagram reads the way
|
|
16009
|
+
* the graph runs; nodes deleted from the graph must be deleted from this map too, or the editor
|
|
16010
|
+
* keeps positioning ghosts.
|
|
16011
|
+
*/
|
|
16012
|
+
{
|
|
16013
|
+
id: "builtin:coding-ideas-v2",
|
|
16014
|
+
name: "Coding (Ideas) V2",
|
|
16015
|
+
description: "Capture-first coding pipeline with a read-only review lane: park ideas in a manual intake, plan, implement and test per step, then review, document, and merge.",
|
|
16016
|
+
kind: "workflow",
|
|
16017
|
+
ir: BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR,
|
|
16018
|
+
layout: {
|
|
16019
|
+
start: { x: 60, y: 160 },
|
|
16020
|
+
plan: { x: 230, y: 160 },
|
|
16021
|
+
"plan-review": { x: 400, y: 160 },
|
|
16022
|
+
"plan-replan": { x: 400, y: 320 },
|
|
16023
|
+
"plan-review-no-op": { x: 570, y: 320 },
|
|
16024
|
+
parse: { x: 570, y: 160 },
|
|
16025
|
+
steps: { x: 740, y: 160 },
|
|
16026
|
+
"review-pending-handoff": { x: 740, y: 320 },
|
|
16027
|
+
"code-review": { x: 910, y: 160 },
|
|
16028
|
+
"code-review-remediation": { x: 910, y: 320 },
|
|
16029
|
+
"documentation-delivery": { x: 1080, y: 160 },
|
|
16030
|
+
"merge-gate": { x: 1250, y: 160 },
|
|
16031
|
+
"branch-group-member-integration": { x: 1420, y: 80 },
|
|
16032
|
+
"branch-group-promotion": { x: 1590, y: 80 },
|
|
16033
|
+
"merge-manual-hold": { x: 1420, y: 240 },
|
|
16034
|
+
"merge-attempt": { x: 1760, y: 160 },
|
|
16035
|
+
"merge-retry": { x: 1930, y: 80 },
|
|
16036
|
+
"recovery-router": { x: 1930, y: 240 },
|
|
16037
|
+
end: { x: 2100, y: 160 }
|
|
16038
|
+
},
|
|
16039
|
+
createdAt: BUILTIN_TS,
|
|
16040
|
+
updatedAt: BUILTIN_TS
|
|
16041
|
+
},
|
|
15725
16042
|
{
|
|
15726
16043
|
id: "builtin:legacy-coding",
|
|
15727
16044
|
name: "Legacy coding",
|