@runfusion/fusion 0.76.0-beta.3 → 0.77.0-beta.0
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 +13802 -9587
- package/dist/child-process-worker.js +6472 -4028
- package/dist/client/.vite/manifest.json +280 -269
- package/dist/client/assets/AgentDetailView-0G9qFd4j.js +13 -0
- package/dist/client/assets/{AgentDetailView-Cc3ATg8a.css → AgentDetailView-jzgy1BAS.css} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor--u9jyUf2.js → AgentPermissionPolicyEditor-BM68g7wo.js} +1 -1
- package/dist/client/assets/AgentsView-DkOUZWw4.js +24 -0
- package/dist/client/assets/ChatView-BPSm2JIH.js +13 -0
- package/dist/client/assets/{CommandCenter-CSRYoveB.js → CommandCenter-DxRSFWNc.js} +26 -26
- package/dist/client/assets/CommandCenter-ilm-DbtI.css +1 -0
- package/dist/client/assets/{DevServerView-B9So_oYx.js → DevServerView-DO-bqJFE.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-BhyDL_2m.js → DirectoryPicker-Cp2gddTE.js} +1 -1
- package/dist/client/assets/DocumentsView-D0E-3G96.js +1 -0
- package/dist/client/assets/EvalsView-BoFVq5hw.js +1 -0
- package/dist/client/assets/ExperimentalAgentOnboardingModal-CS1Sdogm.js +1 -0
- package/dist/client/assets/{GoalsView-B6X5_0Ve.js → GoalsView-sybf7JY4.js} +1 -1
- package/dist/client/assets/InsightsView-nHa7aShn.js +11 -0
- package/dist/client/assets/{MemoryView-DN_3IFmA.css → MemoryView-CdpQqPJJ.css} +1 -1
- package/dist/client/assets/MemoryView-D0IG44za.js +3 -0
- package/dist/client/assets/{PiExtensionsManager-B8At6fO8.js → PiExtensionsManager-CU76weJe.js} +2 -2
- package/dist/client/assets/PluginManager-DyT8XbcG.js +1 -0
- package/dist/client/assets/{PullRequestView-B1hZFrWo.js → PullRequestView-CnxWUSen.js} +2 -2
- package/dist/client/assets/{ReportModal-C46V_zEa.js → ReportModal-CMrmMQjD.js} +5 -5
- package/dist/client/assets/{ResearchView-D8G85BYN.js → ResearchView-BTytQSgy.js} +2 -2
- package/dist/client/assets/{SecretsView-CTri9LRK.js → SecretsView-BuSH5J87.js} +1 -1
- package/dist/client/assets/SessionTerminal-D04kYRrT.js +2 -0
- package/dist/client/assets/SettingsModal-C0FY8MPW.css +1 -0
- package/dist/client/assets/{SettingsModal-rUQcSTJp.js → SettingsModal-Dm-ngbRr.js} +1 -1
- package/dist/client/assets/{SettingsModal-DmfMotcd.css → SettingsModal-Ds0Yj47X.css} +1 -1
- package/dist/client/assets/SettingsModal-xSLhH7Tr.js +21 -0
- package/dist/client/assets/{SettingsTextareaRow-BirlBcem.js → SettingsTextareaRow-CHPgocEp.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-xnCBM9EL.js → SetupWizardModal-y88aXNIQ.js} +2 -2
- package/dist/client/assets/{SkillsView-O5U0ep50.js → SkillsView-CYyQW1Hv.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-BX4d2qqF.js → WorkflowNodeEditor-hYeoz1X8.js} +3 -3
- package/dist/client/assets/{agent-import-generation-DnqVkPkz.js → agent-import-generation-CjiYXzCr.js} +1 -1
- package/dist/client/assets/agentsOrgChartLayout-C0UP_X3z.js +1 -0
- package/dist/client/assets/app-BgpuMvTU.js +13 -0
- package/dist/client/assets/app-BlexHhbW.js +13 -0
- package/dist/client/assets/app-BsuUOR0P.js +13 -0
- package/dist/client/assets/app-DQVOujmO.js +13 -0
- package/dist/client/assets/app-DjyTRx1N.js +5 -0
- package/dist/client/assets/app-Dniggype.js +13 -0
- package/dist/client/assets/app-EV-lyZ0T.js +5 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-gi467xY0.js → architectureDiagram-3BPJPVTR-Dd6GPcqM.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-B_gpcYiR.js → blockDiagram-GPEHLZMM-CC6pLxlz.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-DeylEYsQ.js → c4Diagram-AAUBKEIU-DxMP_l6y.js} +1 -1
- package/dist/client/assets/channel-DlCEMoEf.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-BL2WY0HN.js → chunk-2J33WTMH-BKYToL43.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-BkLExGMe.js → chunk-4BX2VUAB-Bg6rjQb3.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-CSTvCF5T.js → chunk-55IACEB6-CPUwbbGa.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-9J8pKk4x.js → chunk-727SXJPM-DScQBCvv.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-DXC1vPWr.js → chunk-AQP2D5EJ-DbX7uaXK.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-CFRUb-zD.js → chunk-FMBD7UC4-DvYKea1c.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-B87HFYS8.js → chunk-ND2GUHAM-CH-Tvw7w.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-CTjHiGbd.js → chunk-QZHKN3VN-CbyEvOoM.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-Bc92O8Ks.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Bc92O8Ks.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-D3Edq3L9.js → cose-bilkent-S5V4N54A-BPB5fV3A.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-CwwbeQfN.js → dagre-BM42HDAG-CilYJ3rR.js} +1 -1
- package/dist/client/assets/{dashboard-view-QxQwJFLz.js → dashboard-view-BnGe8cWo.js} +1 -1
- package/dist/client/assets/{dashboard-view-BLAoW3D4.js → dashboard-view-DnVf3tmI.js} +1 -1
- package/dist/client/assets/{dashboard-view-DAlJxqiJ.js → dashboard-view-DoLU6FxZ.js} +1 -1
- package/dist/client/assets/{dashboard-view-aPzfv99T.js → dashboard-view-dChSM_So.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-koJWWXE4.js → diagram-2AECGRRQ-m9u1Qhyx.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-Yob5cOKT.js → diagram-5GNKFQAL-DVr7Kf0N.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-DelvFSkK.js → diagram-KO2AKTUF-D7sgJDFx.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-CMput2h2.js → diagram-LMA3HP47-DNKNDS6r.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-04VXDl79.js → diagram-OG6HWLK6-1Bff4FWn.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-C9iP8Uyp.js → erDiagram-TEJ5UH35-DGua1UHN.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-DENQvu_t.js → flowDiagram-I6XJVG4X-UDfDtwsE.js} +1 -1
- package/dist/client/assets/{folder-open-D-554oji.js → folder-open-CteOypVk.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-BqOttZAT.js → ganttDiagram-6RSMTGT7-COdmD328.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CDcydi-5.js → gitGraphDiagram-PVQCEYII-SUSls7Kw.js} +1 -1
- package/dist/client/assets/index-0ovTXt3t.css +1 -0
- package/dist/client/assets/index-DpCHwyiD.js +2818 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-B5LQQnxt.js → infoDiagram-5YYISTIA-e_DloXj7.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DpFEt7D2.js → ishikawaDiagram-YF4QCWOH-DVWqihXg.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-MELtgu22.js → journeyDiagram-JHISSGLW-BcPY-XP0.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-h33PLATd.js → kanban-definition-UN3LZRKU-BCFG2Jle.js} +1 -1
- package/dist/client/assets/{mermaid.core-Dk2mUPOq.js → mermaid.core-5yPje9Bi.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-B_T4O2-B.js → mindmap-definition-RKZ34NQL-DDApeT3K.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-B1YIFkRl.js → pieDiagram-4H26LBE5-N61_jyeP.js} +1 -1
- package/dist/client/assets/{puzzle-hvecxlpJ.js → puzzle-BkaCP30D.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BoGQR_hO.js → quadrantDiagram-W4KKPZXB-C5qHiApF.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-BSDmUBIx.js → requirementDiagram-4Y6WPE33-C71okgzt.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Dz_GqOa5.js → sankeyDiagram-5OEKKPKP-B2iKyLjB.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B6twjYUH.js → sequenceDiagram-3UESZ5HK-DfdoYKKk.js} +1 -1
- package/dist/client/assets/{shield-alert-BX4WRJOv.js → shield-alert-BNSeDB8l.js} +1 -1
- package/dist/client/assets/standing-instructions-template-pZtzo1lK.js +20 -0
- package/dist/client/assets/standing-instructions-template-w7Ouw_37.css +1 -0
- package/dist/client/assets/{stateDiagram-AJRCARHV-DuwqWLx-.js → stateDiagram-AJRCARHV-lS-sUi12.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Bu8Sk187.js → stateDiagram-v2-BHNVJYJU-DXJNDrV9.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-BS6VnqSI.js → timeline-definition-PNZ67QCA-CCwvX81K.js} +1 -1
- package/dist/client/assets/{upload-CaDoyaMW.js → upload-CDovVbu2.js} +1 -1
- package/dist/client/assets/useDiscoveredSkillsCache-BYqP-afh.js +1 -0
- package/dist/client/assets/{users-C5uCLwVM.js → users-CTqECGLo.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CUbzqT5Y.js → vennDiagram-CIIHVFJN-DaiR5nv9.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-Mv-NotFS.js → wardley-L42UT6IY-hA5IHyPW.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DuYpvLZX.js → wardleyDiagram-YWT4CUSO-CILUNESc.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-24_7QXdw.js → xychartDiagram-2RQKCTM6-72eNMmjz.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 +10671 -6904
- package/dist/migrations/0059_fn_9037_tasks_source_agent_index.sql +3 -0
- package/dist/migrations/0060_fn_9059_workspace_coordination_leases.sql +10 -0
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +190 -9
- package/dist/plugin-sdk/index.js +74 -28
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +83 -29
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +83 -29
- package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +1096 -73
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +83 -29
- package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +302 -71
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +83 -29
- package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-quality/bundled.js +176 -46
- package/dist/plugins/fusion-plugin-quality/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-todos/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-todos/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/references/extension-tools.md +2 -0
- package/dist/client/assets/AgentDetailView-T767kKTg.js +0 -13
- package/dist/client/assets/AgentsView-6Ifu7qDr.js +0 -24
- package/dist/client/assets/ChatView-BV3lixQi.js +0 -13
- package/dist/client/assets/CommandCenter-CE4rYjHn.css +0 -1
- package/dist/client/assets/DocumentsView-pbERA7O-.js +0 -1
- package/dist/client/assets/EvalsView-DJQ4ltCg.js +0 -1
- package/dist/client/assets/ExperimentalAgentOnboardingModal-BwJuzkzB.js +0 -1
- package/dist/client/assets/InsightsView-CJgI0J7S.js +0 -11
- package/dist/client/assets/MemoryView-BHq1AHPu.js +0 -3
- package/dist/client/assets/PluginManager-k7hV7_9e.js +0 -1
- package/dist/client/assets/SessionTerminal-BRf6r4Vp.js +0 -2
- package/dist/client/assets/SettingsModal-B30rPfYC.css +0 -1
- package/dist/client/assets/SettingsModal-D0RBeZik.js +0 -21
- package/dist/client/assets/agentsOrgChartLayout-CKuzbhFf.js +0 -1
- package/dist/client/assets/app-B2FwULu2.js +0 -5
- package/dist/client/assets/app-B6nJaqAl.js +0 -13
- package/dist/client/assets/app-CGXZeIRc.js +0 -13
- package/dist/client/assets/app-CGtkeBF5.js +0 -13
- package/dist/client/assets/app-CNzN1Plu.js +0 -13
- package/dist/client/assets/app-DLs-f5yM.js +0 -13
- package/dist/client/assets/app-DsvtcRUG.js +0 -5
- package/dist/client/assets/channel-BoE8DeM4.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-qnbLX_9_.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-qnbLX_9_.js +0 -1
- package/dist/client/assets/index-CXTd3LAB.css +0 -1
- package/dist/client/assets/index-CtYRoouR.js +0 -2818
- package/dist/client/assets/standing-instructions-template-BJY317CC.js +0 -20
- package/dist/client/assets/standing-instructions-template-Ddi_4TIk.css +0 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
-- FNXC:Workspace 2026-08-15-08:23: durable project-scoped leases fence multi-node workspace writers; intents survive a post-push process death.
|
|
2
|
+
CREATE TABLE IF NOT EXISTS project.workspace_coordination_leases (
|
|
3
|
+
project_id text NOT NULL DEFAULT current_setting('fusion.project_id', true), lease_key text NOT NULL, kind text NOT NULL, owner_task_id text NOT NULL, owner_node_id text NOT NULL, owner_incarnation_id text NOT NULL, owner_run_id text, fence_token bigint NOT NULL DEFAULT 0, fence_ref_name text, fence_ref_sha text, status text NOT NULL, acquired_at text NOT NULL, renewed_at text NOT NULL, expires_at text NOT NULL, created_at text NOT NULL, updated_at text NOT NULL, PRIMARY KEY(project_id, lease_key), CONSTRAINT workspace_coordination_leases_kind_check CHECK(kind IN ('acquire','land','merge-dispatch')), CONSTRAINT workspace_coordination_leases_status_check CHECK(status IN ('held','released','expired')));
|
|
4
|
+
CREATE INDEX IF NOT EXISTS "idxWorkspaceCoordinationLeasesOwnerTask" ON project.workspace_coordination_leases(project_id, owner_task_id);
|
|
5
|
+
CREATE INDEX IF NOT EXISTS "idxWorkspaceCoordinationLeasesOwnerNode" ON project.workspace_coordination_leases(project_id, owner_node_id);
|
|
6
|
+
CREATE INDEX IF NOT EXISTS "idxWorkspaceCoordinationLeasesExpiry" ON project.workspace_coordination_leases(status, expires_at);
|
|
7
|
+
CREATE TABLE IF NOT EXISTS project.workspace_land_intents (
|
|
8
|
+
project_id text NOT NULL DEFAULT current_setting('fusion.project_id', true), task_id text NOT NULL, repo_rel_path text NOT NULL, remote_url text NOT NULL, integration_ref text NOT NULL, intended_sha text NOT NULL, expected_tip text NOT NULL, fence_ref_name text NOT NULL, fence_ref_sha text NOT NULL, owner_task_id text NOT NULL, owner_node_id text NOT NULL, owner_incarnation_id text NOT NULL, fence_token bigint NOT NULL, status text NOT NULL, resolved_sha text, resolution text, created_at text NOT NULL, updated_at text NOT NULL, resolved_at text, PRIMARY KEY(project_id, task_id, repo_rel_path), CONSTRAINT workspace_land_intents_status_check CHECK(status IN ('pending','recorded','abandoned')), CONSTRAINT workspace_land_intents_resolution_check CHECK(resolution IS NULL OR resolution IN ('landed','not-landed')));
|
|
9
|
+
CREATE INDEX IF NOT EXISTS "idxWorkspaceLandIntentsStatus" ON project.workspace_land_intents(project_id, status);
|
|
10
|
+
DO $$ DECLARE tbl text; BEGIN FOREACH tbl IN ARRAY ARRAY['workspace_coordination_leases','workspace_land_intents'] LOOP EXECUTE format('ALTER TABLE project.%I ENABLE ROW LEVEL SECURITY', tbl); EXECUTE format('ALTER TABLE project.%I FORCE ROW LEVEL SECURITY', tbl); EXECUTE format('DROP POLICY IF EXISTS fusion_project_isolation ON project.%I', tbl); EXECUTE format('CREATE POLICY fusion_project_isolation ON project.%I USING (current_setting(''fusion.project_bypass'', true) = ''on'' OR project_id = current_setting(''fusion.project_id'', true)) WITH CHECK (current_setting(''fusion.project_bypass'', true) = ''on'' OR project_id = current_setting(''fusion.project_id'', true))', tbl); EXECUTE format('DROP TRIGGER IF EXISTS fusion_assign_project_id ON project.%I', tbl); EXECUTE format('CREATE TRIGGER fusion_assign_project_id BEFORE INSERT OR UPDATE OF project_id ON project.%I FOR EACH ROW EXECUTE FUNCTION project.fusion_assign_project_id()', tbl); END LOOP; END $$;
|
|
@@ -861,6 +861,65 @@ interface HandoffToReviewOptions {
|
|
|
861
861
|
now?: string;
|
|
862
862
|
}
|
|
863
863
|
|
|
864
|
+
type WorkspaceLeaseKind = "acquire" | "land" | "merge-dispatch";
|
|
865
|
+
type WorkspaceLeaseStatus = "held" | "released" | "expired";
|
|
866
|
+
type WorkspaceLeaseOwner = {
|
|
867
|
+
taskId: string;
|
|
868
|
+
nodeId: string;
|
|
869
|
+
incarnationId: string;
|
|
870
|
+
runId?: string;
|
|
871
|
+
};
|
|
872
|
+
type WorkspaceLeaseHandle = {
|
|
873
|
+
leaseKey: string;
|
|
874
|
+
owner: WorkspaceLeaseOwner;
|
|
875
|
+
fenceToken: bigint;
|
|
876
|
+
expiresAt: string;
|
|
877
|
+
fenceRefName?: string;
|
|
878
|
+
fenceRefSha?: string;
|
|
879
|
+
};
|
|
880
|
+
type WorkspaceLeaseClaimOutcome = "acquired" | "reentrant" | "reclaimed-expired" | "conflict";
|
|
881
|
+
type WorkspaceLandIntentResolution = "landed" | "not-landed";
|
|
882
|
+
type WorkspaceLeaseReclaimOutcome = "reclaimed" | "stale-precondition" | "still-live" | "owner-unresolvable" | "missing";
|
|
883
|
+
interface WorkspaceLease extends WorkspaceLeaseHandle {
|
|
884
|
+
kind: WorkspaceLeaseKind;
|
|
885
|
+
status: WorkspaceLeaseStatus;
|
|
886
|
+
acquiredAt: string;
|
|
887
|
+
renewedAt: string;
|
|
888
|
+
}
|
|
889
|
+
interface WorkspaceLeaseConflict {
|
|
890
|
+
leaseKey: string;
|
|
891
|
+
taskId: string;
|
|
892
|
+
nodeId: string;
|
|
893
|
+
incarnationId: string;
|
|
894
|
+
fenceToken: bigint;
|
|
895
|
+
expiresAt: string;
|
|
896
|
+
}
|
|
897
|
+
type AcquireWorkspaceLeaseResult = {
|
|
898
|
+
outcome: Exclude<WorkspaceLeaseClaimOutcome, "conflict">;
|
|
899
|
+
handle: WorkspaceLeaseHandle;
|
|
900
|
+
} | {
|
|
901
|
+
outcome: "conflict";
|
|
902
|
+
conflict: WorkspaceLeaseConflict;
|
|
903
|
+
};
|
|
904
|
+
interface WorkspaceLandIntent {
|
|
905
|
+
taskId: string;
|
|
906
|
+
repoRelPath: string;
|
|
907
|
+
remoteUrl: string;
|
|
908
|
+
integrationRef: string;
|
|
909
|
+
intendedSha: string;
|
|
910
|
+
expectedTip: string;
|
|
911
|
+
fenceRefName: string;
|
|
912
|
+
fenceRefSha: string;
|
|
913
|
+
owner: WorkspaceLeaseOwner;
|
|
914
|
+
fenceToken: bigint;
|
|
915
|
+
status: "pending" | "recorded" | "abandoned";
|
|
916
|
+
resolvedSha?: string;
|
|
917
|
+
resolution?: WorkspaceLandIntentResolution;
|
|
918
|
+
createdAt: string;
|
|
919
|
+
updatedAt: string;
|
|
920
|
+
resolvedAt?: string;
|
|
921
|
+
}
|
|
922
|
+
|
|
864
923
|
interface TaskMoveLanes {
|
|
865
924
|
readonly hold?: string;
|
|
866
925
|
readonly intake?: string;
|
|
@@ -4164,6 +4223,62 @@ interface ReconcileStaleSymbolLocksResult {
|
|
|
4164
4223
|
skipped: string[];
|
|
4165
4224
|
}
|
|
4166
4225
|
|
|
4226
|
+
declare function recordWorkspaceLandIntentAsync(store: TaskStore, input: {
|
|
4227
|
+
handle: WorkspaceLeaseHandle;
|
|
4228
|
+
taskId: string;
|
|
4229
|
+
repoRelPath: string;
|
|
4230
|
+
remoteUrl: string;
|
|
4231
|
+
integrationRef: string;
|
|
4232
|
+
intendedSha: string;
|
|
4233
|
+
expectedTip: string;
|
|
4234
|
+
}): Promise<void>;
|
|
4235
|
+
declare function listPendingWorkspaceLandIntentsAsync(store: TaskStore, filter?: {
|
|
4236
|
+
taskId?: string;
|
|
4237
|
+
repoRelPath?: string;
|
|
4238
|
+
limit?: number;
|
|
4239
|
+
}): Promise<WorkspaceLandIntent[]>;
|
|
4240
|
+
declare function resolveWorkspaceLandIntentAsync(store: TaskStore, input: {
|
|
4241
|
+
handle: WorkspaceLeaseHandle;
|
|
4242
|
+
taskId: string;
|
|
4243
|
+
repoRelPath: string;
|
|
4244
|
+
expectedIntentFenceToken: bigint;
|
|
4245
|
+
resolution: WorkspaceLandIntentResolution;
|
|
4246
|
+
resolvedSha?: string;
|
|
4247
|
+
persistLandedSha?: () => Promise<void>;
|
|
4248
|
+
}): Promise<{
|
|
4249
|
+
outcome: "missing";
|
|
4250
|
+
} | {
|
|
4251
|
+
outcome: "resolved";
|
|
4252
|
+
} | {
|
|
4253
|
+
outcome: "stale-intent";
|
|
4254
|
+
}>;
|
|
4255
|
+
declare function resolveOrphanedWorkspaceLandIntentAsync(store: TaskStore, input: {
|
|
4256
|
+
leaseKey: string;
|
|
4257
|
+
taskId: string;
|
|
4258
|
+
repoRelPath: string;
|
|
4259
|
+
expectedIntentFenceToken: bigint;
|
|
4260
|
+
resolution: WorkspaceLandIntentResolution;
|
|
4261
|
+
resolvedSha?: string;
|
|
4262
|
+
persistLandedSha?: () => Promise<void>;
|
|
4263
|
+
}): Promise<{
|
|
4264
|
+
outcome: "missing";
|
|
4265
|
+
} | {
|
|
4266
|
+
outcome: "resolved";
|
|
4267
|
+
} | {
|
|
4268
|
+
outcome: "stale-intent";
|
|
4269
|
+
} | {
|
|
4270
|
+
outcome: "lease-live";
|
|
4271
|
+
}>;
|
|
4272
|
+
declare function reclaimWorkspaceLeaseAsync(store: TaskStore, input: {
|
|
4273
|
+
leaseKey: string;
|
|
4274
|
+
expectedOwner: WorkspaceLeaseOwner;
|
|
4275
|
+
expectedFenceToken: bigint;
|
|
4276
|
+
requireTerminalOwner?: boolean;
|
|
4277
|
+
reason?: string;
|
|
4278
|
+
}): Promise<{
|
|
4279
|
+
outcome: WorkspaceLeaseReclaimOutcome;
|
|
4280
|
+
}>;
|
|
4281
|
+
|
|
4167
4282
|
declare const TASK_DELETE_CALLER_KINDS: readonly ["operator-ui", "operator-cli", "agent-tool", "engine", "api-unattributed"];
|
|
4168
4283
|
type TaskDeleteCallerKind = (typeof TASK_DELETE_CALLER_KINDS)[number];
|
|
4169
4284
|
interface TaskDeleteAuditContext {
|
|
@@ -4977,6 +5092,54 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
4977
5092
|
releaseSymbolLocks(symbols: readonly string[], ownerTaskId: string): Promise<ReleaseSymbolLocksResult>;
|
|
4978
5093
|
inspectSymbolLockConflicts(symbols: readonly string[]): Promise<SymbolLockConflict[]>;
|
|
4979
5094
|
reconcileStaleSymbolLocks(): Promise<ReconcileStaleSymbolLocksResult>;
|
|
5095
|
+
acquireWorkspaceLease(input: {
|
|
5096
|
+
leaseKey: string;
|
|
5097
|
+
kind: WorkspaceLeaseKind;
|
|
5098
|
+
owner: WorkspaceLeaseOwner;
|
|
5099
|
+
leaseMs: number;
|
|
5100
|
+
}): Promise<AcquireWorkspaceLeaseResult>;
|
|
5101
|
+
renewWorkspaceLease(handle: WorkspaceLeaseHandle, leaseMs: number): Promise<WorkspaceLeaseHandle | undefined>;
|
|
5102
|
+
releaseWorkspaceLease(handle: WorkspaceLeaseHandle): Promise<boolean>;
|
|
5103
|
+
withValidWorkspaceLease<T>(handle: WorkspaceLeaseHandle, fn: (tx: DbTransaction) => Promise<T>): Promise<T>;
|
|
5104
|
+
validateWorkspaceLeaseFence(input: {
|
|
5105
|
+
leaseKey: string;
|
|
5106
|
+
owner: WorkspaceLeaseOwner;
|
|
5107
|
+
fenceToken: bigint;
|
|
5108
|
+
}): Promise<"unknown" | "superseded" | "missing" | "valid">;
|
|
5109
|
+
recordWorkspaceLeaseFenceRef(input: {
|
|
5110
|
+
handle: WorkspaceLeaseHandle;
|
|
5111
|
+
fenceRefName: string;
|
|
5112
|
+
fenceRefSha: string;
|
|
5113
|
+
}): Promise<WorkspaceLeaseHandle>;
|
|
5114
|
+
inspectWorkspaceLeases(filter?: {
|
|
5115
|
+
taskId?: string;
|
|
5116
|
+
leaseKeys?: string[];
|
|
5117
|
+
}): Promise<WorkspaceLease[]>;
|
|
5118
|
+
reclaimWorkspaceLease(input: Parameters<typeof reclaimWorkspaceLeaseAsync>[1]): Promise<{
|
|
5119
|
+
outcome: WorkspaceLeaseReclaimOutcome;
|
|
5120
|
+
}>;
|
|
5121
|
+
reconcileExpiredWorkspaceLeases(): Promise<string[]>;
|
|
5122
|
+
releaseStaleWorkspaceLeasesForNode(nodeId: string, options: {
|
|
5123
|
+
currentIncarnationId: string;
|
|
5124
|
+
}): Promise<string[]>;
|
|
5125
|
+
recordWorkspaceLandIntent(input: Parameters<typeof recordWorkspaceLandIntentAsync>[1]): Promise<void>;
|
|
5126
|
+
listPendingWorkspaceLandIntents(filter?: Parameters<typeof listPendingWorkspaceLandIntentsAsync>[1]): Promise<WorkspaceLandIntent[]>;
|
|
5127
|
+
resolveWorkspaceLandIntent(input: Parameters<typeof resolveWorkspaceLandIntentAsync>[1]): Promise<{
|
|
5128
|
+
outcome: "missing";
|
|
5129
|
+
} | {
|
|
5130
|
+
outcome: "resolved";
|
|
5131
|
+
} | {
|
|
5132
|
+
outcome: "stale-intent";
|
|
5133
|
+
}>;
|
|
5134
|
+
resolveOrphanedWorkspaceLandIntent(input: Parameters<typeof resolveOrphanedWorkspaceLandIntentAsync>[1]): Promise<{
|
|
5135
|
+
outcome: "missing";
|
|
5136
|
+
} | {
|
|
5137
|
+
outcome: "resolved";
|
|
5138
|
+
} | {
|
|
5139
|
+
outcome: "stale-intent";
|
|
5140
|
+
} | {
|
|
5141
|
+
outcome: "lease-live";
|
|
5142
|
+
}>;
|
|
4980
5143
|
resolveTaskSymbols(taskId: string): Promise<TaskSymbolResolution>;
|
|
4981
5144
|
resolveTaskSymbolsForWorkItem(workItem: Pick<WorkflowWorkItem, "taskId">): Promise<TaskSymbolResolution>;
|
|
4982
5145
|
setTaskDeclaredSymbols(taskId: string, symbols: readonly string[]): Promise<Task>;
|
|
@@ -5164,6 +5327,13 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
5164
5327
|
status?: BranchGroup["status"];
|
|
5165
5328
|
}): Promise<BranchGroup>;
|
|
5166
5329
|
getTaskColumns(ids: string[]): Promise<Map<string, Column>>;
|
|
5330
|
+
findTaskByProposalClaimId(proposalClaimId: string, options?: {
|
|
5331
|
+
includeDeleted?: boolean;
|
|
5332
|
+
}): Promise<Task | null>;
|
|
5333
|
+
listTasksBySourceLineage(input: {
|
|
5334
|
+
sourceAgentId?: string | null;
|
|
5335
|
+
sourceParentTaskId?: string | null;
|
|
5336
|
+
}): Promise<Task[]>;
|
|
5167
5337
|
listTasks(options?: {
|
|
5168
5338
|
limit?: number;
|
|
5169
5339
|
offset?: number;
|
|
@@ -5487,6 +5657,10 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
5487
5657
|
markToolFailureRetryExhaustedAudit(taskId: string): Promise<boolean>;
|
|
5488
5658
|
updateTaskAtomic(id: string, updater: (current: Task) => Parameters<TaskStore["updateTask"]>[1] | null | undefined | Promise<Parameters<TaskStore["updateTask"]>[1] | null | undefined>, runContext?: RunMutationContext): Promise<Task>;
|
|
5489
5659
|
linkTaskRecommendation(id: string, recommendationId: string, createdTaskId: string, completeColumns?: ReadonlySet<string>): Promise<Task>;
|
|
5660
|
+
mergeWorkspaceWorktreeEntry(id: string, repoRelPath: string, patch: Partial<WorkspaceWorktreeEntry>, options?: {
|
|
5661
|
+
requireExistingEntry?: boolean;
|
|
5662
|
+
clearSingularWorktree?: boolean;
|
|
5663
|
+
}): Promise<Task>;
|
|
5490
5664
|
resolveTaskWedgeNotificationEpisode(id: string, episodeId: string): Promise<{
|
|
5491
5665
|
task: Task;
|
|
5492
5666
|
resolved: boolean;
|
|
@@ -5706,10 +5880,12 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
5706
5880
|
archiveTask(id: string, optionsOrCleanup?: boolean | {
|
|
5707
5881
|
cleanup?: boolean;
|
|
5708
5882
|
removeLineageReferences?: boolean;
|
|
5883
|
+
liveExecutionGuard?: "refuse" | "off";
|
|
5709
5884
|
}): Promise<Task>;
|
|
5710
5885
|
archiveTaskBackend(id: string, optionsOrCleanup: boolean | {
|
|
5711
5886
|
cleanup?: boolean;
|
|
5712
5887
|
removeLineageReferences?: boolean;
|
|
5888
|
+
liveExecutionGuard?: "refuse" | "off";
|
|
5713
5889
|
}): Promise<Task>;
|
|
5714
5890
|
archiveTaskAndCleanup(id: string): Promise<Task>;
|
|
5715
5891
|
resolveUnarchiveTargetColumn(preArchiveColumn: unknown, taskId?: string): Promise<Column>;
|
|
@@ -7365,6 +7541,18 @@ interface TaskReleaseGateVerdict {
|
|
|
7365
7541
|
evaluatedAt: string;
|
|
7366
7542
|
evaluatedForUpdatedAt?: string;
|
|
7367
7543
|
}
|
|
7544
|
+
interface WorkspaceWorktreeEntry {
|
|
7545
|
+
worktreePath: string;
|
|
7546
|
+
branch: string;
|
|
7547
|
+
baseCommitSha?: string;
|
|
7548
|
+
landedSha?: string;
|
|
7549
|
+
revertBoundarySha?: string;
|
|
7550
|
+
landFailure?: {
|
|
7551
|
+
message: string;
|
|
7552
|
+
at: string;
|
|
7553
|
+
branch?: string;
|
|
7554
|
+
};
|
|
7555
|
+
}
|
|
7368
7556
|
interface Task {
|
|
7369
7557
|
id: string;
|
|
7370
7558
|
lineageId?: string;
|
|
@@ -7378,12 +7566,7 @@ interface Task {
|
|
|
7378
7566
|
breakIntoSubtasks?: boolean;
|
|
7379
7567
|
noCommitsExpected?: boolean;
|
|
7380
7568
|
worktree?: string;
|
|
7381
|
-
workspaceWorktrees?: Record<string,
|
|
7382
|
-
worktreePath: string;
|
|
7383
|
-
branch: string;
|
|
7384
|
-
baseCommitSha?: string;
|
|
7385
|
-
landedSha?: string;
|
|
7386
|
-
}>;
|
|
7569
|
+
workspaceWorktrees?: Record<string, WorkspaceWorktreeEntry>;
|
|
7387
7570
|
steps: TaskStep[];
|
|
7388
7571
|
currentStep: number;
|
|
7389
7572
|
customFields?: Record<string, unknown>;
|
|
@@ -7836,6 +8019,7 @@ interface GlobalSettings {
|
|
|
7836
8019
|
dashboardKeyboardShortcuts?: DashboardKeyboardShortcuts;
|
|
7837
8020
|
dismissModalsOnOutsideClick?: boolean;
|
|
7838
8021
|
skipConfirmationDialogs?: boolean;
|
|
8022
|
+
quickAddSubmitOnEnter?: boolean;
|
|
7839
8023
|
language?: Locale;
|
|
7840
8024
|
defaultProvider?: string;
|
|
7841
8025
|
defaultCredentialInstanceId?: string;
|
|
@@ -8182,9 +8366,6 @@ interface ProjectSettings {
|
|
|
8182
8366
|
mergeConflictStrategy?: MergeConflictStrategy;
|
|
8183
8367
|
maxAutoMergeRetries?: number;
|
|
8184
8368
|
merger?: MergerSettings;
|
|
8185
|
-
mergeDiffVolumeMinLines?: number;
|
|
8186
|
-
mergeDiffVolumeThreshold?: number;
|
|
8187
|
-
mergeDiffVolumeAllowlist?: string[];
|
|
8188
8369
|
requiredChecks?: string[];
|
|
8189
8370
|
mergeStrategyOverlapBehavior?: MergeStrategyOverlapBehavior;
|
|
8190
8371
|
postMergeAuditMode?: PostMergeAuditMode;
|
package/dist/plugin-sdk/index.js
CHANGED
|
@@ -5777,7 +5777,9 @@ __export(project_exports, {
|
|
|
5777
5777
|
workflowSettings: () => workflowSettings,
|
|
5778
5778
|
workflowSteps: () => workflowSteps,
|
|
5779
5779
|
workflowWorkItems: () => workflowWorkItems,
|
|
5780
|
-
workflows: () => workflows
|
|
5780
|
+
workflows: () => workflows,
|
|
5781
|
+
workspaceCoordinationLeases: () => workspaceCoordinationLeases,
|
|
5782
|
+
workspaceLandIntents: () => workspaceLandIntents
|
|
5781
5783
|
});
|
|
5782
5784
|
var projectSchema = pgSchema(PROJECT_SCHEMA);
|
|
5783
5785
|
var tasks = projectSchema.table("tasks", {
|
|
@@ -6044,6 +6046,9 @@ var tasks = projectSchema.table("tasks", {
|
|
|
6044
6046
|
the gate is a full tasks-table scan. Sparse: most rows have NULL parent.
|
|
6045
6047
|
*/
|
|
6046
6048
|
index("idxTasksSourceParentTaskId").on(t.sourceParentTaskId),
|
|
6049
|
+
/* FNXC:TaskRecommendations 2026-08-13-22:23: duplicate intake filters source
|
|
6050
|
+
* lineage on recommendation/agent creates; this sparse index avoids a task-table scan. */
|
|
6051
|
+
index("idxTasksProjectSourceAgentId").on(t.projectId, t.sourceAgentId).where(sql`${t.sourceAgentId} IS NOT NULL`),
|
|
6047
6052
|
// FNXC:EphemeralAgentTaskCreation 2026-07-30-12:00: proposal retries share one stable key, so the database—not a read-before-create race—enforces at-most-once materialization.
|
|
6048
6053
|
uniqueIndex("uqTasksProjectProposalClaimId").on(t.projectId, t.proposalClaimId).where(sql`${t.proposalClaimId} IS NOT NULL`),
|
|
6049
6054
|
/*
|
|
@@ -6278,6 +6283,52 @@ var distributedTaskIdReservations = projectSchema.table("distributed_task_id_res
|
|
|
6278
6283
|
index("idxDistributedTaskIdReservationsPrefixStatus").on(t.prefix, t.status),
|
|
6279
6284
|
index("idxDistributedTaskIdReservationsExpiry").on(t.status, t.expiresAt)
|
|
6280
6285
|
]);
|
|
6286
|
+
var workspaceCoordinationLeases = projectSchema.table("workspace_coordination_leases", {
|
|
6287
|
+
projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
|
|
6288
|
+
leaseKey: text("lease_key").notNull(),
|
|
6289
|
+
kind: text("kind").notNull(),
|
|
6290
|
+
ownerTaskId: text("owner_task_id").notNull(),
|
|
6291
|
+
ownerNodeId: text("owner_node_id").notNull(),
|
|
6292
|
+
ownerIncarnationId: text("owner_incarnation_id").notNull(),
|
|
6293
|
+
ownerRunId: text("owner_run_id"),
|
|
6294
|
+
fenceToken: bigint("fence_token", { mode: "bigint" }).notNull().default(sql`0`),
|
|
6295
|
+
fenceRefName: text("fence_ref_name"),
|
|
6296
|
+
fenceRefSha: text("fence_ref_sha"),
|
|
6297
|
+
status: text("status").notNull(),
|
|
6298
|
+
acquiredAt: text("acquired_at").notNull(),
|
|
6299
|
+
renewedAt: text("renewed_at").notNull(),
|
|
6300
|
+
expiresAt: text("expires_at").notNull(),
|
|
6301
|
+
createdAt: text("created_at").notNull(),
|
|
6302
|
+
updatedAt: text("updated_at").notNull()
|
|
6303
|
+
}, (t) => [
|
|
6304
|
+
primaryKey({ columns: [t.projectId, t.leaseKey] }),
|
|
6305
|
+
check("workspace_coordination_leases_kind_check", sql`${t.kind} IN ('acquire', 'land', 'merge-dispatch')`),
|
|
6306
|
+
check("workspace_coordination_leases_status_check", sql`${t.status} IN ('held', 'released', 'expired')`),
|
|
6307
|
+
index("idxWorkspaceCoordinationLeasesOwnerTask").on(t.projectId, t.ownerTaskId),
|
|
6308
|
+
index("idxWorkspaceCoordinationLeasesOwnerNode").on(t.projectId, t.ownerNodeId),
|
|
6309
|
+
index("idxWorkspaceCoordinationLeasesExpiry").on(t.status, t.expiresAt)
|
|
6310
|
+
]);
|
|
6311
|
+
var workspaceLandIntents = projectSchema.table("workspace_land_intents", {
|
|
6312
|
+
projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
|
|
6313
|
+
taskId: text("task_id").notNull(),
|
|
6314
|
+
repoRelPath: text("repo_rel_path").notNull(),
|
|
6315
|
+
remoteUrl: text("remote_url").notNull(),
|
|
6316
|
+
integrationRef: text("integration_ref").notNull(),
|
|
6317
|
+
intendedSha: text("intended_sha").notNull(),
|
|
6318
|
+
expectedTip: text("expected_tip").notNull(),
|
|
6319
|
+
fenceRefName: text("fence_ref_name").notNull(),
|
|
6320
|
+
fenceRefSha: text("fence_ref_sha").notNull(),
|
|
6321
|
+
ownerTaskId: text("owner_task_id").notNull(),
|
|
6322
|
+
ownerNodeId: text("owner_node_id").notNull(),
|
|
6323
|
+
ownerIncarnationId: text("owner_incarnation_id").notNull(),
|
|
6324
|
+
fenceToken: bigint("fence_token", { mode: "bigint" }).notNull(),
|
|
6325
|
+
status: text("status").notNull(),
|
|
6326
|
+
resolvedSha: text("resolved_sha"),
|
|
6327
|
+
resolution: text("resolution"),
|
|
6328
|
+
createdAt: text("created_at").notNull(),
|
|
6329
|
+
updatedAt: text("updated_at").notNull(),
|
|
6330
|
+
resolvedAt: text("resolved_at")
|
|
6331
|
+
}, (t) => [primaryKey({ columns: [t.projectId, t.taskId, t.repoRelPath] }), check("workspace_land_intents_status_check", sql`${t.status} IN ('pending', 'recorded', 'abandoned')`), check("workspace_land_intents_resolution_check", sql`${t.resolution} IS NULL OR ${t.resolution} IN ('landed', 'not-landed')`), index("idxWorkspaceLandIntentsStatus").on(t.projectId, t.status)]);
|
|
6281
6332
|
var symbolLocks = projectSchema.table("symbol_locks", {
|
|
6282
6333
|
projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
|
|
6283
6334
|
symbolKey: text("symbol_key").notNull(),
|
|
@@ -8852,6 +8903,11 @@ var DEFAULT_GLOBAL_SETTINGS = {
|
|
|
8852
8903
|
Critical-action confirmation dialogs stay enabled by default. This global-only preference may opt an operator into primary/default auto-approval, but project settings cannot enable it for collaborators.
|
|
8853
8904
|
*/
|
|
8854
8905
|
skipConfirmationDialogs: false,
|
|
8906
|
+
/*
|
|
8907
|
+
FNXC:QuickEntry 2026-08-16-03:15:
|
|
8908
|
+
Quick Add keeps its historical Enter-to-submit behavior by default; only an operator's global preference may opt into newline-first entry.
|
|
8909
|
+
*/
|
|
8910
|
+
quickAddSubmitOnEnter: true,
|
|
8855
8911
|
language: void 0,
|
|
8856
8912
|
defaultProvider: void 0,
|
|
8857
8913
|
defaultCredentialInstanceId: void 0,
|
|
@@ -9314,9 +9370,6 @@ var DEFAULT_PROJECT_SETTINGS = {
|
|
|
9314
9370
|
* 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.
|
|
9315
9371
|
*/
|
|
9316
9372
|
merger: { mode: "ai", maxReviewPasses: 3, allowDirtyLocalCheckoutSync: true },
|
|
9317
|
-
mergeDiffVolumeMinLines: void 0,
|
|
9318
|
-
mergeDiffVolumeThreshold: void 0,
|
|
9319
|
-
mergeDiffVolumeAllowlist: void 0,
|
|
9320
9373
|
requiredChecks: void 0,
|
|
9321
9374
|
mergeStrategyOverlapBehavior: "flip-to-prefer-branch",
|
|
9322
9375
|
postMergeAuditMode: "warn",
|
|
@@ -17967,10 +18020,6 @@ var AgentStore = class _AgentStore extends EventEmitter {
|
|
|
17967
18020
|
};
|
|
17968
18021
|
await this.writeAgent(updated);
|
|
17969
18022
|
this.emit("agent:stateChanged", agentId, currentState, newState);
|
|
17970
|
-
if (this.asyncLayer) try {
|
|
17971
|
-
await appendAgentActivityEvent(this.asyncLayer, { type: "agent:state-changed", attributionClaim: resolveAgentActivityAttribution([{ id: agentId, provenance: "roster" }], "executor"), taskId: updated.taskId, occurredAt: updated.updatedAt, discriminator: updated.updatedAt, metadata: { fromState: currentState, toState: newState, source: "update" } });
|
|
17972
|
-
} catch {
|
|
17973
|
-
}
|
|
17974
18023
|
this.emit("agent:updated", updated, currentState);
|
|
17975
18024
|
return updated;
|
|
17976
18025
|
});
|
|
@@ -18462,10 +18511,10 @@ var AgentStore = class _AgentStore extends EventEmitter {
|
|
|
18462
18511
|
return agents2;
|
|
18463
18512
|
}
|
|
18464
18513
|
/*
|
|
18465
|
-
FNXC:MemoryAgent 2026-08-
|
|
18466
|
-
Memory Keeper is custom because it is not a workflow-stage principal.
|
|
18467
|
-
|
|
18468
|
-
|
|
18514
|
+
FNXC:MemoryAgent 2026-08-16-02:31:
|
|
18515
|
+
Memory Keeper is custom because it is not a workflow-stage principal. Its heartbeat defaults off
|
|
18516
|
+
until an operator opts in, while auto-claim remains off because it only maintains memory. This
|
|
18517
|
+
runs during init, where createAgent name collisions would abort startup; preflight probes,
|
|
18469
18518
|
a fallback name, a null degraded result, and the init-side catch keep an operator's same-named
|
|
18470
18519
|
agent untouched and the project runnable.
|
|
18471
18520
|
*/
|
|
@@ -18491,7 +18540,13 @@ var AgentStore = class _AgentStore extends EventEmitter {
|
|
|
18491
18540
|
roles: [...BUILTIN_MEMORY_AGENT_DEFAULT.roles],
|
|
18492
18541
|
title: BUILTIN_MEMORY_AGENT_DEFAULT.title,
|
|
18493
18542
|
metadata: { [BUILTIN_MEMORY_AGENT_PROVENANCE_KEY]: true },
|
|
18494
|
-
|
|
18543
|
+
/*
|
|
18544
|
+
FNXC:MemoryAgent 2026-08-16-02:31:
|
|
18545
|
+
Memory consolidation is opt-in: newly provisioned Memory Keepers must not begin
|
|
18546
|
+
hourly autonomous heartbeats until an operator enables the existing heartbeat toggle.
|
|
18547
|
+
Keep auto-claim off and the one-hour interval ready for that later opt-in.
|
|
18548
|
+
*/
|
|
18549
|
+
runtimeConfig: { enabled: false, autoClaimRelevantTasks: false, heartbeatIntervalMs: 36e5 },
|
|
18495
18550
|
instructionsText: BUILTIN_MEMORY_AGENT_DEFAULT.instructionsText,
|
|
18496
18551
|
soul: BUILTIN_MEMORY_AGENT_DEFAULT.soul,
|
|
18497
18552
|
bundleConfig: { ...BUILTIN_MEMORY_AGENT_DEFAULT.bundleConfig, files: [...BUILTIN_MEMORY_AGENT_DEFAULT.bundleConfig.files] }
|
|
@@ -18506,7 +18561,9 @@ var AgentStore = class _AgentStore extends EventEmitter {
|
|
|
18506
18561
|
return owner;
|
|
18507
18562
|
}
|
|
18508
18563
|
const metadata = { ...owner.metadata ?? {}, [BUILTIN_MEMORY_AGENT_PROVENANCE_KEY]: true };
|
|
18509
|
-
const
|
|
18564
|
+
const currentRuntimeConfig = owner.runtimeConfig ?? {};
|
|
18565
|
+
const enabled = typeof currentRuntimeConfig.enabled === "boolean" ? currentRuntimeConfig.enabled : false;
|
|
18566
|
+
const runtimeConfig = currentRuntimeConfig.enabled === enabled && currentRuntimeConfig.autoClaimRelevantTasks === false && currentRuntimeConfig.heartbeatIntervalMs === DEFAULT_AGENT_HEARTBEAT_INTERVAL_MS ? currentRuntimeConfig : { ...currentRuntimeConfig, enabled, autoClaimRelevantTasks: false, heartbeatIntervalMs: DEFAULT_AGENT_HEARTBEAT_INTERVAL_MS };
|
|
18510
18567
|
const updates = {
|
|
18511
18568
|
roles: [...BUILTIN_MEMORY_AGENT_DEFAULT.roles],
|
|
18512
18569
|
role: "custom",
|
|
@@ -18516,7 +18573,9 @@ var AgentStore = class _AgentStore extends EventEmitter {
|
|
|
18516
18573
|
instructionsText: owner.instructionsText?.trim() ? owner.instructionsText : BUILTIN_MEMORY_AGENT_DEFAULT.instructionsText,
|
|
18517
18574
|
soul: owner.soul?.trim() ? owner.soul : BUILTIN_MEMORY_AGENT_DEFAULT.soul
|
|
18518
18575
|
};
|
|
18519
|
-
|
|
18576
|
+
const nextOwner = { ...owner, ...updates };
|
|
18577
|
+
if (JSON.stringify(nextOwner) === JSON.stringify(owner)) return owner;
|
|
18578
|
+
owner = { ...nextOwner, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
18520
18579
|
await this.writeAgent(owner, executor);
|
|
18521
18580
|
return owner;
|
|
18522
18581
|
};
|
|
@@ -19388,19 +19447,6 @@ var AgentStore = class _AgentStore extends EventEmitter {
|
|
|
19388
19447
|
this.agentSnapshotCache.set(agent.id, this.watchSnapshotOf(agent));
|
|
19389
19448
|
if (stateChanged) {
|
|
19390
19449
|
this.emit("agent:stateChanged", agent.id, previousState, agent.state);
|
|
19391
|
-
if (this.asyncLayer) {
|
|
19392
|
-
try {
|
|
19393
|
-
await appendAgentActivityEvent(this.asyncLayer, {
|
|
19394
|
-
type: "agent:state-changed",
|
|
19395
|
-
attributionClaim: resolveAgentActivityAttribution([{ id: agent.id, provenance: "roster" }], "executor"),
|
|
19396
|
-
taskId: agent.taskId,
|
|
19397
|
-
occurredAt: agent.updatedAt,
|
|
19398
|
-
discriminator: agent.updatedAt,
|
|
19399
|
-
metadata: { fromState: previousState, toState: agent.state, source: "reconciliation" }
|
|
19400
|
-
});
|
|
19401
|
-
} catch {
|
|
19402
|
-
}
|
|
19403
|
-
}
|
|
19404
19450
|
this.emit("agent:updated", agent, previousState);
|
|
19405
19451
|
} else {
|
|
19406
19452
|
this.emit("agent:updated", agent);
|