chainlesschain 0.165.4 → 0.165.6
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/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-C__nnraW.js → AIOps-vfoDb6HZ.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CsKWHEZ-.js → ActionButton-Cm5f7p93.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BhIjfjWO.js → Analytics-yRuvgWxa.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BjuXFzWZ.js → AppLayout-BROsC4h1.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-k6whDkZJ.js → Artifacts-CimHApb1.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-C4FBMYRh.js → Audit-DI8kr8zI.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-C_vRrSXk.js → BackgroundAgents-DSLzKy-n.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CngFZeVp.js → Backup-DkH_n2r1.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-B_H9EBRm.js → BaseInput-CKSrUoRA.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DLEC5kt7.js → Chat-ClwfMXUS.js} +3 -3
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CjMaqfL7.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-m3ClR4xh.js → Checkbox-BYTehcQG.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CmLSFrgp.js → Codegen-B8AMcp6J.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DFGQteHN.js → Col-BNSogPo3.js} +1 -1
- package/src/assets/web-panel/assets/{Community-EUUVORHE.js → Community-JxPvGb8O.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-2PSg0Yr7.js → Compact-DF7bFAgE.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CcKur7gB.js → Compliance-Bvhqnwrq.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DK_Fezfa.js → Cowork-BDS0CJvM.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Dbw89xl7.js → Cron-DqvRfxoQ.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CH66h_Ec.js → Crosschain-CDcIvnqS.js} +1 -1
- package/src/assets/web-panel/assets/{DID-D1igRb17.js → DID-D7jaUxU3.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DVAsrobk.js → Dashboard-B5A18wEV.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Dl7W8AQs.js → Dropdown-_6IVkGag.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-D5tpaEQC.js → EmailListRenderer-C9PeiKCG.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-O_VQf8gq.js → FamilyGuardDashboard-DXjuEHrX.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BTVcgS9n.js → Federation-B4IAR9zv.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BRnkJAIz.js → FormItemContext-CxQeSNx1.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-8OWSCkDj.js → GenericCardRenderer-B8GS-Y3N.js} +1 -1
- package/src/assets/web-panel/assets/{Git-WXLYTQj2.js → Git-BS8SouUX.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BezaUhtc.js → Governance-Dq9aYb5Q.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CuRay3Gu.js → Inference-BrCEe9AJ.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DfWLDW1m.js → KnowledgeGraph-DybOpiY2.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C55y2pPY.js → Logs-DBpzbRfx.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-CFyt8iUd.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Dk08Uycg.js → Marketplace-Cc7CCSCu.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C11fSB5V.js → McpTools-DFaIhOfu.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-mr0eZc97.js → Memory-KCqlp9ol.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-C0iCSRbb.js → MobileBridge-Bys84ySN.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CY-xMG8Z.js → MobileProjects-B-6qU-je.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Bplqc_Wc.js → Mtc-BgY-fvCq.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-BlzwsoSM.js → MtcAudit-B8pCmqQJ.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-BBLmTty6.js → Multisig-BbOmYutA.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DtT1uf1W.js → NLProgramming-BocLQz_M.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DcqQAxTK.js → Notes-CSwbxEop.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-cb0kWoZe.js → NotificationSettings-CqFNSYG3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-kw9HZQNN.js → OrderTableRenderer-C6gMfAk7.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DlTlbkUN.js → Organization-QrDXVdMJ.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-pp1qs-oY.js → Overflow-Cxntotjt.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BESLnyYz.js → P2P-CIdBOwNq.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-B-J1mGuf.js → PdhVaultBrowser-CT5aP8rD.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-B36PeT1_.js → Permissions-DH7OM8XU.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CTK2ad-3.js → PersonalDataHub-CnJqbWce.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-zJNGXsac.js → Pipeline-5C3HG1kH.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-b9fz0Qf0.js → Privacy-B4yIp7xK.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DjZbZgiB.js → ProjectInit-BMvt-2M0.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C-hHJXlD.js → ProjectSettings-CvSTEMRG.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BKBJxEek.js +1 -0
- package/src/assets/web-panel/assets/Providers-BdwUqFWN.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-A0yoQ3-3.js → QrScannerModal-DtnCKlTm.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DrFgFJNC.js → QuickAsk-sTbgwyNr.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-KC8hF1g4.js → Recommend-Bzr14gSb.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DGTPIk6u.js → RemoteSession-C_TF5IaJ.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-QmbwM7Yk.js → Reputation-GCAM4H2K.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BxjJylia.js → Row-Dir0r6OQ.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-B7Wda1J6.js → RssFeed-CpGnlecX.js} +2 -2
- package/src/assets/web-panel/assets/{Search-_plQ_YSA.js → Search-DMMamC6u.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CD2YJZfx.js → Security-yqay5yG-.js} +4 -4
- package/src/assets/web-panel/assets/{Services-qQE7NmwE.js → Services-C5i2wh9G.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DgQqkFf7.js → Skeleton-vUqk35yj.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-C4C0oFFt.js → Skills-DzcSkhot.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Px2N2B5c.js → Sla-CB6qbYNr.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DN6C3lQd.js → SpeechSettings-BHUI7cox.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-jm5aH_m7.js → SyncSettings-D-RrsxTJ.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DlkJcv67.js → Tasks-DFxdOJiq.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DyrTHUBs.js → Templates-SKAob_Aq.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-mC434PtL.js → Tenant-BPfsfHQ-.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-o0_s3NgK.js → Terminal-8iw7FpUf.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DAGlAXOw.js → TimelineRenderer-C4Gjj5Su.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BnulS_bs.js → Tokens-COYhN18e.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-suQbVXYM.js → Trigger-B-JzXcf6.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DbIJAPo5.js → Trust-BJ5bg0nI.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CQNpbIHi.js → UkeySign-BG_ByRMf.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D8aWCERk.js → VideoEditing-B3kOnSiU.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CuLpYfZc.js → Wallet-CcoGFnK7.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-CsfG8ZMc.js → WebAuthn-DdT8vRC_.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BYsEAZbd.js → WorkflowEditor-CZu3M9N8.js} +1 -1
- package/src/assets/web-panel/assets/{chat-FT4Um3-I.js → chat-DxJt3Qba.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CKbS_Wlt.js → colors-DdYfwJaB.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CFJtzuJM.js → compact-item-BG3SUzwj.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-B9kSRW6K.js → createContext-By51z2-1.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DorRZcI9.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DR-x0Xpi.js → hasIn-B0apZ3KJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjEP7WkH.js → index-3jWkIu5j.js} +1 -1
- package/src/assets/web-panel/assets/{index-7jHr_A_k.js → index-B3rWuPMW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcfxhKXR.js → index-B5rLiEo0.js} +1 -1
- package/src/assets/web-panel/assets/{index-tqSEHPRT.js → index-BBPf3TpM.js} +1 -1
- package/src/assets/web-panel/assets/index-BETiL0a3.js +1 -0
- package/src/assets/web-panel/assets/{index-Cr2FLUsD.js → index-BIrJfqO4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bt4fS2eL.js → index-BLIbGOLX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwR7yc2h.js → index-BP94CrBV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVPU43b1.js → index-BWF8_mkx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DShSkww-.js → index-BYINoRLK.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bzz0C1BZ.js → index-BZ_0qm4g.js} +1 -1
- package/src/assets/web-panel/assets/{index-KqDaCApw.js → index-BewKYrX9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BW-t9n-q.js → index-BfWYsB9t.js} +1 -1
- package/src/assets/web-panel/assets/index-BhAVHuW8.js +1 -0
- package/src/assets/web-panel/assets/{index-B7osrXqy.js → index-Bissefox.js} +3 -3
- package/src/assets/web-panel/assets/{index-DW4BWjTk.js → index-BkvcEo4p.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdkIhfi-.js → index-Bos5_aMV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTxNy0ZU.js → index-C1C9i79A.js} +1 -1
- package/src/assets/web-panel/assets/{index-QBSeNVO3.js → index-CAhHirVH.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4LfPvWA.js → index-CNIxXMmN.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_enk9I_.js → index-CW93tZDv.js} +1 -1
- package/src/assets/web-panel/assets/{index-WE08gMJP.js → index-CWEuZWCK.js} +1 -1
- package/src/assets/web-panel/assets/{index-r2VI1Ikk.js → index-Cp6e-hGw.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dap9c3eD.js → index-CpjZhgNd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWdqx7zI.js → index-CzmQElZy.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGbPnC5x.js → index-DCn8IcxV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DiNUEpSQ.js → index-DE76D-kA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtkFqPVA.js → index-DaIz0NAW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGaXUsIs.js → index-Da_WBdLX.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3ZX81mK.js → index-Dz49VOyQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BK3TiKVq.js → index-Q2SCX-MI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJmIQ9XR.js → index-RD6O-0C6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CvrCCqJt.js → index-SQqOlR3d.js} +1 -1
- package/src/assets/web-panel/assets/{index-BI5hP_qy.js → index-ZFbps9po.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeSgw-WV.js → index-ZxtP8jG7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMGmg497.js → index-bP_VlDb4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfFCQHL3.js → index-kf57LJ93.js} +1 -1
- package/src/assets/web-panel/assets/{index-OSzjTzGM.js → index-oxRrmFO9.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2JvmYRc.js → index-p1_8SbI1.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Dd7n7VgI.js → initDefaultProps-BWJktcg8.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BwxouRw1.js → motion-BEXBzUFV.js} +1 -1
- package/src/assets/web-panel/assets/{move-DObN0PG9.js → move-BUKwn2sx.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-B3nOUQc7.js → mtc-parser-FTI7btqQ.js} +1 -1
- package/src/assets/web-panel/assets/{omit-o9WU2Nbl.js → omit-CsLtSPH3.js} +1 -1
- package/src/assets/web-panel/assets/parsers-YNLm7sQ0.js +4 -0
- package/src/assets/web-panel/assets/{pickAttrs-CL_vvfQ_.js → pickAttrs-DWZxsT_S.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CYrM2tyK.js → placementArrow-Bcfs43CX.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-k_06cQ96.js → responsiveObserve-a9bcC1p-.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CPKG0pxS.js → slide-BDTzgOXN.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BDDEeLTw.js → statusUtils-Iq1j_HUg.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Cmb7RTh7.js → styleChecker-DAZEYxeh.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-e2IedC4N.js → useFlexGapSupport-DVkjyDrh.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CE_gxVnm.js → useFs-wXTpNTHt.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BkMIIKMz.js → usePersonalDataHub-CtQM_aZr.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DW886XV1.js → vnode-hjEoG85v.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Dwo_adaf.js → zoom-BHVpyKg_.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +14 -2
- package/src/commands/artifacts.js +235 -0
- package/src/commands/background-session.js +100 -10
- package/src/commands/cowork.js +86 -57
- package/src/commands/mcp.js +5 -0
- package/src/commands/plugin.js +145 -29
- package/src/commands/remote-control.js +295 -110
- package/src/commands/session-location.js +20 -1
- package/src/commands/session-message.js +171 -0
- package/src/commands/session.js +75 -69
- package/src/data/changelog.json +29 -3
- package/src/gateways/ws/message-dispatcher.js +57 -0
- package/src/harness/mcp-client.js +141 -10
- package/src/lib/artifact-access-ledger.js +1 -0
- package/src/lib/artifact-deletion-ledger.js +1 -0
- package/src/lib/artifact-recovery.js +970 -0
- package/src/lib/artifact-workbench-projection.js +171 -0
- package/src/lib/background-session-transport.js +153 -27
- package/src/lib/dynamic-workflow-runtime.js +408 -1
- package/src/lib/execution-location-target.js +4 -2
- package/src/lib/mcp-client.js +2 -0
- package/src/lib/mcp-headers-helper.js +47 -5
- package/src/lib/mcp-oauth.js +55 -6
- package/src/lib/mcp-stdio-executable-identity.js +16 -0
- package/src/lib/mcp-stdio-native-code-policy.js +74 -0
- package/src/lib/mcp-stdio-package-materialization.js +12 -3
- package/src/lib/mcp-tls.js +230 -0
- package/src/lib/output-styles.js +12 -0
- package/src/lib/plugin-runtime/install.js +614 -71
- package/src/lib/plugin-runtime/marketplace-archive-source.js +331 -0
- package/src/lib/plugin-runtime/marketplace-catalog.js +52 -6
- package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1 -0
- package/src/lib/plugin-runtime/marketplace-source-adapter.js +163 -0
- package/src/lib/plugin-runtime/marketplace-source-cache.js +11 -1
- package/src/lib/plugin-runtime/remote-source.js +435 -55
- package/src/lib/plugin-security.js +393 -41
- package/src/lib/plugin-source-identity.js +850 -0
- package/src/lib/process-execution-broker/index.js +112 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +57 -3
- package/src/lib/process-execution-broker/workspace-transaction.js +26 -0
- package/src/lib/remote-approval-bridge.js +136 -46
- package/src/lib/remote-control.js +217 -31
- package/src/lib/session-message-fabric.js +1105 -0
- package/src/lib/session-projection.js +171 -12
- package/src/lib/session-runtime-retention.js +155 -0
- package/src/lib/settings-loader.cjs +29 -0
- package/src/repl/agent-repl.js +51 -14
- package/src/repl/permission-prompt.js +31 -8
- package/src/repl/repl-keybindings.js +55 -0
- package/src/runtime/agent-core.js +63 -2
- package/src/runtime/headless-runner.js +47 -66
- package/src/runtime/headless-stream.js +18 -24
- package/src/runtime/mcp-config.js +2 -0
- package/src/runtime/policies/agent-policy.js +2 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-xijcWkJe.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-hDpWdiBc.js +0 -1
- package/src/assets/web-panel/assets/Projects-BC9KSDM6.js +0 -1
- package/src/assets/web-panel/assets/Providers-Dz-CAYYU.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DJZ0gAMu.js +0 -1
- package/src/assets/web-panel/assets/index-Bizb4hkw.js +0 -1
- package/src/assets/web-panel/assets/index-OHSl-xCh.js +0 -1
- package/src/assets/web-panel/assets/parsers-UEvh_ShA.js +0 -4
|
@@ -1,5 +1,60 @@
|
|
|
1
1
|
/** Declarative, validated keybindings for interactive prompt actions. */
|
|
2
2
|
|
|
3
|
+
export const DEFAULT_REPL_KEYBINDING_FLAVOR = "classic";
|
|
4
|
+
export const REPL_KEYBINDING_FLAVORS = Object.freeze([
|
|
5
|
+
DEFAULT_REPL_KEYBINDING_FLAVOR,
|
|
6
|
+
"readline",
|
|
7
|
+
]);
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Resolve the prompt editing flavor. Unknown values stay on the compatible
|
|
11
|
+
* classic behavior and include a diagnostic for the caller to surface.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveReplKeybindingFlavor(value) {
|
|
14
|
+
if (value == null || String(value).trim() === "") {
|
|
15
|
+
return { flavor: DEFAULT_REPL_KEYBINDING_FLAVOR, error: null };
|
|
16
|
+
}
|
|
17
|
+
const flavor = String(value).trim().toLowerCase();
|
|
18
|
+
if (REPL_KEYBINDING_FLAVORS.includes(flavor)) {
|
|
19
|
+
return { flavor, error: null };
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
flavor: DEFAULT_REPL_KEYBINDING_FLAVOR,
|
|
23
|
+
error: `keybindingFlavor must be classic or readline (got "${String(value)}")`,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** True for the terminal Ctrl+W chord used by readline's unix-word-rubout. */
|
|
28
|
+
export function isReadlineWordRuboutKey(input, key = {}) {
|
|
29
|
+
if (key.meta || key.alt || key.shift) return false;
|
|
30
|
+
const name = String(key.name || "").toLowerCase();
|
|
31
|
+
return (
|
|
32
|
+
key.ctrl === true &&
|
|
33
|
+
(name === "w" || input === "\u0017" || key.sequence === "\u0017")
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Delete the token immediately left of the cursor using whitespace-only word
|
|
39
|
+
* boundaries. This intentionally treats a full path as one token, unlike the
|
|
40
|
+
* classic path-segment behavior. Text right of the cursor is preserved.
|
|
41
|
+
*/
|
|
42
|
+
export function readlineWordRubout(line, cursor) {
|
|
43
|
+
const text = String(line || "");
|
|
44
|
+
const point = Math.max(
|
|
45
|
+
0,
|
|
46
|
+
Math.min(Number.isInteger(cursor) ? cursor : text.length, text.length),
|
|
47
|
+
);
|
|
48
|
+
let start = point;
|
|
49
|
+
while (start > 0 && /\s/u.test(text[start - 1])) start -= 1;
|
|
50
|
+
while (start > 0 && !/\s/u.test(text[start - 1])) start -= 1;
|
|
51
|
+
return {
|
|
52
|
+
line: text.slice(0, start) + text.slice(point),
|
|
53
|
+
cursor: start,
|
|
54
|
+
changed: start !== point,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
3
58
|
export const REPL_KEYBINDING_ACTIONS = Object.freeze([
|
|
4
59
|
"prompt.edit",
|
|
5
60
|
"prompt.stash",
|
|
@@ -136,6 +136,7 @@ import {
|
|
|
136
136
|
} from "../harness/structured-handoff.js";
|
|
137
137
|
import { isMcpRpcError } from "../harness/mcp-client.js";
|
|
138
138
|
import { projectCanonicalResumeMessages } from "../lib/session-message-provenance.js";
|
|
139
|
+
import { releaseOldLiveSessionResults } from "../lib/session-runtime-retention.js";
|
|
139
140
|
import {
|
|
140
141
|
pathMatchesOpenedFileIdentitySync,
|
|
141
142
|
sameOpenedFileIdentity,
|
|
@@ -5711,6 +5712,18 @@ async function executeToolInner(
|
|
|
5711
5712
|
},
|
|
5712
5713
|
{ cwd },
|
|
5713
5714
|
);
|
|
5715
|
+
if (
|
|
5716
|
+
pluginBinInvocation.runtime === "native" &&
|
|
5717
|
+
backgroundPlatform !== "linux"
|
|
5718
|
+
) {
|
|
5719
|
+
const unsupportedNativeError = new Error(
|
|
5720
|
+
`strict native Plugin bins require the Linux descriptor-bound ELF loader closure; ${backgroundPlatform} native loading is unsupported`,
|
|
5721
|
+
);
|
|
5722
|
+
unsupportedNativeError.code =
|
|
5723
|
+
"ERR_PLUGIN_NATIVE_SANDBOX_PLATFORM_UNSUPPORTED";
|
|
5724
|
+
unsupportedNativeError.pluginBinFailClosed = true;
|
|
5725
|
+
throw unsupportedNativeError;
|
|
5726
|
+
}
|
|
5714
5727
|
if (
|
|
5715
5728
|
backgroundPlatform === "linux" ||
|
|
5716
5729
|
(backgroundPlatform === "win32" &&
|
|
@@ -12559,6 +12572,7 @@ async function _settleAutomaticCompaction({
|
|
|
12559
12572
|
compacted,
|
|
12560
12573
|
stats,
|
|
12561
12574
|
options,
|
|
12575
|
+
trigger = "auto",
|
|
12562
12576
|
}) {
|
|
12563
12577
|
if (!_sameMessageSnapshot(messages, liveExpectedMessages)) {
|
|
12564
12578
|
throw _compactionSettlementError(
|
|
@@ -12578,7 +12592,7 @@ async function _settleAutomaticCompaction({
|
|
|
12578
12592
|
settlement = options.onCompaction(stats, compacted, {
|
|
12579
12593
|
expectedMessages: authorityExpectedMessages,
|
|
12580
12594
|
liveExpectedMessages,
|
|
12581
|
-
trigger
|
|
12595
|
+
trigger,
|
|
12582
12596
|
});
|
|
12583
12597
|
} else if (options.sessionId && options.persistCompaction !== false) {
|
|
12584
12598
|
const store = await import("../harness/jsonl-session-store.js");
|
|
@@ -12593,7 +12607,7 @@ async function _settleAutomaticCompaction({
|
|
|
12593
12607
|
options.sessionId,
|
|
12594
12608
|
{
|
|
12595
12609
|
...stats,
|
|
12596
|
-
trigger
|
|
12610
|
+
trigger,
|
|
12597
12611
|
messages: projectCanonicalResumeMessages(compacted, { strict: true }),
|
|
12598
12612
|
},
|
|
12599
12613
|
authorityExpectedMessages,
|
|
@@ -13168,6 +13182,53 @@ export async function* agentLoop(messages, options) {
|
|
|
13168
13182
|
};
|
|
13169
13183
|
}
|
|
13170
13184
|
|
|
13185
|
+
// Release result bodies that have left the recent display window before
|
|
13186
|
+
// every provider admission, independent of the semantic-compaction token
|
|
13187
|
+
// threshold. Settlement persists a bounded resume checkpoint before the
|
|
13188
|
+
// live array changes; the earlier hash-chained result events remain the
|
|
13189
|
+
// durable evidence for audit/recovery.
|
|
13190
|
+
if (options.runtimeResultRetention !== false && messages.length > 32) {
|
|
13191
|
+
const retentionConfig =
|
|
13192
|
+
options.runtimeResultRetention &&
|
|
13193
|
+
typeof options.runtimeResultRetention === "object"
|
|
13194
|
+
? options.runtimeResultRetention
|
|
13195
|
+
: options.runtimeResultRetentionOptions;
|
|
13196
|
+
const retained = releaseOldLiveSessionResults(messages, retentionConfig);
|
|
13197
|
+
if (
|
|
13198
|
+
retained.stats.released > 0 &&
|
|
13199
|
+
!_sameMessageSnapshot(retained.messages, messages)
|
|
13200
|
+
) {
|
|
13201
|
+
const authorityExpectedMessages = [...messages];
|
|
13202
|
+
const liveExpectedMessages = [...messages];
|
|
13203
|
+
try {
|
|
13204
|
+
await _settleAutomaticCompaction({
|
|
13205
|
+
messages,
|
|
13206
|
+
liveExpectedMessages,
|
|
13207
|
+
authorityExpectedMessages,
|
|
13208
|
+
compacted: retained.messages,
|
|
13209
|
+
stats: retained.stats,
|
|
13210
|
+
options,
|
|
13211
|
+
trigger: "runtime-retention",
|
|
13212
|
+
});
|
|
13213
|
+
yield {
|
|
13214
|
+
type: "session-runtime-retention",
|
|
13215
|
+
runId,
|
|
13216
|
+
stats: retained.stats,
|
|
13217
|
+
};
|
|
13218
|
+
} catch (error) {
|
|
13219
|
+
yield {
|
|
13220
|
+
type: "session-runtime-retention-degraded",
|
|
13221
|
+
runId,
|
|
13222
|
+
reason:
|
|
13223
|
+
error?.code === "SESSION_REVISION_STALE"
|
|
13224
|
+
? "session_messages_changed_during_retention"
|
|
13225
|
+
: "canonical_retention_settlement_failed",
|
|
13226
|
+
code: error?.code || "CC_SESSION_RETENTION_SETTLEMENT_FAILED",
|
|
13227
|
+
};
|
|
13228
|
+
}
|
|
13229
|
+
}
|
|
13230
|
+
}
|
|
13231
|
+
|
|
13171
13232
|
// Headless auto-compaction (Claude-Code `--print` parity). Keeps long
|
|
13172
13233
|
// `-p` / `--resume` runs under the model's context window instead of
|
|
13173
13234
|
// growing until the provider rejects the request. Opt-out with
|
|
@@ -800,9 +800,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
800
800
|
const loaded = loadHooks({ cwd, settingsFile: options.settingsFile });
|
|
801
801
|
// Fold in installed plugins' hooks/hooks.json (Phase 3.3c) — plugins ADD
|
|
802
802
|
// to the user's settings hooks, never replace them.
|
|
803
|
-
const { mergePluginHooks } =
|
|
804
|
-
"../lib/plugin-runtime/hooks.js"
|
|
805
|
-
);
|
|
803
|
+
const { mergePluginHooks } =
|
|
804
|
+
await import("../lib/plugin-runtime/hooks.js");
|
|
806
805
|
const effectiveHooks = mergePluginHooks(
|
|
807
806
|
attachAuthorityErrors(loaded.hooks, loaded.authorityErrors),
|
|
808
807
|
{ cwd },
|
|
@@ -843,9 +842,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
843
842
|
// the run, so no explicit restore is needed.
|
|
844
843
|
if (!hermeticExecution) {
|
|
845
844
|
try {
|
|
846
|
-
const { applyPluginBinPath } =
|
|
847
|
-
"../lib/plugin-runtime/bin.js"
|
|
848
|
-
);
|
|
845
|
+
const { applyPluginBinPath } =
|
|
846
|
+
await import("../lib/plugin-runtime/bin.js");
|
|
849
847
|
applyPluginBinPath({ cwd });
|
|
850
848
|
} catch {
|
|
851
849
|
/* best-effort — plugin bin PATH never blocks a headless run */
|
|
@@ -856,9 +854,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
856
854
|
// keys not already set; the process exits at the end so no restore is needed.
|
|
857
855
|
if (!hermeticExecution) {
|
|
858
856
|
try {
|
|
859
|
-
const { applyPluginSettingsEnv } =
|
|
860
|
-
"../lib/plugin-runtime/settings.js"
|
|
861
|
-
);
|
|
857
|
+
const { applyPluginSettingsEnv } =
|
|
858
|
+
await import("../lib/plugin-runtime/settings.js");
|
|
862
859
|
applyPluginSettingsEnv({ cwd });
|
|
863
860
|
} catch {
|
|
864
861
|
/* best-effort — plugin settings never block a headless run */
|
|
@@ -991,9 +988,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
991
988
|
if (isHeadlessConfigCommand(prompt)) {
|
|
992
989
|
const cm = await import("../lib/config-manager.js");
|
|
993
990
|
const { getConfigPath } = await import("../lib/paths.js");
|
|
994
|
-
const { runConfigDirective } =
|
|
995
|
-
"../lib/headless-config-command.js"
|
|
996
|
-
);
|
|
991
|
+
const { runConfigDirective } =
|
|
992
|
+
await import("../lib/headless-config-command.js");
|
|
997
993
|
const { text, isError } = runConfigDirective(prompt, {
|
|
998
994
|
configManager: cm,
|
|
999
995
|
getConfigPath,
|
|
@@ -1069,9 +1065,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
1069
1065
|
model = macro.model;
|
|
1070
1066
|
writeErr(` command: model → ${model}\n`);
|
|
1071
1067
|
try {
|
|
1072
|
-
const { maybeWarnDeprecatedModel } =
|
|
1073
|
-
"../lib/model-deprecation.js"
|
|
1074
|
-
);
|
|
1068
|
+
const { maybeWarnDeprecatedModel } =
|
|
1069
|
+
await import("../lib/model-deprecation.js");
|
|
1075
1070
|
maybeWarnDeprecatedModel({ model });
|
|
1076
1071
|
} catch {
|
|
1077
1072
|
// deprecation notice is best-effort
|
|
@@ -1108,9 +1103,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
1108
1103
|
|
|
1109
1104
|
// ── Permission + tool resolution ──────────────────────────────────────
|
|
1110
1105
|
if (managedSettings) {
|
|
1111
|
-
const { assertManagedPermissionMode } =
|
|
1112
|
-
"../lib/settings-loader.cjs"
|
|
1113
|
-
);
|
|
1106
|
+
const { assertManagedPermissionMode } =
|
|
1107
|
+
await import("../lib/settings-loader.cjs");
|
|
1114
1108
|
assertManagedPermissionMode(options.permissionMode, managedSettings);
|
|
1115
1109
|
}
|
|
1116
1110
|
const perm = resolvePermissionMode(options.permissionMode);
|
|
@@ -1566,9 +1560,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
1566
1560
|
: null;
|
|
1567
1561
|
if (!hermeticExecution && !instructionExcludes) {
|
|
1568
1562
|
try {
|
|
1569
|
-
const { readStringArraySetting } =
|
|
1570
|
-
"../lib/settings-loader.cjs"
|
|
1571
|
-
);
|
|
1563
|
+
const { readStringArraySetting } =
|
|
1564
|
+
await import("../lib/settings-loader.cjs");
|
|
1572
1565
|
const fromSettings = readStringArraySetting("instructionExcludes", {
|
|
1573
1566
|
cwd,
|
|
1574
1567
|
settingsFile: options.settingsFile,
|
|
@@ -1622,9 +1615,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
1622
1615
|
// settings.json UserPromptSubmit hooks. block → abort the run; context → inject.
|
|
1623
1616
|
if (settingsHooks) {
|
|
1624
1617
|
try {
|
|
1625
|
-
const { runUserPromptSubmitHooks } =
|
|
1626
|
-
"../lib/settings-hook-events.js"
|
|
1627
|
-
);
|
|
1618
|
+
const { runUserPromptSubmitHooks } =
|
|
1619
|
+
await import("../lib/settings-hook-events.js");
|
|
1628
1620
|
const ups = runUserPromptSubmitHooks(settingsHooks, {
|
|
1629
1621
|
prompt: userContent,
|
|
1630
1622
|
cwd,
|
|
@@ -1654,9 +1646,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
1654
1646
|
let instructionsLoadedContext = null;
|
|
1655
1647
|
if (settingsHooks && _loadedInstructions) {
|
|
1656
1648
|
try {
|
|
1657
|
-
const { runInstructionsLoadedHooks } =
|
|
1658
|
-
"../lib/settings-hook-events.js"
|
|
1659
|
-
);
|
|
1649
|
+
const { runInstructionsLoadedHooks } =
|
|
1650
|
+
await import("../lib/settings-hook-events.js");
|
|
1660
1651
|
instructionsLoadedContext = runInstructionsLoadedHooks(settingsHooks, {
|
|
1661
1652
|
files: _loadedInstructions.files,
|
|
1662
1653
|
cwd,
|
|
@@ -1671,9 +1662,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
1671
1662
|
let sessionStartContext = null;
|
|
1672
1663
|
if (settingsHooks) {
|
|
1673
1664
|
try {
|
|
1674
|
-
const { runSessionStartHooks } =
|
|
1675
|
-
"../lib/settings-hook-events.js"
|
|
1676
|
-
);
|
|
1665
|
+
const { runSessionStartHooks } =
|
|
1666
|
+
await import("../lib/settings-hook-events.js");
|
|
1677
1667
|
sessionStartContext = runSessionStartHooks(settingsHooks, {
|
|
1678
1668
|
source: resumeId ? "resume" : "startup",
|
|
1679
1669
|
cwd,
|
|
@@ -1691,9 +1681,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
1691
1681
|
// back up" — e.g. re-run a workspace sanity check. Observe-only, best-effort.
|
|
1692
1682
|
if (settingsHooks && resumeId && history.length > 0) {
|
|
1693
1683
|
try {
|
|
1694
|
-
const { runObserveHooks } =
|
|
1695
|
-
"../lib/settings-hook-events.js"
|
|
1696
|
-
);
|
|
1684
|
+
const { runObserveHooks } =
|
|
1685
|
+
await import("../lib/settings-hook-events.js");
|
|
1697
1686
|
runObserveHooks(
|
|
1698
1687
|
settingsHooks,
|
|
1699
1688
|
"SessionResume",
|
|
@@ -1924,9 +1913,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
1924
1913
|
// --add-dir → workspaceRootDirs = [cwd] and this is a no-op. Best-effort.
|
|
1925
1914
|
if (hostMcp?.mcpClient && additionalDirectories.length > 0) {
|
|
1926
1915
|
try {
|
|
1927
|
-
const { notifyMcpRootsChanged, workspaceRootDirs } =
|
|
1928
|
-
"../repl/add-dir.js"
|
|
1929
|
-
);
|
|
1916
|
+
const { notifyMcpRootsChanged, workspaceRootDirs } =
|
|
1917
|
+
await import("../repl/add-dir.js");
|
|
1930
1918
|
notifyMcpRootsChanged(
|
|
1931
1919
|
[hostMcp.mcpClient],
|
|
1932
1920
|
workspaceRootDirs(options.cwd || process.cwd(), additionalDirectories),
|
|
@@ -2034,15 +2022,16 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2034
2022
|
error.code = "CC_REMOTE_APPROVAL_GATE_UNAVAILABLE";
|
|
2035
2023
|
throw error;
|
|
2036
2024
|
}
|
|
2037
|
-
const { startHeadlessRemoteApproval } =
|
|
2038
|
-
"../lib/remote-approval-bridge.js"
|
|
2039
|
-
);
|
|
2025
|
+
const { startHeadlessRemoteApproval } =
|
|
2026
|
+
await import("../lib/remote-approval-bridge.js");
|
|
2040
2027
|
_remoteApproval = await (
|
|
2041
2028
|
deps.startHeadlessRemoteApproval || startHeadlessRemoteApproval
|
|
2042
2029
|
)({
|
|
2043
2030
|
agentSessionId: sessionId,
|
|
2044
2031
|
writeErr,
|
|
2045
2032
|
isText,
|
|
2033
|
+
allowLan: options.remoteControlAllowLan === true,
|
|
2034
|
+
env: process.env,
|
|
2046
2035
|
});
|
|
2047
2036
|
approvalGate.setConfirmer(
|
|
2048
2037
|
_bgPhase.wrapConfirmer(_remoteApproval.confirmer),
|
|
@@ -2065,9 +2054,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2065
2054
|
let _collectorEnabled = false;
|
|
2066
2055
|
if (!hermeticExecution) {
|
|
2067
2056
|
try {
|
|
2068
|
-
const { isOtlpCollectorEnabled } =
|
|
2069
|
-
"../lib/observability/index.js"
|
|
2070
|
-
);
|
|
2057
|
+
const { isOtlpCollectorEnabled } =
|
|
2058
|
+
await import("../lib/observability/index.js");
|
|
2071
2059
|
_collectorEnabled = isOtlpCollectorEnabled();
|
|
2072
2060
|
} catch {
|
|
2073
2061
|
_collectorEnabled = false;
|
|
@@ -2075,9 +2063,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2075
2063
|
}
|
|
2076
2064
|
if (!hermeticExecution && (options.otlp || _collectorEnabled)) {
|
|
2077
2065
|
try {
|
|
2078
|
-
const { TelemetryRecorder } =
|
|
2079
|
-
"../lib/telemetry/span-recorder.js"
|
|
2080
|
-
);
|
|
2066
|
+
const { TelemetryRecorder } =
|
|
2067
|
+
await import("../lib/telemetry/span-recorder.js");
|
|
2081
2068
|
_otlpRecorder = new TelemetryRecorder({ serviceName: "cc-agent" });
|
|
2082
2069
|
} catch {
|
|
2083
2070
|
_otlpRecorder = null; // telemetry is best-effort, never blocks the run
|
|
@@ -2091,9 +2078,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2091
2078
|
let _hookSupervisor = null;
|
|
2092
2079
|
if (settingsHooks) {
|
|
2093
2080
|
try {
|
|
2094
|
-
const { AsyncHookSupervisor } =
|
|
2095
|
-
"../lib/async-hook-supervisor.js"
|
|
2096
|
-
);
|
|
2081
|
+
const { AsyncHookSupervisor } =
|
|
2082
|
+
await import("../lib/async-hook-supervisor.js");
|
|
2097
2083
|
_hookSupervisor = new AsyncHookSupervisor({
|
|
2098
2084
|
persistStats: true,
|
|
2099
2085
|
// Durably park failed-rewake signals keyed by session so a crash before
|
|
@@ -2417,9 +2403,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2417
2403
|
if (options.goal !== undefined && options.goal !== false) {
|
|
2418
2404
|
try {
|
|
2419
2405
|
const explicitId = typeof options.goal === "string" ? options.goal : null;
|
|
2420
|
-
const { resolveActiveGoal, linkSession } =
|
|
2421
|
-
"../lib/goal-store.js"
|
|
2422
|
-
);
|
|
2406
|
+
const { resolveActiveGoal, linkSession } =
|
|
2407
|
+
await import("../lib/goal-store.js");
|
|
2423
2408
|
const goal = (deps.resolveActiveGoal || resolveActiveGoal)({
|
|
2424
2409
|
explicitId,
|
|
2425
2410
|
sessionId,
|
|
@@ -2547,9 +2532,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2547
2532
|
let _asyncStopHandled = false;
|
|
2548
2533
|
const _settleAsyncStop = async () => {
|
|
2549
2534
|
if (!settingsHooks || !_hookSupervisor) return { rewakes: [], results: [] };
|
|
2550
|
-
const { dispatchAsyncHooks } =
|
|
2551
|
-
"../lib/settings-hook-events.js"
|
|
2552
|
-
);
|
|
2535
|
+
const { dispatchAsyncHooks } =
|
|
2536
|
+
await import("../lib/settings-hook-events.js");
|
|
2553
2537
|
dispatchAsyncHooks(
|
|
2554
2538
|
settingsHooks,
|
|
2555
2539
|
"Stop",
|
|
@@ -3301,9 +3285,9 @@ async function runAgentHeadlessInWorkspace(
|
|
|
3301
3285
|
? err.message
|
|
3302
3286
|
: sessionBudgetFailed
|
|
3303
3287
|
? sessionBudgetAdmissionError(
|
|
3304
|
-
|
|
3305
|
-
|
|
3306
|
-
|
|
3288
|
+
options.sessionBudget?.reason?.() || err?.budgetReason,
|
|
3289
|
+
"run",
|
|
3290
|
+
).message
|
|
3307
3291
|
: err?.message || String(err);
|
|
3308
3292
|
const errorSubtype = runtimeLedgerPersistenceFailed
|
|
3309
3293
|
? "error_persistence"
|
|
@@ -3383,9 +3367,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
3383
3367
|
await cleanupDeadline.run("settings-hooks", async () => {
|
|
3384
3368
|
if (settingsHooks) {
|
|
3385
3369
|
try {
|
|
3386
|
-
const { runObserveHooks, dispatchAsyncHooks } =
|
|
3387
|
-
"../lib/settings-hook-events.js"
|
|
3388
|
-
);
|
|
3370
|
+
const { runObserveHooks, dispatchAsyncHooks } =
|
|
3371
|
+
await import("../lib/settings-hook-events.js");
|
|
3389
3372
|
const stopPayload = {
|
|
3390
3373
|
reason: pipeState.closed ? "pipe_closed" : endReason,
|
|
3391
3374
|
cwd,
|
|
@@ -3648,9 +3631,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
3648
3631
|
emitStream({ type: "denials_summary", count: denials.length, denials });
|
|
3649
3632
|
}
|
|
3650
3633
|
try {
|
|
3651
|
-
const { appendRecentDenials } =
|
|
3652
|
-
"../lib/permission-denial-store.js"
|
|
3653
|
-
);
|
|
3634
|
+
const { appendRecentDenials } =
|
|
3635
|
+
await import("../lib/permission-denial-store.js");
|
|
3654
3636
|
appendRecentDenials(denials, {
|
|
3655
3637
|
sessionId,
|
|
3656
3638
|
permissionMode: options.permissionMode || "default",
|
|
@@ -3721,9 +3703,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
3721
3703
|
}
|
|
3722
3704
|
if (_collectorEnabled) {
|
|
3723
3705
|
try {
|
|
3724
|
-
const { exportTelemetryRecorder } =
|
|
3725
|
-
"../lib/observability/index.js"
|
|
3726
|
-
);
|
|
3706
|
+
const { exportTelemetryRecorder } =
|
|
3707
|
+
await import("../lib/observability/index.js");
|
|
3727
3708
|
exportTelemetryRecorder(_otlpRecorder);
|
|
3728
3709
|
} catch {
|
|
3729
3710
|
// Telemetry is observational only and never changes the agent result.
|
|
@@ -1694,9 +1694,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1694
1694
|
const { loadHooks, projectHookTrustNotice, attachAuthorityErrors } =
|
|
1695
1695
|
await import("../lib/settings-hooks.cjs");
|
|
1696
1696
|
const loaded = loadHooks({ cwd, settingsFile: options.settingsFile });
|
|
1697
|
-
const { mergePluginHooks } =
|
|
1698
|
-
"../lib/plugin-runtime/hooks.js"
|
|
1699
|
-
);
|
|
1697
|
+
const { mergePluginHooks } =
|
|
1698
|
+
await import("../lib/plugin-runtime/hooks.js");
|
|
1700
1699
|
const effectiveHooks = mergePluginHooks(
|
|
1701
1700
|
attachAuthorityErrors(loaded.hooks, loaded.authorityErrors),
|
|
1702
1701
|
{ cwd },
|
|
@@ -1777,9 +1776,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1777
1776
|
});
|
|
1778
1777
|
|
|
1779
1778
|
if (managedSettings) {
|
|
1780
|
-
const { assertManagedPermissionMode } =
|
|
1781
|
-
"../lib/settings-loader.cjs"
|
|
1782
|
-
);
|
|
1779
|
+
const { assertManagedPermissionMode } =
|
|
1780
|
+
await import("../lib/settings-loader.cjs");
|
|
1783
1781
|
assertManagedPermissionMode(options.permissionMode, managedSettings);
|
|
1784
1782
|
}
|
|
1785
1783
|
const perm = resolvePermissionMode(options.permissionMode);
|
|
@@ -2267,9 +2265,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2267
2265
|
: null;
|
|
2268
2266
|
if (!instructionExcludes) {
|
|
2269
2267
|
try {
|
|
2270
|
-
const { readStringArraySetting } =
|
|
2271
|
-
"../lib/settings-loader.cjs"
|
|
2272
|
-
);
|
|
2268
|
+
const { readStringArraySetting } =
|
|
2269
|
+
await import("../lib/settings-loader.cjs");
|
|
2273
2270
|
const fromSettings = readStringArraySetting("instructionExcludes", {
|
|
2274
2271
|
cwd,
|
|
2275
2272
|
settingsFile: options.settingsFile,
|
|
@@ -2334,9 +2331,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2334
2331
|
// Best-effort; no-op when project memory is off or no hook is registered.
|
|
2335
2332
|
if (settingsHooks && _loadedInstructions) {
|
|
2336
2333
|
try {
|
|
2337
|
-
const { runInstructionsLoadedHooks } =
|
|
2338
|
-
"../lib/settings-hook-events.js"
|
|
2339
|
-
);
|
|
2334
|
+
const { runInstructionsLoadedHooks } =
|
|
2335
|
+
await import("../lib/settings-hook-events.js");
|
|
2340
2336
|
const ctx = runInstructionsLoadedHooks(settingsHooks, {
|
|
2341
2337
|
files: _loadedInstructions.files,
|
|
2342
2338
|
cwd,
|
|
@@ -2376,9 +2372,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2376
2372
|
// settings.json SessionStart hooks → inject session context once (observe-only).
|
|
2377
2373
|
if (settingsHooks) {
|
|
2378
2374
|
try {
|
|
2379
|
-
const { runSessionStartHooks } =
|
|
2380
|
-
"../lib/settings-hook-events.js"
|
|
2381
|
-
);
|
|
2375
|
+
const { runSessionStartHooks } =
|
|
2376
|
+
await import("../lib/settings-hook-events.js");
|
|
2382
2377
|
const ctx = runSessionStartHooks(settingsHooks, {
|
|
2383
2378
|
source: "startup",
|
|
2384
2379
|
cwd,
|
|
@@ -2749,9 +2744,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2749
2744
|
// the single-prompt runner + the REPL /add-dir path. Best-effort.
|
|
2750
2745
|
if (hostMcp?.mcpClient && additionalDirectories.length > 0) {
|
|
2751
2746
|
try {
|
|
2752
|
-
const { notifyMcpRootsChanged, workspaceRootDirs } =
|
|
2753
|
-
"../repl/add-dir.js"
|
|
2754
|
-
);
|
|
2747
|
+
const { notifyMcpRootsChanged, workspaceRootDirs } =
|
|
2748
|
+
await import("../repl/add-dir.js");
|
|
2755
2749
|
notifyMcpRootsChanged(
|
|
2756
2750
|
[hostMcp.mcpClient],
|
|
2757
2751
|
workspaceRootDirs(options.cwd || process.cwd(), additionalDirectories),
|
|
@@ -2817,6 +2811,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2817
2811
|
.startHeadlessRemoteApproval;
|
|
2818
2812
|
_remoteApproval = await startRemoteApproval({
|
|
2819
2813
|
agentSessionId: sessionId,
|
|
2814
|
+
allowLan: options.remoteControlAllowLan === true,
|
|
2815
|
+
env: process.env,
|
|
2820
2816
|
});
|
|
2821
2817
|
streamCleanup.setRemoteApproval(_remoteApproval);
|
|
2822
2818
|
emit({
|
|
@@ -3690,9 +3686,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3690
3686
|
// session can honour the user's standing preferences ("越用越聪明"
|
|
3691
3687
|
// flywheel). Best-effort — a learning ledger must never break the chat.
|
|
3692
3688
|
try {
|
|
3693
|
-
const { appendFeedback } =
|
|
3694
|
-
"../lib/pdh-feedback-ledger.js"
|
|
3695
|
-
);
|
|
3689
|
+
const { appendFeedback } =
|
|
3690
|
+
await import("../lib/pdh-feedback-ledger.js");
|
|
3696
3691
|
appendFeedback({ sessionId, turnId, kind, comment });
|
|
3697
3692
|
} catch {
|
|
3698
3693
|
/* persistence is best-effort */
|
|
@@ -3823,9 +3818,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3823
3818
|
// settings.json UserPromptSubmit hooks. block → skip this turn; context → inject.
|
|
3824
3819
|
if (settingsHooks) {
|
|
3825
3820
|
try {
|
|
3826
|
-
const { runUserPromptSubmitHooks } =
|
|
3827
|
-
"../lib/settings-hook-events.js"
|
|
3828
|
-
);
|
|
3821
|
+
const { runUserPromptSubmitHooks } =
|
|
3822
|
+
await import("../lib/settings-hook-events.js");
|
|
3829
3823
|
const ups = runUserPromptSubmitHooks(settingsHooks, {
|
|
3830
3824
|
prompt: userContent,
|
|
3831
3825
|
cwd,
|
|
@@ -51,6 +51,7 @@ import {
|
|
|
51
51
|
normalizeMcpSandboxPolicy,
|
|
52
52
|
readMcpStdioCwd,
|
|
53
53
|
} from "../lib/mcp-sandbox-policy.js";
|
|
54
|
+
import { normalizeMcpTlsConfig } from "../lib/mcp-tls.js";
|
|
54
55
|
|
|
55
56
|
function invalidSandboxPolicy(message) {
|
|
56
57
|
const error = new TypeError(message);
|
|
@@ -210,6 +211,7 @@ export function parseMcpServers(raw) {
|
|
|
210
211
|
...headersHelperField(cfg.headersHelper),
|
|
211
212
|
...(cfg.configScope ? { configScope: cfg.configScope } : {}),
|
|
212
213
|
...(cfg.configSource ? { configSource: cfg.configSource } : {}),
|
|
214
|
+
...(cfg.tls != null ? { tls: normalizeMcpTlsConfig(cfg.tls) } : {}),
|
|
213
215
|
};
|
|
214
216
|
}
|
|
215
217
|
return out;
|
|
@@ -90,10 +90,12 @@ export function resolveAgentPolicy({
|
|
|
90
90
|
fallbackModels: overrides.fallbackModels,
|
|
91
91
|
pdh: overrides.pdh,
|
|
92
92
|
outputStyle: overrides.outputStyle,
|
|
93
|
+
settingsFile: overrides.settingsFile || null,
|
|
93
94
|
disableSlashCommands: overrides.disableSlashCommands === true,
|
|
94
95
|
// --remote-control also applies interactively: the REPL starts the
|
|
95
96
|
// paired-device approval bridge at startup (批26).
|
|
96
97
|
remoteControl: overrides.remoteControl === true,
|
|
98
|
+
remoteControlAllowLan: overrides.remoteControlAllowLan === true,
|
|
97
99
|
// --channels: inbound channel listeners (webhook/telegram) whose events
|
|
98
100
|
// become user turns in the interactive session (gap-2026-07-11 P0#5).
|
|
99
101
|
channels: overrides.channels || null,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as v,P as u,J as y,U as n,R as a,S,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-B7osrXqy.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),h=String(e.getHours()).padStart(2,"0"),b=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${h}:${b}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},M={class:"meta"},R={class:"actor"},V={class:"time"},q={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return u(),y("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",T,[n("div",M,[n("span",R,a(r.actorLabel),1),n("span",V,a(r.formattedTime),1)]),n("div",q,a(r.messageText),1),t.event.source.adapter?(u(),S(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const j=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-yufPhh/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{j as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-B7osrXqy.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function u(t,o,e,r,n,m){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",u],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-yufPhh/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
|
|
@@ -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-B7osrXqy.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-yufPhh/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
|