@runfusion/fusion 0.77.0-beta.6 → 0.77.0-beta.7

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 (166) hide show
  1. package/dist/bin.js +42309 -39335
  2. package/dist/child-process-worker.js +7394 -4875
  3. package/dist/client/.vite/manifest.json +267 -330
  4. package/dist/client/assets/{AgentDetailView-oyY72uSo.js → AgentDetailView-C1eh_vXv.js} +4 -4
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-C3Qo9p1M.js → AgentPermissionPolicyEditor-CeKsO1LR.js} +2 -2
  6. package/dist/client/assets/{AgentsView-M2MhTIGW.js → AgentsView-BNe2ABOc.js} +4 -4
  7. package/dist/client/assets/{CommandCenter-CpcAt6jt.js → CommandCenter-BuREM-G1.js} +18 -18
  8. package/dist/client/assets/DevServerView-D0i1b-QO.js +1 -0
  9. package/dist/client/assets/DirectoryPicker-VOx91hQt.js +1 -0
  10. package/dist/client/assets/DocumentsView-CO5W_WVb.js +1 -0
  11. package/dist/client/assets/EvalsView-BqSINSrZ.js +1 -0
  12. package/dist/client/assets/ExperimentalAgentOnboardingModal-DEcFgONi.js +1 -0
  13. package/dist/client/assets/{GoalsView-DPj59B3l.js → GoalsView-DZ57wXmJ.js} +1 -1
  14. package/dist/client/assets/{InsightsView-QLJNkKJp.js → InsightsView-DSWfXG7Q.js} +3 -3
  15. package/dist/client/assets/{MemoryView-CDCS-1ig.js → MemoryView-BEX10uhl.js} +1 -1
  16. package/dist/client/assets/{PiExtensionsManager-DktXXrmF.js → PiExtensionsManager-DcAmXXoR.js} +2 -2
  17. package/dist/client/assets/PluginManager-BU0omQUv.js +1 -0
  18. package/dist/client/assets/{PullRequestView-CkObT6e3.js → PullRequestView-B-JL_8Kk.js} +2 -2
  19. package/dist/client/assets/{ReportModal-B5LTdDgi.js → ReportModal-DxggF_RH.js} +5 -5
  20. package/dist/client/assets/{ResearchView-CryFrV8l.js → ResearchView-CnwTXfQO.js} +1 -1
  21. package/dist/client/assets/{SecretsView-9YcNW_fo.js → SecretsView-BDvzsLFz.js} +1 -1
  22. package/dist/client/assets/SettingsModal-801eFQ9u.js +21 -0
  23. package/dist/client/assets/{SettingsModal-llkoaJev.js → SettingsModal-BZHeQ3ED.js} +1 -1
  24. package/dist/client/assets/{SettingsTextareaRow-B_Legu-A.js → SettingsTextareaRow-B0rTuelr.js} +1 -1
  25. package/dist/client/assets/SetupWizardModal-CoExPwIn.js +2 -0
  26. package/dist/client/assets/{SkillsView-CSeauwIw.js → SkillsView-WVP25LPj.js} +1 -1
  27. package/dist/client/assets/WorkflowNodeEditor-pCMyKcnS.js +8 -0
  28. package/dist/client/assets/{agent-import-generation-CttglSmZ.js → agent-import-generation-M_hKtjgN.js} +1 -1
  29. package/dist/client/assets/{agentsOrgChartLayout-f-9mwRbD.js → agentsOrgChartLayout-DjvIMhFD.js} +1 -1
  30. package/dist/client/assets/{app-C_PTWuI1.js → app-BOvA34XN.js} +3 -3
  31. package/dist/client/assets/{app-BBSLJDbV.js → app-Bic4iWXQ.js} +3 -3
  32. package/dist/client/assets/{app-Bvr57EZQ.js → app-BlbH7Tir.js} +2 -2
  33. package/dist/client/assets/{app-DwvelD-n.js → app-C6TctczU.js} +3 -3
  34. package/dist/client/assets/{app-DRW5hIgr.js → app-D3qZmEIu.js} +3 -3
  35. package/dist/client/assets/{app-BKwOvuxE.js → app-DLnMkUt5.js} +2 -2
  36. package/dist/client/assets/{app-DKx18PHE.js → app-mNy0DeDM.js} +3 -3
  37. package/dist/client/assets/{architectureDiagram-3BPJPVTR-DA_Hm_di.js → architectureDiagram-3BPJPVTR-CkzEm8i9.js} +1 -1
  38. package/dist/client/assets/{blockDiagram-GPEHLZMM-JF7K8CcV.js → blockDiagram-GPEHLZMM-Dc-dUMjY.js} +1 -1
  39. package/dist/client/assets/{c4Diagram-AAUBKEIU-DN-wklCP.js → c4Diagram-AAUBKEIU-DnYjsrR0.js} +1 -1
  40. package/dist/client/assets/channel-CxQ40s_U.js +1 -0
  41. package/dist/client/assets/{chunk-2J33WTMH-ChtjU8Cu.js → chunk-2J33WTMH-0E1GEFEr.js} +1 -1
  42. package/dist/client/assets/{chunk-4BX2VUAB-dJL0n3nn.js → chunk-4BX2VUAB-Dj5oZd51.js} +1 -1
  43. package/dist/client/assets/{chunk-55IACEB6-Bfg-QB9A.js → chunk-55IACEB6-DfNT0s8E.js} +1 -1
  44. package/dist/client/assets/{chunk-727SXJPM-BHPPwYUS.js → chunk-727SXJPM-BnFjhiIQ.js} +1 -1
  45. package/dist/client/assets/{chunk-AQP2D5EJ-DIIpPUQN.js → chunk-AQP2D5EJ-DR84wSqR.js} +1 -1
  46. package/dist/client/assets/{chunk-FMBD7UC4-D230R32b.js → chunk-FMBD7UC4-IjByNOrR.js} +1 -1
  47. package/dist/client/assets/{chunk-ND2GUHAM-0Lhp5CRv.js → chunk-ND2GUHAM-By0q_jZm.js} +1 -1
  48. package/dist/client/assets/{chunk-QZHKN3VN-BxbHBfKJ.js → chunk-QZHKN3VN-BELcl3N5.js} +1 -1
  49. package/dist/client/assets/classDiagram-4FO5ZUOK-C2ARdiRL.js +1 -0
  50. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C2ARdiRL.js +1 -0
  51. package/dist/client/assets/{common-13IRj_PO.js → common-BsNuuNOe.js} +1 -1
  52. package/dist/client/assets/{common-BBynATth.js → common-CASsTuSW.js} +1 -1
  53. package/dist/client/assets/{common-BG-vw0tL.js → common-CfyFt5OG.js} +1 -1
  54. package/dist/client/assets/{common-DSo46rnH.js → common-DS98trLj.js} +1 -1
  55. package/dist/client/assets/common-DeoHWJCq.js +1 -0
  56. package/dist/client/assets/common-PpMdoH5r.js +1 -0
  57. package/dist/client/assets/{common-vpHuuvkd.js → common-cN--mrmm.js} +1 -1
  58. package/dist/client/assets/{cose-bilkent-S5V4N54A-3vEwhfYz.js → cose-bilkent-S5V4N54A-D4cCw9-_.js} +1 -1
  59. package/dist/client/assets/{dagre-BM42HDAG-Br44UsdY.js → dagre-BM42HDAG-JJp5dVeY.js} +1 -1
  60. package/dist/client/assets/dashboard-view-6zPJm9zC.js +1 -0
  61. package/dist/client/assets/{dashboard-view-_EglxMDl.js → dashboard-view-Bl9CPhxE.js} +1 -1
  62. package/dist/client/assets/{dashboard-view-BldxxYfz.js → dashboard-view-C5Nt8cvY.js} +1 -1
  63. package/dist/client/assets/{dashboard-view-CcPcELPx.js → dashboard-view-MAC_LHDX.js} +2 -2
  64. package/dist/client/assets/{diagram-2AECGRRQ-CLNxbHUP.js → diagram-2AECGRRQ-D4L7j_t_.js} +1 -1
  65. package/dist/client/assets/{diagram-5GNKFQAL-D3cNAeQH.js → diagram-5GNKFQAL-VAGFaXqG.js} +1 -1
  66. package/dist/client/assets/{diagram-KO2AKTUF-DkX7h6to.js → diagram-KO2AKTUF-hqXSggfW.js} +1 -1
  67. package/dist/client/assets/{diagram-LMA3HP47-6iQIiYUr.js → diagram-LMA3HP47-B3eAIuy8.js} +1 -1
  68. package/dist/client/assets/{diagram-OG6HWLK6-Caje3229.js → diagram-OG6HWLK6-BGufp0RK.js} +1 -1
  69. package/dist/client/assets/{erDiagram-TEJ5UH35-BkU-1HB1.js → erDiagram-TEJ5UH35-DplXdx8w.js} +1 -1
  70. package/dist/client/assets/{flowDiagram-I6XJVG4X-BRx3V6RE.js → flowDiagram-I6XJVG4X-C1Ms2bko.js} +1 -1
  71. package/dist/client/assets/{folder-open-BaSOBfk2.js → folder-open-nMraSDXu.js} +1 -1
  72. package/dist/client/assets/{ganttDiagram-6RSMTGT7-D9f1kH3t.js → ganttDiagram-6RSMTGT7-DVgxMtXb.js} +1 -1
  73. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CQwmZcRd.js → gitGraphDiagram-PVQCEYII-DH2_n0J8.js} +1 -1
  74. package/dist/client/assets/index-BJc-A7eB.css +1 -0
  75. package/dist/client/assets/index-CBFPgFTp.js +2787 -0
  76. package/dist/client/assets/{infoDiagram-5YYISTIA-DYWBkGjG.js → infoDiagram-5YYISTIA-DmZdWVcU.js} +1 -1
  77. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-Df0Nzvh4.js → ishikawaDiagram-YF4QCWOH-DsEIHSXr.js} +1 -1
  78. package/dist/client/assets/{journeyDiagram-JHISSGLW-bSvrZSyZ.js → journeyDiagram-JHISSGLW-CsfIWmu1.js} +1 -1
  79. package/dist/client/assets/{kanban-definition-UN3LZRKU-yHJ101M8.js → kanban-definition-UN3LZRKU-CQKqeZvc.js} +1 -1
  80. package/dist/client/assets/{mermaid.core-Bc_0VLJw.js → mermaid.core-DkC_dr4-.js} +4 -4
  81. package/dist/client/assets/{mindmap-definition-RKZ34NQL-DWRnMguM.js → mindmap-definition-RKZ34NQL-RnmE-NUe.js} +1 -1
  82. package/dist/client/assets/{pieDiagram-4H26LBE5-Ds-DEOqr.js → pieDiagram-4H26LBE5-DPu6FPc4.js} +1 -1
  83. package/dist/client/assets/{puzzle-CdYF81IT.js → puzzle-DwhHOf32.js} +1 -1
  84. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Bz-j2fkf.js → quadrantDiagram-W4KKPZXB-CYbypO2p.js} +1 -1
  85. package/dist/client/assets/{requirementDiagram-4Y6WPE33-BaQ_PaZ-.js → requirementDiagram-4Y6WPE33-DFk1vK_N.js} +1 -1
  86. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-pUCz8V4-.js → sankeyDiagram-5OEKKPKP-CkUY1Zzu.js} +1 -1
  87. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-CFwUMspe.js → sequenceDiagram-3UESZ5HK-CFivaLOO.js} +1 -1
  88. package/dist/client/assets/{standing-instructions-template-Crocrob7.js → standing-instructions-template-BbqKGAC1.js} +2 -2
  89. package/dist/client/assets/{stateDiagram-AJRCARHV-CHZwo-vd.js → stateDiagram-AJRCARHV-BPeD5PwG.js} +1 -1
  90. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-BTvKaIZR.js → stateDiagram-v2-BHNVJYJU-DduiCPMb.js} +1 -1
  91. package/dist/client/assets/{timeline-definition-PNZ67QCA-Cn3XIoz2.js → timeline-definition-PNZ67QCA-CGUNNVro.js} +1 -1
  92. package/dist/client/assets/{upload--GqImz6h.js → upload-BS96H1o7.js} +1 -1
  93. package/dist/client/assets/{users-B0h1q4x6.js → users--irrWoyU.js} +1 -1
  94. package/dist/client/assets/{vennDiagram-CIIHVFJN-CS0FNVU_.js → vennDiagram-CIIHVFJN-CybTaJJH.js} +1 -1
  95. package/dist/client/assets/{wardley-L42UT6IY-DdYkfF5d.js → wardley-L42UT6IY-DSxaSCGi.js} +1 -1
  96. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-B_rFmPCh.js → wardleyDiagram-YWT4CUSO-YFb0AxNt.js} +1 -1
  97. package/dist/client/assets/{xychartDiagram-2RQKCTM6-CCoaCgmc.js → xychartDiagram-2RQKCTM6-Cv6zlMJC.js} +1 -1
  98. package/dist/client/index.html +2 -2
  99. package/dist/client/version.json +1 -1
  100. package/dist/droid-cli/package.json +1 -1
  101. package/dist/extension.js +23565 -20733
  102. package/dist/migrations/0065_fn_149_review_convergence_stage.sql +3 -0
  103. package/dist/pi-claude-cli/package.json +1 -1
  104. package/dist/plugin-sdk/index.d.ts +57 -10
  105. package/dist/plugin-sdk/index.js +103 -33
  106. package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +158 -36
  107. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  108. package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +103 -33
  109. package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
  110. package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +103 -33
  111. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  112. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +103 -33
  113. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  114. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +103 -33
  115. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  116. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +103 -33
  117. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  118. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +103 -33
  119. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  120. package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +103 -33
  121. package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
  122. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +103 -33
  123. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  124. package/dist/plugins/fusion-plugin-linear-import/bundled.js +103 -33
  125. package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
  126. package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +103 -33
  127. package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
  128. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +103 -33
  129. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  130. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +103 -33
  131. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  132. package/dist/plugins/fusion-plugin-quality/bundled.js +103 -33
  133. package/dist/plugins/fusion-plugin-quality/package.json +1 -1
  134. package/dist/plugins/fusion-plugin-reports/bundled.js +103 -33
  135. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  136. package/dist/plugins/fusion-plugin-roadmap/bundled.js +103 -33
  137. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  138. package/dist/plugins/fusion-plugin-todos/bundled.js +103 -33
  139. package/dist/plugins/fusion-plugin-todos/package.json +1 -1
  140. package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +103 -33
  141. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  142. package/package.json +1 -1
  143. package/skill/fusion/references/engine-tools.md +5 -5
  144. package/dist/client/assets/ChatView-DS4XiCm_.css +0 -1
  145. package/dist/client/assets/ChatView-zKrUSqiQ.js +0 -13
  146. package/dist/client/assets/DevServerView-CjTneoG7.js +0 -1
  147. package/dist/client/assets/DirectoryPicker-BY6V5HLV.js +0 -1
  148. package/dist/client/assets/DocumentsView-RDK56-qg.js +0 -1
  149. package/dist/client/assets/EvalsView-DKK4ceUW.js +0 -1
  150. package/dist/client/assets/ExperimentalAgentOnboardingModal-DiBPZVwC.js +0 -1
  151. package/dist/client/assets/PluginManager-CQ3iEFMq.js +0 -1
  152. package/dist/client/assets/SessionTerminal-2ZSXmOkG.css +0 -1
  153. package/dist/client/assets/SessionTerminal-BWsA9puD.js +0 -2
  154. package/dist/client/assets/SettingsModal-CL6aiXiI.js +0 -21
  155. package/dist/client/assets/SetupWizardModal-DLA4UAGp.js +0 -2
  156. package/dist/client/assets/WorkflowNodeEditor-CGgMiiWy.js +0 -8
  157. package/dist/client/assets/channel-CwFfFSI9.js +0 -1
  158. package/dist/client/assets/classDiagram-4FO5ZUOK-C8dZsxxX.js +0 -1
  159. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C8dZsxxX.js +0 -1
  160. package/dist/client/assets/common-DbOCE-0i.js +0 -1
  161. package/dist/client/assets/common-DnXF4Jmj.js +0 -1
  162. package/dist/client/assets/dashboard-view-B0OM3KYC.js +0 -1
  163. package/dist/client/assets/index-B8PcG8AJ.js +0 -2774
  164. package/dist/client/assets/index-Dki2LBAp.css +0 -1
  165. package/dist/client/assets/shield-alert-4qeU3_Rm.js +0 -6
  166. package/dist/client/assets/useDiscoveredSkillsCache-BEHgTFai.js +0 -1
@@ -163179,6 +163179,8 @@ var tasks = projectSchema.table("tasks", {
163179
163179
  branchConflictRecoveryCount: integer("branch_conflict_recovery_count").default(0),
163180
163180
  reviewerContextRetryCount: integer("reviewer_context_retry_count").default(0),
163181
163181
  reviewerFallbackRetryCount: integer("reviewer_fallback_retry_count").default(0),
163182
+ reviewConvergenceStage: integer("review_convergence_stage").default(0),
163183
+ reviewConvergenceEscalationCount: integer("review_convergence_escalation_count").default(0),
163182
163184
  nextRecoveryAt: text("next_recovery_at"),
163183
163185
  error: text("error"),
163184
163186
  summary: text("summary"),
@@ -166276,6 +166278,7 @@ var DEFAULT_GLOBAL_SETTINGS = {
166276
166278
  openrouterAppAttribution: void 0,
166277
166279
  openrouterModelFilters: void 0,
166278
166280
  openrouterProviderPreferences: void 0,
166281
+ orcarouterModelSync: true,
166279
166282
  opencodeGoModelSync: true,
166280
166283
  updateCheckEnabled: true,
166281
166284
  fnBinaryCheckEnabled: true,
@@ -166691,6 +166694,12 @@ var DEFAULT_PROJECT_SETTINGS = {
166691
166694
  executorEscalationProvider: void 0,
166692
166695
  executorEscalationModelId: void 0,
166693
166696
  executorEscalationNodeId: void 0,
166697
+ reviewConvergenceEscalationEnabled: true,
166698
+ reviewConvergenceEscalationProvider: void 0,
166699
+ reviewConvergenceEscalationModelId: void 0,
166700
+ reviewArbitrationEnabled: true,
166701
+ reviewArbitrationProvider: void 0,
166702
+ reviewArbitrationModelId: void 0,
166694
166703
  /**
166695
166704
  * FNXC:Merge 2026-06-26-00:00:
166696
166705
  * 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.
@@ -169762,6 +169771,49 @@ var BUILTIN_REVIEW_REVISION_SETTINGS = [
169762
169771
  default: DEFAULT_CODE_REVIEW_BLOCKING_SEVERITY,
169763
169772
  description: 'Minimum finding severity that lets Code Review block merge. A REVISE carrying no finding at or above this level is recorded as APPROVE_WITH_NOTES and its findings are handed to the implementer. Choose "any" to block on every REVISE.'
169764
169773
  },
169774
+ /*
169775
+ * FNXC:ReviewConvergence 2026-08-22-05:42:
169776
+ * FN-149 keeps recovery targets workflow-native so operators choose the cost and
169777
+ * capability of automatic review convergence without widening project policy.
169778
+ */
169779
+ {
169780
+ id: "reviewConvergenceEscalationEnabled",
169781
+ name: "Review convergence escalation",
169782
+ type: "boolean",
169783
+ default: true,
169784
+ description: "Run one bounded alternate-model or replan recovery when a review repeats unchanged input."
169785
+ },
169786
+ {
169787
+ id: "reviewConvergenceEscalationProvider",
169788
+ name: "Review convergence escalation provider",
169789
+ type: "string",
169790
+ description: "Provider for the optional alternate-model review remediation target."
169791
+ },
169792
+ {
169793
+ id: "reviewConvergenceEscalationModelId",
169794
+ name: "Review convergence escalation model",
169795
+ type: "string",
169796
+ description: "Model for the optional alternate-model review remediation target."
169797
+ },
169798
+ {
169799
+ id: "reviewArbitrationEnabled",
169800
+ name: "Review arbitration",
169801
+ type: "boolean",
169802
+ default: true,
169803
+ description: "Enable bounded third-model arbitration after a review disagreement persists."
169804
+ },
169805
+ {
169806
+ id: "reviewArbitrationProvider",
169807
+ name: "Review arbitration provider",
169808
+ type: "string",
169809
+ description: "Provider for the optional review arbitration target."
169810
+ },
169811
+ {
169812
+ id: "reviewArbitrationModelId",
169813
+ name: "Review arbitration model",
169814
+ type: "string",
169815
+ description: "Model for the optional review arbitration target."
169816
+ },
169765
169817
  {
169766
169818
  id: "planReviewReplanCap",
169767
169819
  name: "Plan Review replan cap",
@@ -169967,16 +170019,11 @@ You have tools to report progress. The board updates in real-time.
169967
170019
 
169968
170020
  /*
169969
170021
  FNXC:TaskRecommendations 2026-08-09-04:06:
169970
- FN-8850 requires optional, non-blocking discoveries to be captured only at the explicit accepted
169971
- completion boundary. Immediate task creation remains for required dependency coordination or an
169972
- operator-directed filing, while workflow step sessions remain unable to write recommendations.
170022
+ FN-125 requires task-execution sessions to preserve optional, non-blocking discoveries only at the
170023
+ accepted completion boundary. Durable Workflow Executor sessions cannot create or delegate tasks;
170024
+ in-scope work remains in the current task and external blockers use the honest blocked exit.
169973
170025
  */
169974
- **Out-of-scope findings at completion:** Do not automatically create a task for optional, non-blocking work discovered outside this task. When recommendation capture is enabled, at the final accepted \`fn_task_done(outcome="completed")\` checkpoint evaluate genuine task-ready follow-ups and send \`recommendations\` (or \`recommendations: []\` when none qualify). Each recommendation needs a stable unique \`id\`, \`title\`, \`description\`, and \`category\`; never use it for a required current-task fix, blocker, secret, executable command, reasoning transcript, or filler.
169975
-
169976
- Use \`task_create\` or \`fn_delegate_task\` only when the task explicitly requires immediate filing, necessary dependency coordination, or the operator directs it. When creating multiple related tasks, declare dependencies between them:
169977
- \`task_create(description="load door sounds", dependencies=[])\` \u2192 returns KB-050
169978
- \`task_create(description="play sound on door open/close", dependencies=["KB-050"])\`
169979
-
170026
+ **Out-of-scope findings at completion:** This task-execution session cannot create or delegate tasks. When recommendation capture is enabled, at the final accepted \`fn_task_done(outcome="completed")\` checkpoint evaluate optional, non-blocking findings as genuine task-ready \`recommendations\` (or \`recommendations: []\` when none qualify). Each recommendation needs a stable unique \`id\`, \`title\`, \`description\`, and \`category\`; never use it for a required current-task fix, blocker, secret, executable command, reasoning transcript, or filler. Implement required in-scope work directly in this task.
169980
170027
  **Discovered a dependency:** \`task_add_dep(task_id="KB-XXX")\` \u2014 use when you discover mid-execution that another task must be completed first. This will return a warning first \u2014 you must call again with \`confirm=true\` to proceed. Adding a dependency stops execution, discards current work, and moves the task to triage for re-specification.
169981
170028
 
169982
170029
  ## Task Documents
@@ -170048,16 +170095,16 @@ If you attempt to write to a path outside the worktree, the file tools will reje
170048
170095
  FNXC:WorkflowRouting 2026-06-22-17:26:
170049
170096
  Executors must not move the workflow of the task they are executing unless the user explicitly asked for that task's workflow. Agents remain free to set workflows on tasks they create because they are the creator for those new tasks.
170050
170097
  -->
170051
- - Do not call \`fn_workflow_select\` to change the workflow of the task you are executing; you did not create that task, the user or triage did. The only exception is when the user explicitly requested a specific workflow for this task in a steering comment, task instruction, or similar direct instruction. You may still set the workflow on tasks you create via \`fn_task_create\` or \`fn_delegate_task\`, because you are the creator of those new tasks.
170098
+ - Do not call \`fn_workflow_select\` to change the workflow of the task you are executing; you did not create that task, the user or triage did. The only exception is when the user explicitly requested a specific workflow for this task in a steering comment, task instruction, or similar direct instruction.
170052
170099
  - **NEVER kill processes on port 4040.** Port 4040 is the production dashboard. Do not run \`kill\`, \`pkill\`, \`killall\`, or \`lsof -ti:4040 | xargs kill\` against it. If you need to start a test server, use \`--port 0\` for a random free port. If port 4040 is occupied, pick a different port \u2014 do NOT kill the occupant.
170053
170100
  - Treat the File Scope in PROMPT.md as the expected starting scope, not a hard boundary when quality gates fail
170054
170101
  - Read "Context to Read First" files before starting
170055
170102
  - Follow the "Do NOT" section strictly
170056
170103
  - If tests, lint, build, or typecheck fail and the fix requires touching code outside the declared File Scope, fix those failures directly and keep the repo green
170057
- - Use \`task_create\` for genuinely separate follow-up work, not for mandatory fixes required to make this task land cleanly
170104
+ - Implement mandatory and in-scope work directly in this task. Preserve optional out-of-scope follow-ups as completion recommendations.
170058
170105
  - Update documentation listed in "Must Update" and check "Check If Affected"
170059
170106
  - NEVER delete, remove, or gut modules, interfaces, settings, exports, or test files outside your File Scope
170060
- - NEVER remove features as "cleanup" \u2014 if something seems unused, create a task for investigation instead
170107
+ - NEVER remove features as "cleanup" \u2014 if something seems unused, record an optional completion recommendation for investigation instead
170061
170108
  - Removing code is acceptable ONLY when it is explicitly part of your task's mission
170062
170109
  - If you remove existing functionality, you MUST create a changeset in \`.changeset/\` explaining the removal and rationale
170063
170110
 
@@ -170731,7 +170778,7 @@ You have tools to report progress. The board updates in real-time.
170731
170778
 
170732
170779
  **Logging important actions:** \`task_log(message="what happened")\`
170733
170780
 
170734
- **Out-of-scope findings at completion:** When recommendation capture is enabled, retain optional, non-blocking discoveries as task-ready \`fn_task_done\` recommendations at accepted completion, or send \`recommendations: []\` when none qualify. Use \`task_create\` only for explicit immediate filing, dependency coordination, or operator direction; never recommend required current-task work, blockers, secrets, commands, reasoning, or filler.
170781
+ **Out-of-scope findings at completion:** This task-execution session cannot create or delegate tasks. When recommendation capture is enabled, retain optional, non-blocking discoveries as task-ready \`fn_task_done\` recommendations at accepted completion, or send \`recommendations: []\` when none qualify. Implement required in-scope work directly here; use the honest blocked exit only for a real external blocker. Never recommend required current-task work, blockers, secrets, commands, reasoning, or filler.
170735
170782
 
170736
170783
  **Discovered a dependency:** \`task_add_dep(task_id="KB-XXX")\` \u2014 use when you discover mid-execution that another task must be completed first. This will return a warning first \u2014 you must call again with \`confirm=true\` to proceed. Adding a dependency stops execution, discards current work, and moves the task to triage for re-specification.
170737
170784
 
@@ -170801,15 +170848,15 @@ If you attempt to write to a path outside the worktree, the file tools will reje
170801
170848
  FNXC:WorkflowRouting 2026-06-22-17:26:
170802
170849
  Executors must not move the workflow of the task they are executing unless the user explicitly asked for that task's workflow. Agents remain free to set workflows on tasks they create because they are the creator for those new tasks.
170803
170850
  -->
170804
- - Do not call \`fn_workflow_select\` to change the workflow of the task you are executing; you did not create that task, the user or triage did. The only exception is when the user explicitly requested a specific workflow for this task in a steering comment, task instruction, or similar direct instruction. You may still set the workflow on tasks you create via \`fn_task_create\` or \`fn_delegate_task\`, because you are the creator of those new tasks.
170851
+ - Do not call \`fn_workflow_select\` to change the workflow of the task you are executing; you did not create that task, the user or triage did. The only exception is when the user explicitly requested a specific workflow for this task in a steering comment, task instruction, or similar direct instruction.
170805
170852
  - **NEVER kill processes on port 4040.** Port 4040 is the production dashboard. Do not run \`kill\`, \`pkill\`, \`killall\`, or \`lsof -ti:4040 | xargs kill\` against it. If you need to start a test server, use \`--port 0\` for a random free port. If port 4040 is occupied, pick a different port \u2014 do NOT kill the occupant.
170806
170853
  - Treat the File Scope in PROMPT.md as the expected starting scope, not a hard boundary when quality gates fail
170807
170854
  - Read "Context to Read First" files before starting
170808
170855
  - Follow the "Do NOT" section strictly
170809
170856
  - If tests, lint, build, or typecheck fail and the fix requires touching code outside the declared File Scope, fix those failures directly and keep the repo green
170810
- - Use \`task_create\` for genuinely separate follow-up work, not for mandatory fixes required to make this task land cleanly
170857
+ - Implement mandatory and in-scope work directly in this task. Preserve optional out-of-scope follow-ups as completion recommendations.
170811
170858
  - NEVER delete, remove, or gut modules, interfaces, settings, exports, or test files outside your File Scope
170812
- - NEVER remove features as "cleanup" \u2014 if something seems unused, create a task for investigation instead
170859
+ - NEVER remove features as "cleanup" \u2014 if something seems unused, record an optional completion recommendation for investigation instead
170813
170860
  - If you remove existing functionality, you MUST create a changeset in \`.changeset/\` explaining the removal and rationale
170814
170861
 
170815
170862
  ## Spawning Child Agents
@@ -171676,11 +171723,15 @@ var RAW_BUILTIN_CODING_WORKFLOW_IR = {
171676
171723
  // execute → browser-verification (optional-group) → review. When the group is
171677
171724
  // disabled it passes through with outcome=success and routes straight to review.
171678
171725
  { from: "execute", to: "browser-verification", condition: "success" },
171679
- // browser-verification → code-review → review. Each optional-group passes through with
171680
- // outcome=success when disabled, so a task with both off routes straight to review.
171681
- { from: "browser-verification", to: "code-review", condition: "success" },
171682
- { from: "code-review", to: "completion-summary", condition: "success" },
171683
- { from: "completion-summary", to: "review", condition: "success" },
171726
+ /*
171727
+ FNXC:WorkspaceReviewSeal 2026-08-21-19:36:
171728
+ Completion summary runs before Code Review because its agent may acquire and write the task
171729
+ worktree. The approving review is the final write-capable pre-merge stage, so landing consumes
171730
+ evidence for the branch it will publish rather than evidence invalidated by a later summary.
171731
+ */
171732
+ { from: "browser-verification", to: "completion-summary", condition: "success" },
171733
+ { from: "completion-summary", to: "code-review", condition: "success" },
171734
+ { from: "code-review", to: "review", condition: "success" },
171684
171735
  { from: "review", to: "merge-gate", condition: "success" },
171685
171736
  { from: "merge-gate", to: "branch-group-member-integration", condition: "outcome:auto-on" },
171686
171737
  { from: "merge-gate", to: "merge-manual-hold", condition: "outcome:auto-off" },
@@ -171693,6 +171744,12 @@ var RAW_BUILTIN_CODING_WORKFLOW_IR = {
171693
171744
  { from: "merge-attempt", to: "post-merge-verification", condition: "success" },
171694
171745
  { from: "post-merge-verification", to: "end", condition: "success" },
171695
171746
  { from: "merge-attempt", to: "merge-retry", condition: "outcome:transient-failure" },
171747
+ /*
171748
+ FNXC:WorkspaceReviewReroute 2026-08-21-20:11:
171749
+ Evidence rejected during an active graph merge is a fresh Code Review obligation, never a
171750
+ merge retry. Route the typed result to the final review gate before another landing attempt.
171751
+ */
171752
+ { from: "merge-attempt", to: "code-review", condition: "outcome:workspace-review-required", kind: "rework" },
171696
171753
  { from: "merge-attempt", to: "merge-manual-hold", condition: "outcome:manual-required" },
171697
171754
  { from: "recovery-router", to: "merge-attempt", condition: "outcome:wake-merge", kind: "rework" },
171698
171755
  { from: "planning", to: "end", condition: "failure" },
@@ -171990,12 +172047,15 @@ var RAW_BUILTIN_STEPWISE_CODING_WORKFLOW_IR = {
171990
172047
  // KTD-5: bounded rework exhaustion → manual hold; release re-enters the group.
171991
172048
  { from: "steps", to: "rework-hold", condition: "outcome:rework-exhausted" },
171992
172049
  { from: "rework-hold", to: "browser-verification", condition: "success" },
171993
- // browser-verification → code-review → completion-summary → merge-gate; each
171994
- // optional-group passes through (outcome=success) when disabled, so a task with
171995
- // both off routes straight to completion summary and merge policy.
171996
- { from: "browser-verification", to: "code-review", condition: "success" },
171997
- { from: "code-review", to: "completion-summary", condition: "success" },
171998
- { from: "completion-summary", to: "merge-gate", condition: "success" },
172050
+ /*
172051
+ FNXC:WorkspaceReviewSeal 2026-08-21-19:36:
172052
+ A completion-summary agent can acquire the task worktree. It therefore precedes Code Review;
172053
+ the approval becomes the final write-sensitive pre-merge gate and cannot be invalidated by the
172054
+ built-in workflow after it is recorded.
172055
+ */
172056
+ { from: "browser-verification", to: "completion-summary", condition: "success" },
172057
+ { from: "completion-summary", to: "code-review", condition: "success" },
172058
+ { from: "code-review", to: "merge-gate", condition: "success" },
171999
172059
  { from: "browser-verification", to: "browser-verification-remediation", condition: "failure" },
172000
172060
  { from: "browser-verification-remediation", to: "browser-verification", condition: "success", kind: "rework" },
172001
172061
  { from: "code-review", to: "code-review-remediation", condition: "failure" },
@@ -172021,6 +172081,12 @@ var RAW_BUILTIN_STEPWISE_CODING_WORKFLOW_IR = {
172021
172081
  { from: "merge-attempt", to: "post-merge-verification", condition: "success" },
172022
172082
  { from: "post-merge-verification", to: "end", condition: "success" },
172023
172083
  { from: "merge-attempt", to: "merge-retry", condition: "outcome:transient-failure" },
172084
+ /*
172085
+ FNXC:WorkspaceReviewReroute 2026-08-21-20:11:
172086
+ A stale workspace approval returns to the final Code Review gate through a bounded rework
172087
+ edge, preserving the existing graph owner instead of burning a merge retry.
172088
+ */
172089
+ { from: "merge-attempt", to: "code-review", condition: "outcome:workspace-review-required", kind: "rework" },
172024
172090
  { from: "merge-attempt", to: "merge-manual-hold", condition: "outcome:manual-required" },
172025
172091
  { from: "recovery-router", to: "merge-attempt", condition: "outcome:wake-merge", kind: "rework" },
172026
172092
  { from: "merge-attempt", to: "end", condition: "failure" }
@@ -172083,11 +172149,11 @@ var RAW_BUILTIN_STEPWISE_FINAL_REVIEW_CODING_WORKFLOW_IR = (() => {
172083
172149
  if (!ir.edges.some((edge) => edge.from === "plan-replan" && edge.to === "plan-review" && edge.condition === "success")) {
172084
172150
  ir.edges.push({ from: "plan-replan", to: "plan-review", condition: "success", kind: "rework" });
172085
172151
  }
172086
- if (!ir.edges.some((edge) => edge.from === "code-review" && edge.to === "completion-summary" && edge.condition === "success")) {
172087
- ir.edges.push({ from: "code-review", to: "completion-summary", condition: "success" });
172152
+ if (!ir.edges.some((edge) => edge.from === "completion-summary" && edge.to === "code-review" && edge.condition === "success")) {
172153
+ ir.edges.push({ from: "completion-summary", to: "code-review", condition: "success" });
172088
172154
  }
172089
- if (!ir.edges.some((edge) => edge.from === "completion-summary" && edge.to === "merge-gate" && edge.condition === "success")) {
172090
- ir.edges.push({ from: "completion-summary", to: "merge-gate", condition: "success" });
172155
+ if (!ir.edges.some((edge) => edge.from === "code-review" && edge.to === "merge-gate" && edge.condition === "success")) {
172156
+ ir.edges.push({ from: "code-review", to: "merge-gate", condition: "success" });
172091
172157
  }
172092
172158
  return ir;
172093
172159
  })();
@@ -172167,8 +172233,8 @@ var RAW_BUILTIN_CODING_IDEAS_WORKFLOW_IR = (() => {
172167
172233
  ]);
172168
172234
  v2.nodes = v2.nodes.filter((node) => !removedNodeIds.has(node.id));
172169
172235
  v2.edges = v2.edges.filter((edge) => !removedNodeIds.has(edge.from) && !removedNodeIds.has(edge.to));
172170
- if (!v2.edges.some((edge) => edge.from === "steps" && edge.to === "code-review")) {
172171
- v2.edges.push({ from: "steps", to: "code-review", condition: "success" });
172236
+ if (!v2.edges.some((edge) => edge.from === "steps" && edge.to === "completion-summary")) {
172237
+ v2.edges.push({ from: "steps", to: "completion-summary", condition: "success" });
172172
172238
  }
172173
172239
  if (!v2.edges.some((edge) => edge.from === "merge-attempt" && edge.to === "end" && edge.condition === "success")) {
172174
172240
  v2.edges.push({ from: "merge-attempt", to: "end", condition: "success" });
@@ -172755,10 +172821,12 @@ function linear(spec) {
172755
172821
  ...hasBrowserVerification ? [browserVerificationRemediationNode("in-progress")] : [],
172756
172822
  ...hasCodeReview ? [codeReviewRemediationNode("in-progress")] : []
172757
172823
  ] : [];
172824
+ const noOpTerminalNode = hasPlanReview ? { id: "plan-review-no-op", kind: "gate", column: "todo", config: { workflowAction: "plan-review-no-op" } } : void 0;
172758
172825
  const nodes2 = [
172759
172826
  { id: "start", kind: "start" },
172760
172827
  ...workflowNodes,
172761
172828
  ...remediationNodes,
172829
+ ...noOpTerminalNode ? [noOpTerminalNode] : [],
172762
172830
  { id: "end", kind: "end" }
172763
172831
  ];
172764
172832
  const edges = [];
@@ -172774,6 +172842,8 @@ function linear(spec) {
172774
172842
  }
172775
172843
  if (hasPlanReview) {
172776
172844
  edges.push({ from: "plan-replan", to: "plan-review", condition: "success", kind: "rework" });
172845
+ edges.push({ from: "plan-review", to: "plan-review-no-op", condition: "outcome:close-no-op" });
172846
+ edges.push({ from: "plan-review-no-op", to: "end", condition: "success" });
172777
172847
  }
172778
172848
  if (hasBrowserVerification) {
172779
172849
  edges.push({
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/whatsapp-chat",
3
- "version": "0.1.55-beta.6",
3
+ "version": "0.1.55-beta.7",
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.77.0-beta.6",
3
+ "version": "0.77.0-beta.7",
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",
@@ -11,7 +11,7 @@ This reference documents tools injected by the engine at runtime for specific ag
11
11
 
12
12
  | Tool | Agent Types | Purpose | Parameters |
13
13
  |---|---|---|---|
14
- | `fn_task_create` | triage, executor, heartbeat | Create a follow-up task from within an agent run | `description` (string), `dependencies?` (string[]), `priority?` (`low` \| `normal` \| `high` \| `urgent`), `workflow_id?` (string) |
14
+ | `fn_task_create` | triage, heartbeat | Create a follow-up task from within an agent run | `description` (string), `dependencies?` (string[]), `priority?` (`low` \| `normal` \| `high` \| `urgent`), `workflow_id?` (string) |
15
15
  | `fn_task_log` | executor, heartbeat | Write significant task log entries | `message` (string), `outcome?` (string) |
16
16
  | `fn_task_document_write` | triage, executor, heartbeat; chat/planning (explicit `task_id`) | Save/update a named **live-task** document revision, optionally with CAS; archived parents remain read-only | `key` (string), `content` (string), `author?` (string), `expected_revision?` (non-negative integer), `expected_content_hash?` (`sha256:<64 lowercase hex>`); chat/planning also require `task_id` (string) |
17
17
  | `fn_task_document_read` | triage, executor, heartbeat; chat/planning (explicit `task_id`) | Read one named live or retained archived document; list mode remains live-only | `key?` (string); chat/planning also require `task_id` (string) |
@@ -53,7 +53,7 @@ Archived publication is deliberately absent from every runtime tool schema: ther
53
53
  | `fn_update_identity` | heartbeat | Update the current agent's own `soul`, `instructionsText`, or `memory` fields | `soul?` (string), `instructionsText?` (string), `memory?` (string) |
54
54
  | `fn_reflect_on_performance` | executor, heartbeat (when reflection service enabled) | Generate reflection insights from prior runs | `focus_area?` (string) |
55
55
  | `fn_list_agents` | triage, executor, heartbeat | List agents (optionally filtered) | `role?` (string), `state?` (string), `includeEphemeral?` (boolean) |
56
- | `fn_delegate_task` | triage, executor, heartbeat | Create and assign a new task to a specific agent | `agent_id` (string), `description` (string), `dependencies?` (string[]), `workflow_id?` (string), `override?` (boolean) |
56
+ | `fn_delegate_task` | triage, heartbeat | Create and assign a new task to a specific agent | `agent_id` (string), `description` (string), `dependencies?` (string[]), `workflow_id?` (string), `override?` (boolean) |
57
57
  | `fn_get_agent_config` | executor, heartbeat | Read full config for a direct-report agent | `agent_id` (string) |
58
58
  | `fn_update_agent_config` | executor, heartbeat | Update config fields for a direct-report, non-ephemeral agent | `agent_id` (string), optional: `soul`, `instructions_text`, `instructions_path`, `heartbeat_procedure_path`, `heartbeat_interval_ms`, `heartbeat_timeout_ms`, `max_concurrent_runs`, `message_response_mode` |
59
59
  | `fn_agent_create` | executor, heartbeat | Create a non-ephemeral direct-report agent | `name` (string), `role` (string), optional: `soul`, `instructions_text`, `instructions_path`, `reportsTo`, `heartbeat_interval_ms`, `heartbeat_timeout_ms`, `max_concurrent_runs`, `message_response_mode` |
@@ -76,12 +76,12 @@ Archived publication is deliberately absent from every runtime tool schema: ther
76
76
 
77
77
  ## Executor-only runtime tools (`executor.ts`)
78
78
 
79
- Note: step-session execution (`step-session-executor.ts`) reuses executor coordination tools (`fn_send_message`, `fn_read_messages`, `fn_list_agents`, `fn_delegate_task`, task-document tools, and memory tools) so spawned/session-sliced execution keeps parity with main executor runs.
79
+ Note: step-session execution (`step-session-executor.ts`) reuses executor coordination tools (`fn_send_message`, `fn_read_messages`, `fn_list_agents`, task-document tools, and memory tools) so spawned/session-sliced execution keeps parity with main executor runs.
80
80
 
81
81
  | Tool | Purpose | Parameters |
82
82
  |---|---|---|
83
- | `fn_task_update` | Update a spec step status (`pending`/`in-progress`/`done`/`skipped`), task dependencies, and/or workflow-defined custom field values | `step?` (number, 0-indexed; matches `### Step N:` in PROMPT.md, Step 0 = Preflight), `status?` (enum), `dependencies?` (string[]), `custom_fields?` (object keyed by field id; validated against the workflow field schema, `null` clears a field) |
84
- | `fn_task_add_dep` | Add a dependency to current task (confirmation-gated) | `task_id` (string), `confirm?` (boolean) |
83
+ | `fn_task_update` | Update a spec step status (`pending`/`in-progress`/`done`/`skipped`), task dependencies (never a task it spawned), and/or workflow-defined custom field values | `step?` (number, 0-indexed; matches `### Step N:` in PROMPT.md, Step 0 = Preflight), `status?` (enum), `dependencies?` (string[]), `custom_fields?` (object keyed by field id; validated against the workflow field schema, `null` clears a field) |
84
+ | `fn_task_add_dep` | Add a dependency to current task (confirmation-gated; never a task it spawned) | `task_id` (string), `confirm?` (boolean) |
85
85
  | `fn_task_done` | End the task: `outcome="completed"` (default) marks it complete; `outcome="blocked"` honestly parks it failed (`BLOCKED: <reason>`) with no completion claim, preserving steps/worktree and recording `blockedBy` as dependencies | `summary?` (string), `outcome?` (`completed` \| `blocked`), `blockedBy?` (string[]), `reason?` (string, required when blocked) |
86
86
  | `fn_spawn_agent` | Spawn child agent in separate worktree | `name` (string), `role` (enum), `task` (string) |
87
87
  | `fn_acquire_repo_worktree` | Acquire an isolated git worktree for a sub-repo in a workspace task (workspace mode only) | `repo` (string — must be one of the workspace's configured repos) |
@@ -1 +0,0 @@
1
- .chat-input-wrapper{position:relative;display:flex;flex:1;flex-direction:column;align-items:stretch;gap:var(--space-xs);min-width:0}.agent-mention-popup{position:absolute;z-index:250;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);min-width:220px;max-width:320px;max-height:240px;overflow-y:auto;box-shadow:var(--shadow-lg);padding:var(--space-xs) 0}.agent-mention-popup--below{top:calc(100% + var(--space-xs));left:0}.agent-mention-popup--above{bottom:calc(100% + var(--space-xs));left:0}.agent-mention-item{display:flex;align-items:center;gap:var(--space-sm);padding:calc(var(--space-sm) - (var(--space-xs) / 2)) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);color:var(--text);cursor:pointer;border:none;background:transparent;width:100%;text-align:left}.agent-mention-item:hover,.agent-mention-item--highlighted{background:var(--card-hover)}.agent-mention-item:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);background:var(--card-hover)}.agent-mention-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-mention-role{font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.agent-mention-empty{padding:calc(var(--space-sm) + (var(--space-xs) / 2)) var(--space-md);font-size:var(--space-md);color:var(--text-dim)}.agent-mention-section-header{padding:var(--space-xs) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs) * .5);text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted)}.agent-mention-hint{padding:var(--space-xs) var(--space-md);font-size:var(--space-md);color:var(--text-muted)}.agent-mention-member-dot{background:var(--color-success)}@media(max-width:1024px){.agent-mention-popup{min-width:200px;max-width:min(280px,100%)}.agent-mention-popup--below,.agent-mention-popup--above{bottom:calc(100% + var(--space-xs));top:auto;left:0}}.file-mention-popup{position:absolute;z-index:250;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);min-width:calc(var(--space-xl) * 7 + var(--space-md));max-width:calc(var(--space-xl) * 10);max-height:calc(var(--space-xl) * 7 + var(--space-sm));overflow-y:auto;padding:var(--space-xs) 0}.file-mention-popup-groups,.file-mention-popup-group{display:flex;flex-direction:column}.file-mention-popup-group-header{padding:var(--space-xs) var(--space-md);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;letter-spacing:calc(var(--space-xs) / 2);text-transform:uppercase}.file-mention-popup-list{list-style:none;margin:0;padding:0}.file-mention-popup-item{display:flex;align-items:flex-start;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);cursor:pointer;color:var(--text);font-size:calc(var(--space-sm) + var(--space-xs) * 1.5)}.file-mention-popup-item:hover{background:var(--card-hover)}.file-mention-popup-item--selected{background:color-mix(in srgb,var(--todo) 15%,transparent)}.file-mention-popup-item:focus-visible{outline:none;box-shadow:var(--focus-ring);background:var(--card-hover)}.file-mention-popup-icon{flex-shrink:0;display:inline-flex;align-items:center;color:var(--text-muted);margin-top:1px}.file-mention-popup-info{display:flex;flex-direction:column;min-width:0;gap:calc(var(--space-xs) / 2)}.file-mention-popup-item-name{font-weight:500;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-mention-popup-item-path{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-mention-popup-task-row{display:flex;align-items:center;gap:var(--space-sm);min-width:0}.file-mention-popup-task-id{font-family:var(--font-mono);font-weight:600;color:var(--text);white-space:nowrap}.file-mention-popup-column-badge{display:inline-flex;align-items:center;justify-content:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;line-height:1;text-transform:capitalize}.file-mention-popup-column-badge--triage{background:var(--status-triage-bg);color:var(--triage)}.file-mention-popup-column-badge--todo{background:var(--status-todo-bg);color:var(--todo)}.file-mention-popup-column-badge--in-progress{background:var(--status-in-progress-bg);color:var(--in-progress)}.file-mention-popup-column-badge--in-review{background:var(--status-in-review-bg);color:var(--in-review)}.file-mention-popup-column-badge--done{background:var(--status-done-bg);color:var(--done)}.file-mention-popup-column-badge--archived{background:var(--status-archived-bg);color:var(--text-muted)}.file-mention-popup-empty{padding:var(--space-lg) var(--space-md);text-align:center;color:var(--text-muted);font-size:var(--space-md)}.file-mention-popup-loading{display:flex;align-items:center;justify-content:center;padding:var(--space-lg) var(--space-md)}.file-mention-popup-loading .spinner{display:inline-block;width:var(--space-lg);height:var(--space-lg);border:calc(var(--space-xs) / 2) solid var(--border);border-top-color:var(--text-muted);border-radius:50%;animation:file-mention-popup-spinner-spin var(--duration-slow) linear infinite}@keyframes file-mention-popup-spinner-spin{to{transform:rotate(360deg)}}@media(max-width:768px){.file-mention-popup{top:auto!important;bottom:calc(100% + var(--space-xs));left:max(var(--space-md),env(safe-area-inset-left,0px))!important;right:max(var(--space-md),env(safe-area-inset-right,0px));max-width:none;width:auto;max-height:calc(var(--space-xl) * 8 + var(--space-sm))}.file-mention-popup-item{min-height:calc(var(--space-lg) + var(--space-xl) - var(--space-sm));padding:calc(var(--space-sm) + (var(--space-xs) / 2)) var(--space-md)}}.chat-empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-lg);color:var(--text-muted);padding:var(--space-xl);text-align:center}.chat-empty-state h2{font-size:calc(var(--space-xl) - var(--space-xs));color:var(--text);margin:0}.chat-empty-state-agent-select select{padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg);color:var(--text);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.5));min-width:calc(var(--space-xl) * 8 + var(--space-sm))}.chat-new-dialog-backdrop{position:fixed;inset:0;background:color-mix(in srgb,var(--bg) 60%,transparent);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:100}.chat-new-dialog{background:var(--surface-1);border:1px solid var(--border);border-radius:var(--radius-lg);padding:var(--space-xl);width:calc(var(--space-xl) * 16 + var(--space-md));max-width:calc(100vw - (var(--space-md) * 2));display:flex;flex-direction:column;gap:var(--space-lg)}.chat-new-dialog h3{margin:0;font-size:calc(var(--space-lg) + (var(--space-xs) / 2))}.chat-new-dialog label{display:flex;flex-direction:column;gap:var(--space-xs);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.25));color:var(--text-muted)}.chat-new-dialog input,.chat-new-dialog select{padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg);color:var(--text);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.5))}.chat-new-dialog-mode-toggle{display:flex;gap:var(--space-xs)}.chat-new-dialog-mode-btn{flex:1;padding:var(--space-xs) var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.25));cursor:pointer;transition:var(--transition-fast)}.chat-new-dialog-mode-btn:hover{background:color-mix(in srgb,var(--todo) 10%,transparent);color:var(--text);border-color:color-mix(in srgb,var(--todo) 40%,var(--border))}.chat-new-dialog-mode-btn--active{background:color-mix(in srgb,var(--todo) 18%,transparent);color:var(--text);border-color:color-mix(in srgb,var(--todo) 50%,var(--border));font-weight:500}.chat-new-dialog-mode-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.chat-new-dialog-actions{display:flex;justify-content:flex-end;gap:var(--space-sm)}.chat-view-delete-dialog-copy{margin:0 0 var(--space-lg);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.5)}.chat-new-dialog-model-label{display:flex;flex-direction:column;gap:var(--space-sm)}.chat-new-dialog-loading,.chat-new-dialog-empty{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.5))}.chat-new-dialog-agent-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:calc(var(--space-xl) * 12 + var(--space-md));overflow-y:auto;border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-xs)}.chat-new-dialog-agent-item{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.5));text-align:left;cursor:pointer;transition:background var(--transition-fast)}.chat-new-dialog-agent-item:hover{background:var(--surface-hover)}.chat-new-dialog-agent-item--selected{background:color-mix(in srgb,var(--todo) 10%,transparent);border:1px solid color-mix(in srgb,var(--todo) 30%,transparent)}.chat-new-dialog-agent-name{flex:1;font-weight:500}.chat-new-dialog-agent-role{font-size:var(--space-md);color:var(--text-muted);text-transform:capitalize}.chat-new-dialog{overflow:visible}@media(max-width:768px){.quick-chat-fab{right:var(--space-xs);bottom:calc(var(--space-xs) + var(--executor-footer-height-mobile, var(--executor-footer-height, 0px)) + var(--mobile-nav-height, 44px) + env(safe-area-inset-bottom,0px))}.chat-view-dialog-backdrop{align-items:center;justify-content:center;overflow-y:auto;padding:var(--space-md);padding-top:max(var(--space-md),env(safe-area-inset-top,0px));padding-bottom:max(var(--space-md),env(safe-area-inset-bottom,0px))}.chat-view-dialog{width:100%;max-width:min(100%,calc(var(--space-xl) * 16));max-height:calc(100dvh - (var(--space-md) * 2) - env(safe-area-inset-top,0px) - env(safe-area-inset-bottom,0px));display:flex;flex-direction:column;overflow-y:auto}}.floating-window--create-room .floating-window__body{overflow:hidden}.floating-window--create-room .create-room-modal{width:100%;height:100%;max-width:none;max-height:none;border:none;border-radius:inherit;display:flex;flex-direction:column;gap:var(--space-md)}.create-room-modal-name-group{margin-bottom:0}.create-room-modal-name-field{display:flex;align-items:center;gap:var(--space-sm)}.create-room-modal-name-hash{color:var(--text-muted);font-family:var(--font-mono)}.create-room-modal-name-field .input{flex:1}.create-room-modal-selected{display:flex;flex-wrap:wrap;gap:var(--space-sm);padding:0 var(--space-xl)}.create-room-modal-chip{border-color:var(--border)}.create-room-modal-member-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:calc(var(--space-2xl) * 8);overflow-y:auto;padding:0 var(--space-xl)}.create-room-modal-member-row{display:flex;width:100%;align-items:center;gap:var(--space-sm);text-align:left;border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-sm);background:var(--surface);color:var(--text);transition:background var(--transition-fast),border-color var(--transition-fast)}.create-room-modal-member-row:hover{background:var(--card-hover)}.create-room-modal-member-row:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.create-room-modal-member-row--selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent)}.create-room-modal-member-role{margin-left:auto;color:var(--text-muted);font-size:var(--space-md)}.create-room-modal-empty{color:var(--text-muted);padding:var(--space-md);text-align:center}@media(max-width:768px){.floating-window--create-room .create-room-modal{width:100%}.create-room-modal-selected,.create-room-modal-member-list{padding:0 var(--space-md)}.create-room-modal .modal-actions{display:flex;flex-direction:column;gap:var(--space-sm)}.create-room-modal .modal-actions .btn{width:100%}}