@runfusion/fusion 0.77.0-beta.7 → 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 +9130 -4814
- package/dist/child-process-worker.js +9665 -6048
- package/dist/client/.vite/manifest.json +260 -260
- package/dist/client/assets/{AgentDetailView-C1eh_vXv.js → AgentDetailView-DLzgMG5W.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-CeKsO1LR.js → AgentPermissionPolicyEditor-CHoQs5wt.js} +1 -1
- package/dist/client/assets/{AgentsView-BNe2ABOc.js → AgentsView-LDH9ih8-.js} +3 -3
- package/dist/client/assets/{CommandCenter-BuREM-G1.js → CommandCenter-DQ2Wjfo6.js} +1 -1
- package/dist/client/assets/{DevServerView-D0i1b-QO.js → DevServerView-NunavHb5.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-VOx91hQt.js → DirectoryPicker-FymMYoLf.js} +1 -1
- package/dist/client/assets/{DocumentsView-CO5W_WVb.js → DocumentsView-By9SHDrK.js} +1 -1
- package/dist/client/assets/{EvalsView-BqSINSrZ.js → EvalsView-KHDm_jIP.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-DEcFgONi.js → ExperimentalAgentOnboardingModal-CXZXL44D.js} +1 -1
- package/dist/client/assets/{GoalsView-DZ57wXmJ.js → GoalsView-CXJQllGu.js} +1 -1
- package/dist/client/assets/{InsightsView-DSWfXG7Q.js → InsightsView-PSlbun5-.js} +1 -1
- package/dist/client/assets/{MemoryView-BEX10uhl.js → MemoryView-Bj31SvJV.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-DcAmXXoR.js → PiExtensionsManager-CbEnWrEb.js} +1 -1
- package/dist/client/assets/{PluginManager-BU0omQUv.js → PluginManager-Ncr6jySY.js} +1 -1
- package/dist/client/assets/{PullRequestView-B-JL_8Kk.js → PullRequestView-3cR6DptH.js} +1 -1
- package/dist/client/assets/ReportModal-0cDRUWOi.js +21 -0
- package/dist/client/assets/ReportModal-Dx3f2aj7.css +1 -0
- package/dist/client/assets/{ResearchView-CnwTXfQO.js → ResearchView-rnrVF79-.js} +1 -1
- package/dist/client/assets/{SecretsView-BDvzsLFz.js → SecretsView-kF17RkhO.js} +1 -1
- package/dist/client/assets/{SettingsModal-BZHeQ3ED.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-B0rTuelr.js → SettingsTextareaRow-BmxrECAt.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-CoExPwIn.js → SetupWizardModal-Dlgtw7CJ.js} +2 -2
- package/dist/client/assets/{SkillsView-WVP25LPj.js → SkillsView-D6BmZdru.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-pCMyKcnS.js → WorkflowNodeEditor-CVHHMqvn.js} +1 -1
- package/dist/client/assets/{agent-import-generation-M_hKtjgN.js → agent-import-generation-CnrRwmdq.js} +1 -1
- package/dist/client/assets/{agentsOrgChartLayout-DjvIMhFD.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-CkzEm8i9.js → architectureDiagram-3BPJPVTR-D_oUETkg.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-Dc-dUMjY.js → blockDiagram-GPEHLZMM-SeVvCFBr.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-DnYjsrR0.js → c4Diagram-AAUBKEIU-C-bOAkwQ.js} +1 -1
- package/dist/client/assets/channel-CxElf6wV.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-0E1GEFEr.js → chunk-2J33WTMH-Dfy3ok0u.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-Dj5oZd51.js → chunk-4BX2VUAB-CJhw204d.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-DfNT0s8E.js → chunk-55IACEB6-Sgt6UphC.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-BnFjhiIQ.js → chunk-727SXJPM-BvQJpRvs.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-DR84wSqR.js → chunk-AQP2D5EJ-Cthfrcwy.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-IjByNOrR.js → chunk-FMBD7UC4-Cz3x993o.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-By0q_jZm.js → chunk-ND2GUHAM-PNcjW0Zw.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-BELcl3N5.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-D4cCw9-_.js → cose-bilkent-S5V4N54A-Ceay49Yk.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-JJp5dVeY.js → dagre-BM42HDAG-D9VGvuIj.js} +1 -1
- package/dist/client/assets/{dashboard-view-6zPJm9zC.js → dashboard-view-BBWCZOq1.js} +1 -1
- package/dist/client/assets/{dashboard-view-MAC_LHDX.js → dashboard-view-RQ4TPddv.js} +1 -1
- package/dist/client/assets/{dashboard-view-C5Nt8cvY.js → dashboard-view-ZGUl38Cw.js} +1 -1
- package/dist/client/assets/{dashboard-view-Bl9CPhxE.js → dashboard-view-gpkvNzBo.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-D4L7j_t_.js → diagram-2AECGRRQ-Q5XXKnnv.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-VAGFaXqG.js → diagram-5GNKFQAL-ByGKtZN7.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-hqXSggfW.js → diagram-KO2AKTUF-B5wCSTUz.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-B3eAIuy8.js → diagram-LMA3HP47-C4eGtq1N.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-BGufp0RK.js → diagram-OG6HWLK6-BxTb4tZr.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-DplXdx8w.js → erDiagram-TEJ5UH35-CWt1TSp9.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-C1Ms2bko.js → flowDiagram-I6XJVG4X-DUAfL604.js} +1 -1
- package/dist/client/assets/{folder-open-nMraSDXu.js → folder-open-CihApyzT.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-DVgxMtXb.js → ganttDiagram-6RSMTGT7-DBS31zRY.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DH2_n0J8.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-DmZdWVcU.js → infoDiagram-5YYISTIA-oeqISHuE.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DsEIHSXr.js → ishikawaDiagram-YF4QCWOH-De7HSTs3.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-CsfIWmu1.js → journeyDiagram-JHISSGLW-CnOQgak6.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-CQKqeZvc.js → kanban-definition-UN3LZRKU-DkkSXQc1.js} +1 -1
- package/dist/client/assets/{mermaid.core-DkC_dr4-.js → mermaid.core-DPtpszZ3.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-RnmE-NUe.js → mindmap-definition-RKZ34NQL-CTVye-HX.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-DPu6FPc4.js → pieDiagram-4H26LBE5-Dls6obgy.js} +1 -1
- package/dist/client/assets/{puzzle-DwhHOf32.js → puzzle-o6sQbTzB.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CYbypO2p.js → quadrantDiagram-W4KKPZXB-BPHggPTG.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DFk1vK_N.js → requirementDiagram-4Y6WPE33-Cdtv6VSz.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-CkUY1Zzu.js → sankeyDiagram-5OEKKPKP-CgQ4VG36.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-CFivaLOO.js → sequenceDiagram-3UESZ5HK-DllpS820.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-BbqKGAC1.js → standing-instructions-template-BpjTC7lE.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-BPeD5PwG.js → stateDiagram-AJRCARHV-BjDL2xGC.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-DduiCPMb.js → stateDiagram-v2-BHNVJYJU-CvKLFCGR.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-CGUNNVro.js → timeline-definition-PNZ67QCA-BHlmiUIC.js} +1 -1
- package/dist/client/assets/{upload-BS96H1o7.js → upload-Bn7DjmMR.js} +1 -1
- package/dist/client/assets/{users--irrWoyU.js → users-CAwUf5mJ.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CybTaJJH.js → vennDiagram-CIIHVFJN-_pYBvG2q.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-DSxaSCGi.js → wardley-L42UT6IY-Cnu65RLv.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-YFb0AxNt.js → wardleyDiagram-YWT4CUSO-DQC_N8jk.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-Cv6zlMJC.js → xychartDiagram-2RQKCTM6-CMaINq7s.js} +1 -1
- package/dist/client/index.html +13 -6
- package/dist/client/theme-data.css +85 -0
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +8370 -4577
- 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 +58 -4
- package/dist/plugin-sdk/index.js +361 -20
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +379 -38
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +374 -33
- package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +374 -33
- package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +374 -33
- package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-quality/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-quality/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-todos/bundled.js +361 -20
- package/dist/plugins/fusion-plugin-todos/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +464 -6486
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/dist/client/assets/ReportModal-DxggF_RH.js +0 -21
- package/dist/client/assets/ReportModal-lzN_xrnM.css +0 -1
- package/dist/client/assets/SettingsModal-801eFQ9u.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-CxQ40s_U.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-C2ARdiRL.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C2ARdiRL.js +0 -1
- package/dist/client/assets/index-BJc-A7eB.css +0 -1
- package/dist/client/assets/index-CBFPgFTp.js +0 -2787
|
@@ -5849,6 +5849,8 @@ var tasks = projectSchema.table("tasks", {
|
|
|
5849
5849
|
executeRequeueLoopCount: integer("execute_requeue_loop_count").default(0),
|
|
5850
5850
|
executeRequeueLoopSignature: text("execute_requeue_loop_signature"),
|
|
5851
5851
|
recoveryRetryCount: integer("recovery_retry_count"),
|
|
5852
|
+
sessionContentionHoldCount: integer("session_contention_hold_count").default(0),
|
|
5853
|
+
sessionContentionWaitReason: text("session_contention_wait_reason"),
|
|
5852
5854
|
taskDoneRetryCount: integer("task_done_retry_count").default(0),
|
|
5853
5855
|
// FNXC:Lifecycle 2026-07-16-21:40: FN-8141 skip-bypass taint marker (nullable ISO timestamp).
|
|
5854
5856
|
bulkCompletionRefusalAt: text("bulk_completion_refusal_at"),
|
|
@@ -7771,6 +7773,12 @@ var chatSessions = projectSchema.table("chat_sessions", {
|
|
|
7771
7773
|
// FNXC:ChatPinned 2026-07-16-12:00: nullable timestamp persists the active
|
|
7772
7774
|
// Direct-session pin; the ChatStore enforces the per-scope max-three invariant.
|
|
7773
7775
|
pinnedAt: text("pinned_at"),
|
|
7776
|
+
// FNXC:MemoryFocus 2026-08-13-15:57: per-conversation read-time memory FOCUS/TOPIC
|
|
7777
|
+
// (migration 0059). NULL/empty ('' normalized to NULL) means the conversation
|
|
7778
|
+
// inherits the whole-project scope; otherwise it scopes fn_memory_search +
|
|
7779
|
+
// proactive recall to this topic. It is a read-time filter only — Stash capture
|
|
7780
|
+
// stays write-anywhere across every conversation.
|
|
7781
|
+
memoryFocus: text("memory_focus"),
|
|
7774
7782
|
cliSessionFile: text("cli_session_file"),
|
|
7775
7783
|
inFlightGeneration: jsonb("in_flight_generation"),
|
|
7776
7784
|
cliExecutorAdapterId: text("cli_executor_adapter_id")
|
|
@@ -8200,7 +8208,42 @@ var projectTableNames = [
|
|
|
8200
8208
|
"chat_rooms",
|
|
8201
8209
|
"chat_room_members",
|
|
8202
8210
|
"chat_room_messages",
|
|
8203
|
-
"chat_token_usage"
|
|
8211
|
+
"chat_token_usage",
|
|
8212
|
+
/*
|
|
8213
|
+
FNXC:WorkspaceCoordination 2026-08-23-20:05:
|
|
8214
|
+
FN-9059 (migration 0060) added these two tables to the schema without registering them here, so
|
|
8215
|
+
every registry consumer under-counted them: the PostgreSQL test harness never TRUNCATEd them
|
|
8216
|
+
between tests (a held `repo:<repo>` lease leaked from one case into the next and made the next
|
|
8217
|
+
land report the previous test's successor as the busy holder), and health compaction skipped them.
|
|
8218
|
+
*/
|
|
8219
|
+
"workspace_coordination_leases",
|
|
8220
|
+
"workspace_land_intents",
|
|
8221
|
+
/*
|
|
8222
|
+
FNXC:PgTableRegistry 2026-08-23-16:05:
|
|
8223
|
+
Second occurrence of the FN-9059 omission above, found by a leaking `current_plan_evidence` row:
|
|
8224
|
+
a task's plan-evidence version counter continued across tests (a fresh KB-002 started at v2), so
|
|
8225
|
+
`task-dependency-mutation.pg` asserted version 2 and read 3 in a whole-file run while passing in
|
|
8226
|
+
isolation. Every table declared with `projectSchema.table(...)` must be registered here — the
|
|
8227
|
+
harness reset and health compaction both drive off this list, and an unregistered table is simply
|
|
8228
|
+
never cleaned. `project-table-registry.test.ts` now fails when the two drift apart.
|
|
8229
|
+
*/
|
|
8230
|
+
"chat_session_tags",
|
|
8231
|
+
"chat_tags",
|
|
8232
|
+
"configuration_revisions",
|
|
8233
|
+
"current_plan_evidence",
|
|
8234
|
+
"mission_lineage_stops",
|
|
8235
|
+
"spec_drift_reports",
|
|
8236
|
+
"spec_locks",
|
|
8237
|
+
"symbol_locks",
|
|
8238
|
+
"task_lifecycle_consumer_cursors",
|
|
8239
|
+
"task_lifecycle_consumer_dead_letters",
|
|
8240
|
+
"task_lifecycle_consumer_receipts",
|
|
8241
|
+
"task_lifecycle_consumer_registrations",
|
|
8242
|
+
"task_lifecycle_event_seq",
|
|
8243
|
+
"task_lifecycle_events",
|
|
8244
|
+
"task_verification_requests",
|
|
8245
|
+
"unplanned_execution_blocks",
|
|
8246
|
+
"workflow_agent_capacity_leases"
|
|
8204
8247
|
];
|
|
8205
8248
|
|
|
8206
8249
|
// ../core/src/postgres/schema/central.ts
|
|
@@ -8971,6 +9014,7 @@ var DEFAULT_GLOBAL_SETTINGS = {
|
|
|
8971
9014
|
defaultProjectId: void 0,
|
|
8972
9015
|
setupComplete: void 0,
|
|
8973
9016
|
cliOnboardingCompletedAt: void 0,
|
|
9017
|
+
githubStarPromptDismissedAt: void 0,
|
|
8974
9018
|
favoriteProviders: void 0,
|
|
8975
9019
|
favoriteModels: void 0,
|
|
8976
9020
|
openrouterModelSync: true,
|
|
@@ -9000,7 +9044,10 @@ var DEFAULT_GLOBAL_SETTINGS = {
|
|
|
9000
9044
|
/* 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. */
|
|
9001
9045
|
autoUpdateEnabled: void 0,
|
|
9002
9046
|
autoRestartAfterUpdate: void 0,
|
|
9003
|
-
|
|
9047
|
+
/*
|
|
9048
|
+
FNXC:VersionAutoReload 2026-08-23-04:03:
|
|
9049
|
+
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.
|
|
9050
|
+
*/
|
|
9004
9051
|
githubTrackingDefaultRepo: void 0,
|
|
9005
9052
|
reportRoadmapDedupeEnabled: void 0,
|
|
9006
9053
|
reportRoadmapLabel: void 0,
|
|
@@ -9393,12 +9440,16 @@ var DEFAULT_PROJECT_SETTINGS = {
|
|
|
9393
9440
|
executorEscalationProvider: void 0,
|
|
9394
9441
|
executorEscalationModelId: void 0,
|
|
9395
9442
|
executorEscalationNodeId: void 0,
|
|
9396
|
-
|
|
9397
|
-
|
|
9398
|
-
|
|
9399
|
-
|
|
9400
|
-
|
|
9401
|
-
|
|
9443
|
+
/*
|
|
9444
|
+
FNXC:ReviewConvergence 2026-08-23-21:05:
|
|
9445
|
+
FN-149's six review-convergence/arbitration keys are declared in BUILTIN_WORKFLOW_SETTINGS, which
|
|
9446
|
+
the U4 hard-move made the SINGLE source of truth for a moved key's default. Re-declaring them here
|
|
9447
|
+
put them back in the legacy object the hard-move emptied, so an undeclared key on a custom workflow
|
|
9448
|
+
could resolve to this literal instead of the declaration default — the exact drift
|
|
9449
|
+
`workflow-settings-fallback-alignment` guards. The declaration defaults are identical (both
|
|
9450
|
+
`*Enabled` default true, the provider/model lanes carry no default), and the reader uses
|
|
9451
|
+
`!== false`, so removing them here preserves behaviour and restores the invariant.
|
|
9452
|
+
*/
|
|
9402
9453
|
/**
|
|
9403
9454
|
* FNXC:Merge 2026-06-26-00:00:
|
|
9404
9455
|
* New and unconfigured projects default AI merge to sync a dirty checked-out integration branch, restoring the legacy stash → fast-forward → restore landing behavior. Explicit persisted merger.allowDirtyLocalCheckoutSync values still win, and no existing-project migration stamps this default into storage.
|
|
@@ -9591,6 +9642,40 @@ var DEFAULT_PROJECT_SETTINGS = {
|
|
|
9591
9642
|
taskEvaluationRetention: void 0,
|
|
9592
9643
|
memoryEnabled: true,
|
|
9593
9644
|
memoryBackendType: "qmd",
|
|
9645
|
+
// FNXC:StashConfig 2026-08-13-16:35: (RUFU-068) Optional per-project Stash LCM
|
|
9646
|
+
// memory backend config. stashUrl points at the operator's Stash server
|
|
9647
|
+
// (default http://127.0.0.1:3457). stashApiKey is an override for hard
|
|
9648
|
+
// isolation (separate Stash instance/account); the PRIMARY API key lives in
|
|
9649
|
+
// the global secrets store ("stash-api-key") and is NEVER committed. Project
|
|
9650
|
+
// value wins over global. TencentDB's URL setting is intentionally NOT ported.
|
|
9651
|
+
stashUrl: "",
|
|
9652
|
+
stashApiKey: "",
|
|
9653
|
+
/*
|
|
9654
|
+
FNXC:Rufu126VectorSearch 2026-08-19-10:50:
|
|
9655
|
+
RUFU-126 (D3): opt-in vector (semantic) recall for the Stash memory backend.
|
|
9656
|
+
Default OFF — zero behavior change until the operator enables it (this is a
|
|
9657
|
+
prototype; rejected alternative was automatic capability detection, which
|
|
9658
|
+
would change default behavior and pay a per-process 404 round-trip against
|
|
9659
|
+
unpatched servers). When true, multi-word (≥2 tokens) recall queries try the
|
|
9660
|
+
Stash GET /api/v1/me/sessions/events/semantic-search endpoint first and fall
|
|
9661
|
+
back byte-identically to the RUFU-121 keyword path on any vector failure
|
|
9662
|
+
(see memory-backend-stash.ts search() + docs/research/stash-vector-search-evaluation.md
|
|
9663
|
+
for D1–D5). Schema-only, consistent with stashUrl/stashApiKey (no UI row).
|
|
9664
|
+
*/
|
|
9665
|
+
stashVectorSearch: false,
|
|
9666
|
+
/*
|
|
9667
|
+
FNXC:StashSessionCapture 2026-08-19-04:37:
|
|
9668
|
+
(RUFU-122) Task-terminal transcript upload defaults. All are inert unless
|
|
9669
|
+
memoryBackendType === "stash". executorSessionCaptureEnabled gates ONLY the
|
|
9670
|
+
transcript upload (the RUFU-068 terminal anchor event still fires when it is
|
|
9671
|
+
off) and defaults ON. executorSessionCaptureMaxEvents caps transcript events
|
|
9672
|
+
per task; the engine keeps the most recent N (default 20000).
|
|
9673
|
+
executorSessionCaptureIncludeStatus is the schema-only "keep a setting" for
|
|
9674
|
+
uploading `status` log entries (default off; no UI row).
|
|
9675
|
+
*/
|
|
9676
|
+
executorSessionCaptureEnabled: true,
|
|
9677
|
+
executorSessionCaptureMaxEvents: 2e4,
|
|
9678
|
+
executorSessionCaptureIncludeStatus: false,
|
|
9594
9679
|
memoryAutoSummarizeEnabled: false,
|
|
9595
9680
|
memoryAutoSummarizeThresholdChars: 5e4,
|
|
9596
9681
|
memoryAutoSummarizeSchedule: "0 3 * * *",
|
|
@@ -10299,6 +10384,20 @@ function classifyWorkflowAgentNode(node) {
|
|
|
10299
10384
|
}
|
|
10300
10385
|
}
|
|
10301
10386
|
|
|
10387
|
+
// ../core/src/workflows/workflow-merge-region.ts
|
|
10388
|
+
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
10389
|
+
"merge-gate",
|
|
10390
|
+
"merge-attempt",
|
|
10391
|
+
"manual-merge-hold",
|
|
10392
|
+
"retry-backoff",
|
|
10393
|
+
"recovery-router",
|
|
10394
|
+
"branch-group-member-integration",
|
|
10395
|
+
"branch-group-promotion",
|
|
10396
|
+
"pr-create",
|
|
10397
|
+
"pr-respond",
|
|
10398
|
+
"pr-merge"
|
|
10399
|
+
]);
|
|
10400
|
+
|
|
10302
10401
|
// ../core/src/workflows/workflow-extension-types.ts
|
|
10303
10402
|
function workflowExtensionRegistryId(pluginId, extensionId) {
|
|
10304
10403
|
return `plugin:${pluginId}:${extensionId}`;
|
|
@@ -10827,18 +10926,7 @@ function reachableFrom(start, outgoing) {
|
|
|
10827
10926
|
}
|
|
10828
10927
|
return seen;
|
|
10829
10928
|
}
|
|
10830
|
-
var INTERPRETER_ENTRY_NODE_KINDS =
|
|
10831
|
-
"merge-gate",
|
|
10832
|
-
"merge-attempt",
|
|
10833
|
-
"manual-merge-hold",
|
|
10834
|
-
"retry-backoff",
|
|
10835
|
-
"recovery-router",
|
|
10836
|
-
"branch-group-member-integration",
|
|
10837
|
-
"branch-group-promotion",
|
|
10838
|
-
"pr-create",
|
|
10839
|
-
"pr-respond",
|
|
10840
|
-
"pr-merge"
|
|
10841
|
-
]);
|
|
10929
|
+
var INTERPRETER_ENTRY_NODE_KINDS = MERGE_REGION_ENTRY_NODE_KINDS;
|
|
10842
10930
|
var MERGE_CLASS_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
10843
10931
|
"merge-gate",
|
|
10844
10932
|
"merge-attempt",
|
|
@@ -12858,6 +12946,13 @@ Lint, tests, and typecheck are also hard quality gates:
|
|
|
12858
12946
|
- Keep fixing failures caused by your change until lint, impacted tests, build, and typecheck pass.
|
|
12859
12947
|
- If the repository exposes a typecheck command, run it and fix failures caused by your change.
|
|
12860
12948
|
- When tests fail, classify whether the failure is caused by your change, a pre-existing defect, an unrelated flaky test, or an outdated test expectation.
|
|
12949
|
+
|
|
12950
|
+
**A behavior change owns every test that asserts the old behavior.** Targeted verification runs the tests for files you TOUCHED; the tests encoding the behavior you just changed usually live in files you did NOT touch, so a green targeted run is not evidence that none exist. Before finishing, search for them:
|
|
12951
|
+
- Added a guard, validation, or required field? Grep for the FIXTURES it will now refuse \u2014 they are outside your File Scope \u2014 and fix each to state its intent explicitly.
|
|
12952
|
+
- Removed a feature? Delete its tests. A test asserting a deliberately removed contract guards nothing, and making it pass later means re-adding removed behavior.
|
|
12953
|
+
- Changed an order, default, constant, or prompt string? Grep for the literal; topology lists, prompt-content assertions, and size budgets live far from the code they describe.
|
|
12954
|
+
- Added a public store/service method? Update the inventory/drift guards that require every public surface to be classified.
|
|
12955
|
+
Fix at the SHARED FIXTURE FACTORY, not per test \u2014 one helper usually explains dozens of failures. Never make a stale test pass by weakening it: update the fixture, record the new truth, or delete the test naming the change that removed its subject.
|
|
12861
12956
|
- If broad workspace verification fails on unrelated or pre-existing failures after impacted checks pass, do NOT expand this task by fixing unrelated areas. Log the evidence, quarantine flakes per project policy, or create/link a follow-up task.
|
|
12862
12957
|
- Do not repeatedly rerun a broad failing or hanging workspace command without a new hypothesis and a narrower confirming command.
|
|
12863
12958
|
|
|
@@ -13130,6 +13225,7 @@ files with assertions that run via a test runner. Typechecks and builds are NOT
|
|
|
13130
13225
|
tests. Manual verification is NOT a test.
|
|
13131
13226
|
|
|
13132
13227
|
- Each implementation step should include writing tests for the code being changed
|
|
13228
|
+
- **If the task CHANGES, GATES, or REMOVES existing behavior, include a step to find and update the tests that assert the OLD behavior.** Name the search in that step: the fixtures a new guard will now refuse, the tests of a removed feature, or the literal to grep for a changed order/default/constant/prompt string. Those tests live OUTSIDE the File Scope, so targeted verification will not surface them and the executor will not find them by accident. Measured 2026-08-24: five such changes left ~135 stale failing tests behind, every one having passed its own targeted verification; one shared fixture line accounted for 37 of them.
|
|
13133
13229
|
- For bug fixes and UI-affordance add/remove tasks, the spec MUST include a \`## Surface Enumeration\` section. The workflow Plan Review gate validates this before execution when plan review is enabled; missing coverage is a blocking REVISE.
|
|
13134
13230
|
- For bug fixes and UI-affordance add/remove tasks, populate \`## Surface Enumeration\` with this checklist from \`docs/testing.md\`: providers/bridges/execution paths; desktop + mobile breakpoints/platforms; empty/undefined/duplicate/populated data states; shared hooks/components/modules/helpers; every component that renders the affordance; leftover shells after removal.
|
|
13135
13231
|
- For bug fixes and UI-affordance add/remove tasks, regression tests must assert the invariant across all known surfaces \u2014 enumerate every provider/bridge, desktop + mobile breakpoints, empty/undefined/populated data states, and for UI-affordance changes every component rendering the affordance plus leftover shells after removal \u2014 not just the reported repro (see FN-5787/FN-5789/FN-5803, FN-5751, and FN-6115/FN-6118/FN-6123)
|
|
@@ -13925,10 +14021,59 @@ var DEFAULT_TRIAGE_PROMPT = BUILTIN_AGENT_PROMPTS.find((prompt) => prompt.id ===
|
|
|
13925
14021
|
var DEFAULT_TRIAGE_FAST_PROMPT = BUILTIN_AGENT_PROMPTS.find((prompt) => prompt.id === "default-triage-fast")?.prompt ?? "";
|
|
13926
14022
|
var DEFAULT_REVIEWER_PROMPT = BUILTIN_AGENT_PROMPTS.find((prompt) => prompt.role === "reviewer")?.prompt ?? "";
|
|
13927
14023
|
var DEFAULT_MERGER_PROMPT = BUILTIN_AGENT_PROMPTS.find((prompt) => prompt.role === "merger")?.prompt ?? "";
|
|
14024
|
+
var REVIEW_GATE_STEP_TEMPLATE_START = "### Step {N-1}: Testing & Verification";
|
|
14025
|
+
var REVIEW_GATE_STEP_TEMPLATE_END = "## Documentation Requirements";
|
|
14026
|
+
var REVIEW_GATED_STEP_CONTRACT = `## Review-gated step contract (OVERRIDES the step template above)
|
|
14027
|
+
|
|
14028
|
+
This workflow runs testing, verification, documentation, and delivery as REVIEW-COLUMN GATES after
|
|
14029
|
+
implementation. They are not task steps here.
|
|
14030
|
+
|
|
14031
|
+
- Do NOT emit a "Testing & Verification" step.
|
|
14032
|
+
- Do NOT emit a "Documentation & Delivery" step.
|
|
14033
|
+
- Emit implementation steps only, ending with the last implementation step.
|
|
14034
|
+
- Per-step verification bullets stay: each implementation step still runs its own targeted tests.
|
|
14035
|
+
|
|
14036
|
+
`;
|
|
14037
|
+
function applyReviewGatedStepContract(prompt) {
|
|
14038
|
+
const start = prompt.indexOf(REVIEW_GATE_STEP_TEMPLATE_START);
|
|
14039
|
+
const end = prompt.indexOf(REVIEW_GATE_STEP_TEMPLATE_END);
|
|
14040
|
+
if (start < 0 || end < 0 || end <= start) {
|
|
14041
|
+
return `${prompt}
|
|
14042
|
+
|
|
14043
|
+
${REVIEW_GATED_STEP_CONTRACT}`;
|
|
14044
|
+
}
|
|
14045
|
+
return `${prompt.slice(0, start)}${REVIEW_GATED_STEP_CONTRACT}${prompt.slice(end)}`;
|
|
14046
|
+
}
|
|
14047
|
+
var DOCUMENTATION_STEP_TEMPLATE_START = "### Step {N}: Documentation & Delivery";
|
|
14048
|
+
var DOCUMENTATION_STEP_TEMPLATE_END = "## Documentation Requirements";
|
|
14049
|
+
var NO_DOCUMENTATION_STEP_CONTRACT = `## Documentation is not a step (OVERRIDES the step template above)
|
|
14050
|
+
|
|
14051
|
+
Do NOT emit a "Documentation & Delivery" step. "Testing & Verification" is the LAST step.
|
|
14052
|
+
|
|
14053
|
+
- **Repository documentation is implementation work.** When a change makes an existing doc wrong,
|
|
14054
|
+
update that doc inside the step that made the change, so it is reviewed together with the code.
|
|
14055
|
+
Never plan it as its own step, and never gate completion on it when the change documents nothing.
|
|
14056
|
+
- **Fusion-side delivery is not yours to plan.** The card summary, the delivery note, artifact
|
|
14057
|
+
registration, and out-of-scope follow-up tasks are produced by a review-column milestone after the
|
|
14058
|
+
review passes. Do not emit steps or checklist items for any of them.
|
|
14059
|
+
|
|
14060
|
+
`;
|
|
14061
|
+
function stripDocumentationDeliveryStep(prompt) {
|
|
14062
|
+
const start = prompt.indexOf(DOCUMENTATION_STEP_TEMPLATE_START);
|
|
14063
|
+
const end = prompt.indexOf(DOCUMENTATION_STEP_TEMPLATE_END);
|
|
14064
|
+
if (start < 0 || end < 0 || end <= start) {
|
|
14065
|
+
return `${prompt}
|
|
14066
|
+
|
|
14067
|
+
${NO_DOCUMENTATION_STEP_CONTRACT}`;
|
|
14068
|
+
}
|
|
14069
|
+
return `${prompt.slice(0, start)}${NO_DOCUMENTATION_STEP_CONTRACT}${prompt.slice(end)}`;
|
|
14070
|
+
}
|
|
13928
14071
|
var BUILTIN_SEAM_PROMPTS = {
|
|
13929
14072
|
execute: DEFAULT_EXECUTOR_PROMPT,
|
|
13930
14073
|
planning: DEFAULT_TRIAGE_PROMPT,
|
|
13931
14074
|
"planning-fast": DEFAULT_TRIAGE_FAST_PROMPT,
|
|
14075
|
+
/* Review-gated tasks keep test and delivery work in review-column gates. */
|
|
14076
|
+
"planning-implementation-only": applyReviewGatedStepContract(DEFAULT_TRIAGE_PROMPT),
|
|
13932
14077
|
"step-execute": DEFAULT_EXECUTOR_PROMPT,
|
|
13933
14078
|
review: DEFAULT_REVIEWER_PROMPT,
|
|
13934
14079
|
merge: DEFAULT_MERGER_PROMPT
|
|
@@ -14196,6 +14341,7 @@ function postMergeVerificationOptionalGroupNode(column = "done") {
|
|
|
14196
14341
|
}
|
|
14197
14342
|
|
|
14198
14343
|
// ../core/src/workflows/builtin-plan-review-group.ts
|
|
14344
|
+
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.";
|
|
14199
14345
|
var PLAN_REVIEW_GROUP_ID = "plan-review";
|
|
14200
14346
|
var PLAN_REVIEW_STEP_NODE_ID = "plan-review-step";
|
|
14201
14347
|
var PLAN_REVIEW_NAME = "Plan Review";
|
|
@@ -14237,6 +14383,10 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
14237
14383
|
toolMode: "readonly",
|
|
14238
14384
|
gateMode: "gate"
|
|
14239
14385
|
};
|
|
14386
|
+
if (options.requireImplementationOnlySteps === true) {
|
|
14387
|
+
promptConfig.prompt = `${PLAN_REVIEW_PROMPT}${IMPLEMENTATION_ONLY_STEPS_CRITERION}`;
|
|
14388
|
+
promptConfig.requireImplementationOnlySteps = true;
|
|
14389
|
+
}
|
|
14240
14390
|
if (options.requireExternalIntegrationEvidence === true) {
|
|
14241
14391
|
promptConfig.requireExternalIntegrationEvidence = true;
|
|
14242
14392
|
}
|
|
@@ -14277,6 +14427,7 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
14277
14427
|
var PLAN_REPLAN_NODE_ID = "plan-replan";
|
|
14278
14428
|
var BROWSER_VERIFICATION_REMEDIATION_NODE_ID = "browser-verification-remediation";
|
|
14279
14429
|
var CODE_REVIEW_REMEDIATION_NODE_ID = "code-review-remediation";
|
|
14430
|
+
var REVIEW_GATED_CODE_REVIEW_REMEDIATION_NODE_ID = "code-review-remediation-steps";
|
|
14280
14431
|
function planReplanNode(column = "triage") {
|
|
14281
14432
|
return {
|
|
14282
14433
|
id: PLAN_REPLAN_NODE_ID,
|
|
@@ -14303,6 +14454,14 @@ function browserVerificationRemediationNode(column = "in-progress") {
|
|
|
14303
14454
|
}
|
|
14304
14455
|
};
|
|
14305
14456
|
}
|
|
14457
|
+
function codeReviewRemediationStepsNode(column = "in-progress") {
|
|
14458
|
+
return {
|
|
14459
|
+
id: REVIEW_GATED_CODE_REVIEW_REMEDIATION_NODE_ID,
|
|
14460
|
+
kind: "prompt",
|
|
14461
|
+
column,
|
|
14462
|
+
config: { name: "Code review remediation", workflowAction: "review-remediation-steps", forWorkflowStepId: "code-review", toolMode: "readonly" }
|
|
14463
|
+
};
|
|
14464
|
+
}
|
|
14306
14465
|
function codeReviewRemediationNode(column = "in-progress") {
|
|
14307
14466
|
return {
|
|
14308
14467
|
id: CODE_REVIEW_REMEDIATION_NODE_ID,
|
|
@@ -14951,6 +15110,147 @@ var RAW_BUILTIN_CODING_IDEAS_WORKFLOW_IR = (() => {
|
|
|
14951
15110
|
})();
|
|
14952
15111
|
var BUILTIN_CODING_IDEAS_WORKFLOW_IR = parseWorkflowIr(RAW_BUILTIN_CODING_IDEAS_WORKFLOW_IR);
|
|
14953
15112
|
|
|
15113
|
+
// ../core/src/workflows/builtin-documentation-delivery-group.ts
|
|
15114
|
+
var DOCUMENTATION_DELIVERY_GROUP_ID = "documentation-delivery";
|
|
15115
|
+
var DOCUMENTATION_DELIVERY_PROMPT = `Report on the accepted implementation exactly once, for the operator who reads this card later.
|
|
15116
|
+
|
|
15117
|
+
You have NO writer. This session can read, search and list \u2014 nothing else. Everything durable you
|
|
15118
|
+
produce is the text you output here. Do not call a tool to save it, do not claim you saved anything,
|
|
15119
|
+
and do not modify repository files: the code has already been reviewed and must not change now.
|
|
15120
|
+
|
|
15121
|
+
## 1. The card summary (always)
|
|
15122
|
+
|
|
15123
|
+
Open with 2-4 sentences of plain prose an operator can read to know what shipped and why. Mention
|
|
15124
|
+
user-visible behaviour or important files when they matter, and how it was verified. No headings, no
|
|
15125
|
+
bullet lists, no process narration, no verdict. This text becomes the task's summary.
|
|
15126
|
+
|
|
15127
|
+
## 2. Follow-up proposals (only when they genuinely exist)
|
|
15128
|
+
|
|
15129
|
+
If the work surfaced worthwhile follow-up ideas OUTSIDE this task's scope, end your output with one
|
|
15130
|
+
fenced JSON block, and nothing after it:
|
|
15131
|
+
|
|
15132
|
+
\`\`\`json
|
|
15133
|
+
{"recommendations":[{"id":"stable-slug","title":"short title","description":"what to do and why","category":"improvement"}]}
|
|
15134
|
+
\`\`\`
|
|
15135
|
+
|
|
15136
|
+
- \`category\` is one of: improvement, feature, bug, other.
|
|
15137
|
+
- Each \`id\` must be unique and stable.
|
|
15138
|
+
- These are PROPOSALS for a human, not work orders and not tasks: an operator decides which become
|
|
15139
|
+
tasks. You cannot create tasks and must not try.
|
|
15140
|
+
- Ground every entry in something you actually saw. Omit the block entirely rather than invent work,
|
|
15141
|
+
restate this task, or pad the list. Fewer, real proposals are the correct answer.
|
|
15142
|
+
- Never put commands, shell syntax, credentials or secrets in a proposal.
|
|
15143
|
+
|
|
15144
|
+
You cannot block this card and you have no verdict to give. If something is missing or you could not
|
|
15145
|
+
determine it, say so plainly in the summary and finish.`;
|
|
15146
|
+
function documentationDeliveryOptionalGroupNode(column) {
|
|
15147
|
+
return {
|
|
15148
|
+
id: DOCUMENTATION_DELIVERY_GROUP_ID,
|
|
15149
|
+
kind: "optional-group",
|
|
15150
|
+
column,
|
|
15151
|
+
config: {
|
|
15152
|
+
name: "Documentation",
|
|
15153
|
+
defaultOn: true,
|
|
15154
|
+
/*
|
|
15155
|
+
FNXC:ReportingOnlyGroup 2026-08-26-06:56:
|
|
15156
|
+
Documentation ONLY documents. `gateMode: "advisory"` on the inner node was not enough and the
|
|
15157
|
+
gap was measured on a real card: its REVISE recorded `advisory_failure`, which held the merge
|
|
15158
|
+
door ("no current approval") AND bounced the card to implementation with no work to do, where
|
|
15159
|
+
it re-ran Code Review against an unchanged tree and merged on the second pass by luck.
|
|
15160
|
+
`reportingOnly` states the contract once: no approval to withhold, no remediation to request.
|
|
15161
|
+
*/
|
|
15162
|
+
reportingOnly: true,
|
|
15163
|
+
template: {
|
|
15164
|
+
nodes: [{
|
|
15165
|
+
id: "documentation-delivery-step",
|
|
15166
|
+
kind: "prompt",
|
|
15167
|
+
config: {
|
|
15168
|
+
name: "Documentation",
|
|
15169
|
+
prompt: DOCUMENTATION_DELIVERY_PROMPT,
|
|
15170
|
+
toolMode: "readonly",
|
|
15171
|
+
gateMode: "advisory",
|
|
15172
|
+
workflowAction: "documentation-delivery",
|
|
15173
|
+
/* The two projection contracts that give a writer-less node durable output. */
|
|
15174
|
+
summaryTarget: "task",
|
|
15175
|
+
recommendationsTarget: "task"
|
|
15176
|
+
}
|
|
15177
|
+
}],
|
|
15178
|
+
edges: []
|
|
15179
|
+
}
|
|
15180
|
+
}
|
|
15181
|
+
};
|
|
15182
|
+
}
|
|
15183
|
+
|
|
15184
|
+
// ../core/src/workflows/builtin-coding-ideas-v2-workflow-ir.ts
|
|
15185
|
+
var clone = (ir) => JSON.parse(JSON.stringify(ir));
|
|
15186
|
+
var RAW_BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR = (() => {
|
|
15187
|
+
const ir = clone(BUILTIN_CODING_IDEAS_WORKFLOW_IR);
|
|
15188
|
+
ir.name = "builtin-coding-ideas-v2";
|
|
15189
|
+
const plan = ir.nodes.find((node) => node.id === "plan");
|
|
15190
|
+
if (!plan?.config) throw new Error("coding-ideas-v2 requires the inherited planning node");
|
|
15191
|
+
plan.config.prompt = stripDocumentationDeliveryStep(String(plan.config.prompt ?? ""));
|
|
15192
|
+
const parse3 = ir.nodes.find((node) => node.id === "parse");
|
|
15193
|
+
if (parse3) parse3.config = { ...parse3.config, implementationOnlySteps: true, preserveRemediationSteps: true };
|
|
15194
|
+
const codeReviewRemediation = ir.nodes.find((node) => node.id === "code-review-remediation");
|
|
15195
|
+
if (codeReviewRemediation) {
|
|
15196
|
+
codeReviewRemediation.config = {
|
|
15197
|
+
...codeReviewRemediation.config,
|
|
15198
|
+
...codeReviewRemediationStepsNode().config,
|
|
15199
|
+
name: "Code Review Remediation"
|
|
15200
|
+
};
|
|
15201
|
+
}
|
|
15202
|
+
const codeReviewIndex = ir.nodes.findIndex((node) => node.id === "code-review");
|
|
15203
|
+
if (codeReviewIndex < 0) throw new Error("coding-ideas-v2 requires the inherited code-review gate");
|
|
15204
|
+
const codeReviewStep = ir.nodes[codeReviewIndex]?.config?.template?.nodes?.find((node) => node.id === "code-review-step");
|
|
15205
|
+
if (!codeReviewStep?.config) throw new Error("coding-ideas-v2 requires the inherited code-review-step template node");
|
|
15206
|
+
codeReviewStep.config.prompt = `${String(codeReviewStep.config.prompt ?? "")}
|
|
15207
|
+
|
|
15208
|
+
## Step 0: Judge the TESTS before you judge the code
|
|
15209
|
+
|
|
15210
|
+
You cannot run anything: this session is read-only, \`bash\` is denied and no verification tool is
|
|
15211
|
+
available to you. Do not claim you ran lint, tests or a build, and do not ask for a command to be
|
|
15212
|
+
run. The executor already wrote and ran the tests; your job is to rule on whether that work is
|
|
15213
|
+
sound.
|
|
15214
|
+
|
|
15215
|
+
Read the test files in the diff and rule on FOUR things:
|
|
15216
|
+
|
|
15217
|
+
1. **They exist.** A behavioural change with no test is a REVISE. Say which change is uncovered.
|
|
15218
|
+
2. **They are real tests.** Assertions executed by a test runner. A typecheck is not a test, a build
|
|
15219
|
+
is not a test, and manual verification is not a test.
|
|
15220
|
+
3. **They assert BEHAVIOUR.** Never a comment, a date stamp, or prose lifted from source. Asserting
|
|
15221
|
+
that a comment exists tests nothing a user or caller can observe. Code-construct guards
|
|
15222
|
+
(call-site allowlists, architectural ratchets) are legitimate and stay.
|
|
15223
|
+
4. **They cover the INVARIANT, not just the reported case.** For a bug fix, a test that only
|
|
15224
|
+
reproduces the single reported symptom is incomplete: require every known surface. If this task
|
|
15225
|
+
CHANGED, GATED or REMOVED behaviour, the tests that encoded the OLD behaviour must have been
|
|
15226
|
+
updated or deleted in the same change \u2014 they live outside the File Scope and targeted
|
|
15227
|
+
verification will not have surfaced them.
|
|
15228
|
+
|
|
15229
|
+
Then review the code itself for what tests do not catch: logic errors, broken edge cases, and
|
|
15230
|
+
unhandled failure modes.`;
|
|
15231
|
+
ir.nodes.splice(codeReviewIndex + 1, 0, documentationDeliveryOptionalGroupNode("in-review"));
|
|
15232
|
+
const summaryIndex = ir.nodes.findIndex((node) => node.id === "completion-summary");
|
|
15233
|
+
if (summaryIndex >= 0) ir.nodes.splice(summaryIndex, 1);
|
|
15234
|
+
ir.edges = ir.edges.filter((edge) => edge.from !== "completion-summary" && edge.to !== "completion-summary");
|
|
15235
|
+
ir.edges = ir.edges.filter((edge) => !(edge.from === "code-review" && edge.to === "merge-gate"));
|
|
15236
|
+
ir.edges.push(
|
|
15237
|
+
{ from: "steps", to: "code-review", condition: "success" },
|
|
15238
|
+
{ from: "code-review", to: "documentation-delivery", condition: "success" },
|
|
15239
|
+
{ from: "documentation-delivery", to: "merge-gate", condition: "success" },
|
|
15240
|
+
/*
|
|
15241
|
+
FNXC:CodingIdeasV2Workflow 2026-08-25-10:20:
|
|
15242
|
+
Documentation is ADVISORY: it reports, it never vetoes. Its failure edge reaches the merge gate
|
|
15243
|
+
exactly like its success edge, so a delivery note that could not be written cannot strand a
|
|
15244
|
+
card whose code is already approved. Measured why: as a blocking gate it bounced a task whose
|
|
15245
|
+
own plan said not to implement anything ("No task-specific implementation is present"), and the
|
|
15246
|
+
card looped through the review lane every five minutes indefinitely.
|
|
15247
|
+
*/
|
|
15248
|
+
{ from: "documentation-delivery", to: "merge-gate", condition: "failure" }
|
|
15249
|
+
);
|
|
15250
|
+
return ir;
|
|
15251
|
+
})();
|
|
15252
|
+
var BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR = parseWorkflowIr(RAW_BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR);
|
|
15253
|
+
|
|
14954
15254
|
// ../core/src/workflows/builtin-brainstorming-workflow-ir.ts
|
|
14955
15255
|
var APPROVAL_PHRASE = "looks good";
|
|
14956
15256
|
var RAW_BUILTIN_BRAINSTORMING_WORKFLOW_IR = (() => {
|
|
@@ -15706,6 +16006,47 @@ var BUILTIN_WORKFLOWS = [
|
|
|
15706
16006
|
createdAt: BUILTIN_TS,
|
|
15707
16007
|
updatedAt: BUILTIN_TS
|
|
15708
16008
|
},
|
|
16009
|
+
/*
|
|
16010
|
+
* FNXC:CodingIdeasV2Workflow 2026-08-26-05:56:
|
|
16011
|
+
* Same Ideas board as builtin:coding-ideas, with one rule: in-review NEVER writes code.
|
|
16012
|
+
* Implementation and its tests finish in `in-progress` — the executor's own final verification
|
|
16013
|
+
* runs the project's configured test/build commands there, and a red result appends named fix
|
|
16014
|
+
* steps rather than letting the card advance. `in-review` is then three read-only milestones:
|
|
16015
|
+
* Code Review judges, Documentation reports, and the merge is the last thing that happens.
|
|
16016
|
+
* The layout is ordered left-to-right in that same sequence so the editor's diagram reads the way
|
|
16017
|
+
* the graph runs; nodes deleted from the graph must be deleted from this map too, or the editor
|
|
16018
|
+
* keeps positioning ghosts.
|
|
16019
|
+
*/
|
|
16020
|
+
{
|
|
16021
|
+
id: "builtin:coding-ideas-v2",
|
|
16022
|
+
name: "Coding (Ideas) V2",
|
|
16023
|
+
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.",
|
|
16024
|
+
kind: "workflow",
|
|
16025
|
+
ir: BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR,
|
|
16026
|
+
layout: {
|
|
16027
|
+
start: { x: 60, y: 160 },
|
|
16028
|
+
plan: { x: 230, y: 160 },
|
|
16029
|
+
"plan-review": { x: 400, y: 160 },
|
|
16030
|
+
"plan-replan": { x: 400, y: 320 },
|
|
16031
|
+
"plan-review-no-op": { x: 570, y: 320 },
|
|
16032
|
+
parse: { x: 570, y: 160 },
|
|
16033
|
+
steps: { x: 740, y: 160 },
|
|
16034
|
+
"review-pending-handoff": { x: 740, y: 320 },
|
|
16035
|
+
"code-review": { x: 910, y: 160 },
|
|
16036
|
+
"code-review-remediation": { x: 910, y: 320 },
|
|
16037
|
+
"documentation-delivery": { x: 1080, y: 160 },
|
|
16038
|
+
"merge-gate": { x: 1250, y: 160 },
|
|
16039
|
+
"branch-group-member-integration": { x: 1420, y: 80 },
|
|
16040
|
+
"branch-group-promotion": { x: 1590, y: 80 },
|
|
16041
|
+
"merge-manual-hold": { x: 1420, y: 240 },
|
|
16042
|
+
"merge-attempt": { x: 1760, y: 160 },
|
|
16043
|
+
"merge-retry": { x: 1930, y: 80 },
|
|
16044
|
+
"recovery-router": { x: 1930, y: 240 },
|
|
16045
|
+
end: { x: 2100, y: 160 }
|
|
16046
|
+
},
|
|
16047
|
+
createdAt: BUILTIN_TS,
|
|
16048
|
+
updatedAt: BUILTIN_TS
|
|
16049
|
+
},
|
|
15709
16050
|
{
|
|
15710
16051
|
id: "builtin:legacy-coding",
|
|
15711
16052
|
name: "Legacy coding",
|
|
@@ -20026,7 +20367,7 @@ __export(external_exports, {
|
|
|
20026
20367
|
check: () => check2,
|
|
20027
20368
|
cidrv4: () => cidrv42,
|
|
20028
20369
|
cidrv6: () => cidrv62,
|
|
20029
|
-
clone: () =>
|
|
20370
|
+
clone: () => clone2,
|
|
20030
20371
|
codec: () => codec,
|
|
20031
20372
|
coerce: () => coerce_exports,
|
|
20032
20373
|
config: () => config2,
|
|
@@ -20410,7 +20751,7 @@ __export(core_exports2, {
|
|
|
20410
20751
|
_void: () => _void,
|
|
20411
20752
|
_xid: () => _xid,
|
|
20412
20753
|
_xor: () => _xor,
|
|
20413
|
-
clone: () =>
|
|
20754
|
+
clone: () => clone2,
|
|
20414
20755
|
config: () => config2,
|
|
20415
20756
|
createStandardJSONSchemaMethod: () => createStandardJSONSchemaMethod,
|
|
20416
20757
|
createToJSONSchemaMethod: () => createToJSONSchemaMethod,
|
|
@@ -20547,7 +20888,7 @@ __export(util_exports, {
|
|
|
20547
20888
|
captureStackTrace: () => captureStackTrace,
|
|
20548
20889
|
cleanEnum: () => cleanEnum,
|
|
20549
20890
|
cleanRegex: () => cleanRegex,
|
|
20550
|
-
clone: () =>
|
|
20891
|
+
clone: () => clone2,
|
|
20551
20892
|
cloneDef: () => cloneDef,
|
|
20552
20893
|
createTransparentProxy: () => createTransparentProxy,
|
|
20553
20894
|
defineLazy: () => defineLazy,
|
|
@@ -20836,7 +21177,7 @@ var primitiveTypes = /* @__PURE__ */ new Set([
|
|
|
20836
21177
|
function escapeRegex(str) {
|
|
20837
21178
|
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
20838
21179
|
}
|
|
20839
|
-
function
|
|
21180
|
+
function clone2(inst, def, params) {
|
|
20840
21181
|
const cl = new inst._zod.constr(def ?? inst._zod.def);
|
|
20841
21182
|
if (!def || params?.parent)
|
|
20842
21183
|
cl._zod.parent = inst;
|
|
@@ -20937,7 +21278,7 @@ function pick(schema, mask) {
|
|
|
20937
21278
|
},
|
|
20938
21279
|
checks: []
|
|
20939
21280
|
});
|
|
20940
|
-
return
|
|
21281
|
+
return clone2(schema, def);
|
|
20941
21282
|
}
|
|
20942
21283
|
function omit(schema, mask) {
|
|
20943
21284
|
const currDef = schema._zod.def;
|
|
@@ -20962,7 +21303,7 @@ function omit(schema, mask) {
|
|
|
20962
21303
|
},
|
|
20963
21304
|
checks: []
|
|
20964
21305
|
});
|
|
20965
|
-
return
|
|
21306
|
+
return clone2(schema, def);
|
|
20966
21307
|
}
|
|
20967
21308
|
function extend(schema, shape) {
|
|
20968
21309
|
if (!isPlainObject(shape)) {
|
|
@@ -20985,7 +21326,7 @@ function extend(schema, shape) {
|
|
|
20985
21326
|
return _shape;
|
|
20986
21327
|
}
|
|
20987
21328
|
});
|
|
20988
|
-
return
|
|
21329
|
+
return clone2(schema, def);
|
|
20989
21330
|
}
|
|
20990
21331
|
function safeExtend(schema, shape) {
|
|
20991
21332
|
if (!isPlainObject(shape)) {
|
|
@@ -20998,7 +21339,7 @@ function safeExtend(schema, shape) {
|
|
|
20998
21339
|
return _shape;
|
|
20999
21340
|
}
|
|
21000
21341
|
});
|
|
21001
|
-
return
|
|
21342
|
+
return clone2(schema, def);
|
|
21002
21343
|
}
|
|
21003
21344
|
function merge(a, b) {
|
|
21004
21345
|
if (a._zod.def.checks?.length) {
|
|
@@ -21015,7 +21356,7 @@ function merge(a, b) {
|
|
|
21015
21356
|
},
|
|
21016
21357
|
checks: b._zod.def.checks ?? []
|
|
21017
21358
|
});
|
|
21018
|
-
return
|
|
21359
|
+
return clone2(a, def);
|
|
21019
21360
|
}
|
|
21020
21361
|
function partial(Class2, schema, mask) {
|
|
21021
21362
|
const currDef = schema._zod.def;
|
|
@@ -21053,7 +21394,7 @@ function partial(Class2, schema, mask) {
|
|
|
21053
21394
|
},
|
|
21054
21395
|
checks: []
|
|
21055
21396
|
});
|
|
21056
|
-
return
|
|
21397
|
+
return clone2(schema, def);
|
|
21057
21398
|
}
|
|
21058
21399
|
function required(Class2, schema, mask) {
|
|
21059
21400
|
const def = mergeDefs(schema._zod.def, {
|
|
@@ -21084,7 +21425,7 @@ function required(Class2, schema, mask) {
|
|
|
21084
21425
|
return shape;
|
|
21085
21426
|
}
|
|
21086
21427
|
});
|
|
21087
|
-
return
|
|
21428
|
+
return clone2(schema, def);
|
|
21088
21429
|
}
|
|
21089
21430
|
function aborted(x, startIndex = 0) {
|
|
21090
21431
|
if (x.aborted === true)
|
|
@@ -32695,7 +33036,7 @@ var ZodType = /* @__PURE__ */ $constructor("ZodType", (inst, def) => {
|
|
|
32695
33036
|
return this.check(...chks);
|
|
32696
33037
|
},
|
|
32697
33038
|
clone(def2, params) {
|
|
32698
|
-
return
|
|
33039
|
+
return clone2(this, def2, params);
|
|
32699
33040
|
},
|
|
32700
33041
|
brand() {
|
|
32701
33042
|
return this;
|
|
@@ -33446,7 +33787,7 @@ function record(keyType, valueType, params) {
|
|
|
33446
33787
|
});
|
|
33447
33788
|
}
|
|
33448
33789
|
function partialRecord(keyType, valueType, params) {
|
|
33449
|
-
const k =
|
|
33790
|
+
const k = clone2(keyType);
|
|
33450
33791
|
k._zod.values = void 0;
|
|
33451
33792
|
return new ZodRecord({
|
|
33452
33793
|
type: "record",
|