chainlesschain 0.166.77 → 0.166.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -8
- package/completions/_cc +1 -1
- package/completions/cc.bash +1 -1
- package/completions/cc.fish +1 -1
- package/completions/cc.ps1 +1 -1
- package/package.json +1 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +10 -0
- package/src/assets/linux-subreaper/linux-arm64/supervisor +0 -0
- package/src/assets/linux-subreaper/linux-x64/manifest.json +10 -0
- package/src/assets/linux-subreaper/linux-x64/supervisor +0 -0
- package/src/assets/web-panel/assets/{AIOps-CpiCBhRh.js → AIOps-CwD6Pm_Y.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CnU-Xvx-.js → ActionButton-Du5Rp-O6.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BJW-CNtf.js → Analytics-DY9l72ma.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-UFQJL3G9.js → AppLayout-7t1WIaCJ.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Dr_IUDoY.js → Artifacts-BLIA5yny.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-aglWo6rr.js → Audit-BC_N0QTg.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-Dm_TCiXC.js → BackgroundAgents-CA7SxDtg.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DUdX4-gA.js → Backup-BZ4AzS1_.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BTcLjy1o.js → BaseInput-BhiggGaH.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Bhy9qZrl.js → Chat-CDdBoIBI.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-hsBsrl31.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-CblrPa21.js → Checkbox-asoMKSEK.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-SEAHzOlr.js → Codegen-B0gElLdm.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DJz8iFOR.js → Col-DrNzLpF6.js} +1 -1
- package/src/assets/web-panel/assets/{Community-RufKhcQt.js → Community-DCzB5qkI.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Dlifx08U.js → Compact-Db-Eua_j.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DdhQWcHh.js → Compliance-B76NByjl.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BLNn6oOm.js → Cowork-C-nK6Qpk.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Dv-JWY2d.js → Cron-C-GlQO19.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-k7Pz7O-b.js → Crosschain-Cuuz9IIh.js} +1 -1
- package/src/assets/web-panel/assets/{DID-C_10syUW.js → DID-gwFaT973.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CMyH6Szx.js → Dashboard-DHDt5jEf.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DjmD2Saa.js → Dropdown-CJ9kog-Y.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-36_IRUSo.js → EmailListRenderer-DOSXFRiQ.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-CmtU0XmM.js → EvolutionSettings-CHYMP7rR.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DEgf9kyP.js → FamilyGuardDashboard-C1gzG5EK.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DGO1wQls.js → Federation-CEdNVWUw.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Doj1FmKW.js → FormItemContext-CwVOWPX8.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-GzOU27iT.js → GenericCardRenderer-CgNUs3kT.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Dd7D1EDK.js → Git-DM4MNnQo.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-6IY8LcjI.js → Governance-DdOtjkvd.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BB9gl8q1.js → Inference-28PidFfr.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CeCed5wd.js → KnowledgeGraph-Bpj_qNUK.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CYOeHuaI.js → Logs-C6Ix19Ay.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-Bk8Zqc2R.js → MarkdownRenderer-Bj6mtPbf.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-D-_xgHgM.js → Marketplace-DqkhRSMP.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-NnaUTF5t.js → McpTools-1WQ2SjaE.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CndN9pMt.js → Memory-BWTi7v6R.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BXblFmhY.js → MobileBridge-DB4wu3UE.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CC26Dm2k.js → MobileProjects-Bh9pWx2f.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BhaqWCiW.js → Mtc-BVF1Wrno.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-D6fktM2w.js → MtcAudit-DtNfslPf.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CFvahz7s.js → Multisig-4qcXP0bf.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Co73Ivya.js → NLProgramming-BRJl5Ehw.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-B4g33L1o.js → Notes-BRY_bgMk.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-lXd17EbN.js → NotificationSettings-DirXMFz4.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BiOB0GIi.js → OrderTableRenderer-BlrY8lwu.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-JQ7_wQIA.js → Organization-CVzQ1vO-.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-gwgJgozQ.js → Overflow-A3rXTPG4.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-D9L_0gie.js → P2P-Db9ABWz0.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CbOPsFE9.js → PdhVaultBrowser-CPv0H2OZ.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-Cz42HNQf.js → Permissions-COnW4sIR.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DjorYtrF.js → PersonalDataHub-C1hG7rp7.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-DyWPhmm5.js → Pipeline---GLRDEe.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DyfLMl2j.js → Privacy-aaN9R3Lu.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CyqDx1OE.js → ProjectInit-C-kw49hE.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DsBw0Csy.js → ProjectSettings-y5tTkBTC.js} +2 -2
- package/src/assets/web-panel/assets/Projects-DZHlhyPB.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CCI_klN-.js → Providers-LqxnV72o.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DNsnlDdS.js → QrScannerModal-D_q-Y5F0.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-B9r2iaee.js → QuickAsk-_E_KB5o8.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BJDe03GR.js → Recommend-BN8S5WJA.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-J7JR3rRo.js → RemoteSession-BFzrY_aW.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-DR39AJeV.js → Reputation-C1HCLaTV.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Dh77m3NZ.js → Row-B8T2-Qv7.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BUdg28nJ.js → RssFeed-CNQLk8v1.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BNC7sGhj.js → Search-BOx720Kc.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DISENGI7.js → Security-Ds8z6PF6.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BBBGpJ1-.js → Services-C0-YkRSF.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DMcIoIv2.js → Skeleton-DUHlSySD.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-QAyFbI3r.js → Skills-C8CBbbh0.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CSg5wLH7.js → Sla-lQltyYfB.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DMPxTc5x.js → SpeechSettings-B5vyOma-.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CPG7l30y.js → SyncSettings-BKDPu_y-.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Y1kOVvVL.js → Tasks-Bgvf7LTx.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-jt9NagL0.js → Templates-BMZyYYS7.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DauuJICx.js → Tenant-7PYTig8f.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-E9rnKeGq.js → Terminal-C2W0LMdR.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Cc7z2APG.js → TimelineRenderer-CqREew_l.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CV0UthRA.js → Tokens-BhTyxTuD.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BFcJJGfu.js → Trigger-DxNSSZy_.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BAydbNJA.js → Trust-Dy_wfbIh.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DcOS6sqL.js → UkeySign-DJC5ANqx.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BLHJZvif.js → VideoEditing-CNFevrO4.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-4QFLKHwW.js → Wallet-CXzuS1YK.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-BocEOOSj.js → WebAuthn-BWS6HP8c.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-DCfF7D0B.js → WorkflowEditor-swiN_7Vj.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CxvfsYGr.js → chat-NwH7qlBs.js} +1 -1
- package/src/assets/web-panel/assets/{colors-KtQB9DmQ.js → colors-h6nRhBTw.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Dx4J6arN.js → compact-item-BQ6B6rP2.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Cq0olgzo.js → createContext-CQkJuRcG.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Bz6vqBGV.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Bf9-h3D-.js → hasIn-Diwl1WyI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpO6DKuu.js → index-0ZztPzIm.js} +1 -1
- package/src/assets/web-panel/assets/index-1b7DEw-w.js +1 -0
- package/src/assets/web-panel/assets/{index-DQDR-_ai.js → index-AzeSQJDK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMcC4cbj.js → index-B3QgcUBV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO6XvO-C.js → index-B5gj_uCC.js} +1 -1
- package/src/assets/web-panel/assets/{index-ClUfSChI.js → index-BI3ALCgN.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3xfiItB.js → index-BRl3KUj0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFdEDvFn.js → index-BYYb8oeV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqnggDos.js → index-BcKDUGYf.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_8UcDan.js → index-BcjlIMP9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmQuG0fr.js → index-BheCvudN.js} +1 -1
- package/src/assets/web-panel/assets/{index-iE9tqEN5.js → index-BjcARUtr.js} +1 -1
- package/src/assets/web-panel/assets/{index-nmyDOh_b.js → index-BnQUin2K.js} +1 -1
- package/src/assets/web-panel/assets/{index-Br1mDMfO.js → index-Bs6HyCfP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZWjYfWt.js → index-BvPz6vZ8.js} +1 -1
- package/src/assets/web-panel/assets/{index-0fi8DIVQ.js → index-C3Ye1ISy.js} +1 -1
- package/src/assets/web-panel/assets/{index-hSzyoXri.js → index-C7-T-u0L.js} +3 -3
- package/src/assets/web-panel/assets/{index-DfrFNMvz.js → index-CRWpixu2.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9yaUHm9.js → index-CatBQDSQ.js} +1 -1
- package/src/assets/web-panel/assets/index-CfD4tMuW.js +1 -0
- package/src/assets/web-panel/assets/{index-DMR-keCL.js → index-CqH-oOR3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cy865Hhq.js → index-CwsoVDi-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DI5bRqNG.js → index-CyBtEVLM.js} +1 -1
- package/src/assets/web-panel/assets/{index-gt5N6VM_.js → index-D5P498Rk.js} +1 -1
- package/src/assets/web-panel/assets/{index-6dDDSCHD.js → index-DKaB4xTf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKtQyb2o.js → index-DQYZa1Ci.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaIclw-E.js → index-DZ9CNcbJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-_FIz-0tp.js → index-DZAsByy4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBRlZdZj.js → index-D_HY0nyN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsCdl2Od.js → index-Da8frO_A.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cfsn7N18.js → index-DjB8IC9D.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeYP_kT9.js → index-Dwpthe2b.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8WuPI-h.js → index-Fm95dO4u.js} +1 -1
- package/src/assets/web-panel/assets/{index-CK2U_AHi.js → index-GTefQSbY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnU-dUWd.js → index-OEWSrqit.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDAe1UmZ.js → index-TYMmUsxZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2BfSIrn.js → index-iHNOr_wL.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz7f4Jaq.js → index-mxxZtsHp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHmdMKYl.js → index-pYwYBVeQ.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DvzKJ6o5.js → initDefaultProps-BeUrpC_H.js} +1 -1
- package/src/assets/web-panel/assets/{motion-D1yTvmxW.js → motion-CHW5EXt1.js} +1 -1
- package/src/assets/web-panel/assets/{move-DxtSIF8K.js → move-CWaoWJvF.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BDsQgIHY.js → mtc-parser-CEC6Us1u.js} +1 -1
- package/src/assets/web-panel/assets/{omit-UVBJW8kh.js → omit-1D-kP_Qj.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D4QqtTyX.js → pickAttrs-CsS0myLl.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-QXmu6vBf.js → placementArrow-bMThOvkI.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-D-PmXO9M.js → responsiveObserve-B72knbW8.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CKbGxEZJ.js → slide-C3bI_2yy.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BbgXPkXm.js → statusUtils-0-FmcCAS.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DOr9rk68.js → styleChecker-DXUyqoWY.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-B2wO2r36.js → useFlexGapSupport-BSSnL3f1.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-SeVGBK34.js → useFs-B0Cvvl0S.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DUJBCxjD.js → usePersonalDataHub-6D-d4WU5.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CF4EYsig.js → vnode-zjIrlxT_.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-pRUs5pqI.js → zoom-Hw7NEisu.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/command-manifest.json +1 -1
- package/src/commands/checkpoint.js +42 -7
- package/src/commands/orchestrate.js +85 -25
- package/src/commands/session-location.js +5 -0
- package/src/commands/session-show.js +109 -1
- package/src/commands/session.js +26 -2
- package/src/commands/tokens.js +9 -4
- package/src/data/changelog.json +26 -0
- package/src/generated/cc-agent-protocol.schema.json +71 -0
- package/src/harness/jsonl-session-store.js +357 -114
- package/src/harness/mcp-client.js +44 -1
- package/src/lib/agent-router.js +35 -7
- package/src/lib/agent-sandbox.js +302 -2
- package/src/lib/app-server/server.js +14 -0
- package/src/lib/background-agent-supervisor.js +14 -4
- package/src/lib/causal-observability.js +64 -1
- package/src/lib/checkpoint-summary-projection.js +98 -0
- package/src/lib/checkpoint-timeline-authority.js +15 -51
- package/src/lib/claude-code-bridge.js +302 -60
- package/src/lib/codex-app-server-adapter.js +161 -35
- package/src/lib/cost-budget.js +4 -0
- package/src/lib/doctor-checkup.js +31 -2
- package/src/lib/durable-security-store.js +6 -1
- package/src/lib/evolution/evolution-artifact-identity.js +21 -0
- package/src/lib/evolution/evolution-artifact-ports.js +5 -11
- package/src/lib/evolution/evolution-eval-cohort-receipt-reconciliation.js +389 -0
- package/src/lib/execution-location-failure-site.js +63 -0
- package/src/lib/execution-location-target.js +102 -8
- package/src/lib/external-agent-adapters.js +2 -0
- package/src/lib/image-file-boundary.js +154 -0
- package/src/lib/image-input.js +16 -3
- package/src/lib/llm-pricing.js +114 -8
- package/src/lib/lsp/code-intelligence.js +7 -1
- package/src/lib/mcp-call-ledger-store.js +7 -2
- package/src/lib/model-capabilities.js +21 -10
- package/src/lib/model-context-catalog.js +60 -1
- package/src/lib/openai-responses.js +7 -1
- package/src/lib/orchestrator.js +8 -2
- package/src/lib/process-execution-broker/index.js +93 -1
- package/src/lib/process-execution-broker/linux-subreaper-artifact.js +120 -0
- package/src/lib/process-execution-broker/linux-subreaper-helper.js +344 -0
- package/src/lib/process-execution-broker/linux-subreaper-process.js +326 -0
- package/src/lib/process-execution-broker/linux-subreaper-supervisor.c +360 -0
- package/src/lib/process-execution-broker/owned-posix-process-group-worker.mjs +131 -0
- package/src/lib/process-execution-broker/owned-posix-process-group.js +267 -0
- package/src/lib/process-execution-broker/process-ownership-journal.js +297 -0
- package/src/lib/process-execution-broker/process-ownership-quarantine.js +91 -0
- package/src/lib/runtime-usage-ledger.js +3 -0
- package/src/lib/sandbox-docker-egress.js +507 -0
- package/src/lib/sandbox-egress-proxy.js +167 -10
- package/src/lib/sandbox-egress-worker-thread.js +38 -0
- package/src/lib/sandbox-egress-worker.js +196 -0
- package/src/lib/secure-fs.js +158 -42
- package/src/lib/session-branch-history.js +240 -0
- package/src/lib/session-history-origins.js +285 -0
- package/src/lib/session-input-receipt.js +110 -0
- package/src/lib/session-resource-budget.js +8 -8
- package/src/lib/session-transcript-history.js +456 -0
- package/src/lib/session-transcript-page.js +164 -0
- package/src/lib/session-transcript-reference.js +38 -0
- package/src/lib/session-usage.js +8 -0
- package/src/lib/token-tracker.js +32 -54
- package/src/lib/usage-pricing-context.js +93 -0
- package/src/runtime/agent-core.js +141 -21
- package/src/runtime/headless-stream.js +202 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-D0WrJQaQ.js +0 -1
- package/src/assets/web-panel/assets/Projects-CRaSI25Z.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CmgDNkoO.js +0 -1
- package/src/assets/web-panel/assets/index-BpIZ2S01.js +0 -1
- package/src/assets/web-panel/assets/index-C-VmKuyv.js +0 -1
|
@@ -52,6 +52,12 @@ import {
|
|
|
52
52
|
} from "../lib/policy-decision-event.js";
|
|
53
53
|
import { runWithHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
|
|
54
54
|
import { bootstrap } from "./bootstrap.js";
|
|
55
|
+
import {
|
|
56
|
+
appendSessionInputWithReceipt,
|
|
57
|
+
readSessionInputReceipt,
|
|
58
|
+
inputSubmissionDigest,
|
|
59
|
+
validateClientMessageId,
|
|
60
|
+
} from "../lib/session-input-receipt.js";
|
|
55
61
|
import {
|
|
56
62
|
buildSystemPrompt,
|
|
57
63
|
chatWithTools as coreChatWithTools,
|
|
@@ -78,6 +84,7 @@ import {
|
|
|
78
84
|
buildUserContent,
|
|
79
85
|
resolveVisionLlm,
|
|
80
86
|
} from "../lib/image-input.js";
|
|
87
|
+
import { MAX_INPUT_IMAGES } from "../lib/image-file-boundary.js";
|
|
81
88
|
import {
|
|
82
89
|
buildIdePromptContext,
|
|
83
90
|
expandIdeMentions,
|
|
@@ -115,6 +122,7 @@ import { IterationBudget } from "../lib/iteration-budget.js";
|
|
|
115
122
|
import { CostBudget } from "../lib/cost-budget.js";
|
|
116
123
|
import {
|
|
117
124
|
resolvePermissionMode,
|
|
125
|
+
normalizePermissionMode,
|
|
118
126
|
resolveEnabledTools,
|
|
119
127
|
parseToolList,
|
|
120
128
|
installPipeSafety,
|
|
@@ -171,6 +179,10 @@ import { createMcpHostRecoveryRuntime } from "../lib/mcp-host-recovery-runtime.j
|
|
|
171
179
|
import { operationIdempotencyKey } from "../lib/idempotency.js";
|
|
172
180
|
import { TurnBindingLog, createTurnBindingFeed } from "../lib/turn-binding.js";
|
|
173
181
|
import { TURN_BINDING_EVENT } from "../lib/turn-binding-store.js";
|
|
182
|
+
import {
|
|
183
|
+
transcriptMessageEventId,
|
|
184
|
+
transcriptResultReferences,
|
|
185
|
+
} from "../lib/session-transcript-reference.js";
|
|
174
186
|
import { getPlanModeManager } from "../lib/plan-mode.js";
|
|
175
187
|
import {
|
|
176
188
|
SESSION_SLASH_COMMANDS,
|
|
@@ -710,6 +722,14 @@ export function parseInputEvent(line) {
|
|
|
710
722
|
};
|
|
711
723
|
}
|
|
712
724
|
const msg = obj && typeof obj === "object" ? obj.message || obj : {};
|
|
725
|
+
let clientMessageId;
|
|
726
|
+
if (obj?.client_message_id !== undefined) {
|
|
727
|
+
try {
|
|
728
|
+
clientMessageId = validateClientMessageId(obj.client_message_id);
|
|
729
|
+
} catch (error) {
|
|
730
|
+
return { error: error.message };
|
|
731
|
+
}
|
|
732
|
+
}
|
|
713
733
|
let content = msg.content ?? obj.text ?? obj.prompt;
|
|
714
734
|
if (Array.isArray(content)) {
|
|
715
735
|
content = content
|
|
@@ -738,7 +758,9 @@ export function parseInputEvent(line) {
|
|
|
738
758
|
content = detected.text;
|
|
739
759
|
}
|
|
740
760
|
}
|
|
741
|
-
images = [...new Set(images)]
|
|
761
|
+
images = [...new Set(images)];
|
|
762
|
+
if (images.length > MAX_INPUT_IMAGES)
|
|
763
|
+
return { error: `Attach at most ${MAX_INPUT_IMAGES} images per message` };
|
|
742
764
|
// §3.5.10 接线6: optional per-turn LLM override (PDH privacy-tier switch) —
|
|
743
765
|
// {"type":"user","text":…,"llm":{"provider","model","baseUrl"?,"apiKey"?}}.
|
|
744
766
|
// Switches THIS turn's model (e.g. cloud → your own PC Ollama) without
|
|
@@ -750,6 +772,7 @@ export function parseInputEvent(line) {
|
|
|
750
772
|
// An image-only turn is valid — give the model something to act on.
|
|
751
773
|
if (images.length) {
|
|
752
774
|
const r = { text: "Please look at the attached image(s).", images };
|
|
775
|
+
if (clientMessageId) r.clientMessageId = clientMessageId;
|
|
753
776
|
if (obj.worklog_session_id !== undefined)
|
|
754
777
|
r.worklogSessionId = obj.worklog_session_id;
|
|
755
778
|
if (llm) r.llm = llm;
|
|
@@ -758,6 +781,7 @@ export function parseInputEvent(line) {
|
|
|
758
781
|
return null;
|
|
759
782
|
}
|
|
760
783
|
const result = images.length ? { text: content, images } : { text: content };
|
|
784
|
+
if (clientMessageId) result.clientMessageId = clientMessageId;
|
|
761
785
|
if (obj.worklog_session_id !== undefined)
|
|
762
786
|
result.worklogSessionId = obj.worklog_session_id;
|
|
763
787
|
if (llm) result.llm = llm;
|
|
@@ -2085,6 +2109,12 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2085
2109
|
sessionExists: deps.sessionExists || jsonlSessionExists,
|
|
2086
2110
|
startSession: deps.startSession || jsonlStartSession,
|
|
2087
2111
|
appendUserMessage: deps.appendUserMessage || jsonlAppendUserMessage,
|
|
2112
|
+
appendInputWithReceipt:
|
|
2113
|
+
deps.appendInputWithReceipt ||
|
|
2114
|
+
(hasInjectedSessionStore ? null : appendSessionInputWithReceipt),
|
|
2115
|
+
readInputReceipt:
|
|
2116
|
+
deps.readInputReceipt ||
|
|
2117
|
+
(hasInjectedSessionStore ? null : readSessionInputReceipt),
|
|
2088
2118
|
appendAssistantMessage:
|
|
2089
2119
|
deps.appendAssistantMessage || jsonlAppendAssistantMessage,
|
|
2090
2120
|
appendTokenUsage: deps.appendTokenUsage || jsonlAppendTokenUsage,
|
|
@@ -3106,10 +3136,37 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3106
3136
|
protocol_version: STREAM_PROTOCOL_VERSION,
|
|
3107
3137
|
session_id: sessionId,
|
|
3108
3138
|
session_persistence: persist,
|
|
3139
|
+
input_receipts: {
|
|
3140
|
+
version:
|
|
3141
|
+
persist && store.appendInputWithReceipt && store.readInputReceipt
|
|
3142
|
+
? 1
|
|
3143
|
+
: 0,
|
|
3144
|
+
},
|
|
3109
3145
|
task_worklog: taskWorklog ? { version: 1, path: taskWorklog.file } : null,
|
|
3110
3146
|
model,
|
|
3111
3147
|
provider,
|
|
3112
3148
|
permission_mode: options.permissionMode || "default",
|
|
3149
|
+
// Correlates display state with this exact IDE child. This echo grants no
|
|
3150
|
+
// authority: effective mode is derived only from validated CLI options.
|
|
3151
|
+
...(/^[a-zA-Z0-9-]{1,80}$/.test(process.env.CC_IDE_MODE_REQUEST_ID || "")
|
|
3152
|
+
? {
|
|
3153
|
+
permission_mode_state: {
|
|
3154
|
+
correlation_id: process.env.CC_IDE_MODE_REQUEST_ID,
|
|
3155
|
+
requested: ["default", "acceptEdits", "bypassPermissions"].includes(
|
|
3156
|
+
process.env.CC_IDE_REQUESTED_MODE,
|
|
3157
|
+
)
|
|
3158
|
+
? process.env.CC_IDE_REQUESTED_MODE
|
|
3159
|
+
: "default",
|
|
3160
|
+
effective: normalizePermissionMode(options.permissionMode),
|
|
3161
|
+
policy_revision: computePolicyDigest({
|
|
3162
|
+
permissionMode: options.permissionMode,
|
|
3163
|
+
allowedTools: options.allowedTools,
|
|
3164
|
+
disallowedTools: disabledTools,
|
|
3165
|
+
permissionRules,
|
|
3166
|
+
}),
|
|
3167
|
+
},
|
|
3168
|
+
}
|
|
3169
|
+
: {}),
|
|
3113
3170
|
tools: enabledToolNames,
|
|
3114
3171
|
tools_hash: computeToolsHash(enabledToolNames),
|
|
3115
3172
|
policy_digest: computePolicyDigest({
|
|
@@ -4087,6 +4144,89 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4087
4144
|
continue;
|
|
4088
4145
|
}
|
|
4089
4146
|
|
|
4147
|
+
// Bind the receipt to the submitted input, before commands, hooks, file
|
|
4148
|
+
// expansion or image reads can change it. A repeated ID never replays work.
|
|
4149
|
+
const inputSubmission = parsed.clientMessageId
|
|
4150
|
+
? {
|
|
4151
|
+
text: parsed.text,
|
|
4152
|
+
images: parsed.images || [],
|
|
4153
|
+
llm: parsed.llm || null,
|
|
4154
|
+
worklogSessionId: parsed.worklogSessionId || null,
|
|
4155
|
+
}
|
|
4156
|
+
: null;
|
|
4157
|
+
const acknowledgeInput = (receipt) => {
|
|
4158
|
+
emit({
|
|
4159
|
+
type: "system",
|
|
4160
|
+
subtype: "input_accepted",
|
|
4161
|
+
session_id: sessionId,
|
|
4162
|
+
client_message_id: parsed.clientMessageId,
|
|
4163
|
+
receipt,
|
|
4164
|
+
});
|
|
4165
|
+
if (receipt.duplicate)
|
|
4166
|
+
emit({
|
|
4167
|
+
type: "result",
|
|
4168
|
+
subtype: "input_already_accepted",
|
|
4169
|
+
is_error: false,
|
|
4170
|
+
session_id: sessionId,
|
|
4171
|
+
client_message_id: parsed.clientMessageId,
|
|
4172
|
+
execution_status: "not-reexecuted",
|
|
4173
|
+
result:
|
|
4174
|
+
"Input was already accepted. No work was re-executed; inspect the session for its outcome.",
|
|
4175
|
+
});
|
|
4176
|
+
};
|
|
4177
|
+
if (parsed.clientMessageId) {
|
|
4178
|
+
if (
|
|
4179
|
+
!persist ||
|
|
4180
|
+
!store.appendInputWithReceipt ||
|
|
4181
|
+
!store.readInputReceipt
|
|
4182
|
+
) {
|
|
4183
|
+
emit({
|
|
4184
|
+
type: "result",
|
|
4185
|
+
subtype: "error_input_receipt",
|
|
4186
|
+
is_error: true,
|
|
4187
|
+
session_id: sessionId,
|
|
4188
|
+
client_message_id: parsed.clientMessageId,
|
|
4189
|
+
acceptance: "rejected",
|
|
4190
|
+
error: "Durable input receipts require canonical session persistence",
|
|
4191
|
+
});
|
|
4192
|
+
sawError = true;
|
|
4193
|
+
continue;
|
|
4194
|
+
}
|
|
4195
|
+
try {
|
|
4196
|
+
const prior = requireSynchronousRecoveryResult(
|
|
4197
|
+
store.readInputReceipt(sessionId, parsed.clientMessageId),
|
|
4198
|
+
"readInputReceipt",
|
|
4199
|
+
);
|
|
4200
|
+
if (prior?.accepted) {
|
|
4201
|
+
const receipt = prior.receipt;
|
|
4202
|
+
if (
|
|
4203
|
+
!/^[a-f0-9]{64}$/u.test(receipt?.eventHash || "") ||
|
|
4204
|
+
receipt.sessionId !== sessionId ||
|
|
4205
|
+
receipt.clientMessageId !== parsed.clientMessageId ||
|
|
4206
|
+
receipt.inputDigest !== inputSubmissionDigest(inputSubmission)
|
|
4207
|
+
)
|
|
4208
|
+
throw new Error("Input receipt conflicts with submission");
|
|
4209
|
+
acknowledgeInput({ ...receipt, duplicate: true });
|
|
4210
|
+
continue;
|
|
4211
|
+
}
|
|
4212
|
+
if (prior?.accepted !== false)
|
|
4213
|
+
throw new Error("Invalid input receipt lookup");
|
|
4214
|
+
} catch {
|
|
4215
|
+
emit({
|
|
4216
|
+
type: "result",
|
|
4217
|
+
subtype: "error_input_receipt",
|
|
4218
|
+
is_error: true,
|
|
4219
|
+
session_id: sessionId,
|
|
4220
|
+
client_message_id: parsed.clientMessageId,
|
|
4221
|
+
acceptance: "unknown",
|
|
4222
|
+
error:
|
|
4223
|
+
"Cannot verify input acceptance; inspect the canonical session before sending again",
|
|
4224
|
+
});
|
|
4225
|
+
sawError = true;
|
|
4226
|
+
continue;
|
|
4227
|
+
}
|
|
4228
|
+
}
|
|
4229
|
+
|
|
4090
4230
|
// Manual `/compact` uses the same provider-backed structured handoff as the
|
|
4091
4231
|
// other long-lived hosts. Provider/schema failures degrade to the shared
|
|
4092
4232
|
// extractive handoff instead of silently dropping all but recent turns.
|
|
@@ -4879,11 +5019,38 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4879
5019
|
else turnContent = [{ type: "text", text: historyPart }, ...turnContent];
|
|
4880
5020
|
}
|
|
4881
5021
|
updateWorklog((log) => log.user(parsed.text));
|
|
4882
|
-
messages.push({ role: "user", content: turnContent });
|
|
4883
5022
|
let persistenceFailure = null;
|
|
5023
|
+
let inputReceipt = null;
|
|
5024
|
+
let userEventId = null;
|
|
4884
5025
|
if (persist) {
|
|
4885
5026
|
try {
|
|
4886
|
-
|
|
5027
|
+
if (parsed.clientMessageId) {
|
|
5028
|
+
if (!store.appendInputWithReceipt)
|
|
5029
|
+
throw new Error("Durable input receipts are unavailable");
|
|
5030
|
+
inputReceipt = requireSynchronousRecoveryResult(
|
|
5031
|
+
store.appendInputWithReceipt(
|
|
5032
|
+
sessionId,
|
|
5033
|
+
turnContent,
|
|
5034
|
+
parsed.clientMessageId,
|
|
5035
|
+
inputSubmission,
|
|
5036
|
+
),
|
|
5037
|
+
"appendInputWithReceipt",
|
|
5038
|
+
);
|
|
5039
|
+
if (
|
|
5040
|
+
!/^[a-f0-9]{64}$/u.test(inputReceipt?.eventHash || "") ||
|
|
5041
|
+
inputReceipt.sessionId !== sessionId ||
|
|
5042
|
+
inputReceipt.clientMessageId !== parsed.clientMessageId ||
|
|
5043
|
+
inputReceipt.inputDigest !==
|
|
5044
|
+
inputSubmissionDigest(inputSubmission) ||
|
|
5045
|
+
typeof inputReceipt.duplicate !== "boolean"
|
|
5046
|
+
)
|
|
5047
|
+
throw new Error("Invalid durable input receipt");
|
|
5048
|
+
userEventId = inputReceipt.eventHash;
|
|
5049
|
+
} else {
|
|
5050
|
+
userEventId = transcriptMessageEventId(
|
|
5051
|
+
store.appendUserMessage(sessionId, turnContent),
|
|
5052
|
+
);
|
|
5053
|
+
}
|
|
4887
5054
|
} catch (error) {
|
|
4888
5055
|
const persistenceError = createSessionPersistenceFailure(error, {
|
|
4889
5056
|
sessionId,
|
|
@@ -4893,6 +5060,20 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4893
5060
|
persistenceError,
|
|
4894
5061
|
{ phase: "before-model" },
|
|
4895
5062
|
);
|
|
5063
|
+
if (parsed.clientMessageId && !persistenceFailure) {
|
|
5064
|
+
emit({
|
|
5065
|
+
type: "result",
|
|
5066
|
+
subtype: "error_input_receipt",
|
|
5067
|
+
is_error: true,
|
|
5068
|
+
session_id: sessionId,
|
|
5069
|
+
client_message_id: parsed.clientMessageId,
|
|
5070
|
+
acceptance: "unknown",
|
|
5071
|
+
error:
|
|
5072
|
+
"Cannot verify durable input append; inspect the canonical session before sending again",
|
|
5073
|
+
});
|
|
5074
|
+
sawError = true;
|
|
5075
|
+
break;
|
|
5076
|
+
}
|
|
4896
5077
|
if (persistenceFailure) {
|
|
4897
5078
|
try {
|
|
4898
5079
|
deps.onPersistenceFailure?.(persistenceFailure);
|
|
@@ -4902,6 +5083,11 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4902
5083
|
}
|
|
4903
5084
|
}
|
|
4904
5085
|
}
|
|
5086
|
+
if (inputReceipt && !persistenceFailure) {
|
|
5087
|
+
acknowledgeInput(inputReceipt);
|
|
5088
|
+
if (inputReceipt.duplicate) continue; // Never re-run an accepted input.
|
|
5089
|
+
}
|
|
5090
|
+
messages.push({ role: "user", content: turnContent });
|
|
4905
5091
|
turns += 1;
|
|
4906
5092
|
approvalGrantLedger.beginTurn(turns);
|
|
4907
5093
|
if (persistenceFailure) {
|
|
@@ -5215,9 +5401,12 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
5215
5401
|
|
|
5216
5402
|
// Grow the conversation so the next turn has context.
|
|
5217
5403
|
messages.push({ role: "assistant", content: outcome.finalText });
|
|
5404
|
+
let assistantEventId = null;
|
|
5218
5405
|
if (persist) {
|
|
5219
5406
|
try {
|
|
5220
|
-
|
|
5407
|
+
assistantEventId = transcriptMessageEventId(
|
|
5408
|
+
store.appendAssistantMessage(sessionId, outcome.finalText),
|
|
5409
|
+
);
|
|
5221
5410
|
} catch (error) {
|
|
5222
5411
|
const persistenceError = createSessionPersistenceFailure(error, {
|
|
5223
5412
|
sessionId,
|
|
@@ -5248,6 +5437,14 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
5248
5437
|
outcome.endReason === "no-response" ||
|
|
5249
5438
|
Boolean(persistenceFailure);
|
|
5250
5439
|
if (isError) sawError = true;
|
|
5440
|
+
const transcriptRefs = !persistenceFailure
|
|
5441
|
+
? transcriptResultReferences({
|
|
5442
|
+
sessionId,
|
|
5443
|
+
userEventId,
|
|
5444
|
+
assistantEventId,
|
|
5445
|
+
clientMessageId: parsed.clientMessageId || null,
|
|
5446
|
+
})
|
|
5447
|
+
: null;
|
|
5251
5448
|
|
|
5252
5449
|
if (costStopped) {
|
|
5253
5450
|
emit({
|
|
@@ -5275,6 +5472,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
5275
5472
|
session_id: sessionId,
|
|
5276
5473
|
turn: turns,
|
|
5277
5474
|
usage: outcome.usage,
|
|
5475
|
+
...(transcriptRefs ? { transcript_refs: transcriptRefs } : {}),
|
|
5278
5476
|
...(persistenceFailure ? { persistence: persistenceFailure } : {}),
|
|
5279
5477
|
});
|
|
5280
5478
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as v,P as u,J as S,U as n,R as a,S as y,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-hSzyoXri.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},R={class:"bubble"},T={class:"meta"},D={class:"actor"},L={class:"time"},M={class:"body"};function V(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",R,[n("div",T,[n("span",D,a(r.actorLabel),1),n("span",L,a(r.formattedTime),1)]),n("div",M,a(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(N,[["render",V],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-6ZYRLD/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as i,J as I,U,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-Bn1JzzAn.js";import{_ as we,b as re,u as ie,d}from"./index-hSzyoXri.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as Fe,aP as be,f as je,a5 as Ce,a8 as xe,at as Oe,R as Se}from"./icons-DG5UD-6K.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:W}=de();async function w(o,f,ye,ae=8e3){if(W){const X=await e.sendRaw({...f,type:o},ae);if(!X?.ok){const $=X?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return X.result}return e.executeJson(ye,ae)}const B=u(!1),y=u([]),O=u(""),S=u(""),P=u(!1),v=u(null),h=u([]),k=u(!1),L=u(!1),E=u(!1),F=u({name:"",description:"",type:"document",rootPath:""}),z=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],V=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),J=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function K(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function Q(o){return!o&&o!==0?"-":new Date(typeof o=="number"?o:parseInt(o,10)).toLocaleString("zh-CN",{hour12:!1})}async function C(){B.value=!0;try{const o=await w("project.list",{limit:500},"project list --limit 500 --json",1e4);y.value=Array.isArray(o?.projects)?o.projects:Array.isArray(o)?o:[]}catch(o){d.error("加载失败: "+(o.message||o)),y.value=[]}finally{B.value=!1}}function Y(o){return{onClick:()=>M(o)}}async function M(o){v.value=o,P.value=!0,k.value=!0,h.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);h.value=Array.isArray(f?.files)?f.files:[]}catch{h.value=[]}finally{k.value=!1}}async function Z(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function G(){F.value={name:"",description:"",type:"document",rootPath:""},L.value=!0}async function T(){if(!F.value.name.trim()){d.warning("请输入项目名称");return}E.value=!0;try{const o=await w("project.init",{name:F.value.name.trim(),description:F.value.description||null,projectType:F.value.type,rootPath:F.value.rootPath||null},`project init "${F.value.name.trim()}" --type ${F.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),L.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{E.value=!1}}const b=u(!1),D=u(!1),j=u({path:"",content:""}),A=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),H=u(!1);function ue(){j.value={path:"",content:""},b.value=!0}function ce(){R.value={path:""},A.value=!0}async function N(){if(v.value){k.value=!0;try{const o=await w("project.listFiles",{projectId:v.value.id,limit:200},`project list-files ${v.value.id} --json`,8e3);h.value=Array.isArray(o?.files)?o.files:[]}catch(o){d.error("刷新文件失败: "+(o.message||o))}finally{k.value=!1}}}async function fe(){if(!j.value.path.trim()){d.warning("请输入文件路径");return}if(v.value){D.value=!0;try{const o=await w("project.createFile",{projectId:v.value.id,filePath:j.value.path.trim(),content:j.value.content||""},`project create-file ${v.value.id} "${j.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件 '${o.file_name}'`),b.value=!1,await N(),await C()):d.error("创建文件失败")}catch(o){d.error(o.message||String(o))}finally{D.value=!1}}}async function pe(){if(!R.value.path.trim()){d.warning("请输入文件夹路径");return}if(v.value){m.value=!0;try{const o=await w("project.createFolder",{projectId:v.value.id,folderPath:R.value.path.trim()},`project create-folder ${v.value.id} "${R.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件夹 '${o.file_name}'`),A.value=!1,await N(),await C()):d.error("创建文件夹失败")}catch(o){d.error(o.message||String(o))}finally{m.value=!1}}}async function ve(o){try{(await w("project.deleteFile",{fileId:o.id},`project delete-file ${o.id} --json`,8e3))?.deleted?(d.success(`已删除 '${o.file_name}'`),await N(),await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}async function me(o){if(o.is_folder){d.info("文件夹无内容可编辑");return}try{const f=await w("project.getFile",{fileId:o.id},`project get-file ${o.id} --json`,8e3);c.value=o,q.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){H.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:q.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await N()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{H.value=!1}}}oe(()=>{C()});const le={t:te,ws:e,isEmbedded:W,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:h,filesLoading:k,createOpen:L,creating:E,newProject:F,columns:z,countByStatus:V,filteredProjects:J,statusColor:g,syncColor:K,formatTime:Q,loadAll:C,onRowClick:Y,openDetail:M,onDelete:Z,onShowCreate:G,onCreate:T,createFileOpen:b,creatingFile:D,newFile:j,createFolderOpen:A,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:H,openCreateFile:ue,openCreateFolder:ce,refreshFiles:N,onCreateFile:fe,onCreateFolder:pe,onDeleteFile:ve,openEditFile:me,onSaveFile:_e,ref:u,computed:ee,onMounted:oe,get ReloadOutlined(){return Se},get PlusOutlined(){return Oe},get FolderOutlined(){return xe},get FileTextOutlined(){return Ce},get CheckCircleOutlined(){return je},get CheckSquareOutlined(){return be},get FileAddOutlined(){return Fe},get FolderAddOutlined(){return ke},get message(){return d},get useI18n(){return re},get useWsStore(){return ie},get useShellMode(){return de}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ae={class:"page-title"},Ie={class:"page-sub"},Ue={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},he={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Te={key:1,style:{color:"#888"}},Be=["onClick"],Le={key:0,style:{color:"#888","font-size":"12px"}};function Ee(se,l,te,e,W,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),h=i("a-row"),k=i("a-radio-button"),L=i("a-radio-group"),E=i("a-input-search"),F=i("a-alert"),z=i("a-tag"),V=i("a-popconfirm"),J=i("a-table"),g=i("a-descriptions-item"),K=i("a-descriptions"),Q=i("a-divider"),C=i("a-empty"),Y=i("a-list-item"),M=i("a-list"),Z=i("a-spin"),G=i("a-drawer"),T=i("a-input"),b=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),A=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),I("div",null,[U("div",ze,[U("div",null,[U("h2",Ae,s(e.t("projects.title")),1),U("p",Ie,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(h,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),U("div",Ue,[t(L,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(E,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(F,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(J,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),I("code",he,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),I(ne,{key:1},[U("strong",null,s(c.name),1),c.description?(p(),I("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),I(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:q=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(V,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(G,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(K,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[U("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),I("code",Re,s(e.detail.root_path),1)):(p(),I("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(Q,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(Z,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(M,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(Y,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),I("span",Le,s(n.file_size)+" B",1)):_("v-if",!0),t(V,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[U("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(A,{open:e.createFileOpen,"onUpdate:open":l[6]||(l[6]=n=>e.createFileOpen=n),title:"新建文件","confirm-loading":e.creatingFile,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFile},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFile.path,"onUpdate:value":l[4]||(l[4]=n=>e.newFile.path=n),placeholder:"例如 README.md 或 src/main.kt"},null,8,["value"])]),_:1}),t(b,{label:"初始内容(可选)"},{default:a(()=>[t(D,{value:e.newFile.content,"onUpdate:value":l[5]||(l[5]=n=>e.newFile.content=n),rows:6,placeholder:"留空创建空文件"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Create folder modal "),t(A,{open:e.createFolderOpen,"onUpdate:open":l[8]||(l[8]=n=>e.createFolderOpen=n),title:"新建文件夹","confirm-loading":e.creatingFolder,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFolder},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件夹路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFolder.path,"onUpdate:value":l[7]||(l[7]=n=>e.newFolder.path=n),placeholder:"例如 src/utils"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Edit file content modal "),t(A,{open:e.editFileOpen,"onUpdate:open":l[10]||(l[10]=n=>e.editFileOpen=n),title:`编辑 ${e.editingFile?.file_name||""}`,"confirm-loading":e.savingFile,"ok-text":"保存","cancel-text":"取消",onOk:e.onSaveFile,width:"720"},{default:a(()=>[t(D,{value:e.editFileContent,"onUpdate:value":l[9]||(l[9]=n=>e.editFileContent=n),rows:18,"auto-size":{minRows:12,maxRows:24},style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["open","title","confirm-loading"]),_(" Create modal "),t(A,{open:e.createOpen,"onUpdate:open":l[15]||(l[15]=n=>e.createOpen=n),title:"新建项目","confirm-loading":e.creating,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreate},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"项目名称",required:""},{default:a(()=>[t(T,{value:e.newProject.name,"onUpdate:value":l[11]||(l[11]=n=>e.newProject.name=n),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(b,{label:"描述"},{default:a(()=>[t(D,{value:e.newProject.description,"onUpdate:value":l[12]||(l[12]=n=>e.newProject.description=n),rows:2},null,8,["value"])]),_:1}),t(b,{label:"类型"},{default:a(()=>[t(R,{value:e.newProject.type,"onUpdate:value":l[13]||(l[13]=n=>e.newProject.type=n)},{default:a(()=>[t(m,{value:"document"},{default:a(()=>[...l[32]||(l[32]=[r("文档 (document)",-1)])]),_:1}),t(m,{value:"data"},{default:a(()=>[...l[33]||(l[33]=[r("数据 (data)",-1)])]),_:1}),t(m,{value:"web"},{default:a(()=>[...l[34]||(l[34]=[r("Web",-1)])]),_:1}),t(m,{value:"app"},{default:a(()=>[...l[35]||(l[35]=[r("应用 (app)",-1)])]),_:1}),t(m,{value:"presentation"},{default:a(()=>[...l[36]||(l[36]=[r("演示文稿",-1)])]),_:1}),t(m,{value:"spreadsheet"},{default:a(()=>[...l[37]||(l[37]=[r("表格",-1)])]),_:1}),t(m,{value:"design"},{default:a(()=>[...l[38]||(l[38]=[r("设计",-1)])]),_:1}),t(m,{value:"code"},{default:a(()=>[...l[39]||(l[39]=[r("代码",-1)])]),_:1}),t(m,{value:"workflow"},{default:a(()=>[...l[40]||(l[40]=[r("工作流",-1)])]),_:1}),t(m,{value:"knowledge"},{default:a(()=>[...l[41]||(l[41]=[r("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(b,{label:"根路径 (可选)"},{default:a(()=>[t(T,{value:e.newProject.rootPath,"onUpdate:value":l[14]||(l[14]=n=>e.newProject.rootPath=n),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}const We=we(Pe,[["render",Ee],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-6ZYRLD/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-hSzyoXri.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-DJz8iFOR.js";import{a0 as t}from"./index-hSzyoXri.js";import"./vendor-Bn1JzzAn.js";import"./index-BO6XvO-C.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-Dh77m3NZ.js";import{a0 as t}from"./index-hSzyoXri.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-D-PmXO9M.js";import"./useFlexGapSupport-B2wO2r36.js";import"./styleChecker-DOr9rk68.js";import"./index-BO6XvO-C.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|