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.
- package/README.md +1 -1
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-ByIiF5bT.js → AIOps-CkRHjW8e.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-NlgSFZq5.js → ActionButton-BP3MeNi2.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D17cOUcb.js → Analytics-CjbjQsOr.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-B4mEZcbl.js → AppLayout-i0adH1M8.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CASsmyQw.js → Artifacts-CCCG2GOU.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DYAia2e2.js → Audit-DrsgvwHC.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-C1lvYUSu.js → BackgroundAgents-DkXNkbZM.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B6agK6bA.js → Backup-DarTWCex.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DM43R2vy.js → BaseInput-DaDzhcto.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Dtdp3eXp.js → Chat-C4EzGw6V.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BL5c_OQ1.js → ChatBubbleRenderer-lkavIWMS.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-D2xf7uZt.js → Checkbox-gddNgaQi.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-D3j45jJL.js → Codegen-BKldFWf9.js} +1 -1
- package/src/assets/web-panel/assets/{Col-voPJ9fUZ.js → Col-ChR-brDs.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DEsyTESF.js → Community-DlHtZX86.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-OHV_QXLD.js → Compact-BAhfcBpC.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-eDTJWC-J.js → Compliance-gIrKkm6m.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BBvy-6d1.js → Cowork-BYnzLBO3.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-Dw2eoJxu.js → Cron-ByUDIljI.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DQHms_Bh.js → Crosschain-DOdNbHFp.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Cyu7Id1c.js → DID-BJHaNWD2.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-sIDzkG92.js → Dashboard-Drm_tClz.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DUW3T2ey.js → Dropdown-CA1WLzGN.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CECELXW8.js → EmailListRenderer-Di1SKjNO.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BIZR37ov.js → FamilyGuardDashboard-44Ve7ZFe.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BEZIQX84.js → Federation-CubPwv_N.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BcdUMznL.js → FormItemContext-CsUFe5bU.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DsN_fr5H.js → GenericCardRenderer-D7xRjPjZ.js} +1 -1
- package/src/assets/web-panel/assets/{Git-63LhjBx2.js → Git-D-Qx9dhO.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CYtQtIcH.js → Governance-_YMYaU4n.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BwR6UUox.js → Inference-J7Yzh-K_.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-D9lVNTUA.js → KnowledgeGraph-D37iI_Mo.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C4q5h7Ut.js → Logs-oMTSYfGY.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-DexLlXfN.js → MarkdownRenderer-BqaPmC0W.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-Plksliuw.js → Marketplace-DKUqYDaF.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DZUFfeuG.js → McpTools-BEv3Gx61.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-NoDYt29V.js → Memory-CtA8XD2y.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CEXGTkdh.js → MobileBridge-ug7c1mMj.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BpX5g9It.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-DTAa0cwy.js → Mtc-WJaMs4i2.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-CVV7LnNS.js → MtcAudit-DXnK_-ru.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BqqGrjt_.js → Multisig-C4Ev7726.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-C4WP8DRp.js → NLProgramming-BMFb9_zk.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Zo4DJUVI.js → Notes-Bl93nvBX.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DBcjRaz2.js → NotificationSettings-BN2W5cl6.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Dxc9oN4o.js +1 -0
- package/src/assets/web-panel/assets/{Organization-BT9WPBOX.js → Organization-CAs48637.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-D6b4bZ3q.js → Overflow-Bhq27Zoc.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Cw3OsYx-.js → P2P-D61-2542.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-C0nyiK2b.js → PdhVaultBrowser-C1j4iUxz.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-zVBZEB_C.js → Permissions-rJ2-fScM.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-BOspsFew.js → PersonalDataHub-DFIlTok6.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-CQWfZ4XH.js → Pipeline-BjIgEWoZ.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-C2oGJ_WL.js → Privacy-BQoH5wcX.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BZMR4qY1.js → ProjectInit-CYR_-_Ub.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DAujoP63.js → ProjectSettings-nkatCq-9.js} +2 -2
- package/src/assets/web-panel/assets/Projects-SS9uZKCl.js +1 -0
- package/src/assets/web-panel/assets/{Providers-D_RGHM-v.js → Providers-BnKM9fsF.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Mf6KfL2J.js → QrScannerModal-Cfe82dbz.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-5D8URoI_.js → QuickAsk-r1RbPufV.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Df4kC8Gy.js → Recommend-CjCbM2WE.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DGi3f3vO.js → RemoteSession-BuMGPH6V.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-jmkGFNWb.js → Reputation-Bmj3NY1F.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DP6Pcu3m.js → Row-BIsNcE_1.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-D60hSuPO.js → RssFeed-BObmojD2.js} +3 -3
- package/src/assets/web-panel/assets/{Search-0mf1BQUK.js → Search-BRmbkQNS.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CfZtLFYV.js → Security-_rF3DRpY.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D9zpZLWz.js → Services-D0If9ZV4.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-D1_44eMD.js → Skeleton-o7zIksUg.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-cVFa8zkz.js → Skills-oUR7zi9u.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Cinpzc3L.js → Sla-fqKyGi03.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-bqdiJE_P.js → SpeechSettings-B1wZ_gxx.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Dgl_SLgj.js → SyncSettings-B3qJWYXq.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DawWAEhy.js → Tasks-BH5_dUfr.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Ca0nY651.js → Templates-CCIVpjRP.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CgaGEhLm.js → Tenant-2GZtTGnB.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D-9EnpRx.js → Terminal-BlMkfs_u.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CSOxDHZ6.js → TimelineRenderer-U6hi5OMc.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BpwLZpL3.js → Tokens-C-_BerGJ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DgowwBK5.js → Trigger-DaKzBgN3.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BZutapjE.js → Trust-CLvcsco3.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-QZPt8_Sp.js → UkeySign-BFn_Y1zZ.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DlQx5UDJ.js → VideoEditing-B0V18dLT.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-ZfdTgtWA.js → Wallet-BbmP7Imu.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-CAp0y_Cr.js → WebAuthn-Dewj_0kt.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-BVITZEmr.js → WorkflowEditor-DOxz3Lwa.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CC2tPaNg.js → chat-B1OIpZnh.js} +1 -1
- package/src/assets/web-panel/assets/{colors-31brc9CA.js → colors-CSGNVdri.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DLMkC9C-.js → compact-item-8S0vcg0u.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BMtveI6F.js → createContext-vZyc27TN.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DYEZcY55.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DbD6WHW2.js → hasIn-DWw3-UhA.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dm0byjm1.js → index-B4pP2ycr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEXa-4zd.js → index-BDHyovnK.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_eUKGYP.js → index-BKEmQQvR.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOM-VFlv.js → index-BQssf0EQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-bdaJwTXJ.js → index-BZnauCqN.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cwbqh0KZ.js → index-BdyokEau.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJvxFyIz.js → index-BeBv896m.js} +1 -1
- package/src/assets/web-panel/assets/{index-DndNnYc0.js → index-BjC-TrOb.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWgfipcC.js → index-BkWd6YL7.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7cV0tu0.js → index-BoIPHP4R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcVszn2b.js → index-BuB5P0TR.js} +1 -1
- package/src/assets/web-panel/assets/{index-COHHQ9cU.js → index-BwKrTVV0.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1PfeI88.js → index-C6r27A-o.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cod97Urs.js → index-CB2MOS_8.js} +3 -3
- package/src/assets/web-panel/assets/{index-CEwjBA9q.js → index-CFQWZvak.js} +1 -1
- package/src/assets/web-panel/assets/{index-D67kIagl.js → index-CI3slBKI.js} +1 -1
- package/src/assets/web-panel/assets/{index-jG6h22Qg.js → index-CJgKP2cm.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZl-UXB6.js → index-CLPr2vC_.js} +1 -1
- package/src/assets/web-panel/assets/{index-ntVQqSML.js → index-CbZqw7pg.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-cGlCDW.js → index-CfEvacz7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFRLmCR3.js → index-CwXBblm-.js} +1 -1
- package/src/assets/web-panel/assets/{index-AaIKG60c.js → index-D1i_8oop.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPpS-lGb.js → index-D8qXVfoV.js} +1 -1
- package/src/assets/web-panel/assets/{index-WQUO2vvK.js → index-DKwl1AkQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUmLMFsy.js → index-DLAvUtOH.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bbc2JeQG.js → index-DLgkAhEE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKAB6-6V.js → index-DPgY5GLy.js} +1 -1
- package/src/assets/web-panel/assets/{index-ALvoNTRF.js → index-Dc40pX3F.js} +1 -1
- package/src/assets/web-panel/assets/{index-ep6JchNG.js → index-DcfLXAW7.js} +1 -1
- package/src/assets/web-panel/assets/{index-C21pdBqs.js → index-DeCS12Mh.js} +1 -1
- package/src/assets/web-panel/assets/{index-3oBsXZmF.js → index-Dg0Izipr.js} +1 -1
- package/src/assets/web-panel/assets/index-DmVFfcNR.js +1 -0
- package/src/assets/web-panel/assets/{index-BnFLzejT.js → index-DtHWHJnj.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7LHNw_N.js → index-Q6oyLnKC.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoO4WEJB.js → index-dxocDVD_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiRQUoyE.js → index-t-q3rkVm.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFXKbOek.js → index-tr1x96W9.js} +1 -1
- package/src/assets/web-panel/assets/index-x7YyhMUa.js +1 -0
- package/src/assets/web-panel/assets/{index-CJhREOlG.js → index-xx5M5Rbj.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D5UoBRhN.js → initDefaultProps-Di5YFId0.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DltOw0CR.js → motion-BVSN0aeL.js} +1 -1
- package/src/assets/web-panel/assets/{move-_oPkk5zj.js → move-DHNiaP2l.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-EES8ROCS.js → mtc-parser-xJPf3gQD.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B-_39x_M.js → omit-C7qzUdkN.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-l6D0yJHz.js → pickAttrs-pSpjg3Le.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DIeUK31L.js → placementArrow-cs_jL_UC.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-dG4EzUQo.js → responsiveObserve-DkS_Zs4r.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DWFzYGdH.js → slide-B5O1Kpxo.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CECdTA5H.js → statusUtils-BX02GnZp.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-D6kP-mMK.js → styleChecker-EmBYRftd.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BWfna_rd.js → useFlexGapSupport-ZGzN1cU8.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Bb-j6rzo.js → useFs-CfP7M1m7.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-D5OIsYM4.js → usePersonalDataHub-CbIPHgNh.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DNpwzFTM.js → vnode-7xh0If_O.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-vNLpFQBW.js → zoom-DmitvTR2.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +65 -6
- package/src/commands/background-session.js +30 -0
- package/src/commands/mcp.js +46 -0
- package/src/commands/session.js +70 -0
- package/src/data/changelog.json +7 -2
- package/src/harness/jsonl-session-store.js +70 -1
- package/src/harness/mcp-client.js +50 -0
- package/src/lib/agent-sandbox.js +68 -0
- package/src/lib/agents.js +12 -4
- package/src/lib/api-key-helper.js +62 -0
- package/src/lib/background-agent-supervisor.js +32 -0
- package/src/lib/dependency-install-policy.js +130 -0
- package/src/lib/exit-codes.cjs +77 -0
- package/src/lib/headless-manifest.js +175 -0
- package/src/lib/hook-runner.cjs +70 -4
- package/src/lib/ide-context-redaction.js +130 -0
- package/src/lib/ide-context.js +89 -13
- package/src/lib/jsonl-session-store.js +2 -0
- package/src/lib/llm-config-defaults.js +24 -8
- package/src/lib/project-mcp-trust.js +87 -0
- package/src/lib/sensitive-file-guard.js +51 -0
- package/src/lib/sub-agent-context.js +7 -3
- package/src/runtime/agent-core.js +102 -6
- package/src/runtime/coding-agent-contract-shared.cjs +19 -2
- package/src/runtime/headless-runner.js +66 -7
- package/src/runtime/headless-stream.js +29 -1
- package/src/runtime/mcp-config.js +32 -1
- package/src/assets/web-panel/assets/MobileProjects-DnbJkbZo.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BCQel9bD.js +0 -1
- package/src/assets/web-panel/assets/Projects-DvH_P2Uq.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CB8pPOtd.js +0 -1
- package/src/assets/web-panel/assets/index-BhXiaiev.js +0 -1
- 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
|
|
677
|
-
- Scripts
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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 } =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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};
|