chainlesschain 0.166.77 → 0.166.79

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 (230) hide show
  1. package/README.md +9 -8
  2. package/completions/_cc +1 -1
  3. package/completions/cc.bash +1 -1
  4. package/completions/cc.fish +1 -1
  5. package/completions/cc.ps1 +1 -1
  6. package/package.json +1 -1
  7. package/src/assets/linux-subreaper/linux-arm64/manifest.json +10 -0
  8. package/src/assets/linux-subreaper/linux-arm64/supervisor +0 -0
  9. package/src/assets/linux-subreaper/linux-x64/manifest.json +10 -0
  10. package/src/assets/linux-subreaper/linux-x64/supervisor +0 -0
  11. package/src/assets/web-panel/assets/{AIOps-CpiCBhRh.js → AIOps-CwD6Pm_Y.js} +1 -1
  12. package/src/assets/web-panel/assets/{ActionButton-CnU-Xvx-.js → ActionButton-Du5Rp-O6.js} +1 -1
  13. package/src/assets/web-panel/assets/{Analytics-BJW-CNtf.js → Analytics-DY9l72ma.js} +3 -3
  14. package/src/assets/web-panel/assets/{AppLayout-UFQJL3G9.js → AppLayout-7t1WIaCJ.js} +5 -5
  15. package/src/assets/web-panel/assets/{Artifacts-Dr_IUDoY.js → Artifacts-BLIA5yny.js} +1 -1
  16. package/src/assets/web-panel/assets/{Audit-aglWo6rr.js → Audit-BC_N0QTg.js} +1 -1
  17. package/src/assets/web-panel/assets/{BackgroundAgents-Dm_TCiXC.js → BackgroundAgents-CA7SxDtg.js} +1 -1
  18. package/src/assets/web-panel/assets/{Backup-DUdX4-gA.js → Backup-BZ4AzS1_.js} +1 -1
  19. package/src/assets/web-panel/assets/{BaseInput-BTcLjy1o.js → BaseInput-BhiggGaH.js} +1 -1
  20. package/src/assets/web-panel/assets/{Chat-Bhy9qZrl.js → Chat-CDdBoIBI.js} +5 -5
  21. package/src/assets/web-panel/assets/ChatBubbleRenderer-hsBsrl31.js +1 -0
  22. package/src/assets/web-panel/assets/{Checkbox-CblrPa21.js → Checkbox-asoMKSEK.js} +1 -1
  23. package/src/assets/web-panel/assets/{Codegen-SEAHzOlr.js → Codegen-B0gElLdm.js} +1 -1
  24. package/src/assets/web-panel/assets/{Col-DJz8iFOR.js → Col-DrNzLpF6.js} +1 -1
  25. package/src/assets/web-panel/assets/{Community-RufKhcQt.js → Community-DCzB5qkI.js} +1 -1
  26. package/src/assets/web-panel/assets/{Compact-Dlifx08U.js → Compact-Db-Eua_j.js} +1 -1
  27. package/src/assets/web-panel/assets/{Compliance-DdhQWcHh.js → Compliance-B76NByjl.js} +1 -1
  28. package/src/assets/web-panel/assets/{Cowork-BLNn6oOm.js → Cowork-C-nK6Qpk.js} +3 -3
  29. package/src/assets/web-panel/assets/{Cron-Dv-JWY2d.js → Cron-C-GlQO19.js} +2 -2
  30. package/src/assets/web-panel/assets/{Crosschain-k7Pz7O-b.js → Crosschain-Cuuz9IIh.js} +1 -1
  31. package/src/assets/web-panel/assets/{DID-C_10syUW.js → DID-gwFaT973.js} +2 -2
  32. package/src/assets/web-panel/assets/{Dashboard-CMyH6Szx.js → Dashboard-DHDt5jEf.js} +2 -2
  33. package/src/assets/web-panel/assets/{Dropdown-DjmD2Saa.js → Dropdown-CJ9kog-Y.js} +1 -1
  34. package/src/assets/web-panel/assets/{EmailListRenderer-36_IRUSo.js → EmailListRenderer-DOSXFRiQ.js} +1 -1
  35. package/src/assets/web-panel/assets/{EvolutionSettings-CmtU0XmM.js → EvolutionSettings-CHYMP7rR.js} +1 -1
  36. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DEgf9kyP.js → FamilyGuardDashboard-C1gzG5EK.js} +1 -1
  37. package/src/assets/web-panel/assets/{Federation-DGO1wQls.js → Federation-CEdNVWUw.js} +1 -1
  38. package/src/assets/web-panel/assets/{FormItemContext-Doj1FmKW.js → FormItemContext-CwVOWPX8.js} +1 -1
  39. package/src/assets/web-panel/assets/{GenericCardRenderer-GzOU27iT.js → GenericCardRenderer-CgNUs3kT.js} +1 -1
  40. package/src/assets/web-panel/assets/{Git-Dd7D1EDK.js → Git-DM4MNnQo.js} +2 -2
  41. package/src/assets/web-panel/assets/{Governance-6IY8LcjI.js → Governance-DdOtjkvd.js} +1 -1
  42. package/src/assets/web-panel/assets/{Inference-BB9gl8q1.js → Inference-28PidFfr.js} +1 -1
  43. package/src/assets/web-panel/assets/{KnowledgeGraph-CeCed5wd.js → KnowledgeGraph-Bpj_qNUK.js} +1 -1
  44. package/src/assets/web-panel/assets/{Logs-CYOeHuaI.js → Logs-C6Ix19Ay.js} +2 -2
  45. package/src/assets/web-panel/assets/{MarkdownRenderer-Bk8Zqc2R.js → MarkdownRenderer-Bj6mtPbf.js} +1 -1
  46. package/src/assets/web-panel/assets/{Marketplace-D-_xgHgM.js → Marketplace-DqkhRSMP.js} +1 -1
  47. package/src/assets/web-panel/assets/{McpTools-NnaUTF5t.js → McpTools-1WQ2SjaE.js} +3 -3
  48. package/src/assets/web-panel/assets/{Memory-CndN9pMt.js → Memory-BWTi7v6R.js} +2 -2
  49. package/src/assets/web-panel/assets/{MobileBridge-BXblFmhY.js → MobileBridge-DB4wu3UE.js} +1 -1
  50. package/src/assets/web-panel/assets/{MobileProjects-CC26Dm2k.js → MobileProjects-Bh9pWx2f.js} +1 -1
  51. package/src/assets/web-panel/assets/{Mtc-BhaqWCiW.js → Mtc-BVF1Wrno.js} +4 -4
  52. package/src/assets/web-panel/assets/{MtcAudit-D6fktM2w.js → MtcAudit-DtNfslPf.js} +5 -5
  53. package/src/assets/web-panel/assets/{Multisig-CFvahz7s.js → Multisig-4qcXP0bf.js} +3 -3
  54. package/src/assets/web-panel/assets/{NLProgramming-Co73Ivya.js → NLProgramming-BRJl5Ehw.js} +1 -1
  55. package/src/assets/web-panel/assets/{Notes-B4g33L1o.js → Notes-BRY_bgMk.js} +3 -3
  56. package/src/assets/web-panel/assets/{NotificationSettings-lXd17EbN.js → NotificationSettings-DirXMFz4.js} +1 -1
  57. package/src/assets/web-panel/assets/{OrderTableRenderer-BiOB0GIi.js → OrderTableRenderer-BlrY8lwu.js} +1 -1
  58. package/src/assets/web-panel/assets/{Organization-JQ7_wQIA.js → Organization-CVzQ1vO-.js} +4 -4
  59. package/src/assets/web-panel/assets/{Overflow-gwgJgozQ.js → Overflow-A3rXTPG4.js} +1 -1
  60. package/src/assets/web-panel/assets/{P2P-D9L_0gie.js → P2P-Db9ABWz0.js} +2 -2
  61. package/src/assets/web-panel/assets/{PdhVaultBrowser-CbOPsFE9.js → PdhVaultBrowser-CPv0H2OZ.js} +3 -3
  62. package/src/assets/web-panel/assets/{Permissions-Cz42HNQf.js → Permissions-COnW4sIR.js} +4 -4
  63. package/src/assets/web-panel/assets/{PersonalDataHub-DjorYtrF.js → PersonalDataHub-C1hG7rp7.js} +5 -5
  64. package/src/assets/web-panel/assets/{Pipeline-DyWPhmm5.js → Pipeline---GLRDEe.js} +1 -1
  65. package/src/assets/web-panel/assets/{Privacy-DyfLMl2j.js → Privacy-aaN9R3Lu.js} +1 -1
  66. package/src/assets/web-panel/assets/{ProjectInit-CyqDx1OE.js → ProjectInit-C-kw49hE.js} +2 -2
  67. package/src/assets/web-panel/assets/{ProjectSettings-DsBw0Csy.js → ProjectSettings-y5tTkBTC.js} +2 -2
  68. package/src/assets/web-panel/assets/Projects-DZHlhyPB.js +1 -0
  69. package/src/assets/web-panel/assets/{Providers-CCI_klN-.js → Providers-LqxnV72o.js} +1 -1
  70. package/src/assets/web-panel/assets/{QrScannerModal-DNsnlDdS.js → QrScannerModal-D_q-Y5F0.js} +1 -1
  71. package/src/assets/web-panel/assets/{QuickAsk-B9r2iaee.js → QuickAsk-_E_KB5o8.js} +1 -1
  72. package/src/assets/web-panel/assets/{Recommend-BJDe03GR.js → Recommend-BN8S5WJA.js} +1 -1
  73. package/src/assets/web-panel/assets/{RemoteSession-J7JR3rRo.js → RemoteSession-BFzrY_aW.js} +3 -3
  74. package/src/assets/web-panel/assets/{Reputation-DR39AJeV.js → Reputation-C1HCLaTV.js} +1 -1
  75. package/src/assets/web-panel/assets/{Row-Dh77m3NZ.js → Row-B8T2-Qv7.js} +1 -1
  76. package/src/assets/web-panel/assets/{RssFeed-BUdg28nJ.js → RssFeed-CNQLk8v1.js} +3 -3
  77. package/src/assets/web-panel/assets/{Search-BNC7sGhj.js → Search-BOx720Kc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Security-DISENGI7.js → Security-Ds8z6PF6.js} +4 -4
  79. package/src/assets/web-panel/assets/{Services-BBBGpJ1-.js → Services-C0-YkRSF.js} +2 -2
  80. package/src/assets/web-panel/assets/{Skeleton-DMcIoIv2.js → Skeleton-DUHlSySD.js} +1 -1
  81. package/src/assets/web-panel/assets/{Skills-QAyFbI3r.js → Skills-C8CBbbh0.js} +1 -1
  82. package/src/assets/web-panel/assets/{Sla-CSg5wLH7.js → Sla-lQltyYfB.js} +1 -1
  83. package/src/assets/web-panel/assets/{SpeechSettings-DMPxTc5x.js → SpeechSettings-B5vyOma-.js} +1 -1
  84. package/src/assets/web-panel/assets/{SyncSettings-CPG7l30y.js → SyncSettings-BKDPu_y-.js} +2 -2
  85. package/src/assets/web-panel/assets/{Tasks-Y1kOVvVL.js → Tasks-Bgvf7LTx.js} +1 -1
  86. package/src/assets/web-panel/assets/{Templates-jt9NagL0.js → Templates-BMZyYYS7.js} +1 -1
  87. package/src/assets/web-panel/assets/{Tenant-DauuJICx.js → Tenant-7PYTig8f.js} +1 -1
  88. package/src/assets/web-panel/assets/{Terminal-E9rnKeGq.js → Terminal-C2W0LMdR.js} +2 -2
  89. package/src/assets/web-panel/assets/{TimelineRenderer-Cc7z2APG.js → TimelineRenderer-CqREew_l.js} +1 -1
  90. package/src/assets/web-panel/assets/{Tokens-CV0UthRA.js → Tokens-BhTyxTuD.js} +1 -1
  91. package/src/assets/web-panel/assets/{Trigger-BFcJJGfu.js → Trigger-DxNSSZy_.js} +1 -1
  92. package/src/assets/web-panel/assets/{Trust-BAydbNJA.js → Trust-Dy_wfbIh.js} +1 -1
  93. package/src/assets/web-panel/assets/{UkeySign-DcOS6sqL.js → UkeySign-DJC5ANqx.js} +1 -1
  94. package/src/assets/web-panel/assets/{VideoEditing-BLHJZvif.js → VideoEditing-CNFevrO4.js} +1 -1
  95. package/src/assets/web-panel/assets/{Wallet-4QFLKHwW.js → Wallet-CXzuS1YK.js} +4 -4
  96. package/src/assets/web-panel/assets/{WebAuthn-BocEOOSj.js → WebAuthn-BWS6HP8c.js} +5 -5
  97. package/src/assets/web-panel/assets/{WorkflowEditor-DCfF7D0B.js → WorkflowEditor-swiN_7Vj.js} +1 -1
  98. package/src/assets/web-panel/assets/{chat-CxvfsYGr.js → chat-NwH7qlBs.js} +1 -1
  99. package/src/assets/web-panel/assets/{colors-KtQB9DmQ.js → colors-h6nRhBTw.js} +1 -1
  100. package/src/assets/web-panel/assets/{compact-item-Dx4J6arN.js → compact-item-BQ6B6rP2.js} +1 -1
  101. package/src/assets/web-panel/assets/{createContext-Cq0olgzo.js → createContext-CQkJuRcG.js} +1 -1
  102. package/src/assets/web-panel/assets/devWarning-Bz6vqBGV.js +1 -0
  103. package/src/assets/web-panel/assets/{hasIn-Bf9-h3D-.js → hasIn-Diwl1WyI.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CpO6DKuu.js → index-0ZztPzIm.js} +1 -1
  105. package/src/assets/web-panel/assets/index-1b7DEw-w.js +1 -0
  106. package/src/assets/web-panel/assets/{index-DQDR-_ai.js → index-AzeSQJDK.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BMcC4cbj.js → index-B3QgcUBV.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BO6XvO-C.js → index-B5gj_uCC.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-ClUfSChI.js → index-BI3ALCgN.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-B3xfiItB.js → index-BRl3KUj0.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DFdEDvFn.js → index-BYYb8oeV.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CqnggDos.js → index-BcKDUGYf.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-B_8UcDan.js → index-BcjlIMP9.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CmQuG0fr.js → index-BheCvudN.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-iE9tqEN5.js → index-BjcARUtr.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-nmyDOh_b.js → index-BnQUin2K.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Br1mDMfO.js → index-Bs6HyCfP.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DZWjYfWt.js → index-BvPz6vZ8.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-0fi8DIVQ.js → index-C3Ye1ISy.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-hSzyoXri.js → index-C7-T-u0L.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-DfrFNMvz.js → index-CRWpixu2.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-C9yaUHm9.js → index-CatBQDSQ.js} +1 -1
  123. package/src/assets/web-panel/assets/index-CfD4tMuW.js +1 -0
  124. package/src/assets/web-panel/assets/{index-DMR-keCL.js → index-CqH-oOR3.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Cy865Hhq.js → index-CwsoVDi-.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DI5bRqNG.js → index-CyBtEVLM.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-gt5N6VM_.js → index-D5P498Rk.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-6dDDSCHD.js → index-DKaB4xTf.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BKtQyb2o.js → index-DQYZa1Ci.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CaIclw-E.js → index-DZ9CNcbJ.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-_FIz-0tp.js → index-DZAsByy4.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DBRlZdZj.js → index-D_HY0nyN.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DsCdl2Od.js → index-Da8frO_A.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Cfsn7N18.js → index-DjB8IC9D.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CeYP_kT9.js → index-Dwpthe2b.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-B8WuPI-h.js → index-Fm95dO4u.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-CK2U_AHi.js → index-GTefQSbY.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-DnU-dUWd.js → index-OEWSrqit.js} +1 -1
  139. package/src/assets/web-panel/assets/{index-DDAe1UmZ.js → index-TYMmUsxZ.js} +1 -1
  140. package/src/assets/web-panel/assets/{index-D2BfSIrn.js → index-iHNOr_wL.js} +1 -1
  141. package/src/assets/web-panel/assets/{index-Cz7f4Jaq.js → index-mxxZtsHp.js} +1 -1
  142. package/src/assets/web-panel/assets/{index-BHmdMKYl.js → index-pYwYBVeQ.js} +1 -1
  143. package/src/assets/web-panel/assets/{initDefaultProps-DvzKJ6o5.js → initDefaultProps-BeUrpC_H.js} +1 -1
  144. package/src/assets/web-panel/assets/{motion-D1yTvmxW.js → motion-CHW5EXt1.js} +1 -1
  145. package/src/assets/web-panel/assets/{move-DxtSIF8K.js → move-CWaoWJvF.js} +1 -1
  146. package/src/assets/web-panel/assets/{mtc-parser-BDsQgIHY.js → mtc-parser-CEC6Us1u.js} +1 -1
  147. package/src/assets/web-panel/assets/{omit-UVBJW8kh.js → omit-1D-kP_Qj.js} +1 -1
  148. package/src/assets/web-panel/assets/{pickAttrs-D4QqtTyX.js → pickAttrs-CsS0myLl.js} +1 -1
  149. package/src/assets/web-panel/assets/{placementArrow-QXmu6vBf.js → placementArrow-bMThOvkI.js} +1 -1
  150. package/src/assets/web-panel/assets/{responsiveObserve-D-PmXO9M.js → responsiveObserve-B72knbW8.js} +1 -1
  151. package/src/assets/web-panel/assets/{slide-CKbGxEZJ.js → slide-C3bI_2yy.js} +1 -1
  152. package/src/assets/web-panel/assets/{statusUtils-BbgXPkXm.js → statusUtils-0-FmcCAS.js} +1 -1
  153. package/src/assets/web-panel/assets/{styleChecker-DOr9rk68.js → styleChecker-DXUyqoWY.js} +1 -1
  154. package/src/assets/web-panel/assets/{useFlexGapSupport-B2wO2r36.js → useFlexGapSupport-BSSnL3f1.js} +1 -1
  155. package/src/assets/web-panel/assets/{useFs-SeVGBK34.js → useFs-B0Cvvl0S.js} +1 -1
  156. package/src/assets/web-panel/assets/{usePersonalDataHub-DUJBCxjD.js → usePersonalDataHub-6D-d4WU5.js} +1 -1
  157. package/src/assets/web-panel/assets/{vnode-CF4EYsig.js → vnode-zjIrlxT_.js} +1 -1
  158. package/src/assets/web-panel/assets/{zoom-pRUs5pqI.js → zoom-Hw7NEisu.js} +1 -1
  159. package/src/assets/web-panel/index.html +1 -1
  160. package/src/command-help-index.json +1 -1
  161. package/src/command-manifest.json +1 -1
  162. package/src/commands/checkpoint.js +42 -7
  163. package/src/commands/orchestrate.js +85 -25
  164. package/src/commands/session-location.js +5 -0
  165. package/src/commands/session-show.js +109 -1
  166. package/src/commands/session.js +26 -2
  167. package/src/commands/tokens.js +9 -4
  168. package/src/data/changelog.json +26 -0
  169. package/src/generated/cc-agent-protocol.schema.json +71 -0
  170. package/src/harness/jsonl-session-store.js +357 -114
  171. package/src/harness/mcp-client.js +44 -1
  172. package/src/lib/agent-router.js +35 -7
  173. package/src/lib/agent-sandbox.js +302 -2
  174. package/src/lib/app-server/server.js +14 -0
  175. package/src/lib/background-agent-supervisor.js +14 -4
  176. package/src/lib/causal-observability.js +64 -1
  177. package/src/lib/checkpoint-summary-projection.js +98 -0
  178. package/src/lib/checkpoint-timeline-authority.js +15 -51
  179. package/src/lib/claude-code-bridge.js +302 -60
  180. package/src/lib/codex-app-server-adapter.js +161 -35
  181. package/src/lib/cost-budget.js +4 -0
  182. package/src/lib/doctor-checkup.js +31 -2
  183. package/src/lib/durable-security-store.js +6 -1
  184. package/src/lib/evolution/evolution-artifact-identity.js +21 -0
  185. package/src/lib/evolution/evolution-artifact-ports.js +5 -11
  186. package/src/lib/evolution/evolution-eval-cohort-receipt-reconciliation.js +389 -0
  187. package/src/lib/execution-location-failure-site.js +63 -0
  188. package/src/lib/execution-location-target.js +102 -8
  189. package/src/lib/external-agent-adapters.js +2 -0
  190. package/src/lib/image-file-boundary.js +154 -0
  191. package/src/lib/image-input.js +16 -3
  192. package/src/lib/llm-pricing.js +114 -8
  193. package/src/lib/lsp/code-intelligence.js +7 -1
  194. package/src/lib/mcp-call-ledger-store.js +7 -2
  195. package/src/lib/model-capabilities.js +21 -10
  196. package/src/lib/model-context-catalog.js +60 -1
  197. package/src/lib/openai-responses.js +7 -1
  198. package/src/lib/orchestrator.js +8 -2
  199. package/src/lib/process-execution-broker/index.js +93 -1
  200. package/src/lib/process-execution-broker/linux-subreaper-artifact.js +120 -0
  201. package/src/lib/process-execution-broker/linux-subreaper-helper.js +344 -0
  202. package/src/lib/process-execution-broker/linux-subreaper-process.js +326 -0
  203. package/src/lib/process-execution-broker/linux-subreaper-supervisor.c +360 -0
  204. package/src/lib/process-execution-broker/owned-posix-process-group-worker.mjs +131 -0
  205. package/src/lib/process-execution-broker/owned-posix-process-group.js +267 -0
  206. package/src/lib/process-execution-broker/process-ownership-journal.js +297 -0
  207. package/src/lib/process-execution-broker/process-ownership-quarantine.js +91 -0
  208. package/src/lib/runtime-usage-ledger.js +3 -0
  209. package/src/lib/sandbox-docker-egress.js +507 -0
  210. package/src/lib/sandbox-egress-proxy.js +167 -10
  211. package/src/lib/sandbox-egress-worker-thread.js +38 -0
  212. package/src/lib/sandbox-egress-worker.js +196 -0
  213. package/src/lib/secure-fs.js +158 -42
  214. package/src/lib/session-branch-history.js +240 -0
  215. package/src/lib/session-history-origins.js +285 -0
  216. package/src/lib/session-input-receipt.js +110 -0
  217. package/src/lib/session-resource-budget.js +8 -8
  218. package/src/lib/session-transcript-history.js +456 -0
  219. package/src/lib/session-transcript-page.js +164 -0
  220. package/src/lib/session-transcript-reference.js +38 -0
  221. package/src/lib/session-usage.js +8 -0
  222. package/src/lib/token-tracker.js +32 -54
  223. package/src/lib/usage-pricing-context.js +93 -0
  224. package/src/runtime/agent-core.js +141 -21
  225. package/src/runtime/headless-stream.js +202 -4
  226. package/src/assets/web-panel/assets/ChatBubbleRenderer-D0WrJQaQ.js +0 -1
  227. package/src/assets/web-panel/assets/Projects-CRaSI25Z.js +0 -1
  228. package/src/assets/web-panel/assets/devWarning-CmgDNkoO.js +0 -1
  229. package/src/assets/web-panel/assets/index-BpIZ2S01.js +0 -1
  230. package/src/assets/web-panel/assets/index-C-VmKuyv.js +0 -1
@@ -52,6 +52,12 @@ import {
52
52
  } from "../lib/policy-decision-event.js";
53
53
  import { runWithHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
54
54
  import { bootstrap } from "./bootstrap.js";
55
+ import {
56
+ appendSessionInputWithReceipt,
57
+ readSessionInputReceipt,
58
+ inputSubmissionDigest,
59
+ validateClientMessageId,
60
+ } from "../lib/session-input-receipt.js";
55
61
  import {
56
62
  buildSystemPrompt,
57
63
  chatWithTools as coreChatWithTools,
@@ -78,6 +84,7 @@ import {
78
84
  buildUserContent,
79
85
  resolveVisionLlm,
80
86
  } from "../lib/image-input.js";
87
+ import { MAX_INPUT_IMAGES } from "../lib/image-file-boundary.js";
81
88
  import {
82
89
  buildIdePromptContext,
83
90
  expandIdeMentions,
@@ -115,6 +122,7 @@ import { IterationBudget } from "../lib/iteration-budget.js";
115
122
  import { CostBudget } from "../lib/cost-budget.js";
116
123
  import {
117
124
  resolvePermissionMode,
125
+ normalizePermissionMode,
118
126
  resolveEnabledTools,
119
127
  parseToolList,
120
128
  installPipeSafety,
@@ -171,6 +179,10 @@ import { createMcpHostRecoveryRuntime } from "../lib/mcp-host-recovery-runtime.j
171
179
  import { operationIdempotencyKey } from "../lib/idempotency.js";
172
180
  import { TurnBindingLog, createTurnBindingFeed } from "../lib/turn-binding.js";
173
181
  import { TURN_BINDING_EVENT } from "../lib/turn-binding-store.js";
182
+ import {
183
+ transcriptMessageEventId,
184
+ transcriptResultReferences,
185
+ } from "../lib/session-transcript-reference.js";
174
186
  import { getPlanModeManager } from "../lib/plan-mode.js";
175
187
  import {
176
188
  SESSION_SLASH_COMMANDS,
@@ -710,6 +722,14 @@ export function parseInputEvent(line) {
710
722
  };
711
723
  }
712
724
  const msg = obj && typeof obj === "object" ? obj.message || obj : {};
725
+ let clientMessageId;
726
+ if (obj?.client_message_id !== undefined) {
727
+ try {
728
+ clientMessageId = validateClientMessageId(obj.client_message_id);
729
+ } catch (error) {
730
+ return { error: error.message };
731
+ }
732
+ }
713
733
  let content = msg.content ?? obj.text ?? obj.prompt;
714
734
  if (Array.isArray(content)) {
715
735
  content = content
@@ -738,7 +758,9 @@ export function parseInputEvent(line) {
738
758
  content = detected.text;
739
759
  }
740
760
  }
741
- images = [...new Set(images)].slice(0, 8);
761
+ images = [...new Set(images)];
762
+ if (images.length > MAX_INPUT_IMAGES)
763
+ return { error: `Attach at most ${MAX_INPUT_IMAGES} images per message` };
742
764
  // §3.5.10 接线6: optional per-turn LLM override (PDH privacy-tier switch) —
743
765
  // {"type":"user","text":…,"llm":{"provider","model","baseUrl"?,"apiKey"?}}.
744
766
  // Switches THIS turn's model (e.g. cloud → your own PC Ollama) without
@@ -750,6 +772,7 @@ export function parseInputEvent(line) {
750
772
  // An image-only turn is valid — give the model something to act on.
751
773
  if (images.length) {
752
774
  const r = { text: "Please look at the attached image(s).", images };
775
+ if (clientMessageId) r.clientMessageId = clientMessageId;
753
776
  if (obj.worklog_session_id !== undefined)
754
777
  r.worklogSessionId = obj.worklog_session_id;
755
778
  if (llm) r.llm = llm;
@@ -758,6 +781,7 @@ export function parseInputEvent(line) {
758
781
  return null;
759
782
  }
760
783
  const result = images.length ? { text: content, images } : { text: content };
784
+ if (clientMessageId) result.clientMessageId = clientMessageId;
761
785
  if (obj.worklog_session_id !== undefined)
762
786
  result.worklogSessionId = obj.worklog_session_id;
763
787
  if (llm) result.llm = llm;
@@ -2085,6 +2109,12 @@ async function runAgentHeadlessStreamInWorkspace(
2085
2109
  sessionExists: deps.sessionExists || jsonlSessionExists,
2086
2110
  startSession: deps.startSession || jsonlStartSession,
2087
2111
  appendUserMessage: deps.appendUserMessage || jsonlAppendUserMessage,
2112
+ appendInputWithReceipt:
2113
+ deps.appendInputWithReceipt ||
2114
+ (hasInjectedSessionStore ? null : appendSessionInputWithReceipt),
2115
+ readInputReceipt:
2116
+ deps.readInputReceipt ||
2117
+ (hasInjectedSessionStore ? null : readSessionInputReceipt),
2088
2118
  appendAssistantMessage:
2089
2119
  deps.appendAssistantMessage || jsonlAppendAssistantMessage,
2090
2120
  appendTokenUsage: deps.appendTokenUsage || jsonlAppendTokenUsage,
@@ -3106,10 +3136,37 @@ async function runAgentHeadlessStreamInWorkspace(
3106
3136
  protocol_version: STREAM_PROTOCOL_VERSION,
3107
3137
  session_id: sessionId,
3108
3138
  session_persistence: persist,
3139
+ input_receipts: {
3140
+ version:
3141
+ persist && store.appendInputWithReceipt && store.readInputReceipt
3142
+ ? 1
3143
+ : 0,
3144
+ },
3109
3145
  task_worklog: taskWorklog ? { version: 1, path: taskWorklog.file } : null,
3110
3146
  model,
3111
3147
  provider,
3112
3148
  permission_mode: options.permissionMode || "default",
3149
+ // Correlates display state with this exact IDE child. This echo grants no
3150
+ // authority: effective mode is derived only from validated CLI options.
3151
+ ...(/^[a-zA-Z0-9-]{1,80}$/.test(process.env.CC_IDE_MODE_REQUEST_ID || "")
3152
+ ? {
3153
+ permission_mode_state: {
3154
+ correlation_id: process.env.CC_IDE_MODE_REQUEST_ID,
3155
+ requested: ["default", "acceptEdits", "bypassPermissions"].includes(
3156
+ process.env.CC_IDE_REQUESTED_MODE,
3157
+ )
3158
+ ? process.env.CC_IDE_REQUESTED_MODE
3159
+ : "default",
3160
+ effective: normalizePermissionMode(options.permissionMode),
3161
+ policy_revision: computePolicyDigest({
3162
+ permissionMode: options.permissionMode,
3163
+ allowedTools: options.allowedTools,
3164
+ disallowedTools: disabledTools,
3165
+ permissionRules,
3166
+ }),
3167
+ },
3168
+ }
3169
+ : {}),
3113
3170
  tools: enabledToolNames,
3114
3171
  tools_hash: computeToolsHash(enabledToolNames),
3115
3172
  policy_digest: computePolicyDigest({
@@ -4087,6 +4144,89 @@ async function runAgentHeadlessStreamInWorkspace(
4087
4144
  continue;
4088
4145
  }
4089
4146
 
4147
+ // Bind the receipt to the submitted input, before commands, hooks, file
4148
+ // expansion or image reads can change it. A repeated ID never replays work.
4149
+ const inputSubmission = parsed.clientMessageId
4150
+ ? {
4151
+ text: parsed.text,
4152
+ images: parsed.images || [],
4153
+ llm: parsed.llm || null,
4154
+ worklogSessionId: parsed.worklogSessionId || null,
4155
+ }
4156
+ : null;
4157
+ const acknowledgeInput = (receipt) => {
4158
+ emit({
4159
+ type: "system",
4160
+ subtype: "input_accepted",
4161
+ session_id: sessionId,
4162
+ client_message_id: parsed.clientMessageId,
4163
+ receipt,
4164
+ });
4165
+ if (receipt.duplicate)
4166
+ emit({
4167
+ type: "result",
4168
+ subtype: "input_already_accepted",
4169
+ is_error: false,
4170
+ session_id: sessionId,
4171
+ client_message_id: parsed.clientMessageId,
4172
+ execution_status: "not-reexecuted",
4173
+ result:
4174
+ "Input was already accepted. No work was re-executed; inspect the session for its outcome.",
4175
+ });
4176
+ };
4177
+ if (parsed.clientMessageId) {
4178
+ if (
4179
+ !persist ||
4180
+ !store.appendInputWithReceipt ||
4181
+ !store.readInputReceipt
4182
+ ) {
4183
+ emit({
4184
+ type: "result",
4185
+ subtype: "error_input_receipt",
4186
+ is_error: true,
4187
+ session_id: sessionId,
4188
+ client_message_id: parsed.clientMessageId,
4189
+ acceptance: "rejected",
4190
+ error: "Durable input receipts require canonical session persistence",
4191
+ });
4192
+ sawError = true;
4193
+ continue;
4194
+ }
4195
+ try {
4196
+ const prior = requireSynchronousRecoveryResult(
4197
+ store.readInputReceipt(sessionId, parsed.clientMessageId),
4198
+ "readInputReceipt",
4199
+ );
4200
+ if (prior?.accepted) {
4201
+ const receipt = prior.receipt;
4202
+ if (
4203
+ !/^[a-f0-9]{64}$/u.test(receipt?.eventHash || "") ||
4204
+ receipt.sessionId !== sessionId ||
4205
+ receipt.clientMessageId !== parsed.clientMessageId ||
4206
+ receipt.inputDigest !== inputSubmissionDigest(inputSubmission)
4207
+ )
4208
+ throw new Error("Input receipt conflicts with submission");
4209
+ acknowledgeInput({ ...receipt, duplicate: true });
4210
+ continue;
4211
+ }
4212
+ if (prior?.accepted !== false)
4213
+ throw new Error("Invalid input receipt lookup");
4214
+ } catch {
4215
+ emit({
4216
+ type: "result",
4217
+ subtype: "error_input_receipt",
4218
+ is_error: true,
4219
+ session_id: sessionId,
4220
+ client_message_id: parsed.clientMessageId,
4221
+ acceptance: "unknown",
4222
+ error:
4223
+ "Cannot verify input acceptance; inspect the canonical session before sending again",
4224
+ });
4225
+ sawError = true;
4226
+ continue;
4227
+ }
4228
+ }
4229
+
4090
4230
  // Manual `/compact` uses the same provider-backed structured handoff as the
4091
4231
  // other long-lived hosts. Provider/schema failures degrade to the shared
4092
4232
  // extractive handoff instead of silently dropping all but recent turns.
@@ -4879,11 +5019,38 @@ async function runAgentHeadlessStreamInWorkspace(
4879
5019
  else turnContent = [{ type: "text", text: historyPart }, ...turnContent];
4880
5020
  }
4881
5021
  updateWorklog((log) => log.user(parsed.text));
4882
- messages.push({ role: "user", content: turnContent });
4883
5022
  let persistenceFailure = null;
5023
+ let inputReceipt = null;
5024
+ let userEventId = null;
4884
5025
  if (persist) {
4885
5026
  try {
4886
- store.appendUserMessage(sessionId, turnContent);
5027
+ if (parsed.clientMessageId) {
5028
+ if (!store.appendInputWithReceipt)
5029
+ throw new Error("Durable input receipts are unavailable");
5030
+ inputReceipt = requireSynchronousRecoveryResult(
5031
+ store.appendInputWithReceipt(
5032
+ sessionId,
5033
+ turnContent,
5034
+ parsed.clientMessageId,
5035
+ inputSubmission,
5036
+ ),
5037
+ "appendInputWithReceipt",
5038
+ );
5039
+ if (
5040
+ !/^[a-f0-9]{64}$/u.test(inputReceipt?.eventHash || "") ||
5041
+ inputReceipt.sessionId !== sessionId ||
5042
+ inputReceipt.clientMessageId !== parsed.clientMessageId ||
5043
+ inputReceipt.inputDigest !==
5044
+ inputSubmissionDigest(inputSubmission) ||
5045
+ typeof inputReceipt.duplicate !== "boolean"
5046
+ )
5047
+ throw new Error("Invalid durable input receipt");
5048
+ userEventId = inputReceipt.eventHash;
5049
+ } else {
5050
+ userEventId = transcriptMessageEventId(
5051
+ store.appendUserMessage(sessionId, turnContent),
5052
+ );
5053
+ }
4887
5054
  } catch (error) {
4888
5055
  const persistenceError = createSessionPersistenceFailure(error, {
4889
5056
  sessionId,
@@ -4893,6 +5060,20 @@ async function runAgentHeadlessStreamInWorkspace(
4893
5060
  persistenceError,
4894
5061
  { phase: "before-model" },
4895
5062
  );
5063
+ if (parsed.clientMessageId && !persistenceFailure) {
5064
+ emit({
5065
+ type: "result",
5066
+ subtype: "error_input_receipt",
5067
+ is_error: true,
5068
+ session_id: sessionId,
5069
+ client_message_id: parsed.clientMessageId,
5070
+ acceptance: "unknown",
5071
+ error:
5072
+ "Cannot verify durable input append; inspect the canonical session before sending again",
5073
+ });
5074
+ sawError = true;
5075
+ break;
5076
+ }
4896
5077
  if (persistenceFailure) {
4897
5078
  try {
4898
5079
  deps.onPersistenceFailure?.(persistenceFailure);
@@ -4902,6 +5083,11 @@ async function runAgentHeadlessStreamInWorkspace(
4902
5083
  }
4903
5084
  }
4904
5085
  }
5086
+ if (inputReceipt && !persistenceFailure) {
5087
+ acknowledgeInput(inputReceipt);
5088
+ if (inputReceipt.duplicate) continue; // Never re-run an accepted input.
5089
+ }
5090
+ messages.push({ role: "user", content: turnContent });
4905
5091
  turns += 1;
4906
5092
  approvalGrantLedger.beginTurn(turns);
4907
5093
  if (persistenceFailure) {
@@ -5215,9 +5401,12 @@ async function runAgentHeadlessStreamInWorkspace(
5215
5401
 
5216
5402
  // Grow the conversation so the next turn has context.
5217
5403
  messages.push({ role: "assistant", content: outcome.finalText });
5404
+ let assistantEventId = null;
5218
5405
  if (persist) {
5219
5406
  try {
5220
- store.appendAssistantMessage(sessionId, outcome.finalText);
5407
+ assistantEventId = transcriptMessageEventId(
5408
+ store.appendAssistantMessage(sessionId, outcome.finalText),
5409
+ );
5221
5410
  } catch (error) {
5222
5411
  const persistenceError = createSessionPersistenceFailure(error, {
5223
5412
  sessionId,
@@ -5248,6 +5437,14 @@ async function runAgentHeadlessStreamInWorkspace(
5248
5437
  outcome.endReason === "no-response" ||
5249
5438
  Boolean(persistenceFailure);
5250
5439
  if (isError) sawError = true;
5440
+ const transcriptRefs = !persistenceFailure
5441
+ ? transcriptResultReferences({
5442
+ sessionId,
5443
+ userEventId,
5444
+ assistantEventId,
5445
+ clientMessageId: parsed.clientMessageId || null,
5446
+ })
5447
+ : null;
5251
5448
 
5252
5449
  if (costStopped) {
5253
5450
  emit({
@@ -5275,6 +5472,7 @@ async function runAgentHeadlessStreamInWorkspace(
5275
5472
  session_id: sessionId,
5276
5473
  turn: turns,
5277
5474
  usage: outcome.usage,
5475
+ ...(transcriptRefs ? { transcript_refs: transcriptRefs } : {}),
5278
5476
  ...(persistenceFailure ? { persistence: persistenceFailure } : {}),
5279
5477
  });
5280
5478
 
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as S,U as n,R as a,S as y,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-hSzyoXri.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},R={class:"bubble"},T={class:"meta"},D={class:"actor"},L={class:"time"},M={class:"body"};function V(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",R,[n("div",T,[n("span",D,a(r.actorLabel),1),n("span",L,a(r.formattedTime),1)]),n("div",M,a(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(N,[["render",V],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-6ZYRLD/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
@@ -1 +0,0 @@
1
- import{I as i,J as I,U,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-hSzyoXri.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as Fe,aP as be,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 X=await e.sendRaw({...f,type:o},ae);if(!X?.ok){const $=X?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return X.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),L=u(!1),E=u(!1),F=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 Y(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 Z(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 G(){F.value={name:"",description:"",type:"document",rootPath:""},L.value=!0}async function T(){if(!F.value.name.trim()){d.warning("请输入项目名称");return}E.value=!0;try{const o=await w("project.init",{name:F.value.name.trim(),description:F.value.description||null,projectType:F.value.type,rootPath:F.value.rootPath||null},`project init "${F.value.name.trim()}" --type ${F.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),L.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{E.value=!1}}const b=u(!1),D=u(!1),j=u({path:"",content:""}),A=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),H=u(!1);function ue(){j.value={path:"",content:""},b.value=!0}function ce(){R.value={path:""},A.value=!0}async function N(){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}'`),b.value=!1,await N(),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}'`),A.value=!1,await N(),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 N(),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,q.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){H.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:q.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await N()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{H.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:L,creating:E,newProject:F,columns:z,countByStatus:V,filteredProjects:J,statusColor:g,syncColor:K,formatTime:Q,loadAll:C,onRowClick:Y,openDetail:M,onDelete:Z,onShowCreate:G,onCreate:T,createFileOpen:b,creatingFile:D,newFile:j,createFolderOpen:A,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:H,openCreateFile:ue,openCreateFolder:ce,refreshFiles:N,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 be},get FileAddOutlined(){return Fe},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"}},Ae={class:"page-title"},Ie={class:"page-sub"},Ue={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"],Le={key:0,style:{color:"#888","font-size":"12px"}};function Ee(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"),L=i("a-radio-group"),E=i("a-input-search"),F=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"),Y=i("a-list-item"),M=i("a-list"),Z=i("a-spin"),G=i("a-drawer"),T=i("a-input"),b=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),A=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),I("div",null,[U("div",ze,[U("div",null,[U("h2",Ae,s(e.t("projects.title")),1),U("p",Ie,[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 "),U("div",Ue,[t(L,{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(E,{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(F,{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(),I("code",he,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),I(ne,{key:1},[U("strong",null,s(c.name),1),c.description?(p(),I("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(),I(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:q=>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:q=>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(G,{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(()=>[U("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(),I("code",Re,s(e.detail.root_path),1)):(p(),I("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(Z,{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(Y,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),I("span",Le,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(()=>[U("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(A,{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(b,{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(b,{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(A,{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(b,{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(A,{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(A,{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(b,{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(b,{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(b,{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(b,{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",Ee],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-6ZYRLD/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-hSzyoXri.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-DJz8iFOR.js";import{a0 as t}from"./index-hSzyoXri.js";import"./vendor-Bn1JzzAn.js";import"./index-BO6XvO-C.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-Dh77m3NZ.js";import{a0 as t}from"./index-hSzyoXri.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-D-PmXO9M.js";import"./useFlexGapSupport-B2wO2r36.js";import"./styleChecker-DOr9rk68.js";import"./index-BO6XvO-C.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};