chainlesschain 0.162.159 → 0.162.160

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 (183) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-ByIiF5bT.js → AIOps-CkRHjW8e.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-NlgSFZq5.js → ActionButton-BP3MeNi2.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D17cOUcb.js → Analytics-CjbjQsOr.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-B4mEZcbl.js → AppLayout-i0adH1M8.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-CASsmyQw.js → Artifacts-CCCG2GOU.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DYAia2e2.js → Audit-DrsgvwHC.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-C1lvYUSu.js → BackgroundAgents-DkXNkbZM.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-B6agK6bA.js → Backup-DarTWCex.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-DM43R2vy.js → BaseInput-DaDzhcto.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-Dtdp3eXp.js → Chat-C4EzGw6V.js} +5 -5
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BL5c_OQ1.js → ChatBubbleRenderer-lkavIWMS.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-D2xf7uZt.js → Checkbox-gddNgaQi.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-D3j45jJL.js → Codegen-BKldFWf9.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-voPJ9fUZ.js → Col-ChR-brDs.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-DEsyTESF.js → Community-DlHtZX86.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-OHV_QXLD.js → Compact-BAhfcBpC.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-eDTJWC-J.js → Compliance-gIrKkm6m.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-BBvy-6d1.js → Cowork-BYnzLBO3.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-Dw2eoJxu.js → Cron-ByUDIljI.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-DQHms_Bh.js → Crosschain-DOdNbHFp.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-Cyu7Id1c.js → DID-BJHaNWD2.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-sIDzkG92.js → Dashboard-Drm_tClz.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-DUW3T2ey.js → Dropdown-CA1WLzGN.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-CECELXW8.js → EmailListRenderer-Di1SKjNO.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BIZR37ov.js → FamilyGuardDashboard-44Ve7ZFe.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-BEZIQX84.js → Federation-CubPwv_N.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-BcdUMznL.js → FormItemContext-CsUFe5bU.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-DsN_fr5H.js → GenericCardRenderer-D7xRjPjZ.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-63LhjBx2.js → Git-D-Qx9dhO.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CYtQtIcH.js → Governance-_YMYaU4n.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-BwR6UUox.js → Inference-J7Yzh-K_.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-D9lVNTUA.js → KnowledgeGraph-D37iI_Mo.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-C4q5h7Ut.js → Logs-oMTSYfGY.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-DexLlXfN.js → MarkdownRenderer-BqaPmC0W.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-Plksliuw.js → Marketplace-DKUqYDaF.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-DZUFfeuG.js → McpTools-BEv3Gx61.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-NoDYt29V.js → Memory-CtA8XD2y.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-CEXGTkdh.js → MobileBridge-ug7c1mMj.js} +1 -1
  41. package/src/assets/web-panel/assets/MobileProjects-BpX5g9It.js +1 -0
  42. package/src/assets/web-panel/assets/{Mtc-DTAa0cwy.js → Mtc-WJaMs4i2.js} +5 -5
  43. package/src/assets/web-panel/assets/{MtcAudit-CVV7LnNS.js → MtcAudit-DXnK_-ru.js} +2 -2
  44. package/src/assets/web-panel/assets/{Multisig-BqqGrjt_.js → Multisig-C4Ev7726.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-C4WP8DRp.js → NLProgramming-BMFb9_zk.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-Zo4DJUVI.js → Notes-Bl93nvBX.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-DBcjRaz2.js → NotificationSettings-BN2W5cl6.js} +1 -1
  48. package/src/assets/web-panel/assets/OrderTableRenderer-Dxc9oN4o.js +1 -0
  49. package/src/assets/web-panel/assets/{Organization-BT9WPBOX.js → Organization-CAs48637.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-D6b4bZ3q.js → Overflow-Bhq27Zoc.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-Cw3OsYx-.js → P2P-D61-2542.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-C0nyiK2b.js → PdhVaultBrowser-C1j4iUxz.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-zVBZEB_C.js → Permissions-rJ2-fScM.js} +3 -3
  54. package/src/assets/web-panel/assets/{PersonalDataHub-BOspsFew.js → PersonalDataHub-DFIlTok6.js} +2 -2
  55. package/src/assets/web-panel/assets/{Pipeline-CQWfZ4XH.js → Pipeline-BjIgEWoZ.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-C2oGJ_WL.js → Privacy-BQoH5wcX.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-BZMR4qY1.js → ProjectInit-CYR_-_Ub.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-DAujoP63.js → ProjectSettings-nkatCq-9.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-SS9uZKCl.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-D_RGHM-v.js → Providers-BnKM9fsF.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-Mf6KfL2J.js → QrScannerModal-Cfe82dbz.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-5D8URoI_.js → QuickAsk-r1RbPufV.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-Df4kC8Gy.js → Recommend-CjCbM2WE.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-DGi3f3vO.js → RemoteSession-BuMGPH6V.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-jmkGFNWb.js → Reputation-Bmj3NY1F.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DP6Pcu3m.js → Row-BIsNcE_1.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-D60hSuPO.js → RssFeed-BObmojD2.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-0mf1BQUK.js → Search-BRmbkQNS.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-CfZtLFYV.js → Security-_rF3DRpY.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-D9zpZLWz.js → Services-D0If9ZV4.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-D1_44eMD.js → Skeleton-o7zIksUg.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-cVFa8zkz.js → Skills-oUR7zi9u.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Cinpzc3L.js → Sla-fqKyGi03.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-bqdiJE_P.js → SpeechSettings-B1wZ_gxx.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-Dgl_SLgj.js → SyncSettings-B3qJWYXq.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-DawWAEhy.js → Tasks-BH5_dUfr.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-Ca0nY651.js → Templates-CCIVpjRP.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-CgaGEhLm.js → Tenant-2GZtTGnB.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-D-9EnpRx.js → Terminal-BlMkfs_u.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-CSOxDHZ6.js → TimelineRenderer-U6hi5OMc.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BpwLZpL3.js → Tokens-C-_BerGJ.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-DgowwBK5.js → Trigger-DaKzBgN3.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-BZutapjE.js → Trust-CLvcsco3.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-QZPt8_Sp.js → UkeySign-BFn_Y1zZ.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-DlQx5UDJ.js → VideoEditing-B0V18dLT.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-ZfdTgtWA.js → Wallet-BbmP7Imu.js} +2 -2
  87. package/src/assets/web-panel/assets/{WebAuthn-CAp0y_Cr.js → WebAuthn-Dewj_0kt.js} +5 -5
  88. package/src/assets/web-panel/assets/{WorkflowEditor-BVITZEmr.js → WorkflowEditor-DOxz3Lwa.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-CC2tPaNg.js → chat-B1OIpZnh.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-31brc9CA.js → colors-CSGNVdri.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-DLMkC9C-.js → compact-item-8S0vcg0u.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-BMtveI6F.js → createContext-vZyc27TN.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-DYEZcY55.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DbD6WHW2.js → hasIn-DWw3-UhA.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-Dm0byjm1.js → index-B4pP2ycr.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CEXa-4zd.js → index-BDHyovnK.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-C_eUKGYP.js → index-BKEmQQvR.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BOM-VFlv.js → index-BQssf0EQ.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-bdaJwTXJ.js → index-BZnauCqN.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-Cwbqh0KZ.js → index-BdyokEau.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DJvxFyIz.js → index-BeBv896m.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DndNnYc0.js → index-BjC-TrOb.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CWgfipcC.js → index-BkWd6YL7.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-D7cV0tu0.js → index-BoIPHP4R.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CcVszn2b.js → index-BuB5P0TR.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-COHHQ9cU.js → index-BwKrTVV0.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-C1PfeI88.js → index-C6r27A-o.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Cod97Urs.js → index-CB2MOS_8.js} +3 -3
  109. package/src/assets/web-panel/assets/{index-CEwjBA9q.js → index-CFQWZvak.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D67kIagl.js → index-CI3slBKI.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-jG6h22Qg.js → index-CJgKP2cm.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DZl-UXB6.js → index-CLPr2vC_.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-ntVQqSML.js → index-CbZqw7pg.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-C-cGlCDW.js → index-CfEvacz7.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BFRLmCR3.js → index-CwXBblm-.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-AaIKG60c.js → index-D1i_8oop.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BPpS-lGb.js → index-D8qXVfoV.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-WQUO2vvK.js → index-DKwl1AkQ.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CUmLMFsy.js → index-DLAvUtOH.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Bbc2JeQG.js → index-DLgkAhEE.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BKAB6-6V.js → index-DPgY5GLy.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-ALvoNTRF.js → index-Dc40pX3F.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-ep6JchNG.js → index-DcfLXAW7.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C21pdBqs.js → index-DeCS12Mh.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-3oBsXZmF.js → index-Dg0Izipr.js} +1 -1
  126. package/src/assets/web-panel/assets/index-DmVFfcNR.js +1 -0
  127. package/src/assets/web-panel/assets/{index-BnFLzejT.js → index-DtHWHJnj.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-C7LHNw_N.js → index-Q6oyLnKC.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BoO4WEJB.js → index-dxocDVD_.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BiRQUoyE.js → index-t-q3rkVm.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CFXKbOek.js → index-tr1x96W9.js} +1 -1
  132. package/src/assets/web-panel/assets/index-x7YyhMUa.js +1 -0
  133. package/src/assets/web-panel/assets/{index-CJhREOlG.js → index-xx5M5Rbj.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-D5UoBRhN.js → initDefaultProps-Di5YFId0.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-DltOw0CR.js → motion-BVSN0aeL.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-_oPkk5zj.js → move-DHNiaP2l.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-EES8ROCS.js → mtc-parser-xJPf3gQD.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-B-_39x_M.js → omit-C7qzUdkN.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-l6D0yJHz.js → pickAttrs-pSpjg3Le.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-DIeUK31L.js → placementArrow-cs_jL_UC.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-dG4EzUQo.js → responsiveObserve-DkS_Zs4r.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-DWFzYGdH.js → slide-B5O1Kpxo.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-CECdTA5H.js → statusUtils-BX02GnZp.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-D6kP-mMK.js → styleChecker-EmBYRftd.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-BWfna_rd.js → useFlexGapSupport-ZGzN1cU8.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-Bb-j6rzo.js → useFs-CfP7M1m7.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-D5OIsYM4.js → usePersonalDataHub-CbIPHgNh.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-DNpwzFTM.js → vnode-7xh0If_O.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-vNLpFQBW.js → zoom-DmitvTR2.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/commands/agent.js +65 -6
  152. package/src/commands/background-session.js +30 -0
  153. package/src/commands/mcp.js +46 -0
  154. package/src/commands/session.js +70 -0
  155. package/src/data/changelog.json +7 -2
  156. package/src/harness/jsonl-session-store.js +70 -1
  157. package/src/harness/mcp-client.js +50 -0
  158. package/src/lib/agent-sandbox.js +68 -0
  159. package/src/lib/agents.js +12 -4
  160. package/src/lib/api-key-helper.js +62 -0
  161. package/src/lib/background-agent-supervisor.js +32 -0
  162. package/src/lib/dependency-install-policy.js +130 -0
  163. package/src/lib/exit-codes.cjs +77 -0
  164. package/src/lib/headless-manifest.js +175 -0
  165. package/src/lib/hook-runner.cjs +70 -4
  166. package/src/lib/ide-context-redaction.js +130 -0
  167. package/src/lib/ide-context.js +89 -13
  168. package/src/lib/jsonl-session-store.js +2 -0
  169. package/src/lib/llm-config-defaults.js +24 -8
  170. package/src/lib/project-mcp-trust.js +87 -0
  171. package/src/lib/sensitive-file-guard.js +51 -0
  172. package/src/lib/sub-agent-context.js +7 -3
  173. package/src/runtime/agent-core.js +102 -6
  174. package/src/runtime/coding-agent-contract-shared.cjs +19 -2
  175. package/src/runtime/headless-runner.js +66 -7
  176. package/src/runtime/headless-stream.js +29 -1
  177. package/src/runtime/mcp-config.js +32 -1
  178. package/src/assets/web-panel/assets/MobileProjects-DnbJkbZo.js +0 -1
  179. package/src/assets/web-panel/assets/OrderTableRenderer-BCQel9bD.js +0 -1
  180. package/src/assets/web-panel/assets/Projects-DvH_P2Uq.js +0 -1
  181. package/src/assets/web-panel/assets/devWarning-CB8pPOtd.js +0 -1
  182. package/src/assets/web-panel/assets/index-BhXiaiev.js +0 -1
  183. package/src/assets/web-panel/assets/index-WpaYaE3D.js +0 -1
@@ -673,8 +673,8 @@ Key behaviors:
673
673
  When the user's problem involves data processing, calculations, file operations, text parsing, API calls, web scraping, or any task that can be solved programmatically:
674
674
  - Proactively write and execute code using run_code tool
675
675
  - Choose the best language: Python for data/math/scraping, Node.js for JSON/API, Bash for system tasks
676
- - Missing Python packages are auto-installed via pip when import errors are detected
677
- - Scripts are persisted in .chainlesschain/agent-scripts/ for reference
676
+ - Missing Python packages are NOT auto-installed by default; the tool result tells you (and the user) how to opt in (settings runCode.autoInstall)
677
+ - Scripts run from a temp file by default; pass persist:true to keep one in .chainlesschain/agent-scripts/ for reference
678
678
  - Show the results and explain them clearly
679
679
  - If the first attempt fails, debug and retry with a different approach
680
680
 
@@ -1263,6 +1263,8 @@ export async function executeTool(name, args, context = {}) {
1263
1263
  // Sensitive-file write guard (Claude-Code 2.1.160 parity): shell startup
1264
1264
  // files / PowerShell profiles / git+husky hooks execute code on the user's
1265
1265
  // next shell or commit — even otherwise-permitted edit flows confirm first.
1266
+ // Auto-exec configs (.vscode/tasks.json, .mcp.json, .idea run configs, …)
1267
+ // ride the same gate via autoExecConfigReason.
1266
1268
  // An explicit settings `allow` rule is the only bypass (exact user
1267
1269
  // pre-authorization); headless without a confirmer fails closed.
1268
1270
  if (
@@ -1272,9 +1274,10 @@ export async function executeTool(name, args, context = {}) {
1272
1274
  settingsVerdict.decision !== "allow" &&
1273
1275
  args?.path
1274
1276
  ) {
1275
- const { sensitiveFileReason } =
1277
+ const { sensitiveFileReason, autoExecConfigReason } =
1276
1278
  await import("../lib/sensitive-file-guard.js");
1277
- const sensReason = sensitiveFileReason(args.path);
1279
+ const sensReason =
1280
+ sensitiveFileReason(args.path) || autoExecConfigReason(args.path);
1278
1281
  if (sensReason) {
1279
1282
  const ok = await requestInteractivePermission(name, args, context, cwd, {
1280
1283
  tool: name,
@@ -3908,7 +3911,10 @@ async function _executeRunCode(args, cwd) {
3908
3911
  const lang = args.language;
3909
3912
  const code = args.code;
3910
3913
  const timeoutSec = Math.min(Math.max(args.timeout || 60, 1), 300);
3911
- const persist = args.persist !== false; // default true
3914
+ // gap-analysis 2026-07-11 P0 "依赖安装与凭据": agent-generated scripts
3915
+ // default to the OS temp dir; only an explicit persist:true lands them in
3916
+ // the project (.chainlesschain/agent-scripts/).
3917
+ const persist = args.persist === true; // default false (temp dir)
3912
3918
 
3913
3919
  const extMap = { python: ".py", node: ".js", bash: ".sh" };
3914
3920
  const ext = extMap[lang];
@@ -3978,6 +3984,51 @@ async function _executeRunCode(args, cwd) {
3978
3984
  };
3979
3985
  }
3980
3986
 
3987
+ // Auto-install is OPT-IN (settings runCode.autoInstall / env
3988
+ // CC_RUN_CODE_AUTO_INSTALL=1) with an optional package allowlist;
3989
+ // every attempt — including refused ones — is audited.
3990
+ const {
3991
+ resolveAutoInstallPolicy,
3992
+ isPackageAllowed,
3993
+ autoInstallDisabledHint,
3994
+ recordInstallAudit,
3995
+ } = await import("../lib/dependency-install-policy.js");
3996
+ const installPolicy = resolveAutoInstallPolicy({ cwd });
3997
+ if (!installPolicy.enabled) {
3998
+ recordInstallAudit({
3999
+ package: packageName,
4000
+ interpreter,
4001
+ cwd,
4002
+ outcome: "disabled",
4003
+ });
4004
+ return {
4005
+ error: (stderr || message).substring(0, 5000),
4006
+ stderr: stderr.substring(0, 5000),
4007
+ exitCode: err.status,
4008
+ language: lang,
4009
+ ...classified,
4010
+ hint: autoInstallDisabledHint(packageName),
4011
+ scriptPath: persist ? scriptPath : undefined,
4012
+ };
4013
+ }
4014
+ if (!isPackageAllowed(packageName, installPolicy.allowlist)) {
4015
+ recordInstallAudit({
4016
+ package: packageName,
4017
+ interpreter,
4018
+ cwd,
4019
+ outcome: "blocked",
4020
+ });
4021
+ return {
4022
+ error: (stderr || message).substring(0, 5000),
4023
+ stderr: stderr.substring(0, 5000),
4024
+ exitCode: err.status,
4025
+ language: lang,
4026
+ ...classified,
4027
+ hint: `Package "${packageName}" is not in runCode.installAllowlist — install it manually or add it to the allowlist.`,
4028
+ scriptPath: persist ? scriptPath : undefined,
4029
+ };
4030
+ }
4031
+
3981
4032
  // Attempt pip install
3982
4033
  try {
3983
4034
  execSync(`${interpreter} -m pip install ${packageName}`, {
@@ -3986,6 +4037,12 @@ async function _executeRunCode(args, cwd) {
3986
4037
  maxBuffer: 2 * 1024 * 1024,
3987
4038
  stdio: ["pipe", "pipe", "pipe"],
3988
4039
  });
4040
+ recordInstallAudit({
4041
+ package: packageName,
4042
+ interpreter,
4043
+ cwd,
4044
+ outcome: "installed",
4045
+ });
3989
4046
 
3990
4047
  // Retry execution
3991
4048
  const retryStart = Date.now();
@@ -4006,6 +4063,13 @@ async function _executeRunCode(args, cwd) {
4006
4063
  scriptPath: persist ? scriptPath : undefined,
4007
4064
  };
4008
4065
  } catch (pipErr) {
4066
+ recordInstallAudit({
4067
+ package: packageName,
4068
+ interpreter,
4069
+ cwd,
4070
+ outcome: "failed",
4071
+ detail: (pipErr.stderr || pipErr.message || "").substring(0, 200),
4072
+ });
4009
4073
  return {
4010
4074
  error: (stderr || message).substring(0, 5000),
4011
4075
  stderr: stderr.substring(0, 5000),
@@ -4233,6 +4297,17 @@ async function _executeSpawnSubAgent(args, ctx) {
4233
4297
  tools: explicitTools,
4234
4298
  profile: profileName,
4235
4299
  } = args;
4300
+ // Extended sub-agent contract (gap 2026-07-11 P1): per-spawn deny-list,
4301
+ // iteration cap and worktree isolation — spawn args win over the agent
4302
+ // file's frontmatter defaults.
4303
+ let disallowedTools = Array.isArray(args.disallowedTools)
4304
+ ? args.disallowedTools.filter(Boolean)
4305
+ : null;
4306
+ let subMaxTurns =
4307
+ Number.isFinite(Number(args.maxTurns)) && Number(args.maxTurns) > 0
4308
+ ? Math.floor(Number(args.maxTurns))
4309
+ : null;
4310
+ let subIsolation = args.isolation === "worktree" ? "worktree" : null;
4236
4311
 
4237
4312
  // Named subagent delegation (cc agents / .chainlesschain|.claude/agents/*.md):
4238
4313
  // load the agent's persona (its body = system prompt) + tool allow-list.
@@ -4250,6 +4325,13 @@ async function _executeSpawnSubAgent(args, ctx) {
4250
4325
  }
4251
4326
  role = role || md.name;
4252
4327
  if (!explicitTools && Array.isArray(md.tools)) explicitTools = md.tools;
4328
+ if (!disallowedTools && Array.isArray(md.disallowedTools)) {
4329
+ disallowedTools = md.disallowedTools;
4330
+ }
4331
+ if (!subMaxTurns && md.maxTurns) subMaxTurns = md.maxTurns;
4332
+ if (!subIsolation && md.isolation === "worktree") {
4333
+ subIsolation = "worktree";
4334
+ }
4253
4335
  if (md.model) mdModel = md.model;
4254
4336
  if (md.systemPrompt) {
4255
4337
  mdProfile = { name: md.name, systemPrompt: md.systemPrompt };
@@ -4289,9 +4371,19 @@ async function _executeSpawnSubAgent(args, ctx) {
4289
4371
  // profile.systemPrompt seam) when no declarative profile was requested.
4290
4372
  if (!profile && mdProfile) profile = mdProfile;
4291
4373
 
4292
- const allowedTools = Array.isArray(explicitTools)
4374
+ let allowedTools = Array.isArray(explicitTools)
4293
4375
  ? explicitTools
4294
4376
  : profile?.toolAllowlist || null;
4377
+ // Deny-list: subtract from the resolved allow-list; with no allow-list
4378
+ // ("all tools"), subtract from the full built-in contract set. spawn itself
4379
+ // is always denied downstream by depth/breadth caps, so no special-casing.
4380
+ if (Array.isArray(disallowedTools) && disallowedTools.length > 0) {
4381
+ const deny = new Set(disallowedTools.map((t) => String(t).trim()));
4382
+ const base = Array.isArray(allowedTools)
4383
+ ? allowedTools
4384
+ : listCodingAgentToolNames();
4385
+ allowedTools = base.filter((t) => !deny.has(t));
4386
+ }
4295
4387
 
4296
4388
  // Auto-condense parent context if caller didn't provide explicit context
4297
4389
  let resolvedContext = inheritedContext || null;
@@ -4399,6 +4491,10 @@ async function _executeSpawnSubAgent(args, ctx) {
4399
4491
  // single total-sub-agent pool (breadth cap spans the whole tree).
4400
4492
  subAgentBudget: ctx.subAgentBudget || null,
4401
4493
  onUsage,
4494
+ // Extended contract (gap 2026-07-11): per-agent iteration cap + opt-in
4495
+ // worktree isolation. undefined keeps the profile/flag defaults intact.
4496
+ ...(subMaxTurns ? { maxIterations: subMaxTurns } : {}),
4497
+ ...(subIsolation === "worktree" ? { useWorktree: true } : {}),
4402
4498
  });
4403
4499
  subCtxRef = subCtx;
4404
4500
 
@@ -521,7 +521,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
521
521
  kind: "code",
522
522
  tier: "extension",
523
523
  description:
524
- "Write and execute code in Python, Node.js, or Bash. Use this when the user needs data processing, calculations, file batch operations, API calls, or any task best solved with a script. Scripts are saved for reference. Missing Python packages are auto-installed.",
524
+ "Write and execute code in Python, Node.js, or Bash. Use this when the user needs data processing, calculations, file batch operations, API calls, or any task best solved with a script. Scripts run from a temp file unless persist:true. Missing Python packages are NOT auto-installed unless the user opted in (settings runCode.autoInstall).",
525
525
  inputSchema: {
526
526
  type: "object",
527
527
  properties: {
@@ -538,7 +538,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
538
538
  persist: {
539
539
  type: "boolean",
540
540
  description:
541
- "If true (default), save script in .chainlesschain/agent-scripts/. If false, use temp file and clean up.",
541
+ "If true, save the script in .chainlesschain/agent-scripts/ for reference. Default false: run from a temp file outside the project.",
542
542
  },
543
543
  },
544
544
  required: ["language", "code"],
@@ -599,6 +599,23 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
599
599
  description:
600
600
  "Run the sub-agent in the BACKGROUND: the call returns immediately with a running handle and you continue working; the sub-agent's result is delivered to you automatically in a later turn (the run waits for stragglers before finishing). Use for independent subtasks you don't need before your next step.",
601
601
  },
602
+ disallowedTools: {
603
+ type: "array",
604
+ items: { type: "string" },
605
+ description:
606
+ "Optional tool DENY-list for the sub-agent: these are removed from whatever tool set it would otherwise get (explicit `tools`, agent-file allowlist, or all).",
607
+ },
608
+ maxTurns: {
609
+ type: "number",
610
+ description:
611
+ "Optional iteration cap for the sub-agent's own loop (positive integer; default 8 or the profile's cap).",
612
+ },
613
+ isolation: {
614
+ type: "string",
615
+ enum: ["worktree"],
616
+ description:
617
+ "Optional isolation mode: \"worktree\" runs the sub-agent in a fresh git worktree so its file edits land on an isolated branch (diff/merge summary comes back with the result).",
618
+ },
602
619
  },
603
620
  required: ["task"],
604
621
  },
@@ -54,6 +54,18 @@ import { composeSystemPrompt } from "./system-prompt.js";
54
54
  import { buildUserContent } from "../lib/image-input.js";
55
55
  import { mergeConsecutiveMessages } from "./message-roles.js";
56
56
  import { isHeadlessConfigCommand } from "../lib/headless-config-command.js";
57
+ import {
58
+ STREAM_PROTOCOL_VERSION,
59
+ computePolicyDigest,
60
+ computeToolsHash,
61
+ buildLoadedSources,
62
+ } from "../lib/headless-manifest.js";
63
+ import {
64
+ HEADLESS_EXIT_CODES,
65
+ classifyLoopError,
66
+ exitCodeForEndReason,
67
+ } from "../lib/exit-codes.cjs";
68
+ import { isolationLevel } from "../lib/agent-sandbox.js";
57
69
  import { withQuietStdout } from "./quiet-stdout.js";
58
70
  import { CostBudget } from "../lib/cost-budget.js";
59
71
  import {
@@ -200,13 +212,18 @@ export function parseToolList(value) {
200
212
  * Persistence is intentionally OFF unless a resume/continue/persist intent is
201
213
  * present, so a plain one-shot `cc agent -p "..."` writes nothing to disk.
202
214
  *
203
- * @param {object} options { resume, continueSession, sessionId, persistSession }
215
+ * `--ephemeral` forces persistence OFF regardless of the above: a resume id
216
+ * still REPLAYS prior history into context, but nothing new is written — the
217
+ * deterministic-CI shape ("read context, leave no trace").
218
+ *
219
+ * @param {object} options { resume, continueSession, sessionId, persistSession, ephemeral }
204
220
  * @param {object} store { getLastSessionId } (injection seam)
205
221
  * @param {string} fallbackId used when nothing is being resumed
206
222
  * @returns {{ sessionId:string, resumeId:string|null, persist:boolean, wantLatest:boolean }}
207
223
  */
208
224
  export function resolveHeadlessSession(options = {}, store = {}, fallbackId) {
209
- const { resume, continueSession, sessionId, persistSession } = options;
225
+ const { resume, continueSession, sessionId, persistSession, ephemeral } =
226
+ options;
210
227
  const wantLatest = continueSession === true || resume === true;
211
228
  let resumeId = null;
212
229
  if (wantLatest) {
@@ -217,7 +234,10 @@ export function resolveHeadlessSession(options = {}, store = {}, fallbackId) {
217
234
  } else if (typeof resume === "string" && resume.trim()) {
218
235
  resumeId = resume.trim();
219
236
  }
220
- const persist = persistSession === true || resumeId != null || wantLatest;
237
+ const persist =
238
+ ephemeral === true
239
+ ? false
240
+ : persistSession === true || resumeId != null || wantLatest;
221
241
  const id = resumeId || sessionId || fallbackId;
222
242
  return { sessionId: id, resumeId, persist, wantLatest };
223
243
  }
@@ -900,7 +920,12 @@ export async function runAgentHeadless(options = {}, deps = {}) {
900
920
  } catch (err) {
901
921
  writeErr(`Error: ${err.message}\n`);
902
922
  emitHeadlessError(err.message);
903
- return { exitCode: 1, result: err.message, isError: true };
923
+ // Bad --mcp-config / MCP wiring is a CONFIG error, not a run failure.
924
+ return {
925
+ exitCode: HEADLESS_EXIT_CODES.CONFIG_ERROR,
926
+ result: err.message,
927
+ isError: true,
928
+ };
904
929
  }
905
930
  }
906
931
 
@@ -943,7 +968,12 @@ export async function runAgentHeadless(options = {}, deps = {}) {
943
968
  writeErr(`Error: ${err.message}\n`);
944
969
  if (mcp?.mcpClient) await mcp.mcpClient.disconnectAll().catch(() => {});
945
970
  emitHeadlessError(err.message);
946
- return { exitCode: 1, result: err.message, isError: true };
971
+ // A bad --permission-prompt-tool reference is a CONFIG error.
972
+ return {
973
+ exitCode: HEADLESS_EXIT_CODES.CONFIG_ERROR,
974
+ result: err.message,
975
+ isError: true,
976
+ };
947
977
  }
948
978
  if (approvalGate && typeof approvalGate.setConfirmer === "function") {
949
979
  approvalGate.setConfirmer(
@@ -1175,11 +1205,32 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1175
1205
  emitStream({
1176
1206
  type: "system",
1177
1207
  subtype: "init",
1208
+ // Deterministic-headless manifest (gap-analysis 2026-07-11): protocol
1209
+ // version + persistence + live sources + policy/tool digests so CI can
1210
+ // assert the run shape. Mirrors agent-sdk PROTOCOL_VERSION.
1211
+ protocol_version: STREAM_PROTOCOL_VERSION,
1178
1212
  session_id: sessionId,
1213
+ session_persistence: persist,
1179
1214
  model,
1180
1215
  provider,
1181
1216
  permission_mode: options.permissionMode || "default",
1182
1217
  tools: enabledToolNames,
1218
+ tools_hash: computeToolsHash(enabledToolNames),
1219
+ policy_digest: computePolicyDigest({
1220
+ permissionMode: options.permissionMode,
1221
+ allowedTools: options.allowedTools,
1222
+ disallowedTools: options.disallowedTools,
1223
+ permissionRules,
1224
+ }),
1225
+ loaded_sources: buildLoadedSources({
1226
+ permissionRules,
1227
+ settingsHooks,
1228
+ mcp: Boolean(mcp),
1229
+ enabledToolNames,
1230
+ }),
1231
+ // True isolation level for tool subprocesses: os-sandbox (bwrap) /
1232
+ // container (docker) / policy-only (no sandbox — rules are pre-execution).
1233
+ isolation_level: isolationLevel(options.sandbox),
1183
1234
  max_turns: budget.limit,
1184
1235
  resumed_from: resumeId,
1185
1236
  history_messages: history.length,
@@ -1471,7 +1522,9 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1471
1522
  } else {
1472
1523
  writeErr(`Error: ${message}\n`);
1473
1524
  }
1474
- return { exitCode: 1, result: message, isError: true };
1525
+ // Provider/transport failures get their own exit code (5) so CI can tell
1526
+ // "the model call failed" from "the run itself errored" (1).
1527
+ return { exitCode: classifyLoopError(err), result: message, isError: true };
1475
1528
  } finally {
1476
1529
  // Drop the signal handlers first — a normal return must not leave a
1477
1530
  // process-wide SIGINT/SIGTERM listener behind (a later Ctrl-C would wrongly
@@ -1739,7 +1792,13 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1739
1792
  }
1740
1793
  }
1741
1794
 
1742
- return { exitCode: isError ? 1 : 0, result: finalText, isError };
1795
+ // Exit-code taxonomy: max-turns → 3, cost cap → 4 (both still non-zero, so
1796
+ // "any failure" checks keep working; scripts can now tell exhaustion apart).
1797
+ return {
1798
+ exitCode: exitCodeForEndReason(endReason, isError),
1799
+ result: finalText,
1800
+ isError,
1801
+ };
1743
1802
  }
1744
1803
 
1745
1804
  function buildResultEnvelope({
@@ -43,6 +43,12 @@ import {
43
43
  makePermissionPromptConfirmer,
44
44
  } from "./mcp-config.js";
45
45
  import { maybeApplyToolSearch } from "./mcp-tool-search.js";
46
+ import {
47
+ STREAM_PROTOCOL_VERSION,
48
+ computePolicyDigest,
49
+ computeToolsHash,
50
+ buildLoadedSources,
51
+ } from "../lib/headless-manifest.js";
46
52
  import { IterationBudget } from "../lib/iteration-budget.js";
47
53
  import { CostBudget } from "../lib/cost-budget.js";
48
54
  import {
@@ -718,7 +724,9 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
718
724
  deps.appendAssistantMessage || jsonlAppendAssistantMessage,
719
725
  rebuildMessages: deps.rebuildMessages || jsonlRebuildMessages,
720
726
  };
721
- const persist = Boolean(options.sessionId);
727
+ // --ephemeral forces persistence OFF even with an explicit session id (the
728
+ // id is kept for event correlation only; nothing is written or replayed).
729
+ const persist = Boolean(options.sessionId) && options.ephemeral !== true;
722
730
 
723
731
  // ── Interactive approvals (--interactive-approvals; chat-panel UX) ────────
724
732
  // CONFIRM-tier decisions (risky shell via the ApprovalGate, settings/hook
@@ -961,11 +969,31 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
961
969
  emit({
962
970
  type: "system",
963
971
  subtype: "init",
972
+ // Deterministic-headless manifest (gap-analysis 2026-07-11): protocol
973
+ // version + persistence + live sources + policy/tool digests. The init
974
+ // event fires BEFORE MCP resolution here (stream consumers expect it
975
+ // promptly), so `mcp` in loaded_sources reflects the run's MCP intent
976
+ // (config file / registry auto-connect enabled), not connection outcome.
977
+ protocol_version: STREAM_PROTOCOL_VERSION,
964
978
  session_id: sessionId,
979
+ session_persistence: persist,
965
980
  model,
966
981
  provider,
967
982
  permission_mode: options.permissionMode || "default",
968
983
  tools: enabledToolNames,
984
+ tools_hash: computeToolsHash(enabledToolNames),
985
+ policy_digest: computePolicyDigest({
986
+ permissionMode: options.permissionMode,
987
+ allowedTools: options.allowedTools,
988
+ disallowedTools: disabledTools,
989
+ permissionRules,
990
+ }),
991
+ loaded_sources: buildLoadedSources({
992
+ permissionRules,
993
+ settingsHooks,
994
+ mcp: Boolean(options.mcpConfig) || options.useRegisteredMcp !== false,
995
+ enabledToolNames,
996
+ }),
969
997
  input_format: "stream-json",
970
998
  additional_directories: additionalDirectories,
971
999
  resumed_messages: resumedMessages,
@@ -631,17 +631,48 @@ export async function loadProjectMcp(opts = {}, deps = {}) {
631
631
  if (root) files.push(path.join(root, ".mcp.json"));
632
632
  files.push(path.join(cwd, ".mcp.json"));
633
633
 
634
+ // Fingerprint trust (gap 2026-07-11): the --project-mcp opt-in covers the
635
+ // file as last seen. First use records a sha256; a CHANGED file is refused
636
+ // (fail-closed) until re-trusted via CC_PROJECT_MCP_TRUST=1 or
637
+ // `cc mcp trust-project`. Injectable for tests.
638
+ const trust =
639
+ deps.projectMcpTrust ||
640
+ (await import("../lib/project-mcp-trust.js").catch(() => null));
641
+
634
642
  const servers = {};
635
643
  const seenFiles = [];
636
644
  for (const file of files) {
637
645
  if (!fileExists(file)) continue;
646
+ let content;
638
647
  let raw;
639
648
  try {
640
- raw = JSON.parse(readFile(file));
649
+ content = readFile(file);
650
+ raw = JSON.parse(content);
641
651
  } catch (err) {
642
652
  writeErr(` mcp: ignoring malformed ${file} (${err.message})\n`);
643
653
  continue;
644
654
  }
655
+ if (trust) {
656
+ try {
657
+ const check = trust.checkProjectMcpTrust(file, content);
658
+ if (check.status === "changed") {
659
+ if (trust.projectMcpRetrustRequested(env)) {
660
+ trust.recordProjectMcpTrust(file, content);
661
+ writeErr(` mcp: ${file} re-trusted (CC_PROJECT_MCP_TRUST).\n`);
662
+ } else {
663
+ writeErr(
664
+ ` mcp: SKIPPING ${file} — its content changed since it was last trusted. ` +
665
+ `Review the diff, then re-trust with CC_PROJECT_MCP_TRUST=1 or \`cc mcp trust-project\`.\n`,
666
+ );
667
+ continue;
668
+ }
669
+ } else if (check.status === "first-use") {
670
+ trust.recordProjectMcpTrust(file, content);
671
+ }
672
+ } catch {
673
+ /* trust bookkeeping is best-effort; the opt-in gate above still holds */
674
+ }
675
+ }
645
676
  const parsed = parseMcpServers(raw);
646
677
  if (Object.keys(parsed).length > 0) {
647
678
  Object.assign(servers, parsed); // later file (cwd) overrides earlier (root)
@@ -1 +0,0 @@
1
- import{I as n,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as b}from"./vendor-Bn1JzzAn.js";import{_ as v,b as m}from"./index-Cod97Urs.js";import{a8 as y,M}from"./icons-DG5UD-6K.js";const B={__name:"MobileProjects",setup(p,{expose:i}){i();const c=u(),{t:e}=m();function a(){c.push("/projects")}function _(){c.push("/mobile-bridge")}const s={router:c,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return m},get MobileOutlined(){return M},get FolderOutlined(){return y}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},x={class:"mobile-projects-placeholder"},O={class:"title"},T={class:"subtitle"},k={class:"explainer"};function w(p,i,c,e,a,_){const s=n("a-alert"),d=n("a-button"),f=n("a-space"),P=n("a-empty"),j=n("a-card");return h(),g("div",x,[l(j,null,{default:r(()=>[l(P,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",T,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",k,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),b(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),b(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const I=v(B,[["render",w],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-o6vTWF/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{I as default};
@@ -1 +0,0 @@
1
- import{I as w,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as o}from"./vendor-Bn1JzzAn.js";import{_ as S}from"./index-Cod97Urs.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const a=p,e=o(()=>a.event.content||{}),d=o(()=>a.event.extra||{}),m=o(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=o(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=o(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=o(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=o(()=>e.value.status||e.value.state),b=o(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=o(()=>{if(!a.event.occurredAt)return"";const t=new Date(a.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:a,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:o};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},R={class:"val"},B={class:"row"},D={class:"val"},F={class:"row amount-row"},I={class:"val amount"},j={key:0,class:"row"},A={class:"val mono"},M={key:1,class:"row"};function P(p,r,a,e,d,m){const c=w("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(a.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(a.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",R,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",F,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",I,n(e.amountText),1)]),e.orderNo?(l(),u("div",j,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",A,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",M,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const K=S(k,[["render",P],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-o6vTWF/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{K 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-Cod97Urs.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),h=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,h.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);h.value=Array.isArray(f?.files)?f.files:[]}catch{h.value=[]}finally{k.value=!1}}async function H(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function X(){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:""}),A=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:""},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){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:h,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:A,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"}},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"],Ee={key:0,style:{color:"#888","font-size":"12px"}};function Le(se,l,te,e,W,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),h=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=i("a-input-search"),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"),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(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(),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(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(()=>[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(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(),I("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(()=>[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",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-o6vTWF/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-Cod97Urs.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-DP6Pcu3m.js";import{a0 as t}from"./index-Cod97Urs.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-dG4EzUQo.js";import"./useFlexGapSupport-BWfna_rd.js";import"./styleChecker-D6kP-mMK.js";import"./index-Bbc2JeQG.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-voPJ9fUZ.js";import{a0 as t}from"./index-Cod97Urs.js";import"./vendor-Bn1JzzAn.js";import"./index-Bbc2JeQG.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};