@runfusion/fusion 0.76.0-beta.1 → 0.76.0-beta.2

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 (138) hide show
  1. package/dist/bin.js +503 -213
  2. package/dist/child-process-worker.js +466 -207
  3. package/dist/client/.vite/manifest.json +260 -260
  4. package/dist/client/assets/{AgentDetailView-Cbl1sw6i.js → AgentDetailView-gak4EWTI.js} +1 -1
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-DD1U5M9p.js → AgentPermissionPolicyEditor-DP1QbZL-.js} +1 -1
  6. package/dist/client/assets/{AgentsView-BMcCbple.js → AgentsView-DAMRTKzI.js} +3 -3
  7. package/dist/client/assets/ChatView-iE-2gf5P.js +13 -0
  8. package/dist/client/assets/{CommandCenter-D7mcD61V.js → CommandCenter-B6RnkLYm.js} +1 -1
  9. package/dist/client/assets/{DevServerView-DaqCn0p5.js → DevServerView-DcFL_LzK.js} +1 -1
  10. package/dist/client/assets/{DirectoryPicker-CLdqqqYN.js → DirectoryPicker-CtjqrYoO.js} +1 -1
  11. package/dist/client/assets/{DocumentsView-BOROVxPm.js → DocumentsView-BkAe2S4H.js} +1 -1
  12. package/dist/client/assets/{EvalsView-BQMXRUlQ.js → EvalsView-CbGA9dMn.js} +1 -1
  13. package/dist/client/assets/{ExperimentalAgentOnboardingModal-1GNeCIQT.js → ExperimentalAgentOnboardingModal-CMgO_S8T.js} +1 -1
  14. package/dist/client/assets/{GoalsView-Cr3c_2GC.js → GoalsView-_3P9J5sf.js} +1 -1
  15. package/dist/client/assets/{InsightsView-DgVBVQM4.js → InsightsView-DOhO7xH5.js} +1 -1
  16. package/dist/client/assets/{MemoryView-C0VzzMSw.js → MemoryView-DwJas8vi.js} +1 -1
  17. package/dist/client/assets/{PiExtensionsManager-D1kkkVtP.js → PiExtensionsManager-B_LiW_e9.js} +1 -1
  18. package/dist/client/assets/{PluginManager-BW-_Zyo5.js → PluginManager-BkB6WLQc.js} +1 -1
  19. package/dist/client/assets/{PullRequestView-Cmlo4nWA.js → PullRequestView-DcH5tmYc.js} +1 -1
  20. package/dist/client/assets/{ReportModal-BWuaroTF.js → ReportModal-BOEbqtqG.js} +1 -1
  21. package/dist/client/assets/{ResearchView-BmkF_vZU.js → ResearchView-Dp6V42pI.js} +1 -1
  22. package/dist/client/assets/{SecretsView-DVc8Hky0.js → SecretsView-BCqXHB2L.js} +1 -1
  23. package/dist/client/assets/{SessionTerminal-DCXrxA57.js → SessionTerminal-CkdoQv4y.js} +1 -1
  24. package/dist/client/assets/{SettingsModal-DZ32F1c-.js → SettingsModal-D4Fn4GlS.js} +3 -3
  25. package/dist/client/assets/{SettingsModal-DqwpLnDU.js → SettingsModal-Dc7YG6KB.js} +1 -1
  26. package/dist/client/assets/{SettingsTextareaRow-B5spAoOY.js → SettingsTextareaRow-WSkBoAOO.js} +1 -1
  27. package/dist/client/assets/{SetupWizardModal-VTBLyFzr.js → SetupWizardModal-VTrJAsKd.js} +2 -2
  28. package/dist/client/assets/{SkillsView-CR91ey9d.js → SkillsView-CXeXOxfF.js} +1 -1
  29. package/dist/client/assets/{WorkflowNodeEditor-BzGh_Fd9.js → WorkflowNodeEditor-DoxLGPRF.js} +1 -1
  30. package/dist/client/assets/{agent-import-generation-D27NKQsr.js → agent-import-generation-upc0yw-M.js} +1 -1
  31. package/dist/client/assets/{agentsOrgChartLayout-C2K_M3x3.js → agentsOrgChartLayout-C3iumMrW.js} +1 -1
  32. package/dist/client/assets/{architectureDiagram-3BPJPVTR-BQy8UcRx.js → architectureDiagram-3BPJPVTR-D6jqc3fJ.js} +1 -1
  33. package/dist/client/assets/{blockDiagram-GPEHLZMM-CZG1bqFQ.js → blockDiagram-GPEHLZMM-DY3AKuPD.js} +1 -1
  34. package/dist/client/assets/{c4Diagram-AAUBKEIU-CZmO_kg3.js → c4Diagram-AAUBKEIU-CpD52V4g.js} +1 -1
  35. package/dist/client/assets/channel-CaxOu15c.js +1 -0
  36. package/dist/client/assets/{chunk-2J33WTMH-jsad6DTE.js → chunk-2J33WTMH-CPeIHyAX.js} +1 -1
  37. package/dist/client/assets/{chunk-4BX2VUAB-DX7SuvwP.js → chunk-4BX2VUAB-ivAwI4xM.js} +1 -1
  38. package/dist/client/assets/{chunk-55IACEB6-De20xFgU.js → chunk-55IACEB6-BtVQ5XaZ.js} +1 -1
  39. package/dist/client/assets/{chunk-727SXJPM-CNiri9yW.js → chunk-727SXJPM-1eap1vDU.js} +1 -1
  40. package/dist/client/assets/{chunk-AQP2D5EJ-DvDqG-ax.js → chunk-AQP2D5EJ-B2NB3BW9.js} +1 -1
  41. package/dist/client/assets/{chunk-FMBD7UC4-DkMdKaUq.js → chunk-FMBD7UC4-Hk_smNYv.js} +1 -1
  42. package/dist/client/assets/{chunk-ND2GUHAM-Do5BwIrI.js → chunk-ND2GUHAM-BmGCAojk.js} +1 -1
  43. package/dist/client/assets/{chunk-QZHKN3VN-BnJgt9vl.js → chunk-QZHKN3VN-D0aXZ8CV.js} +1 -1
  44. package/dist/client/assets/classDiagram-4FO5ZUOK-DXIkGbsl.js +1 -0
  45. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DXIkGbsl.js +1 -0
  46. package/dist/client/assets/{cose-bilkent-S5V4N54A-D-ivAzzF.js → cose-bilkent-S5V4N54A-DAbu_gnF.js} +1 -1
  47. package/dist/client/assets/{dagre-BM42HDAG-Bpd9L0or.js → dagre-BM42HDAG-BdmLlrDJ.js} +1 -1
  48. package/dist/client/assets/{dashboard-view-DSvVO6Vr.js → dashboard-view-BoFBSXUn.js} +1 -1
  49. package/dist/client/assets/{dashboard-view-CgBo8Ctn.js → dashboard-view-CULL1yhL.js} +1 -1
  50. package/dist/client/assets/{dashboard-view-C-XU9CVv.js → dashboard-view-CxXMDfNY.js} +1 -1
  51. package/dist/client/assets/{dashboard-view-DbaRE8Ma.js → dashboard-view-PRCWCSLm.js} +1 -1
  52. package/dist/client/assets/{diagram-2AECGRRQ-B6TT1NWU.js → diagram-2AECGRRQ-PpqLbVUA.js} +1 -1
  53. package/dist/client/assets/{diagram-5GNKFQAL-DpRS2yRw.js → diagram-5GNKFQAL-9rkGmTwh.js} +1 -1
  54. package/dist/client/assets/{diagram-KO2AKTUF-BVbZr02C.js → diagram-KO2AKTUF-BT-efOMo.js} +1 -1
  55. package/dist/client/assets/{diagram-LMA3HP47-DzENbfal.js → diagram-LMA3HP47-w79OWFxg.js} +1 -1
  56. package/dist/client/assets/{diagram-OG6HWLK6-BIePG5SY.js → diagram-OG6HWLK6-Bye9I5IO.js} +1 -1
  57. package/dist/client/assets/{erDiagram-TEJ5UH35-CQo3WBwo.js → erDiagram-TEJ5UH35-aodREgDf.js} +1 -1
  58. package/dist/client/assets/{flowDiagram-I6XJVG4X-Ct2H4jYo.js → flowDiagram-I6XJVG4X-D0DKItY3.js} +1 -1
  59. package/dist/client/assets/{folder-open-DAh8mpTX.js → folder-open-CqvaMJvx.js} +1 -1
  60. package/dist/client/assets/{ganttDiagram-6RSMTGT7-DyOLCG4B.js → ganttDiagram-6RSMTGT7-CZVApkvw.js} +1 -1
  61. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-sC28-su3.js → gitGraphDiagram-PVQCEYII-D_ynwJ4p.js} +1 -1
  62. package/dist/client/assets/index-DWRJyaa3.js +2818 -0
  63. package/dist/client/assets/{infoDiagram-5YYISTIA-Q81_5aBZ.js → infoDiagram-5YYISTIA-pJG6zxjk.js} +1 -1
  64. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-Cwkjs0z5.js → ishikawaDiagram-YF4QCWOH-nFZ5laUo.js} +1 -1
  65. package/dist/client/assets/{journeyDiagram-JHISSGLW-BXcBV1Bc.js → journeyDiagram-JHISSGLW-CWpCaAIe.js} +1 -1
  66. package/dist/client/assets/{kanban-definition-UN3LZRKU-BI7hW892.js → kanban-definition-UN3LZRKU-ATkPspKa.js} +1 -1
  67. package/dist/client/assets/{mermaid.core-B8oDA6jj.js → mermaid.core-CDXPNs7a.js} +4 -4
  68. package/dist/client/assets/{mindmap-definition-RKZ34NQL-COG6_9eD.js → mindmap-definition-RKZ34NQL-BkqS9tpe.js} +1 -1
  69. package/dist/client/assets/{pieDiagram-4H26LBE5-D11brZ_N.js → pieDiagram-4H26LBE5-DEUyVLs-.js} +1 -1
  70. package/dist/client/assets/{puzzle-D3_Z_rlW.js → puzzle-DQ0y1-XK.js} +1 -1
  71. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-jmhDVZcv.js → quadrantDiagram-W4KKPZXB-ESBJNK5c.js} +1 -1
  72. package/dist/client/assets/{requirementDiagram-4Y6WPE33-BKCUWI1E.js → requirementDiagram-4Y6WPE33-CqPs7zcv.js} +1 -1
  73. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-HsZdEl2t.js → sankeyDiagram-5OEKKPKP-CkFN0m14.js} +1 -1
  74. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-CsDf7Fup.js → sequenceDiagram-3UESZ5HK-Dx2nDuMO.js} +1 -1
  75. package/dist/client/assets/{shield-alert-C16k8wNu.js → shield-alert-BS05s4RM.js} +1 -1
  76. package/dist/client/assets/{standing-instructions-template-BqAyftqe.js → standing-instructions-template-xprxYNHm.js} +1 -1
  77. package/dist/client/assets/{stateDiagram-AJRCARHV-fvzWhltB.js → stateDiagram-AJRCARHV-EUPmRFGd.js} +1 -1
  78. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-cnt42Sr_.js → stateDiagram-v2-BHNVJYJU-DcQ2mhi5.js} +1 -1
  79. package/dist/client/assets/{timeline-definition-PNZ67QCA-DsZFCSMb.js → timeline-definition-PNZ67QCA-D4YO_3V-.js} +1 -1
  80. package/dist/client/assets/{upload-_s5sL5Pq.js → upload-BjyBtxo7.js} +1 -1
  81. package/dist/client/assets/{users-DH1U5ISc.js → users-D5ogZ7WQ.js} +1 -1
  82. package/dist/client/assets/{vennDiagram-CIIHVFJN-B3KDWS-e.js → vennDiagram-CIIHVFJN-BT5_XuQL.js} +1 -1
  83. package/dist/client/assets/{wardley-L42UT6IY-BKs5MtQS.js → wardley-L42UT6IY-X_ZMW457.js} +1 -1
  84. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-CNsEoXVB.js → wardleyDiagram-YWT4CUSO-GK9nONHU.js} +1 -1
  85. package/dist/client/assets/{xychartDiagram-2RQKCTM6-kq_gW4QC.js → xychartDiagram-2RQKCTM6-Dw3zXHAq.js} +1 -1
  86. package/dist/client/index.html +1 -1
  87. package/dist/client/version.json +1 -1
  88. package/dist/droid-cli/package.json +1 -1
  89. package/dist/extension.js +647 -207
  90. package/dist/migrations/0057_fn_9004_project_ownership_default_reconciliation.sql +13 -0
  91. package/dist/migrations/0058_fn_9014_message_archive.sql +13 -0
  92. package/dist/pi-claude-cli/package.json +5 -5
  93. package/dist/plugin-sdk/index.js +69 -23
  94. package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +69 -23
  95. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  96. package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +69 -23
  97. package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
  98. package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +69 -23
  99. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  100. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +69 -23
  101. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  102. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +69 -23
  103. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  104. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +69 -23
  105. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  106. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +71 -25
  107. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  108. package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +69 -23
  109. package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
  110. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +69 -23
  111. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  112. package/dist/plugins/fusion-plugin-linear-import/bundled.js +69 -23
  113. package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
  114. package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +69 -23
  115. package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
  116. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +69 -23
  117. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  118. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +69 -23
  119. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  120. package/dist/plugins/fusion-plugin-quality/bundled.js +69 -23
  121. package/dist/plugins/fusion-plugin-quality/package.json +1 -1
  122. package/dist/plugins/fusion-plugin-reports/bundled.js +69 -23
  123. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  124. package/dist/plugins/fusion-plugin-roadmap/bundled.js +69 -23
  125. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  126. package/dist/plugins/fusion-plugin-todos/bundled.js +69 -23
  127. package/dist/plugins/fusion-plugin-todos/package.json +1 -1
  128. package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +69 -23
  129. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  130. package/package.json +3 -3
  131. package/skill/fusion/SKILL.md +1 -1
  132. package/skill/fusion/references/extension-tools.md +22 -0
  133. package/skill/fusion/references/fusion-capabilities.md +2 -0
  134. package/dist/client/assets/ChatView-DcM-ARpZ.js +0 -13
  135. package/dist/client/assets/channel-Cwl9FefC.js +0 -1
  136. package/dist/client/assets/classDiagram-4FO5ZUOK-BZtWCoHC.js +0 -1
  137. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BZtWCoHC.js +0 -1
  138. package/dist/client/assets/index-BlGpMJSZ.js +0 -2818
@@ -163414,9 +163414,14 @@ var config = projectSchema.table("config", {
163414
163414
  // now keyed per-project on `project_id` (the effective PK). `id` is retained
163415
163415
  // for column-shape parity (always 1) but is no longer the PK and no longer
163416
163416
  // CHECK-constrained. Single-project / SQLite-parity callers leave project_id
163417
- // at its '' default (one row), preserving the pre-isolation behavior.
163417
+ // through the database ownership trigger, preserving the pre-isolation behavior.
163418
+ /*
163419
+ FNXC:MultiProjectIsolation 2026-08-12-15:43:
163420
+ Migration 0006 owns config's project_id default and leaves its catalog PK as (project_id).
163421
+ Drizzle emits DEFAULT while the database GUC/trigger selects the effective ownership partition.
163422
+ */
163418
163423
  id: integer("id").default(1),
163419
- projectId: text("project_id").notNull().default("").primaryKey(),
163424
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`).primaryKey(),
163420
163425
  nextId: integer("next_id").default(1),
163421
163426
  nextWorkflowStepId: integer("next_workflow_step_id").default(1),
163422
163427
  // FNXC:SqliteFinalRemoval 2026-06-28:
@@ -163810,9 +163815,13 @@ var taskCommitAssociations = projectSchema.table("task_commit_associations", {
163810
163815
  var automations = projectSchema.table("automations", {
163811
163816
  /*
163812
163817
  * FNXC:AutomationIsolation 2026-07-13-22:37:
163813
- * Automations are partitioned by the AsyncDataLayer's project ID because embedded PostgreSQL consolidates the per-project SQLite files into one table. The composite key deliberately permits the same automation ID in two projects without allowing either project's CRUD or cron-claim path to address the other row. The empty default preserves an explicit partition for legacy and project-agnostic callers until startup stamps migrated rows.
163818
+ * Automations are partitioned by the AsyncDataLayer's project ID because embedded PostgreSQL consolidates the per-project SQLite files into one table. The composite key deliberately permits the same automation ID in two projects without allowing either project's CRUD or cron-claim path to address the other row.
163819
+ *
163820
+ * FNXC:MultiProjectIsolation 2026-08-12-15:43:
163821
+ * Migration 0006 owns the default through the database GUC/trigger; Drizzle emits DEFAULT
163822
+ * without replacing the physical legacy fallback or the fail-closed bound writer contract.
163814
163823
  */
163815
- projectId: text("project_id").notNull().default(""),
163824
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
163816
163825
  id: text("id").notNull(),
163817
163826
  name: text("name").notNull(),
163818
163827
  description: text("description"),
@@ -164111,7 +164120,8 @@ var taskDocuments = projectSchema.table("task_documents", {
164111
164120
  index("idxTaskDocumentsTaskId").on(t.taskId)
164112
164121
  ]);
164113
164122
  var artifacts = projectSchema.table("artifacts", {
164114
- id: text("id").primaryKey(),
164123
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
164124
+ id: text("id").notNull(),
164115
164125
  type: text("type").notNull(),
164116
164126
  title: text("title").notNull(),
164117
164127
  description: text("description"),
@@ -164126,7 +164136,8 @@ var artifacts = projectSchema.table("artifacts", {
164126
164136
  createdAt: text("created_at").notNull(),
164127
164137
  updatedAt: text("updated_at").notNull()
164128
164138
  }, (t) => [
164129
- foreignKey({ columns: [t.taskId], foreignColumns: [tasks.id] }).onDelete("cascade"),
164139
+ primaryKey({ columns: [t.projectId, t.id] }),
164140
+ foreignKey({ name: "artifacts_task_id_fkey", columns: [t.projectId, t.taskId], foreignColumns: [tasks.projectId, tasks.id] }).onDelete("cascade"),
164130
164141
  index("idxArtifactsTaskId").on(t.taskId),
164131
164142
  index("idxArtifactsAuthorId").on(t.authorId),
164132
164143
  index("idxArtifactsType").on(t.type),
@@ -164316,7 +164327,8 @@ var evalRunEvents = projectSchema.table("eval_run_events", {
164316
164327
  index("idxEvalRunEventsRunIdSeq").on(t.runId, t.seq)
164317
164328
  ]);
164318
164329
  var secrets = projectSchema.table("secrets", {
164319
- id: text("id").primaryKey(),
164330
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
164331
+ id: text("id").notNull(),
164320
164332
  key: text("key").notNull(),
164321
164333
  valueCiphertext: bytea("value_ciphertext").notNull(),
164322
164334
  nonce: bytea("nonce").notNull(),
@@ -164329,7 +164341,8 @@ var secrets = projectSchema.table("secrets", {
164329
164341
  lastReadAt: text("last_read_at"),
164330
164342
  lastReadBy: text("last_read_by")
164331
164343
  }, (t) => [
164332
- unique("secrets_key_unique").on(t.key),
164344
+ primaryKey({ columns: [t.projectId, t.id] }),
164345
+ unique("secrets_key_unique").on(t.projectId, t.key),
164333
164346
  check("secrets_access_policy_check", sql`${t.accessPolicy} IN ('auto', 'prompt', 'deny')`),
164334
164347
  check("secrets_env_exportable_check", sql`${t.envExportable} IN (0, 1)`)
164335
164348
  ]);
@@ -164371,10 +164384,11 @@ var missions = projectSchema.table("missions", {
164371
164384
  updatedAt: text("updated_at").notNull()
164372
164385
  }, (t) => [primaryKey({ columns: [t.projectId, t.id] })]);
164373
164386
  var branchGroups = projectSchema.table("branch_groups", {
164374
- id: text("id").primaryKey(),
164387
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
164388
+ id: text("id").notNull(),
164375
164389
  sourceType: text("source_type").notNull(),
164376
164390
  sourceId: text("source_id").notNull(),
164377
- branchName: text("branch_name").notNull().unique(),
164391
+ branchName: text("branch_name").notNull(),
164378
164392
  worktreePath: text("worktree_path"),
164379
164393
  autoMerge: integer("auto_merge").notNull().default(0),
164380
164394
  prState: text("pr_state").notNull().default("none"),
@@ -164390,6 +164404,8 @@ var branchGroups = projectSchema.table("branch_groups", {
164390
164404
  updatedAt: bigint("updated_at", { mode: "number" }).notNull(),
164391
164405
  closedAt: bigint("closed_at", { mode: "number" })
164392
164406
  }, (t) => [
164407
+ primaryKey({ columns: [t.projectId, t.id] }),
164408
+ unique("branch_groups_branch_name_key").on(t.projectId, t.branchName),
164393
164409
  check("branch_groups_source_type_check", sql`${t.sourceType} IN ('mission','planning','new-task')`),
164394
164410
  check("branch_groups_pr_state_check", sql`${t.prState} IN ('none','open','merged','closed')`),
164395
164411
  check("branch_groups_status_check", sql`${t.status} IN ('open','finalized','abandoned')`),
@@ -164791,12 +164807,14 @@ var usageEvents = projectSchema.table("usage_events", {
164791
164807
  index("idxUsageEventsKindTs").on(t.kind, t.ts)
164792
164808
  ]);
164793
164809
  var pluginActivations = projectSchema.table("plugin_activations", {
164794
- id: integer("id").generatedAlwaysAsIdentity().primaryKey(),
164810
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
164811
+ id: integer("id").generatedAlwaysAsIdentity().notNull(),
164795
164812
  pluginId: text("plugin_id").notNull(),
164796
164813
  source: text("source").notNull(),
164797
164814
  pluginVersion: text("plugin_version"),
164798
164815
  activatedAt: text("activated_at").notNull()
164799
164816
  }, (t) => [
164817
+ primaryKey({ columns: [t.projectId, t.id] }),
164800
164818
  index("idxPluginActivationsActivatedAt").on(t.activatedAt),
164801
164819
  index("idxPluginActivationsPluginId").on(t.pluginId)
164802
164820
  ]);
@@ -164821,8 +164839,13 @@ var knowledgePages = projectSchema.table("knowledge_pages", {
164821
164839
  index("idxKnowledgePagesUpdatedAt").on(t.updatedAt)
164822
164840
  ]);
164823
164841
  var deployments = projectSchema.table("deployments", {
164824
- id: integer("id").generatedAlwaysAsIdentity().primaryKey(),
164825
- projectId: text("project_id").notNull().default(""),
164842
+ id: integer("id").generatedAlwaysAsIdentity().notNull(),
164843
+ /*
164844
+ FNXC:MultiProjectIsolation 2026-08-12-15:43:
164845
+ Migration 0006 rebuilt deployments_pkey as (project_id, id). Drizzle emits DEFAULT while the
164846
+ database GUC/trigger keeps ownership stamping and the physical legacy fallback authoritative.
164847
+ */
164848
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
164826
164849
  deploymentId: text("deployment_id").notNull(),
164827
164850
  service: text("service"),
164828
164851
  environment: text("environment"),
@@ -164833,6 +164856,7 @@ var deployments = projectSchema.table("deployments", {
164833
164856
  meta: jsonb("meta"),
164834
164857
  createdAt: text("created_at").notNull()
164835
164858
  }, (t) => [
164859
+ primaryKey({ columns: [t.projectId, t.id], name: "deployments_pkey" }),
164836
164860
  uniqueIndex("idxDeploymentsProjectDeploymentId").on(t.projectId, t.deploymentId),
164837
164861
  index("idxDeploymentsProjectDeployedAt").on(t.projectId, t.deployedAt),
164838
164862
  index("idxDeploymentsDeployedAt").on(t.deployedAt),
@@ -164840,7 +164864,12 @@ var deployments = projectSchema.table("deployments", {
164840
164864
  ]);
164841
164865
  var githubCheckStates = projectSchema.table("github_check_states", {
164842
164866
  id: integer("id").generatedAlwaysAsIdentity().notNull(),
164843
- projectId: text("project_id").notNull().default(""),
164867
+ /*
164868
+ FNXC:MultiProjectIsolation 2026-08-12-15:43:
164869
+ Migration 0048 post-dated 0006, so FN-9004 reconciles its physical default to the ownership
164870
+ expression. Drizzle emits DEFAULT while the database GUC/trigger remains the stamping authority.
164871
+ */
164872
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
164844
164873
  repo: text("repo").notNull(),
164845
164874
  headSha: text("head_sha").notNull(),
164846
164875
  checkName: text("check_name").notNull(),
@@ -164860,9 +164889,14 @@ var githubCheckStates = projectSchema.table("github_check_states", {
164860
164889
  index("idxGithubCheckStatesProjectReceived").on(t.projectId, t.receivedAt)
164861
164890
  ]);
164862
164891
  var incidents = projectSchema.table("incidents", {
164863
- id: integer("id").generatedAlwaysAsIdentity().primaryKey(),
164864
- projectId: text("project_id").notNull().default(""),
164865
- incidentId: text("incident_id").notNull().unique(),
164892
+ id: integer("id").generatedAlwaysAsIdentity().notNull(),
164893
+ /*
164894
+ FNXC:MultiProjectIsolation 2026-08-12-15:43:
164895
+ Migration 0006 rebuilt incident keys with project_id first. Drizzle emits DEFAULT while the
164896
+ database GUC/trigger retains ownership stamping and its physical legacy fallback.
164897
+ */
164898
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
164899
+ incidentId: text("incident_id").notNull(),
164866
164900
  groupingKey: text("grouping_key").notNull(),
164867
164901
  title: text("title").notNull(),
164868
164902
  severity: text("severity"),
@@ -164876,6 +164910,8 @@ var incidents = projectSchema.table("incidents", {
164876
164910
  createdAt: text("created_at").notNull(),
164877
164911
  updatedAt: text("updated_at").notNull()
164878
164912
  }, (t) => [
164913
+ primaryKey({ columns: [t.projectId, t.id], name: "incidents_pkey" }),
164914
+ unique("incidents_incident_id_key").on(t.projectId, t.incidentId),
164879
164915
  index("idxIncidentsProjectOpenedAt").on(t.projectId, t.openedAt),
164880
164916
  index("idxIncidentsProjectStatus").on(t.projectId, t.status),
164881
164917
  index("idxIncidentsGroupingKey").on(t.groupingKey),
@@ -164930,12 +164966,14 @@ var messages = projectSchema.table("messages", {
164930
164966
  content: text("content").notNull(),
164931
164967
  type: text("type").notNull(),
164932
164968
  read: integer("read").default(0),
164969
+ archived: integer("archived").default(0),
164933
164970
  metadata: jsonb("metadata"),
164934
164971
  createdAt: text("created_at").notNull(),
164935
164972
  updatedAt: text("updated_at").notNull()
164936
164973
  }, (t) => [
164937
164974
  primaryKey({ columns: [t.projectId, t.id] }),
164938
164975
  index("idxMessagesTo").on(t.toId, t.toType, t.read),
164976
+ index("idxMessagesToArchived").on(t.toId, t.toType, t.archived),
164939
164977
  index("idxMessagesFrom").on(t.fromId, t.fromType),
164940
164978
  index("idxMessagesCreatedAt").on(t.createdAt)
164941
164979
  ]);
@@ -165036,7 +165074,8 @@ var cliSessions = projectSchema.table("cli_sessions", {
165036
165074
  index("idx_cli_sessions_project_state").on(t.projectId, t.agentState)
165037
165075
  ]);
165038
165076
  var chatMessages = projectSchema.table("chat_messages", {
165039
- id: text("id").primaryKey(),
165077
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
165078
+ id: text("id").notNull(),
165040
165079
  sessionId: text("session_id").notNull(),
165041
165080
  role: text("role").notNull(),
165042
165081
  content: text("content").notNull(),
@@ -165045,6 +165084,7 @@ var chatMessages = projectSchema.table("chat_messages", {
165045
165084
  createdAt: text("created_at").notNull(),
165046
165085
  attachments: jsonb("attachments")
165047
165086
  }, (t) => [
165087
+ primaryKey({ columns: [t.projectId, t.id] }),
165048
165088
  index("idxChatMessagesSessionId").on(t.sessionId),
165049
165089
  index("idxChatMessagesCreatedAt").on(t.createdAt)
165050
165090
  ]);
@@ -165070,7 +165110,8 @@ var chatTokenUsage = projectSchema.table("chat_token_usage", {
165070
165110
  index("idxChatTokenUsageCreatedAt").on(t.createdAt)
165071
165111
  ]);
165072
165112
  var runAuditEvents = projectSchema.table("run_audit_events", {
165073
- id: text("id").primaryKey(),
165113
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
165114
+ id: text("id").notNull(),
165074
165115
  timestamp: text("timestamp").notNull(),
165075
165116
  taskId: text("task_id"),
165076
165117
  agentId: text("agent_id").notNull(),
@@ -165080,6 +165121,7 @@ var runAuditEvents = projectSchema.table("run_audit_events", {
165080
165121
  target: text("target").notNull(),
165081
165122
  metadata: jsonb("metadata")
165082
165123
  }, (t) => [
165124
+ primaryKey({ columns: [t.projectId, t.id] }),
165083
165125
  index("idxRunAuditEventsRunIdTimestamp").on(t.runId, t.timestamp),
165084
165126
  index("idxRunAuditEventsTaskIdTimestamp").on(t.taskId, t.timestamp),
165085
165127
  index("idxRunAuditEventsTimestamp").on(t.timestamp)
@@ -165180,13 +165222,14 @@ var missionLineageStops = projectSchema.table("mission_lineage_stops", {
165180
165222
  index("idxMissionLineageStopsMissionId").on(t.projectId, t.missionId)
165181
165223
  ]);
165182
165224
  var verificationCache = projectSchema.table("verification_cache", {
165225
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
165183
165226
  treeSha: text("tree_sha").notNull(),
165184
165227
  testCommand: text("test_command").notNull().default(""),
165185
165228
  buildCommand: text("build_command").notNull().default(""),
165186
165229
  recordedAt: text("recorded_at").notNull(),
165187
165230
  taskId: text("task_id")
165188
165231
  }, (t) => [
165189
- primaryKey({ columns: [t.treeSha, t.testCommand, t.buildCommand] }),
165232
+ primaryKey({ columns: [t.projectId, t.treeSha, t.testCommand, t.buildCommand] }),
165190
165233
  index("idxVerificationCacheRecordedAt").on(t.recordedAt)
165191
165234
  ]);
165192
165235
  var importTranslationCache = projectSchema.table("import_translation_cache", {
@@ -165219,7 +165262,8 @@ var importTranslationCache = projectSchema.table("import_translation_cache", {
165219
165262
  index("idxImportTranslationCacheRecordedAt").on(t.recordedAt)
165220
165263
  ]);
165221
165264
  var approvalRequests = projectSchema.table("approval_requests", {
165222
- id: text("id").primaryKey(),
165265
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
165266
+ id: text("id").notNull(),
165223
165267
  status: text("status").notNull(),
165224
165268
  requesterActorId: text("requester_actor_id").notNull(),
165225
165269
  requesterActorType: text("requester_actor_type").notNull(),
@@ -165238,13 +165282,14 @@ var approvalRequests = projectSchema.table("approval_requests", {
165238
165282
  createdAt: text("created_at").notNull(),
165239
165283
  updatedAt: text("updated_at").notNull()
165240
165284
  }, (t) => [
165285
+ primaryKey({ columns: [t.projectId, t.id] }),
165241
165286
  index("idxApprovalRequestsStatusCreatedAt").on(t.status, t.createdAt),
165242
165287
  index("idxApprovalRequestsRequesterCreatedAt").on(t.requesterActorId, t.createdAt),
165243
165288
  index("idxApprovalRequestsTaskCreatedAt").on(t.taskId, t.createdAt)
165244
165289
  ]);
165245
165290
  var approvalRequestAuditEvents = projectSchema.table("approval_request_audit_events", {
165246
- projectId: text("project_id").notNull().default(""),
165247
- id: text("id").primaryKey(),
165291
+ projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
165292
+ id: text("id").notNull(),
165248
165293
  requestId: text("request_id").notNull(),
165249
165294
  eventType: text("event_type").notNull(),
165250
165295
  actorId: text("actor_id").notNull(),
@@ -165253,6 +165298,7 @@ var approvalRequestAuditEvents = projectSchema.table("approval_request_audit_eve
165253
165298
  note: text("note"),
165254
165299
  createdAt: text("created_at").notNull()
165255
165300
  }, (t) => [
165301
+ primaryKey({ columns: [t.projectId, t.id] }),
165256
165302
  index("idxApprovalRequestAuditRequestCreatedAt").on(t.requestId, t.createdAt, t.id),
165257
165303
  index("idxApprovalRequestAuditProjectCreatedAt").on(t.projectId, t.createdAt)
165258
165304
  ]);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/whatsapp-chat",
3
- "version": "0.1.54-beta.1",
3
+ "version": "0.1.54-beta.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runfusion/fusion",
3
- "version": "0.76.0-beta.1",
3
+ "version": "0.76.0-beta.2",
4
4
  "license": "MIT",
5
5
  "description": "Fusion CLI: HTTP API server, daemon, dashboard launcher, and task tooling for the Fusion AI coding agent.",
6
6
  "homepage": "https://github.com/Runfusion/Fusion#readme",
@@ -49,8 +49,8 @@
49
49
  "dependencies": {
50
50
  "@agentclientprotocol/sdk": "0.24.0",
51
51
  "agent-browser": "0.26.0",
52
- "@earendil-works/pi-ai": "0.82.1",
53
- "@earendil-works/pi-coding-agent": "0.82.1",
52
+ "@earendil-works/pi-ai": "0.84.1",
53
+ "@earendil-works/pi-coding-agent": "0.84.1",
54
54
  "claude-code-cli-acp": "0.1.1",
55
55
  "dockerode": "^4.0.12",
56
56
  "electron": "^33.4.11",
@@ -32,7 +32,7 @@ Mission → Milestone → Slice → Feature → Task
32
32
  - **GitHub tools** — `fn_task_import_github`, `fn_task_import_github_issue`, `fn_task_browse_github_issues`
33
33
  - **Mission tools** — `fn_mission_create`, `fn_mission_list`, `fn_mission_show`, `fn_mission_list_goals`, `fn_mission_link_goal`, `fn_mission_unlink_goal`, `fn_mission_backfill_assertions`, `fn_mission_delete`, `fn_mission_set_status`, `fn_mission_clear_blocked`, `fn_mission_update`, `fn_milestone_add`, `fn_slice_add`, `fn_feature_add`, `fn_feature_delete`, `fn_slice_delete`, `fn_milestone_delete`, `fn_slice_activate`, `fn_feature_link_task`, `fn_feature_set_status`, `fn_mission_reconcile`, `fn_feature_repair_validation`, `fn_feature_update`, `fn_milestone_update`
34
34
  - **Goal tools** — `fn_goal_list`, `fn_goal_create`, `fn_goal_archive`, `fn_goal_show`
35
- - **Agent tools** — `fn_agent_stop`, `fn_agent_start`, `fn_agent_create`, `fn_agent_update`, `fn_agent_set_instructions`, `fn_agent_delete`, `fn_list_agents`, `fn_delegate_task`, `fn_agent_show`, `fn_agent_org_chart`
35
+ - **Agent tools** — `fn_agent_stop`, `fn_agent_start`, `fn_agent_create`, `fn_agent_update`, `fn_agent_set_instructions`, `fn_agent_read_evaluations`, `fn_agent_evaluation_followup`, `fn_agent_delete`, `fn_list_agents`, `fn_delegate_task`, `fn_agent_show`, `fn_agent_org_chart`
36
36
  - **Skills tools** — `fn_skills_search`, `fn_skills_install`
37
37
  - **Insight tools** — `fn_insight_list`, `fn_insight_show`, `fn_insight_run_list`, `fn_insight_run_show`
38
38
  - **Other tools** — `fn_web_fetch`, `fn_secret_get`, `fn_experiment_finalize`
@@ -680,6 +680,28 @@ Set the instructionsText and/or instructionsPath of one of the caller's direct o
680
680
  | `instructions_text` | string | — | Inline instructions. Pass an empty string to clear. |
681
681
  | `instructions_path` | string | — | Path to a markdown instructions file. Pass an empty string to clear. |
682
682
 
683
+ ### fn_agent_read_evaluations
684
+
685
+ Read ratings, feedback, reflections, and performance data for a direct or indirect report.
686
+
687
+ | Parameter | Type | Required | Description |
688
+ |-----------|------|----------|-------------|
689
+ | `agent_id` | string | ✓ | Target agent ID or resolvable name |
690
+ | `rating_limit` | number | — | Maximum ratings to return (default 10) |
691
+ | `reflection_limit` | number | — | Maximum reflections to return (default 5) |
692
+
693
+ ### fn_agent_evaluation_followup
694
+
695
+ Record a coaching evaluation follow-up for a direct or indirect report to read through its self-improvement loop.
696
+
697
+ | Parameter | Type | Required | Description |
698
+ |-----------|------|----------|-------------|
699
+ | `agent_id` | string | ✓ | Target agent ID or resolvable name |
700
+ | `score` | number | ✓ | Evaluation score from 1 to 5 |
701
+ | `comment` | string | ✓ | Coaching or follow-up note |
702
+ | `category` | string | — | Optional evaluation category |
703
+ | `task_id` | string | — | Optional related task ID |
704
+
683
705
  ### fn_agent_delete
684
706
 
685
707
  Delete a non-ephemeral agent.
@@ -87,6 +87,8 @@ All skill/extension tool invocations in this catalog use the public `fn_*` names
87
87
  | `fn_agent_create` | Create a new non-ephemeral agent. |
88
88
  | `fn_agent_update` | Update editable configuration for an existing non-ephemeral agent. Agent callers can only update direct or indirect reports inside their management subtree; user/operator calls are privileged. |
89
89
  | `fn_agent_set_instructions` | Set the instructionsText and/or instructionsPath of one of the caller's direct or indirect reports. At least one of instructions_text or instructions_path is required; pass an empty string to clear a field. The change is persisted and recorded as a config revision. |
90
+ | `fn_agent_read_evaluations` | Read ratings, feedback, reflections, and performance data for a direct or indirect report. |
91
+ | `fn_agent_evaluation_followup` | Record a coaching evaluation follow-up for a direct or indirect report to read through its self-improvement loop. |
90
92
  | `fn_agent_delete` | Delete a non-ephemeral agent. |
91
93
  | `fn_list_agents` | List all available agents in the system. Shows each agent's name, role, state, personality (soul), and current assignment. Use this to discover which agents exist and what they specialize in before delegating work. |
92
94
  | `fn_delegate_task` | Create a new task and assign it to a specific agent for execution. The task lands in the selected workflow's ready lane (`todo` on the built-in board, whatever that workflow calls it otherwise) and will be picked up by the target agent on their next heartbeat cycle. Use fn_list_agents first to find available agents and their capabilities. Optionally pass workflow_id to select a workflow at creation time; use fn_workflow_list to discover valid IDs. |