chainlesschain 0.163.3 → 0.163.5

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 (209) hide show
  1. package/package.json +3 -2
  2. package/scripts/command-lifecycle-report.mjs +330 -38
  3. package/src/assets/web-panel/assets/{AIOps-DIY6KxV-.js → AIOps-Cv2EE1Zy.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BXH0muPt.js → ActionButton-CcpxMLuW.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D39w8vmg.js → Analytics-DE8mJoMI.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-CUU1zvLs.js → AppLayout-DKn9dk9L.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-D8azHO3T.js → Artifacts-Cp3mG3Py.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-D0tAwXTg.js → Audit-zvsQfF2C.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-C29mhJll.js → BackgroundAgents-Bi85SsjN.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-D6Aa1Gro.js → Backup-Cw47Dj6s.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-B1uoHbPQ.js → BaseInput-C5Ip2afH.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-Bs4DLOR5.js → Chat-C0iAFkJv.js} +5 -5
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DUYIBSle.js → ChatBubbleRenderer-BV9Wv7wO.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-CNcBPEa4.js → Checkbox-3KZZCiAF.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-CIY89763.js → Codegen-C8OMbBAz.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CsPYFmgo.js → Col-B-MB84LJ.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-BBocEge4.js → Community-DpR7Dxao.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-TQ8Ux0Lf.js → Compact-CyDtz0OS.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-DfBsZTft.js → Compliance-5tiRa2An.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-Cg-I6FVH.js → Cowork-DnQaKZ5x.js} +4 -4
  21. package/src/assets/web-panel/assets/{Cron-DTQzfRTp.js → Cron-BaWfoEDf.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-DGxEKGpR.js → Crosschain-Bu0HoHhb.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-DLZ1RDSr.js → DID-31zk8upX.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-XneICKNI.js → Dashboard-BmVne-e2.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BRU00J1-.js → Dropdown-B4PkoOWd.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-BzCbJuAy.js → EmailListRenderer-BZ6tyFtI.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-D7BRyNBG.js → FamilyGuardDashboard-Osozn4Ds.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-D9DeFIhW.js → Federation-DaH8TOAP.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-6rAtA9Ko.js → FormItemContext-tbU0uwis.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-8Hqy80pU.js → GenericCardRenderer-Df8LQBrL.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-Cmvkj1rt.js → Git-DsMB6-14.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-BRiQUjjw.js → Governance-BnH0dZzd.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-CKN_EzVf.js → Inference-DhnN1N_P.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-BCDHwpwQ.js → KnowledgeGraph-DnNshAgn.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-DK9ovhaB.js → Logs-BmBFX3_N.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-D53pHiHy.js → MarkdownRenderer-DCslfQU3.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-BILPGakp.js → Marketplace-CPEgWDc3.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-DTVCOr9-.js → McpTools-C36qjgF9.js} +5 -5
  39. package/src/assets/web-panel/assets/{Memory-Hzc1iow4.js → Memory-tNHvrgqN.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-GXfgnGYV.js → MobileBridge-Xaf6cKjc.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-B-3TJWsS.js → MobileProjects-D2E5TTeO.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-DwSJMWtK.js → Mtc-D4AJ2dwV.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-D2uxf-DA.js → MtcAudit-Df-gtn2_.js} +4 -4
  44. package/src/assets/web-panel/assets/{Multisig-DG6kbKK0.js → Multisig-DTCHLWld.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-f5p49EDU.js → NLProgramming-DruZ_1Jb.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-FUgHyzSD.js → Notes-Dx3pdGDs.js} +4 -4
  47. package/src/assets/web-panel/assets/{NotificationSettings-DCHGee7e.js → NotificationSettings-Bi3L69oL.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-Dm6LlIoa.js → OrderTableRenderer-BHY33m7C.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-BawA7qAg.js → Organization-BG2ZVEV-.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-D6a5wZU1.js → Overflow-Viwtg4Mn.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-K8WavwnA.js → P2P-Clm_yc1Z.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-4JAJYaqx.js → PdhVaultBrowser-NKmmDiOw.js} +5 -5
  53. package/src/assets/web-panel/assets/{Permissions-BDWvi8PD.js → Permissions-DIL8u9Nk.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-DF_K4E9i.js → PersonalDataHub-B-jM4wt-.js} +4 -4
  55. package/src/assets/web-panel/assets/{Pipeline-BYeZlesI.js → Pipeline-627I__H5.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-BIHlgnIc.js → Privacy-2DN2qrkW.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-Cvf-6B5P.js → ProjectInit-CN4wC0sF.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-CnwfJrRz.js → ProjectSettings-K35vsh5H.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-B_wQadhX.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-CxC7JuYv.js → Providers-MckaQUhQ.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-VLf3gAfL.js → QrScannerModal-BS3mtA_O.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-B5vGjRiF.js → QuickAsk-BHp_nofL.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend--UW4iYs-.js → Recommend-DlmnPuZj.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-DMSPcfKR.js → RemoteSession-tsyFbvpy.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-kQXlEHmj.js → Reputation-Ba1iWv2D.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-CxGu3pit.js → Row-NnlGC--f.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-Bi5lo8MZ.js → RssFeed-CjThSIRv.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-Cq_H5RTh.js → Search-CojUyC5x.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-YFbmkaQS.js → Security-c-sxeJEc.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-DLOGdaLm.js → Services-CtcKEEmF.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-CteIxb3D.js → Skeleton-CIBBXflN.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-CccopaIZ.js → Skills-D1XOOK9n.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-AzfEQKX1.js → Sla-hRfEp5Sn.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-ekGo5l77.js → SpeechSettings-Dexb1f_6.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-BmZmAgYH.js → SyncSettings-BJsSFGYy.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-D7q3Z4uL.js → Tasks-CfSZ8A1L.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-CX1Tgeka.js → Templates-idDf47W-.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-Zc59jF4i.js → Tenant-C-UsX6w6.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-CXOD7y83.js → Terminal-BgJtX5n1.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-B1aBHPBo.js → TimelineRenderer-DP0BLKTl.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-zALlOq_U.js → Tokens-LwCzqETp.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-CQfJMXaq.js → Trigger-D_9tVch0.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-BU0RcM-w.js → Trust-BH2UlEWh.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-IFZ3HsbH.js → UkeySign-CIpD0nYb.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-BzslgW0v.js → VideoEditing-9ShhYxK_.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-BZAcQNS6.js → Wallet-C7afGNIG.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-CBK1DMi0.js → WebAuthn-bUKn6i5R.js} +3 -3
  88. package/src/assets/web-panel/assets/{WorkflowEditor-BlMTPzO-.js → WorkflowEditor-CxgQaGyp.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-B51-8QVn.js → chat-DMVkmJwx.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-504RTByU.js → colors-CDzQh5nS.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-C-GP6IQM.js → compact-item-C51kEF4D.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-DOkIj7ID.js → createContext-BTk9bXBn.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-CdwPwYj8.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DN7V-_FW.js → hasIn-CMje33rb.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-CKTfZyfU.js → index-0Auljb10.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-D9LyiN-L.js → index-B0-zMtKA.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DEMPUVa3.js → index-BAfY7m7i.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Bkxhaeta.js → index-BBz9LIMS.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-7jIqHbzw.js → index-BCRvG9lq.js} +1 -1
  100. package/src/assets/web-panel/assets/index-BEeOdfEe.js +1 -0
  101. package/src/assets/web-panel/assets/index-BTe0TOu6.js +1 -0
  102. package/src/assets/web-panel/assets/{index-P2mfY27Z.js → index-BTlsE8Df.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DAOpQvl_.js → index-BVePe_Rf.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CYopNjcJ.js → index-BW4F5YDF.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-B_vGU-Js.js → index-BXQBPLyE.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-kt_5rfcZ.js → index-BeEaAEIp.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Cao5DZy7.js → index-BtlEqHLP.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DA2f1UV3.js → index-BzCkNylB.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-B2-x9bS8.js → index-C1oZQmAA.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D1phyca8.js → index-C1oZReaY.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-FcV8J_Qz.js → index-C4rQCS8T.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C3TSohzc.js → index-C5IWTMVl.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CySTJKeq.js → index-CCLj9hcD.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-C9_48OzU.js → index-CDLkNkLj.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-so8eIIxF.js → index-Cd0hmPxD.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CX78k-qf.js → index-CfC-piWZ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DE-hmI2l.js → index-CtM8OT_7.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-kAqQXfP6.js → index-CvSeVzqe.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-C0k_Nqg9.js → index-CwGPwjUu.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CP2A226L.js → index-CypsfcEq.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CfiEM64n.js → index-D9rC-fGW.js} +3 -3
  122. package/src/assets/web-panel/assets/{index-yYTQZypF.js → index-DJfnCuMq.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-f4Bo4KXm.js → index-DRG-aqOs.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-By6u5IV1.js → index-DRLQyp2A.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-ConjaJro.js → index-DgivOKHA.js} +1 -1
  126. package/src/assets/web-panel/assets/{index--n-ZciV3.js → index-DpcrFxMI.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CqcLo5WV.js → index-DqU9njjT.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CUhQpiYv.js → index-Ld_4mFmC.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-C4DV_5uA.js → index-OS-vfbTA.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DaA__-q1.js → index-h31MwrME.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BFIFJ5Dr.js → index-hg_emBsi.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-C8UltbXK.js → index-togc_uYn.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-et5JIPHO.js → index-x53Vf7la.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-CPYEIdpV.js → initDefaultProps-vrA8K-ac.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-Cjim9pxs.js → motion-ByEzwIAl.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-DuU-cgz3.js → move-Ck4AWjw-.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-DJHNAkta.js → mtc-parser-6p0l9SrB.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-DSQBgdBj.js → omit-B1CUPQ6R.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-CTmT_j5m.js → pickAttrs-B1STg1iW.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-Lfm6v-r4.js → placementArrow-DTTllkBV.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-CgrcPcDi.js → responsiveObserve-AIrrCfBb.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-CuE3110i.js → slide-C_fPMjdR.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-DiK5nbpf.js → statusUtils-D5ow2yIP.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-DPEJdQaZ.js → styleChecker-Dy3hEA--.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-CnnodGmp.js → useFlexGapSupport-WfzcfSh4.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-DWF84Yav.js → useFs-CKSejfas.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-a5b5Dw2f.js → usePersonalDataHub-od3zpPBN.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-DAluzXOq.js → vnode-DRD_2DFA.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-Dokg7uAZ.js → zoom-DmNrEtgf.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +1 -1
  152. package/src/commands/agenda.js +52 -6
  153. package/src/commands/artifacts.js +98 -0
  154. package/src/commands/cowork.js +24 -12
  155. package/src/commands/mcp.js +1 -1
  156. package/src/commands/review.js +221 -22
  157. package/src/commands/routine.js +40 -10
  158. package/src/commands/session-mcp-recovery.js +5 -5
  159. package/src/data/changelog.json +27 -1
  160. package/src/gateways/ws/ws-agent-handler.js +492 -14
  161. package/src/harness/jsonl-session-store.js +39 -1
  162. package/src/harness/mcp-client.js +172 -29
  163. package/src/harness/prompt-compressor.js +24 -0
  164. package/src/harness/provider-backed-compaction.js +205 -0
  165. package/src/lib/agent-schedule-store.js +197 -4
  166. package/src/lib/app-preview.js +3 -0
  167. package/src/lib/command-lifecycle-report.js +1340 -145
  168. package/src/lib/cowork-cron.js +243 -25
  169. package/src/lib/delivery-coordinator.js +30 -5
  170. package/src/lib/delivery-production-adapter.js +1777 -0
  171. package/src/lib/delivery-production-runner.js +240 -0
  172. package/src/lib/durable-security-store.js +29 -17
  173. package/src/lib/execution-trace/trace-context.cjs +179 -0
  174. package/src/lib/execution-trace/trace-context.js +8 -175
  175. package/src/lib/mcp-call-ledger-store.js +58 -6
  176. package/src/lib/mcp-host-recovery-runtime.js +2 -0
  177. package/src/lib/mcp-ledger-recovery-admission.js +39 -3
  178. package/src/lib/mcp-recovery-adjudication.js +256 -19
  179. package/src/lib/mcp-sandbox-policy.js +29 -0
  180. package/src/lib/mcp-stdio-capsule-builder-worker.cjs +495 -0
  181. package/src/lib/mcp-stdio-executable-identity.js +33 -2
  182. package/src/lib/mcp-stdio-immutable-vfs-resolver.cjs +830 -0
  183. package/src/lib/mcp-stdio-package-materialization.js +721 -333
  184. package/src/lib/micro-compact.js +11 -5
  185. package/src/lib/observability/index.js +2 -0
  186. package/src/lib/observability/otlp-exporter.js +2 -2
  187. package/src/lib/packer/pack-update-applier.js +8 -1
  188. package/src/lib/packer/pkg-config-generator.js +34 -0
  189. package/src/lib/process-execution-broker/index.js +48 -8
  190. package/src/lib/process-execution-broker/platform-sandbox.js +82 -1
  191. package/src/lib/routine-store.js +76 -3
  192. package/src/lib/scheduler-kernel/agenda-adapter.js +542 -0
  193. package/src/lib/scheduler-kernel/contract.js +315 -0
  194. package/src/lib/scheduler-kernel/cowork-cron-adapter.js +774 -0
  195. package/src/lib/scheduler-kernel/routine-adapter.js +517 -0
  196. package/src/lib/scheduler-kernel/runtime.js +527 -0
  197. package/src/lib/scheduler-kernel/store.js +1455 -0
  198. package/src/lib/session-host-lease.js +403 -30
  199. package/src/lib/session-message-provenance.js +4 -1
  200. package/src/lib/session-persistence-failure.js +4 -1
  201. package/src/lib/sub-agent-context.js +8 -0
  202. package/src/repl/agent-repl.js +309 -43
  203. package/src/runtime/agent-core.js +1079 -105
  204. package/src/runtime/headless-runner.js +260 -166
  205. package/src/runtime/headless-stream.js +254 -25
  206. package/src/assets/web-panel/assets/Projects-b-jPXzF4.js +0 -1
  207. package/src/assets/web-panel/assets/devWarning-kB0nCNwN.js +0 -1
  208. package/src/assets/web-panel/assets/index-Bya64sZE.js +0 -1
  209. package/src/assets/web-panel/assets/index-D_FWpDZM.js +0 -1
@@ -33,10 +33,17 @@ import {
33
33
  } from "../lib/hooks-v2-producers.js";
34
34
  import { runWithHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
35
35
  import { bootstrap } from "./bootstrap.js";
36
- import { buildSystemPrompt, agentLoop as coreAgentLoop } from "./agent-core.js";
36
+ import {
37
+ buildSystemPrompt,
38
+ chatWithTools as coreChatWithTools,
39
+ agentLoop as coreAgentLoop,
40
+ } from "./agent-core.js";
37
41
  import { composeSystemPrompt } from "./system-prompt.js";
38
42
  import { collapseConsecutiveMessagesInPlace } from "./message-roles.js";
39
43
  import { sanitizeToolPairs } from "../harness/prompt-compressor.js";
44
+ import { compactConversationWithProvider } from "../harness/provider-backed-compaction.js";
45
+ import { projectCanonicalResumeMessages } from "../lib/session-message-provenance.js";
46
+ import { isAbortError } from "../lib/abort-utils.js";
40
47
  import { expandFileRefsAsync } from "./file-ref-expander.js";
41
48
  // Per-turn helpers resolved at module load (not re-`await import`ed inside the
42
49
  // turn loop). image-input + ide-context are pure local modules; pulling them up
@@ -85,6 +92,7 @@ import {
85
92
  appendAssistantMessage as jsonlAppendAssistantMessage,
86
93
  appendToolCallCompact as jsonlAppendToolCallCompact,
87
94
  appendLlmRetryCompact as jsonlAppendLlmRetryCompact,
95
+ appendCompactEventIfMessagesMatch as jsonlAppendCompactEventIfMessagesMatch,
88
96
  appendEvent as jsonlAppendEvent,
89
97
  appendAuthorityEvent as jsonlAppendAuthorityEvent,
90
98
  readEvents as jsonlReadEvents,
@@ -803,6 +811,7 @@ async function runTurn(
803
811
  let finalText = "";
804
812
  let endReason = "complete";
805
813
  let stopForCost = false;
814
+ let stopForCompactionUsageUnknown = false;
806
815
  let responseCompleted = false;
807
816
  // P0-2: the side-effect op currently in flight (at most one — the loop runs
808
817
  // tools serially). Non-null only between a dangerous tool's tool-executing
@@ -1012,6 +1021,18 @@ async function runTurn(
1012
1021
  }
1013
1022
  }
1014
1023
  break;
1024
+ case "compaction-usage-unknown":
1025
+ emit({
1026
+ type: "compaction_usage_unknown",
1027
+ provider: event.provider,
1028
+ model: event.model,
1029
+ source: event.source || "semantic-compaction",
1030
+ reason: event.reason || "provider_transport_outcome_unknown",
1031
+ usage_outcome: "unknown",
1032
+ });
1033
+ endReason = "compaction-usage-unknown";
1034
+ stopForCompactionUsageUnknown = true;
1035
+ break;
1015
1036
  case "iteration-warning":
1016
1037
  emit({ type: "iteration_warning", message: event.message });
1017
1038
  break;
@@ -1033,7 +1054,7 @@ async function runTurn(
1033
1054
  await waitForOutput?.();
1034
1055
  // Hard cost cap reached — stop consuming the loop (break the for-await, not
1035
1056
  // just the switch) so no further paid LLM call is made.
1036
- if (stopForCost) break;
1057
+ if (stopForCost || stopForCompactionUsageUnknown) break;
1037
1058
  }
1038
1059
  if (
1039
1060
  sideEffects &&
@@ -1181,6 +1202,7 @@ async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
1181
1202
  typeof deps.sessionHasPersistedEvidence === "function" ||
1182
1203
  typeof deps.sessionExists === "function" ||
1183
1204
  typeof deps.rebuildMessages === "function" ||
1205
+ typeof deps.appendCompactEventIfMessagesMatch === "function" ||
1184
1206
  typeof deps.appendEvent === "function" ||
1185
1207
  typeof deps.appendAuthorityEvent === "function" ||
1186
1208
  typeof deps.readVerifiedEvents === "function" ||
@@ -1379,6 +1401,7 @@ async function runAgentHeadlessStreamInWorkspace(
1379
1401
  typeof deps.sessionHasPersistedEvidence === "function" ||
1380
1402
  typeof deps.sessionExists === "function" ||
1381
1403
  typeof deps.rebuildMessages === "function" ||
1404
+ typeof deps.appendCompactEventIfMessagesMatch === "function" ||
1382
1405
  typeof deps.appendEvent === "function" ||
1383
1406
  typeof deps.appendAuthorityEvent === "function" ||
1384
1407
  typeof deps.readVerifiedEvents === "function" ||
@@ -1739,6 +1762,11 @@ async function runAgentHeadlessStreamInWorkspace(
1739
1762
  appendLlmRetryCompact:
1740
1763
  deps.appendLlmRetryCompact ||
1741
1764
  (hasInjectedSessionStore ? () => true : jsonlAppendLlmRetryCompact),
1765
+ appendCompactEventIfMessagesMatch:
1766
+ deps.appendCompactEventIfMessagesMatch ||
1767
+ (hasInjectedSessionStore
1768
+ ? unavailableAuthorityCapability("appendCompactEventIfMessagesMatch")
1769
+ : jsonlAppendCompactEventIfMessagesMatch),
1742
1770
  appendEvent:
1743
1771
  deps.appendEvent ||
1744
1772
  (hasInjectedSessionStore ? () => true : jsonlAppendEvent),
@@ -2495,6 +2523,7 @@ async function runAgentHeadlessStreamInWorkspace(
2495
2523
  sink: mcpLedgerSink,
2496
2524
  recovery: mcpLedgerRecovery,
2497
2525
  recoveryError: mcpLedgerRecoveryError,
2526
+ dispatchAdmission: sessionHostLease?.admitMcpDispatch || null,
2498
2527
  });
2499
2528
  const hostMcp = mcp
2500
2529
  ? { ...mcp, mcpClient: mcpRecoveryRuntime.client || mcp.mcpClient }
@@ -2730,6 +2759,26 @@ async function runAgentHeadlessStreamInWorkspace(
2730
2759
  // A null sink disables durable writes, not recovery admission. Retain the
2731
2760
  // guarded ledger so outcome-unknown calls cannot be retried in-process.
2732
2761
  mcpCallLedger: mcpRecoveryRuntime.ledger,
2762
+ mcpDispatchAdmission: sessionHostLease?.admitMcpDispatch || null,
2763
+ onCompaction: persist
2764
+ ? (stats, compacted, settlement = {}) => {
2765
+ sessionHostLease?.assert?.();
2766
+ return requireSynchronousRecoveryResult(
2767
+ store.appendCompactEventIfMessagesMatch(
2768
+ sessionId,
2769
+ {
2770
+ ...stats,
2771
+ trigger: settlement.trigger || "auto",
2772
+ messages: projectCanonicalResumeMessages(compacted, {
2773
+ strict: true,
2774
+ }),
2775
+ },
2776
+ settlement.expectedMessages,
2777
+ ),
2778
+ "appendCompactEventIfMessagesMatch",
2779
+ );
2780
+ }
2781
+ : undefined,
2733
2782
  chatFn: deps.chatFn || options.chatFn || undefined,
2734
2783
  signal: options.signal || undefined,
2735
2784
  // --include-partial-messages: stream live assistant-text deltas as
@@ -3035,31 +3084,194 @@ async function runAgentHeadlessStreamInWorkspace(
3035
3084
  continue;
3036
3085
  }
3037
3086
 
3038
- // Manual `/compact` (Claude-Code IDE parity): trim the live history in
3039
- // place between turns — no LLM call (microCompact shortens large old tool
3040
- // results, preserving recent turns + tool pairs). Answers with a
3041
- // `compaction` event the panel renders as "compacted N→M, saved …".
3087
+ // Manual `/compact` uses the same provider-backed structured handoff as the
3088
+ // other long-lived hosts. Provider/schema failures degrade to the shared
3089
+ // extractive handoff instead of silently dropping all but recent turns.
3042
3090
  if (parsed.compact) {
3043
- const { microCompact } = await import("../lib/micro-compact.js");
3044
3091
  const before = messages.length;
3045
- const { messages: compacted, stats } = microCompact(messages);
3046
- messages.length = 0;
3047
- messages.push(...compacted);
3048
- emit({
3049
- type: "compaction",
3050
- stats,
3051
- messages_before: before,
3052
- messages_after: messages.length,
3053
- });
3054
- emitHooksV2Event("PostCompact", {
3055
- schema_version: 1,
3056
- trigger: "manual",
3057
- session_id: sessionId,
3058
- messages_before: before,
3059
- messages_after: messages.length,
3060
- stats,
3061
- cwd,
3062
- });
3092
+ const expectedMessages = [...messages];
3093
+ let compacted;
3094
+ let stats;
3095
+ let degradedEvent;
3096
+ let usageEvent;
3097
+ let usageUnknownEvent;
3098
+ try {
3099
+ ({
3100
+ messages: compacted,
3101
+ stats,
3102
+ degradedEvent,
3103
+ usageEvent,
3104
+ usageUnknownEvent,
3105
+ } = await compactConversationWithProvider(messages, {
3106
+ provider,
3107
+ model,
3108
+ baseUrl,
3109
+ apiKey,
3110
+ signal: options.signal,
3111
+ force: true,
3112
+ preserveCompletedExchange: true,
3113
+ llmQuery:
3114
+ deps.compactionLlmQuery || options.compactionLlmQuery || null,
3115
+ chatFn:
3116
+ deps.compactionChatFn ||
3117
+ options.compactionChatFn ||
3118
+ coreChatWithTools,
3119
+ chatOptions: { cwd, sessionId },
3120
+ maxOutputTokens: options.compactionMaxOutputTokens,
3121
+ summaryInputMaxChars: options.compactionInputMaxChars,
3122
+ }));
3123
+ } catch (error) {
3124
+ if (isAbortError(error) || options.signal?.aborted) throw error;
3125
+ emit({
3126
+ type: "compaction-degraded",
3127
+ reason: `compaction_failed:${String(error?.message || error).slice(0, 240)}`,
3128
+ summaryMode: "none",
3129
+ });
3130
+ continue;
3131
+ }
3132
+ if (degradedEvent) {
3133
+ emit({ type: "compaction-degraded", ...degradedEvent });
3134
+ }
3135
+ if (usageUnknownEvent) {
3136
+ emit({
3137
+ type: "compaction_usage_unknown",
3138
+ ...usageUnknownEvent,
3139
+ usage_outcome: "unknown",
3140
+ });
3141
+ emit({
3142
+ type: "result",
3143
+ subtype: "error_compaction_usage_unknown",
3144
+ is_error: true,
3145
+ code: "CC_COMPACTION_USAGE_UNKNOWN",
3146
+ error:
3147
+ "Compaction provider usage is unknown; the paid compaction is not retried",
3148
+ session_id: sessionId,
3149
+ ...(costBudget ? { budget_state: "unverifiable" } : {}),
3150
+ });
3151
+ sawError = true;
3152
+ break;
3153
+ }
3154
+ let costExceeded = false;
3155
+ if (usageEvent) {
3156
+ emit({ type: "token_usage", ...usageEvent });
3157
+ if (costBudget) {
3158
+ costBudget.add(usageEvent);
3159
+ costExceeded = costBudget.exceeded();
3160
+ }
3161
+ }
3162
+
3163
+ // Provider work above is intentionally outside the canonical writer
3164
+ // lock. Settle the candidate once, under the JSONL message-projection CAS,
3165
+ // before replacing the live history. A stale/unknown settlement is never
3166
+ // retried here: that could duplicate either the paid summary call or a
3167
+ // compact event whose fsync outcome is unknown.
3168
+ const shouldPersistCompact = stats?.strategy !== "none";
3169
+ let settlementError = null;
3170
+ let persistenceFailure = null;
3171
+ if (persist && shouldPersistCompact) {
3172
+ try {
3173
+ sessionHostLease?.assert?.();
3174
+ requireSynchronousRecoveryResult(
3175
+ store.appendCompactEventIfMessagesMatch(
3176
+ sessionId,
3177
+ {
3178
+ ...stats,
3179
+ trigger: "manual",
3180
+ messages: projectCanonicalResumeMessages(compacted, {
3181
+ strict: true,
3182
+ }),
3183
+ },
3184
+ expectedMessages,
3185
+ ),
3186
+ "appendCompactEventIfMessagesMatch",
3187
+ );
3188
+ } catch (error) {
3189
+ settlementError = error;
3190
+ const normalized = createSessionPersistenceFailure(error, {
3191
+ sessionId,
3192
+ operation: "append-authority-event",
3193
+ });
3194
+ persistenceFailure = projectSessionPersistenceFailure(normalized, {
3195
+ phase: "after-model",
3196
+ });
3197
+ if (persistenceFailure) {
3198
+ terminalPersistenceFailure = persistenceFailure;
3199
+ try {
3200
+ deps.onPersistenceFailure?.(persistenceFailure);
3201
+ } catch {
3202
+ // Observability cannot change persistence semantics.
3203
+ }
3204
+ }
3205
+ }
3206
+ }
3207
+
3208
+ if (!settlementError) {
3209
+ messages.length = 0;
3210
+ messages.push(...compacted);
3211
+ emit({
3212
+ type: "compaction",
3213
+ stats,
3214
+ messages_before: before,
3215
+ messages_after: messages.length,
3216
+ });
3217
+ emitHooksV2Event("PostCompact", {
3218
+ schema_version: 1,
3219
+ trigger: "manual",
3220
+ session_id: sessionId,
3221
+ messages_before: before,
3222
+ messages_after: messages.length,
3223
+ stats,
3224
+ cwd,
3225
+ });
3226
+ } else {
3227
+ const stale = settlementError?.code === "SESSION_REVISION_STALE";
3228
+ const code = stale
3229
+ ? "CC_COMPACTION_REVISION_STALE"
3230
+ : persistenceFailure?.code ||
3231
+ settlementError?.code ||
3232
+ "CC_COMPACTION_SETTLEMENT_FAILED";
3233
+ emit({
3234
+ type: "compaction-degraded",
3235
+ reason: stale
3236
+ ? "session_messages_changed_during_compaction"
3237
+ : "canonical_compaction_settlement_failed",
3238
+ summaryMode: "none",
3239
+ code,
3240
+ });
3241
+ emit({
3242
+ type: "result",
3243
+ subtype: persistenceFailure
3244
+ ? "error_persistence"
3245
+ : stale
3246
+ ? "error_compaction_stale"
3247
+ : "error_session_persistence",
3248
+ is_error: true,
3249
+ code,
3250
+ error: "Canonical compaction was not settled",
3251
+ session_id: sessionId,
3252
+ ...(persistenceFailure ? { persistence: persistenceFailure } : {}),
3253
+ });
3254
+ sawError = true;
3255
+ }
3256
+
3257
+ if (costExceeded) {
3258
+ sawError = true;
3259
+ emit({
3260
+ type: "cost_budget_exhausted",
3261
+ limit_usd: options.maxCostUsd,
3262
+ spent_usd: costBudget.spentUsd,
3263
+ session_id: sessionId,
3264
+ turn: turns,
3265
+ });
3266
+ }
3267
+ if (settlementError || costExceeded) {
3268
+ break;
3269
+ }
3270
+ if (!shouldPersistCompact && persist) {
3271
+ // A repeated `/compact` against an already-compact context is a no-op:
3272
+ // do not grow the canonical chain with duplicate checkpoints.
3273
+ sessionHostLease?.assert?.();
3274
+ }
3063
3275
  continue;
3064
3276
  }
3065
3277
 
@@ -3596,6 +3808,23 @@ async function runAgentHeadlessStreamInWorkspace(
3596
3808
  }
3597
3809
  currentAbort = null;
3598
3810
 
3811
+ if (outcome.endReason === "compaction-usage-unknown") {
3812
+ sawError = true;
3813
+ emit({
3814
+ type: "result",
3815
+ subtype: "error_compaction_usage_unknown",
3816
+ is_error: true,
3817
+ code: "CC_COMPACTION_USAGE_UNKNOWN",
3818
+ error:
3819
+ "Compaction provider usage is unknown; the paid compaction is not retried",
3820
+ session_id: sessionId,
3821
+ turn: turns,
3822
+ usage: outcome.usage,
3823
+ ...(costBudget ? { budget_state: "unverifiable" } : {}),
3824
+ });
3825
+ break;
3826
+ }
3827
+
3599
3828
  // §3.5.18 出境台账: report what left the device this turn (the cloud-LLM
3600
3829
  // call + any egress-classed tool) so the Android transparency ledger —
3601
3830
  // which cannot see the cc subprocess's cloud call — records it. PDH-gated
@@ -1 +0,0 @@
1
- import{I as i,J as A,U as I,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-Bn1JzzAn.js";import{_ as we,b as re,u as ie,d}from"./index-CfiEM64n.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as be,aP as Fe,f as je,a5 as Ce,a8 as xe,at as Oe,R as Se}from"./icons-DG5UD-6K.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:W}=de();async function w(o,f,ye,ae=8e3){if(W){const Z=await e.sendRaw({...f,type:o},ae);if(!Z?.ok){const $=Z?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return Z.result}return e.executeJson(ye,ae)}const B=u(!1),y=u([]),O=u(""),S=u(""),P=u(!1),v=u(null),h=u([]),k=u(!1),E=u(!1),L=u(!1),b=u({name:"",description:"",type:"document",rootPath:""}),z=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],V=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),J=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function K(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function Q(o){return!o&&o!==0?"-":new Date(typeof o=="number"?o:parseInt(o,10)).toLocaleString("zh-CN",{hour12:!1})}async function C(){B.value=!0;try{const o=await w("project.list",{limit:500},"project list --limit 500 --json",1e4);y.value=Array.isArray(o?.projects)?o.projects:Array.isArray(o)?o:[]}catch(o){d.error("加载失败: "+(o.message||o)),y.value=[]}finally{B.value=!1}}function G(o){return{onClick:()=>M(o)}}async function M(o){v.value=o,P.value=!0,k.value=!0,h.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);h.value=Array.isArray(f?.files)?f.files:[]}catch{h.value=[]}finally{k.value=!1}}async function H(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function X(){b.value={name:"",description:"",type:"document",rootPath:""},E.value=!0}async function T(){if(!b.value.name.trim()){d.warning("请输入项目名称");return}L.value=!0;try{const o=await w("project.init",{name:b.value.name.trim(),description:b.value.description||null,projectType:b.value.type,rootPath:b.value.rootPath||null},`project init "${b.value.name.trim()}" --type ${b.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),E.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{L.value=!1}}const F=u(!1),D=u(!1),j=u({path:"",content:""}),U=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),N=u(""),Y=u(!1);function ue(){j.value={path:"",content:""},F.value=!0}function ce(){R.value={path:""},U.value=!0}async function q(){if(v.value){k.value=!0;try{const o=await w("project.listFiles",{projectId:v.value.id,limit:200},`project list-files ${v.value.id} --json`,8e3);h.value=Array.isArray(o?.files)?o.files:[]}catch(o){d.error("刷新文件失败: "+(o.message||o))}finally{k.value=!1}}}async function fe(){if(!j.value.path.trim()){d.warning("请输入文件路径");return}if(v.value){D.value=!0;try{const o=await w("project.createFile",{projectId:v.value.id,filePath:j.value.path.trim(),content:j.value.content||""},`project create-file ${v.value.id} "${j.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件 '${o.file_name}'`),F.value=!1,await q(),await C()):d.error("创建文件失败")}catch(o){d.error(o.message||String(o))}finally{D.value=!1}}}async function pe(){if(!R.value.path.trim()){d.warning("请输入文件夹路径");return}if(v.value){m.value=!0;try{const o=await w("project.createFolder",{projectId:v.value.id,folderPath:R.value.path.trim()},`project create-folder ${v.value.id} "${R.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件夹 '${o.file_name}'`),U.value=!1,await q(),await C()):d.error("创建文件夹失败")}catch(o){d.error(o.message||String(o))}finally{m.value=!1}}}async function ve(o){try{(await w("project.deleteFile",{fileId:o.id},`project delete-file ${o.id} --json`,8e3))?.deleted?(d.success(`已删除 '${o.file_name}'`),await q(),await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}async function me(o){if(o.is_folder){d.info("文件夹无内容可编辑");return}try{const f=await w("project.getFile",{fileId:o.id},`project get-file ${o.id} --json`,8e3);c.value=o,N.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){Y.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:N.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await q()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{Y.value=!1}}}oe(()=>{C()});const le={t:te,ws:e,isEmbedded:W,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:h,filesLoading:k,createOpen:E,creating:L,newProject:b,columns:z,countByStatus:V,filteredProjects:J,statusColor:g,syncColor:K,formatTime:Q,loadAll:C,onRowClick:G,openDetail:M,onDelete:H,onShowCreate:X,onCreate:T,createFileOpen:F,creatingFile:D,newFile:j,createFolderOpen:U,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:N,savingFile:Y,openCreateFile:ue,openCreateFolder:ce,refreshFiles:q,onCreateFile:fe,onCreateFolder:pe,onDeleteFile:ve,openEditFile:me,onSaveFile:_e,ref:u,computed:ee,onMounted:oe,get ReloadOutlined(){return Se},get PlusOutlined(){return Oe},get FolderOutlined(){return xe},get FileTextOutlined(){return Ce},get CheckCircleOutlined(){return je},get CheckSquareOutlined(){return Fe},get FileAddOutlined(){return be},get FolderAddOutlined(){return ke},get message(){return d},get useI18n(){return re},get useWsStore(){return ie},get useShellMode(){return de}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ue={class:"page-title"},Ae={class:"page-sub"},Ie={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},he={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Te={key:1,style:{color:"#888"}},Be=["onClick"],Ee={key:0,style:{color:"#888","font-size":"12px"}};function Le(se,l,te,e,W,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),h=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=i("a-input-search"),b=i("a-alert"),z=i("a-tag"),V=i("a-popconfirm"),J=i("a-table"),g=i("a-descriptions-item"),K=i("a-descriptions"),Q=i("a-divider"),C=i("a-empty"),G=i("a-list-item"),M=i("a-list"),H=i("a-spin"),X=i("a-drawer"),T=i("a-input"),F=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),U=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),A("div",null,[I("div",ze,[I("div",null,[I("h2",Ue,s(e.t("projects.title")),1),I("p",Ae,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(h,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),I("div",Ie,[t(E,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(L,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(b,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(J,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),A("code",he,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),A(ne,{key:1},[I("strong",null,s(c.name),1),c.description?(p(),A("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),A(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:N=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(V,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:N=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(X,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(K,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[I("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),A("code",Re,s(e.detail.root_path),1)):(p(),A("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(Q,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(H,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(M,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(G,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),A("span",Ee,s(n.file_size)+" B",1)):_("v-if",!0),t(V,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[I("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(U,{open:e.createFileOpen,"onUpdate:open":l[6]||(l[6]=n=>e.createFileOpen=n),title:"新建文件","confirm-loading":e.creatingFile,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFile},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(F,{label:"文件路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFile.path,"onUpdate:value":l[4]||(l[4]=n=>e.newFile.path=n),placeholder:"例如 README.md 或 src/main.kt"},null,8,["value"])]),_:1}),t(F,{label:"初始内容(可选)"},{default:a(()=>[t(D,{value:e.newFile.content,"onUpdate:value":l[5]||(l[5]=n=>e.newFile.content=n),rows:6,placeholder:"留空创建空文件"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Create folder modal "),t(U,{open:e.createFolderOpen,"onUpdate:open":l[8]||(l[8]=n=>e.createFolderOpen=n),title:"新建文件夹","confirm-loading":e.creatingFolder,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFolder},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(F,{label:"文件夹路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFolder.path,"onUpdate:value":l[7]||(l[7]=n=>e.newFolder.path=n),placeholder:"例如 src/utils"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Edit file content modal "),t(U,{open:e.editFileOpen,"onUpdate:open":l[10]||(l[10]=n=>e.editFileOpen=n),title:`编辑 ${e.editingFile?.file_name||""}`,"confirm-loading":e.savingFile,"ok-text":"保存","cancel-text":"取消",onOk:e.onSaveFile,width:"720"},{default:a(()=>[t(D,{value:e.editFileContent,"onUpdate:value":l[9]||(l[9]=n=>e.editFileContent=n),rows:18,"auto-size":{minRows:12,maxRows:24},style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["open","title","confirm-loading"]),_(" Create modal "),t(U,{open:e.createOpen,"onUpdate:open":l[15]||(l[15]=n=>e.createOpen=n),title:"新建项目","confirm-loading":e.creating,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreate},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(F,{label:"项目名称",required:""},{default:a(()=>[t(T,{value:e.newProject.name,"onUpdate:value":l[11]||(l[11]=n=>e.newProject.name=n),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(F,{label:"描述"},{default:a(()=>[t(D,{value:e.newProject.description,"onUpdate:value":l[12]||(l[12]=n=>e.newProject.description=n),rows:2},null,8,["value"])]),_:1}),t(F,{label:"类型"},{default:a(()=>[t(R,{value:e.newProject.type,"onUpdate:value":l[13]||(l[13]=n=>e.newProject.type=n)},{default:a(()=>[t(m,{value:"document"},{default:a(()=>[...l[32]||(l[32]=[r("文档 (document)",-1)])]),_:1}),t(m,{value:"data"},{default:a(()=>[...l[33]||(l[33]=[r("数据 (data)",-1)])]),_:1}),t(m,{value:"web"},{default:a(()=>[...l[34]||(l[34]=[r("Web",-1)])]),_:1}),t(m,{value:"app"},{default:a(()=>[...l[35]||(l[35]=[r("应用 (app)",-1)])]),_:1}),t(m,{value:"presentation"},{default:a(()=>[...l[36]||(l[36]=[r("演示文稿",-1)])]),_:1}),t(m,{value:"spreadsheet"},{default:a(()=>[...l[37]||(l[37]=[r("表格",-1)])]),_:1}),t(m,{value:"design"},{default:a(()=>[...l[38]||(l[38]=[r("设计",-1)])]),_:1}),t(m,{value:"code"},{default:a(()=>[...l[39]||(l[39]=[r("代码",-1)])]),_:1}),t(m,{value:"workflow"},{default:a(()=>[...l[40]||(l[40]=[r("工作流",-1)])]),_:1}),t(m,{value:"knowledge"},{default:a(()=>[...l[41]||(l[41]=[r("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(F,{label:"根路径 (可选)"},{default:a(()=>[t(T,{value:e.newProject.rootPath,"onUpdate:value":l[14]||(l[14]=n=>e.newProject.rootPath=n),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}const We=we(Pe,[["render",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-N6bUe4/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-CfiEM64n.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-CxGu3pit.js";import{a0 as t}from"./index-CfiEM64n.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-CgrcPcDi.js";import"./useFlexGapSupport-CnnodGmp.js";import"./styleChecker-DPEJdQaZ.js";import"./index-CySTJKeq.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-CsPYFmgo.js";import{a0 as t}from"./index-CfiEM64n.js";import"./vendor-Bn1JzzAn.js";import"./index-CySTJKeq.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};