chainlesschain 0.166.102 → 0.166.104
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 +1 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-CyHIMEd8.js → AIOps-Bah3HREy.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-vuNxDpHm.js → ActionButton-DY2aeZMc.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D0quEM0q.js → Analytics-BFly8Xaa.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-xRSVpbCs.js → AppLayout-dp0Zz-JM.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-ktfVAZBC.js → Artifacts-DcIg09ai.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-UJW6maH4.js → Audit-DkN-lsjZ.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BYrfdCoT.js → BackgroundAgents-BjzgusLx.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-IBgsJ7BK.js → Backup-CU8S6qu9.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BmP8_zxy.js → BaseInput-B1pC2gjL.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-urkw8_BF.js → Chat-B6xFp6gD.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Cw44zZbh.js → ChatBubbleRenderer-DxNCLZ_X.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CYboo-__.js → Checkbox-QHw7Vc4U.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DaqR_Ay8.js → Codegen-gdecsfjg.js} +1 -1
- package/src/assets/web-panel/assets/{Col-04BSIj_z.js → Col-B0_JmAmc.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DxFk7Trv.js → Community-DRCcP5xR.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-mjgWlMCB.js → Compact-DZtoGzhX.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CC5ee7QV.js → Compliance-BfNTvEnT.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BK4BhHZd.js → Cowork-CDXTLm84.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-CP6jAxq0.js → Cron-Big35CbN.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DJPaViZS.js → Crosschain-C8ArrAVr.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BTLxkuOj.js → DID-D_77BI2O.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Djkiqh3d.js → Dashboard-D2SxTzEp.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-t_eUhqom.js → Dropdown-mR1-b9ud.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-7w6USx_J.js → EmailListRenderer-DPl7TE1c.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-mU5IHEk5.js → EvolutionSettings-BxRYLRSH.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BCh-VBBC.js → FamilyGuardDashboard-rnGtXJ5Z.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Be_VpjI2.js → Federation-BpxenYK8.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-D_lzQ7PI.js → FormItemContext-Cz1kDf6l.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-LYu3KapV.js → GenericCardRenderer-CGV3KN6U.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BBeF-PP4.js → Git-CIRP4UTx.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CoF8Kzg7.js → Governance-DX4r8Vmt.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-C4DLMnXS.js → Inference-DQKk02Hl.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-B2mlNewk.js → KnowledgeGraph-DdD6J-By.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DMZ_44Ya.js → Logs-DA2w-1_m.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-Ck7Iv_9e.js → MarkdownRenderer-C9aSGETh.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-BqDzTew_.js → Marketplace-BsJ6_6KW.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BbwSbDN9.js → McpTools-_6k30z6u.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-DAaTWgrm.js → Memory-C0_dYY0A.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BjbTGxoR.js → MobileBridge-CCTnVqiC.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DMODOBr-.js → MobileProjects-RZdxDSwC.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DT9N2rCs.js → Mtc-D4Ys8lvX.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-DagMfUVv.js → MtcAudit-BKTC--a2.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-C1BKP6nM.js → Multisig-CGR1qOe1.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-B5LFh72i.js → NLProgramming-hKKD4qWb.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Q77V3ltW.js → Notes-pCn7Ec40.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-HxdpNIBs.js → NotificationSettings-B9eEJXEs.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Dc0DpvBH.js → OrderTableRenderer-CmJuhaT2.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-QL3NZ7uW.js → Organization-CcQbrnwW.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-B_gqOKho.js → Overflow-HmD4Mn72.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BBJubU8Z.js → P2P-B7LIgx5H.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CFnGd-2E.js → PdhVaultBrowser-CXiHnBfX.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BKkznIUM.js → Permissions-CQRI3y_l.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DYK7ZAcd.js → PersonalDataHub-1EeHmsy5.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-CoeKpjoN.js → Pipeline-BFyoIdn8.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Diw4G-92.js → Privacy-BxWthXMF.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CHBOFkma.js → ProjectInit-DfigBilu.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BJIsgdOf.js → ProjectSettings-CFmIcVc-.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CR7H59v3.js +1 -0
- package/src/assets/web-panel/assets/{Providers-o8QCimor.js → Providers-2ulom-76.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-z2W-zvhW.js → QrScannerModal-BwhO07b_.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-_yubhsna.js → QuickAsk-_Wg34OwF.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CucgJwih.js → Recommend-D_jq6Svg.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-EzfIIRg1.js → RemoteSession-BlzvEfsa.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-_shttE67.js → Reputation-9CTXHfL4.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DQA_S8-9.js → Row-DlCYCN-t.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BOqWawXT.js → RssFeed-BvlInFCH.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Dx1v2xOq.js → Search-CfaUzKuL.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Bt4HHsT4.js → Security-bAWgLyve.js} +4 -4
- package/src/assets/web-panel/assets/{Services-sruHiQ-r.js → Services-C4LOGACW.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CiBxvmOJ.js → Skeleton-Dd0Uwh3_.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-De9qKODU.js → Skills-ZYF1kYCU.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-B_6yn8Wp.js → Sla-DpsmIaEo.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-C2CafExS.js → SpeechSettings-BBXoJ4yc.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Dhh3Qmb0.js → SyncSettings-SOnROi2Y.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Mvo5mTWm.js → Tasks-HFA_ZlDk.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-D7WVTQQy.js → Templates-fsK-RCEc.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-7ur9Yfxd.js → Tenant-CuqYxamb.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BgzrOA6k.js → Terminal-GKlI2R5F.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Dco20pT1.js → TimelineRenderer-DMDMHLeY.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-hN6qBPag.js → Tokens-BoV60rh3.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C4f_twAM.js → Trigger-CE344-Ws.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-Wf1SMypp.js → Trust-DENwgkVc.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DUXSyg3N.js → UkeySign-FrcM7yfm.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BvqsJaL0.js → VideoEditing-DAY9WaC2.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CgAbcjKl.js → Wallet-BuUR5i82.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DaLT0W3s.js → WebAuthn-nfSQuq85.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-CQqAXoaS.js → WorkflowEditor-DHhPOp9l.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BhlohFTB.js → chat-C4nsLzYy.js} +1 -1
- package/src/assets/web-panel/assets/{colors-D7HqXIL8.js → colors-BwXH0Wjn.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Bqk4FCLY.js → compact-item-uApFG30S.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CEmWrWf0.js → createContext-BpyYs4fe.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Bk6HGn3N.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CDY0pFi2.js → hasIn-MXCLi00p.js} +1 -1
- package/src/assets/web-panel/assets/{index-e9oCy7_4.js → index-1LxX2IwJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DEzL7s7P.js → index-61CBBrHE.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0nfNmbq.js → index-B0P1Z_oa.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiLu-ImR.js → index-B7jojVc7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqK0J4Sj.js → index-BEGMfaOo.js} +1 -1
- package/src/assets/web-panel/assets/{index-aBHlgMrq.js → index-BOhjapd5.js} +1 -1
- package/src/assets/web-panel/assets/{index-DPBoWNwq.js → index-BaBwXpAp.js} +1 -1
- package/src/assets/web-panel/assets/index-Bb1LPYdi.js +1 -0
- package/src/assets/web-panel/assets/{index-BxXFRLTZ.js → index-Btv--Nnt.js} +1 -1
- package/src/assets/web-panel/assets/index-C-FsTuFG.js +1 -0
- package/src/assets/web-panel/assets/{index-BxYO6nde.js → index-CF0bUOP4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGKRAO61.js → index-CNjUPfJP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkjgSHVz.js → index-CRmNdEk_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrsM-oiD.js → index-C_oOpXhP.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNrvBWDS.js → index-ChUTKrOq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYcjOnDX.js → index-CiIpIYhs.js} +1 -1
- package/src/assets/web-panel/assets/{index-C02yDu4f.js → index-CwVvk2i7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmKdCWq1.js → index-D3_tj06B.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkqBoCiu.js → index-DE4W4vLO.js} +3 -3
- package/src/assets/web-panel/assets/{index-B8L3_-sG.js → index-DLxKx5_J.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dwob5XoD.js → index-DTXi_gQh.js} +1 -1
- package/src/assets/web-panel/assets/{index-DuMt3ewl.js → index-Daco83me.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpI1LqJX.js → index-DffWVpZv.js} +1 -1
- package/src/assets/web-panel/assets/{index-lBAbMOzg.js → index-Dkncxel3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRcDWMwP.js → index-Dn12gJJU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVrwozwH.js → index-Dt-nq2eF.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3opQg47.js → index-Du01X9N9.js} +1 -1
- package/src/assets/web-panel/assets/{index-o_lc3eww.js → index-DucLR6YX.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cur88hoN.js → index-Gz2rGWef.js} +1 -1
- package/src/assets/web-panel/assets/{index-XErJQ1yF.js → index-IvgszJ3C.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuKGuH_y.js → index-S80LLjdx.js} +1 -1
- package/src/assets/web-panel/assets/{index-Chxt0t-A.js → index-WKbnwbKa.js} +1 -1
- package/src/assets/web-panel/assets/{index-1HBam9t1.js → index-XHBXtvqp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXRooi-O.js → index-nn22NSDK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHGOdvOQ.js → index-pCIAE2yS.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cf1ha8l0.js → index-pRpMLhMt.js} +1 -1
- package/src/assets/web-panel/assets/{index-6f6n0KFR.js → index-pgHGBAoF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPmRkxeX.js → index-ugIUt5TL.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9mvnSii.js → index-xLGf7f9K.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CIeEUxIN.js → initDefaultProps-C58CkKEo.js} +1 -1
- package/src/assets/web-panel/assets/{motion-IPIj1ZtP.js → motion-BLWPO2NV.js} +1 -1
- package/src/assets/web-panel/assets/{move-BfSeXZ-f.js → move-BgrFMwYp.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DX03-Xp4.js → mtc-parser-Cq2AuGzl.js} +1 -1
- package/src/assets/web-panel/assets/{omit-z9EannfX.js → omit-Bb-9L7if.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DXKmRkqZ.js → pickAttrs-vLmOxYr1.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-k2HV7cIU.js → placementArrow-BNySU_dJ.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-bX7CsyWy.js → responsiveObserve-xnbwagnm.js} +1 -1
- package/src/assets/web-panel/assets/{slide-NskjQLbJ.js → slide-BccbY5Cn.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-B3IoG-Er.js → statusUtils-DOp9d2-w.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DHv_UilX.js → styleChecker-Bu1w6ho9.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DEqGB5Ng.js → useFlexGapSupport-ZsUOrVdL.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Bl9CbrqZ.js → useFs-C0zpzKtO.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-O-Ukv93M.js → usePersonalDataHub-DO1OdgXK.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-hGCHTaZt.js → vnode-jTIRyhR5.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BWhIVeKQ.js → zoom-DKvS7-Qs.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +56 -20
- package/src/commands/ask.js +6 -4
- package/src/commands/batch.js +17 -12
- package/src/commands/eval.js +24 -8
- package/src/commands/team.js +28 -19
- package/src/data/changelog.json +26 -0
- package/src/harness/mcp-client.js +187 -26
- package/src/harness/prompt-compressor.js +2 -0
- package/src/lib/advisor-runtime.js +4 -2
- package/src/lib/agent-ipc-bus.js +2 -0
- package/src/lib/background-agent-keeper-client.js +3 -0
- package/src/lib/background-session-transport.js +21 -5
- package/src/lib/browser-automation.js +4 -0
- package/src/lib/cc-android-bridge.js +4 -0
- package/src/lib/chat-core.js +11 -9
- package/src/lib/cloud/cloud-client.js +10 -1
- package/src/lib/cowork-adapter.js +4 -3
- package/src/lib/decision-layer/providers.js +16 -11
- package/src/lib/decision-layer/runtime.js +180 -10
- package/src/lib/direct-model-usage.js +34 -0
- package/src/lib/evolution/agent-evolution-ingress.js +63 -7
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +10 -0
- package/src/lib/evolution/evolution-evidence-projector.js +46 -7
- package/src/lib/evolution/governed-hub-llm.js +31 -16
- package/src/lib/evolution/governed-hub-resolver.js +4 -0
- package/src/lib/evolution/governed-skill-synthesis-process-grader.js +4 -0
- package/src/lib/evolution/skill-decision-projection.js +211 -0
- package/src/lib/evolution/skill-retrieval-revocation-authority.js +17 -2
- package/src/lib/evomap-client.js +14 -2
- package/src/lib/formal-budget-authority.js +191 -59
- package/src/lib/formal-budget-contract.js +7 -13
- package/src/lib/formal-budget-errors.js +31 -0
- package/src/lib/formal-budget-lineage-registry.js +612 -0
- package/src/lib/formal-budget-provider-scope.js +143 -0
- package/src/lib/formal-budget-transport.js +235 -100
- package/src/lib/gateway-client-resilience.js +5 -0
- package/src/lib/hub-llm-client.js +25 -16
- package/src/lib/llm-connection-probe.js +17 -10
- package/src/lib/llm-providers.js +4 -1
- package/src/lib/model-failure-policy.js +2 -0
- package/src/lib/plugin-runtime/marketplace-network.js +9 -5
- package/src/lib/process-execution-broker/credential-agent.js +7 -2
- package/src/lib/process-execution-broker/credential-transport.js +4 -0
- package/src/lib/process-execution-broker/index.js +8 -0
- package/src/lib/provider-stream.js +28 -13
- package/src/lib/sandbox-egress-worker.js +3 -0
- package/src/lib/skill-loader.js +16 -0
- package/src/lib/stream-retry.js +2 -0
- package/src/lib/sub-agent-context.js +6 -3
- package/src/lib/web-fetch.js +2 -0
- package/src/lib/web-search.js +5 -0
- package/src/repl/agent-repl.js +86 -7
- package/src/runtime/agent-core.js +141 -22
- package/src/runtime/headless-runner.js +212 -22
- package/src/runtime/headless-stream.js +189 -25
- package/src/runtime/mcp-config.js +26 -17
- package/src/runtime/mcp-tool-search.js +44 -14
- package/src/assets/web-panel/assets/Projects-GJjItXIk.js +0 -1
- package/src/assets/web-panel/assets/devWarning-YPX_TU7w.js +0 -1
- package/src/assets/web-panel/assets/index-D53szVZQ.js +0 -1
- package/src/assets/web-panel/assets/index-Ub2nJbV2.js +0 -1
|
@@ -151,7 +151,9 @@ import {
|
|
|
151
151
|
} from "../lib/session-host-snapshot.js";
|
|
152
152
|
import { acquireSessionHostLease } from "../lib/session-host-lease.js";
|
|
153
153
|
import {
|
|
154
|
+
normalizeSessionBudgetRootConfig,
|
|
154
155
|
openProductionSessionBudgetRoot,
|
|
156
|
+
readProductionSessionBudget,
|
|
155
157
|
sessionBudgetAdmissionError,
|
|
156
158
|
} from "../lib/session-budget-production-root.js";
|
|
157
159
|
import {
|
|
@@ -1441,6 +1443,7 @@ async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
|
|
|
1441
1443
|
let lease = null;
|
|
1442
1444
|
let budgetRoot = null;
|
|
1443
1445
|
let onLeaseAbort = null;
|
|
1446
|
+
let taskStarted = false;
|
|
1444
1447
|
try {
|
|
1445
1448
|
if (persist && typeof acquireHostLease === "function") {
|
|
1446
1449
|
lease = acquireHostLease(sessionId, { hostKind: "headless-stream" });
|
|
@@ -1461,13 +1464,109 @@ async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
|
|
|
1461
1464
|
: lease.signal,
|
|
1462
1465
|
}
|
|
1463
1466
|
: options;
|
|
1467
|
+
const canReadCanonical =
|
|
1468
|
+
!hasInjectedSessionStore ||
|
|
1469
|
+
typeof deps.readVerifiedEvents === "function" ||
|
|
1470
|
+
typeof deps.readVerifiedProjection === "function";
|
|
1471
|
+
const budgetStore = deps.sessionBudgetStore;
|
|
1472
|
+
const sidecar =
|
|
1473
|
+
persist && (process.platform === "linux" || budgetStore)
|
|
1474
|
+
? readProductionSessionBudget(sessionId, { store: budgetStore })
|
|
1475
|
+
: null;
|
|
1476
|
+
const needsBudgetAdmission =
|
|
1477
|
+
persist &&
|
|
1478
|
+
(!hasInjectedSessionStore ||
|
|
1479
|
+
options.sessionBudgetRoot?.enabled === true ||
|
|
1480
|
+
Boolean(budgetStore) ||
|
|
1481
|
+
Boolean(deps.openSessionBudget) ||
|
|
1482
|
+
Boolean(sidecar));
|
|
1483
|
+
let effectiveBudgetConfig = options.sessionBudgetRoot;
|
|
1484
|
+
if (needsBudgetAdmission) {
|
|
1485
|
+
const existing = (
|
|
1486
|
+
deps.sessionHasPersistedEvidence ||
|
|
1487
|
+
deps.sessionExists ||
|
|
1488
|
+
jsonlSessionHasPersistedEvidence
|
|
1489
|
+
)(sessionId);
|
|
1490
|
+
if (typeof existing !== "boolean") {
|
|
1491
|
+
throw Object.assign(
|
|
1492
|
+
new Error("stream session existence must be checked synchronously"),
|
|
1493
|
+
{ code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
|
|
1494
|
+
);
|
|
1495
|
+
}
|
|
1496
|
+
if (existing && !canReadCanonical) {
|
|
1497
|
+
throw Object.assign(
|
|
1498
|
+
new Error("budgeted stream resume requires verified session events"),
|
|
1499
|
+
{ code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
|
|
1500
|
+
);
|
|
1501
|
+
}
|
|
1502
|
+
const canonical = existing
|
|
1503
|
+
? readSessionHostResumeState(sessionId, {
|
|
1504
|
+
sessionExists: () => true,
|
|
1505
|
+
readVerifiedEvents:
|
|
1506
|
+
deps.readVerifiedEvents || jsonlReadVerifiedEvents,
|
|
1507
|
+
...(!hasInjectedSessionStore || deps.readVerifiedProjection
|
|
1508
|
+
? {
|
|
1509
|
+
readVerifiedProjection:
|
|
1510
|
+
deps.readVerifiedProjection || jsonlReadVerifiedProjection,
|
|
1511
|
+
}
|
|
1512
|
+
: {}),
|
|
1513
|
+
})
|
|
1514
|
+
: null;
|
|
1515
|
+
if (canonical && !isVerifiedSessionHostSnapshot(canonical.snapshot)) {
|
|
1516
|
+
throw Object.assign(
|
|
1517
|
+
new Error("canonical stream session could not be verified"),
|
|
1518
|
+
{ code: "CC_SESSION_HOST_SNAPSHOT_UNVERIFIED" },
|
|
1519
|
+
);
|
|
1520
|
+
}
|
|
1521
|
+
if (!canonical && sidecar) {
|
|
1522
|
+
throw Object.assign(
|
|
1523
|
+
new Error("budget sidecar has no canonical JSONL session"),
|
|
1524
|
+
{ code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
|
|
1525
|
+
);
|
|
1526
|
+
}
|
|
1527
|
+
if (canonical) {
|
|
1528
|
+
const declared = canonical.sessionBudgetRoot;
|
|
1529
|
+
const requested = options.sessionBudgetRoot?.enabled
|
|
1530
|
+
? normalizeSessionBudgetRootConfig(options.sessionBudgetRoot)
|
|
1531
|
+
: null;
|
|
1532
|
+
if (declared?.enabled) {
|
|
1533
|
+
if (!sidecar) {
|
|
1534
|
+
throw Object.assign(
|
|
1535
|
+
new Error(
|
|
1536
|
+
"budgeted stream session is missing its budget sidecar",
|
|
1537
|
+
),
|
|
1538
|
+
{ code: "CC_SESSION_BUDGET_SIDECAR_REQUIRED" },
|
|
1539
|
+
);
|
|
1540
|
+
}
|
|
1541
|
+
if (
|
|
1542
|
+
requested &&
|
|
1543
|
+
JSON.stringify(requested) !== JSON.stringify(declared)
|
|
1544
|
+
) {
|
|
1545
|
+
throw Object.assign(
|
|
1546
|
+
new Error("stream budget does not match its JSONL declaration"),
|
|
1547
|
+
{ code: "CC_SESSION_BUDGET_CONFIG_MISMATCH" },
|
|
1548
|
+
);
|
|
1549
|
+
}
|
|
1550
|
+
effectiveBudgetConfig = declared;
|
|
1551
|
+
} else if (requested || sidecar) {
|
|
1552
|
+
throw Object.assign(
|
|
1553
|
+
new Error("existing stream has no canonical budget declaration"),
|
|
1554
|
+
{ code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
|
|
1555
|
+
);
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
scopedOptions = {
|
|
1560
|
+
...scopedOptions,
|
|
1561
|
+
sessionBudgetRoot: effectiveBudgetConfig,
|
|
1562
|
+
};
|
|
1464
1563
|
budgetRoot = openProductionSessionBudgetRoot(
|
|
1465
1564
|
persist ? sessionId : null,
|
|
1466
|
-
|
|
1565
|
+
effectiveBudgetConfig,
|
|
1467
1566
|
{
|
|
1468
1567
|
persist,
|
|
1469
1568
|
signal: scopedOptions.signal || null,
|
|
1470
|
-
table:
|
|
1569
|
+
table: effectiveBudgetConfig?.table,
|
|
1471
1570
|
open: deps.openSessionBudget,
|
|
1472
1571
|
store: deps.sessionBudgetStore,
|
|
1473
1572
|
registry: deps.sessionBudgetRegistry,
|
|
@@ -1476,11 +1575,40 @@ async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
|
|
|
1476
1575
|
if (budgetRoot.enabled) {
|
|
1477
1576
|
scopedOptions = { ...scopedOptions, ...budgetRoot.options };
|
|
1478
1577
|
}
|
|
1578
|
+
taskStarted = true;
|
|
1479
1579
|
return await task(scopedOptions, {
|
|
1480
1580
|
...deps,
|
|
1481
1581
|
[STREAM_SESSION_ID]: sessionId,
|
|
1482
1582
|
[STREAM_SESSION_HOST_LEASE]: lease,
|
|
1483
1583
|
});
|
|
1584
|
+
} catch (error) {
|
|
1585
|
+
// Admission can write a lease or take the Linux budget-sidecar read lock
|
|
1586
|
+
// before the workspace runner installs its persistence boundary. Preserve
|
|
1587
|
+
// the lock's filesystem cause, but never reclassify an executing task.
|
|
1588
|
+
if (taskStarted) throw error;
|
|
1589
|
+
const persistence = projectSessionPersistenceFailure(
|
|
1590
|
+
createSessionPersistenceFailure(error, {
|
|
1591
|
+
sessionId,
|
|
1592
|
+
operation: "session-start",
|
|
1593
|
+
}),
|
|
1594
|
+
{ phase: "before-model" },
|
|
1595
|
+
);
|
|
1596
|
+
if (!persistence) throw error;
|
|
1597
|
+
deps.writeOut(
|
|
1598
|
+
`${JSON.stringify({
|
|
1599
|
+
type: "result",
|
|
1600
|
+
subtype: "error_persistence",
|
|
1601
|
+
is_error: true,
|
|
1602
|
+
code: persistence.code,
|
|
1603
|
+
error: "Canonical stream admission failed",
|
|
1604
|
+
session_id: sessionId,
|
|
1605
|
+
persistence,
|
|
1606
|
+
})}\n`,
|
|
1607
|
+
);
|
|
1608
|
+
deps.writeErr(
|
|
1609
|
+
`${persistence.code}: canonical stream admission was refused\n`,
|
|
1610
|
+
);
|
|
1611
|
+
return { exitCode: 1, turns: 0, persistence };
|
|
1484
1612
|
} finally {
|
|
1485
1613
|
budgetRoot?.close?.();
|
|
1486
1614
|
if (lease?.signal && onLeaseAbort) {
|
|
@@ -1914,7 +2042,29 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1914
2042
|
};
|
|
1915
2043
|
}
|
|
1916
2044
|
}
|
|
1917
|
-
} catch {
|
|
2045
|
+
} catch (error) {
|
|
2046
|
+
const persistence = projectSessionPersistenceFailure(
|
|
2047
|
+
createSessionPersistenceFailure(error, {
|
|
2048
|
+
sessionId,
|
|
2049
|
+
operation: "session-start",
|
|
2050
|
+
}),
|
|
2051
|
+
{ phase: "before-model" },
|
|
2052
|
+
);
|
|
2053
|
+
if (persistence) {
|
|
2054
|
+
emit({
|
|
2055
|
+
type: "result",
|
|
2056
|
+
subtype: "error_persistence",
|
|
2057
|
+
is_error: true,
|
|
2058
|
+
code: persistence.code,
|
|
2059
|
+
error: "Canonical stream session preparation failed",
|
|
2060
|
+
session_id: sessionId,
|
|
2061
|
+
persistence,
|
|
2062
|
+
});
|
|
2063
|
+
writeErr(
|
|
2064
|
+
`${persistence.code}: canonical stream preparation was refused\n`,
|
|
2065
|
+
);
|
|
2066
|
+
return { exitCode: 1, turns: 0, persistence };
|
|
2067
|
+
}
|
|
1918
2068
|
const code = "CC_SESSION_HOST_SNAPSHOT_UNVERIFIED";
|
|
1919
2069
|
emit({
|
|
1920
2070
|
type: "result",
|
|
@@ -1986,8 +2136,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1986
2136
|
const { loadHooks, projectHookTrustNotice, attachAuthorityErrors } =
|
|
1987
2137
|
await import("../lib/settings-hooks.cjs");
|
|
1988
2138
|
const loaded = loadHooks({ cwd, settingsFile: options.settingsFile });
|
|
1989
|
-
const { mergePluginHooks } =
|
|
1990
|
-
|
|
2139
|
+
const { mergePluginHooks } = await import(
|
|
2140
|
+
"../lib/plugin-runtime/hooks.js"
|
|
2141
|
+
);
|
|
1991
2142
|
const effectiveHooks = mergePluginHooks(
|
|
1992
2143
|
attachAuthorityErrors(loaded.hooks, loaded.authorityErrors),
|
|
1993
2144
|
{ cwd },
|
|
@@ -2069,8 +2220,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2069
2220
|
});
|
|
2070
2221
|
|
|
2071
2222
|
if (managedSettings) {
|
|
2072
|
-
const { assertManagedPermissionMode } =
|
|
2073
|
-
|
|
2223
|
+
const { assertManagedPermissionMode } = await import(
|
|
2224
|
+
"../lib/settings-loader.cjs"
|
|
2225
|
+
);
|
|
2074
2226
|
assertManagedPermissionMode(options.permissionMode, managedSettings);
|
|
2075
2227
|
}
|
|
2076
2228
|
const perm = resolvePermissionMode(options.permissionMode);
|
|
@@ -2909,8 +3061,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2909
3061
|
: null;
|
|
2910
3062
|
if (!instructionExcludes) {
|
|
2911
3063
|
try {
|
|
2912
|
-
const { readStringArraySetting } =
|
|
2913
|
-
|
|
3064
|
+
const { readStringArraySetting } = await import(
|
|
3065
|
+
"../lib/settings-loader.cjs"
|
|
3066
|
+
);
|
|
2914
3067
|
const fromSettings = readStringArraySetting("instructionExcludes", {
|
|
2915
3068
|
cwd,
|
|
2916
3069
|
settingsFile: options.settingsFile,
|
|
@@ -2975,8 +3128,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2975
3128
|
// Best-effort; no-op when project memory is off or no hook is registered.
|
|
2976
3129
|
if (settingsHooks && _loadedInstructions) {
|
|
2977
3130
|
try {
|
|
2978
|
-
const { runInstructionsLoadedHooks } =
|
|
2979
|
-
|
|
3131
|
+
const { runInstructionsLoadedHooks } = await import(
|
|
3132
|
+
"../lib/settings-hook-events.js"
|
|
3133
|
+
);
|
|
2980
3134
|
const ctx = (
|
|
2981
3135
|
await runInstructionsLoadedHooks(settingsHooks, {
|
|
2982
3136
|
files: _loadedInstructions.files,
|
|
@@ -3018,8 +3172,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3018
3172
|
// settings.json SessionStart hooks → inject session context once (observe-only).
|
|
3019
3173
|
if (settingsHooks) {
|
|
3020
3174
|
try {
|
|
3021
|
-
const { runSessionStartHooks } =
|
|
3022
|
-
|
|
3175
|
+
const { runSessionStartHooks } = await import(
|
|
3176
|
+
"../lib/settings-hook-events.js"
|
|
3177
|
+
);
|
|
3023
3178
|
const ctx = (
|
|
3024
3179
|
await runSessionStartHooks(settingsHooks, {
|
|
3025
3180
|
source: "startup",
|
|
@@ -3069,6 +3224,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3069
3224
|
provider,
|
|
3070
3225
|
model,
|
|
3071
3226
|
observabilityScope: options.observabilityScope,
|
|
3227
|
+
...(options.sessionBudgetRoot?.enabled === true
|
|
3228
|
+
? { sessionBudgetRoot: options.sessionBudgetRoot }
|
|
3229
|
+
: {}),
|
|
3072
3230
|
executionLocation: captureAmbientExecutionLocation({
|
|
3073
3231
|
provider,
|
|
3074
3232
|
model,
|
|
@@ -3453,8 +3611,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3453
3611
|
// the single-prompt runner + the REPL /add-dir path. Best-effort.
|
|
3454
3612
|
if (hostMcp?.mcpClient && additionalDirectories.length > 0) {
|
|
3455
3613
|
try {
|
|
3456
|
-
const { notifyMcpRootsChanged, workspaceRootDirs } =
|
|
3457
|
-
|
|
3614
|
+
const { notifyMcpRootsChanged, workspaceRootDirs } = await import(
|
|
3615
|
+
"../repl/add-dir.js"
|
|
3616
|
+
);
|
|
3458
3617
|
notifyMcpRootsChanged(
|
|
3459
3618
|
[hostMcp.mcpClient],
|
|
3460
3619
|
workspaceRootDirs(options.cwd || process.cwd(), additionalDirectories),
|
|
@@ -4376,15 +4535,17 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4376
4535
|
return compactionCallId;
|
|
4377
4536
|
},
|
|
4378
4537
|
};
|
|
4379
|
-
const { resolveCliContextMemoryCutover } =
|
|
4380
|
-
|
|
4538
|
+
const { resolveCliContextMemoryCutover } = await import(
|
|
4539
|
+
"../lib/context-memory-kernel/authority.js"
|
|
4540
|
+
);
|
|
4381
4541
|
const cutover = resolveCliContextMemoryCutover({
|
|
4382
4542
|
env: options.contextMemoryEnv || process.env,
|
|
4383
4543
|
scopeKey: `cli:session:${sessionId}`,
|
|
4384
4544
|
});
|
|
4385
4545
|
if (cutover.canonical) {
|
|
4386
|
-
const { compactLiveMessagesCanonical } =
|
|
4387
|
-
|
|
4546
|
+
const { compactLiveMessagesCanonical } = await import(
|
|
4547
|
+
"../lib/context-memory-kernel/live-compaction.js"
|
|
4548
|
+
);
|
|
4388
4549
|
const canonical = await compactLiveMessagesCanonical(messages, {
|
|
4389
4550
|
compressor: {
|
|
4390
4551
|
maxTokens: Math.max(
|
|
@@ -4472,8 +4633,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4472
4633
|
} catch (error) {
|
|
4473
4634
|
if (isAbortError(error) || options.signal?.aborted) throw error;
|
|
4474
4635
|
if (error?.runtimeLedgerPersistence === true) throw error;
|
|
4475
|
-
const { getRejectedCompactionUsage } =
|
|
4476
|
-
|
|
4636
|
+
const { getRejectedCompactionUsage } = await import(
|
|
4637
|
+
"../lib/context-memory-kernel/live-compaction.js"
|
|
4638
|
+
);
|
|
4477
4639
|
const rejectedUsage = getRejectedCompactionUsage(error);
|
|
4478
4640
|
if (
|
|
4479
4641
|
rejectedUsage &&
|
|
@@ -4901,8 +5063,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4901
5063
|
// session can honour the user's standing preferences ("越用越聪明"
|
|
4902
5064
|
// flywheel). Best-effort — a learning ledger must never break the chat.
|
|
4903
5065
|
try {
|
|
4904
|
-
const { appendFeedback } =
|
|
4905
|
-
|
|
5066
|
+
const { appendFeedback } = await import(
|
|
5067
|
+
"../lib/pdh-feedback-ledger.js"
|
|
5068
|
+
);
|
|
4906
5069
|
appendFeedback({ sessionId, turnId, kind, comment });
|
|
4907
5070
|
} catch {
|
|
4908
5071
|
/* persistence is best-effort */
|
|
@@ -5074,8 +5237,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
5074
5237
|
// settings.json UserPromptSubmit hooks. block → skip this turn; context → inject.
|
|
5075
5238
|
if (settingsHooks) {
|
|
5076
5239
|
try {
|
|
5077
|
-
const { runUserPromptSubmitHooks } =
|
|
5078
|
-
|
|
5240
|
+
const { runUserPromptSubmitHooks } = await import(
|
|
5241
|
+
"../lib/settings-hook-events.js"
|
|
5242
|
+
);
|
|
5079
5243
|
const ups = await runUserPromptSubmitHooks(settingsHooks, {
|
|
5080
5244
|
prompt: userContent,
|
|
5081
5245
|
cwd,
|
|
@@ -712,8 +712,9 @@ export async function setupMcpFromConfig(servers, deps = {}) {
|
|
|
712
712
|
if (typeof mcpClient.setReconnector === "function") {
|
|
713
713
|
const baseCfg = cfg;
|
|
714
714
|
mcpClient.setReconnector(name, async () => {
|
|
715
|
-
const { ensureValidToken: reauth } =
|
|
716
|
-
|
|
715
|
+
const { ensureValidToken: reauth } = await import(
|
|
716
|
+
"../lib/mcp-oauth.js"
|
|
717
|
+
);
|
|
717
718
|
const fresh = await reauth(baseCfg.url, { forceRefresh: true });
|
|
718
719
|
if (!fresh) return null;
|
|
719
720
|
return {
|
|
@@ -1224,20 +1225,24 @@ export async function loadIdeMcp(opts = {}, deps = {}) {
|
|
|
1224
1225
|
const out = await setupMcpFromConfig({ ide: cfg }, deps);
|
|
1225
1226
|
// Hot reconnect: a window reload / extension update restarts the editor's
|
|
1226
1227
|
// MCP server on a NEW port with a NEW token. Register a reconnector so a
|
|
1227
|
-
//
|
|
1228
|
-
//
|
|
1229
|
-
//
|
|
1228
|
+
// connection failure re-scans the lockfiles mid-session. An unknown tool
|
|
1229
|
+
// outcome is returned without replay; the next explicit call can use the
|
|
1230
|
+
// recovered bridge. Note the stale CHAINLESSCHAIN_IDE_PORT in
|
|
1230
1231
|
// our env no longer matches any live lock, so discovery falls through to
|
|
1231
1232
|
// the workspace scan — exactly the path that finds the restarted instance.
|
|
1232
1233
|
if (out?.mcpClient?.setReconnector) {
|
|
1233
|
-
out.mcpClient.setReconnector(
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1234
|
+
out.mcpClient.setReconnector(
|
|
1235
|
+
"ide",
|
|
1236
|
+
() => {
|
|
1237
|
+
const fresh = discover({
|
|
1238
|
+
cwd: opts.cwd,
|
|
1239
|
+
env: opts.env,
|
|
1240
|
+
force: opts.force === true,
|
|
1241
|
+
});
|
|
1242
|
+
return fresh ? toCfg(fresh) : null;
|
|
1243
|
+
},
|
|
1244
|
+
{ recoverUnknownOutcome: true },
|
|
1245
|
+
);
|
|
1241
1246
|
}
|
|
1242
1247
|
return out;
|
|
1243
1248
|
}
|
|
@@ -1323,10 +1328,14 @@ export async function loadJetbrainsMcp(opts = {}, deps = {}) {
|
|
|
1323
1328
|
// re-injects a fresh CHAINLESSCHAIN_JETBRAINS_MCP_URL into the next spawn —
|
|
1324
1329
|
// though within one run the env is fixed, so this just re-validates it).
|
|
1325
1330
|
if (out?.mcpClient?.setReconnector) {
|
|
1326
|
-
out.mcpClient.setReconnector(
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1331
|
+
out.mcpClient.setReconnector(
|
|
1332
|
+
"idea",
|
|
1333
|
+
() => {
|
|
1334
|
+
const fresh = discover({ env: opts.env });
|
|
1335
|
+
return fresh ? toCfg(fresh) : null;
|
|
1336
|
+
},
|
|
1337
|
+
{ recoverUnknownOutcome: true },
|
|
1338
|
+
);
|
|
1330
1339
|
}
|
|
1331
1340
|
return out;
|
|
1332
1341
|
}
|
|
@@ -416,7 +416,10 @@ export function maybeApplyToolSearch(mcp, opts = {}) {
|
|
|
416
416
|
if (config.enabled === false) return null;
|
|
417
417
|
|
|
418
418
|
const estimate = opts.estimate || defaultEstimateTokens;
|
|
419
|
-
|
|
419
|
+
// Once a session has a deferred catalog, later connections must keep using
|
|
420
|
+
// it even when the compact stubs bring the current request below threshold.
|
|
421
|
+
// Rechecking only the shrunken request would expose late schemas in full.
|
|
422
|
+
if (config.enabled === "auto" && !mcp.toolSearchRegistry) {
|
|
420
423
|
const window = getContextWindow(opts.model, opts.provider);
|
|
421
424
|
let mcpTokens = 0;
|
|
422
425
|
for (const def of mcp.extraToolDefinitions) {
|
|
@@ -472,10 +475,13 @@ function normalizeTerms(query) {
|
|
|
472
475
|
*/
|
|
473
476
|
export function searchDeferredTools(registry, query, opts = {}) {
|
|
474
477
|
const q = String(query || "").trim();
|
|
478
|
+
const configuredMaxResults = registry?.maxResults;
|
|
475
479
|
const maxResults =
|
|
476
480
|
Number.isInteger(opts.maxResults) && opts.maxResults > 0
|
|
477
481
|
? Math.min(opts.maxResults, 50)
|
|
478
|
-
:
|
|
482
|
+
: Number.isInteger(configuredMaxResults) && configuredMaxResults > 0
|
|
483
|
+
? Math.min(configuredMaxResults, 50)
|
|
484
|
+
: TOOL_SEARCH_DEFAULTS.maxResults;
|
|
479
485
|
const entries = new Map(
|
|
480
486
|
[...(registry?.deferred || [])].filter(([, entry]) => entry.stale !== true),
|
|
481
487
|
);
|
|
@@ -488,22 +494,31 @@ export function searchDeferredTools(registry, query, opts = {}) {
|
|
|
488
494
|
.filter(Boolean);
|
|
489
495
|
const results = [];
|
|
490
496
|
const notFound = [];
|
|
497
|
+
const seen = new Set();
|
|
498
|
+
let omittedCount = 0;
|
|
491
499
|
for (const w of wanted) {
|
|
500
|
+
let match = null;
|
|
492
501
|
if (entries.has(w)) {
|
|
493
|
-
|
|
494
|
-
continue;
|
|
495
|
-
}
|
|
496
|
-
// bare tool name → unique suffix match
|
|
497
|
-
const matches = [...entries.keys()].filter(
|
|
498
|
-
(k) => k.endsWith(`__${w}`) || entries.get(k).toolName === w,
|
|
499
|
-
);
|
|
500
|
-
if (matches.length === 1) {
|
|
501
|
-
results.push({ name: matches[0], entry: entries.get(matches[0]) });
|
|
502
|
+
match = w;
|
|
502
503
|
} else {
|
|
504
|
+
// bare tool name → unique suffix match
|
|
505
|
+
const matches = [...entries.keys()].filter(
|
|
506
|
+
(k) => k.endsWith(`__${w}`) || entries.get(k).toolName === w,
|
|
507
|
+
);
|
|
508
|
+
if (matches.length === 1) match = matches[0];
|
|
509
|
+
}
|
|
510
|
+
if (!match) {
|
|
503
511
|
notFound.push(w);
|
|
512
|
+
} else if (!seen.has(match)) {
|
|
513
|
+
seen.add(match);
|
|
514
|
+
if (results.length < maxResults) {
|
|
515
|
+
results.push({ name: match, entry: entries.get(match) });
|
|
516
|
+
} else {
|
|
517
|
+
omittedCount += 1;
|
|
518
|
+
}
|
|
504
519
|
}
|
|
505
520
|
}
|
|
506
|
-
return { mode: "select", results, notFound };
|
|
521
|
+
return { mode: "select", results, notFound, omittedCount };
|
|
507
522
|
}
|
|
508
523
|
|
|
509
524
|
const terms = normalizeTerms(q);
|
|
@@ -549,7 +564,18 @@ export function executeToolSearch(registry, args = {}) {
|
|
|
549
564
|
'tool_search requires a "query" argument — use "select:<tool_name>" or keywords.',
|
|
550
565
|
};
|
|
551
566
|
}
|
|
552
|
-
|
|
567
|
+
if (query.length > 8192) {
|
|
568
|
+
return {
|
|
569
|
+
error:
|
|
570
|
+
"tool_search query is too long; select fewer tool names or use shorter keywords.",
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
const {
|
|
574
|
+
mode,
|
|
575
|
+
results,
|
|
576
|
+
notFound,
|
|
577
|
+
omittedCount = 0,
|
|
578
|
+
} = searchDeferredTools(registry, query, {
|
|
553
579
|
maxResults:
|
|
554
580
|
typeof args.max_results === "number"
|
|
555
581
|
? Math.floor(args.max_results)
|
|
@@ -579,6 +605,7 @@ export function executeToolSearch(registry, args = {}) {
|
|
|
579
605
|
tools,
|
|
580
606
|
};
|
|
581
607
|
if (notFound.length > 0) payload.notFound = notFound;
|
|
608
|
+
if (omittedCount > 0) payload.omittedCount = omittedCount;
|
|
582
609
|
if (tools.length === 0) {
|
|
583
610
|
payload.note =
|
|
584
611
|
mode === "select"
|
|
@@ -590,7 +617,10 @@ export function executeToolSearch(registry, args = {}) {
|
|
|
590
617
|
.slice(0, 100);
|
|
591
618
|
} else {
|
|
592
619
|
payload.note =
|
|
593
|
-
"Schemas loaded — call these tools directly with arguments matching `parameters`."
|
|
620
|
+
"Schemas loaded — call these tools directly with arguments matching `parameters`." +
|
|
621
|
+
(omittedCount > 0
|
|
622
|
+
? " Some selected tools were omitted by max_results; select those tools in a separate search before calling them."
|
|
623
|
+
: "");
|
|
594
624
|
}
|
|
595
625
|
return payload;
|
|
596
626
|
}
|
|
@@ -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-CkqBoCiu.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as Fe,aP as be,f as je,a5 as Ce,a8 as xe,at as Oe,R as Se}from"./icons-DG5UD-6K.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:W}=de();async function w(o,f,ye,ae=8e3){if(W){const Z=await e.sendRaw({...f,type:o},ae);if(!Z?.ok){const $=Z?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return Z.result}return e.executeJson(ye,ae)}const B=u(!1),y=u([]),O=u(""),S=u(""),P=u(!1),v=u(null),U=u([]),k=u(!1),E=u(!1),L=u(!1),F=u({name:"",description:"",type:"document",rootPath:""}),z=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],V=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),J=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function K(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function Q(o){return!o&&o!==0?"-":new Date(typeof o=="number"?o:parseInt(o,10)).toLocaleString("zh-CN",{hour12:!1})}async function C(){B.value=!0;try{const o=await w("project.list",{limit:500},"project list --limit 500 --json",1e4);y.value=Array.isArray(o?.projects)?o.projects:Array.isArray(o)?o:[]}catch(o){d.error("加载失败: "+(o.message||o)),y.value=[]}finally{B.value=!1}}function G(o){return{onClick:()=>M(o)}}async function M(o){v.value=o,P.value=!0,k.value=!0,U.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);U.value=Array.isArray(f?.files)?f.files:[]}catch{U.value=[]}finally{k.value=!1}}async function H(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function X(){F.value={name:"",description:"",type:"document",rootPath:""},E.value=!0}async function T(){if(!F.value.name.trim()){d.warning("请输入项目名称");return}L.value=!0;try{const o=await w("project.init",{name:F.value.name.trim(),description:F.value.description||null,projectType:F.value.type,rootPath:F.value.rootPath||null},`project init "${F.value.name.trim()}" --type ${F.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),E.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{L.value=!1}}const b=u(!1),D=u(!1),j=u({path:"",content:""}),h=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),Y=u(!1);function ue(){j.value={path:"",content:""},b.value=!0}function ce(){R.value={path:""},h.value=!0}async function N(){if(v.value){k.value=!0;try{const o=await w("project.listFiles",{projectId:v.value.id,limit:200},`project list-files ${v.value.id} --json`,8e3);U.value=Array.isArray(o?.files)?o.files:[]}catch(o){d.error("刷新文件失败: "+(o.message||o))}finally{k.value=!1}}}async function fe(){if(!j.value.path.trim()){d.warning("请输入文件路径");return}if(v.value){D.value=!0;try{const o=await w("project.createFile",{projectId:v.value.id,filePath:j.value.path.trim(),content:j.value.content||""},`project create-file ${v.value.id} "${j.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件 '${o.file_name}'`),b.value=!1,await N(),await C()):d.error("创建文件失败")}catch(o){d.error(o.message||String(o))}finally{D.value=!1}}}async function pe(){if(!R.value.path.trim()){d.warning("请输入文件夹路径");return}if(v.value){m.value=!0;try{const o=await w("project.createFolder",{projectId:v.value.id,folderPath:R.value.path.trim()},`project create-folder ${v.value.id} "${R.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件夹 '${o.file_name}'`),h.value=!1,await N(),await C()):d.error("创建文件夹失败")}catch(o){d.error(o.message||String(o))}finally{m.value=!1}}}async function ve(o){try{(await w("project.deleteFile",{fileId:o.id},`project delete-file ${o.id} --json`,8e3))?.deleted?(d.success(`已删除 '${o.file_name}'`),await N(),await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}async function me(o){if(o.is_folder){d.info("文件夹无内容可编辑");return}try{const f=await w("project.getFile",{fileId:o.id},`project get-file ${o.id} --json`,8e3);c.value=o,q.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){Y.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:q.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await N()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{Y.value=!1}}}oe(()=>{C()});const le={t:te,ws:e,isEmbedded:W,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:U,filesLoading:k,createOpen:E,creating:L,newProject:F,columns:z,countByStatus:V,filteredProjects:J,statusColor:g,syncColor:K,formatTime:Q,loadAll:C,onRowClick:G,openDetail:M,onDelete:H,onShowCreate:X,onCreate:T,createFileOpen:b,creatingFile:D,newFile:j,createFolderOpen:h,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:Y,openCreateFile:ue,openCreateFolder:ce,refreshFiles:N,onCreateFile:fe,onCreateFolder:pe,onDeleteFile:ve,openEditFile:me,onSaveFile:_e,ref:u,computed:ee,onMounted:oe,get ReloadOutlined(){return Se},get PlusOutlined(){return Oe},get FolderOutlined(){return xe},get FileTextOutlined(){return Ce},get CheckCircleOutlined(){return je},get CheckSquareOutlined(){return be},get FileAddOutlined(){return Fe},get FolderAddOutlined(){return ke},get message(){return d},get useI18n(){return re},get useWsStore(){return ie},get useShellMode(){return de}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},he={class:"page-title"},Ae={class:"page-sub"},Ie={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},Ue={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Te={key:1,style:{color:"#888"}},Be=["onClick"],Ee={key:0,style:{color:"#888","font-size":"12px"}};function Le(se,l,te,e,W,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),U=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=i("a-input-search"),F=i("a-alert"),z=i("a-tag"),V=i("a-popconfirm"),J=i("a-table"),g=i("a-descriptions-item"),K=i("a-descriptions"),Q=i("a-divider"),C=i("a-empty"),G=i("a-list-item"),M=i("a-list"),H=i("a-spin"),X=i("a-drawer"),T=i("a-input"),b=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),h=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),A("div",null,[I("div",ze,[I("div",null,[I("h2",he,s(e.t("projects.title")),1),I("p",Ae,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(U,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),I("div",Ie,[t(E,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(L,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(F,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(J,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),A("code",Ue,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),A(ne,{key:1},[I("strong",null,s(c.name),1),c.description?(p(),A("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),A(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:q=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(V,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(X,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(K,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[I("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),A("code",Re,s(e.detail.root_path),1)):(p(),A("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(Q,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(H,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(M,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(G,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),A("span",Ee,s(n.file_size)+" B",1)):_("v-if",!0),t(V,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[I("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(h,{open:e.createFileOpen,"onUpdate:open":l[6]||(l[6]=n=>e.createFileOpen=n),title:"新建文件","confirm-loading":e.creatingFile,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFile},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFile.path,"onUpdate:value":l[4]||(l[4]=n=>e.newFile.path=n),placeholder:"例如 README.md 或 src/main.kt"},null,8,["value"])]),_:1}),t(b,{label:"初始内容(可选)"},{default:a(()=>[t(D,{value:e.newFile.content,"onUpdate:value":l[5]||(l[5]=n=>e.newFile.content=n),rows:6,placeholder:"留空创建空文件"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Create folder modal "),t(h,{open:e.createFolderOpen,"onUpdate:open":l[8]||(l[8]=n=>e.createFolderOpen=n),title:"新建文件夹","confirm-loading":e.creatingFolder,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFolder},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件夹路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFolder.path,"onUpdate:value":l[7]||(l[7]=n=>e.newFolder.path=n),placeholder:"例如 src/utils"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Edit file content modal "),t(h,{open:e.editFileOpen,"onUpdate:open":l[10]||(l[10]=n=>e.editFileOpen=n),title:`编辑 ${e.editingFile?.file_name||""}`,"confirm-loading":e.savingFile,"ok-text":"保存","cancel-text":"取消",onOk:e.onSaveFile,width:"720"},{default:a(()=>[t(D,{value:e.editFileContent,"onUpdate:value":l[9]||(l[9]=n=>e.editFileContent=n),rows:18,"auto-size":{minRows:12,maxRows:24},style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["open","title","confirm-loading"]),_(" Create modal "),t(h,{open:e.createOpen,"onUpdate:open":l[15]||(l[15]=n=>e.createOpen=n),title:"新建项目","confirm-loading":e.creating,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreate},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"项目名称",required:""},{default:a(()=>[t(T,{value:e.newProject.name,"onUpdate:value":l[11]||(l[11]=n=>e.newProject.name=n),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(b,{label:"描述"},{default:a(()=>[t(D,{value:e.newProject.description,"onUpdate:value":l[12]||(l[12]=n=>e.newProject.description=n),rows:2},null,8,["value"])]),_:1}),t(b,{label:"类型"},{default:a(()=>[t(R,{value:e.newProject.type,"onUpdate:value":l[13]||(l[13]=n=>e.newProject.type=n)},{default:a(()=>[t(m,{value:"document"},{default:a(()=>[...l[32]||(l[32]=[r("文档 (document)",-1)])]),_:1}),t(m,{value:"data"},{default:a(()=>[...l[33]||(l[33]=[r("数据 (data)",-1)])]),_:1}),t(m,{value:"web"},{default:a(()=>[...l[34]||(l[34]=[r("Web",-1)])]),_:1}),t(m,{value:"app"},{default:a(()=>[...l[35]||(l[35]=[r("应用 (app)",-1)])]),_:1}),t(m,{value:"presentation"},{default:a(()=>[...l[36]||(l[36]=[r("演示文稿",-1)])]),_:1}),t(m,{value:"spreadsheet"},{default:a(()=>[...l[37]||(l[37]=[r("表格",-1)])]),_:1}),t(m,{value:"design"},{default:a(()=>[...l[38]||(l[38]=[r("设计",-1)])]),_:1}),t(m,{value:"code"},{default:a(()=>[...l[39]||(l[39]=[r("代码",-1)])]),_:1}),t(m,{value:"workflow"},{default:a(()=>[...l[40]||(l[40]=[r("工作流",-1)])]),_:1}),t(m,{value:"knowledge"},{default:a(()=>[...l[41]||(l[41]=[r("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(b,{label:"根路径 (可选)"},{default:a(()=>[t(T,{value:e.newProject.rootPath,"onUpdate:value":l[14]||(l[14]=n=>e.newProject.rootPath=n),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}const We=we(Pe,[["render",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-Phhog6/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-CkqBoCiu.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-04BSIj_z.js";import{a0 as t}from"./index-CkqBoCiu.js";import"./vendor-Bn1JzzAn.js";import"./index-6f6n0KFR.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-DQA_S8-9.js";import{a0 as t}from"./index-CkqBoCiu.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-bX7CsyWy.js";import"./useFlexGapSupport-DEqGB5Ng.js";import"./styleChecker-DHv_UilX.js";import"./index-6f6n0KFR.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|