@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cursor-runtime",
3
- "version": "0.1.54-beta.3",
3
+ "version": "0.1.55-beta.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -5776,7 +5776,9 @@ __export(project_exports, {
5776
5776
  workflowSettings: () => workflowSettings,
5777
5777
  workflowSteps: () => workflowSteps,
5778
5778
  workflowWorkItems: () => workflowWorkItems,
5779
- workflows: () => workflows
5779
+ workflows: () => workflows,
5780
+ workspaceCoordinationLeases: () => workspaceCoordinationLeases,
5781
+ workspaceLandIntents: () => workspaceLandIntents
5780
5782
  });
5781
5783
  var projectSchema = pgSchema(PROJECT_SCHEMA);
5782
5784
  var tasks = projectSchema.table("tasks", {
@@ -6043,6 +6045,9 @@ var tasks = projectSchema.table("tasks", {
6043
6045
  the gate is a full tasks-table scan. Sparse: most rows have NULL parent.
6044
6046
  */
6045
6047
  index("idxTasksSourceParentTaskId").on(t.sourceParentTaskId),
6048
+ /* FNXC:TaskRecommendations 2026-08-13-22:23: duplicate intake filters source
6049
+ * lineage on recommendation/agent creates; this sparse index avoids a task-table scan. */
6050
+ index("idxTasksProjectSourceAgentId").on(t.projectId, t.sourceAgentId).where(sql`${t.sourceAgentId} IS NOT NULL`),
6046
6051
  // 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.
6047
6052
  uniqueIndex("uqTasksProjectProposalClaimId").on(t.projectId, t.proposalClaimId).where(sql`${t.proposalClaimId} IS NOT NULL`),
6048
6053
  /*
@@ -6277,6 +6282,52 @@ var distributedTaskIdReservations = projectSchema.table("distributed_task_id_res
6277
6282
  index("idxDistributedTaskIdReservationsPrefixStatus").on(t.prefix, t.status),
6278
6283
  index("idxDistributedTaskIdReservationsExpiry").on(t.status, t.expiresAt)
6279
6284
  ]);
6285
+ var workspaceCoordinationLeases = projectSchema.table("workspace_coordination_leases", {
6286
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
6287
+ leaseKey: text("lease_key").notNull(),
6288
+ kind: text("kind").notNull(),
6289
+ ownerTaskId: text("owner_task_id").notNull(),
6290
+ ownerNodeId: text("owner_node_id").notNull(),
6291
+ ownerIncarnationId: text("owner_incarnation_id").notNull(),
6292
+ ownerRunId: text("owner_run_id"),
6293
+ fenceToken: bigint("fence_token", { mode: "bigint" }).notNull().default(sql`0`),
6294
+ fenceRefName: text("fence_ref_name"),
6295
+ fenceRefSha: text("fence_ref_sha"),
6296
+ status: text("status").notNull(),
6297
+ acquiredAt: text("acquired_at").notNull(),
6298
+ renewedAt: text("renewed_at").notNull(),
6299
+ expiresAt: text("expires_at").notNull(),
6300
+ createdAt: text("created_at").notNull(),
6301
+ updatedAt: text("updated_at").notNull()
6302
+ }, (t) => [
6303
+ primaryKey({ columns: [t.projectId, t.leaseKey] }),
6304
+ check("workspace_coordination_leases_kind_check", sql`${t.kind} IN ('acquire', 'land', 'merge-dispatch')`),
6305
+ check("workspace_coordination_leases_status_check", sql`${t.status} IN ('held', 'released', 'expired')`),
6306
+ index("idxWorkspaceCoordinationLeasesOwnerTask").on(t.projectId, t.ownerTaskId),
6307
+ index("idxWorkspaceCoordinationLeasesOwnerNode").on(t.projectId, t.ownerNodeId),
6308
+ index("idxWorkspaceCoordinationLeasesExpiry").on(t.status, t.expiresAt)
6309
+ ]);
6310
+ var workspaceLandIntents = projectSchema.table("workspace_land_intents", {
6311
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
6312
+ taskId: text("task_id").notNull(),
6313
+ repoRelPath: text("repo_rel_path").notNull(),
6314
+ remoteUrl: text("remote_url").notNull(),
6315
+ integrationRef: text("integration_ref").notNull(),
6316
+ intendedSha: text("intended_sha").notNull(),
6317
+ expectedTip: text("expected_tip").notNull(),
6318
+ fenceRefName: text("fence_ref_name").notNull(),
6319
+ fenceRefSha: text("fence_ref_sha").notNull(),
6320
+ ownerTaskId: text("owner_task_id").notNull(),
6321
+ ownerNodeId: text("owner_node_id").notNull(),
6322
+ ownerIncarnationId: text("owner_incarnation_id").notNull(),
6323
+ fenceToken: bigint("fence_token", { mode: "bigint" }).notNull(),
6324
+ status: text("status").notNull(),
6325
+ resolvedSha: text("resolved_sha"),
6326
+ resolution: text("resolution"),
6327
+ createdAt: text("created_at").notNull(),
6328
+ updatedAt: text("updated_at").notNull(),
6329
+ resolvedAt: text("resolved_at")
6330
+ }, (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)]);
6280
6331
  var symbolLocks = projectSchema.table("symbol_locks", {
6281
6332
  projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
6282
6333
  symbolKey: text("symbol_key").notNull(),
@@ -8851,6 +8902,11 @@ var DEFAULT_GLOBAL_SETTINGS = {
8851
8902
  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.
8852
8903
  */
8853
8904
  skipConfirmationDialogs: false,
8905
+ /*
8906
+ FNXC:QuickEntry 2026-08-16-03:15:
8907
+ Quick Add keeps its historical Enter-to-submit behavior by default; only an operator's global preference may opt into newline-first entry.
8908
+ */
8909
+ quickAddSubmitOnEnter: true,
8854
8910
  language: void 0,
8855
8911
  defaultProvider: void 0,
8856
8912
  defaultCredentialInstanceId: void 0,
@@ -9313,9 +9369,6 @@ var DEFAULT_PROJECT_SETTINGS = {
9313
9369
  * 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.
9314
9370
  */
9315
9371
  merger: { mode: "ai", maxReviewPasses: 3, allowDirtyLocalCheckoutSync: true },
9316
- mergeDiffVolumeMinLines: void 0,
9317
- mergeDiffVolumeThreshold: void 0,
9318
- mergeDiffVolumeAllowlist: void 0,
9319
9372
  requiredChecks: void 0,
9320
9373
  mergeStrategyOverlapBehavior: "flip-to-prefer-branch",
9321
9374
  postMergeAuditMode: "warn",
@@ -17966,10 +18019,6 @@ var AgentStore = class _AgentStore extends EventEmitter {
17966
18019
  };
17967
18020
  await this.writeAgent(updated);
17968
18021
  this.emit("agent:stateChanged", agentId, currentState, newState);
17969
- if (this.asyncLayer) try {
17970
- 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" } });
17971
- } catch {
17972
- }
17973
18022
  this.emit("agent:updated", updated, currentState);
17974
18023
  return updated;
17975
18024
  });
@@ -18461,10 +18510,10 @@ var AgentStore = class _AgentStore extends EventEmitter {
18461
18510
  return agents2;
18462
18511
  }
18463
18512
  /*
18464
- FNXC:MemoryAgent 2026-08-11-09:41:
18465
- Memory Keeper is custom because it is not a workflow-stage principal. Unlike the four routed
18466
- owners its heartbeat is enabled, while auto-claim remains off because it only maintains memory.
18467
- This runs during init, where createAgent name collisions would abort startup; preflight probes,
18513
+ FNXC:MemoryAgent 2026-08-16-02:31:
18514
+ Memory Keeper is custom because it is not a workflow-stage principal. Its heartbeat defaults off
18515
+ until an operator opts in, while auto-claim remains off because it only maintains memory. This
18516
+ runs during init, where createAgent name collisions would abort startup; preflight probes,
18468
18517
  a fallback name, a null degraded result, and the init-side catch keep an operator's same-named
18469
18518
  agent untouched and the project runnable.
18470
18519
  */
@@ -18490,7 +18539,13 @@ var AgentStore = class _AgentStore extends EventEmitter {
18490
18539
  roles: [...BUILTIN_MEMORY_AGENT_DEFAULT.roles],
18491
18540
  title: BUILTIN_MEMORY_AGENT_DEFAULT.title,
18492
18541
  metadata: { [BUILTIN_MEMORY_AGENT_PROVENANCE_KEY]: true },
18493
- runtimeConfig: { enabled: true, autoClaimRelevantTasks: false, heartbeatIntervalMs: 36e5 },
18542
+ /*
18543
+ FNXC:MemoryAgent 2026-08-16-02:31:
18544
+ Memory consolidation is opt-in: newly provisioned Memory Keepers must not begin
18545
+ hourly autonomous heartbeats until an operator enables the existing heartbeat toggle.
18546
+ Keep auto-claim off and the one-hour interval ready for that later opt-in.
18547
+ */
18548
+ runtimeConfig: { enabled: false, autoClaimRelevantTasks: false, heartbeatIntervalMs: 36e5 },
18494
18549
  instructionsText: BUILTIN_MEMORY_AGENT_DEFAULT.instructionsText,
18495
18550
  soul: BUILTIN_MEMORY_AGENT_DEFAULT.soul,
18496
18551
  bundleConfig: { ...BUILTIN_MEMORY_AGENT_DEFAULT.bundleConfig, files: [...BUILTIN_MEMORY_AGENT_DEFAULT.bundleConfig.files] }
@@ -18505,7 +18560,9 @@ var AgentStore = class _AgentStore extends EventEmitter {
18505
18560
  return owner;
18506
18561
  }
18507
18562
  const metadata = { ...owner.metadata ?? {}, [BUILTIN_MEMORY_AGENT_PROVENANCE_KEY]: true };
18508
- const runtimeConfig = { ...owner.runtimeConfig ?? {}, enabled: true, autoClaimRelevantTasks: false, heartbeatIntervalMs: 36e5 };
18563
+ const currentRuntimeConfig = owner.runtimeConfig ?? {};
18564
+ const enabled = typeof currentRuntimeConfig.enabled === "boolean" ? currentRuntimeConfig.enabled : false;
18565
+ 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 };
18509
18566
  const updates = {
18510
18567
  roles: [...BUILTIN_MEMORY_AGENT_DEFAULT.roles],
18511
18568
  role: "custom",
@@ -18515,7 +18572,9 @@ var AgentStore = class _AgentStore extends EventEmitter {
18515
18572
  instructionsText: owner.instructionsText?.trim() ? owner.instructionsText : BUILTIN_MEMORY_AGENT_DEFAULT.instructionsText,
18516
18573
  soul: owner.soul?.trim() ? owner.soul : BUILTIN_MEMORY_AGENT_DEFAULT.soul
18517
18574
  };
18518
- owner = { ...owner, ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
18575
+ const nextOwner = { ...owner, ...updates };
18576
+ if (JSON.stringify(nextOwner) === JSON.stringify(owner)) return owner;
18577
+ owner = { ...nextOwner, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
18519
18578
  await this.writeAgent(owner, executor);
18520
18579
  return owner;
18521
18580
  };
@@ -19387,19 +19446,6 @@ var AgentStore = class _AgentStore extends EventEmitter {
19387
19446
  this.agentSnapshotCache.set(agent.id, this.watchSnapshotOf(agent));
19388
19447
  if (stateChanged) {
19389
19448
  this.emit("agent:stateChanged", agent.id, previousState, agent.state);
19390
- if (this.asyncLayer) {
19391
- try {
19392
- await appendAgentActivityEvent(this.asyncLayer, {
19393
- type: "agent:state-changed",
19394
- attributionClaim: resolveAgentActivityAttribution([{ id: agent.id, provenance: "roster" }], "executor"),
19395
- taskId: agent.taskId,
19396
- occurredAt: agent.updatedAt,
19397
- discriminator: agent.updatedAt,
19398
- metadata: { fromState: previousState, toState: agent.state, source: "reconciliation" }
19399
- });
19400
- } catch {
19401
- }
19402
- }
19403
19449
  this.emit("agent:updated", agent, previousState);
19404
19450
  } else {
19405
19451
  this.emit("agent:updated", agent);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/dependency-graph",
3
- "version": "0.1.66-beta.3",
3
+ "version": "0.1.67-beta.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -5776,7 +5776,9 @@ __export(project_exports, {
5776
5776
  workflowSettings: () => workflowSettings,
5777
5777
  workflowSteps: () => workflowSteps,
5778
5778
  workflowWorkItems: () => workflowWorkItems,
5779
- workflows: () => workflows
5779
+ workflows: () => workflows,
5780
+ workspaceCoordinationLeases: () => workspaceCoordinationLeases,
5781
+ workspaceLandIntents: () => workspaceLandIntents
5780
5782
  });
5781
5783
  var projectSchema = pgSchema(PROJECT_SCHEMA);
5782
5784
  var tasks = projectSchema.table("tasks", {
@@ -6043,6 +6045,9 @@ var tasks = projectSchema.table("tasks", {
6043
6045
  the gate is a full tasks-table scan. Sparse: most rows have NULL parent.
6044
6046
  */
6045
6047
  index("idxTasksSourceParentTaskId").on(t.sourceParentTaskId),
6048
+ /* FNXC:TaskRecommendations 2026-08-13-22:23: duplicate intake filters source
6049
+ * lineage on recommendation/agent creates; this sparse index avoids a task-table scan. */
6050
+ index("idxTasksProjectSourceAgentId").on(t.projectId, t.sourceAgentId).where(sql`${t.sourceAgentId} IS NOT NULL`),
6046
6051
  // 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.
6047
6052
  uniqueIndex("uqTasksProjectProposalClaimId").on(t.projectId, t.proposalClaimId).where(sql`${t.proposalClaimId} IS NOT NULL`),
6048
6053
  /*
@@ -6277,6 +6282,52 @@ var distributedTaskIdReservations = projectSchema.table("distributed_task_id_res
6277
6282
  index("idxDistributedTaskIdReservationsPrefixStatus").on(t.prefix, t.status),
6278
6283
  index("idxDistributedTaskIdReservationsExpiry").on(t.status, t.expiresAt)
6279
6284
  ]);
6285
+ var workspaceCoordinationLeases = projectSchema.table("workspace_coordination_leases", {
6286
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
6287
+ leaseKey: text("lease_key").notNull(),
6288
+ kind: text("kind").notNull(),
6289
+ ownerTaskId: text("owner_task_id").notNull(),
6290
+ ownerNodeId: text("owner_node_id").notNull(),
6291
+ ownerIncarnationId: text("owner_incarnation_id").notNull(),
6292
+ ownerRunId: text("owner_run_id"),
6293
+ fenceToken: bigint("fence_token", { mode: "bigint" }).notNull().default(sql`0`),
6294
+ fenceRefName: text("fence_ref_name"),
6295
+ fenceRefSha: text("fence_ref_sha"),
6296
+ status: text("status").notNull(),
6297
+ acquiredAt: text("acquired_at").notNull(),
6298
+ renewedAt: text("renewed_at").notNull(),
6299
+ expiresAt: text("expires_at").notNull(),
6300
+ createdAt: text("created_at").notNull(),
6301
+ updatedAt: text("updated_at").notNull()
6302
+ }, (t) => [
6303
+ primaryKey({ columns: [t.projectId, t.leaseKey] }),
6304
+ check("workspace_coordination_leases_kind_check", sql`${t.kind} IN ('acquire', 'land', 'merge-dispatch')`),
6305
+ check("workspace_coordination_leases_status_check", sql`${t.status} IN ('held', 'released', 'expired')`),
6306
+ index("idxWorkspaceCoordinationLeasesOwnerTask").on(t.projectId, t.ownerTaskId),
6307
+ index("idxWorkspaceCoordinationLeasesOwnerNode").on(t.projectId, t.ownerNodeId),
6308
+ index("idxWorkspaceCoordinationLeasesExpiry").on(t.status, t.expiresAt)
6309
+ ]);
6310
+ var workspaceLandIntents = projectSchema.table("workspace_land_intents", {
6311
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
6312
+ taskId: text("task_id").notNull(),
6313
+ repoRelPath: text("repo_rel_path").notNull(),
6314
+ remoteUrl: text("remote_url").notNull(),
6315
+ integrationRef: text("integration_ref").notNull(),
6316
+ intendedSha: text("intended_sha").notNull(),
6317
+ expectedTip: text("expected_tip").notNull(),
6318
+ fenceRefName: text("fence_ref_name").notNull(),
6319
+ fenceRefSha: text("fence_ref_sha").notNull(),
6320
+ ownerTaskId: text("owner_task_id").notNull(),
6321
+ ownerNodeId: text("owner_node_id").notNull(),
6322
+ ownerIncarnationId: text("owner_incarnation_id").notNull(),
6323
+ fenceToken: bigint("fence_token", { mode: "bigint" }).notNull(),
6324
+ status: text("status").notNull(),
6325
+ resolvedSha: text("resolved_sha"),
6326
+ resolution: text("resolution"),
6327
+ createdAt: text("created_at").notNull(),
6328
+ updatedAt: text("updated_at").notNull(),
6329
+ resolvedAt: text("resolved_at")
6330
+ }, (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)]);
6280
6331
  var symbolLocks = projectSchema.table("symbol_locks", {
6281
6332
  projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
6282
6333
  symbolKey: text("symbol_key").notNull(),
@@ -8851,6 +8902,11 @@ var DEFAULT_GLOBAL_SETTINGS = {
8851
8902
  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.
8852
8903
  */
8853
8904
  skipConfirmationDialogs: false,
8905
+ /*
8906
+ FNXC:QuickEntry 2026-08-16-03:15:
8907
+ Quick Add keeps its historical Enter-to-submit behavior by default; only an operator's global preference may opt into newline-first entry.
8908
+ */
8909
+ quickAddSubmitOnEnter: true,
8854
8910
  language: void 0,
8855
8911
  defaultProvider: void 0,
8856
8912
  defaultCredentialInstanceId: void 0,
@@ -9313,9 +9369,6 @@ var DEFAULT_PROJECT_SETTINGS = {
9313
9369
  * 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.
9314
9370
  */
9315
9371
  merger: { mode: "ai", maxReviewPasses: 3, allowDirtyLocalCheckoutSync: true },
9316
- mergeDiffVolumeMinLines: void 0,
9317
- mergeDiffVolumeThreshold: void 0,
9318
- mergeDiffVolumeAllowlist: void 0,
9319
9372
  requiredChecks: void 0,
9320
9373
  mergeStrategyOverlapBehavior: "flip-to-prefer-branch",
9321
9374
  postMergeAuditMode: "warn",
@@ -17966,10 +18019,6 @@ var AgentStore = class _AgentStore extends EventEmitter {
17966
18019
  };
17967
18020
  await this.writeAgent(updated);
17968
18021
  this.emit("agent:stateChanged", agentId, currentState, newState);
17969
- if (this.asyncLayer) try {
17970
- 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" } });
17971
- } catch {
17972
- }
17973
18022
  this.emit("agent:updated", updated, currentState);
17974
18023
  return updated;
17975
18024
  });
@@ -18461,10 +18510,10 @@ var AgentStore = class _AgentStore extends EventEmitter {
18461
18510
  return agents2;
18462
18511
  }
18463
18512
  /*
18464
- FNXC:MemoryAgent 2026-08-11-09:41:
18465
- Memory Keeper is custom because it is not a workflow-stage principal. Unlike the four routed
18466
- owners its heartbeat is enabled, while auto-claim remains off because it only maintains memory.
18467
- This runs during init, where createAgent name collisions would abort startup; preflight probes,
18513
+ FNXC:MemoryAgent 2026-08-16-02:31:
18514
+ Memory Keeper is custom because it is not a workflow-stage principal. Its heartbeat defaults off
18515
+ until an operator opts in, while auto-claim remains off because it only maintains memory. This
18516
+ runs during init, where createAgent name collisions would abort startup; preflight probes,
18468
18517
  a fallback name, a null degraded result, and the init-side catch keep an operator's same-named
18469
18518
  agent untouched and the project runnable.
18470
18519
  */
@@ -18490,7 +18539,13 @@ var AgentStore = class _AgentStore extends EventEmitter {
18490
18539
  roles: [...BUILTIN_MEMORY_AGENT_DEFAULT.roles],
18491
18540
  title: BUILTIN_MEMORY_AGENT_DEFAULT.title,
18492
18541
  metadata: { [BUILTIN_MEMORY_AGENT_PROVENANCE_KEY]: true },
18493
- runtimeConfig: { enabled: true, autoClaimRelevantTasks: false, heartbeatIntervalMs: 36e5 },
18542
+ /*
18543
+ FNXC:MemoryAgent 2026-08-16-02:31:
18544
+ Memory consolidation is opt-in: newly provisioned Memory Keepers must not begin
18545
+ hourly autonomous heartbeats until an operator enables the existing heartbeat toggle.
18546
+ Keep auto-claim off and the one-hour interval ready for that later opt-in.
18547
+ */
18548
+ runtimeConfig: { enabled: false, autoClaimRelevantTasks: false, heartbeatIntervalMs: 36e5 },
18494
18549
  instructionsText: BUILTIN_MEMORY_AGENT_DEFAULT.instructionsText,
18495
18550
  soul: BUILTIN_MEMORY_AGENT_DEFAULT.soul,
18496
18551
  bundleConfig: { ...BUILTIN_MEMORY_AGENT_DEFAULT.bundleConfig, files: [...BUILTIN_MEMORY_AGENT_DEFAULT.bundleConfig.files] }
@@ -18505,7 +18560,9 @@ var AgentStore = class _AgentStore extends EventEmitter {
18505
18560
  return owner;
18506
18561
  }
18507
18562
  const metadata = { ...owner.metadata ?? {}, [BUILTIN_MEMORY_AGENT_PROVENANCE_KEY]: true };
18508
- const runtimeConfig = { ...owner.runtimeConfig ?? {}, enabled: true, autoClaimRelevantTasks: false, heartbeatIntervalMs: 36e5 };
18563
+ const currentRuntimeConfig = owner.runtimeConfig ?? {};
18564
+ const enabled = typeof currentRuntimeConfig.enabled === "boolean" ? currentRuntimeConfig.enabled : false;
18565
+ 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 };
18509
18566
  const updates = {
18510
18567
  roles: [...BUILTIN_MEMORY_AGENT_DEFAULT.roles],
18511
18568
  role: "custom",
@@ -18515,7 +18572,9 @@ var AgentStore = class _AgentStore extends EventEmitter {
18515
18572
  instructionsText: owner.instructionsText?.trim() ? owner.instructionsText : BUILTIN_MEMORY_AGENT_DEFAULT.instructionsText,
18516
18573
  soul: owner.soul?.trim() ? owner.soul : BUILTIN_MEMORY_AGENT_DEFAULT.soul
18517
18574
  };
18518
- owner = { ...owner, ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
18575
+ const nextOwner = { ...owner, ...updates };
18576
+ if (JSON.stringify(nextOwner) === JSON.stringify(owner)) return owner;
18577
+ owner = { ...nextOwner, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
18519
18578
  await this.writeAgent(owner, executor);
18520
18579
  return owner;
18521
18580
  };
@@ -19387,19 +19446,6 @@ var AgentStore = class _AgentStore extends EventEmitter {
19387
19446
  this.agentSnapshotCache.set(agent.id, this.watchSnapshotOf(agent));
19388
19447
  if (stateChanged) {
19389
19448
  this.emit("agent:stateChanged", agent.id, previousState, agent.state);
19390
- if (this.asyncLayer) {
19391
- try {
19392
- await appendAgentActivityEvent(this.asyncLayer, {
19393
- type: "agent:state-changed",
19394
- attributionClaim: resolveAgentActivityAttribution([{ id: agent.id, provenance: "roster" }], "executor"),
19395
- taskId: agent.taskId,
19396
- occurredAt: agent.updatedAt,
19397
- discriminator: agent.updatedAt,
19398
- metadata: { fromState: previousState, toState: agent.state, source: "reconciliation" }
19399
- });
19400
- } catch {
19401
- }
19402
- }
19403
19449
  this.emit("agent:updated", agent, previousState);
19404
19450
  } else {
19405
19451
  this.emit("agent:updated", agent);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/droid-runtime",
3
- "version": "0.1.61-beta.3",
3
+ "version": "0.1.62-beta.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -5776,7 +5776,9 @@ __export(project_exports, {
5776
5776
  workflowSettings: () => workflowSettings,
5777
5777
  workflowSteps: () => workflowSteps,
5778
5778
  workflowWorkItems: () => workflowWorkItems,
5779
- workflows: () => workflows
5779
+ workflows: () => workflows,
5780
+ workspaceCoordinationLeases: () => workspaceCoordinationLeases,
5781
+ workspaceLandIntents: () => workspaceLandIntents
5780
5782
  });
5781
5783
  var projectSchema = pgSchema(PROJECT_SCHEMA);
5782
5784
  var tasks = projectSchema.table("tasks", {
@@ -6043,6 +6045,9 @@ var tasks = projectSchema.table("tasks", {
6043
6045
  the gate is a full tasks-table scan. Sparse: most rows have NULL parent.
6044
6046
  */
6045
6047
  index("idxTasksSourceParentTaskId").on(t.sourceParentTaskId),
6048
+ /* FNXC:TaskRecommendations 2026-08-13-22:23: duplicate intake filters source
6049
+ * lineage on recommendation/agent creates; this sparse index avoids a task-table scan. */
6050
+ index("idxTasksProjectSourceAgentId").on(t.projectId, t.sourceAgentId).where(sql`${t.sourceAgentId} IS NOT NULL`),
6046
6051
  // 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.
6047
6052
  uniqueIndex("uqTasksProjectProposalClaimId").on(t.projectId, t.proposalClaimId).where(sql`${t.proposalClaimId} IS NOT NULL`),
6048
6053
  /*
@@ -6277,6 +6282,52 @@ var distributedTaskIdReservations = projectSchema.table("distributed_task_id_res
6277
6282
  index("idxDistributedTaskIdReservationsPrefixStatus").on(t.prefix, t.status),
6278
6283
  index("idxDistributedTaskIdReservationsExpiry").on(t.status, t.expiresAt)
6279
6284
  ]);
6285
+ var workspaceCoordinationLeases = projectSchema.table("workspace_coordination_leases", {
6286
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
6287
+ leaseKey: text("lease_key").notNull(),
6288
+ kind: text("kind").notNull(),
6289
+ ownerTaskId: text("owner_task_id").notNull(),
6290
+ ownerNodeId: text("owner_node_id").notNull(),
6291
+ ownerIncarnationId: text("owner_incarnation_id").notNull(),
6292
+ ownerRunId: text("owner_run_id"),
6293
+ fenceToken: bigint("fence_token", { mode: "bigint" }).notNull().default(sql`0`),
6294
+ fenceRefName: text("fence_ref_name"),
6295
+ fenceRefSha: text("fence_ref_sha"),
6296
+ status: text("status").notNull(),
6297
+ acquiredAt: text("acquired_at").notNull(),
6298
+ renewedAt: text("renewed_at").notNull(),
6299
+ expiresAt: text("expires_at").notNull(),
6300
+ createdAt: text("created_at").notNull(),
6301
+ updatedAt: text("updated_at").notNull()
6302
+ }, (t) => [
6303
+ primaryKey({ columns: [t.projectId, t.leaseKey] }),
6304
+ check("workspace_coordination_leases_kind_check", sql`${t.kind} IN ('acquire', 'land', 'merge-dispatch')`),
6305
+ check("workspace_coordination_leases_status_check", sql`${t.status} IN ('held', 'released', 'expired')`),
6306
+ index("idxWorkspaceCoordinationLeasesOwnerTask").on(t.projectId, t.ownerTaskId),
6307
+ index("idxWorkspaceCoordinationLeasesOwnerNode").on(t.projectId, t.ownerNodeId),
6308
+ index("idxWorkspaceCoordinationLeasesExpiry").on(t.status, t.expiresAt)
6309
+ ]);
6310
+ var workspaceLandIntents = projectSchema.table("workspace_land_intents", {
6311
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
6312
+ taskId: text("task_id").notNull(),
6313
+ repoRelPath: text("repo_rel_path").notNull(),
6314
+ remoteUrl: text("remote_url").notNull(),
6315
+ integrationRef: text("integration_ref").notNull(),
6316
+ intendedSha: text("intended_sha").notNull(),
6317
+ expectedTip: text("expected_tip").notNull(),
6318
+ fenceRefName: text("fence_ref_name").notNull(),
6319
+ fenceRefSha: text("fence_ref_sha").notNull(),
6320
+ ownerTaskId: text("owner_task_id").notNull(),
6321
+ ownerNodeId: text("owner_node_id").notNull(),
6322
+ ownerIncarnationId: text("owner_incarnation_id").notNull(),
6323
+ fenceToken: bigint("fence_token", { mode: "bigint" }).notNull(),
6324
+ status: text("status").notNull(),
6325
+ resolvedSha: text("resolved_sha"),
6326
+ resolution: text("resolution"),
6327
+ createdAt: text("created_at").notNull(),
6328
+ updatedAt: text("updated_at").notNull(),
6329
+ resolvedAt: text("resolved_at")
6330
+ }, (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)]);
6280
6331
  var symbolLocks = projectSchema.table("symbol_locks", {
6281
6332
  projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
6282
6333
  symbolKey: text("symbol_key").notNull(),
@@ -8851,6 +8902,11 @@ var DEFAULT_GLOBAL_SETTINGS = {
8851
8902
  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.
8852
8903
  */
8853
8904
  skipConfirmationDialogs: false,
8905
+ /*
8906
+ FNXC:QuickEntry 2026-08-16-03:15:
8907
+ Quick Add keeps its historical Enter-to-submit behavior by default; only an operator's global preference may opt into newline-first entry.
8908
+ */
8909
+ quickAddSubmitOnEnter: true,
8854
8910
  language: void 0,
8855
8911
  defaultProvider: void 0,
8856
8912
  defaultCredentialInstanceId: void 0,
@@ -9313,9 +9369,6 @@ var DEFAULT_PROJECT_SETTINGS = {
9313
9369
  * 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.
9314
9370
  */
9315
9371
  merger: { mode: "ai", maxReviewPasses: 3, allowDirtyLocalCheckoutSync: true },
9316
- mergeDiffVolumeMinLines: void 0,
9317
- mergeDiffVolumeThreshold: void 0,
9318
- mergeDiffVolumeAllowlist: void 0,
9319
9372
  requiredChecks: void 0,
9320
9373
  mergeStrategyOverlapBehavior: "flip-to-prefer-branch",
9321
9374
  postMergeAuditMode: "warn",
@@ -9911,6 +9964,14 @@ function completionSummaryNode(column) {
9911
9964
  };
9912
9965
  }
9913
9966
 
9967
+ // ../core/src/secrets/redact-secrets.ts
9968
+ function redactSecrets(text2) {
9969
+ return text2.replace(/(authorization\s*[:=]\s*)(bearer\s+)?[^\s,;"']+/gi, "$1$2[REDACTED]").replace(/\b(bearer)\s+[A-Za-z0-9._\-+/=]+/gi, "$1 [REDACTED]").replace(
9970
+ /\b((?:api[_-]?key|key|token|secret|password|passwd|pwd|access[_-]?token|refresh[_-]?token|client[_-]?secret)\s*[:=]\s*)("?)[^\s,;"']+\2/gi,
9971
+ "$1$2[REDACTED]$2"
9972
+ ).replace(/\b(sk-|ghp_|gho_|github_pat_|xox[abpr]-|AKIA)[A-Za-z0-9_-]{8,}/g, "[REDACTED]").replace(/\b[A-Za-z0-9+/]{40,}={0,2}\b/g, "[REDACTED]").replace(/\b[0-9a-fA-F]{32,}\b/g, "[REDACTED]");
9973
+ }
9974
+
9914
9975
  // ../core/src/missions/mission-types.ts
9915
9976
  var VALIDATION_INFLIGHT_STALE_MAX_AGE_MS = 6 * 60 * 60 * 1e3;
9916
9977
 
@@ -17966,10 +18027,6 @@ var AgentStore = class _AgentStore extends EventEmitter {
17966
18027
  };
17967
18028
  await this.writeAgent(updated);
17968
18029
  this.emit("agent:stateChanged", agentId, currentState, newState);
17969
- if (this.asyncLayer) try {
17970
- 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" } });
17971
- } catch {
17972
- }
17973
18030
  this.emit("agent:updated", updated, currentState);
17974
18031
  return updated;
17975
18032
  });
@@ -18461,10 +18518,10 @@ var AgentStore = class _AgentStore extends EventEmitter {
18461
18518
  return agents2;
18462
18519
  }
18463
18520
  /*
18464
- FNXC:MemoryAgent 2026-08-11-09:41:
18465
- Memory Keeper is custom because it is not a workflow-stage principal. Unlike the four routed
18466
- owners its heartbeat is enabled, while auto-claim remains off because it only maintains memory.
18467
- This runs during init, where createAgent name collisions would abort startup; preflight probes,
18521
+ FNXC:MemoryAgent 2026-08-16-02:31:
18522
+ Memory Keeper is custom because it is not a workflow-stage principal. Its heartbeat defaults off
18523
+ until an operator opts in, while auto-claim remains off because it only maintains memory. This
18524
+ runs during init, where createAgent name collisions would abort startup; preflight probes,
18468
18525
  a fallback name, a null degraded result, and the init-side catch keep an operator's same-named
18469
18526
  agent untouched and the project runnable.
18470
18527
  */
@@ -18490,7 +18547,13 @@ var AgentStore = class _AgentStore extends EventEmitter {
18490
18547
  roles: [...BUILTIN_MEMORY_AGENT_DEFAULT.roles],
18491
18548
  title: BUILTIN_MEMORY_AGENT_DEFAULT.title,
18492
18549
  metadata: { [BUILTIN_MEMORY_AGENT_PROVENANCE_KEY]: true },
18493
- runtimeConfig: { enabled: true, autoClaimRelevantTasks: false, heartbeatIntervalMs: 36e5 },
18550
+ /*
18551
+ FNXC:MemoryAgent 2026-08-16-02:31:
18552
+ Memory consolidation is opt-in: newly provisioned Memory Keepers must not begin
18553
+ hourly autonomous heartbeats until an operator enables the existing heartbeat toggle.
18554
+ Keep auto-claim off and the one-hour interval ready for that later opt-in.
18555
+ */
18556
+ runtimeConfig: { enabled: false, autoClaimRelevantTasks: false, heartbeatIntervalMs: 36e5 },
18494
18557
  instructionsText: BUILTIN_MEMORY_AGENT_DEFAULT.instructionsText,
18495
18558
  soul: BUILTIN_MEMORY_AGENT_DEFAULT.soul,
18496
18559
  bundleConfig: { ...BUILTIN_MEMORY_AGENT_DEFAULT.bundleConfig, files: [...BUILTIN_MEMORY_AGENT_DEFAULT.bundleConfig.files] }
@@ -18505,7 +18568,9 @@ var AgentStore = class _AgentStore extends EventEmitter {
18505
18568
  return owner;
18506
18569
  }
18507
18570
  const metadata = { ...owner.metadata ?? {}, [BUILTIN_MEMORY_AGENT_PROVENANCE_KEY]: true };
18508
- const runtimeConfig = { ...owner.runtimeConfig ?? {}, enabled: true, autoClaimRelevantTasks: false, heartbeatIntervalMs: 36e5 };
18571
+ const currentRuntimeConfig = owner.runtimeConfig ?? {};
18572
+ const enabled = typeof currentRuntimeConfig.enabled === "boolean" ? currentRuntimeConfig.enabled : false;
18573
+ 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 };
18509
18574
  const updates = {
18510
18575
  roles: [...BUILTIN_MEMORY_AGENT_DEFAULT.roles],
18511
18576
  role: "custom",
@@ -18515,7 +18580,9 @@ var AgentStore = class _AgentStore extends EventEmitter {
18515
18580
  instructionsText: owner.instructionsText?.trim() ? owner.instructionsText : BUILTIN_MEMORY_AGENT_DEFAULT.instructionsText,
18516
18581
  soul: owner.soul?.trim() ? owner.soul : BUILTIN_MEMORY_AGENT_DEFAULT.soul
18517
18582
  };
18518
- owner = { ...owner, ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
18583
+ const nextOwner = { ...owner, ...updates };
18584
+ if (JSON.stringify(nextOwner) === JSON.stringify(owner)) return owner;
18585
+ owner = { ...nextOwner, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
18519
18586
  await this.writeAgent(owner, executor);
18520
18587
  return owner;
18521
18588
  };
@@ -19387,19 +19454,6 @@ var AgentStore = class _AgentStore extends EventEmitter {
19387
19454
  this.agentSnapshotCache.set(agent.id, this.watchSnapshotOf(agent));
19388
19455
  if (stateChanged) {
19389
19456
  this.emit("agent:stateChanged", agent.id, previousState, agent.state);
19390
- if (this.asyncLayer) {
19391
- try {
19392
- await appendAgentActivityEvent(this.asyncLayer, {
19393
- type: "agent:state-changed",
19394
- attributionClaim: resolveAgentActivityAttribution([{ id: agent.id, provenance: "roster" }], "executor"),
19395
- taskId: agent.taskId,
19396
- occurredAt: agent.updatedAt,
19397
- discriminator: agent.updatedAt,
19398
- metadata: { fromState: previousState, toState: agent.state, source: "reconciliation" }
19399
- });
19400
- } catch {
19401
- }
19402
- }
19403
19457
  this.emit("agent:updated", agent, previousState);
19404
19458
  } else {
19405
19459
  this.emit("agent:updated", agent);
@@ -19538,7 +19592,7 @@ function captureStderr(child) {
19538
19592
  raw = raw.slice(raw.length - STDERR_BUFFER_CEILING);
19539
19593
  }
19540
19594
  });
19541
- return () => redactSecrets2(raw);
19595
+ return () => redactSecrets(raw);
19542
19596
  }
19543
19597
 
19544
19598
  // ../../plugins/fusion-plugin-grok-runtime/src/probe.ts
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/grok-runtime",
3
- "version": "0.2.13-beta.3",
3
+ "version": "0.2.14-beta.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {