@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.
Files changed (175) hide show
  1. package/dist/bin.js +13802 -9587
  2. package/dist/child-process-worker.js +6472 -4028
  3. package/dist/client/.vite/manifest.json +280 -269
  4. package/dist/client/assets/AgentDetailView-0G9qFd4j.js +13 -0
  5. package/dist/client/assets/{AgentDetailView-Cc3ATg8a.css → AgentDetailView-jzgy1BAS.css} +1 -1
  6. package/dist/client/assets/{AgentPermissionPolicyEditor--u9jyUf2.js → AgentPermissionPolicyEditor-BM68g7wo.js} +1 -1
  7. package/dist/client/assets/AgentsView-DkOUZWw4.js +24 -0
  8. package/dist/client/assets/ChatView-BPSm2JIH.js +13 -0
  9. package/dist/client/assets/{CommandCenter-CSRYoveB.js → CommandCenter-DxRSFWNc.js} +26 -26
  10. package/dist/client/assets/CommandCenter-ilm-DbtI.css +1 -0
  11. package/dist/client/assets/{DevServerView-B9So_oYx.js → DevServerView-DO-bqJFE.js} +1 -1
  12. package/dist/client/assets/{DirectoryPicker-BhyDL_2m.js → DirectoryPicker-Cp2gddTE.js} +1 -1
  13. package/dist/client/assets/DocumentsView-D0E-3G96.js +1 -0
  14. package/dist/client/assets/EvalsView-BoFVq5hw.js +1 -0
  15. package/dist/client/assets/ExperimentalAgentOnboardingModal-CS1Sdogm.js +1 -0
  16. package/dist/client/assets/{GoalsView-B6X5_0Ve.js → GoalsView-sybf7JY4.js} +1 -1
  17. package/dist/client/assets/InsightsView-nHa7aShn.js +11 -0
  18. package/dist/client/assets/{MemoryView-DN_3IFmA.css → MemoryView-CdpQqPJJ.css} +1 -1
  19. package/dist/client/assets/MemoryView-D0IG44za.js +3 -0
  20. package/dist/client/assets/{PiExtensionsManager-B8At6fO8.js → PiExtensionsManager-CU76weJe.js} +2 -2
  21. package/dist/client/assets/PluginManager-DyT8XbcG.js +1 -0
  22. package/dist/client/assets/{PullRequestView-B1hZFrWo.js → PullRequestView-CnxWUSen.js} +2 -2
  23. package/dist/client/assets/{ReportModal-C46V_zEa.js → ReportModal-CMrmMQjD.js} +5 -5
  24. package/dist/client/assets/{ResearchView-D8G85BYN.js → ResearchView-BTytQSgy.js} +2 -2
  25. package/dist/client/assets/{SecretsView-CTri9LRK.js → SecretsView-BuSH5J87.js} +1 -1
  26. package/dist/client/assets/SessionTerminal-D04kYRrT.js +2 -0
  27. package/dist/client/assets/SettingsModal-C0FY8MPW.css +1 -0
  28. package/dist/client/assets/{SettingsModal-rUQcSTJp.js → SettingsModal-Dm-ngbRr.js} +1 -1
  29. package/dist/client/assets/{SettingsModal-DmfMotcd.css → SettingsModal-Ds0Yj47X.css} +1 -1
  30. package/dist/client/assets/SettingsModal-xSLhH7Tr.js +21 -0
  31. package/dist/client/assets/{SettingsTextareaRow-BirlBcem.js → SettingsTextareaRow-CHPgocEp.js} +1 -1
  32. package/dist/client/assets/{SetupWizardModal-xnCBM9EL.js → SetupWizardModal-y88aXNIQ.js} +2 -2
  33. package/dist/client/assets/{SkillsView-O5U0ep50.js → SkillsView-CYyQW1Hv.js} +1 -1
  34. package/dist/client/assets/{WorkflowNodeEditor-BX4d2qqF.js → WorkflowNodeEditor-hYeoz1X8.js} +3 -3
  35. package/dist/client/assets/{agent-import-generation-DnqVkPkz.js → agent-import-generation-CjiYXzCr.js} +1 -1
  36. package/dist/client/assets/agentsOrgChartLayout-C0UP_X3z.js +1 -0
  37. package/dist/client/assets/app-BgpuMvTU.js +13 -0
  38. package/dist/client/assets/app-BlexHhbW.js +13 -0
  39. package/dist/client/assets/app-BsuUOR0P.js +13 -0
  40. package/dist/client/assets/app-DQVOujmO.js +13 -0
  41. package/dist/client/assets/app-DjyTRx1N.js +5 -0
  42. package/dist/client/assets/app-Dniggype.js +13 -0
  43. package/dist/client/assets/app-EV-lyZ0T.js +5 -0
  44. package/dist/client/assets/{architectureDiagram-3BPJPVTR-gi467xY0.js → architectureDiagram-3BPJPVTR-Dd6GPcqM.js} +1 -1
  45. package/dist/client/assets/{blockDiagram-GPEHLZMM-B_gpcYiR.js → blockDiagram-GPEHLZMM-CC6pLxlz.js} +1 -1
  46. package/dist/client/assets/{c4Diagram-AAUBKEIU-DeylEYsQ.js → c4Diagram-AAUBKEIU-DxMP_l6y.js} +1 -1
  47. package/dist/client/assets/channel-DlCEMoEf.js +1 -0
  48. package/dist/client/assets/{chunk-2J33WTMH-BL2WY0HN.js → chunk-2J33WTMH-BKYToL43.js} +1 -1
  49. package/dist/client/assets/{chunk-4BX2VUAB-BkLExGMe.js → chunk-4BX2VUAB-Bg6rjQb3.js} +1 -1
  50. package/dist/client/assets/{chunk-55IACEB6-CSTvCF5T.js → chunk-55IACEB6-CPUwbbGa.js} +1 -1
  51. package/dist/client/assets/{chunk-727SXJPM-9J8pKk4x.js → chunk-727SXJPM-DScQBCvv.js} +1 -1
  52. package/dist/client/assets/{chunk-AQP2D5EJ-DXC1vPWr.js → chunk-AQP2D5EJ-DbX7uaXK.js} +1 -1
  53. package/dist/client/assets/{chunk-FMBD7UC4-CFRUb-zD.js → chunk-FMBD7UC4-DvYKea1c.js} +1 -1
  54. package/dist/client/assets/{chunk-ND2GUHAM-B87HFYS8.js → chunk-ND2GUHAM-CH-Tvw7w.js} +1 -1
  55. package/dist/client/assets/{chunk-QZHKN3VN-CTjHiGbd.js → chunk-QZHKN3VN-CbyEvOoM.js} +1 -1
  56. package/dist/client/assets/classDiagram-4FO5ZUOK-Bc92O8Ks.js +1 -0
  57. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Bc92O8Ks.js +1 -0
  58. package/dist/client/assets/{cose-bilkent-S5V4N54A-D3Edq3L9.js → cose-bilkent-S5V4N54A-BPB5fV3A.js} +1 -1
  59. package/dist/client/assets/{dagre-BM42HDAG-CwwbeQfN.js → dagre-BM42HDAG-CilYJ3rR.js} +1 -1
  60. package/dist/client/assets/{dashboard-view-QxQwJFLz.js → dashboard-view-BnGe8cWo.js} +1 -1
  61. package/dist/client/assets/{dashboard-view-BLAoW3D4.js → dashboard-view-DnVf3tmI.js} +1 -1
  62. package/dist/client/assets/{dashboard-view-DAlJxqiJ.js → dashboard-view-DoLU6FxZ.js} +1 -1
  63. package/dist/client/assets/{dashboard-view-aPzfv99T.js → dashboard-view-dChSM_So.js} +1 -1
  64. package/dist/client/assets/{diagram-2AECGRRQ-koJWWXE4.js → diagram-2AECGRRQ-m9u1Qhyx.js} +1 -1
  65. package/dist/client/assets/{diagram-5GNKFQAL-Yob5cOKT.js → diagram-5GNKFQAL-DVr7Kf0N.js} +1 -1
  66. package/dist/client/assets/{diagram-KO2AKTUF-DelvFSkK.js → diagram-KO2AKTUF-D7sgJDFx.js} +1 -1
  67. package/dist/client/assets/{diagram-LMA3HP47-CMput2h2.js → diagram-LMA3HP47-DNKNDS6r.js} +1 -1
  68. package/dist/client/assets/{diagram-OG6HWLK6-04VXDl79.js → diagram-OG6HWLK6-1Bff4FWn.js} +1 -1
  69. package/dist/client/assets/{erDiagram-TEJ5UH35-C9iP8Uyp.js → erDiagram-TEJ5UH35-DGua1UHN.js} +1 -1
  70. package/dist/client/assets/{flowDiagram-I6XJVG4X-DENQvu_t.js → flowDiagram-I6XJVG4X-UDfDtwsE.js} +1 -1
  71. package/dist/client/assets/{folder-open-D-554oji.js → folder-open-CteOypVk.js} +1 -1
  72. package/dist/client/assets/{ganttDiagram-6RSMTGT7-BqOttZAT.js → ganttDiagram-6RSMTGT7-COdmD328.js} +1 -1
  73. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CDcydi-5.js → gitGraphDiagram-PVQCEYII-SUSls7Kw.js} +1 -1
  74. package/dist/client/assets/index-0ovTXt3t.css +1 -0
  75. package/dist/client/assets/index-DpCHwyiD.js +2818 -0
  76. package/dist/client/assets/{infoDiagram-5YYISTIA-B5LQQnxt.js → infoDiagram-5YYISTIA-e_DloXj7.js} +1 -1
  77. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DpFEt7D2.js → ishikawaDiagram-YF4QCWOH-DVWqihXg.js} +1 -1
  78. package/dist/client/assets/{journeyDiagram-JHISSGLW-MELtgu22.js → journeyDiagram-JHISSGLW-BcPY-XP0.js} +1 -1
  79. package/dist/client/assets/{kanban-definition-UN3LZRKU-h33PLATd.js → kanban-definition-UN3LZRKU-BCFG2Jle.js} +1 -1
  80. package/dist/client/assets/{mermaid.core-Dk2mUPOq.js → mermaid.core-5yPje9Bi.js} +4 -4
  81. package/dist/client/assets/{mindmap-definition-RKZ34NQL-B_T4O2-B.js → mindmap-definition-RKZ34NQL-DDApeT3K.js} +1 -1
  82. package/dist/client/assets/{pieDiagram-4H26LBE5-B1YIFkRl.js → pieDiagram-4H26LBE5-N61_jyeP.js} +1 -1
  83. package/dist/client/assets/{puzzle-hvecxlpJ.js → puzzle-BkaCP30D.js} +1 -1
  84. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BoGQR_hO.js → quadrantDiagram-W4KKPZXB-C5qHiApF.js} +1 -1
  85. package/dist/client/assets/{requirementDiagram-4Y6WPE33-BSDmUBIx.js → requirementDiagram-4Y6WPE33-C71okgzt.js} +1 -1
  86. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Dz_GqOa5.js → sankeyDiagram-5OEKKPKP-B2iKyLjB.js} +1 -1
  87. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B6twjYUH.js → sequenceDiagram-3UESZ5HK-DfdoYKKk.js} +1 -1
  88. package/dist/client/assets/{shield-alert-BX4WRJOv.js → shield-alert-BNSeDB8l.js} +1 -1
  89. package/dist/client/assets/standing-instructions-template-pZtzo1lK.js +20 -0
  90. package/dist/client/assets/standing-instructions-template-w7Ouw_37.css +1 -0
  91. package/dist/client/assets/{stateDiagram-AJRCARHV-DuwqWLx-.js → stateDiagram-AJRCARHV-lS-sUi12.js} +1 -1
  92. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Bu8Sk187.js → stateDiagram-v2-BHNVJYJU-DXJNDrV9.js} +1 -1
  93. package/dist/client/assets/{timeline-definition-PNZ67QCA-BS6VnqSI.js → timeline-definition-PNZ67QCA-CCwvX81K.js} +1 -1
  94. package/dist/client/assets/{upload-CaDoyaMW.js → upload-CDovVbu2.js} +1 -1
  95. package/dist/client/assets/useDiscoveredSkillsCache-BYqP-afh.js +1 -0
  96. package/dist/client/assets/{users-C5uCLwVM.js → users-CTqECGLo.js} +1 -1
  97. package/dist/client/assets/{vennDiagram-CIIHVFJN-CUbzqT5Y.js → vennDiagram-CIIHVFJN-DaiR5nv9.js} +1 -1
  98. package/dist/client/assets/{wardley-L42UT6IY-Mv-NotFS.js → wardley-L42UT6IY-hA5IHyPW.js} +1 -1
  99. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DuYpvLZX.js → wardleyDiagram-YWT4CUSO-CILUNESc.js} +1 -1
  100. package/dist/client/assets/{xychartDiagram-2RQKCTM6-24_7QXdw.js → xychartDiagram-2RQKCTM6-72eNMmjz.js} +1 -1
  101. package/dist/client/index.html +2 -2
  102. package/dist/client/version.json +1 -1
  103. package/dist/droid-cli/package.json +1 -1
  104. package/dist/extension.js +10671 -6904
  105. package/dist/migrations/0059_fn_9037_tasks_source_agent_index.sql +3 -0
  106. package/dist/migrations/0060_fn_9059_workspace_coordination_leases.sql +10 -0
  107. package/dist/pi-claude-cli/package.json +1 -1
  108. package/dist/plugin-sdk/index.d.ts +190 -9
  109. package/dist/plugin-sdk/index.js +74 -28
  110. package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +83 -29
  111. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  112. package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +83 -29
  113. package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
  114. package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +74 -28
  115. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  116. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +74 -28
  117. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  118. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +1096 -73
  119. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  120. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +74 -28
  121. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  122. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +74 -28
  123. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  124. package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +83 -29
  125. package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
  126. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +302 -71
  127. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  128. package/dist/plugins/fusion-plugin-linear-import/bundled.js +74 -28
  129. package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
  130. package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +83 -29
  131. package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
  132. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +74 -28
  133. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  134. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +74 -28
  135. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  136. package/dist/plugins/fusion-plugin-quality/bundled.js +176 -46
  137. package/dist/plugins/fusion-plugin-quality/package.json +1 -1
  138. package/dist/plugins/fusion-plugin-reports/bundled.js +74 -28
  139. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  140. package/dist/plugins/fusion-plugin-roadmap/bundled.js +74 -28
  141. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  142. package/dist/plugins/fusion-plugin-todos/bundled.js +74 -28
  143. package/dist/plugins/fusion-plugin-todos/package.json +1 -1
  144. package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +74 -28
  145. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  146. package/package.json +1 -1
  147. package/skill/fusion/references/extension-tools.md +2 -0
  148. package/dist/client/assets/AgentDetailView-T767kKTg.js +0 -13
  149. package/dist/client/assets/AgentsView-6Ifu7qDr.js +0 -24
  150. package/dist/client/assets/ChatView-BV3lixQi.js +0 -13
  151. package/dist/client/assets/CommandCenter-CE4rYjHn.css +0 -1
  152. package/dist/client/assets/DocumentsView-pbERA7O-.js +0 -1
  153. package/dist/client/assets/EvalsView-DJQ4ltCg.js +0 -1
  154. package/dist/client/assets/ExperimentalAgentOnboardingModal-BwJuzkzB.js +0 -1
  155. package/dist/client/assets/InsightsView-CJgI0J7S.js +0 -11
  156. package/dist/client/assets/MemoryView-BHq1AHPu.js +0 -3
  157. package/dist/client/assets/PluginManager-k7hV7_9e.js +0 -1
  158. package/dist/client/assets/SessionTerminal-BRf6r4Vp.js +0 -2
  159. package/dist/client/assets/SettingsModal-B30rPfYC.css +0 -1
  160. package/dist/client/assets/SettingsModal-D0RBeZik.js +0 -21
  161. package/dist/client/assets/agentsOrgChartLayout-CKuzbhFf.js +0 -1
  162. package/dist/client/assets/app-B2FwULu2.js +0 -5
  163. package/dist/client/assets/app-B6nJaqAl.js +0 -13
  164. package/dist/client/assets/app-CGXZeIRc.js +0 -13
  165. package/dist/client/assets/app-CGtkeBF5.js +0 -13
  166. package/dist/client/assets/app-CNzN1Plu.js +0 -13
  167. package/dist/client/assets/app-DLs-f5yM.js +0 -13
  168. package/dist/client/assets/app-DsvtcRUG.js +0 -5
  169. package/dist/client/assets/channel-BoE8DeM4.js +0 -1
  170. package/dist/client/assets/classDiagram-4FO5ZUOK-qnbLX_9_.js +0 -1
  171. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-qnbLX_9_.js +0 -1
  172. package/dist/client/assets/index-CXTd3LAB.css +0 -1
  173. package/dist/client/assets/index-CtYRoouR.js +0 -2818
  174. package/dist/client/assets/standing-instructions-template-BJY317CC.js +0 -20
  175. package/dist/client/assets/standing-instructions-template-Ddi_4TIk.css +0 -1
@@ -0,0 +1,3 @@
1
+ CREATE INDEX IF NOT EXISTS "idxTasksProjectSourceAgentId"
2
+ ON project.tasks USING btree ("project_id", "source_agent_id")
3
+ WHERE "source_agent_id" IS NOT NULL;
@@ -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 $$;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.76.0-beta.3",
3
+ "version": "0.77.0-beta.0",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "main": "index.ts",
@@ -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;
@@ -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-11-09:41:
18466
- Memory Keeper is custom because it is not a workflow-stage principal. Unlike the four routed
18467
- owners its heartbeat is enabled, while auto-claim remains off because it only maintains memory.
18468
- This runs during init, where createAgent name collisions would abort startup; preflight probes,
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
- runtimeConfig: { enabled: true, autoClaimRelevantTasks: false, heartbeatIntervalMs: 36e5 },
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 runtimeConfig = { ...owner.runtimeConfig ?? {}, enabled: true, autoClaimRelevantTasks: false, heartbeatIntervalMs: 36e5 };
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
- owner = { ...owner, ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
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);