chainlesschain 0.163.3 → 0.163.5
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/package.json +3 -2
- package/scripts/command-lifecycle-report.mjs +330 -38
- package/src/assets/web-panel/assets/{AIOps-DIY6KxV-.js → AIOps-Cv2EE1Zy.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BXH0muPt.js → ActionButton-CcpxMLuW.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D39w8vmg.js → Analytics-DE8mJoMI.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CUU1zvLs.js → AppLayout-DKn9dk9L.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-D8azHO3T.js → Artifacts-Cp3mG3Py.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-D0tAwXTg.js → Audit-zvsQfF2C.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-C29mhJll.js → BackgroundAgents-Bi85SsjN.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D6Aa1Gro.js → Backup-Cw47Dj6s.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-B1uoHbPQ.js → BaseInput-C5Ip2afH.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Bs4DLOR5.js → Chat-C0iAFkJv.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DUYIBSle.js → ChatBubbleRenderer-BV9Wv7wO.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CNcBPEa4.js → Checkbox-3KZZCiAF.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CIY89763.js → Codegen-C8OMbBAz.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CsPYFmgo.js → Col-B-MB84LJ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BBocEge4.js → Community-DpR7Dxao.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-TQ8Ux0Lf.js → Compact-CyDtz0OS.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DfBsZTft.js → Compliance-5tiRa2An.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Cg-I6FVH.js → Cowork-DnQaKZ5x.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-DTQzfRTp.js → Cron-BaWfoEDf.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DGxEKGpR.js → Crosschain-Bu0HoHhb.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DLZ1RDSr.js → DID-31zk8upX.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-XneICKNI.js → Dashboard-BmVne-e2.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BRU00J1-.js → Dropdown-B4PkoOWd.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BzCbJuAy.js → EmailListRenderer-BZ6tyFtI.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-D7BRyNBG.js → FamilyGuardDashboard-Osozn4Ds.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-D9DeFIhW.js → Federation-DaH8TOAP.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-6rAtA9Ko.js → FormItemContext-tbU0uwis.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-8Hqy80pU.js → GenericCardRenderer-Df8LQBrL.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Cmvkj1rt.js → Git-DsMB6-14.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BRiQUjjw.js → Governance-BnH0dZzd.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CKN_EzVf.js → Inference-DhnN1N_P.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BCDHwpwQ.js → KnowledgeGraph-DnNshAgn.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DK9ovhaB.js → Logs-BmBFX3_N.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-D53pHiHy.js → MarkdownRenderer-DCslfQU3.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-BILPGakp.js → Marketplace-CPEgWDc3.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DTVCOr9-.js → McpTools-C36qjgF9.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-Hzc1iow4.js → Memory-tNHvrgqN.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-GXfgnGYV.js → MobileBridge-Xaf6cKjc.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-B-3TJWsS.js → MobileProjects-D2E5TTeO.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DwSJMWtK.js → Mtc-D4AJ2dwV.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-D2uxf-DA.js → MtcAudit-Df-gtn2_.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-DG6kbKK0.js → Multisig-DTCHLWld.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-f5p49EDU.js → NLProgramming-DruZ_1Jb.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-FUgHyzSD.js → Notes-Dx3pdGDs.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DCHGee7e.js → NotificationSettings-Bi3L69oL.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Dm6LlIoa.js → OrderTableRenderer-BHY33m7C.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BawA7qAg.js → Organization-BG2ZVEV-.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-D6a5wZU1.js → Overflow-Viwtg4Mn.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-K8WavwnA.js → P2P-Clm_yc1Z.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-4JAJYaqx.js → PdhVaultBrowser-NKmmDiOw.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-BDWvi8PD.js → Permissions-DIL8u9Nk.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DF_K4E9i.js → PersonalDataHub-B-jM4wt-.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-BYeZlesI.js → Pipeline-627I__H5.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BIHlgnIc.js → Privacy-2DN2qrkW.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Cvf-6B5P.js → ProjectInit-CN4wC0sF.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CnwfJrRz.js → ProjectSettings-K35vsh5H.js} +2 -2
- package/src/assets/web-panel/assets/Projects-B_wQadhX.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CxC7JuYv.js → Providers-MckaQUhQ.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-VLf3gAfL.js → QrScannerModal-BS3mtA_O.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-B5vGjRiF.js → QuickAsk-BHp_nofL.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend--UW4iYs-.js → Recommend-DlmnPuZj.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DMSPcfKR.js → RemoteSession-tsyFbvpy.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-kQXlEHmj.js → Reputation-Ba1iWv2D.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CxGu3pit.js → Row-NnlGC--f.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Bi5lo8MZ.js → RssFeed-CjThSIRv.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Cq_H5RTh.js → Search-CojUyC5x.js} +1 -1
- package/src/assets/web-panel/assets/{Security-YFbmkaQS.js → Security-c-sxeJEc.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DLOGdaLm.js → Services-CtcKEEmF.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CteIxb3D.js → Skeleton-CIBBXflN.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CccopaIZ.js → Skills-D1XOOK9n.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-AzfEQKX1.js → Sla-hRfEp5Sn.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-ekGo5l77.js → SpeechSettings-Dexb1f_6.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BmZmAgYH.js → SyncSettings-BJsSFGYy.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-D7q3Z4uL.js → Tasks-CfSZ8A1L.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CX1Tgeka.js → Templates-idDf47W-.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-Zc59jF4i.js → Tenant-C-UsX6w6.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CXOD7y83.js → Terminal-BgJtX5n1.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-B1aBHPBo.js → TimelineRenderer-DP0BLKTl.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-zALlOq_U.js → Tokens-LwCzqETp.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CQfJMXaq.js → Trigger-D_9tVch0.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BU0RcM-w.js → Trust-BH2UlEWh.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-IFZ3HsbH.js → UkeySign-CIpD0nYb.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BzslgW0v.js → VideoEditing-9ShhYxK_.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BZAcQNS6.js → Wallet-C7afGNIG.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CBK1DMi0.js → WebAuthn-bUKn6i5R.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-BlMTPzO-.js → WorkflowEditor-CxgQaGyp.js} +1 -1
- package/src/assets/web-panel/assets/{chat-B51-8QVn.js → chat-DMVkmJwx.js} +1 -1
- package/src/assets/web-panel/assets/{colors-504RTByU.js → colors-CDzQh5nS.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-C-GP6IQM.js → compact-item-C51kEF4D.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DOkIj7ID.js → createContext-BTk9bXBn.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CdwPwYj8.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DN7V-_FW.js → hasIn-CMje33rb.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKTfZyfU.js → index-0Auljb10.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9LyiN-L.js → index-B0-zMtKA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DEMPUVa3.js → index-BAfY7m7i.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bkxhaeta.js → index-BBz9LIMS.js} +1 -1
- package/src/assets/web-panel/assets/{index-7jIqHbzw.js → index-BCRvG9lq.js} +1 -1
- package/src/assets/web-panel/assets/index-BEeOdfEe.js +1 -0
- package/src/assets/web-panel/assets/index-BTe0TOu6.js +1 -0
- package/src/assets/web-panel/assets/{index-P2mfY27Z.js → index-BTlsE8Df.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAOpQvl_.js → index-BVePe_Rf.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYopNjcJ.js → index-BW4F5YDF.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_vGU-Js.js → index-BXQBPLyE.js} +1 -1
- package/src/assets/web-panel/assets/{index-kt_5rfcZ.js → index-BeEaAEIp.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cao5DZy7.js → index-BtlEqHLP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DA2f1UV3.js → index-BzCkNylB.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2-x9bS8.js → index-C1oZQmAA.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1phyca8.js → index-C1oZReaY.js} +1 -1
- package/src/assets/web-panel/assets/{index-FcV8J_Qz.js → index-C4rQCS8T.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3TSohzc.js → index-C5IWTMVl.js} +1 -1
- package/src/assets/web-panel/assets/{index-CySTJKeq.js → index-CCLj9hcD.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9_48OzU.js → index-CDLkNkLj.js} +1 -1
- package/src/assets/web-panel/assets/{index-so8eIIxF.js → index-Cd0hmPxD.js} +1 -1
- package/src/assets/web-panel/assets/{index-CX78k-qf.js → index-CfC-piWZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE-hmI2l.js → index-CtM8OT_7.js} +1 -1
- package/src/assets/web-panel/assets/{index-kAqQXfP6.js → index-CvSeVzqe.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0k_Nqg9.js → index-CwGPwjUu.js} +1 -1
- package/src/assets/web-panel/assets/{index-CP2A226L.js → index-CypsfcEq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CfiEM64n.js → index-D9rC-fGW.js} +3 -3
- package/src/assets/web-panel/assets/{index-yYTQZypF.js → index-DJfnCuMq.js} +1 -1
- package/src/assets/web-panel/assets/{index-f4Bo4KXm.js → index-DRG-aqOs.js} +1 -1
- package/src/assets/web-panel/assets/{index-By6u5IV1.js → index-DRLQyp2A.js} +1 -1
- package/src/assets/web-panel/assets/{index-ConjaJro.js → index-DgivOKHA.js} +1 -1
- package/src/assets/web-panel/assets/{index--n-ZciV3.js → index-DpcrFxMI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqcLo5WV.js → index-DqU9njjT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUhQpiYv.js → index-Ld_4mFmC.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4DV_5uA.js → index-OS-vfbTA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaA__-q1.js → index-h31MwrME.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFIFJ5Dr.js → index-hg_emBsi.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8UltbXK.js → index-togc_uYn.js} +1 -1
- package/src/assets/web-panel/assets/{index-et5JIPHO.js → index-x53Vf7la.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CPYEIdpV.js → initDefaultProps-vrA8K-ac.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cjim9pxs.js → motion-ByEzwIAl.js} +1 -1
- package/src/assets/web-panel/assets/{move-DuU-cgz3.js → move-Ck4AWjw-.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DJHNAkta.js → mtc-parser-6p0l9SrB.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DSQBgdBj.js → omit-B1CUPQ6R.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CTmT_j5m.js → pickAttrs-B1STg1iW.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Lfm6v-r4.js → placementArrow-DTTllkBV.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CgrcPcDi.js → responsiveObserve-AIrrCfBb.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CuE3110i.js → slide-C_fPMjdR.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DiK5nbpf.js → statusUtils-D5ow2yIP.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DPEJdQaZ.js → styleChecker-Dy3hEA--.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CnnodGmp.js → useFlexGapSupport-WfzcfSh4.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DWF84Yav.js → useFs-CKSejfas.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-a5b5Dw2f.js → usePersonalDataHub-od3zpPBN.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DAluzXOq.js → vnode-DRD_2DFA.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Dokg7uAZ.js → zoom-DmNrEtgf.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agenda.js +52 -6
- package/src/commands/artifacts.js +98 -0
- package/src/commands/cowork.js +24 -12
- package/src/commands/mcp.js +1 -1
- package/src/commands/review.js +221 -22
- package/src/commands/routine.js +40 -10
- package/src/commands/session-mcp-recovery.js +5 -5
- package/src/data/changelog.json +27 -1
- package/src/gateways/ws/ws-agent-handler.js +492 -14
- package/src/harness/jsonl-session-store.js +39 -1
- package/src/harness/mcp-client.js +172 -29
- package/src/harness/prompt-compressor.js +24 -0
- package/src/harness/provider-backed-compaction.js +205 -0
- package/src/lib/agent-schedule-store.js +197 -4
- package/src/lib/app-preview.js +3 -0
- package/src/lib/command-lifecycle-report.js +1340 -145
- package/src/lib/cowork-cron.js +243 -25
- package/src/lib/delivery-coordinator.js +30 -5
- package/src/lib/delivery-production-adapter.js +1777 -0
- package/src/lib/delivery-production-runner.js +240 -0
- package/src/lib/durable-security-store.js +29 -17
- package/src/lib/execution-trace/trace-context.cjs +179 -0
- package/src/lib/execution-trace/trace-context.js +8 -175
- package/src/lib/mcp-call-ledger-store.js +58 -6
- package/src/lib/mcp-host-recovery-runtime.js +2 -0
- package/src/lib/mcp-ledger-recovery-admission.js +39 -3
- package/src/lib/mcp-recovery-adjudication.js +256 -19
- package/src/lib/mcp-sandbox-policy.js +29 -0
- package/src/lib/mcp-stdio-capsule-builder-worker.cjs +495 -0
- package/src/lib/mcp-stdio-executable-identity.js +33 -2
- package/src/lib/mcp-stdio-immutable-vfs-resolver.cjs +830 -0
- package/src/lib/mcp-stdio-package-materialization.js +721 -333
- package/src/lib/micro-compact.js +11 -5
- package/src/lib/observability/index.js +2 -0
- package/src/lib/observability/otlp-exporter.js +2 -2
- package/src/lib/packer/pack-update-applier.js +8 -1
- package/src/lib/packer/pkg-config-generator.js +34 -0
- package/src/lib/process-execution-broker/index.js +48 -8
- package/src/lib/process-execution-broker/platform-sandbox.js +82 -1
- package/src/lib/routine-store.js +76 -3
- package/src/lib/scheduler-kernel/agenda-adapter.js +542 -0
- package/src/lib/scheduler-kernel/contract.js +315 -0
- package/src/lib/scheduler-kernel/cowork-cron-adapter.js +774 -0
- package/src/lib/scheduler-kernel/routine-adapter.js +517 -0
- package/src/lib/scheduler-kernel/runtime.js +527 -0
- package/src/lib/scheduler-kernel/store.js +1455 -0
- package/src/lib/session-host-lease.js +403 -30
- package/src/lib/session-message-provenance.js +4 -1
- package/src/lib/session-persistence-failure.js +4 -1
- package/src/lib/sub-agent-context.js +8 -0
- package/src/repl/agent-repl.js +309 -43
- package/src/runtime/agent-core.js +1079 -105
- package/src/runtime/headless-runner.js +260 -166
- package/src/runtime/headless-stream.js +254 -25
- package/src/assets/web-panel/assets/Projects-b-jPXzF4.js +0 -1
- package/src/assets/web-panel/assets/devWarning-kB0nCNwN.js +0 -1
- package/src/assets/web-panel/assets/index-Bya64sZE.js +0 -1
- package/src/assets/web-panel/assets/index-D_FWpDZM.js +0 -1
|
@@ -33,10 +33,17 @@ import {
|
|
|
33
33
|
} from "../lib/hooks-v2-producers.js";
|
|
34
34
|
import { runWithHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
|
|
35
35
|
import { bootstrap } from "./bootstrap.js";
|
|
36
|
-
import {
|
|
36
|
+
import {
|
|
37
|
+
buildSystemPrompt,
|
|
38
|
+
chatWithTools as coreChatWithTools,
|
|
39
|
+
agentLoop as coreAgentLoop,
|
|
40
|
+
} from "./agent-core.js";
|
|
37
41
|
import { composeSystemPrompt } from "./system-prompt.js";
|
|
38
42
|
import { collapseConsecutiveMessagesInPlace } from "./message-roles.js";
|
|
39
43
|
import { sanitizeToolPairs } from "../harness/prompt-compressor.js";
|
|
44
|
+
import { compactConversationWithProvider } from "../harness/provider-backed-compaction.js";
|
|
45
|
+
import { projectCanonicalResumeMessages } from "../lib/session-message-provenance.js";
|
|
46
|
+
import { isAbortError } from "../lib/abort-utils.js";
|
|
40
47
|
import { expandFileRefsAsync } from "./file-ref-expander.js";
|
|
41
48
|
// Per-turn helpers resolved at module load (not re-`await import`ed inside the
|
|
42
49
|
// turn loop). image-input + ide-context are pure local modules; pulling them up
|
|
@@ -85,6 +92,7 @@ import {
|
|
|
85
92
|
appendAssistantMessage as jsonlAppendAssistantMessage,
|
|
86
93
|
appendToolCallCompact as jsonlAppendToolCallCompact,
|
|
87
94
|
appendLlmRetryCompact as jsonlAppendLlmRetryCompact,
|
|
95
|
+
appendCompactEventIfMessagesMatch as jsonlAppendCompactEventIfMessagesMatch,
|
|
88
96
|
appendEvent as jsonlAppendEvent,
|
|
89
97
|
appendAuthorityEvent as jsonlAppendAuthorityEvent,
|
|
90
98
|
readEvents as jsonlReadEvents,
|
|
@@ -803,6 +811,7 @@ async function runTurn(
|
|
|
803
811
|
let finalText = "";
|
|
804
812
|
let endReason = "complete";
|
|
805
813
|
let stopForCost = false;
|
|
814
|
+
let stopForCompactionUsageUnknown = false;
|
|
806
815
|
let responseCompleted = false;
|
|
807
816
|
// P0-2: the side-effect op currently in flight (at most one — the loop runs
|
|
808
817
|
// tools serially). Non-null only between a dangerous tool's tool-executing
|
|
@@ -1012,6 +1021,18 @@ async function runTurn(
|
|
|
1012
1021
|
}
|
|
1013
1022
|
}
|
|
1014
1023
|
break;
|
|
1024
|
+
case "compaction-usage-unknown":
|
|
1025
|
+
emit({
|
|
1026
|
+
type: "compaction_usage_unknown",
|
|
1027
|
+
provider: event.provider,
|
|
1028
|
+
model: event.model,
|
|
1029
|
+
source: event.source || "semantic-compaction",
|
|
1030
|
+
reason: event.reason || "provider_transport_outcome_unknown",
|
|
1031
|
+
usage_outcome: "unknown",
|
|
1032
|
+
});
|
|
1033
|
+
endReason = "compaction-usage-unknown";
|
|
1034
|
+
stopForCompactionUsageUnknown = true;
|
|
1035
|
+
break;
|
|
1015
1036
|
case "iteration-warning":
|
|
1016
1037
|
emit({ type: "iteration_warning", message: event.message });
|
|
1017
1038
|
break;
|
|
@@ -1033,7 +1054,7 @@ async function runTurn(
|
|
|
1033
1054
|
await waitForOutput?.();
|
|
1034
1055
|
// Hard cost cap reached — stop consuming the loop (break the for-await, not
|
|
1035
1056
|
// just the switch) so no further paid LLM call is made.
|
|
1036
|
-
if (stopForCost) break;
|
|
1057
|
+
if (stopForCost || stopForCompactionUsageUnknown) break;
|
|
1037
1058
|
}
|
|
1038
1059
|
if (
|
|
1039
1060
|
sideEffects &&
|
|
@@ -1181,6 +1202,7 @@ async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
|
|
|
1181
1202
|
typeof deps.sessionHasPersistedEvidence === "function" ||
|
|
1182
1203
|
typeof deps.sessionExists === "function" ||
|
|
1183
1204
|
typeof deps.rebuildMessages === "function" ||
|
|
1205
|
+
typeof deps.appendCompactEventIfMessagesMatch === "function" ||
|
|
1184
1206
|
typeof deps.appendEvent === "function" ||
|
|
1185
1207
|
typeof deps.appendAuthorityEvent === "function" ||
|
|
1186
1208
|
typeof deps.readVerifiedEvents === "function" ||
|
|
@@ -1379,6 +1401,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1379
1401
|
typeof deps.sessionHasPersistedEvidence === "function" ||
|
|
1380
1402
|
typeof deps.sessionExists === "function" ||
|
|
1381
1403
|
typeof deps.rebuildMessages === "function" ||
|
|
1404
|
+
typeof deps.appendCompactEventIfMessagesMatch === "function" ||
|
|
1382
1405
|
typeof deps.appendEvent === "function" ||
|
|
1383
1406
|
typeof deps.appendAuthorityEvent === "function" ||
|
|
1384
1407
|
typeof deps.readVerifiedEvents === "function" ||
|
|
@@ -1739,6 +1762,11 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1739
1762
|
appendLlmRetryCompact:
|
|
1740
1763
|
deps.appendLlmRetryCompact ||
|
|
1741
1764
|
(hasInjectedSessionStore ? () => true : jsonlAppendLlmRetryCompact),
|
|
1765
|
+
appendCompactEventIfMessagesMatch:
|
|
1766
|
+
deps.appendCompactEventIfMessagesMatch ||
|
|
1767
|
+
(hasInjectedSessionStore
|
|
1768
|
+
? unavailableAuthorityCapability("appendCompactEventIfMessagesMatch")
|
|
1769
|
+
: jsonlAppendCompactEventIfMessagesMatch),
|
|
1742
1770
|
appendEvent:
|
|
1743
1771
|
deps.appendEvent ||
|
|
1744
1772
|
(hasInjectedSessionStore ? () => true : jsonlAppendEvent),
|
|
@@ -2495,6 +2523,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2495
2523
|
sink: mcpLedgerSink,
|
|
2496
2524
|
recovery: mcpLedgerRecovery,
|
|
2497
2525
|
recoveryError: mcpLedgerRecoveryError,
|
|
2526
|
+
dispatchAdmission: sessionHostLease?.admitMcpDispatch || null,
|
|
2498
2527
|
});
|
|
2499
2528
|
const hostMcp = mcp
|
|
2500
2529
|
? { ...mcp, mcpClient: mcpRecoveryRuntime.client || mcp.mcpClient }
|
|
@@ -2730,6 +2759,26 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2730
2759
|
// A null sink disables durable writes, not recovery admission. Retain the
|
|
2731
2760
|
// guarded ledger so outcome-unknown calls cannot be retried in-process.
|
|
2732
2761
|
mcpCallLedger: mcpRecoveryRuntime.ledger,
|
|
2762
|
+
mcpDispatchAdmission: sessionHostLease?.admitMcpDispatch || null,
|
|
2763
|
+
onCompaction: persist
|
|
2764
|
+
? (stats, compacted, settlement = {}) => {
|
|
2765
|
+
sessionHostLease?.assert?.();
|
|
2766
|
+
return requireSynchronousRecoveryResult(
|
|
2767
|
+
store.appendCompactEventIfMessagesMatch(
|
|
2768
|
+
sessionId,
|
|
2769
|
+
{
|
|
2770
|
+
...stats,
|
|
2771
|
+
trigger: settlement.trigger || "auto",
|
|
2772
|
+
messages: projectCanonicalResumeMessages(compacted, {
|
|
2773
|
+
strict: true,
|
|
2774
|
+
}),
|
|
2775
|
+
},
|
|
2776
|
+
settlement.expectedMessages,
|
|
2777
|
+
),
|
|
2778
|
+
"appendCompactEventIfMessagesMatch",
|
|
2779
|
+
);
|
|
2780
|
+
}
|
|
2781
|
+
: undefined,
|
|
2733
2782
|
chatFn: deps.chatFn || options.chatFn || undefined,
|
|
2734
2783
|
signal: options.signal || undefined,
|
|
2735
2784
|
// --include-partial-messages: stream live assistant-text deltas as
|
|
@@ -3035,31 +3084,194 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3035
3084
|
continue;
|
|
3036
3085
|
}
|
|
3037
3086
|
|
|
3038
|
-
// Manual `/compact`
|
|
3039
|
-
//
|
|
3040
|
-
//
|
|
3041
|
-
// `compaction` event the panel renders as "compacted N→M, saved …".
|
|
3087
|
+
// Manual `/compact` uses the same provider-backed structured handoff as the
|
|
3088
|
+
// other long-lived hosts. Provider/schema failures degrade to the shared
|
|
3089
|
+
// extractive handoff instead of silently dropping all but recent turns.
|
|
3042
3090
|
if (parsed.compact) {
|
|
3043
|
-
const { microCompact } = await import("../lib/micro-compact.js");
|
|
3044
3091
|
const before = messages.length;
|
|
3045
|
-
const
|
|
3046
|
-
|
|
3047
|
-
|
|
3048
|
-
|
|
3049
|
-
|
|
3050
|
-
|
|
3051
|
-
|
|
3052
|
-
|
|
3053
|
-
|
|
3054
|
-
|
|
3055
|
-
|
|
3056
|
-
|
|
3057
|
-
|
|
3058
|
-
|
|
3059
|
-
|
|
3060
|
-
|
|
3061
|
-
|
|
3062
|
-
|
|
3092
|
+
const expectedMessages = [...messages];
|
|
3093
|
+
let compacted;
|
|
3094
|
+
let stats;
|
|
3095
|
+
let degradedEvent;
|
|
3096
|
+
let usageEvent;
|
|
3097
|
+
let usageUnknownEvent;
|
|
3098
|
+
try {
|
|
3099
|
+
({
|
|
3100
|
+
messages: compacted,
|
|
3101
|
+
stats,
|
|
3102
|
+
degradedEvent,
|
|
3103
|
+
usageEvent,
|
|
3104
|
+
usageUnknownEvent,
|
|
3105
|
+
} = await compactConversationWithProvider(messages, {
|
|
3106
|
+
provider,
|
|
3107
|
+
model,
|
|
3108
|
+
baseUrl,
|
|
3109
|
+
apiKey,
|
|
3110
|
+
signal: options.signal,
|
|
3111
|
+
force: true,
|
|
3112
|
+
preserveCompletedExchange: true,
|
|
3113
|
+
llmQuery:
|
|
3114
|
+
deps.compactionLlmQuery || options.compactionLlmQuery || null,
|
|
3115
|
+
chatFn:
|
|
3116
|
+
deps.compactionChatFn ||
|
|
3117
|
+
options.compactionChatFn ||
|
|
3118
|
+
coreChatWithTools,
|
|
3119
|
+
chatOptions: { cwd, sessionId },
|
|
3120
|
+
maxOutputTokens: options.compactionMaxOutputTokens,
|
|
3121
|
+
summaryInputMaxChars: options.compactionInputMaxChars,
|
|
3122
|
+
}));
|
|
3123
|
+
} catch (error) {
|
|
3124
|
+
if (isAbortError(error) || options.signal?.aborted) throw error;
|
|
3125
|
+
emit({
|
|
3126
|
+
type: "compaction-degraded",
|
|
3127
|
+
reason: `compaction_failed:${String(error?.message || error).slice(0, 240)}`,
|
|
3128
|
+
summaryMode: "none",
|
|
3129
|
+
});
|
|
3130
|
+
continue;
|
|
3131
|
+
}
|
|
3132
|
+
if (degradedEvent) {
|
|
3133
|
+
emit({ type: "compaction-degraded", ...degradedEvent });
|
|
3134
|
+
}
|
|
3135
|
+
if (usageUnknownEvent) {
|
|
3136
|
+
emit({
|
|
3137
|
+
type: "compaction_usage_unknown",
|
|
3138
|
+
...usageUnknownEvent,
|
|
3139
|
+
usage_outcome: "unknown",
|
|
3140
|
+
});
|
|
3141
|
+
emit({
|
|
3142
|
+
type: "result",
|
|
3143
|
+
subtype: "error_compaction_usage_unknown",
|
|
3144
|
+
is_error: true,
|
|
3145
|
+
code: "CC_COMPACTION_USAGE_UNKNOWN",
|
|
3146
|
+
error:
|
|
3147
|
+
"Compaction provider usage is unknown; the paid compaction is not retried",
|
|
3148
|
+
session_id: sessionId,
|
|
3149
|
+
...(costBudget ? { budget_state: "unverifiable" } : {}),
|
|
3150
|
+
});
|
|
3151
|
+
sawError = true;
|
|
3152
|
+
break;
|
|
3153
|
+
}
|
|
3154
|
+
let costExceeded = false;
|
|
3155
|
+
if (usageEvent) {
|
|
3156
|
+
emit({ type: "token_usage", ...usageEvent });
|
|
3157
|
+
if (costBudget) {
|
|
3158
|
+
costBudget.add(usageEvent);
|
|
3159
|
+
costExceeded = costBudget.exceeded();
|
|
3160
|
+
}
|
|
3161
|
+
}
|
|
3162
|
+
|
|
3163
|
+
// Provider work above is intentionally outside the canonical writer
|
|
3164
|
+
// lock. Settle the candidate once, under the JSONL message-projection CAS,
|
|
3165
|
+
// before replacing the live history. A stale/unknown settlement is never
|
|
3166
|
+
// retried here: that could duplicate either the paid summary call or a
|
|
3167
|
+
// compact event whose fsync outcome is unknown.
|
|
3168
|
+
const shouldPersistCompact = stats?.strategy !== "none";
|
|
3169
|
+
let settlementError = null;
|
|
3170
|
+
let persistenceFailure = null;
|
|
3171
|
+
if (persist && shouldPersistCompact) {
|
|
3172
|
+
try {
|
|
3173
|
+
sessionHostLease?.assert?.();
|
|
3174
|
+
requireSynchronousRecoveryResult(
|
|
3175
|
+
store.appendCompactEventIfMessagesMatch(
|
|
3176
|
+
sessionId,
|
|
3177
|
+
{
|
|
3178
|
+
...stats,
|
|
3179
|
+
trigger: "manual",
|
|
3180
|
+
messages: projectCanonicalResumeMessages(compacted, {
|
|
3181
|
+
strict: true,
|
|
3182
|
+
}),
|
|
3183
|
+
},
|
|
3184
|
+
expectedMessages,
|
|
3185
|
+
),
|
|
3186
|
+
"appendCompactEventIfMessagesMatch",
|
|
3187
|
+
);
|
|
3188
|
+
} catch (error) {
|
|
3189
|
+
settlementError = error;
|
|
3190
|
+
const normalized = createSessionPersistenceFailure(error, {
|
|
3191
|
+
sessionId,
|
|
3192
|
+
operation: "append-authority-event",
|
|
3193
|
+
});
|
|
3194
|
+
persistenceFailure = projectSessionPersistenceFailure(normalized, {
|
|
3195
|
+
phase: "after-model",
|
|
3196
|
+
});
|
|
3197
|
+
if (persistenceFailure) {
|
|
3198
|
+
terminalPersistenceFailure = persistenceFailure;
|
|
3199
|
+
try {
|
|
3200
|
+
deps.onPersistenceFailure?.(persistenceFailure);
|
|
3201
|
+
} catch {
|
|
3202
|
+
// Observability cannot change persistence semantics.
|
|
3203
|
+
}
|
|
3204
|
+
}
|
|
3205
|
+
}
|
|
3206
|
+
}
|
|
3207
|
+
|
|
3208
|
+
if (!settlementError) {
|
|
3209
|
+
messages.length = 0;
|
|
3210
|
+
messages.push(...compacted);
|
|
3211
|
+
emit({
|
|
3212
|
+
type: "compaction",
|
|
3213
|
+
stats,
|
|
3214
|
+
messages_before: before,
|
|
3215
|
+
messages_after: messages.length,
|
|
3216
|
+
});
|
|
3217
|
+
emitHooksV2Event("PostCompact", {
|
|
3218
|
+
schema_version: 1,
|
|
3219
|
+
trigger: "manual",
|
|
3220
|
+
session_id: sessionId,
|
|
3221
|
+
messages_before: before,
|
|
3222
|
+
messages_after: messages.length,
|
|
3223
|
+
stats,
|
|
3224
|
+
cwd,
|
|
3225
|
+
});
|
|
3226
|
+
} else {
|
|
3227
|
+
const stale = settlementError?.code === "SESSION_REVISION_STALE";
|
|
3228
|
+
const code = stale
|
|
3229
|
+
? "CC_COMPACTION_REVISION_STALE"
|
|
3230
|
+
: persistenceFailure?.code ||
|
|
3231
|
+
settlementError?.code ||
|
|
3232
|
+
"CC_COMPACTION_SETTLEMENT_FAILED";
|
|
3233
|
+
emit({
|
|
3234
|
+
type: "compaction-degraded",
|
|
3235
|
+
reason: stale
|
|
3236
|
+
? "session_messages_changed_during_compaction"
|
|
3237
|
+
: "canonical_compaction_settlement_failed",
|
|
3238
|
+
summaryMode: "none",
|
|
3239
|
+
code,
|
|
3240
|
+
});
|
|
3241
|
+
emit({
|
|
3242
|
+
type: "result",
|
|
3243
|
+
subtype: persistenceFailure
|
|
3244
|
+
? "error_persistence"
|
|
3245
|
+
: stale
|
|
3246
|
+
? "error_compaction_stale"
|
|
3247
|
+
: "error_session_persistence",
|
|
3248
|
+
is_error: true,
|
|
3249
|
+
code,
|
|
3250
|
+
error: "Canonical compaction was not settled",
|
|
3251
|
+
session_id: sessionId,
|
|
3252
|
+
...(persistenceFailure ? { persistence: persistenceFailure } : {}),
|
|
3253
|
+
});
|
|
3254
|
+
sawError = true;
|
|
3255
|
+
}
|
|
3256
|
+
|
|
3257
|
+
if (costExceeded) {
|
|
3258
|
+
sawError = true;
|
|
3259
|
+
emit({
|
|
3260
|
+
type: "cost_budget_exhausted",
|
|
3261
|
+
limit_usd: options.maxCostUsd,
|
|
3262
|
+
spent_usd: costBudget.spentUsd,
|
|
3263
|
+
session_id: sessionId,
|
|
3264
|
+
turn: turns,
|
|
3265
|
+
});
|
|
3266
|
+
}
|
|
3267
|
+
if (settlementError || costExceeded) {
|
|
3268
|
+
break;
|
|
3269
|
+
}
|
|
3270
|
+
if (!shouldPersistCompact && persist) {
|
|
3271
|
+
// A repeated `/compact` against an already-compact context is a no-op:
|
|
3272
|
+
// do not grow the canonical chain with duplicate checkpoints.
|
|
3273
|
+
sessionHostLease?.assert?.();
|
|
3274
|
+
}
|
|
3063
3275
|
continue;
|
|
3064
3276
|
}
|
|
3065
3277
|
|
|
@@ -3596,6 +3808,23 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3596
3808
|
}
|
|
3597
3809
|
currentAbort = null;
|
|
3598
3810
|
|
|
3811
|
+
if (outcome.endReason === "compaction-usage-unknown") {
|
|
3812
|
+
sawError = true;
|
|
3813
|
+
emit({
|
|
3814
|
+
type: "result",
|
|
3815
|
+
subtype: "error_compaction_usage_unknown",
|
|
3816
|
+
is_error: true,
|
|
3817
|
+
code: "CC_COMPACTION_USAGE_UNKNOWN",
|
|
3818
|
+
error:
|
|
3819
|
+
"Compaction provider usage is unknown; the paid compaction is not retried",
|
|
3820
|
+
session_id: sessionId,
|
|
3821
|
+
turn: turns,
|
|
3822
|
+
usage: outcome.usage,
|
|
3823
|
+
...(costBudget ? { budget_state: "unverifiable" } : {}),
|
|
3824
|
+
});
|
|
3825
|
+
break;
|
|
3826
|
+
}
|
|
3827
|
+
|
|
3599
3828
|
// §3.5.18 出境台账: report what left the device this turn (the cloud-LLM
|
|
3600
3829
|
// call + any egress-classed tool) so the Android transparency ledger —
|
|
3601
3830
|
// which cannot see the cc subprocess's cloud call — records it. PDH-gated
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as i,J as A,U as I,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-Bn1JzzAn.js";import{_ as we,b as re,u as ie,d}from"./index-CfiEM64n.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as be,aP as Fe,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),b=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(){b.value={name:"",description:"",type:"document",rootPath:""},E.value=!0}async function T(){if(!b.value.name.trim()){d.warning("请输入项目名称");return}L.value=!0;try{const o=await w("project.init",{name:b.value.name.trim(),description:b.value.description||null,projectType:b.value.type,rootPath:b.value.rootPath||null},`project init "${b.value.name.trim()}" --type ${b.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 F=u(!1),D=u(!1),j=u({path:"",content:""}),U=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),N=u(""),Y=u(!1);function ue(){j.value={path:"",content:""},F.value=!0}function ce(){R.value={path:""},U.value=!0}async function q(){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}'`),F.value=!1,await q(),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}'`),U.value=!1,await q(),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 q(),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,N.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:N.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await q()):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:b,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:F,creatingFile:D,newFile:j,createFolderOpen:U,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:N,savingFile:Y,openCreateFile:ue,openCreateFolder:ce,refreshFiles:q,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 Fe},get FileAddOutlined(){return be},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"}},Ue={class:"page-title"},Ae={class:"page-sub"},Ie={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"),b=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"),F=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),U=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),A("div",null,[I("div",ze,[I("div",null,[I("h2",Ue,s(e.t("projects.title")),1),I("p",Ae,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(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 "),I("div",Ie,[t(E,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(L,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(b,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(J,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),A("code",he,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),A(ne,{key:1},[I("strong",null,s(c.name),1),c.description?(p(),A("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),A(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:N=>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:N=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(X,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(K,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[I("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),A("code",Re,s(e.detail.root_path),1)):(p(),A("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(Q,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(H,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(M,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(G,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),A("span",Ee,s(n.file_size)+" B",1)):_("v-if",!0),t(V,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[I("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(U,{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(F,{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(F,{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(U,{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(F,{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(U,{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(U,{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(F,{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(F,{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(F,{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(F,{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-N6bUe4/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-CfiEM64n.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-CxGu3pit.js";import{a0 as t}from"./index-CfiEM64n.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-CgrcPcDi.js";import"./useFlexGapSupport-CnnodGmp.js";import"./styleChecker-DPEJdQaZ.js";import"./index-CySTJKeq.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-CsPYFmgo.js";import{a0 as t}from"./index-CfiEM64n.js";import"./vendor-Bn1JzzAn.js";import"./index-CySTJKeq.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|