chainlesschain 0.163.5 → 0.163.7
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/completions/_cc +1 -1
- package/completions/cc.bash +1 -1
- package/completions/cc.fish +1 -1
- package/completions/cc.ps1 +1 -1
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-Cv2EE1Zy.js → AIOps-axqQfwv8.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CcpxMLuW.js → ActionButton-DV-Ro0By.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DE8mJoMI.js → Analytics-Bt72WEVu.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DKn9dk9L.js → AppLayout-BtepG55E.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Cp3mG3Py.js → Artifacts-B7KaJ7S_.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-zvsQfF2C.js → Audit-FNFaUg7A.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-Bi85SsjN.js → BackgroundAgents-DFb6J2wQ.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Cw47Dj6s.js → Backup-CC7YBhyj.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C5Ip2afH.js → BaseInput-RkgTNVtj.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-C0iAFkJv.js → Chat-hHEmGZy-.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BV9Wv7wO.js → ChatBubbleRenderer-CAP9YhHv.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-3KZZCiAF.js → Checkbox-z5wXOQP1.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-C8OMbBAz.js → Codegen-DVaDJnxy.js} +1 -1
- package/src/assets/web-panel/assets/{Col-B-MB84LJ.js → Col-CJmaRDR5.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DpR7Dxao.js → Community-DF29_2bI.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CyDtz0OS.js → Compact-DtkQkBzn.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-5tiRa2An.js → Compliance-xoHDxp7I.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DnQaKZ5x.js → Cowork-BUm-R7ht.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-BaWfoEDf.js → Cron-Cgl14ZkB.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Bu0HoHhb.js → Crosschain-BNcbmoqh.js} +1 -1
- package/src/assets/web-panel/assets/{DID-31zk8upX.js → DID-Bwja0Zo9.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BmVne-e2.js → Dashboard-Bk5XjEdJ.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-B4PkoOWd.js → Dropdown-Ci36Oitq.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BZ6tyFtI.js → EmailListRenderer--U04ZN4q.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Osozn4Ds.js → FamilyGuardDashboard-B2gNPR2s.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DaH8TOAP.js → Federation-C4KghYn7.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-tbU0uwis.js → FormItemContext-QL7x_Q_0.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-Df8LQBrL.js → GenericCardRenderer-F3Ryltwm.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DsMB6-14.js → Git-2HassK5k.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BnH0dZzd.js → Governance-DoBIp7oe.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DhnN1N_P.js → Inference--W01QhZ-.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DnNshAgn.js → KnowledgeGraph-DmvwqGpT.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BmBFX3_N.js → Logs-BBJ4yAel.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-DCslfQU3.js → MarkdownRenderer-BLCZMzhJ.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CPEgWDc3.js → Marketplace-D5lNngSI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C36qjgF9.js → McpTools-CkEVOMKH.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-tNHvrgqN.js → Memory-B1Ow1xVE.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Xaf6cKjc.js → MobileBridge-SgYbUfb6.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-D2E5TTeO.js → MobileProjects-BWdOvQAj.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-D4AJ2dwV.js → Mtc-DcTXSSma.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-Df-gtn2_.js → MtcAudit-Dt3WG4oj.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-DTCHLWld.js → Multisig-B9B38UZx.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DruZ_1Jb.js → NLProgramming-B0S4GGvG.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Dx3pdGDs.js → Notes-DZ5U58Ng.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-Bi3L69oL.js → NotificationSettings-PjL5ZW34.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BHY33m7C.js → OrderTableRenderer-DrAX2ESt.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BG2ZVEV-.js → Organization-Cv1GYs-c.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Viwtg4Mn.js → Overflow-Bbkp_PL3.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Clm_yc1Z.js → P2P-BD8QUgoZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-NKmmDiOw.js → PdhVaultBrowser-BO-2PeaB.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-DIL8u9Nk.js → Permissions-D_OPVa02.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-B-jM4wt-.js → PersonalDataHub-mh-pEmaB.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-627I__H5.js → Pipeline-6JC2EDdb.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-2DN2qrkW.js → Privacy-CUshzUAG.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CN4wC0sF.js → ProjectInit-Cs2Aalri.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-K35vsh5H.js → ProjectSettings-1ak49tcj.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-B_wQadhX.js → Projects-BV4oApsm.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-MckaQUhQ.js → Providers-CXXxvafH.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BS3mtA_O.js → QrScannerModal-PTcDsF58.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BHp_nofL.js → QuickAsk-CDwucrJw.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DlmnPuZj.js → Recommend-CJlLVRXR.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-tsyFbvpy.js → RemoteSession-DlN-ETsO.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Ba1iWv2D.js → Reputation-DI23LR6m.js} +1 -1
- package/src/assets/web-panel/assets/{Row-NnlGC--f.js → Row-Cl7UQMrM.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CjThSIRv.js → RssFeed-CexHNfh8.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CojUyC5x.js → Search-BneBWvRN.js} +1 -1
- package/src/assets/web-panel/assets/{Security-c-sxeJEc.js → Security-DX7Phgrp.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CtcKEEmF.js → Services-BWXO8Mte.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CIBBXflN.js → Skeleton-DCyOjKPJ.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-D1XOOK9n.js → Skills-CXqERsTB.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-hRfEp5Sn.js → Sla-bhbrbz8E.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Dexb1f_6.js → SpeechSettings-3IPU0HBZ.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BJsSFGYy.js → SyncSettings-DBNTQLbM.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CfSZ8A1L.js → Tasks-quP0bkN-.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-idDf47W-.js → Templates-BouWmgho.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-C-UsX6w6.js → Tenant-qv0D9s7z.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BgJtX5n1.js → Terminal-BxvbE8BB.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DP0BLKTl.js → TimelineRenderer-D-IeLnJ2.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-LwCzqETp.js → Tokens-CFMKKyVG.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-D_9tVch0.js → Trigger-L8as3UuJ.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BH2UlEWh.js → Trust-MxmA4VZG.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CIpD0nYb.js → UkeySign-C0VvJYRi.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-9ShhYxK_.js → VideoEditing-Bf5QZj8N.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-C7afGNIG.js → Wallet-BIJ9riRz.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-bUKn6i5R.js → WebAuthn-B8p9Mhkw.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-CxgQaGyp.js → WorkflowEditor-BVsuaPen.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DMVkmJwx.js → chat-BfkjoKpV.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CDzQh5nS.js → colors-DeAlsWK8.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-C51kEF4D.js → compact-item-Cs97bz5j.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BTk9bXBn.js → createContext-BqbG60LH.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DPty0mGN.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CMje33rb.js → hasIn-i_RY0b1X.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpcrFxMI.js → index-0-agYlWL.js} +1 -1
- package/src/assets/web-panel/assets/{index-BW4F5YDF.js → index-79V_zv1s.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRG-aqOs.js → index-B-3tEpTc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCRvG9lq.js → index-B-JVTrpr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgivOKHA.js → index-B1CbOH1i.js} +1 -1
- package/src/assets/web-panel/assets/{index-BzCkNylB.js → index-B5UkyA3c.js} +1 -1
- package/src/assets/web-panel/assets/{index-x53Vf7la.js → index-BESLFt4q.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCLj9hcD.js → index-BOVkf1K3.js} +1 -1
- package/src/assets/web-panel/assets/{index-CypsfcEq.js → index-BYUVuwKt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtlEqHLP.js → index-BcUXAB2s.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ld_4mFmC.js → index-BkBi5TmC.js} +1 -1
- package/src/assets/web-panel/assets/{index-DqU9njjT.js → index-Bm7lLR4c.js} +1 -1
- package/src/assets/web-panel/assets/index-Bt7g0Vq_.js +1 -0
- package/src/assets/web-panel/assets/{index-CwGPwjUu.js → index-BuLQobzW.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5IWTMVl.js → index-CE2VtTlp.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJfnCuMq.js → index-CED2PL_y.js} +1 -1
- package/src/assets/web-panel/assets/{index-hg_emBsi.js → index-CG3PRyAL.js} +1 -1
- package/src/assets/web-panel/assets/{index-togc_uYn.js → index-CIG8fQ2_.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4rQCS8T.js → index-COdGA-8n.js} +1 -1
- package/src/assets/web-panel/assets/{index-0Auljb10.js → index-CeWoNHau.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd0hmPxD.js → index-Cf3WCLmy.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXQBPLyE.js → index-CgsqdnRV.js} +1 -1
- package/src/assets/web-panel/assets/index-ChVT0p9u.js +1 -0
- package/src/assets/web-panel/assets/{index-h31MwrME.js → index-D2B4VPyP.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1oZReaY.js → index-D9evtvg2.js} +1 -1
- package/src/assets/web-panel/assets/{index-CfC-piWZ.js → index-DUUrv141.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9rC-fGW.js → index-DiSkx4UB.js} +3 -3
- package/src/assets/web-panel/assets/{index-CvSeVzqe.js → index-Dk2qouAz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtM8OT_7.js → index-Dk7-v4hP.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBz9LIMS.js → index-DmbfhJUP.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAfY7m7i.js → index-DqBgBpgp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVePe_Rf.js → index-PT_5sBMA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CDLkNkLj.js → index-U4f5izHz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTlsE8Df.js → index-YXgLng0K.js} +1 -1
- package/src/assets/web-panel/assets/{index-BeEaAEIp.js → index-ZxO_-E8a.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0-zMtKA.js → index-dIHr4B_u.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1oZQmAA.js → index-gyFpvL7l.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRLQyp2A.js → index-s1opAL-M.js} +1 -1
- package/src/assets/web-panel/assets/{index-OS-vfbTA.js → index-yObj1O4n.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-vrA8K-ac.js → initDefaultProps-C9h9yKL3.js} +1 -1
- package/src/assets/web-panel/assets/{motion-ByEzwIAl.js → motion-BvmLsPdu.js} +1 -1
- package/src/assets/web-panel/assets/{move-Ck4AWjw-.js → move-CoL4ekU1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-6p0l9SrB.js → mtc-parser-C4pMy6xV.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B1CUPQ6R.js → omit-DPuJfNxx.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-B1STg1iW.js → pickAttrs-D0KEeaK2.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DTTllkBV.js → placementArrow-BpkyINxt.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-AIrrCfBb.js → responsiveObserve-DQI_wOq8.js} +1 -1
- package/src/assets/web-panel/assets/{slide-C_fPMjdR.js → slide-DYfdDiRg.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-D5ow2yIP.js → statusUtils-B5dtvb0D.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Dy3hEA--.js → styleChecker-CF310mSj.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-WfzcfSh4.js → useFlexGapSupport-D1Qp4BLp.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CKSejfas.js → useFs-C7_iyvJK.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-od3zpPBN.js → usePersonalDataHub-DZUt_fIm.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DRD_2DFA.js → vnode-D3dsi0lZ.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DmNrEtgf.js → zoom-WdbOlvdQ.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +5 -5
- package/src/command-manifest.json +1 -1
- package/src/commands/agenda.js +76 -4
- package/src/commands/agent.js +90 -1
- package/src/commands/automation.js +462 -3
- package/src/commands/background-session.js +102 -1
- package/src/commands/chat.js +11 -2
- package/src/commands/compact.js +106 -23
- package/src/commands/cowork.js +6 -1
- package/src/commands/loop.js +187 -38
- package/src/commands/routine.js +12 -5
- package/src/commands/scheduler-daemon.js +807 -0
- package/src/commands/session-observability.js +305 -0
- package/src/commands/session.js +38 -0
- package/src/data/changelog.json +28 -2
- package/src/gateways/ws/ws-agent-handler.js +439 -5
- package/src/harness/jsonl-session-store.js +463 -125
- package/src/harness/prompt-compressor.js +86 -13
- package/src/harness/provider-backed-compaction.js +100 -27
- package/src/lib/advisor-runtime.js +3 -1
- package/src/lib/agent-schedule-store.js +737 -47
- package/src/lib/agent-team/team-adjudication.js +40 -1
- package/src/lib/automation-center-routines.js +363 -0
- package/src/lib/automation-center.js +435 -0
- package/src/lib/automation-engine.js +568 -19
- package/src/lib/automation-execution-authority.js +736 -0
- package/src/lib/background-agent-supervisor.js +871 -215
- package/src/lib/background-command-argv.js +24 -0
- package/src/lib/background-interaction-journal.js +361 -52
- package/src/lib/background-interaction-resolver.js +32 -0
- package/src/lib/background-launch-profile.js +2 -0
- package/src/lib/background-needs-input-incident.js +221 -0
- package/src/lib/causal-observability.js +2661 -0
- package/src/lib/chat-session-admission.js +76 -0
- package/src/lib/cost-budget.js +5 -7
- package/src/lib/cowork/ab-comparator-cli.js +11 -0
- package/src/lib/cowork/debate-review-cli.js +12 -0
- package/src/lib/cowork-adapter.js +159 -38
- package/src/lib/cowork-cron.js +673 -19
- package/src/lib/cowork-observe.js +5 -1
- package/src/lib/cowork-task-runner.js +112 -17
- package/src/lib/delivery-coordinator.js +142 -0
- package/src/lib/direct-model-usage.js +121 -0
- package/src/lib/file-lines.js +183 -47
- package/src/lib/llm-pricing.js +12 -17
- package/src/lib/loop.js +62 -3
- package/src/lib/permission-engine.js +14 -7
- package/src/lib/public-ide-capability-manifest.js +2 -0
- package/src/lib/routine-store.js +546 -86
- package/src/lib/runtime-usage-ledger.js +182 -0
- package/src/lib/scheduler-kernel/agenda-adapter.js +604 -29
- package/src/lib/scheduler-kernel/authority-resolver.js +163 -0
- package/src/lib/scheduler-kernel/automation-adapter.js +994 -0
- package/src/lib/scheduler-kernel/automation-event-adapter.js +757 -0
- package/src/lib/scheduler-kernel/contract.js +11 -3
- package/src/lib/scheduler-kernel/cowork-cron-adapter.js +343 -15
- package/src/lib/scheduler-kernel/loop-adapter.js +913 -0
- package/src/lib/scheduler-kernel/migration-admin.js +346 -0
- package/src/lib/scheduler-kernel/migration-rollback-admin.js +932 -0
- package/src/lib/scheduler-kernel/routine-adapter.js +691 -22
- package/src/lib/scheduler-kernel/runtime.js +63 -1
- package/src/lib/scheduler-kernel/service.js +328 -0
- package/src/lib/scheduler-kernel/source-locator-path.js +142 -0
- package/src/lib/scheduler-kernel/store.js +3439 -206
- package/src/lib/session-host-lease.js +171 -2
- package/src/lib/session-host-snapshot.js +14 -3
- package/src/lib/session-persistence-failure.js +1 -0
- package/src/lib/session-tail.js +179 -34
- package/src/lib/session-transcript-structure.js +96 -0
- package/src/lib/sub-agent-context.js +328 -22
- package/src/lib/ws-agent-handler.js +4 -1
- package/src/repl/agent-repl.js +732 -91
- package/src/repl/chat-repl.js +5 -1
- package/src/runtime/agent-core.js +1274 -208
- package/src/runtime/coding-agent-contract-shared.cjs +5 -0
- package/src/runtime/fallback-model.js +5 -0
- package/src/runtime/headless-runner.js +324 -82
- package/src/runtime/headless-stream.js +232 -26
- package/src/runtime/policies/agent-policy.js +4 -0
- package/src/workers/background-agent-worker.js +468 -98
- package/src/assets/web-panel/assets/devWarning-CdwPwYj8.js +0 -1
- package/src/assets/web-panel/assets/index-BEeOdfEe.js +0 -1
- package/src/assets/web-panel/assets/index-BTe0TOu6.js +0 -1
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { TextDecoder } from "node:util";
|
|
5
|
+
import { numericOption } from "../lib/cli-numeric.js";
|
|
6
|
+
import { loadConfig } from "../lib/config-manager.js";
|
|
7
|
+
import { mergePricing } from "../lib/llm-pricing.js";
|
|
8
|
+
import {
|
|
9
|
+
buildCausalObservabilityReport,
|
|
10
|
+
causalSessionIds,
|
|
11
|
+
createCausalObservabilityLimitTracker,
|
|
12
|
+
createVerifiedSessionObservabilityProjection,
|
|
13
|
+
normalizeCausalRequest,
|
|
14
|
+
projectVerifiedDelivery,
|
|
15
|
+
selectCausalDeliveries,
|
|
16
|
+
} from "../lib/causal-observability.js";
|
|
17
|
+
import { restoreDeliveryFlow } from "../lib/delivery-coordinator.js";
|
|
18
|
+
import { readVerifiedProjection } from "../harness/jsonl-session-store.js";
|
|
19
|
+
import { ensurePrivateFile } from "../lib/secure-fs.js";
|
|
20
|
+
import {
|
|
21
|
+
sameFileStatIdentity,
|
|
22
|
+
samePathHandleFileIdentity,
|
|
23
|
+
withTrustedFileParentSync,
|
|
24
|
+
} from "../lib/secure-file-identity.js";
|
|
25
|
+
|
|
26
|
+
const MAX_INPUT_BYTES = 16 * 1024 * 1024;
|
|
27
|
+
|
|
28
|
+
function readTrustedJson(filePath, deps = {}) {
|
|
29
|
+
const runtimeFs = deps.fs || fs;
|
|
30
|
+
const trustedParent =
|
|
31
|
+
deps.withTrustedFileParentSync || withTrustedFileParentSync;
|
|
32
|
+
return trustedParent(
|
|
33
|
+
runtimeFs,
|
|
34
|
+
filePath,
|
|
35
|
+
({ canonicalPath, parentDevice }) => {
|
|
36
|
+
const before = runtimeFs.lstatSync(canonicalPath, { bigint: true });
|
|
37
|
+
if (
|
|
38
|
+
before.isSymbolicLink() ||
|
|
39
|
+
!before.isFile() ||
|
|
40
|
+
Number(before.nlink) !== 1
|
|
41
|
+
) {
|
|
42
|
+
throw new Error(
|
|
43
|
+
`input must be a regular, single-link file: ${filePath}`,
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
const size = Number(before.size);
|
|
47
|
+
if (size <= 0 || size > MAX_INPUT_BYTES) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
`input exceeds the safe ${MAX_INPUT_BYTES}-byte limit: ${filePath}`,
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
let descriptor = null;
|
|
53
|
+
try {
|
|
54
|
+
descriptor = runtimeFs.openSync(
|
|
55
|
+
canonicalPath,
|
|
56
|
+
runtimeFs.constants.O_RDONLY |
|
|
57
|
+
Number(runtimeFs.constants.O_NOFOLLOW || 0),
|
|
58
|
+
);
|
|
59
|
+
const opened = runtimeFs.fstatSync(descriptor, { bigint: true });
|
|
60
|
+
if (
|
|
61
|
+
!opened.isFile() ||
|
|
62
|
+
Number(opened.nlink) !== 1 ||
|
|
63
|
+
!samePathHandleFileIdentity(before, opened, parentDevice)
|
|
64
|
+
) {
|
|
65
|
+
throw new Error(`input identity changed while opening: ${filePath}`);
|
|
66
|
+
}
|
|
67
|
+
const bounded = Buffer.allocUnsafe(MAX_INPUT_BYTES + 1);
|
|
68
|
+
let bytesRead = 0;
|
|
69
|
+
while (bytesRead < bounded.length) {
|
|
70
|
+
const count = runtimeFs.readSync(
|
|
71
|
+
descriptor,
|
|
72
|
+
bounded,
|
|
73
|
+
bytesRead,
|
|
74
|
+
bounded.length - bytesRead,
|
|
75
|
+
null,
|
|
76
|
+
);
|
|
77
|
+
if (count === 0) break;
|
|
78
|
+
bytesRead += count;
|
|
79
|
+
}
|
|
80
|
+
if (bytesRead > MAX_INPUT_BYTES) {
|
|
81
|
+
throw new Error(
|
|
82
|
+
`input exceeds the safe ${MAX_INPUT_BYTES}-byte limit: ${filePath}`,
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
const body = bounded.subarray(0, bytesRead);
|
|
86
|
+
const after = runtimeFs.fstatSync(descriptor, { bigint: true });
|
|
87
|
+
if (
|
|
88
|
+
Number(after.size) !== body.length ||
|
|
89
|
+
!sameFileStatIdentity(opened, after)
|
|
90
|
+
) {
|
|
91
|
+
throw new Error(`input changed while being read: ${filePath}`);
|
|
92
|
+
}
|
|
93
|
+
return Object.freeze({
|
|
94
|
+
canonicalPath,
|
|
95
|
+
value: JSON.parse(
|
|
96
|
+
new TextDecoder("utf-8", { fatal: true }).decode(body),
|
|
97
|
+
),
|
|
98
|
+
});
|
|
99
|
+
} finally {
|
|
100
|
+
if (descriptor !== null) runtimeFs.closeSync(descriptor);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function atomicWritePrivate(outputPath, contents, deps = {}) {
|
|
107
|
+
const runtimeFs = deps.fs || fs;
|
|
108
|
+
const absolute = path.resolve(outputPath);
|
|
109
|
+
const trustedParent =
|
|
110
|
+
deps.withTrustedFileParentSync || withTrustedFileParentSync;
|
|
111
|
+
return trustedParent(runtimeFs, absolute, ({ canonicalPath, parentPath }) => {
|
|
112
|
+
if (runtimeFs.existsSync(canonicalPath)) {
|
|
113
|
+
throw new Error(
|
|
114
|
+
`output already exists; refusing to overwrite: ${absolute}`,
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
const temporary = path.join(
|
|
118
|
+
parentPath,
|
|
119
|
+
`.${path.basename(canonicalPath)}.${randomUUID()}.tmp`,
|
|
120
|
+
);
|
|
121
|
+
let published = false;
|
|
122
|
+
try {
|
|
123
|
+
runtimeFs.writeFileSync(temporary, contents, {
|
|
124
|
+
encoding: "utf8",
|
|
125
|
+
mode: 0o600,
|
|
126
|
+
flag: "wx",
|
|
127
|
+
});
|
|
128
|
+
(deps.ensurePrivateFile || ensurePrivateFile)(temporary, {
|
|
129
|
+
applyWindowsAcl: true,
|
|
130
|
+
failIfUnavailable: true,
|
|
131
|
+
});
|
|
132
|
+
// Publishing a fully-written hard link is atomic and, unlike rename,
|
|
133
|
+
// fails closed if another writer created the requested output first.
|
|
134
|
+
runtimeFs.linkSync(temporary, canonicalPath);
|
|
135
|
+
published = true;
|
|
136
|
+
runtimeFs.rmSync(temporary);
|
|
137
|
+
(deps.ensurePrivateFile || ensurePrivateFile)(canonicalPath, {
|
|
138
|
+
applyWindowsAcl: true,
|
|
139
|
+
failIfUnavailable: true,
|
|
140
|
+
});
|
|
141
|
+
return canonicalPath;
|
|
142
|
+
} catch (error) {
|
|
143
|
+
try {
|
|
144
|
+
runtimeFs.rmSync(temporary, { force: true });
|
|
145
|
+
if (published) runtimeFs.rmSync(canonicalPath, { force: true });
|
|
146
|
+
} catch {
|
|
147
|
+
// Preserve the authoritative write error.
|
|
148
|
+
}
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function budgetOverrides(options) {
|
|
155
|
+
const parse = (value, name, extra = {}) =>
|
|
156
|
+
value == null
|
|
157
|
+
? undefined
|
|
158
|
+
: numericOption(value, { name, min: 0, ...extra });
|
|
159
|
+
return {
|
|
160
|
+
maxTokens: parse(options.maxTokens, "--max-tokens", { integer: true }),
|
|
161
|
+
maxUsd: parse(options.maxUsd, "--max-usd"),
|
|
162
|
+
maxRetries: parse(options.maxRetries, "--max-retries", { integer: true }),
|
|
163
|
+
maxRetryRatio: parse(options.maxRetryRatio, "--max-retry-ratio", {
|
|
164
|
+
max: 1,
|
|
165
|
+
}),
|
|
166
|
+
maxToolP95Ms: parse(options.maxToolP95Ms, "--max-tool-p95-ms"),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function nonEmptyFilterOption(value, name) {
|
|
171
|
+
if (value == null) return undefined;
|
|
172
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
173
|
+
throw new Error(`${name} must be a non-empty string`);
|
|
174
|
+
}
|
|
175
|
+
return value;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function optionFilter(options) {
|
|
179
|
+
return {
|
|
180
|
+
workspaceId: nonEmptyFilterOption(options.workspace, "--workspace"),
|
|
181
|
+
teamId: nonEmptyFilterOption(options.team, "--team"),
|
|
182
|
+
policyId: nonEmptyFilterOption(options.policy, "--policy"),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function mergeDefined(base, overrides) {
|
|
187
|
+
const definedOverrides = Object.fromEntries(
|
|
188
|
+
Object.entries(overrides).filter(([, value]) => value !== undefined),
|
|
189
|
+
);
|
|
190
|
+
return Object.fromEntries(
|
|
191
|
+
Object.entries({ ...base, ...definedOverrides }).filter(
|
|
192
|
+
([, value]) => value !== undefined,
|
|
193
|
+
),
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export function runSessionObservability(requestPath, options = {}, deps = {}) {
|
|
198
|
+
try {
|
|
199
|
+
const trustedRequest = readTrustedJson(requestPath, deps);
|
|
200
|
+
const request = normalizeCausalRequest(trustedRequest.value);
|
|
201
|
+
const requestDir = path.dirname(trustedRequest.canonicalPath);
|
|
202
|
+
const deliveries = request.deliveryStates.map((statePath) => {
|
|
203
|
+
const resolved = path.resolve(requestDir, statePath);
|
|
204
|
+
const state = (deps.restoreDeliveryFlow || restoreDeliveryFlow)(
|
|
205
|
+
readTrustedJson(resolved, deps).value,
|
|
206
|
+
);
|
|
207
|
+
return projectVerifiedDelivery(state);
|
|
208
|
+
});
|
|
209
|
+
const filter = mergeDefined(request.filter, optionFilter(options));
|
|
210
|
+
const selectedDeliveries = (
|
|
211
|
+
deps.selectCausalDeliveries || selectCausalDeliveries
|
|
212
|
+
)(deliveries, filter);
|
|
213
|
+
const selectedSessionIds = (deps.causalSessionIds || causalSessionIds)(
|
|
214
|
+
selectedDeliveries,
|
|
215
|
+
);
|
|
216
|
+
const limitTracker = (
|
|
217
|
+
deps.createCausalObservabilityLimitTracker ||
|
|
218
|
+
createCausalObservabilityLimitTracker
|
|
219
|
+
)();
|
|
220
|
+
for (const delivery of selectedDeliveries) {
|
|
221
|
+
limitTracker.acceptDelivery(delivery);
|
|
222
|
+
}
|
|
223
|
+
const sessionsById = new Map();
|
|
224
|
+
const pricingTable = (deps.mergePricing || mergePricing)(
|
|
225
|
+
(deps.loadConfig || loadConfig)().llm?.pricing,
|
|
226
|
+
);
|
|
227
|
+
for (const sessionId of selectedSessionIds) {
|
|
228
|
+
const session = (deps.readVerifiedProjection || readVerifiedProjection)(
|
|
229
|
+
sessionId,
|
|
230
|
+
() =>
|
|
231
|
+
(
|
|
232
|
+
deps.createVerifiedSessionObservabilityProjection ||
|
|
233
|
+
createVerifiedSessionObservabilityProjection
|
|
234
|
+
)(sessionId, { pricingTable }),
|
|
235
|
+
);
|
|
236
|
+
limitTracker.acceptSession(session);
|
|
237
|
+
sessionsById.set(sessionId, session);
|
|
238
|
+
}
|
|
239
|
+
const budgets = mergeDefined(request.budgets, budgetOverrides(options));
|
|
240
|
+
const report = (
|
|
241
|
+
deps.buildCausalObservabilityReport || buildCausalObservabilityReport
|
|
242
|
+
)({
|
|
243
|
+
deliveries: selectedDeliveries,
|
|
244
|
+
sessionsById,
|
|
245
|
+
filter,
|
|
246
|
+
budgets,
|
|
247
|
+
pricingTable,
|
|
248
|
+
generatedAt: deps.now ? deps.now() : new Date().toISOString(),
|
|
249
|
+
});
|
|
250
|
+
const output = `${JSON.stringify(report, null, 2)}\n`;
|
|
251
|
+
if (options.output) {
|
|
252
|
+
const written = atomicWritePrivate(options.output, output, deps);
|
|
253
|
+
if (!options.json) process.stdout.write(`${written}\n`);
|
|
254
|
+
} else {
|
|
255
|
+
process.stdout.write(output);
|
|
256
|
+
}
|
|
257
|
+
if (
|
|
258
|
+
options.strictBudget === true &&
|
|
259
|
+
["exceeded", "unknown"].includes(report.budget.status)
|
|
260
|
+
) {
|
|
261
|
+
return 2;
|
|
262
|
+
}
|
|
263
|
+
return 0;
|
|
264
|
+
} catch (error) {
|
|
265
|
+
process.stderr.write(`Causal observability failed: ${error.message}\n`);
|
|
266
|
+
return 1;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export function registerSessionObservabilitySubcommand(session) {
|
|
271
|
+
session
|
|
272
|
+
.command("observability <request>")
|
|
273
|
+
.description(
|
|
274
|
+
"Export verified token/USD, retry, tool latency, diff, gate, artifact and PR causality",
|
|
275
|
+
)
|
|
276
|
+
.option("--workspace <id>", "Only delivery authority for this workspace")
|
|
277
|
+
.option("--team <id>", "Only delivery authority for this team")
|
|
278
|
+
.option("--policy <id>", "Only delivery authority for this policy")
|
|
279
|
+
.option("--max-tokens <n>", "Alert when aggregate tokens exceed n")
|
|
280
|
+
.option(
|
|
281
|
+
"--max-usd <amount>",
|
|
282
|
+
"Alert when estimated priced USD exceeds amount",
|
|
283
|
+
)
|
|
284
|
+
.option("--max-retries <n>", "Alert when automatic LLM retries exceed n")
|
|
285
|
+
.option(
|
|
286
|
+
"--max-retry-ratio <ratio>",
|
|
287
|
+
"Alert when approximate retry/call ratio exceeds 0..1",
|
|
288
|
+
)
|
|
289
|
+
.option(
|
|
290
|
+
"--max-tool-p95-ms <ms>",
|
|
291
|
+
"Alert when fully observed tool P95 exceeds ms",
|
|
292
|
+
)
|
|
293
|
+
.option(
|
|
294
|
+
"--strict-budget",
|
|
295
|
+
"Exit 2 when a budget is exceeded or cannot be evaluated",
|
|
296
|
+
)
|
|
297
|
+
.option(
|
|
298
|
+
"--output <path>",
|
|
299
|
+
"Atomically write owner-only JSON instead of stdout",
|
|
300
|
+
)
|
|
301
|
+
.option("--json", "Machine-readable output (default when stdout is used)")
|
|
302
|
+
.action((requestPath, options) => {
|
|
303
|
+
process.exitCode = runSessionObservability(requestPath, options);
|
|
304
|
+
});
|
|
305
|
+
}
|
package/src/commands/session.js
CHANGED
|
@@ -65,6 +65,7 @@ import {
|
|
|
65
65
|
import { executionBroker } from "../lib/process-execution-broker/index.js";
|
|
66
66
|
import { registerSessionMcpRecoveryCommands } from "./session-mcp-recovery.js";
|
|
67
67
|
import { registerSessionShowSubcommand } from "./session-show.js";
|
|
68
|
+
import { registerSessionObservabilitySubcommand } from "./session-observability.js";
|
|
68
69
|
|
|
69
70
|
export const _deps = {
|
|
70
71
|
execFileSync: (...args) => executionBroker.execFileSync(...args),
|
|
@@ -1839,6 +1840,43 @@ export function registerSessionCommand(program) {
|
|
|
1839
1840
|
}
|
|
1840
1841
|
});
|
|
1841
1842
|
|
|
1843
|
+
registerSessionObservabilitySubcommand(session);
|
|
1844
|
+
|
|
1845
|
+
session
|
|
1846
|
+
.command("observability-authority <id>")
|
|
1847
|
+
.description(
|
|
1848
|
+
"Print the verified headHash/eventCount/scope binding for a delivery flow",
|
|
1849
|
+
)
|
|
1850
|
+
.option("--json", "Machine-readable JSON output")
|
|
1851
|
+
.action(async (id) => {
|
|
1852
|
+
try {
|
|
1853
|
+
const { getVerifiedSessionObservabilityAuthority } =
|
|
1854
|
+
await import("../harness/jsonl-session-store.js");
|
|
1855
|
+
const authority = getVerifiedSessionObservabilityAuthority(id);
|
|
1856
|
+
console.log(
|
|
1857
|
+
JSON.stringify(
|
|
1858
|
+
{
|
|
1859
|
+
causality: {
|
|
1860
|
+
scope: authority.observabilityScope,
|
|
1861
|
+
sessions: [
|
|
1862
|
+
{
|
|
1863
|
+
sessionId: authority.sessionId,
|
|
1864
|
+
headHash: authority.headHash,
|
|
1865
|
+
eventCount: authority.eventCount,
|
|
1866
|
+
},
|
|
1867
|
+
],
|
|
1868
|
+
},
|
|
1869
|
+
},
|
|
1870
|
+
null,
|
|
1871
|
+
2,
|
|
1872
|
+
),
|
|
1873
|
+
);
|
|
1874
|
+
} catch (err) {
|
|
1875
|
+
logger.error(`Failed: ${err.message}`);
|
|
1876
|
+
process.exitCode = 1;
|
|
1877
|
+
}
|
|
1878
|
+
});
|
|
1879
|
+
|
|
1842
1880
|
// session workflow — inspect canonical coding workflow state
|
|
1843
1881
|
// Reads .chainlesschain/sessions/<id>/{intent.md,plan.md,progress.log,mode.json}
|
|
1844
1882
|
// written by the 4 workflow skills ($deep-interview/$ralplan/$ralph/$team).
|
package/src/data/changelog.json
CHANGED
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "CHANGELOG.md",
|
|
3
3
|
"releases": [
|
|
4
|
+
{
|
|
5
|
+
"productVersion": null,
|
|
6
|
+
"cliVersion": "0.163.7",
|
|
7
|
+
"cliVersions": ["0.163.6", "0.163.7"],
|
|
8
|
+
"date": "2026-08-14",
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Added — cc CLI 0.163.7: governed scheduler migration and causal observability",
|
|
13
|
+
"body": "> `chainlesschain` **0.163.6 → 0.163.7** (candidate; not yet published,\n> 2026-08-14).\n> CLI-only candidate; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Five-domain migration journal**: Agenda, Cowork Cron, Routine, Automation,\n and Loop migrations use the scheduler store schema-v5 journal with\n domain-typed source locators, immutable source/target digest bindings,\n idempotent recovery, and fail-closed rejection of conflicting or ambiguous\n legacy entries.\n- **Governed rollback controls**: the new scheduler migration `list`, `show`,\n and `rollback` commands expose redacted migration status and blockers.\n Rollback requires the latest evidence digest, an interactive TTY, and the\n exact typed challenge before reopening any legacy source.\n- **Target-first recovery and CAS fencing**: rollback stops or restores the\n scheduler target before restoring the legacy source, validates target\n revision, definition and execution evidence, and makes terminal source\n restoration retry-safe across process crashes. This is not a claim of one\n atomic transaction across independent stores or filesystems.\n- **Fail-closed source identity**: Windows drive and UNC paths are canonicalized\n while relative, incomplete and device-namespace paths are rejected.\n Automation migration requires an existing native SQLite database and refuses\n the non-durable sql.js fallback; Loop restoration remains bound to its durable\n retirement fence, marker and original source digest.\n- **Windows persistence hardening**: team adjudication atomic replacement\n retries only transient Windows `EACCES`, `EBUSY`, and `EPERM` sharing\n failures with bounded backoff and authority-path revalidation. Exhausted,\n non-transient, and non-Windows replacement failures continue to fail closed.\n- **Cross-platform CI hardening**: migration fixtures verify retirement fences\n and canonical source identities consistently across operating systems, while\n distributed-queue and authority test workers use bounded lifetimes and attach\n result observers before short-lived children can exit. Terminal Skill\n authority fixtures now use an explicit parent acknowledgement before clean\n exit, removing Windows IPC exit-before-message ordering ambiguity without\n weakening concurrent revocation assertions.\n- **Verified causal delivery reports**: scoped sessions can be bound by exact\n transcript head and event count to digest-protected delivery states. The new\n session observability commands export a redacted session-to-delivery graph\n spanning diffs, gates, artifacts, pull requests, and merges, with exact\n workspace, team, and policy filters.\n- **Fail-closed call-ledger budgets**: `call-ledger@1` brackets model, retry,\n compaction, subagent, isolated-skill, and tool calls with known or unknown\n settlements. Strict budget mode rejects exceeded and unevaluable results\n instead of treating missing token, cost, retry, or tool-latency evidence as\n zero.\n- **Background recovery authority hardening**: verified transcript CAS,\n delegated recovery leases, IPC sender/nonce binding, bootstrap guards, exact\n process-group termination checks, and terminal cleanup prevent uncertain or\n still-live descendants from authorizing recovery or worktree deletion.\n- **Causal evidence boundary**: report bindings prove exact verified revisions,\n not that a model call semantically caused a source hunk. Scope labels are not\n identity or membership proofs, digests are not signatures, anti-rollback is\n machine-local, and incomplete or legacy ledgers remain partial or unknown.\n- **Known residuals**: scheduler ENOSPC/partial-write/fsync/rename/SQLite fault\n closure and the Linux, Windows, and macOS long-soak matrix remain open.\n Signed native distribution and representative alias-removal telemetry also\n remain outside this candidate.\n- **Release status**: final tag, source SHA, workflow run IDs, package digest,\n provenance, and registry readback are intentionally omitted until the exact\n `0.163.7` release merge commit passes both required workflow matrices on\n Linux, Windows, and macOS, followed by the dedicated npm release and\n independent public readback workflows."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"productVersion": null,
|
|
19
|
+
"cliVersion": "0.163.6",
|
|
20
|
+
"cliVersions": ["0.163.5", "0.163.6"],
|
|
21
|
+
"date": "2026-08-12",
|
|
22
|
+
"title": "",
|
|
23
|
+
"sections": [
|
|
24
|
+
{
|
|
25
|
+
"heading": "Added — cc CLI 0.163.6: unified scheduler authority and automation control",
|
|
26
|
+
"body": "> `chainlesschain` **0.163.5 → 0.163.6** (published from exact SHA\n> `85c3577c887003fea98d0a159603cd359506f09b`, 2026-08-12).\n> CLI-only release; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Complete scheduler adapter migration**: Agenda monitors, Loop iterations,\n Automation cron flows, Routine GitHub polling, channel automation events,\n and the standalone daemon now execute through the shared scheduler service\n with durable claims, definition snapshots, recovery fences, and bounded\n retry/dead-letter behavior.\n- **Timezone and missed-run consistency**: Agenda and Cowork cron definitions\n persist canonical IANA timezones, handle DST gaps and repeated civil times,\n and collapse downtime to one latest due occurrence without replay storms.\n- **Shared scheduler permission and budget authority**: Agenda, Routine,\n Cowork, Automation, and Loop bind exact capability policies to durable\n revisions and use one transactional reservation/settlement path. Missing,\n stale, disabled, exhausted, or inconsistent policy state fails closed;\n retries reuse the original reservation instead of charging twice.\n- **Layered Automation enforcement**: the shared scheduler authority composes\n with Automation's creator identity, connector permissions, live revocation,\n and per-flow run/action budgets. Domain evidence and the scheduler policy\n revision remain independently validated.\n- **Governed management surfaces**: scheduler policy inspection/update commands\n require exact capabilities and revision CAS, while the Automation Center\n exposes governed flow and Routine controls without bypassing backend\n permission or budget checks.\n- **Known residuals**: durable outcome-unknown adjudication, complete mixed-\n version migration/rollback, scheduler disk-fault closure, and the three-OS\n long-soak matrix remain open. Signed native distribution and representative\n alias-removal telemetry also remain outside this release.\n- **Published release evidence**: immutable tag `v-npm-0-163-6` resolves to\n exact source commit `85c3577c887003fea98d0a159603cd359506f09b`. Its Linux,\n Windows, and macOS `CLI CI` (`31595865423`) and `CLI Strict Sandbox`\n (`31595865206`) matrices passed; the dedicated npm release (`31595865181`)\n completed its exact-SHA gate, immutable package, Trusted Publishing, and\n signed provenance, and the independent public readback (`31597577056`)\n succeeded. npm reports `latest=0.163.6`; the public tarball SHA-1 is\n `18bb9d807a4a35a36cf9049dcc15f67eb47bbfa6`."
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
4
30
|
{
|
|
5
31
|
"productVersion": null,
|
|
6
32
|
"cliVersion": "0.163.5",
|
|
@@ -10,7 +36,7 @@
|
|
|
10
36
|
"sections": [
|
|
11
37
|
{
|
|
12
38
|
"heading": "Added — cc CLI 0.163.5: durable scheduler runtime and recovery",
|
|
13
|
-
"body": "> `chainlesschain` **0.163.4 → 0.163.5** (
|
|
39
|
+
"body": "> `chainlesschain` **0.163.4 → 0.163.5** (published from exact SHA\n> `095087c1e859a8451ce01ed58c59af3fede756fd`, 2026-08-11).\n> CLI-only release; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Unified scheduler runtime**: the versioned scheduler store now has a shared\n runtime with adapter registration, snapshot-bound authorization, durable\n owner/fence claims, lease renewal, bounded retry, dead-letter settlement,\n history, and adapter-kind isolation.\n- **Routine scheduling migration**: manual triggers and `routine run` cron/once\n executions use canonical logical occurrences, revision-CAS job snapshots,\n deterministic run evidence, dual-driver fencing, and crash recovery that\n settles terminal evidence without replaying the agent.\n- **Agenda wakeup/cron migration**: production Agenda wakeup and cron entries\n preserve their full permission/worktree/turn/token/cost/time run policy while\n executing through the shared kernel. New and legacy drivers coordinate with\n durable leases; known failures retry, while start-only outcomes fail closed.\n- **Cowork Cron migration**: production `cowork cron run` uses definition-only\n snapshots, workspace-scoped recovery claims, cross-version JSONL delivery\n fences, terminal-evidence recovery, and automatic one-second polling for\n six-field cron expressions.\n- **Durable compaction recovery**: micro-compaction strips transient runtime\n markers before persistence, records checkpoint state durably, restores it in\n REPL/agent flows, and preserves trace propagation across Process Broker\n execution boundaries.\n- **Honest execution boundary**: durable terminal evidence prevents duplicate\n automatic replay after a scheduler process crash. Start-only evidence or a\n post-side-effect persistence failure remains outcome-unknown and requires\n explicit handling; this release does not claim global exactly-once behavior.\n- **Known residuals**: Agenda monitor, Automation, Loop, Routine GitHub,\n standalone scheduler daemon/liveness, shared permission/budget resolution,\n IANA timezone/DST/missed-run semantics, migration/rollback, disk-fault and\n long-soak closure remain outside this release. Signed native distribution and\n representative alias-removal telemetry also remain open.\n- **Published release evidence**: immutable tag `v-npm-0-163-5` resolves to\n exact source commit `095087c1e859a8451ce01ed58c59af3fede756fd`. Its Linux,\n Windows, and macOS `CLI CI` (`31509337185`) and `CLI Strict Sandbox`\n (`31509336854`) matrices passed; the dedicated npm release (`31509336832`)\n completed its exact-SHA gate, immutable package, Trusted Publishing and\n signed provenance, and the independent public readback (`31514940240`)\n succeeded. npm reports `latest=0.163.5`; the public tarball SHA-1 is\n `5dc6677dee6d1d73b708e6a50e3808007a314894`."
|
|
14
40
|
}
|
|
15
41
|
]
|
|
16
42
|
},
|
|
@@ -23,7 +49,7 @@
|
|
|
23
49
|
"sections": [
|
|
24
50
|
{
|
|
25
51
|
"heading": "Added — cc CLI 0.163.4: immutable MCP capsules and durable scheduler storage",
|
|
26
|
-
"body": "> `chainlesschain` **0.163.3 → 0.163.4** (
|
|
52
|
+
"body": "> `chainlesschain` **0.163.3 → 0.163.4** (published from exact SHA\n> `27ed0ac2005e16ce5ddff53990e85b1d13ea0b1d`, 2026-08-11).\n> CLI-only release; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Immutable MCP capsule build inputs**: the capsule builder now executes in a\n bounded worker against an in-memory WASM virtual filesystem populated from\n verified bytes. Package sources and native builder assets are canonicalized,\n identity-bound, and no longer reopened from mutable host paths during the\n build.\n- **Platform-bound live capsule evidence**: materialized stdio MCP capsules are\n exercised through the production Process Broker and child contract on Linux,\n Windows, and macOS. Framed reports, exact asset identity, deferred host-path\n resolution, and shared CJS/ESM trace context prevent warning or path-alias\n drift from weakening the evidence chain.\n- **Bounded failure behavior**: worker memory, output, timeout, and cleanup are\n bounded; partial or malformed child evidence, post-verification replacement,\n unapproved effects, and unsupported strict boundaries fail closed.\n- **Command lifecycle evidence and alias decision**: report v2 binds exact\n coverage, approval, scope, and repository evidence and summarizes command\n telemetry without silently accepting zero-data input. All 25 deprecated\n aliases remain retained until representative opt-in telemetry exists and the\n documented `0.164.0` removal floor is reached.\n- **Scheduler kernel storage foundation**: a versioned SQLite store adds strict\n schema verification, expected-revision CAS, logical-occurrence deduplication,\n durable claims, and two-handle race coverage. This is the first P2-4 storage\n milestone, not completion of the scheduling kernel or orchestration runtime.\n- **Delivery and recovery hardening**: production delivery adapters, durable\n provider-backed compaction, MCP recovery admission, session ownership fences,\n and exact Windows write checks close additional internal consistency gaps.\n- **Native release readback hardening**: release evidence now verifies public\n bytes, checksums, manifests, signatures, and provenance contracts more\n strictly. Signed native distribution is still blocked until real signed\n artifacts and public package-manager readback are available.\n- **Known residuals**: full P2-4 scheduling orchestration, signed native\n distribution, representative alias telemetry, and the remaining documented\n long-soak/host-boundary follow-ups are not claimed by this release.\n- **Published release evidence**: immutable tag `v-npm-0-163-4` resolves to\n exact source commit `27ed0ac2005e16ce5ddff53990e85b1d13ea0b1d`. `CLI CI`\n (`31421782916`), `CLI Strict Sandbox` (`31421782072`), the npm release\n (`31424056034`), and independent public readback (`31425519966`) succeeded."
|
|
27
53
|
}
|
|
28
54
|
]
|
|
29
55
|
},
|