chainlesschain 0.162.198 → 0.163.0
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/bin/chainlesschain.js +14 -6
- package/package.json +5 -1
- package/scripts/command-lifecycle-report.mjs +94 -0
- package/scripts/postinstall.mjs +19 -3
- package/scripts/repair-node-pty.mjs +74 -0
- package/src/assets/web-panel/assets/{AIOps-CSN-D2xb.js → AIOps-CSy9BB6Z.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CBSMlGzv.js → ActionButton-CFyrEVfq.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-3yr3Nt2t.js → Analytics-8419vb47.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-1b-o3lMH.js → AppLayout-CHu3Hkdx.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Dr8rJi17.js → Artifacts-DJnt57Fs.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-2V689HC2.js → Audit-CHMq9ajE.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DIxkNrD_.js → BackgroundAgents-Cyfa4ub2.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Pg6BcwrE.js → Backup-ACXUrUv7.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CLUpqyfH.js → BaseInput-DjC-3qRE.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-qVS8rD4G.js → Chat-7_VDQ851.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-ti49X12Q.js → ChatBubbleRenderer-B4zct0dY.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-Bs9AaEay.js → Checkbox-DxbDl_rk.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-Dvc1mq8q.js → Codegen-BvZa5854.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C4_biO7A.js → Col-CX5Ow2Zl.js} +1 -1
- package/src/assets/web-panel/assets/{Community-al25XQUV.js → Community-wFun-jSg.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-D-ZDB8M1.js → Compact-C6vJDuSn.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-6lIfDz1W.js → Compliance-Cm4sBytH.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DdI48XMJ.js → Cowork-DiEcMwE8.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DF5HZd2g.js → Cron-RbeexsSQ.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DuxeSvt3.js → Crosschain-BBsyCKOp.js} +1 -1
- package/src/assets/web-panel/assets/{DID-B9yHkUTd.js → DID-DE36g7Hz.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Z5EuI3IM.js → Dashboard-CdfLSTz1.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-vuRfO3dY.js → Dropdown-CyaT6SyW.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-QFLCc1uL.js → EmailListRenderer-Nv_66bkM.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BZ7EXkFJ.js → FamilyGuardDashboard-Di-Sb-Ad.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DycIEg2s.js → Federation-B3mdht-U.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Ba0H_7yG.js → FormItemContext-BeP93u4f.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer--JgSTK-C.js → GenericCardRenderer-CETLayUr.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DEvTbldE.js → Git-Bsat6hgI.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BJIljy18.js → Governance-YVmA7SwN.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CVyW3G3q.js → Inference-DCa94nGl.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-v8-borge.js → KnowledgeGraph-CIKEU7T0.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BCdS7gGo.js → Logs-DUxP0MnS.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-CU-JB2Ns.js → MarkdownRenderer-Mw5o3e7M.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-AN6tGA2B.js → Marketplace-BU0X2lqu.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DGViXASN.js → McpTools-BSsg58nZ.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-Bpvmx9X4.js → Memory-CjqNIXlO.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CTP-DOTC.js → MobileBridge-DSsa4doG.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-DLl1qzid.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-ndYr0M1s.js → Mtc-Du080G7t.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-Ci0-YK7W.js → MtcAudit-JzQk-arw.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BehSTFW7.js → Multisig-BMVT5Uln.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-B91_YBLv.js → NLProgramming-D_38QYjs.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BQlJ0-gq.js → Notes-DvbdjNm5.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CDgYMjYK.js → NotificationSettings-DVHCW6ii.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BJkSlKeH.js → OrderTableRenderer-DmMBFD3g.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B-b3cWCp.js → Organization-DC-9pAmP.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CILUL4nL.js → Overflow-BRxWq0Qq.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BTCFBkF0.js → P2P-CUdzhyLH.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BAR6AUx5.js → PdhVaultBrowser-CwG21s9P.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-RRf6HbWJ.js → Permissions-6bHd4zgK.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BGTMiICa.js → PersonalDataHub-BXgTDCba.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-945qY9YF.js → Pipeline-BFhKCBNj.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DPZwI6lJ.js → Privacy-Byz9IqUF.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BPH2NRKc.js → ProjectInit-B9LNoyoN.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BZCRNCvb.js → ProjectSettings-DEj4eVdl.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BTI__tBt.js → Projects-BAAvus06.js} +1 -1
- package/src/assets/web-panel/assets/Providers-Bu_pQsk6.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-N6rbqt1r.js → QrScannerModal-CeDey0SJ.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DrwjPS7M.js → QuickAsk-exUvRIgX.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Cog9Wd99.js → Recommend-4hJWmtSI.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DC9pynjM.js → RemoteSession-BmYUpl0m.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-D4th4gKS.js → Reputation-B_txYAyY.js} +1 -1
- package/src/assets/web-panel/assets/{Row-ogiWR6v9.js → Row-BPtqOqGh.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-uYlk-2Oj.js → RssFeed-CyWTxmq0.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DYzzwvtM.js → Search-cItU1tmC.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Da7YOyX6.js → Security-B0Z9_BUt.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CLI1VM1X.js → Services-Dzpz2uFp.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DK77dzDC.js → Skeleton-CBtoylP8.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-C_z7Lmhl.js → Skills-Cw9RJiVn.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-D6413Q8L.js → Sla-D2vLfvgl.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-C07ydbj2.js → SpeechSettings-I9dKbcOU.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DGOm2W22.js → SyncSettings-BOju53RT.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Cr_PVyLM.js → Tasks-C3LBy_7x.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BhL2mZ0t.js → Templates-C2ttpPql.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CPk5oyUr.js → Tenant-XQ6Qg8-Q.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-ClhqUsqV.js → Terminal-DYB9dUnS.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BCC7MV5a.js → TimelineRenderer-gShtO4I8.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DD1Jt4oO.js → Tokens-BvoJTCJg.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BCydFvN2.js → Trigger-BwYRTMY_.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DDHT1noa.js → Trust-C5rt6fCF.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CWPZC7oI.js → UkeySign-DPBrHUgL.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-9Ea0nJR0.js → VideoEditing-BcxywO_K.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BjxhLxTf.js → Wallet-CZvTpsPz.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-C6uCye67.js → WebAuthn-LI_jAuOx.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-d2g4reYo.js → WorkflowEditor-B2a6bANB.js} +1 -1
- package/src/assets/web-panel/assets/{chat-frTc6ScX.js → chat-B6DPMfRB.js} +1 -1
- package/src/assets/web-panel/assets/{colors-B5K6lG3v.js → colors-IpLhw9T8.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Cdn46r8D.js → compact-item-BzodimsI.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DU1jqVQi.js → createContext-DL2jaWH5.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CZB0EDsa.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DdNH-aW_.js → hasIn-C4Geudre.js} +1 -1
- package/src/assets/web-panel/assets/{index-CHmkkdfT.js → index-B5Sn7CtW.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cj6P9Nst.js → index-B6w4fpSI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQorP1Ng.js → index-BRj6YKuI.js} +1 -1
- package/src/assets/web-panel/assets/{index-cYaWV4Mq.js → index-BX4pKudW.js} +1 -1
- package/src/assets/web-panel/assets/{index-kVO_MDm-.js → index-BaTvPxY0.js} +1 -1
- package/src/assets/web-panel/assets/{index-D23xGYjM.js → index-BbWRxWM2.js} +1 -1
- package/src/assets/web-panel/assets/{index-Be4OtL-N.js → index-BeZhISVl.js} +1 -1
- package/src/assets/web-panel/assets/{index-32ajXmTb.js → index-Bi6Zkv5M.js} +1 -1
- package/src/assets/web-panel/assets/{index-NmEXVjzt.js → index-BvKoSvko.js} +1 -1
- package/src/assets/web-panel/assets/{index-7ehytj1K.js → index-C3LzRvkw.js} +1 -1
- package/src/assets/web-panel/assets/{index-gg3QPC3i.js → index-CAjyUjZl.js} +3 -3
- package/src/assets/web-panel/assets/index-CI7k8Sk9.js +1 -0
- package/src/assets/web-panel/assets/{index-CGiwfwB9.js → index-COxGCo8v.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIVyTmZ3.js → index-CQBPhJlk.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUoNAmE8.js → index-CQPOCB4h.js} +1 -1
- package/src/assets/web-panel/assets/{index-t_OBzIP4.js → index-CTlmw_cr.js} +1 -1
- package/src/assets/web-panel/assets/{index-VDM2KKo9.js → index-CVFXYmUe.js} +1 -1
- package/src/assets/web-panel/assets/{index-DftZuyA7.js → index-C_SxaIPI.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcGwGIaR.js → index-CaKKxqCI.js} +1 -1
- package/src/assets/web-panel/assets/{index-HjCvXHf5.js → index-CcgoKNXN.js} +1 -1
- package/src/assets/web-panel/assets/{index-mgU3Q-lN.js → index-CczBR6Du.js} +1 -1
- package/src/assets/web-panel/assets/{index-DM5FmPZU.js → index-CeUnSSEP.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4l82Me1.js → index-CnwHp5Oi.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwlIxAmX.js → index-DGBRBg3D.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVLL-mq_.js → index-DHdD0Y7h.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXKhhx9V.js → index-DMY1waPC.js} +1 -1
- package/src/assets/web-panel/assets/index-DPTHBSR8.js +1 -0
- package/src/assets/web-panel/assets/{index-LaivuXyF.js → index-DREx4gaS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtRPi4YC.js → index-DXQ2OtXt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRzBBdQ0.js → index-DZU7Y67X.js} +1 -1
- package/src/assets/web-panel/assets/{index-PjAS0sIZ.js → index-DZtKnnTW.js} +1 -1
- package/src/assets/web-panel/assets/{index-MM4Zz2OE.js → index-DlABpgCv.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoFak7le.js → index-Dl_QAtzq.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1qIC4GR.js → index-DnBybYhx.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4miNkWv.js → index-DoyIjk6r.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtBCCkC4.js → index-DvEnrn8M.js} +1 -1
- package/src/assets/web-panel/assets/{index-BC4eGkar.js → index-DvOzjf2F.js} +1 -1
- package/src/assets/web-panel/assets/{index-yZRuZpwK.js → index-EjW1R_a7.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dca_i7H8.js → index-F-SCUTee.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DwLTRNdo.js → initDefaultProps-CW5mTl3w.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BchZDXnh.js → motion-BtjIT9np.js} +1 -1
- package/src/assets/web-panel/assets/{move-e8M-zZFl.js → move-DZv4fZAV.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-Ci40fQb3.js → mtc-parser-BwCix1O-.js} +1 -1
- package/src/assets/web-panel/assets/{omit-C7110_f2.js → omit-BW72HDUD.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-skteMgnM.js → pickAttrs-DBW2jcMc.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-MGZ-lh2B.js → placementArrow-D3YmWlIS.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-N4Sd7uy-.js → responsiveObserve-CL4-a-9Q.js} +1 -1
- package/src/assets/web-panel/assets/{slide-C7HDGRaa.js → slide-Cw9zIbXQ.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BhRexlgy.js → statusUtils-mMLVioo-.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-ChEoQkN2.js → styleChecker-BK8857AH.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CDbG1s2Y.js → useFlexGapSupport-C1iSaJij.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CUIx0tcJ.js → useFs-D3riGOaP.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-bkO7L7ec.js → usePersonalDataHub-Bwqvmz4X.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-B_ZvABIG.js → vnode-Byk4zzkf.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-D5shjpS8.js → zoom-D7INFTp2.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/mcp.js +119 -0
- package/src/commands/session-show.js +8 -10
- package/src/commands/session.js +60 -52
- package/src/data/changelog.json +40 -1
- package/src/gateways/ws/session-protocol.js +14 -4
- package/src/gateways/ws/ws-agent-handler.js +31 -0
- package/src/harness/jsonl-session-store.js +1147 -130
- package/src/harness/mcp-client.js +44 -11
- package/src/harness/session-index.js +80 -80
- package/src/harness/session-list-index.js +147 -2
- package/src/lib/background-interaction-journal.js +2 -2
- package/src/lib/command-lifecycle-report.js +516 -0
- package/src/lib/mcp-stdio-environment.js +48 -0
- package/src/lib/mcp-stdio-executable-identity.js +552 -17
- package/src/lib/mcp-stdio-package-materialization.js +1424 -0
- package/src/lib/packer/native-update-state.js +979 -1
- package/src/lib/packer/pack-update-applier.js +1050 -125
- package/src/lib/packer/pkg-config-generator.js +1 -0
- package/src/lib/paths.js +53 -0
- package/src/lib/process-execution-broker/index.js +180 -37
- package/src/lib/process-execution-broker/platform-sandbox.js +291 -24
- package/src/lib/recent-session.js +17 -17
- package/src/lib/secure-file-identity.js +47 -0
- package/src/lib/secure-fs.js +21 -2
- package/src/lib/session-anti-rollback-anchor.js +766 -0
- package/src/lib/session-host-lease.js +492 -0
- package/src/lib/session-persistence-failure.js +109 -0
- package/src/lib/session-picker.js +26 -3
- package/src/lib/session-search.js +25 -11
- package/src/lib/side-effect-ledger-store.js +2 -2
- package/src/lib/skill-execution-authority.js +13 -9
- package/src/lib/turn-binding-store.js +2 -2
- package/src/repl/agent-repl.js +309 -39
- package/src/runtime/agent-core.js +88 -5
- package/src/runtime/cleanup-deadline.js +143 -0
- package/src/runtime/headless-runner.js +357 -139
- package/src/runtime/headless-stream.js +207 -28
- package/src/runtime/output-backpressure.js +53 -0
- package/src/assets/web-panel/assets/MobileProjects-C8qfktxn.js +0 -1
- package/src/assets/web-panel/assets/Providers-DDCf_nIw.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CP-jEUyw.js +0 -1
- package/src/assets/web-panel/assets/index-CzrCHrFy.js +0 -1
- package/src/assets/web-panel/assets/index-OJsGskZw.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./index-
|
|
1
|
+
import{i as e}from"./index-CAjyUjZl.js";function r(a,s,t){return e({[`${a}-status-success`]:s==="success",[`${a}-status-warning`]:s==="warning",[`${a}-status-error`]:s==="error",[`${a}-status-validating`]:s==="validating",[`${a}-has-feedback`]:t})}const c=(a,s)=>s||a;export{c as a,r as g};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B as d}from"./index-
|
|
1
|
+
import{B as d}from"./index-CAjyUjZl.js";const i=()=>d()&&window.document.documentElement,c=e=>{if(d()&&window.document.documentElement){const t=Array.isArray(e)?e:[e],{documentElement:n}=window.document;return t.some(r=>r in n.style)}return!1},u=(e,t)=>{if(!c(e))return!1;const n=document.createElement("div"),r=n.style[e];return n.style[e]=t,n.style[e]!==r};function s(e,t){return!Array.isArray(e)&&t!==void 0?u(e,t):c(e)}let o;const p=()=>{if(!i())return!1;if(o!==void 0)return o;const e=document.createElement("div");return e.style.display="flex",e.style.flexDirection="column",e.style.rowGap="1px",e.appendChild(document.createElement("div")),e.appendChild(document.createElement("div")),document.body.appendChild(e),o=e.scrollHeight===1,document.body.removeChild(e),o};export{i as c,p as d,s as i};
|
package/src/assets/web-panel/assets/{useFlexGapSupport-CDbG1s2Y.js → useFlexGapSupport-C1iSaJij.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o,s as t}from"./vendor-Bn1JzzAn.js";import{d as s}from"./styleChecker-
|
|
1
|
+
import{o,s as t}from"./vendor-Bn1JzzAn.js";import{d as s}from"./styleChecker-BK8857AH.js";const r=(()=>{const e=t(!1);return o(()=>{e.value=s()}),e});export{r as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as d}from"./index-
|
|
1
|
+
import{u as d}from"./index-CAjyUjZl.js";import{u as c}from"./useShellMode-CgR0wCYM.js";function u({accept:l=""}={}){return new Promise(a=>{if(typeof document>"u"){a({canceled:!0,path:null,content:null});return}const n=document.createElement("input");n.type="file",l&&(n.accept=l),n.style.display="none",document.body.appendChild(n);let o=!1;const i=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{if(o)return;o=!0;const e=n.files&&n.files[0];if(!e){i(),a({canceled:!0,path:null,content:null});return}const t=new FileReader;t.onload=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:typeof t.result=="string"?t.result:""})},t.onerror=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:null,reason:"read_failed"})},t.readAsText(e)};n.addEventListener("change",r),n.click()})}function f(l,{defaultPath:a="download.txt"}={}){if(typeof document>"u")return{canceled:!0,path:null};const n=new Blob([l],{type:"text/plain"}),o=URL.createObjectURL(n),i=document.createElement("a");return i.href=o,i.download=a,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(o),{canceled:!1,path:a}}function p(l){if(!Array.isArray(l))return"";const a=[];for(const n of l)if(Array.isArray(n.extensions))for(const o of n.extensions)a.push(`.${o.replace(/^\./,"")}`);return a.join(",")}function m(){const l=d();async function a(r={}){if(c().isEmbedded){const e=await l.sendRaw({type:"fs.openDialog",title:r.title,filters:r.filters},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDialog failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,content:t.content??null,size:t.size,reason:t.reason}}return u({accept:p(r.filters)})}async function n(r,e={}){if(typeof r!="string")throw new Error("content must be a string");if(c().isEmbedded){const t=await l.sendRaw({type:"fs.saveDialog",title:e.title,defaultPath:e.defaultPath,filters:e.filters,content:r},6e4);if(t&&t.ok===!1)throw new Error(t.error||"fs.saveDialog failed");const s=t?.result??t;return{canceled:!!s.canceled,path:s.path??null}}return f(r,{defaultPath:e.defaultPath})}async function o(r,e={}){const t=JSON.stringify(r,null,2),s={...e,defaultPath:e.defaultPath||"data.json",filters:e.filters||[{name:"JSON",extensions:["json"]}]};return n(t,s)}async function i(r={}){if(!c().isEmbedded)return{canceled:!0,path:null,initialized:!1,unsupported:!0};const e=await l.sendRaw({type:"fs.openDirectory",title:r.title},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDirectory failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,initialized:!!t.initialized}}return{pickFileText:a,saveText:n,saveJson:o,pickDirectory:i}}export{m as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as v}from"./index-
|
|
1
|
+
import{u as v}from"./index-CAjyUjZl.js";import{u as _}from"./useShellMode-CgR0wCYM.js";function d(r){if(!r)return r;if(r.error)throw new Error(r.error);return r.result!==void 0?r.result:r}async function p(r,s={},e=!0){try{if(e!==!0||!r||typeof r.sendRaw!="function")return{status:"unavailable",path:null};const a=await r.sendRaw({type:"fs.openDirectory",title:s.title},6e4);if(a&&(a.ok===!1||a.error))return{status:"unavailable",path:null};const t=a&&a.result!==void 0?a.result:a;return t&&(t.ok===!1||t.error||t.unsupported===!0)?{status:"unavailable",path:null}:t&&t.canceled===!0?{status:"cancelled",path:null}:t&&typeof t.path=="string"&&t.path.length>0?{status:"selected",path:t.path}:{status:"unavailable",path:null}}catch{return{status:"unavailable",path:null}}}function b(r,s,e,a,t){return typeof r.onMessage!="function"||typeof r.sendRaw!="function"?r.sendRaw({type:s,...e},t).then(d):new Promise((n,u)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${s}.event`,m=`${s}.end`;let c=!1,h=()=>{};const o=(i,f)=>{if(!c){c=!0,clearTimeout(g);try{h()}catch{}i(f)}},g=setTimeout(()=>{o(u,new Error(`stream timeout (${t}ms): ${s}`))},t),y=r.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof a=="function")try{a(i.event||i)}catch{}return}if(i.type===m){o(n,d(i));return}i.type==="error"&&o(u,new Error(i.message||"stream error"))}});h=typeof y=="function"?y:()=>{},Promise.resolve(r.sendRaw({id:l,type:s,...e},t)).catch(()=>{})})}function k(){const r=v(),s=_(),e=(a,t={},n=3e4)=>r.sendRaw({type:a,...t},n).then(d);return{async health(){return await e("personal-data-hub.health",{},8e3)},async stats(){return await e("personal-data-hub.stats",{},8e3)},async listAdapters(){return await e("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const t=await r.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),n=t&&t.result!==void 0?t.result:t,u=n&&typeof n.path=="string"?n.path:n&&typeof n.filePath=="string"?n.filePath:null;return n&&n.canceled!==!0&&u?u:null}catch{return null}},async pickDirectoryResult(a={}){return await p(r,a,s.isEmbedded)},async pickDirectory(a={}){const t=await p(r,a,s.isEmbedded);return t.status==="selected"?t.path:null},async adapterReadiness(a){return await e("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,t={}){return await e("personal-data-hub.sync-adapter",{name:a,options:t},6e5)},async syncAll(a={}){return await e("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:t=20,seed:n=1}={}){return await e("personal-data-hub.register-mock",{name:a,count:t,seed:n})},async unregister(a){return await e("personal-data-hub.unregister",{name:a})},async ask(a,t={}){return await e("personal-data-hub.ask",{question:a,options:t},18e4)},async queryEvents(a={}){return await e("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await e("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await e("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await e("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await e("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,t={}){return await e("personal-data-hub.register-email",{account:a,opts:t},15e3)},async unregisterEmail(a){return await e("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await e("personal-data-hub.list-email-accounts",{},5e3)},async activateEmail(a){return await e("personal-data-hub.activate-email",{email:a},5e3)},async eventDetail(a){return await e("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,t={},n){return await b(r,"personal-data-hub.sync-adapter-stream",{name:a,options:t},n,6e5)},async syncAllStream(a={},t){return await b(r,"personal-data-hub.sync-all-stream",{options:a},t,9e5)},async registerAlipay(a,t={}){return await e("personal-data-hub.register-alipay",{account:a,opts:t},15e3)},async unregisterAlipay(a){return await e("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await e("personal-data-hub.list-alipay-accounts",{},5e3)},async activateAlipay(a){return await e("personal-data-hub.activate-alipay",{email:a},5e3)},async importAlipayBill({zipPath:a,csvPath:t,zipPassword:n}={}){return await e("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:t,zipPassword:n},3e5)},async reviewQueueList(a=50){return await e("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,t){return await e("personal-data-hub.review-decision",{reviewId:a,decision:t},5e3)},async manualMerge(a,t){return await e("personal-data-hub.manual-merge",{aId:a,bId:t},5e3)},async manualUnmerge(a){return await e("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await e("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await e("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await e("personal-data-hub.skills-list",{},5e3)},async runSkill(a,t={}){return await e("personal-data-hub.run-skill",{name:a,options:t},12e4)},async openAichatLogin(a,t={}){return await e("personal-data-hub.aichat-open-login",{vendor:a,opts:t},1e4)},async probeAichatCookies(a,t){return await e("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:t},1e4)},async registerAichatVendor(a,t,n={}){return await e("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:t,opts:n},3e4)},async rotateAichatLogin(a){return await e("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await e("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await e("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await e("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await e("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l}={}){return await e("personal-data-hub.register-wechat",{account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l},45e3)},async listWechatAccounts(){return await e("personal-data-hub.list-wechat-accounts",{},5e3)},async activateWechat(a,t={}){return await e("personal-data-hub.activate-wechat",{uin:a,fridaOpts:t.fridaOpts,keyProviderOverride:t.keyProviderOverride},45e3)},async unregisterWechat(a){return await e("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await e("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await e("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await e("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await e("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await e("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await e("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await e("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await e("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{k as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as i,h as a,w as l}from"./index-
|
|
1
|
+
import{N as i,h as a,w as l}from"./index-CAjyUjZl.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-Bn1JzzAn.js";function c(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,u=e;if(Array.isArray(e)&&(u=i(e)[0]),!u)return null;const n=o(u,r,s);return n.props=t?a(a({},n.props),r):n.props,l(typeof n.props.class!="object","class must be string"),n}function V(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return e.map(s=>c(s,r,t))}function v(e,r,t){p(o(e,a({},r)),t)}const m=e=>(e||[]).some(r=>g(r)?!(r.type===d||r.type===f&&!m(r.children)):!0)?e:null;function h(e,r,t,s){var u;const n=(u=e[r])===null||u===void 0?void 0:u.call(e,t);return m(n)?n:s?.()}export{h as a,V as b,c,v as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{K as o}from"./index-
|
|
1
|
+
import{K as o}from"./index-CAjyUjZl.js";import{i as f}from"./motion-BtjIT9np.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
|
|
2
2
|
${t}-enter,
|
|
3
3
|
${t}-appear
|
|
4
4
|
`]:{transform:"scale(0)",opacity:0,animationTimingFunction:n.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${t}-leave`]:{animationTimingFunction:n.motionEaseInOutCirc}}]};export{h as i,c as z};
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// Injected by web-ui-server.js at serve time
|
|
9
9
|
window.__CC_CONFIG__ = __CC_CONFIG_PLACEHOLDER__;
|
|
10
10
|
</script>
|
|
11
|
-
<script type="module" crossorigin src="./assets/index-
|
|
11
|
+
<script type="module" crossorigin src="./assets/index-CAjyUjZl.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="./assets/vendor-Bn1JzzAn.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="./assets/icons-DG5UD-6K.js">
|
|
14
14
|
<link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"lowcode": "Usage: chainlesschain lowcode [options] [command]\n\nLow-code application platform\n\nOptions:\n -h, --help display help for command\n\nCommands:\n create [options] <name> Create a new low-code application\n list [options] List all low-code applications\n preview <app-id> Preview application info\n publish <app-id> Publish an application\n components [options] List available built-in components\n datasource [options] <app-id> <name> <type> Add a data source to an application\n versions [options] <app-id> Show version history for an application\n rollback <app-id> <version> Rollback application to a previous version\n export [options] <app-id> Export application definition\n categories [options] List component categories (V2)\n datasource-types [options] List supported data source types (V2)\n statuses [options] List canonical app statuses (V2)\n components-v2 [options] List built-in components with category filter (V2)\n datasource-v2 [options] <app-id> <name> <type> Register a validated data source (V2)\n test-connection [options] <datasource-id> Heuristic connection check for a data source (V2)\n set-status <app-id> <status> Update app status with validated transition (V2)\n archive <app-id> Archive an application (V2)\n status-history [options] <app-id> Show status transition history for an app (V2)\n clone [options] <source-id> Clone an application (V2)\n export-json [options] <app-id> Export an app as canonical JSON (V2)\n import-json <file> Import an app from a canonical JSON file (V2)\n stats-v2 [options] Low-code platform statistics (V2)\n deploy [options] <app-id> Deploy application as static HTML bundle\n enums-v2 Show V2 enums (app maturity + build lifecycle)\n config-v2 Show V2 config thresholds\n set-max-active-apps-v2 <n> Set max active apps per owner\n set-max-pending-builds-v2 <n> Set max pending builds per app\n set-app-idle-ms-v2 <n> Set app idle threshold (ms)\n set-build-stuck-ms-v2 <n> Set build stuck threshold (ms)\n register-app-v2 [options] <id> <owner> Register V2 app\n activate-app-v2 <id> Activate app\n pause-app-v2 <id> Pause app\n archive-app-v2 <id> Archive app (terminal)\n touch-app-v2 <id> Touch app lastTouchedAt\n get-app-v2 <id> Get V2 app\n list-apps-v2 List V2 apps\n create-build-v2 [options] <id> <appId> Create V2 app build (queued)\n start-build-v2 <id> Start build\n succeed-build-v2 <id> Succeed build\n fail-build-v2 <id> [reason] Fail build\n cancel-build-v2 <id> [reason] Cancel build\n get-build-v2 <id> Get V2 build\n list-builds-v2 List V2 builds\n auto-pause-idle-v2 Auto-pause idle active apps\n auto-fail-stuck-v2 Auto-fail stuck building builds\n gov-stats-v2 V2 governance aggregate stats\n help [command] display help for command\n",
|
|
89
89
|
"marketplace": "Usage: chainlesschain marketplace [options] [command]\n\nSkill marketplace — publish skill services, record invocations, view stats\n\nOptions:\n -h, --help display help for command\n\nCommands:\n status-types [options] List known service statuses\n invocation-statuses [options] List known invocation statuses\n publish [options] <name> Publish a skill service\n list [options] List skill services\n show [options] <service-id> Show full details of a skill service\n status [options] <service-id> <new-status> Transition service status (draft|published|deprecated|suspended)\n record [options] <service-id> Record a skill invocation against a published service\n invocations [options] List skill invocations\n stats [options] Aggregate invocation stats (optionally scoped to a service)\n service-statuses-v2 [options] List V2 service statuses (frozen enum)\n invocation-statuses-v2 [options] List V2 invocation statuses (frozen enum)\n pricing-models [options] List V2 pricing models (frozen enum)\n default-max-concurrent Show default per-service concurrency cap\n max-concurrent Show current per-service concurrency cap\n active-invocation-count [service-id] Show count of PENDING + RUNNING invocations (all services by default)\n set-max-concurrent <n> Set the per-service concurrency cap\n begin-v2 [options] <service-id> Begin a V2 invocation (creates PENDING, enforces cap)\n start-invocation [options] <invocation-id> Start a V2 invocation (PENDING → RUNNING)\n complete-invocation [options] <invocation-id> Complete a V2 invocation (RUNNING → SUCCESS)\n fail-invocation [options] <invocation-id> Fail a V2 invocation\n timeout-invocation [options] <invocation-id> Timeout a V2 invocation\n set-invocation-status [options] <invocation-id> <status> Set V2 invocation status via the state machine\n stats-v2 [options] V2 aggregated stats\n purchase [options] <itemId> Initiate a purchase. Large orders (≥ threshold) route through M-of-N multisig.\n consume [options] <proposalId> Execute a multisig-gated purchase after threshold reached (marks proposal consumed)\n help [command] display help for command\n",
|
|
90
90
|
"matrix": "Usage: chainlesschain matrix [options] [command]\n\nMatrix bridge — rooms, messaging, E2EE\n\nOptions:\n -h, --help display help for command\n\nCommands:\n login [options] Login to a Matrix homeserver\n rooms [options] List joined rooms\n send [options] <room-id> <message> Send a message to a room\n messages [options] <room-id> Get messages from a room\n join <room-id> Join a Matrix room\n thread Matrix threaded replies (m.thread\n relation)\n space Matrix Spaces — hierarchical room\n grouping (m.space)\n enums-v2 Show V2 enums\n register-room-v2 [options] Register a matrix room profile (pending)\n activate-room-v2 <id> Activate room\n mute-room-v2 <id> Mute room\n archive-room-v2 <id> Archive room (terminal)\n touch-room-v2 <id> Refresh lastTouchedAt\n get-room-v2 <id> Get a room\n list-rooms-v2 List rooms\n create-msg-v2 [options] Create a matrix message (queued)\n start-msg-v2 <id> Transition msg to sending\n deliver-msg-v2 <id> Transition msg to delivered\n fail-msg-v2 [options] <id> Fail msg\n cancel-msg-v2 [options] <id> Cancel msg\n get-msg-v2 <id> Get msg\n list-msgs-v2 List msgs\n set-max-active-rooms-v2 <n> Set per-owner active cap\n set-max-pending-msgs-v2 <n> Set per-room pending cap\n set-room-idle-ms-v2 <n> Set idle threshold\n set-msg-stuck-ms-v2 <n> Set stuck threshold\n auto-mute-idle-rooms-v2 Auto-mute idle rooms\n auto-fail-stuck-msgs-v2 Auto-fail stuck sending msgs\n stats-v2 V2 aggregate stats\n help [command] display help for command\n",
|
|
91
|
-
"mcp": "Usage: chainlesschain mcp [options] [command]\n\nMCP server management and tool execution\n\nOptions:\n -h, --help display help for command\n\nCommands:\n login [options] <target> Authorize a remote MCP server via OAuth (opens a browser, or prints the URL in headless/SSH environments); stores the token. <target> is a URL or a configured server name.\n logout <target> Delete the stored OAuth token for a remote MCP server (<target> is a URL or a configured server name)\n auth [options] List stored MCP OAuth tokens\n serve [options] Expose local file tools (read/list/search/write, root-confined) as a Streamable-HTTP MCP server for other clients\n computer-use [options] Expose GUI control (screenshot/window-list/click/type/scroll/clipboard/app-launch) as a Streamable-HTTP MCP server. OFF by default; input verbs need confirm:true; high-risk apps (terminals/IDEs/settings/password managers) always confirm\n servers|list [options] List configured MCP servers\n trust-executable [options] <name> Review and trust the current executable and interpreter-entrypoint bytes for one stdio MCP server\n add [options] <name> Add or update an MCP server configuration\n remove [options] <name> Remove an MCP server configuration\n get [options] <name> Show one MCP server configuration and its source\n doctor [options] [name] Validate MCP configuration and test transport handshakes\n connect [options] <name> Connect to an MCP server\n disconnect <name> Disconnect from an MCP server\n tools [options] List available MCP tools\n call [options] <tool> Call an MCP tool\n resources [options] List resources exposed by MCP servers\n read-resource [options] <uri> Read an MCP resource by URI\n prompts [options] List prompts exposed by MCP servers\n get-prompt [options] <name> Fetch a rendered MCP prompt by name\n trust-helper [options] <name> Trust the exact headers helper command for a workspace-local MCP server\n trust-project [options] Re-trust the project .mcp.json after reviewing a content change (records its fingerprint for --project-mcp runs)\n scaffold [options] <name> Scaffold a new MCP server project (stdio or http+sse)\n registry Browse the curated catalog of community MCP servers\n server-maturities-v2 List MCP server maturity states (V2)\n invocation-lifecycle-v2 List MCP invocation lifecycle states (V2)\n stats-v2 Show MCP registry V2 stats\n config-v2 Show MCP registry V2 config\n register-server-v2 <id> <owner> <endpoint> Register an MCP server (V2)\n activate-server-v2 <id> Activate an MCP server (V2)\n degrade-server-v2 <id> Degrade an MCP server (V2)\n retire-server-v2 <id> Retire an MCP server (V2)\n touch-server-v2 <id> Touch an MCP server (V2)\n get-server-v2 <id> Get an MCP server (V2)\n list-servers-v2 List MCP servers (V2)\n create-invocation-v2 <id> <serverId> <tool> Create an MCP invocation (V2)\n dispatch-invocation-v2 <id> Dispatch an MCP invocation (V2)\n complete-invocation-v2 <id> Complete an MCP invocation (V2)\n fail-invocation-v2 <id> [reason] Fail an MCP invocation (V2)\n cancel-invocation-v2 <id> [reason] Cancel an MCP invocation (V2)\n get-invocation-v2 <id> Get an MCP invocation (V2)\n list-invocations-v2 List MCP invocations (V2)\n auto-degrade-idle-servers-v2 Auto-degrade idle MCP servers (V2)\n auto-fail-stuck-invocations-v2 Auto-fail stuck MCP invocations (V2)\n set-max-active-servers-v2 <n> Set max active servers per owner (V2)\n set-max-pending-invocations-v2 <n> Set max pending invocations per server (V2)\n set-server-idle-ms-v2 <n> Set MCP server idle timeout in ms (V2)\n set-invocation-stuck-ms-v2 <n> Set MCP invocation stuck timeout in ms (V2)\n reset-state-v2 Reset MCP registry V2 in-memory state\n help [command] display help for command\n",
|
|
91
|
+
"mcp": "Usage: chainlesschain mcp [options] [command]\n\nMCP server management and tool execution\n\nOptions:\n -h, --help display help for command\n\nCommands:\n login [options] <target> Authorize a remote MCP server via OAuth (opens a browser, or prints the URL in headless/SSH environments); stores the token. <target> is a URL or a configured server name.\n logout <target> Delete the stored OAuth token for a remote MCP server (<target> is a URL or a configured server name)\n auth [options] List stored MCP OAuth tokens\n serve [options] Expose local file tools (read/list/search/write, root-confined) as a Streamable-HTTP MCP server for other clients\n computer-use [options] Expose GUI control (screenshot/window-list/click/type/scroll/clipboard/app-launch) as a Streamable-HTTP MCP server. OFF by default; input verbs need confirm:true; high-risk apps (terminals/IDEs/settings/password managers) always confirm\n servers|list [options] List configured MCP servers\n materialize-package [options] <name> Replace one exact JavaScript package launcher with a content-addressed, guarded dependency capsule\n trust-executable [options] <name> Review and trust the current executable and interpreter-entrypoint bytes for one stdio MCP server\n add [options] <name> Add or update an MCP server configuration\n remove [options] <name> Remove an MCP server configuration\n get [options] <name> Show one MCP server configuration and its source\n doctor [options] [name] Validate MCP configuration and test transport handshakes\n connect [options] <name> Connect to an MCP server\n disconnect <name> Disconnect from an MCP server\n tools [options] List available MCP tools\n call [options] <tool> Call an MCP tool\n resources [options] List resources exposed by MCP servers\n read-resource [options] <uri> Read an MCP resource by URI\n prompts [options] List prompts exposed by MCP servers\n get-prompt [options] <name> Fetch a rendered MCP prompt by name\n trust-helper [options] <name> Trust the exact headers helper command for a workspace-local MCP server\n trust-project [options] Re-trust the project .mcp.json after reviewing a content change (records its fingerprint for --project-mcp runs)\n scaffold [options] <name> Scaffold a new MCP server project (stdio or http+sse)\n registry Browse the curated catalog of community MCP servers\n server-maturities-v2 List MCP server maturity states (V2)\n invocation-lifecycle-v2 List MCP invocation lifecycle states (V2)\n stats-v2 Show MCP registry V2 stats\n config-v2 Show MCP registry V2 config\n register-server-v2 <id> <owner> <endpoint> Register an MCP server (V2)\n activate-server-v2 <id> Activate an MCP server (V2)\n degrade-server-v2 <id> Degrade an MCP server (V2)\n retire-server-v2 <id> Retire an MCP server (V2)\n touch-server-v2 <id> Touch an MCP server (V2)\n get-server-v2 <id> Get an MCP server (V2)\n list-servers-v2 List MCP servers (V2)\n create-invocation-v2 <id> <serverId> <tool> Create an MCP invocation (V2)\n dispatch-invocation-v2 <id> Dispatch an MCP invocation (V2)\n complete-invocation-v2 <id> Complete an MCP invocation (V2)\n fail-invocation-v2 <id> [reason] Fail an MCP invocation (V2)\n cancel-invocation-v2 <id> [reason] Cancel an MCP invocation (V2)\n get-invocation-v2 <id> Get an MCP invocation (V2)\n list-invocations-v2 List MCP invocations (V2)\n auto-degrade-idle-servers-v2 Auto-degrade idle MCP servers (V2)\n auto-fail-stuck-invocations-v2 Auto-fail stuck MCP invocations (V2)\n set-max-active-servers-v2 <n> Set max active servers per owner (V2)\n set-max-pending-invocations-v2 <n> Set max pending invocations per server (V2)\n set-server-idle-ms-v2 <n> Set MCP server idle timeout in ms (V2)\n set-invocation-stuck-ms-v2 <n> Set MCP invocation stuck timeout in ms (V2)\n reset-state-v2 Reset MCP registry V2 in-memory state\n help [command] display help for command\n",
|
|
92
92
|
"mcpscaf": "Usage: chainlesschain mcpscaf [options] [command]\n\nMCP Scaffold V2 governance\n\nOptions:\n -h, --help display help for command\n\nCommands:\n enums-v2\n config-v2\n set-max-active-v2 <n>\n set-max-pending-v2 <n>\n set-idle-ms-v2 <n>\n set-stuck-ms-v2 <n>\n register-profile-v2 [options] <id> <owner>\n activate-profile-v2 <id>\n stale-profile-v2 <id>\n archive-profile-v2 <id>\n touch-profile-v2 <id>\n get-profile-v2 <id>\n list-profiles-v2\n create-generation-v2 [options] <id> <profileId>\n generating-generation-v2 <id>\n generate-generation-v2 <id>\n fail-generation-v2 <id> [reason]\n cancel-generation-v2 <id> [reason]\n get-generation-v2 <id>\n list-generations-v2\n auto-stale-idle-v2\n auto-fail-stuck-v2\n gov-stats-v2\n reset-state-v2\n help [command] display help for command\n",
|
|
93
93
|
"meminj": "Usage: chainlesschain meminj [options] [command]\n\nMemory Injection V2 governance\n\nOptions:\n -h, --help display help for command\n\nCommands:\n enums-v2\n config-v2\n set-max-active-v2 <n>\n set-max-pending-v2 <n>\n set-idle-ms-v2 <n>\n set-stuck-ms-v2 <n>\n register-rule-v2 [options] <id> <owner>\n activate-rule-v2 <id>\n pause-rule-v2 <id>\n archive-rule-v2 <id>\n touch-rule-v2 <id>\n get-rule-v2 <id>\n list-rules-v2\n create-injection-v2 [options] <id> <ruleId>\n injecting-injection-v2 <id>\n apply-injection-v2 <id>\n fail-injection-v2 <id> [reason]\n cancel-injection-v2 <id> [reason]\n get-injection-v2 <id>\n list-injections-v2\n auto-pause-idle-v2\n auto-fail-stuck-v2\n gov-stats-v2\n reset-state-v2\n help [command] display help for command\n",
|
|
94
94
|
"memory": "Usage: chainlesschain memory [options] [command]\n\nPersistent memory and daily notes\n\nOptions:\n -h, --help display help for command\n\nCommands:\n files [options] List the project-memory files cc agent\n auto-loads here (cc.md hierarchy + imports\n + path-scoped rules)\n show [options] Show memory entries\n export [options] Export all memory entries as JSON (module\n 101 §8.3 backup)\n import [options] Import memory entries from a JSON array\n file (idempotent upsert by id; §8.3)\n add [options] <text> Add a memory entry\n search [options] <query> Search memory entries\n delete <id> Delete a memory entry\n daily [options] [date] View or append to daily notes\n recall [options] [query] Recall scoped memory (session-core\n MemoryStore)\n store [options] <content> Write a scoped memory (session-core\n MemoryStore)\n consolidate [options] Consolidate a session's trace into scoped\n memory\n file [options] View or edit the long-term MEMORY.md file\n entry-maturities-v2 List V2 entry maturity states\n consolidation-lifecycles-v2 List V2 consolidation job lifecycle states\n stats-v2 Show V2 governance stats\n get-max-active-entries-v2 Get max active entries per category\n set-max-active-entries-v2 <n> Set max active entries per category\n get-max-running-jobs-v2 Get max running jobs per source\n set-max-running-jobs-v2 <n> Set max running jobs per source\n get-entry-idle-ms-v2 Get entry idle threshold (ms)\n set-entry-idle-ms-v2 <n> Set entry idle threshold (ms)\n get-job-stuck-ms-v2 Get job stuck threshold (ms)\n set-job-stuck-ms-v2 <n> Set job stuck threshold (ms)\n active-entry-count-v2 <category> Count active entries for a category\n running-job-count-v2 <source> Count running jobs for a source\n register-entry-v2 [options] <id> Register a V2 entry\n get-entry-v2 <id> Get a V2 entry\n list-entries-v2 [options] List V2 entries\n activate-entry-v2 <id> pending|parked → active\n park-entry-v2 <id> active → parked\n archive-entry-v2 <id> → archived (terminal)\n touch-entry-v2 <id> Update lastSeenAt\n create-job-v2 [options] <id> Create a V2 consolidation job\n get-job-v2 <id> Get a V2 consolidation job\n list-jobs-v2 [options] List V2 consolidation jobs\n start-job-v2 <id> queued → running\n succeed-job-v2 <id> running → succeeded (terminal)\n fail-job-v2 <id> running → failed (terminal)\n cancel-job-v2 <id> queued|running → cancelled (terminal)\n auto-park-idle-entries-v2 Flip idle active entries → parked\n auto-fail-stuck-jobs-v2 Flip stuck running jobs → failed\n help [command] display help for command\n",
|
package/src/commands/mcp.js
CHANGED
|
@@ -44,8 +44,14 @@ import {
|
|
|
44
44
|
MCP_STDIO_LOCAL_CODE_TRUST_REQUIRED_CODE,
|
|
45
45
|
issueMcpStdioExecutionAuthority,
|
|
46
46
|
materializeApprovedMcpStdioInvocation,
|
|
47
|
+
resolveMcpStdioExecutionApproval,
|
|
47
48
|
} from "../lib/mcp-stdio-execution-authority.js";
|
|
48
49
|
import { prepareMcpStdioExecutableIdentity } from "../lib/mcp-stdio-executable-identity.js";
|
|
50
|
+
import {
|
|
51
|
+
materializeMcpStdioNpmPackage,
|
|
52
|
+
parseExactNpmPackageSpec,
|
|
53
|
+
} from "../lib/mcp-stdio-package-materialization.js";
|
|
54
|
+
import { executionBroker } from "../lib/process-execution-broker/index.js";
|
|
49
55
|
import {
|
|
50
56
|
CATALOG as REGISTRY_CATALOG,
|
|
51
57
|
CATEGORIES as REGISTRY_CATEGORIES,
|
|
@@ -807,6 +813,119 @@ export function registerMcpCommand(program) {
|
|
|
807
813
|
}
|
|
808
814
|
});
|
|
809
815
|
|
|
816
|
+
mcp
|
|
817
|
+
.command("materialize-package <name>")
|
|
818
|
+
.description(
|
|
819
|
+
"Replace one exact JavaScript package launcher with a content-addressed, guarded dependency capsule",
|
|
820
|
+
)
|
|
821
|
+
.requiredOption(
|
|
822
|
+
"--package <name@version>",
|
|
823
|
+
"Exact npm registry package version to install (ranges and tags are rejected)",
|
|
824
|
+
)
|
|
825
|
+
.option(
|
|
826
|
+
"--bin <name>",
|
|
827
|
+
"Select one exported bin when the package has several",
|
|
828
|
+
)
|
|
829
|
+
.option(
|
|
830
|
+
"--scope <scope>",
|
|
831
|
+
`Configuration scope: ${MCP_CONFIG_SCOPES.join(" | ")}`,
|
|
832
|
+
)
|
|
833
|
+
.option(
|
|
834
|
+
"--json",
|
|
835
|
+
"Output the materialized generation and closure identity as JSON",
|
|
836
|
+
)
|
|
837
|
+
.action(async (name, options) => {
|
|
838
|
+
try {
|
|
839
|
+
const exact = parseExactNpmPackageSpec(options.package);
|
|
840
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
841
|
+
if (!ctx.db) throw new Error("Database not available");
|
|
842
|
+
const configStore = new MCPServerConfig(ctx.db.getDatabase());
|
|
843
|
+
const scope = options.scope
|
|
844
|
+
? normalizeMcpConfigScope(options.scope)
|
|
845
|
+
: undefined;
|
|
846
|
+
const rows = await effectiveMcpRows(configStore, { scope });
|
|
847
|
+
const row = rows.find((entry) => entry.name === name);
|
|
848
|
+
if (!row) {
|
|
849
|
+
throw new Error(
|
|
850
|
+
`${notFoundWithSuggestion(
|
|
851
|
+
name,
|
|
852
|
+
rows.map((entry) => entry.name),
|
|
853
|
+
{ noun: "Server" },
|
|
854
|
+
)}. Use 'mcp add' first.`,
|
|
855
|
+
);
|
|
856
|
+
}
|
|
857
|
+
if (inferTransport(row) !== "stdio") {
|
|
858
|
+
throw new Error(
|
|
859
|
+
`MCP server "${name}" does not use the stdio transport`,
|
|
860
|
+
);
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
const authorized = authorizeMcpRowForConnect(row);
|
|
864
|
+
const approval = consumeMcpStdioExecutionAuthority(
|
|
865
|
+
authorized.mcpStdioExecutionAuthority,
|
|
866
|
+
{ serverName: name, config: authorized },
|
|
867
|
+
);
|
|
868
|
+
const invocation = materializeApprovedMcpStdioInvocation(approval);
|
|
869
|
+
const approvalRecord = resolveMcpStdioExecutionApproval(approval);
|
|
870
|
+
const materialized = materializeMcpStdioNpmPackage({
|
|
871
|
+
approvalRecord,
|
|
872
|
+
config: invocation,
|
|
873
|
+
packageSpec: exact.spec,
|
|
874
|
+
...(options.bin ? { binName: options.bin } : {}),
|
|
875
|
+
env: process.env,
|
|
876
|
+
processBrokerRunSync: (command, args, spawnOptions) =>
|
|
877
|
+
executionBroker.spawnSync(command, args, {
|
|
878
|
+
...spawnOptions,
|
|
879
|
+
origin: `mcp:package-materialization:${name}`,
|
|
880
|
+
policy: "allow",
|
|
881
|
+
scope: "mcp",
|
|
882
|
+
shell: false,
|
|
883
|
+
}),
|
|
884
|
+
});
|
|
885
|
+
const prepared = prepareMcpStdioExecutableIdentity({
|
|
886
|
+
serverName: name,
|
|
887
|
+
config: invocation,
|
|
888
|
+
approval,
|
|
889
|
+
cwd: process.cwd(),
|
|
890
|
+
env: process.env,
|
|
891
|
+
retrust: true,
|
|
892
|
+
});
|
|
893
|
+
const result = {
|
|
894
|
+
name,
|
|
895
|
+
package: exact.spec,
|
|
896
|
+
generation: materialized.generation,
|
|
897
|
+
manifestDigest: materialized.manifestDigest,
|
|
898
|
+
identityDigest: prepared.identityDigest,
|
|
899
|
+
closure: materialized.identity,
|
|
900
|
+
command: prepared.identity.command,
|
|
901
|
+
entrypoints: prepared.identity.entrypoints,
|
|
902
|
+
};
|
|
903
|
+
if (options.json) {
|
|
904
|
+
console.log(JSON.stringify(result, null, 2));
|
|
905
|
+
} else {
|
|
906
|
+
logger.log(
|
|
907
|
+
chalk.green(
|
|
908
|
+
`Materialized and trusted ${exact.spec} for MCP server "${name}".`,
|
|
909
|
+
),
|
|
910
|
+
);
|
|
911
|
+
logger.log(
|
|
912
|
+
` ${chalk.gray("Generation:")} ${materialized.generation}`,
|
|
913
|
+
);
|
|
914
|
+
logger.log(
|
|
915
|
+
` ${chalk.gray("Dependency closure:")} sha256:${materialized.identity.closureDigest} (${materialized.identity.fileCount} files, ${materialized.identity.totalBytes} bytes)`,
|
|
916
|
+
);
|
|
917
|
+
logger.log(
|
|
918
|
+
` ${chalk.gray("Execution capsule:")} sha256:${materialized.identity.capsule.sha256} (${materialized.identity.capsule.bytes} bytes, ${materialized.identity.capsule.inputCount} bundled inputs)`,
|
|
919
|
+
);
|
|
920
|
+
}
|
|
921
|
+
await shutdown();
|
|
922
|
+
} catch (err) {
|
|
923
|
+
logger.error(`Failed: ${err.message}`);
|
|
924
|
+
process.exitCode = 1;
|
|
925
|
+
await shutdown();
|
|
926
|
+
}
|
|
927
|
+
});
|
|
928
|
+
|
|
810
929
|
mcp
|
|
811
930
|
.command("trust-executable <name>")
|
|
812
931
|
.description(
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import { numericOption } from "../lib/cli-numeric.js";
|
|
3
|
-
import { feature } from "../lib/feature-flags.js";
|
|
4
3
|
import { logger } from "../lib/logger.js";
|
|
5
4
|
import { getPrLinks } from "../lib/pr-link-store.js";
|
|
6
5
|
import {
|
|
7
6
|
getJsonlSessionMetadata,
|
|
8
7
|
rebuildMessages,
|
|
9
|
-
|
|
10
|
-
sessionHasPersistedEvidence,
|
|
8
|
+
resolveSessionAuthority,
|
|
11
9
|
} from "../harness/jsonl-session-store.js";
|
|
12
10
|
|
|
13
11
|
export function registerSessionShowSubcommand(session, program) {
|
|
@@ -23,14 +21,14 @@ export function registerSessionShowSubcommand(session, program) {
|
|
|
23
21
|
try {
|
|
24
22
|
let sess = null;
|
|
25
23
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
) {
|
|
24
|
+
// The feature flag controls creation/migration, not authority. Once a
|
|
25
|
+
// canonical namespace witness exists it must fence the legacy DB even
|
|
26
|
+
// if JSONL_SESSION is later disabled.
|
|
27
|
+
const authority = resolveSessionAuthority(id);
|
|
28
|
+
const jsonlId = authority?.readable ? authority.id : null;
|
|
29
|
+
if (authority && !authority.readable) {
|
|
32
30
|
logger.error(
|
|
33
|
-
`Session ${id} has canonical persistence evidence but no readable transcript.`,
|
|
31
|
+
`Session ${authority.id} has canonical persistence evidence but no readable transcript (${authority.presence}).`,
|
|
34
32
|
);
|
|
35
33
|
process.exitCode = 1;
|
|
36
34
|
return;
|
package/src/commands/session.js
CHANGED
|
@@ -47,18 +47,17 @@ import {
|
|
|
47
47
|
getSessionManagerStatsV2,
|
|
48
48
|
} from "../lib/session-manager.js";
|
|
49
49
|
import {
|
|
50
|
-
|
|
50
|
+
listSessionAuthoritySummaries,
|
|
51
|
+
listSessionEvidenceIds,
|
|
51
52
|
rebuildMessages,
|
|
52
53
|
getJsonlSessionMetadata,
|
|
53
|
-
|
|
54
|
-
sessionHasPersistedEvidence,
|
|
54
|
+
resolveSessionAuthority,
|
|
55
55
|
deleteJsonlSession,
|
|
56
56
|
migrateLegacySessions,
|
|
57
57
|
migrateLegacySessionsBatch,
|
|
58
58
|
validateJsonlSession,
|
|
59
59
|
validateAllJsonlSessions,
|
|
60
60
|
} from "../harness/jsonl-session-store.js";
|
|
61
|
-
import { feature } from "../lib/feature-flags.js";
|
|
62
61
|
import {
|
|
63
62
|
listWorkflowSessions,
|
|
64
63
|
readWorkflowSession,
|
|
@@ -234,26 +233,24 @@ export function registerSessionCommand(program) {
|
|
|
234
233
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
235
234
|
const limit = Math.max(1, parseInt(options.limit) || 20);
|
|
236
235
|
let sessions = [];
|
|
236
|
+
const canonicalIds = new Set(listSessionEvidenceIds());
|
|
237
237
|
|
|
238
238
|
// Merge DB sessions + JSONL sessions
|
|
239
239
|
if (ctx.db) {
|
|
240
240
|
const db = ctx.db.getDatabase();
|
|
241
241
|
sessions.push(
|
|
242
|
-
...listSessions(db, { limit })
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
242
|
+
...listSessions(db, { limit })
|
|
243
|
+
.filter((s) => !canonicalIds.has(s?.id))
|
|
244
|
+
.map((s) => ({
|
|
245
|
+
...s,
|
|
246
|
+
_store: "db",
|
|
247
|
+
})),
|
|
246
248
|
);
|
|
247
249
|
}
|
|
248
250
|
|
|
249
|
-
if
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
...s,
|
|
253
|
-
_store: "jsonl",
|
|
254
|
-
})),
|
|
255
|
-
);
|
|
256
|
-
}
|
|
251
|
+
// Existing canonical sessions remain authoritative even if the
|
|
252
|
+
// creation/migration feature flag is later disabled.
|
|
253
|
+
sessions.push(...listSessionAuthoritySummaries({ limit }));
|
|
257
254
|
|
|
258
255
|
// Deduplicate by id (JSONL takes precedence) and rank by real time.
|
|
259
256
|
sessions = rankSessions(sessions, limit);
|
|
@@ -324,11 +321,14 @@ export function registerSessionCommand(program) {
|
|
|
324
321
|
try {
|
|
325
322
|
ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
326
323
|
if (ctx.db) {
|
|
324
|
+
const canonicalIds = new Set(listSessionEvidenceIds());
|
|
327
325
|
local.push(
|
|
328
|
-
...listSessions(ctx.db.getDatabase(), { limit })
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
326
|
+
...listSessions(ctx.db.getDatabase(), { limit })
|
|
327
|
+
.filter((item) => !canonicalIds.has(item?.id))
|
|
328
|
+
.map((item) => ({
|
|
329
|
+
...item,
|
|
330
|
+
_store: "db",
|
|
331
|
+
})),
|
|
332
332
|
);
|
|
333
333
|
}
|
|
334
334
|
} catch (error) {
|
|
@@ -338,12 +338,7 @@ export function registerSessionCommand(program) {
|
|
|
338
338
|
// JSONL is the canonical transcript store and can be read without
|
|
339
339
|
// bootstrapping legacy native DB/config packages (some of which
|
|
340
340
|
// write banners directly to stdout and would corrupt --json).
|
|
341
|
-
local.push(
|
|
342
|
-
...listJsonlSessions({ limit }).map((item) => ({
|
|
343
|
-
...item,
|
|
344
|
-
_store: "jsonl",
|
|
345
|
-
})),
|
|
346
|
-
);
|
|
341
|
+
local.push(...listSessionAuthoritySummaries({ limit }));
|
|
347
342
|
local = rankSessions(local, limit);
|
|
348
343
|
} catch (error) {
|
|
349
344
|
sourceErrors.local = error?.message || String(error);
|
|
@@ -613,15 +608,14 @@ export function registerSessionCommand(program) {
|
|
|
613
608
|
id = picked.id;
|
|
614
609
|
}
|
|
615
610
|
|
|
616
|
-
// Try
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
) {
|
|
611
|
+
// Try the complete canonical namespace first. The feature flag cannot
|
|
612
|
+
// make an existing/damaged canonical generation disappear and thereby
|
|
613
|
+
// authorize a legacy fallback.
|
|
614
|
+
const authority = resolveSessionAuthority(id);
|
|
615
|
+
const jsonlId = authority?.readable ? authority.id : null;
|
|
616
|
+
if (authority && !authority.readable) {
|
|
623
617
|
logger.error(
|
|
624
|
-
`Session ${id} has canonical persistence evidence but no readable transcript.`,
|
|
618
|
+
`Session ${authority.id} has canonical persistence evidence but no readable transcript (${authority.presence}).`,
|
|
625
619
|
);
|
|
626
620
|
logger.error(
|
|
627
621
|
"Refusing legacy fallback. Inspect or explicitly delete the damaged JSONL session before reusing its id.",
|
|
@@ -735,11 +729,14 @@ export function registerSessionCommand(program) {
|
|
|
735
729
|
// Canonical content source: append-only JSONL event log. The legacy DB
|
|
736
730
|
// is consulted only when no matching transcript exists.
|
|
737
731
|
const store = await import("../harness/jsonl-session-store.js");
|
|
738
|
-
const
|
|
739
|
-
|
|
740
|
-
|
|
732
|
+
const requestedId = id === "last" ? store.getLastSessionId() : id;
|
|
733
|
+
const authority = requestedId
|
|
734
|
+
? store.resolveSessionAuthority(requestedId)
|
|
735
|
+
: null;
|
|
736
|
+
const sid = authority?.readable ? authority.id : null;
|
|
737
|
+
if (authority && !authority.readable) {
|
|
741
738
|
throw new Error(
|
|
742
|
-
`Session ${id} has canonical persistence evidence but no readable transcript`,
|
|
739
|
+
`Session ${authority.id} has canonical persistence evidence but no readable transcript (${authority.presence})`,
|
|
743
740
|
);
|
|
744
741
|
}
|
|
745
742
|
if (sid) {
|
|
@@ -820,7 +817,10 @@ export function registerSessionCommand(program) {
|
|
|
820
817
|
try {
|
|
821
818
|
const sessionIndex = await import("../harness/session-index.js");
|
|
822
819
|
indexDb = sessionIndex.openIndex();
|
|
823
|
-
sessionIndex.syncIndex(indexDb);
|
|
820
|
+
const sync = sessionIndex.syncIndex(indexDb);
|
|
821
|
+
if (sync.rejected > 0) {
|
|
822
|
+
indexDiagnostic = `${sync.rejected} canonical session(s) were excluded because verification failed`;
|
|
823
|
+
}
|
|
824
824
|
matches = sessionIndex
|
|
825
825
|
.searchSessions(indexDb, query, { limit })
|
|
826
826
|
.map((hit) => ({
|
|
@@ -841,7 +841,7 @@ export function registerSessionCommand(program) {
|
|
|
841
841
|
});
|
|
842
842
|
for (const s of sessions) {
|
|
843
843
|
if (matches.length >= limit) break;
|
|
844
|
-
for (const ev of store.
|
|
844
|
+
for (const ev of store.readVerifiedEvents(s.id)) {
|
|
845
845
|
if (matches.length >= limit) break;
|
|
846
846
|
if (
|
|
847
847
|
ev.type !== "user_message" &&
|
|
@@ -921,8 +921,8 @@ export function registerSessionCommand(program) {
|
|
|
921
921
|
.action(async (id, options) => {
|
|
922
922
|
let ctx = null;
|
|
923
923
|
try {
|
|
924
|
-
const
|
|
925
|
-
|
|
924
|
+
const authority = resolveSessionAuthority(id);
|
|
925
|
+
const jsonlId = authority?.id || null;
|
|
926
926
|
let db = null;
|
|
927
927
|
try {
|
|
928
928
|
ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
@@ -985,10 +985,11 @@ export function registerSessionCommand(program) {
|
|
|
985
985
|
Array.isArray(title) ? title.join(" ") : title,
|
|
986
986
|
).trim();
|
|
987
987
|
if (!normalized) throw new Error("A non-empty title is required");
|
|
988
|
-
const
|
|
989
|
-
|
|
988
|
+
const authority = resolveSessionAuthority(id);
|
|
989
|
+
const jsonlId = authority?.readable ? authority.id : null;
|
|
990
|
+
if (authority && !authority.readable) {
|
|
990
991
|
throw new Error(
|
|
991
|
-
`Session ${id} has canonical persistence evidence but no readable transcript`,
|
|
992
|
+
`Session ${authority.id} has canonical persistence evidence but no readable transcript (${authority.presence})`,
|
|
992
993
|
);
|
|
993
994
|
}
|
|
994
995
|
let result;
|
|
@@ -2175,14 +2176,17 @@ async function mirrorSessions(ids) {
|
|
|
2175
2176
|
|
|
2176
2177
|
const pushed = [];
|
|
2177
2178
|
const errors = [];
|
|
2178
|
-
const { readFileSync, existsSync } = await import("node:fs");
|
|
2179
2179
|
for (const id of ids) {
|
|
2180
2180
|
try {
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
if (!
|
|
2184
|
-
|
|
2185
|
-
|
|
2181
|
+
const authority = store.resolveSessionAuthority(id);
|
|
2182
|
+
if (!authority) throw new Error("session not found");
|
|
2183
|
+
if (!authority.readable) {
|
|
2184
|
+
throw new Error(
|
|
2185
|
+
`canonical session is not readable (${authority.presence})`,
|
|
2186
|
+
);
|
|
2187
|
+
}
|
|
2188
|
+
const bytes = store.readVerifiedTranscriptBytes(authority.id);
|
|
2189
|
+
pushed.push(await mirror.push(authority.id, bytes));
|
|
2186
2190
|
} catch (err) {
|
|
2187
2191
|
errors.push({ id, error: err.message });
|
|
2188
2192
|
}
|
|
@@ -2232,7 +2236,11 @@ async function mirrorPruneSessions() {
|
|
|
2232
2236
|
const { pruneMirror } = await import("../harness/session-mirror.js");
|
|
2233
2237
|
const { mirror } = await loadConfiguredMirror();
|
|
2234
2238
|
if (!mirror) return { target: null, deleted: [], kept: [] };
|
|
2235
|
-
|
|
2239
|
+
// A damaged local generation must not cause automatic deletion of its last
|
|
2240
|
+
// off-box recovery copy. Only an explicit canonical tombstone is prunable.
|
|
2241
|
+
const keep = store
|
|
2242
|
+
.listSessionEvidenceIds()
|
|
2243
|
+
.filter((id) => store.getSessionPresence(id) !== "tombstoned");
|
|
2236
2244
|
const res = await pruneMirror(mirror, { keep });
|
|
2237
2245
|
return { target: mirror.target, ...res };
|
|
2238
2246
|
}
|