chainlesschain 0.165.4 → 0.165.6

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 (214) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-C__nnraW.js → AIOps-vfoDb6HZ.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-CsKWHEZ-.js → ActionButton-Cm5f7p93.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-BhIjfjWO.js → Analytics-yRuvgWxa.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-BjuXFzWZ.js → AppLayout-BROsC4h1.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-k6whDkZJ.js → Artifacts-CimHApb1.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-C4FBMYRh.js → Audit-DI8kr8zI.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-C_vRrSXk.js → BackgroundAgents-DSLzKy-n.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-CngFZeVp.js → Backup-DkH_n2r1.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-B_H9EBRm.js → BaseInput-CKSrUoRA.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DLEC5kt7.js → Chat-ClwfMXUS.js} +3 -3
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-CjMaqfL7.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-m3ClR4xh.js → Checkbox-BYTehcQG.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-CmLSFrgp.js → Codegen-B8AMcp6J.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-DFGQteHN.js → Col-BNSogPo3.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-EUUVORHE.js → Community-JxPvGb8O.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-2PSg0Yr7.js → Compact-DF7bFAgE.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-CcKur7gB.js → Compliance-Bvhqnwrq.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-DK_Fezfa.js → Cowork-BDS0CJvM.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-Dbw89xl7.js → Cron-DqvRfxoQ.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CH66h_Ec.js → Crosschain-CDcIvnqS.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-D1igRb17.js → DID-D7jaUxU3.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-DVAsrobk.js → Dashboard-B5A18wEV.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-Dl7W8AQs.js → Dropdown-_6IVkGag.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-D5tpaEQC.js → EmailListRenderer-C9PeiKCG.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-O_VQf8gq.js → FamilyGuardDashboard-DXjuEHrX.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-BTVcgS9n.js → Federation-B4IAR9zv.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-BRnkJAIz.js → FormItemContext-CxQeSNx1.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-8OWSCkDj.js → GenericCardRenderer-B8GS-Y3N.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-WXLYTQj2.js → Git-BS8SouUX.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-BezaUhtc.js → Governance-Dq9aYb5Q.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-CuRay3Gu.js → Inference-BrCEe9AJ.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-DfWLDW1m.js → KnowledgeGraph-DybOpiY2.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-C55y2pPY.js → Logs-DBpzbRfx.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-CFyt8iUd.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-Dk08Uycg.js → Marketplace-Cc7CCSCu.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-C11fSB5V.js → McpTools-DFaIhOfu.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-mr0eZc97.js → Memory-KCqlp9ol.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-C0iCSRbb.js → MobileBridge-Bys84ySN.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-CY-xMG8Z.js → MobileProjects-B-6qU-je.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-Bplqc_Wc.js → Mtc-BgY-fvCq.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-BlzwsoSM.js → MtcAudit-B8pCmqQJ.js} +4 -4
  44. package/src/assets/web-panel/assets/{Multisig-BBLmTty6.js → Multisig-BbOmYutA.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-DtT1uf1W.js → NLProgramming-BocLQz_M.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-DcqQAxTK.js → Notes-CSwbxEop.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-cb0kWoZe.js → NotificationSettings-CqFNSYG3.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-kw9HZQNN.js → OrderTableRenderer-C6gMfAk7.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-DlTlbkUN.js → Organization-QrDXVdMJ.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-pp1qs-oY.js → Overflow-Cxntotjt.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-BESLnyYz.js → P2P-CIdBOwNq.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-B-J1mGuf.js → PdhVaultBrowser-CT5aP8rD.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-B36PeT1_.js → Permissions-DH7OM8XU.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-CTK2ad-3.js → PersonalDataHub-CnJqbWce.js} +3 -3
  55. package/src/assets/web-panel/assets/{Pipeline-zJNGXsac.js → Pipeline-5C3HG1kH.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-b9fz0Qf0.js → Privacy-B4yIp7xK.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-DjZbZgiB.js → ProjectInit-BMvt-2M0.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-C-hHJXlD.js → ProjectSettings-CvSTEMRG.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-BKBJxEek.js +1 -0
  60. package/src/assets/web-panel/assets/Providers-BdwUqFWN.js +1 -0
  61. package/src/assets/web-panel/assets/{QrScannerModal-A0yoQ3-3.js → QrScannerModal-DtnCKlTm.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-DrFgFJNC.js → QuickAsk-sTbgwyNr.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-KC8hF1g4.js → Recommend-Bzr14gSb.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-DGTPIk6u.js → RemoteSession-C_TF5IaJ.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-QmbwM7Yk.js → Reputation-GCAM4H2K.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-BxjJylia.js → Row-Dir0r6OQ.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-B7Wda1J6.js → RssFeed-CpGnlecX.js} +2 -2
  68. package/src/assets/web-panel/assets/{Search-_plQ_YSA.js → Search-DMMamC6u.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-CD2YJZfx.js → Security-yqay5yG-.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-qQE7NmwE.js → Services-C5i2wh9G.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-DgQqkFf7.js → Skeleton-vUqk35yj.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-C4C0oFFt.js → Skills-DzcSkhot.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Px2N2B5c.js → Sla-CB6qbYNr.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-DN6C3lQd.js → SpeechSettings-BHUI7cox.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-jm5aH_m7.js → SyncSettings-D-RrsxTJ.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-DlkJcv67.js → Tasks-DFxdOJiq.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-DyrTHUBs.js → Templates-SKAob_Aq.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-mC434PtL.js → Tenant-BPfsfHQ-.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-o0_s3NgK.js → Terminal-8iw7FpUf.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-DAGlAXOw.js → TimelineRenderer-C4Gjj5Su.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BnulS_bs.js → Tokens-COYhN18e.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-suQbVXYM.js → Trigger-B-JzXcf6.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-DbIJAPo5.js → Trust-BJ5bg0nI.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-CQNpbIHi.js → UkeySign-BG_ByRMf.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-D8aWCERk.js → VideoEditing-B3kOnSiU.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-CuLpYfZc.js → Wallet-CcoGFnK7.js} +2 -2
  87. package/src/assets/web-panel/assets/{WebAuthn-CsfG8ZMc.js → WebAuthn-DdT8vRC_.js} +4 -4
  88. package/src/assets/web-panel/assets/{WorkflowEditor-BYsEAZbd.js → WorkflowEditor-CZu3M9N8.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-FT4Um3-I.js → chat-DxJt3Qba.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-CKbS_Wlt.js → colors-DdYfwJaB.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-CFJtzuJM.js → compact-item-BG3SUzwj.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-B9kSRW6K.js → createContext-By51z2-1.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-DorRZcI9.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DR-x0Xpi.js → hasIn-B0apZ3KJ.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-DjEP7WkH.js → index-3jWkIu5j.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-7jHr_A_k.js → index-B3rWuPMW.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DcfxhKXR.js → index-B5rLiEo0.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-tqSEHPRT.js → index-BBPf3TpM.js} +1 -1
  99. package/src/assets/web-panel/assets/index-BETiL0a3.js +1 -0
  100. package/src/assets/web-panel/assets/{index-Cr2FLUsD.js → index-BIrJfqO4.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-Bt4fS2eL.js → index-BLIbGOLX.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BwR7yc2h.js → index-BP94CrBV.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BVPU43b1.js → index-BWF8_mkx.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DShSkww-.js → index-BYINoRLK.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Bzz0C1BZ.js → index-BZ_0qm4g.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-KqDaCApw.js → index-BewKYrX9.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BW-t9n-q.js → index-BfWYsB9t.js} +1 -1
  108. package/src/assets/web-panel/assets/index-BhAVHuW8.js +1 -0
  109. package/src/assets/web-panel/assets/{index-B7osrXqy.js → index-Bissefox.js} +3 -3
  110. package/src/assets/web-panel/assets/{index-DW4BWjTk.js → index-BkvcEo4p.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DdkIhfi-.js → index-Bos5_aMV.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DTxNy0ZU.js → index-C1C9i79A.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-QBSeNVO3.js → index-CAhHirVH.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-D4LfPvWA.js → index-CNIxXMmN.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-C_enk9I_.js → index-CW93tZDv.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-WE08gMJP.js → index-CWEuZWCK.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-r2VI1Ikk.js → index-Cp6e-hGw.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dap9c3eD.js → index-CpjZhgNd.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DWdqx7zI.js → index-CzmQElZy.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BGbPnC5x.js → index-DCn8IcxV.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DiNUEpSQ.js → index-DE76D-kA.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DtkFqPVA.js → index-DaIz0NAW.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CGaXUsIs.js → index-Da_WBdLX.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-B3ZX81mK.js → index-Dz49VOyQ.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BK3TiKVq.js → index-Q2SCX-MI.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CJmIQ9XR.js → index-RD6O-0C6.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CvrCCqJt.js → index-SQqOlR3d.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BI5hP_qy.js → index-ZFbps9po.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DeSgw-WV.js → index-ZxtP8jG7.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DMGmg497.js → index-bP_VlDb4.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BfFCQHL3.js → index-kf57LJ93.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-OSzjTzGM.js → index-oxRrmFO9.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-C2JvmYRc.js → index-p1_8SbI1.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-Dd7n7VgI.js → initDefaultProps-BWJktcg8.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BwxouRw1.js → motion-BEXBzUFV.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-DObN0PG9.js → move-BUKwn2sx.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-B3nOUQc7.js → mtc-parser-FTI7btqQ.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-o9WU2Nbl.js → omit-CsLtSPH3.js} +1 -1
  139. package/src/assets/web-panel/assets/parsers-YNLm7sQ0.js +4 -0
  140. package/src/assets/web-panel/assets/{pickAttrs-CL_vvfQ_.js → pickAttrs-DWZxsT_S.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-CYrM2tyK.js → placementArrow-Bcfs43CX.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-k_06cQ96.js → responsiveObserve-a9bcC1p-.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-CPKG0pxS.js → slide-BDTzgOXN.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-BDDEeLTw.js → statusUtils-Iq1j_HUg.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-Cmb7RTh7.js → styleChecker-DAZEYxeh.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-e2IedC4N.js → useFlexGapSupport-DVkjyDrh.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CE_gxVnm.js → useFs-wXTpNTHt.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-BkMIIKMz.js → usePersonalDataHub-CtQM_aZr.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-DW886XV1.js → vnode-hjEoG85v.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-Dwo_adaf.js → zoom-BHVpyKg_.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +3 -3
  153. package/src/commands/agent.js +14 -2
  154. package/src/commands/artifacts.js +235 -0
  155. package/src/commands/background-session.js +100 -10
  156. package/src/commands/cowork.js +86 -57
  157. package/src/commands/mcp.js +5 -0
  158. package/src/commands/plugin.js +145 -29
  159. package/src/commands/remote-control.js +295 -110
  160. package/src/commands/session-location.js +20 -1
  161. package/src/commands/session-message.js +171 -0
  162. package/src/commands/session.js +75 -69
  163. package/src/data/changelog.json +29 -3
  164. package/src/gateways/ws/message-dispatcher.js +57 -0
  165. package/src/harness/mcp-client.js +141 -10
  166. package/src/lib/artifact-access-ledger.js +1 -0
  167. package/src/lib/artifact-deletion-ledger.js +1 -0
  168. package/src/lib/artifact-recovery.js +970 -0
  169. package/src/lib/artifact-workbench-projection.js +171 -0
  170. package/src/lib/background-session-transport.js +153 -27
  171. package/src/lib/dynamic-workflow-runtime.js +408 -1
  172. package/src/lib/execution-location-target.js +4 -2
  173. package/src/lib/mcp-client.js +2 -0
  174. package/src/lib/mcp-headers-helper.js +47 -5
  175. package/src/lib/mcp-oauth.js +55 -6
  176. package/src/lib/mcp-stdio-executable-identity.js +16 -0
  177. package/src/lib/mcp-stdio-native-code-policy.js +74 -0
  178. package/src/lib/mcp-stdio-package-materialization.js +12 -3
  179. package/src/lib/mcp-tls.js +230 -0
  180. package/src/lib/output-styles.js +12 -0
  181. package/src/lib/plugin-runtime/install.js +614 -71
  182. package/src/lib/plugin-runtime/marketplace-archive-source.js +331 -0
  183. package/src/lib/plugin-runtime/marketplace-catalog.js +52 -6
  184. package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1 -0
  185. package/src/lib/plugin-runtime/marketplace-source-adapter.js +163 -0
  186. package/src/lib/plugin-runtime/marketplace-source-cache.js +11 -1
  187. package/src/lib/plugin-runtime/remote-source.js +435 -55
  188. package/src/lib/plugin-security.js +393 -41
  189. package/src/lib/plugin-source-identity.js +850 -0
  190. package/src/lib/process-execution-broker/index.js +112 -0
  191. package/src/lib/process-execution-broker/platform-sandbox.js +57 -3
  192. package/src/lib/process-execution-broker/workspace-transaction.js +26 -0
  193. package/src/lib/remote-approval-bridge.js +136 -46
  194. package/src/lib/remote-control.js +217 -31
  195. package/src/lib/session-message-fabric.js +1105 -0
  196. package/src/lib/session-projection.js +171 -12
  197. package/src/lib/session-runtime-retention.js +155 -0
  198. package/src/lib/settings-loader.cjs +29 -0
  199. package/src/repl/agent-repl.js +51 -14
  200. package/src/repl/permission-prompt.js +31 -8
  201. package/src/repl/repl-keybindings.js +55 -0
  202. package/src/runtime/agent-core.js +63 -2
  203. package/src/runtime/headless-runner.js +47 -66
  204. package/src/runtime/headless-stream.js +18 -24
  205. package/src/runtime/mcp-config.js +2 -0
  206. package/src/runtime/policies/agent-policy.js +2 -0
  207. package/src/assets/web-panel/assets/ChatBubbleRenderer-xijcWkJe.js +0 -1
  208. package/src/assets/web-panel/assets/MarkdownRenderer-hDpWdiBc.js +0 -1
  209. package/src/assets/web-panel/assets/Projects-BC9KSDM6.js +0 -1
  210. package/src/assets/web-panel/assets/Providers-Dz-CAYYU.js +0 -1
  211. package/src/assets/web-panel/assets/devWarning-DJZ0gAMu.js +0 -1
  212. package/src/assets/web-panel/assets/index-Bizb4hkw.js +0 -1
  213. package/src/assets/web-panel/assets/index-OHSl-xCh.js +0 -1
  214. package/src/assets/web-panel/assets/parsers-UEvh_ShA.js +0 -4
@@ -1,5 +1,60 @@
1
1
  /** Declarative, validated keybindings for interactive prompt actions. */
2
2
 
3
+ export const DEFAULT_REPL_KEYBINDING_FLAVOR = "classic";
4
+ export const REPL_KEYBINDING_FLAVORS = Object.freeze([
5
+ DEFAULT_REPL_KEYBINDING_FLAVOR,
6
+ "readline",
7
+ ]);
8
+
9
+ /**
10
+ * Resolve the prompt editing flavor. Unknown values stay on the compatible
11
+ * classic behavior and include a diagnostic for the caller to surface.
12
+ */
13
+ export function resolveReplKeybindingFlavor(value) {
14
+ if (value == null || String(value).trim() === "") {
15
+ return { flavor: DEFAULT_REPL_KEYBINDING_FLAVOR, error: null };
16
+ }
17
+ const flavor = String(value).trim().toLowerCase();
18
+ if (REPL_KEYBINDING_FLAVORS.includes(flavor)) {
19
+ return { flavor, error: null };
20
+ }
21
+ return {
22
+ flavor: DEFAULT_REPL_KEYBINDING_FLAVOR,
23
+ error: `keybindingFlavor must be classic or readline (got "${String(value)}")`,
24
+ };
25
+ }
26
+
27
+ /** True for the terminal Ctrl+W chord used by readline's unix-word-rubout. */
28
+ export function isReadlineWordRuboutKey(input, key = {}) {
29
+ if (key.meta || key.alt || key.shift) return false;
30
+ const name = String(key.name || "").toLowerCase();
31
+ return (
32
+ key.ctrl === true &&
33
+ (name === "w" || input === "\u0017" || key.sequence === "\u0017")
34
+ );
35
+ }
36
+
37
+ /**
38
+ * Delete the token immediately left of the cursor using whitespace-only word
39
+ * boundaries. This intentionally treats a full path as one token, unlike the
40
+ * classic path-segment behavior. Text right of the cursor is preserved.
41
+ */
42
+ export function readlineWordRubout(line, cursor) {
43
+ const text = String(line || "");
44
+ const point = Math.max(
45
+ 0,
46
+ Math.min(Number.isInteger(cursor) ? cursor : text.length, text.length),
47
+ );
48
+ let start = point;
49
+ while (start > 0 && /\s/u.test(text[start - 1])) start -= 1;
50
+ while (start > 0 && !/\s/u.test(text[start - 1])) start -= 1;
51
+ return {
52
+ line: text.slice(0, start) + text.slice(point),
53
+ cursor: start,
54
+ changed: start !== point,
55
+ };
56
+ }
57
+
3
58
  export const REPL_KEYBINDING_ACTIONS = Object.freeze([
4
59
  "prompt.edit",
5
60
  "prompt.stash",
@@ -136,6 +136,7 @@ import {
136
136
  } from "../harness/structured-handoff.js";
137
137
  import { isMcpRpcError } from "../harness/mcp-client.js";
138
138
  import { projectCanonicalResumeMessages } from "../lib/session-message-provenance.js";
139
+ import { releaseOldLiveSessionResults } from "../lib/session-runtime-retention.js";
139
140
  import {
140
141
  pathMatchesOpenedFileIdentitySync,
141
142
  sameOpenedFileIdentity,
@@ -5711,6 +5712,18 @@ async function executeToolInner(
5711
5712
  },
5712
5713
  { cwd },
5713
5714
  );
5715
+ if (
5716
+ pluginBinInvocation.runtime === "native" &&
5717
+ backgroundPlatform !== "linux"
5718
+ ) {
5719
+ const unsupportedNativeError = new Error(
5720
+ `strict native Plugin bins require the Linux descriptor-bound ELF loader closure; ${backgroundPlatform} native loading is unsupported`,
5721
+ );
5722
+ unsupportedNativeError.code =
5723
+ "ERR_PLUGIN_NATIVE_SANDBOX_PLATFORM_UNSUPPORTED";
5724
+ unsupportedNativeError.pluginBinFailClosed = true;
5725
+ throw unsupportedNativeError;
5726
+ }
5714
5727
  if (
5715
5728
  backgroundPlatform === "linux" ||
5716
5729
  (backgroundPlatform === "win32" &&
@@ -12559,6 +12572,7 @@ async function _settleAutomaticCompaction({
12559
12572
  compacted,
12560
12573
  stats,
12561
12574
  options,
12575
+ trigger = "auto",
12562
12576
  }) {
12563
12577
  if (!_sameMessageSnapshot(messages, liveExpectedMessages)) {
12564
12578
  throw _compactionSettlementError(
@@ -12578,7 +12592,7 @@ async function _settleAutomaticCompaction({
12578
12592
  settlement = options.onCompaction(stats, compacted, {
12579
12593
  expectedMessages: authorityExpectedMessages,
12580
12594
  liveExpectedMessages,
12581
- trigger: "auto",
12595
+ trigger,
12582
12596
  });
12583
12597
  } else if (options.sessionId && options.persistCompaction !== false) {
12584
12598
  const store = await import("../harness/jsonl-session-store.js");
@@ -12593,7 +12607,7 @@ async function _settleAutomaticCompaction({
12593
12607
  options.sessionId,
12594
12608
  {
12595
12609
  ...stats,
12596
- trigger: "auto",
12610
+ trigger,
12597
12611
  messages: projectCanonicalResumeMessages(compacted, { strict: true }),
12598
12612
  },
12599
12613
  authorityExpectedMessages,
@@ -13168,6 +13182,53 @@ export async function* agentLoop(messages, options) {
13168
13182
  };
13169
13183
  }
13170
13184
 
13185
+ // Release result bodies that have left the recent display window before
13186
+ // every provider admission, independent of the semantic-compaction token
13187
+ // threshold. Settlement persists a bounded resume checkpoint before the
13188
+ // live array changes; the earlier hash-chained result events remain the
13189
+ // durable evidence for audit/recovery.
13190
+ if (options.runtimeResultRetention !== false && messages.length > 32) {
13191
+ const retentionConfig =
13192
+ options.runtimeResultRetention &&
13193
+ typeof options.runtimeResultRetention === "object"
13194
+ ? options.runtimeResultRetention
13195
+ : options.runtimeResultRetentionOptions;
13196
+ const retained = releaseOldLiveSessionResults(messages, retentionConfig);
13197
+ if (
13198
+ retained.stats.released > 0 &&
13199
+ !_sameMessageSnapshot(retained.messages, messages)
13200
+ ) {
13201
+ const authorityExpectedMessages = [...messages];
13202
+ const liveExpectedMessages = [...messages];
13203
+ try {
13204
+ await _settleAutomaticCompaction({
13205
+ messages,
13206
+ liveExpectedMessages,
13207
+ authorityExpectedMessages,
13208
+ compacted: retained.messages,
13209
+ stats: retained.stats,
13210
+ options,
13211
+ trigger: "runtime-retention",
13212
+ });
13213
+ yield {
13214
+ type: "session-runtime-retention",
13215
+ runId,
13216
+ stats: retained.stats,
13217
+ };
13218
+ } catch (error) {
13219
+ yield {
13220
+ type: "session-runtime-retention-degraded",
13221
+ runId,
13222
+ reason:
13223
+ error?.code === "SESSION_REVISION_STALE"
13224
+ ? "session_messages_changed_during_retention"
13225
+ : "canonical_retention_settlement_failed",
13226
+ code: error?.code || "CC_SESSION_RETENTION_SETTLEMENT_FAILED",
13227
+ };
13228
+ }
13229
+ }
13230
+ }
13231
+
13171
13232
  // Headless auto-compaction (Claude-Code `--print` parity). Keeps long
13172
13233
  // `-p` / `--resume` runs under the model's context window instead of
13173
13234
  // growing until the provider rejects the request. Opt-out with
@@ -800,9 +800,8 @@ async function runAgentHeadlessInWorkspace(
800
800
  const loaded = loadHooks({ cwd, settingsFile: options.settingsFile });
801
801
  // Fold in installed plugins' hooks/hooks.json (Phase 3.3c) — plugins ADD
802
802
  // to the user's settings hooks, never replace them.
803
- const { mergePluginHooks } = await import(
804
- "../lib/plugin-runtime/hooks.js"
805
- );
803
+ const { mergePluginHooks } =
804
+ await import("../lib/plugin-runtime/hooks.js");
806
805
  const effectiveHooks = mergePluginHooks(
807
806
  attachAuthorityErrors(loaded.hooks, loaded.authorityErrors),
808
807
  { cwd },
@@ -843,9 +842,8 @@ async function runAgentHeadlessInWorkspace(
843
842
  // the run, so no explicit restore is needed.
844
843
  if (!hermeticExecution) {
845
844
  try {
846
- const { applyPluginBinPath } = await import(
847
- "../lib/plugin-runtime/bin.js"
848
- );
845
+ const { applyPluginBinPath } =
846
+ await import("../lib/plugin-runtime/bin.js");
849
847
  applyPluginBinPath({ cwd });
850
848
  } catch {
851
849
  /* best-effort — plugin bin PATH never blocks a headless run */
@@ -856,9 +854,8 @@ async function runAgentHeadlessInWorkspace(
856
854
  // keys not already set; the process exits at the end so no restore is needed.
857
855
  if (!hermeticExecution) {
858
856
  try {
859
- const { applyPluginSettingsEnv } = await import(
860
- "../lib/plugin-runtime/settings.js"
861
- );
857
+ const { applyPluginSettingsEnv } =
858
+ await import("../lib/plugin-runtime/settings.js");
862
859
  applyPluginSettingsEnv({ cwd });
863
860
  } catch {
864
861
  /* best-effort — plugin settings never block a headless run */
@@ -991,9 +988,8 @@ async function runAgentHeadlessInWorkspace(
991
988
  if (isHeadlessConfigCommand(prompt)) {
992
989
  const cm = await import("../lib/config-manager.js");
993
990
  const { getConfigPath } = await import("../lib/paths.js");
994
- const { runConfigDirective } = await import(
995
- "../lib/headless-config-command.js"
996
- );
991
+ const { runConfigDirective } =
992
+ await import("../lib/headless-config-command.js");
997
993
  const { text, isError } = runConfigDirective(prompt, {
998
994
  configManager: cm,
999
995
  getConfigPath,
@@ -1069,9 +1065,8 @@ async function runAgentHeadlessInWorkspace(
1069
1065
  model = macro.model;
1070
1066
  writeErr(` command: model → ${model}\n`);
1071
1067
  try {
1072
- const { maybeWarnDeprecatedModel } = await import(
1073
- "../lib/model-deprecation.js"
1074
- );
1068
+ const { maybeWarnDeprecatedModel } =
1069
+ await import("../lib/model-deprecation.js");
1075
1070
  maybeWarnDeprecatedModel({ model });
1076
1071
  } catch {
1077
1072
  // deprecation notice is best-effort
@@ -1108,9 +1103,8 @@ async function runAgentHeadlessInWorkspace(
1108
1103
 
1109
1104
  // ── Permission + tool resolution ──────────────────────────────────────
1110
1105
  if (managedSettings) {
1111
- const { assertManagedPermissionMode } = await import(
1112
- "../lib/settings-loader.cjs"
1113
- );
1106
+ const { assertManagedPermissionMode } =
1107
+ await import("../lib/settings-loader.cjs");
1114
1108
  assertManagedPermissionMode(options.permissionMode, managedSettings);
1115
1109
  }
1116
1110
  const perm = resolvePermissionMode(options.permissionMode);
@@ -1566,9 +1560,8 @@ async function runAgentHeadlessInWorkspace(
1566
1560
  : null;
1567
1561
  if (!hermeticExecution && !instructionExcludes) {
1568
1562
  try {
1569
- const { readStringArraySetting } = await import(
1570
- "../lib/settings-loader.cjs"
1571
- );
1563
+ const { readStringArraySetting } =
1564
+ await import("../lib/settings-loader.cjs");
1572
1565
  const fromSettings = readStringArraySetting("instructionExcludes", {
1573
1566
  cwd,
1574
1567
  settingsFile: options.settingsFile,
@@ -1622,9 +1615,8 @@ async function runAgentHeadlessInWorkspace(
1622
1615
  // settings.json UserPromptSubmit hooks. block → abort the run; context → inject.
1623
1616
  if (settingsHooks) {
1624
1617
  try {
1625
- const { runUserPromptSubmitHooks } = await import(
1626
- "../lib/settings-hook-events.js"
1627
- );
1618
+ const { runUserPromptSubmitHooks } =
1619
+ await import("../lib/settings-hook-events.js");
1628
1620
  const ups = runUserPromptSubmitHooks(settingsHooks, {
1629
1621
  prompt: userContent,
1630
1622
  cwd,
@@ -1654,9 +1646,8 @@ async function runAgentHeadlessInWorkspace(
1654
1646
  let instructionsLoadedContext = null;
1655
1647
  if (settingsHooks && _loadedInstructions) {
1656
1648
  try {
1657
- const { runInstructionsLoadedHooks } = await import(
1658
- "../lib/settings-hook-events.js"
1659
- );
1649
+ const { runInstructionsLoadedHooks } =
1650
+ await import("../lib/settings-hook-events.js");
1660
1651
  instructionsLoadedContext = runInstructionsLoadedHooks(settingsHooks, {
1661
1652
  files: _loadedInstructions.files,
1662
1653
  cwd,
@@ -1671,9 +1662,8 @@ async function runAgentHeadlessInWorkspace(
1671
1662
  let sessionStartContext = null;
1672
1663
  if (settingsHooks) {
1673
1664
  try {
1674
- const { runSessionStartHooks } = await import(
1675
- "../lib/settings-hook-events.js"
1676
- );
1665
+ const { runSessionStartHooks } =
1666
+ await import("../lib/settings-hook-events.js");
1677
1667
  sessionStartContext = runSessionStartHooks(settingsHooks, {
1678
1668
  source: resumeId ? "resume" : "startup",
1679
1669
  cwd,
@@ -1691,9 +1681,8 @@ async function runAgentHeadlessInWorkspace(
1691
1681
  // back up" — e.g. re-run a workspace sanity check. Observe-only, best-effort.
1692
1682
  if (settingsHooks && resumeId && history.length > 0) {
1693
1683
  try {
1694
- const { runObserveHooks } = await import(
1695
- "../lib/settings-hook-events.js"
1696
- );
1684
+ const { runObserveHooks } =
1685
+ await import("../lib/settings-hook-events.js");
1697
1686
  runObserveHooks(
1698
1687
  settingsHooks,
1699
1688
  "SessionResume",
@@ -1924,9 +1913,8 @@ async function runAgentHeadlessInWorkspace(
1924
1913
  // --add-dir → workspaceRootDirs = [cwd] and this is a no-op. Best-effort.
1925
1914
  if (hostMcp?.mcpClient && additionalDirectories.length > 0) {
1926
1915
  try {
1927
- const { notifyMcpRootsChanged, workspaceRootDirs } = await import(
1928
- "../repl/add-dir.js"
1929
- );
1916
+ const { notifyMcpRootsChanged, workspaceRootDirs } =
1917
+ await import("../repl/add-dir.js");
1930
1918
  notifyMcpRootsChanged(
1931
1919
  [hostMcp.mcpClient],
1932
1920
  workspaceRootDirs(options.cwd || process.cwd(), additionalDirectories),
@@ -2034,15 +2022,16 @@ async function runAgentHeadlessInWorkspace(
2034
2022
  error.code = "CC_REMOTE_APPROVAL_GATE_UNAVAILABLE";
2035
2023
  throw error;
2036
2024
  }
2037
- const { startHeadlessRemoteApproval } = await import(
2038
- "../lib/remote-approval-bridge.js"
2039
- );
2025
+ const { startHeadlessRemoteApproval } =
2026
+ await import("../lib/remote-approval-bridge.js");
2040
2027
  _remoteApproval = await (
2041
2028
  deps.startHeadlessRemoteApproval || startHeadlessRemoteApproval
2042
2029
  )({
2043
2030
  agentSessionId: sessionId,
2044
2031
  writeErr,
2045
2032
  isText,
2033
+ allowLan: options.remoteControlAllowLan === true,
2034
+ env: process.env,
2046
2035
  });
2047
2036
  approvalGate.setConfirmer(
2048
2037
  _bgPhase.wrapConfirmer(_remoteApproval.confirmer),
@@ -2065,9 +2054,8 @@ async function runAgentHeadlessInWorkspace(
2065
2054
  let _collectorEnabled = false;
2066
2055
  if (!hermeticExecution) {
2067
2056
  try {
2068
- const { isOtlpCollectorEnabled } = await import(
2069
- "../lib/observability/index.js"
2070
- );
2057
+ const { isOtlpCollectorEnabled } =
2058
+ await import("../lib/observability/index.js");
2071
2059
  _collectorEnabled = isOtlpCollectorEnabled();
2072
2060
  } catch {
2073
2061
  _collectorEnabled = false;
@@ -2075,9 +2063,8 @@ async function runAgentHeadlessInWorkspace(
2075
2063
  }
2076
2064
  if (!hermeticExecution && (options.otlp || _collectorEnabled)) {
2077
2065
  try {
2078
- const { TelemetryRecorder } = await import(
2079
- "../lib/telemetry/span-recorder.js"
2080
- );
2066
+ const { TelemetryRecorder } =
2067
+ await import("../lib/telemetry/span-recorder.js");
2081
2068
  _otlpRecorder = new TelemetryRecorder({ serviceName: "cc-agent" });
2082
2069
  } catch {
2083
2070
  _otlpRecorder = null; // telemetry is best-effort, never blocks the run
@@ -2091,9 +2078,8 @@ async function runAgentHeadlessInWorkspace(
2091
2078
  let _hookSupervisor = null;
2092
2079
  if (settingsHooks) {
2093
2080
  try {
2094
- const { AsyncHookSupervisor } = await import(
2095
- "../lib/async-hook-supervisor.js"
2096
- );
2081
+ const { AsyncHookSupervisor } =
2082
+ await import("../lib/async-hook-supervisor.js");
2097
2083
  _hookSupervisor = new AsyncHookSupervisor({
2098
2084
  persistStats: true,
2099
2085
  // Durably park failed-rewake signals keyed by session so a crash before
@@ -2417,9 +2403,8 @@ async function runAgentHeadlessInWorkspace(
2417
2403
  if (options.goal !== undefined && options.goal !== false) {
2418
2404
  try {
2419
2405
  const explicitId = typeof options.goal === "string" ? options.goal : null;
2420
- const { resolveActiveGoal, linkSession } = await import(
2421
- "../lib/goal-store.js"
2422
- );
2406
+ const { resolveActiveGoal, linkSession } =
2407
+ await import("../lib/goal-store.js");
2423
2408
  const goal = (deps.resolveActiveGoal || resolveActiveGoal)({
2424
2409
  explicitId,
2425
2410
  sessionId,
@@ -2547,9 +2532,8 @@ async function runAgentHeadlessInWorkspace(
2547
2532
  let _asyncStopHandled = false;
2548
2533
  const _settleAsyncStop = async () => {
2549
2534
  if (!settingsHooks || !_hookSupervisor) return { rewakes: [], results: [] };
2550
- const { dispatchAsyncHooks } = await import(
2551
- "../lib/settings-hook-events.js"
2552
- );
2535
+ const { dispatchAsyncHooks } =
2536
+ await import("../lib/settings-hook-events.js");
2553
2537
  dispatchAsyncHooks(
2554
2538
  settingsHooks,
2555
2539
  "Stop",
@@ -3301,9 +3285,9 @@ async function runAgentHeadlessInWorkspace(
3301
3285
  ? err.message
3302
3286
  : sessionBudgetFailed
3303
3287
  ? sessionBudgetAdmissionError(
3304
- options.sessionBudget?.reason?.() || err?.budgetReason,
3305
- "run",
3306
- ).message
3288
+ options.sessionBudget?.reason?.() || err?.budgetReason,
3289
+ "run",
3290
+ ).message
3307
3291
  : err?.message || String(err);
3308
3292
  const errorSubtype = runtimeLedgerPersistenceFailed
3309
3293
  ? "error_persistence"
@@ -3383,9 +3367,8 @@ async function runAgentHeadlessInWorkspace(
3383
3367
  await cleanupDeadline.run("settings-hooks", async () => {
3384
3368
  if (settingsHooks) {
3385
3369
  try {
3386
- const { runObserveHooks, dispatchAsyncHooks } = await import(
3387
- "../lib/settings-hook-events.js"
3388
- );
3370
+ const { runObserveHooks, dispatchAsyncHooks } =
3371
+ await import("../lib/settings-hook-events.js");
3389
3372
  const stopPayload = {
3390
3373
  reason: pipeState.closed ? "pipe_closed" : endReason,
3391
3374
  cwd,
@@ -3648,9 +3631,8 @@ async function runAgentHeadlessInWorkspace(
3648
3631
  emitStream({ type: "denials_summary", count: denials.length, denials });
3649
3632
  }
3650
3633
  try {
3651
- const { appendRecentDenials } = await import(
3652
- "../lib/permission-denial-store.js"
3653
- );
3634
+ const { appendRecentDenials } =
3635
+ await import("../lib/permission-denial-store.js");
3654
3636
  appendRecentDenials(denials, {
3655
3637
  sessionId,
3656
3638
  permissionMode: options.permissionMode || "default",
@@ -3721,9 +3703,8 @@ async function runAgentHeadlessInWorkspace(
3721
3703
  }
3722
3704
  if (_collectorEnabled) {
3723
3705
  try {
3724
- const { exportTelemetryRecorder } = await import(
3725
- "../lib/observability/index.js"
3726
- );
3706
+ const { exportTelemetryRecorder } =
3707
+ await import("../lib/observability/index.js");
3727
3708
  exportTelemetryRecorder(_otlpRecorder);
3728
3709
  } catch {
3729
3710
  // Telemetry is observational only and never changes the agent result.
@@ -1694,9 +1694,8 @@ async function runAgentHeadlessStreamInWorkspace(
1694
1694
  const { loadHooks, projectHookTrustNotice, attachAuthorityErrors } =
1695
1695
  await import("../lib/settings-hooks.cjs");
1696
1696
  const loaded = loadHooks({ cwd, settingsFile: options.settingsFile });
1697
- const { mergePluginHooks } = await import(
1698
- "../lib/plugin-runtime/hooks.js"
1699
- );
1697
+ const { mergePluginHooks } =
1698
+ await import("../lib/plugin-runtime/hooks.js");
1700
1699
  const effectiveHooks = mergePluginHooks(
1701
1700
  attachAuthorityErrors(loaded.hooks, loaded.authorityErrors),
1702
1701
  { cwd },
@@ -1777,9 +1776,8 @@ async function runAgentHeadlessStreamInWorkspace(
1777
1776
  });
1778
1777
 
1779
1778
  if (managedSettings) {
1780
- const { assertManagedPermissionMode } = await import(
1781
- "../lib/settings-loader.cjs"
1782
- );
1779
+ const { assertManagedPermissionMode } =
1780
+ await import("../lib/settings-loader.cjs");
1783
1781
  assertManagedPermissionMode(options.permissionMode, managedSettings);
1784
1782
  }
1785
1783
  const perm = resolvePermissionMode(options.permissionMode);
@@ -2267,9 +2265,8 @@ async function runAgentHeadlessStreamInWorkspace(
2267
2265
  : null;
2268
2266
  if (!instructionExcludes) {
2269
2267
  try {
2270
- const { readStringArraySetting } = await import(
2271
- "../lib/settings-loader.cjs"
2272
- );
2268
+ const { readStringArraySetting } =
2269
+ await import("../lib/settings-loader.cjs");
2273
2270
  const fromSettings = readStringArraySetting("instructionExcludes", {
2274
2271
  cwd,
2275
2272
  settingsFile: options.settingsFile,
@@ -2334,9 +2331,8 @@ async function runAgentHeadlessStreamInWorkspace(
2334
2331
  // Best-effort; no-op when project memory is off or no hook is registered.
2335
2332
  if (settingsHooks && _loadedInstructions) {
2336
2333
  try {
2337
- const { runInstructionsLoadedHooks } = await import(
2338
- "../lib/settings-hook-events.js"
2339
- );
2334
+ const { runInstructionsLoadedHooks } =
2335
+ await import("../lib/settings-hook-events.js");
2340
2336
  const ctx = runInstructionsLoadedHooks(settingsHooks, {
2341
2337
  files: _loadedInstructions.files,
2342
2338
  cwd,
@@ -2376,9 +2372,8 @@ async function runAgentHeadlessStreamInWorkspace(
2376
2372
  // settings.json SessionStart hooks → inject session context once (observe-only).
2377
2373
  if (settingsHooks) {
2378
2374
  try {
2379
- const { runSessionStartHooks } = await import(
2380
- "../lib/settings-hook-events.js"
2381
- );
2375
+ const { runSessionStartHooks } =
2376
+ await import("../lib/settings-hook-events.js");
2382
2377
  const ctx = runSessionStartHooks(settingsHooks, {
2383
2378
  source: "startup",
2384
2379
  cwd,
@@ -2749,9 +2744,8 @@ async function runAgentHeadlessStreamInWorkspace(
2749
2744
  // the single-prompt runner + the REPL /add-dir path. Best-effort.
2750
2745
  if (hostMcp?.mcpClient && additionalDirectories.length > 0) {
2751
2746
  try {
2752
- const { notifyMcpRootsChanged, workspaceRootDirs } = await import(
2753
- "../repl/add-dir.js"
2754
- );
2747
+ const { notifyMcpRootsChanged, workspaceRootDirs } =
2748
+ await import("../repl/add-dir.js");
2755
2749
  notifyMcpRootsChanged(
2756
2750
  [hostMcp.mcpClient],
2757
2751
  workspaceRootDirs(options.cwd || process.cwd(), additionalDirectories),
@@ -2817,6 +2811,8 @@ async function runAgentHeadlessStreamInWorkspace(
2817
2811
  .startHeadlessRemoteApproval;
2818
2812
  _remoteApproval = await startRemoteApproval({
2819
2813
  agentSessionId: sessionId,
2814
+ allowLan: options.remoteControlAllowLan === true,
2815
+ env: process.env,
2820
2816
  });
2821
2817
  streamCleanup.setRemoteApproval(_remoteApproval);
2822
2818
  emit({
@@ -3690,9 +3686,8 @@ async function runAgentHeadlessStreamInWorkspace(
3690
3686
  // session can honour the user's standing preferences ("越用越聪明"
3691
3687
  // flywheel). Best-effort — a learning ledger must never break the chat.
3692
3688
  try {
3693
- const { appendFeedback } = await import(
3694
- "../lib/pdh-feedback-ledger.js"
3695
- );
3689
+ const { appendFeedback } =
3690
+ await import("../lib/pdh-feedback-ledger.js");
3696
3691
  appendFeedback({ sessionId, turnId, kind, comment });
3697
3692
  } catch {
3698
3693
  /* persistence is best-effort */
@@ -3823,9 +3818,8 @@ async function runAgentHeadlessStreamInWorkspace(
3823
3818
  // settings.json UserPromptSubmit hooks. block → skip this turn; context → inject.
3824
3819
  if (settingsHooks) {
3825
3820
  try {
3826
- const { runUserPromptSubmitHooks } = await import(
3827
- "../lib/settings-hook-events.js"
3828
- );
3821
+ const { runUserPromptSubmitHooks } =
3822
+ await import("../lib/settings-hook-events.js");
3829
3823
  const ups = runUserPromptSubmitHooks(settingsHooks, {
3830
3824
  prompt: userContent,
3831
3825
  cwd,
@@ -51,6 +51,7 @@ import {
51
51
  normalizeMcpSandboxPolicy,
52
52
  readMcpStdioCwd,
53
53
  } from "../lib/mcp-sandbox-policy.js";
54
+ import { normalizeMcpTlsConfig } from "../lib/mcp-tls.js";
54
55
 
55
56
  function invalidSandboxPolicy(message) {
56
57
  const error = new TypeError(message);
@@ -210,6 +211,7 @@ export function parseMcpServers(raw) {
210
211
  ...headersHelperField(cfg.headersHelper),
211
212
  ...(cfg.configScope ? { configScope: cfg.configScope } : {}),
212
213
  ...(cfg.configSource ? { configSource: cfg.configSource } : {}),
214
+ ...(cfg.tls != null ? { tls: normalizeMcpTlsConfig(cfg.tls) } : {}),
213
215
  };
214
216
  }
215
217
  return out;
@@ -90,10 +90,12 @@ export function resolveAgentPolicy({
90
90
  fallbackModels: overrides.fallbackModels,
91
91
  pdh: overrides.pdh,
92
92
  outputStyle: overrides.outputStyle,
93
+ settingsFile: overrides.settingsFile || null,
93
94
  disableSlashCommands: overrides.disableSlashCommands === true,
94
95
  // --remote-control also applies interactively: the REPL starts the
95
96
  // paired-device approval bridge at startup (批26).
96
97
  remoteControl: overrides.remoteControl === true,
98
+ remoteControlAllowLan: overrides.remoteControlAllowLan === true,
97
99
  // --channels: inbound channel listeners (webhook/telegram) whose events
98
100
  // become user turns in the interactive session (gap-2026-07-11 P0#5).
99
101
  channels: overrides.channels || null,
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as y,U as n,R as a,S,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-B7osrXqy.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"),h=String(e.getHours()).padStart(2,"0"),b=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${h}:${b}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},M={class:"meta"},R={class:"actor"},V={class:"time"},q={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return u(),y("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",T,[n("div",M,[n("span",R,a(r.actorLabel),1),n("span",V,a(r.formattedTime),1)]),n("div",q,a(r.messageText),1),t.event.source.adapter?(u(),S(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 j=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-yufPhh/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{j as default};
@@ -1 +0,0 @@
1
- import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-B7osrXqy.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function u(t,o,e,r,n,m){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",u],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-yufPhh/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
@@ -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-B7osrXqy.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 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),U=u([]),k=u(!1),E=u(!1),L=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 G(o){return{onClick:()=>M(o)}}async function M(o){v.value=o,P.value=!0,k.value=!0,U.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);U.value=Array.isArray(f?.files)?f.files:[]}catch{U.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(){F.value={name:"",description:"",type:"document",rootPath:""},E.value=!0}async function T(){if(!F.value.name.trim()){d.warning("请输入项目名称");return}L.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}'`),E.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{L.value=!1}}const b=u(!1),D=u(!1),j=u({path:"",content:""}),h=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),Y=u(!1);function ue(){j.value={path:"",content:""},b.value=!0}function ce(){R.value={path:""},h.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);U.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}'`),h.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){Y.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{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:U,filesLoading:k,createOpen:E,creating:L,newProject:F,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:b,creatingFile:D,newFile:j,createFolderOpen:h,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:Y,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"}},he={class:"page-title"},Ae={class:"page-sub"},Ie={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},Ue={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"),U=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=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"),G=i("a-list-item"),M=i("a-list"),H=i("a-spin"),X=i("a-drawer"),T=i("a-input"),b=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),h=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",he,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(U,{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(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(),A("code",Ue,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: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(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(h,{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(h,{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(h,{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(h,{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",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-yufPhh/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};