chainlesschain 0.162.197 → 0.162.200
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 +4 -1
- package/scripts/command-lifecycle-report.mjs +94 -0
- package/src/assets/web-panel/assets/{AIOps-D3Gu1a5d.js → AIOps-DcQ0bWKy.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DrwAoKaz.js → ActionButton-GecwfFPt.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C7Q-gd_3.js → Analytics-CD6iSt9v.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DgBtae-n.js → AppLayout-CDEtuEYf.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-pQ6LcA-W.js → Artifacts-DS3jAjeW.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DK61tocB.js → Audit-CcSJA048.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BOKgDFRh.js → BackgroundAgents-DRo9Morb.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Bo9G4vTP.js → Backup-Vw5MrWft.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Do_dE9_v.js → BaseInput-DNHIu823.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-COVvZzOL.js → Chat-DvAsO8-b.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-9aDuObay.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-Z9MJMolt.js → Checkbox-CKCa7tvn.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BVzWKVbf.js → Codegen-CIFvZdaT.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C8MnYcbT.js → Col-C79yz7bK.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DQxqw15l.js → Community-DVvZskLJ.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BAUmrh3y.js → Compact-oaew61hV.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-jPAkQ3zK.js → Compliance-DqA7wmRx.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BBQyxbh8.js → Cowork-B-qGadxa.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-W5koq8Z5.js → Cron-CUlCl4sS.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BQhnu5hS.js → Crosschain-CNOlr9DU.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DD7PlI18.js → DID-DJqFCT_3.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-w_ILuwKI.js → Dashboard-CznGpphf.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-qiDUAyAo.js → Dropdown-_cJw218E.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-PDeBcI5H.js → EmailListRenderer-Dr-1BZ9C.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-SuArscRM.js → FamilyGuardDashboard-Dxf4xtSk.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BCovZaUn.js → Federation-DOiG3i_1.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DjlFdVFk.js → FormItemContext-BzbMcFB9.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DoEZ7fcS.js → GenericCardRenderer-VbBrYttP.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CV0-6GPI.js → Git-CLG8E6ED.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-B_SFN50w.js → Governance-LGJQfk_q.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-heI0Eo6k.js → Inference-DlQKx9lF.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Cz5INS5p.js → KnowledgeGraph-DU8vEouV.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BSFxiHkg.js → Logs-FZIQOdln.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BJNWIrbw.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-0TWTpE7k.js → Marketplace-C_xd-zZI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CV4-wBLm.js → McpTools-q-YktphS.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-x5bH5rw5.js → Memory-Cq9OhDin.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DaBmUu9G.js → MobileBridge-B03_R98T.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-DZrk-qmF.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-B_zKEBif.js → Mtc-BidCKW28.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BCfKD2yg.js → MtcAudit-r-iaMVM7.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DgYfj6c_.js → Multisig-CgTUFvff.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Dz09lFUm.js → NLProgramming-B7NvzfAV.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cuj6ugBE.js → Notes-80CWNqJI.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DK2WXjhg.js → NotificationSettings-0H6xdiY3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-D1IAOQoo.js → OrderTableRenderer-CKP4AFWy.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-9fqnPvTw.js → Organization-B8sxCV_h.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-n5xHkhow.js → Overflow-CW9JBBhQ.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-B5AUWwH-.js → P2P-bdSQV7oZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CoUDV6dy.js → PdhVaultBrowser-DQad42nW.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-DPRmQf_H.js → Permissions-CueexxTR.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-B37bsbEN.js → PersonalDataHub-fqxflhR8.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-CCAuPqu9.js → Pipeline-KFwwnIMC.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B81msZdv.js → Privacy-ClnD9buY.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B-Py2NbF.js → ProjectInit-CZEz6sm3.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CYsneiRB.js → ProjectSettings-B6NzpmOI.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Y975Mh6R.js → Projects-DYyuwPCs.js} +1 -1
- package/src/assets/web-panel/assets/Providers-C3tz_jdh.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-Bj_6gJ0l.js → QrScannerModal-BzuOBbqB.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BgpBCMPE.js → QuickAsk-CmNO9qSj.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DhUW3YUA.js → Recommend-VJNj3_NF.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DdeyfbkA.js → RemoteSession-CrbdbSBF.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-fxW421xd.js → Reputation-DTyMd45j.js} +1 -1
- package/src/assets/web-panel/assets/{Row-De73w1og.js → Row-DHrQ-Icz.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-3US_Q_lj.js → RssFeed-DqWxY9c5.js} +2 -2
- package/src/assets/web-panel/assets/{Search-DbZ_DU74.js → Search-ctF1Ks3J.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DoIU1vMF.js → Security-BrQz8uo5.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DB_RGqpc.js → Services-D4scVFar.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DnzLaayC.js → Skeleton-oUScaOjv.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-VzVXHENF.js → Skills-CL-y0eLt.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DMfvjCAI.js → Sla-DQExhwXj.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DQQOYWbF.js → SpeechSettings-iNp_I7kN.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Bmx3FG1P.js → SyncSettings-CTDlMo0A.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DOQyfb-2.js → Tasks-4kb8l3sc.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-D6hTRT7c.js → Templates-BXcL9oXW.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CTPQZAzs.js → Tenant-DLE8eS0D.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B7vII3oH.js → Terminal-DGpUZPPK.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BkiFJeXV.js → TimelineRenderer-C1pWXGPC.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BPPdQMNo.js → Tokens-BYfbfqhZ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BxG8JAEI.js → Trigger-K9YfLOCw.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DHD7nMpM.js → Trust-Ctkq77Hy.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B4BJpU47.js → UkeySign-C6_CSe9J.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CRiGpFx2.js → VideoEditing-Be3rpOWs.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BSDSNiem.js → Wallet-D0UIplxk.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DLTUh5Zv.js → WebAuthn-CF9bM9I3.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-tW2MwjhD.js → WorkflowEditor-D0H1XVPY.js} +1 -1
- package/src/assets/web-panel/assets/{chat-SgsLQ3FC.js → chat-Cgzzbe0o.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BHjjLIKO.js → colors-BwNxEVS0.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-VceErdKq.js → compact-item-D60Z4Hhs.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BZ332MYl.js → createContext-MFk58XB0.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BJiw369i.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CBTjJOjn.js → hasIn-CRj2SvGO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaCCy6lq.js → index--s45_1cb.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMVvxIS8.js → index--tquQ2ZG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhXZEUAc.js → index-1T1rhokn.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQSmZGgs.js → index-B-M82_rx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BeiqkxJG.js → index-BE_el1Zs.js} +1 -1
- package/src/assets/web-panel/assets/{index-29wVzi-k.js → index-BhRkR7IO.js} +1 -1
- package/src/assets/web-panel/assets/{index-iYQNU9za.js → index-Bo0y96-K.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRWhLbWF.js → index-CJgu5JUK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPXFLYdW.js → index-CLWwdebO.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cr4rjlW5.js → index-CNAK5QG_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaIS_TNX.js → index-CQjJjPRD.js} +1 -1
- package/src/assets/web-panel/assets/{index-1n7xjKDU.js → index-CTDbAfae.js} +1 -1
- package/src/assets/web-panel/assets/{index-BETEjuNr.js → index-CVI_9sRK.js} +1 -1
- package/src/assets/web-panel/assets/{index-By5jBtkV.js → index-CY14oMQK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgPvuIn2.js → index-CbiTJkZf.js} +1 -1
- package/src/assets/web-panel/assets/index-CiMouosn.js +1 -0
- package/src/assets/web-panel/assets/{index-CawpdGTW.js → index-CqWpxMqx.js} +1 -1
- package/src/assets/web-panel/assets/{index-_PHrIO4O.js → index-CvB8lYUR.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOtvPdHt.js → index-D51XwtCY.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrUgDQkf.js → index-D6HvK_1O.js} +1 -1
- package/src/assets/web-panel/assets/{index-BY1wexYG.js → index-D9jVIwLJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_B9rFQE.js → index-DA4tE98u.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5KAGxNo.js → index-DBwOtXw0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BC1xuQgX.js → index-DKdNzTIb.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2u26AS3.js → index-DRySdmvN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DePOeMDM.js → index-DWzyTev7.js} +1 -1
- package/src/assets/web-panel/assets/index-DXcKlwy7.js +1 -0
- package/src/assets/web-panel/assets/{index-BTlc-Bve.js → index-DYjs7jAP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLc19alH.js → index-DbROzMBp.js} +1 -1
- package/src/assets/web-panel/assets/{index-fU7wNHDB.js → index-DhFtk5PR.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_SePDWj.js → index-Di2AbMLg.js} +1 -1
- package/src/assets/web-panel/assets/{index-vIXOpcjD.js → index-DvmocQsM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcUenmCX.js → index-Dw-o0zEF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUkVN794.js → index-DysPoP38.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtjLcCNU.js → index-LX9pJxm_.js} +1 -1
- package/src/assets/web-panel/assets/{index-B40dQn0G.js → index-OI_fXWx0.js} +3 -3
- package/src/assets/web-panel/assets/{index-FJ3zC9LK.js → index-eDTOX8Xj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdefYBSw.js → index-gWKDsTzF.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpumS98o.js → index-q_GDUVAA.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D1oZNz0D.js → initDefaultProps-C61kZqEd.js} +1 -1
- package/src/assets/web-panel/assets/{motion-C8k6doMO.js → motion-DZnT5U1L.js} +1 -1
- package/src/assets/web-panel/assets/{move-DJ4qSbYt.js → move-L8wzwbel.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CdpJD85j.js → mtc-parser-DLdYSejc.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B0V4slKA.js → omit-D53cbS59.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Di5NiW1F.js → pickAttrs-Bbc5HPtu.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B5OMHgEM.js → placementArrow-BkvmO860.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C6U9IWql.js → responsiveObserve-u2y1ryS1.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BMyTH3rN.js → slide-BBqj7svU.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C7d6BG7Z.js → statusUtils-GN0mqu2d.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CR50QnQy.js → styleChecker-BvwPKoBT.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DBEeoMb8.js → useFlexGapSupport-CCt8tnfY.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-3r099cjv.js → useFs-DXAxl2SV.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-C5IYNdTK.js → usePersonalDataHub-DihlR2dj.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DmEOLRHf.js → vnode-D7BOX2gi.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DnpUiVCB.js → zoom-CVbO-nL7.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +4 -4
- package/src/commands/agent.js +3 -3
- package/src/commands/background-session.js +145 -0
- package/src/commands/mcp.js +244 -7
- package/src/commands/serve.js +1 -1
- package/src/commands/session-show.js +129 -0
- package/src/commands/session.js +97 -145
- package/src/commands/skill.js +87 -50
- package/src/data/changelog.json +40 -1
- package/src/gateways/ws/session-protocol.js +14 -4
- package/src/gateways/ws/ws-agent-handler.js +39 -1
- package/src/harness/jsonl-session-store.js +1547 -127
- package/src/harness/mcp-client.js +2690 -409
- package/src/harness/session-index.js +80 -80
- package/src/harness/session-list-index.js +210 -7
- package/src/lazy-dispatch.js +76 -8
- package/src/lib/abort-utils.js +68 -0
- package/src/lib/agent-core.js +1 -59
- package/src/lib/background-interaction-journal.js +2 -2
- package/src/lib/chat-core.js +24 -6
- package/src/lib/command-lifecycle-report.js +516 -0
- package/src/lib/cowork-mcp-tools.js +47 -2
- package/src/lib/cowork-task-runner.js +11 -3
- package/src/lib/doctor-checkup.js +9 -7
- package/src/lib/learning/skill-improver.js +21 -2
- package/src/lib/mcp-call-ledger-store.js +116 -3
- package/src/lib/mcp-call-ledger.js +59 -14
- package/src/lib/mcp-client.js +1 -0
- package/src/lib/mcp-stdio-environment.js +48 -0
- package/src/lib/mcp-stdio-executable-identity.js +1133 -0
- package/src/lib/mcp-stdio-execution-authority.js +363 -0
- package/src/lib/mcp-stdio-package-materialization.js +1424 -0
- package/src/lib/mcp-tool-metadata.js +436 -0
- package/src/lib/mcp-tool-result.js +367 -0
- package/src/lib/observability/index.js +71 -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/pr-link-ledger.js +8 -27
- package/src/lib/pr-link-store.js +26 -0
- package/src/lib/process-execution-broker/index.js +192 -35
- package/src/lib/process-execution-broker/platform-sandbox.js +291 -24
- package/src/lib/process-tree-termination.js +253 -0
- 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-host-snapshot.js +9 -5
- package/src/lib/session-persistence-failure.js +109 -0
- package/src/lib/session-picker.js +26 -3
- package/src/lib/session-projection.js +5 -1
- package/src/lib/session-search.js +25 -11
- package/src/lib/session-tail.js +31 -1
- package/src/lib/side-effect-ledger-store.js +2 -2
- package/src/lib/skill-budget.js +222 -0
- package/src/lib/skill-execution-authority.js +385 -0
- package/src/lib/skill-execution-identity.js +39 -2
- package/src/lib/skill-loader.js +322 -86
- package/src/lib/skill-mcp.js +43 -1
- package/src/lib/turn-binding-store.js +2 -2
- package/src/repl/agent-repl.js +483 -77
- package/src/repl/bg-dashboard.js +81 -28
- package/src/repl/chat-repl.js +77 -12
- package/src/runtime/agent-core.js +428 -113
- package/src/runtime/agent-runtime.js +26 -3
- package/src/runtime/cleanup-deadline.js +143 -0
- package/src/runtime/headless-runner.js +494 -149
- package/src/runtime/headless-stream.js +504 -75
- package/src/runtime/mcp-config.js +157 -10
- package/src/runtime/mcp-tool-search.js +0 -0
- package/src/runtime/output-backpressure.js +419 -0
- package/src/runtime/pipe-safety.js +56 -21
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BUUyJ5QO.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-1mNozZ8v.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-DqnoFPgR.js +0 -1
- package/src/assets/web-panel/assets/Providers-uO-10aP1.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DosMaL-k.js +0 -1
- package/src/assets/web-panel/assets/index-0O5ePnUq.js +0 -1
- package/src/assets/web-panel/assets/index-ChAzPigF.js +0 -1
- package/src/lib/skill-process-broker.js +0 -85
package/src/commands/session.js
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import fs from "fs";
|
|
7
|
-
import { numericOption } from "../lib/cli-numeric.js";
|
|
8
7
|
import path from "path";
|
|
9
8
|
import chalk from "chalk";
|
|
10
9
|
import { logger } from "../lib/logger.js";
|
|
@@ -48,24 +47,24 @@ import {
|
|
|
48
47
|
getSessionManagerStatsV2,
|
|
49
48
|
} from "../lib/session-manager.js";
|
|
50
49
|
import {
|
|
51
|
-
|
|
50
|
+
listSessionAuthoritySummaries,
|
|
51
|
+
listSessionEvidenceIds,
|
|
52
52
|
rebuildMessages,
|
|
53
53
|
getJsonlSessionMetadata,
|
|
54
|
-
|
|
54
|
+
resolveSessionAuthority,
|
|
55
55
|
deleteJsonlSession,
|
|
56
|
-
readEvents,
|
|
57
56
|
migrateLegacySessions,
|
|
58
57
|
migrateLegacySessionsBatch,
|
|
59
58
|
validateJsonlSession,
|
|
60
59
|
validateAllJsonlSessions,
|
|
61
60
|
} from "../harness/jsonl-session-store.js";
|
|
62
|
-
import { feature } from "../lib/feature-flags.js";
|
|
63
61
|
import {
|
|
64
62
|
listWorkflowSessions,
|
|
65
63
|
readWorkflowSession,
|
|
66
64
|
} from "../lib/workflow-state-reader.js";
|
|
67
65
|
import { executionBroker } from "../lib/process-execution-broker/index.js";
|
|
68
66
|
import { registerSessionMcpRecoveryCommands } from "./session-mcp-recovery.js";
|
|
67
|
+
import { registerSessionShowSubcommand } from "./session-show.js";
|
|
69
68
|
|
|
70
69
|
export const _deps = {
|
|
71
70
|
execFileSync: (...args) => executionBroker.execFileSync(...args),
|
|
@@ -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);
|
|
@@ -492,106 +487,7 @@ export function registerSessionCommand(program) {
|
|
|
492
487
|
}
|
|
493
488
|
});
|
|
494
489
|
|
|
495
|
-
|
|
496
|
-
session
|
|
497
|
-
.command("show")
|
|
498
|
-
.description("Show a session's messages")
|
|
499
|
-
.argument("<id>", "Session ID (or prefix)")
|
|
500
|
-
.option("-n, --limit <n>", "Max messages to show")
|
|
501
|
-
.option("--json", "Output as JSON")
|
|
502
|
-
.action(async (id, options) => {
|
|
503
|
-
let ctx = null;
|
|
504
|
-
try {
|
|
505
|
-
let sess = null;
|
|
506
|
-
|
|
507
|
-
// Try JSONL first if enabled
|
|
508
|
-
const jsonlId = feature("JSONL_SESSION") ? resolveSessionId(id) : null;
|
|
509
|
-
if (jsonlId) {
|
|
510
|
-
const metadata = getJsonlSessionMetadata(jsonlId);
|
|
511
|
-
const msgs = rebuildMessages(jsonlId);
|
|
512
|
-
sess = {
|
|
513
|
-
id: jsonlId,
|
|
514
|
-
title: metadata?.title || "Untitled",
|
|
515
|
-
provider: metadata?.provider || "",
|
|
516
|
-
model: metadata?.model || "",
|
|
517
|
-
message_count: msgs.length,
|
|
518
|
-
messages: msgs,
|
|
519
|
-
_store: "jsonl",
|
|
520
|
-
};
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
// Version-0 DB adapter is loaded only when the canonical transcript is
|
|
524
|
-
// absent, keeping the JSONL hot path independent from native SQLite.
|
|
525
|
-
if (!sess) {
|
|
526
|
-
ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
527
|
-
}
|
|
528
|
-
if (!sess && ctx?.db) {
|
|
529
|
-
const db = ctx.db.getDatabase();
|
|
530
|
-
sess = getSession(db, id);
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
if (!sess) {
|
|
534
|
-
logger.error(`Session not found: ${id}`);
|
|
535
|
-
process.exitCode = 1;
|
|
536
|
-
return;
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
// PR/session linking: surface PRs this session created/touched.
|
|
540
|
-
try {
|
|
541
|
-
const { getPrLinks } = await import("../lib/pr-link-ledger.js");
|
|
542
|
-
const prLinks = getPrLinks(sess.id);
|
|
543
|
-
if (prLinks.length > 0) sess.prLinks = prLinks;
|
|
544
|
-
} catch {
|
|
545
|
-
// PR decoration is cosmetic
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
if (options.json) {
|
|
549
|
-
console.log(JSON.stringify(sess, null, 2));
|
|
550
|
-
} else {
|
|
551
|
-
logger.log(chalk.bold(sess.title));
|
|
552
|
-
logger.log(
|
|
553
|
-
chalk.gray(
|
|
554
|
-
`ID: ${sess.id} Provider: ${sess.provider} Model: ${sess.model} Messages: ${sess.message_count}`,
|
|
555
|
-
),
|
|
556
|
-
);
|
|
557
|
-
if (sess.prLinks) {
|
|
558
|
-
for (const pr of sess.prLinks) {
|
|
559
|
-
logger.log(
|
|
560
|
-
chalk.magenta(
|
|
561
|
-
`PR: #${pr.number}${pr.state ? ` ${pr.state}` : ""}${pr.url ? ` ${pr.url}` : ""}`,
|
|
562
|
-
),
|
|
563
|
-
);
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
logger.log("");
|
|
567
|
-
|
|
568
|
-
let messages = sess.messages;
|
|
569
|
-
if (options.limit) {
|
|
570
|
-
messages = messages.slice(
|
|
571
|
-
-numericOption(options.limit, {
|
|
572
|
-
name: "--limit",
|
|
573
|
-
integer: true,
|
|
574
|
-
min: 1,
|
|
575
|
-
}),
|
|
576
|
-
);
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
for (const msg of messages) {
|
|
580
|
-
if (msg.role === "system") continue;
|
|
581
|
-
const label =
|
|
582
|
-
msg.role === "user" ? chalk.green("you> ") : chalk.blue("ai> ");
|
|
583
|
-
const content = (msg.content || "").substring(0, 500);
|
|
584
|
-
logger.log(`${label}${content}`);
|
|
585
|
-
logger.log("");
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
} catch (err) {
|
|
589
|
-
logger.error(`Failed: ${err.message}`);
|
|
590
|
-
process.exitCode = 1;
|
|
591
|
-
} finally {
|
|
592
|
-
if (ctx) await shutdown();
|
|
593
|
-
}
|
|
594
|
-
});
|
|
490
|
+
registerSessionShowSubcommand(session, program);
|
|
595
491
|
|
|
596
492
|
// session pr-status — PR/CI monitor + controlled auto-merge decision (P1-4)
|
|
597
493
|
// for a session's linked PR. Offline-testable via --checks-file; otherwise a
|
|
@@ -712,14 +608,37 @@ export function registerSessionCommand(program) {
|
|
|
712
608
|
id = picked.id;
|
|
713
609
|
}
|
|
714
610
|
|
|
715
|
-
// Try
|
|
716
|
-
|
|
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) {
|
|
617
|
+
logger.error(
|
|
618
|
+
`Session ${authority.id} has canonical persistence evidence but no readable transcript (${authority.presence}).`,
|
|
619
|
+
);
|
|
620
|
+
logger.error(
|
|
621
|
+
"Refusing legacy fallback. Inspect or explicitly delete the damaged JSONL session before reusing its id.",
|
|
622
|
+
);
|
|
623
|
+
process.exitCode = 1;
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
717
626
|
if (jsonlId) {
|
|
718
627
|
// Tamper gate: a broken hash chain means the transcript was edited
|
|
719
628
|
// outside the store — never silently rebuild it as trusted context.
|
|
720
629
|
const { verifySession } =
|
|
721
630
|
await import("../harness/jsonl-session-store.js");
|
|
722
631
|
const trust = verifySession(jsonlId);
|
|
632
|
+
if (["missing", "conflict"].includes(trust.status)) {
|
|
633
|
+
logger.error(
|
|
634
|
+
`Session ${jsonlId} transcript is unavailable: ${trust.reason}`,
|
|
635
|
+
);
|
|
636
|
+
logger.error(
|
|
637
|
+
"Refusing to resume without canonical history. Inspect or explicitly delete the damaged session before reusing its id.",
|
|
638
|
+
);
|
|
639
|
+
process.exitCode = 1;
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
723
642
|
if (trust.status === "tampered") {
|
|
724
643
|
if (!options.allowTampered) {
|
|
725
644
|
logger.error(
|
|
@@ -810,8 +729,16 @@ export function registerSessionCommand(program) {
|
|
|
810
729
|
// Canonical content source: append-only JSONL event log. The legacy DB
|
|
811
730
|
// is consulted only when no matching transcript exists.
|
|
812
731
|
const store = await import("../harness/jsonl-session-store.js");
|
|
813
|
-
const
|
|
814
|
-
|
|
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) {
|
|
738
|
+
throw new Error(
|
|
739
|
+
`Session ${authority.id} has canonical persistence evidence but no readable transcript (${authority.presence})`,
|
|
740
|
+
);
|
|
741
|
+
}
|
|
815
742
|
if (sid) {
|
|
816
743
|
const { renderAgentSessionMarkdown } =
|
|
817
744
|
await import("../lib/agent-session-export.js");
|
|
@@ -890,7 +817,10 @@ export function registerSessionCommand(program) {
|
|
|
890
817
|
try {
|
|
891
818
|
const sessionIndex = await import("../harness/session-index.js");
|
|
892
819
|
indexDb = sessionIndex.openIndex();
|
|
893
|
-
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
|
+
}
|
|
894
824
|
matches = sessionIndex
|
|
895
825
|
.searchSessions(indexDb, query, { limit })
|
|
896
826
|
.map((hit) => ({
|
|
@@ -911,7 +841,7 @@ export function registerSessionCommand(program) {
|
|
|
911
841
|
});
|
|
912
842
|
for (const s of sessions) {
|
|
913
843
|
if (matches.length >= limit) break;
|
|
914
|
-
for (const ev of store.
|
|
844
|
+
for (const ev of store.readVerifiedEvents(s.id)) {
|
|
915
845
|
if (matches.length >= limit) break;
|
|
916
846
|
if (
|
|
917
847
|
ev.type !== "user_message" &&
|
|
@@ -991,7 +921,8 @@ export function registerSessionCommand(program) {
|
|
|
991
921
|
.action(async (id, options) => {
|
|
992
922
|
let ctx = null;
|
|
993
923
|
try {
|
|
994
|
-
const
|
|
924
|
+
const authority = resolveSessionAuthority(id);
|
|
925
|
+
const jsonlId = authority?.id || null;
|
|
995
926
|
let db = null;
|
|
996
927
|
try {
|
|
997
928
|
ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
@@ -1054,7 +985,13 @@ export function registerSessionCommand(program) {
|
|
|
1054
985
|
Array.isArray(title) ? title.join(" ") : title,
|
|
1055
986
|
).trim();
|
|
1056
987
|
if (!normalized) throw new Error("A non-empty title is required");
|
|
1057
|
-
const
|
|
988
|
+
const authority = resolveSessionAuthority(id);
|
|
989
|
+
const jsonlId = authority?.readable ? authority.id : null;
|
|
990
|
+
if (authority && !authority.readable) {
|
|
991
|
+
throw new Error(
|
|
992
|
+
`Session ${authority.id} has canonical persistence evidence but no readable transcript (${authority.presence})`,
|
|
993
|
+
);
|
|
994
|
+
}
|
|
1058
995
|
let result;
|
|
1059
996
|
if (jsonlId) {
|
|
1060
997
|
const { renameSession } =
|
|
@@ -1273,10 +1210,18 @@ export function registerSessionCommand(program) {
|
|
|
1273
1210
|
}
|
|
1274
1211
|
}
|
|
1275
1212
|
|
|
1276
|
-
const
|
|
1277
|
-
(
|
|
1213
|
+
const hasVerificationFailure = (
|
|
1214
|
+
Array.isArray(result) ? result : [result]
|
|
1215
|
+
).some((item) =>
|
|
1216
|
+
[
|
|
1217
|
+
"tampered",
|
|
1218
|
+
"missing",
|
|
1219
|
+
"conflict",
|
|
1220
|
+
"not-found",
|
|
1221
|
+
"invalid-id",
|
|
1222
|
+
].includes(item.status),
|
|
1278
1223
|
);
|
|
1279
|
-
if (
|
|
1224
|
+
if (hasVerificationFailure) process.exit(1);
|
|
1280
1225
|
} catch (err) {
|
|
1281
1226
|
logger.error(`Failed: ${err.message}`);
|
|
1282
1227
|
process.exit(1);
|
|
@@ -2231,14 +2176,17 @@ async function mirrorSessions(ids) {
|
|
|
2231
2176
|
|
|
2232
2177
|
const pushed = [];
|
|
2233
2178
|
const errors = [];
|
|
2234
|
-
const { readFileSync, existsSync } = await import("node:fs");
|
|
2235
2179
|
for (const id of ids) {
|
|
2236
2180
|
try {
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
if (!
|
|
2240
|
-
|
|
2241
|
-
|
|
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));
|
|
2242
2190
|
} catch (err) {
|
|
2243
2191
|
errors.push({ id, error: err.message });
|
|
2244
2192
|
}
|
|
@@ -2288,7 +2236,11 @@ async function mirrorPruneSessions() {
|
|
|
2288
2236
|
const { pruneMirror } = await import("../harness/session-mirror.js");
|
|
2289
2237
|
const { mirror } = await loadConfiguredMirror();
|
|
2290
2238
|
if (!mirror) return { target: null, deleted: [], kept: [] };
|
|
2291
|
-
|
|
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");
|
|
2292
2244
|
const res = await pruneMirror(mirror, { keep });
|
|
2293
2245
|
return { target: mirror.target, ...res };
|
|
2294
2246
|
}
|
package/src/commands/skill.js
CHANGED
|
@@ -46,6 +46,7 @@ import {
|
|
|
46
46
|
autoFailStuckExecutionsV2,
|
|
47
47
|
getSkillLoaderStatsV2,
|
|
48
48
|
} from "../lib/skill-loader.js";
|
|
49
|
+
import { raceWithAbort, throwIfAborted } from "../lib/abort-utils.js";
|
|
49
50
|
import { getElectronUserDataDir } from "../lib/paths.js";
|
|
50
51
|
import { findProjectRoot } from "../lib/project-detector.js";
|
|
51
52
|
import { loadConfig } from "../lib/config-manager.js";
|
|
@@ -130,6 +131,10 @@ export function createControlledSkillScaffold(name, targetDir, io = fs) {
|
|
|
130
131
|
|
|
131
132
|
export function createCliSkillReauthorizer(options = {}) {
|
|
132
133
|
return async (request) => {
|
|
134
|
+
throwIfAborted(
|
|
135
|
+
request?.signal,
|
|
136
|
+
"Skill authorization prompt was interrupted",
|
|
137
|
+
);
|
|
133
138
|
if (options.assumeYes === true) return { authorized: true };
|
|
134
139
|
const stdin = options.stdin || process.stdin;
|
|
135
140
|
const stdout = options.stdout || process.stdout;
|
|
@@ -140,12 +145,19 @@ export function createCliSkillReauthorizer(options = {}) {
|
|
|
140
145
|
const skillId = request?.skill?.id || "unknown";
|
|
141
146
|
const source = request?.skill?.source || "unknown";
|
|
142
147
|
const digest = String(request?.currentDigest || "").slice(0, 24);
|
|
143
|
-
const authorized = await
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
148
|
+
const authorized = await raceWithAbort(
|
|
149
|
+
confirm(
|
|
150
|
+
{
|
|
151
|
+
message:
|
|
152
|
+
`Authorize isolated skill "${skillId}" from ${source} ` +
|
|
153
|
+
`for this process (${digest || "digest unavailable"})?`,
|
|
154
|
+
default: false,
|
|
155
|
+
},
|
|
156
|
+
request?.signal ? { signal: request.signal } : undefined,
|
|
157
|
+
),
|
|
158
|
+
request?.signal,
|
|
159
|
+
"Skill authorization prompt was interrupted",
|
|
160
|
+
);
|
|
149
161
|
return { authorized: authorized === true };
|
|
150
162
|
};
|
|
151
163
|
}
|
|
@@ -179,7 +191,9 @@ export async function runControlledSkill(options = {}) {
|
|
|
179
191
|
loader,
|
|
180
192
|
executeTool = null,
|
|
181
193
|
llmOptions = null,
|
|
194
|
+
signal = null,
|
|
182
195
|
} = options;
|
|
196
|
+
throwIfAborted(signal, "Skill command interrupted before discovery");
|
|
183
197
|
if (
|
|
184
198
|
!loader ||
|
|
185
199
|
(typeof loader.getResolvedSkills !== "function" &&
|
|
@@ -197,52 +211,75 @@ export async function runControlledSkill(options = {}) {
|
|
|
197
211
|
if (!skill) {
|
|
198
212
|
return { error: `Skill not found: ${name}`, code: "CC_SKILL_NOT_FOUND" };
|
|
199
213
|
}
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
skill = loader.materializeSkill(skill, executionContext);
|
|
208
|
-
}
|
|
209
|
-
if (skill.isolation !== true) {
|
|
210
|
-
return {
|
|
211
|
-
error:
|
|
212
|
-
`Skill "${skill.id}" is not configured for controlled execution. ` +
|
|
213
|
-
"Add isolation: true before running it.",
|
|
214
|
-
code: "CC_SKILL_DIRECT_HANDLER_BLOCKED",
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
if (!canRunOnPlatform(skill)) {
|
|
218
|
-
return {
|
|
219
|
-
error: `Skill "${skill.id}" is not supported on ${process.platform}`,
|
|
220
|
-
code: "CC_SKILL_PLATFORM_UNSUPPORTED",
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
const dispatch =
|
|
224
|
-
executeTool || (await import("../runtime/agent-core.js")).executeTool;
|
|
225
|
-
const result = await dispatch(
|
|
226
|
-
"run_skill",
|
|
227
|
-
{ skill_name: skill.id, input: String(input) },
|
|
228
|
-
{
|
|
229
|
-
cwd,
|
|
230
|
-
skillLoader: loader,
|
|
231
|
-
...(llmOptions ? { llmOptions: { ...llmOptions } } : {}),
|
|
232
|
-
},
|
|
233
|
-
);
|
|
234
|
-
const nestedFailure = /^\s*Sub-agent failed:/i.test(
|
|
235
|
-
String(result?.summary || ""),
|
|
236
|
-
);
|
|
237
|
-
if (result?.error || nestedFailure) {
|
|
238
|
-
return {
|
|
239
|
-
...result,
|
|
240
|
-
success: false,
|
|
241
|
-
code: result?.code || "CC_SKILL_CONTROLLED_RUN_FAILED",
|
|
242
|
-
error: result?.error || result.summary,
|
|
214
|
+
const executionLease = loader.acquireSkillExecution?.(skill, { signal });
|
|
215
|
+
const executionSignal = executionLease?.signal || signal;
|
|
216
|
+
try {
|
|
217
|
+
const executionContext = {
|
|
218
|
+
loadedBecause: "run_skill",
|
|
219
|
+
bodyIncluded: false,
|
|
220
|
+
signal: executionSignal,
|
|
243
221
|
};
|
|
222
|
+
if (typeof loader.materializeSkillForExecution === "function") {
|
|
223
|
+
skill = await raceWithAbort(
|
|
224
|
+
loader.materializeSkillForExecution(skill, executionContext),
|
|
225
|
+
executionSignal,
|
|
226
|
+
"Skill command interrupted during authorization",
|
|
227
|
+
);
|
|
228
|
+
} else if (typeof loader.materializeSkill === "function") {
|
|
229
|
+
skill = loader.materializeSkill(skill, executionContext);
|
|
230
|
+
}
|
|
231
|
+
executionLease?.assertActive?.();
|
|
232
|
+
if (skill.isolation !== true) {
|
|
233
|
+
return {
|
|
234
|
+
error:
|
|
235
|
+
`Skill "${skill.id}" is not configured for controlled execution. ` +
|
|
236
|
+
"Add isolation: true before running it.",
|
|
237
|
+
code: "CC_SKILL_DIRECT_HANDLER_BLOCKED",
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
if (!canRunOnPlatform(skill)) {
|
|
241
|
+
return {
|
|
242
|
+
error: `Skill "${skill.id}" is not supported on ${process.platform}`,
|
|
243
|
+
code: "CC_SKILL_PLATFORM_UNSUPPORTED",
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
const dispatch =
|
|
247
|
+
executeTool || (await import("../runtime/agent-core.js")).executeTool;
|
|
248
|
+
executionLease?.assertActive?.();
|
|
249
|
+
throwIfAborted(
|
|
250
|
+
executionSignal,
|
|
251
|
+
"Skill command interrupted before execution",
|
|
252
|
+
);
|
|
253
|
+
const result = await raceWithAbort(
|
|
254
|
+
dispatch(
|
|
255
|
+
"run_skill",
|
|
256
|
+
{ skill_name: skill.id, input: String(input) },
|
|
257
|
+
{
|
|
258
|
+
cwd,
|
|
259
|
+
skillLoader: loader,
|
|
260
|
+
...(executionSignal ? { signal: executionSignal } : {}),
|
|
261
|
+
...(llmOptions ? { llmOptions: { ...llmOptions } } : {}),
|
|
262
|
+
},
|
|
263
|
+
),
|
|
264
|
+
executionSignal,
|
|
265
|
+
"Skill command interrupted during execution",
|
|
266
|
+
);
|
|
267
|
+
executionLease?.assertActive?.();
|
|
268
|
+
const nestedFailure = /^\s*Sub-agent failed:/i.test(
|
|
269
|
+
String(result?.summary || ""),
|
|
270
|
+
);
|
|
271
|
+
if (result?.error || nestedFailure) {
|
|
272
|
+
return {
|
|
273
|
+
...result,
|
|
274
|
+
success: false,
|
|
275
|
+
code: result?.code || "CC_SKILL_CONTROLLED_RUN_FAILED",
|
|
276
|
+
error: result?.error || result.summary,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
return result;
|
|
280
|
+
} finally {
|
|
281
|
+
executionLease?.release?.();
|
|
244
282
|
}
|
|
245
|
-
return result;
|
|
246
283
|
}
|
|
247
284
|
|
|
248
285
|
export function registerSkillCommand(program) {
|
package/src/data/changelog.json
CHANGED
|
@@ -1,6 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "CHANGELOG.md",
|
|
3
3
|
"releases": [
|
|
4
|
+
{
|
|
5
|
+
"productVersion": null,
|
|
6
|
+
"cliVersion": "0.162.200",
|
|
7
|
+
"cliVersions": ["0.162.198", "0.162.200"],
|
|
8
|
+
"date": "2026-08-07",
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Fixed — cc CLI 0.162.200: release-gate isolation and carried reliability fixes",
|
|
13
|
+
"body": "> `chainlesschain` **0.162.198 → 0.162.200** (release candidate,\n> 2026-08-07; `0.162.199` failed before npm upload and its tag remains\n> immutable). CLI-only release metadata; `@chainlesschain/personal-data-hub`\n> remains **0.4.57** and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Carries the complete 0.162.199 candidate**: command lifecycle telemetry and\n alias observation policy, canonical session authority, fixed MCP package\n capsules, native update recovery, and portable reliability gates are all\n included because `0.162.199` never reached npm.\n- **Release-gate isolation**: the Agent SDK real-CLI E2E now places its\n rollback-resistant security anchor beside, rather than inside,\n `CHAINLESSCHAIN_HOME`. The fixture therefore matches the production\n fail-closed layout after redirecting `HOME` and no longer hides the `agent`\n command behind compatibility registration.\n- **Pre-release evidence**: implementation SHA `bf6924013d1c` passed the full\n [npm release dry-run](https://github.com/chainlesschain/chainlesschain/actions/runs/31189959290),\n including core packages, Agent SDK real-CLI E2E, Personal Data Hub, Web Panel,\n the complete CLI suite, and credential-free npm package validation. The final\n `0.162.200` version commit must pass the exact-SHA CLI CI and CLI Strict\n Sandbox matrices before tag `v-npm-0-162-200` is created."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"productVersion": null,
|
|
19
|
+
"cliVersion": "0.162.199",
|
|
20
|
+
"cliVersions": ["0.162.198", "0.162.199"],
|
|
21
|
+
"date": "2026-08-07",
|
|
22
|
+
"title": "",
|
|
23
|
+
"sections": [
|
|
24
|
+
{
|
|
25
|
+
"heading": "Fixed — cc CLI 0.162.199: session authority, MCP capsules, and recovery reliability",
|
|
26
|
+
"body": "> `chainlesschain` **0.162.198 → 0.162.199** (not published, 2026-08-07;\n> the release workflow failed before package creation or npm upload and tag\n> `v-npm-0-162-199` remains immutable). CLI-only release metadata;\n> `@chainlesschain/personal-data-hub` remains **0.4.57** and\n> `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Command lifecycle telemetry**: manifest-driven lifecycle metadata now\n records legacy and replacement routes, aggregates usage without changing\n aliases automatically, and keeps compatibility entries until their stated\n observation window and release-cycle requirements are satisfied.\n- **Canonical session authority**: host leases, transcript witnesses,\n anti-rollback anchors, compare-and-swap persistence, bounded cleanup, and\n descendant retirement harden concurrent resume and long-running session\n behavior across the covered CLI, background, and remote-host paths.\n- **Fixed MCP package execution**: approved JavaScript launchers are resolved\n to exact npm versions and complete transitive closures, then bundled into a\n guarded, content-addressed Node capsule. Runtime execution no longer depends\n on a live dynamic package launcher or mutable `node_modules` entrypoint.\n- **Native update recovery**: Windows and POSIX installer/OTA generations can\n recover interrupted activation, rollback, and rescue state while preserving\n exact lineage, owner-private locks, and Windows path/handle identity under\n Node 22.12 device projection.\n- **Portable reliability gates**: disk/pipe failure injection, process-tree\n cleanup, resource accounting, session stress, and platform path aliases are\n covered by the release matrices. Real hardware, terminal, SSH, and extended\n soak observations remain ongoing evidence rather than compatibility claims.\n- **Candidate evidence**: implementation SHA `7e7ce9182746` passed\n [CLI CI](https://github.com/chainlesschain/chainlesschain/actions/runs/31181229942),\n [CLI Strict Sandbox](https://github.com/chainlesschain/chainlesschain/actions/runs/31181328955),\n [CLI Background Interaction E2E](https://github.com/chainlesschain/chainlesschain/actions/runs/31181258842),\n and [CLI Session Host Consistency](https://github.com/chainlesschain/chainlesschain/actions/runs/31181258424)\n on Ubuntu, Windows, and macOS. Final SHA `23bd2e6e5758` also passed the\n exact-SHA release gates, but the\n [dedicated npm release](https://github.com/chainlesschain/chainlesschain/actions/runs/31187599603)\n stopped before package creation because its Agent SDK fixture placed the\n security anchor inside the redirected CLI home."
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"productVersion": null,
|
|
32
|
+
"cliVersion": "0.162.198",
|
|
33
|
+
"cliVersions": ["0.162.197", "0.162.198"],
|
|
34
|
+
"date": "2026-08-06",
|
|
35
|
+
"title": "",
|
|
36
|
+
"sections": [
|
|
37
|
+
{
|
|
38
|
+
"heading": "Fixed — cc CLI 0.162.198: interactive streaming and release portability",
|
|
39
|
+
"body": "> `chainlesschain` **0.162.197 → 0.162.198** (published, 2026-08-06).\n> CLI-only release metadata; `@chainlesschain/personal-data-hub` remains\n> **0.4.57** and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Interactive output backpressure**: REPL, headless streaming, provider\n pacing, and TTY writers now wait for saturated output streams to drain and\n clean up pending listeners across completion, interruption, and session\n transitions instead of allowing unbounded interactive writes.\n- **Canonical session controls**: the CLI-owned session projection and bounded\n reply routes now support the completed VS Code and JetBrains workbench and\n rewind journeys while preserving CLI authority over persisted mutations.\n- **Portable release gates**: Windows path-alias fixtures, state-path mocks,\n Skill metadata fixtures, POSIX executable-bit setup, and the deprecated\n agent-core shim are aligned with the three-platform CLI CI and Strict\n Sandbox contracts.\n- **Release readback hardening**: public npm verification remains independent\n of undeclared runtime dependencies, retries bounded registry propagation,\n and binds provenance and registry bytes to the immutable publish artifact.\n- **Exact release evidence**: tag `v-npm-0-162-198` points to final release SHA\n [`3c0f62fa17242cfa3123ab502a9bf5d1cbed8481`](https://github.com/chainlesschain/chainlesschain/commit/3c0f62fa17242cfa3123ab502a9bf5d1cbed8481).\n The same SHA passed [CLI CI](https://github.com/chainlesschain/chainlesschain/actions/runs/31078499968)\n and [CLI Strict Sandbox](https://github.com/chainlesschain/chainlesschain/actions/runs/31078499270)\n on Ubuntu, Windows, and macOS. The\n [dedicated npm release](https://github.com/chainlesschain/chainlesschain/actions/runs/31081337370)\n completed the exact-SHA gate, immutable tarball, CycloneDX SBOM, Trusted\n Publishing, signed provenance, registry readback, and npmmirror sync; the\n [independent public readback](https://github.com/chainlesschain/chainlesschain/actions/runs/31082366544)\n re-downloaded the package and matched registry bytes and publishing identity."
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
4
43
|
{
|
|
5
44
|
"productVersion": null,
|
|
6
45
|
"cliVersion": "0.162.197",
|
|
@@ -10,7 +49,7 @@
|
|
|
10
49
|
"sections": [
|
|
11
50
|
{
|
|
12
51
|
"heading": "Added — cc CLI 0.162.197: durable sessions, MCP recovery, and checkpoint safety",
|
|
13
|
-
"body": "> `chainlesschain` **0.162.189 → 0.162.197** (release candidate,\n> 2026-08-05; `0.162.190`, `0.162.191`, and `0.162.192` were never published;\n> `0.162.193` was published outside the authoritative CLI release workflow;\n> `0.162.194`, `0.162.195`, and `0.162.196` failed before npm upload and their\n> tags remain immutable).\n> CLI-only release metadata;\n> `@chainlesschain/personal-data-hub`\n> remains **0.4.57** and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Safer configuration defaults**: for CLI config writes, schema-declared\n secrets are refused by `config set` and must use `config set-secret` through\n hidden TTY/stdin and OS-store or owner-only fallback paths. Explicit\n `workspace-write` / `strict` isolation and managed-required sandbox policies\n fail closed when unavailable. `mcp add` now defaults to local scope; both\n human and JSON `status` use bounded quick probes, while full Docker Compose\n detail requires `--deep`.\n- **MCP transports and uncertain-outcome recovery**: scoped WebSocket MCP,\n trusted dynamic headers, timeout notifications, and durable recovery records\n cover REPL, stream, Cowork/host, and WebSocket paths through shared verified\n recovery authority. Ambiguous MCP outcomes require verification or\n adjudication instead of blind replay.\n- **Canonical sessions and resource budgets**: covered REPL, stream,\n WebSocket, and headless paths use verified transcript projections,\n transactional summary/compaction state, and reject stale or corrupt resume\n authority. A persistent session-budget foundation plus background/Team\n adapters adds fenced token/USD/wall-clock accounting and cleanup; it is not\n yet a universal cross-host budget authority.\n- **Agent workflow controls**: durable plan/todo state with revision and\n authority ceilings, controlled skill subagents, background launch profiles,\n semantic handoff, ephemeral side questions, manifest-driven help, and\n deterministic shell completions improve Claude Code-style daily workflows.\n CLI-owned canonical session/checkpoint/delivery projections are consumed by\n VS Code and JetBrains while mutations stay CLI-authoritative; this CLI-only\n metadata bump does not bump either IDE package.\n- **Signed native update recovery**: immutable release identity, signed updater\n rollback chains, atomic download replacement, and portable recovery/cleanup\n paths add fail-closed activation, rollback, and recovery fences for stale,\n replaced, or partial payloads.\n- **Checkpoint restore durability**: canonical workspace prestate binding,\n lifetime locks, immutable Git/copy target identity, copy tombstones and\n owner-private safety arms feed a hash-chained CAS restore saga shared by\n direct and timeline restores. A real Git/copy kill/restart matrix covers\n both the post-completion, pre-lock-release window and mutation-phase partial\n rollback recovery.\n- **Conservative recovery CLI**: `cc checkpoint recovery`\n `list/show/abort/resume/rollback/release` derives mutation authority from the\n current live owner digest or verified owner absence plus exact seq/head\n fences. `resume` remains limited to a verified already-completed settlement;\n `rollback --yes` only accepts a verified partial-mutation rollback cycle and\n dispatches the persisted Git/copy engine rather than re-detecting it.\n- **Verified partial restore rollback**: production Git and copy adapters,\n crash-safe rollback v2 phase boundaries, and the transaction-fenced\n `checkpoint_restore_recovery_resolution` event bind workspace and session\n settlement in both directions. Checkpoint delete, clear, and prune now retain\n active original/safety authority with expected-identity transactions,\n no-replace copy publication, and root-bound maintenance locks. This is a\n narrow partial-restore recovery path, not general multi-resource atomicity,\n power-loss proof, or checkpoint recovery GA.\n- **Release retry identity**: tags `v-npm-0-162-190`,\n `v-npm-0-162-191`, `v-npm-0-162-192`, `v-npm-0-162-194`, and\n `v-npm-0-162-195` / `v-npm-0-162-196` remain immutable records of\n pre-publication failures.\n Run `30790359741` exposed an Agent SDK E2E fixture that used its owner-private\n `CHAINLESSCHAIN_HOME` as the active workspace; the fixture now uses sibling\n control-state and workspace roots while production path safety remains fail\n closed. Run `30793513643` passed all tests but exposed root-monorepo\n `npm sbom` contamination from unrelated desktop/mobile peer graphs; SBOM\n generation now resolves an ignore-scripts lock from the immutable CLI\n tarball and validates its CycloneDX package/version identity. Run\n `30799974832` exposed that the exact-SHA gate queried jobs with\n `filter=all`, so an earlier failed CLI CI attempt overrode the successful\n rerun; it now verifies only GitHub's latest attempt. The first `0.162.193`\n candidate then exposed a recurring macOS two-process CAS race in run\n `30800530258`: a cooperating owner could remove its lock between the\n unlocked safety inspection steps, and the loser reported `LOCK_FAILED`\n instead of reaching the serialized stale-head `CONFLICT`. Unlocked\n pre/postflight inspection now retries that exact disappearance, while\n owner-required critical-section checks still fail closed. Deterministic\n directory/owner disappearance regressions, the full 105-test checkpoint\n saga suite, and five repeated real-process CAS runs pass locally.\n Run `30966796114` passed its exact-SHA gate but failed before package creation\n when the Agent SDK build assumed a package-local `node_modules/.bin/tsc`.\n The build now resolves the TypeScript compiler module through Node, supporting\n both independent installs and npm workspace hoisting; the consumed\n `v-npm-0-162-194` identity is not moved or reused.\n Run `30973665834` then passed the exact-SHA gate and all tests, but its\n immutable package job passed the complete `npm pack --json` result as one\n command-line argument; the 959-file metadata exceeded Linux `ARG_MAX` before\n release-manifest creation. Pack metadata now flows through a temporary file,\n and the consumed `v-npm-0-162-195` identity is also not moved or reused.\n Run `30976924860` passed all tests, immutable tarball creation, SBOM validation,\n and artifact upload, but `npm publish` interpreted the bare relative\n `release-artifacts/...tgz` argument as a GitHub `owner/repo` package spec and\n failed before upload. The publish step now discovers the tarball through the\n absolute `$GITHUB_WORKSPACE` path; `v-npm-0-162-196` is not moved or reused.\n- **Release authority containment**: a later generic workspace publisher\n replaced the dedicated CLI workflow at the same `npm-publish.yml` path.\n Manually dispatched run `30820089779` therefore auto-selected and published\n `chainlesschain@0.162.193` from `e8e7ba274b487ed491c04ec3359841a0e545debb`\n while that SHA's `CLI CI` was still running and eventually failed. The\n package has npm provenance but no `v-npm-0-162-193` tag, exact-SHA gate\n attestation, verified immutable tarball/SBOM handoff, or successful complete\n CLI matrix. The authoritative workflow is restored; the generic publisher\n is moved to a distinct workflow/tag namespace, while the live CLI path now\n requires the event ref to exactly match `v-npm-<package-version>` and its\n checked-out `GITHUB_SHA`. The generic publisher excludes `packages/cli`\n and package name `chainlesschain` both during detection and immediately\n before publish. Numeric product releases no longer contain a CLI publisher:\n they require an already-published `v-npm-*` tag, matching registry `gitHead`,\n and successful exact-SHA gates before finalizing. The two local generic\n publisher scripts also exclude and reject the CLI.\n- **Inline-chat release blocker**: the `0.162.193` source registered the six\n VS Code inline-chat commands twice, invoked non-existent methods in the\n second registration, and referenced an undefined `outputLog` during\n activation. The extension now constructs one decorator with the existing\n chat provider and module logger, registers each contributed command exactly\n once, and publishes the same six commands through the canonical IDE\n capability manifest. The activation fake now exercises the decorator path,\n so constructor or registration regressions fail the CLI matrix.\n- **Production REPL prompt interactions**: each real REPL session now owns a\n prompt interaction controller and slash-command registry for `/paste-image`,\n `/editor`, `/stash`, `/suggestions`, and `/recap`. Guarded keypress dispatch\n consumes configured interaction keys before readline, live assistant/session\n context feeds manual and automatic suggestions, and local clipboard data\n images join the existing multimodal vision-provider path while remote image\n chips fail closed. The focused REPL, prompt, keybinding, image, and provider\n matrix passes 200/200 locally; real terminal/clipboard host coverage and the\n exact-SHA release gates remain required.\n- **Second command-surface migration batch**: eight explicitly legacy or\n in-memory governance commands (`bm25`, `ccron`, `compt`, `consol`, `fflag`,\n `pdfp`, `sganal`, and `vcheck`) now have canonical `cc lab ...` spellings.\n Their original top-level forms remain compatible through at least `0.164.0`\n and warn only on stderr. The registered graph remains 175 commands with zero\n net growth, while the recommended surface drops from 174 to 166; manifest,\n README, namespace help, and four shell completions share the same lifecycle\n source. Native manifest generation also now uses the real pure `/doctor`\n status exports instead of a nonexistent registry import.\n- **Third command-surface migration batch**: fifteen explicitly in-memory V2\n governance overlays (`execbe`, `itbudget`, `mcpscaf`, `meminj`, `orchgov`,\n `promcomp`, `seshhook`, `seshsearch`, `seshtail`, `seshu`, `slotfill`,\n `svccont`, `tms`, `topiccls`, and `uprof`) now use canonical `cc lab ...`\n spellings. Product-facing `todo`, `subagent`, `webfetch`, and `planmode`\n remain active top-level commands instead of being migrated by keyword alone.\n Legacy spellings remain compatible through at least `0.164.0` and warn only\n on stderr. The registered graph remains 175 commands with zero net growth;\n the recommended surface drops from 166 to 151, with manifest, README,\n namespace help, and four shell completions generated from one lifecycle\n policy.\n- **Release status**: `0.162.193` exists on npm but is not an authorized CLI\n release and must not be overwritten or represented as gate-complete.\n `0.162.194`, `0.162.195`, and `0.162.196` are not published and their failed\n tags remain immutable. The `0.162.197` exact\n version/changelog/fix commit must pass `CLI CI` and `CLI Strict Sandbox` on\n Ubuntu, Windows, and macOS, plus affected `Session Host Consistency`,\n `CLI Background Interaction E2E`, and immutable npm tarball verification,\n before tag `v-npm-0-162-197` or npm publication is allowed. Local,\n older-SHA, and partial results are supplementary only."
|
|
52
|
+
"body": "> `chainlesschain` **0.162.189 → 0.162.197** (published,\n> 2026-08-05; `0.162.190`, `0.162.191`, and `0.162.192` were never published;\n> `0.162.193` was published outside the authoritative CLI release workflow;\n> `0.162.194`, `0.162.195`, and `0.162.196` failed before npm upload and their\n> tags remain immutable).\n> CLI-only release metadata;\n> `@chainlesschain/personal-data-hub`\n> remains **0.4.57** and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Safer configuration defaults**: for CLI config writes, schema-declared\n secrets are refused by `config set` and must use `config set-secret` through\n hidden TTY/stdin and OS-store or owner-only fallback paths. Explicit\n `workspace-write` / `strict` isolation and managed-required sandbox policies\n fail closed when unavailable. `mcp add` now defaults to local scope; both\n human and JSON `status` use bounded quick probes, while full Docker Compose\n detail requires `--deep`.\n- **MCP transports and uncertain-outcome recovery**: scoped WebSocket MCP,\n trusted dynamic headers, timeout notifications, and durable recovery records\n cover REPL, stream, Cowork/host, and WebSocket paths through shared verified\n recovery authority. Ambiguous MCP outcomes require verification or\n adjudication instead of blind replay.\n- **Canonical sessions and resource budgets**: covered REPL, stream,\n WebSocket, and headless paths use verified transcript projections,\n transactional summary/compaction state, and reject stale or corrupt resume\n authority. A persistent session-budget foundation plus background/Team\n adapters adds fenced token/USD/wall-clock accounting and cleanup; it is not\n yet a universal cross-host budget authority.\n- **Agent workflow controls**: durable plan/todo state with revision and\n authority ceilings, controlled skill subagents, background launch profiles,\n semantic handoff, ephemeral side questions, manifest-driven help, and\n deterministic shell completions improve Claude Code-style daily workflows.\n CLI-owned canonical session/checkpoint/delivery projections are consumed by\n VS Code and JetBrains while mutations stay CLI-authoritative; this CLI-only\n metadata bump does not bump either IDE package.\n- **Signed native update recovery**: immutable release identity, signed updater\n rollback chains, atomic download replacement, and portable recovery/cleanup\n paths add fail-closed activation, rollback, and recovery fences for stale,\n replaced, or partial payloads.\n- **Checkpoint restore durability**: canonical workspace prestate binding,\n lifetime locks, immutable Git/copy target identity, copy tombstones and\n owner-private safety arms feed a hash-chained CAS restore saga shared by\n direct and timeline restores. A real Git/copy kill/restart matrix covers\n both the post-completion, pre-lock-release window and mutation-phase partial\n rollback recovery.\n- **Conservative recovery CLI**: `cc checkpoint recovery`\n `list/show/abort/resume/rollback/release` derives mutation authority from the\n current live owner digest or verified owner absence plus exact seq/head\n fences. `resume` remains limited to a verified already-completed settlement;\n `rollback --yes` only accepts a verified partial-mutation rollback cycle and\n dispatches the persisted Git/copy engine rather than re-detecting it.\n- **Verified partial restore rollback**: production Git and copy adapters,\n crash-safe rollback v2 phase boundaries, and the transaction-fenced\n `checkpoint_restore_recovery_resolution` event bind workspace and session\n settlement in both directions. Checkpoint delete, clear, and prune now retain\n active original/safety authority with expected-identity transactions,\n no-replace copy publication, and root-bound maintenance locks. This is a\n narrow partial-restore recovery path, not general multi-resource atomicity,\n power-loss proof, or checkpoint recovery GA.\n- **Release retry identity**: tags `v-npm-0-162-190`,\n `v-npm-0-162-191`, `v-npm-0-162-192`, `v-npm-0-162-194`, and\n `v-npm-0-162-195` / `v-npm-0-162-196` remain immutable records of\n pre-publication failures.\n Run `30790359741` exposed an Agent SDK E2E fixture that used its owner-private\n `CHAINLESSCHAIN_HOME` as the active workspace; the fixture now uses sibling\n control-state and workspace roots while production path safety remains fail\n closed. Run `30793513643` passed all tests but exposed root-monorepo\n `npm sbom` contamination from unrelated desktop/mobile peer graphs; SBOM\n generation now resolves an ignore-scripts lock from the immutable CLI\n tarball and validates its CycloneDX package/version identity. Run\n `30799974832` exposed that the exact-SHA gate queried jobs with\n `filter=all`, so an earlier failed CLI CI attempt overrode the successful\n rerun; it now verifies only GitHub's latest attempt. The first `0.162.193`\n candidate then exposed a recurring macOS two-process CAS race in run\n `30800530258`: a cooperating owner could remove its lock between the\n unlocked safety inspection steps, and the loser reported `LOCK_FAILED`\n instead of reaching the serialized stale-head `CONFLICT`. Unlocked\n pre/postflight inspection now retries that exact disappearance, while\n owner-required critical-section checks still fail closed. Deterministic\n directory/owner disappearance regressions, the full 105-test checkpoint\n saga suite, and five repeated real-process CAS runs pass locally.\n Run `30966796114` passed its exact-SHA gate but failed before package creation\n when the Agent SDK build assumed a package-local `node_modules/.bin/tsc`.\n The build now resolves the TypeScript compiler module through Node, supporting\n both independent installs and npm workspace hoisting; the consumed\n `v-npm-0-162-194` identity is not moved or reused.\n Run `30973665834` then passed the exact-SHA gate and all tests, but its\n immutable package job passed the complete `npm pack --json` result as one\n command-line argument; the 959-file metadata exceeded Linux `ARG_MAX` before\n release-manifest creation. Pack metadata now flows through a temporary file,\n and the consumed `v-npm-0-162-195` identity is also not moved or reused.\n Run `30976924860` passed all tests, immutable tarball creation, SBOM validation,\n and artifact upload, but `npm publish` interpreted the bare relative\n `release-artifacts/...tgz` argument as a GitHub `owner/repo` package spec and\n failed before upload. The publish step now discovers the tarball through the\n absolute `$GITHUB_WORKSPACE` path; `v-npm-0-162-196` is not moved or reused.\n- **Release authority containment**: a later generic workspace publisher\n replaced the dedicated CLI workflow at the same `npm-publish.yml` path.\n Manually dispatched run `30820089779` therefore auto-selected and published\n `chainlesschain@0.162.193` from `e8e7ba274b487ed491c04ec3359841a0e545debb`\n while that SHA's `CLI CI` was still running and eventually failed. The\n package has npm provenance but no `v-npm-0-162-193` tag, exact-SHA gate\n attestation, verified immutable tarball/SBOM handoff, or successful complete\n CLI matrix. The authoritative workflow is restored; the generic publisher\n is moved to a distinct workflow/tag namespace, while the live CLI path now\n requires the event ref to exactly match `v-npm-<package-version>` and its\n checked-out `GITHUB_SHA`. The generic publisher excludes `packages/cli`\n and package name `chainlesschain` both during detection and immediately\n before publish. Numeric product releases no longer contain a CLI publisher:\n they require an already-published `v-npm-*` tag, matching registry `gitHead`,\n and successful exact-SHA gates before finalizing. The two local generic\n publisher scripts also exclude and reject the CLI.\n- **Inline-chat release blocker**: the `0.162.193` source registered the six\n VS Code inline-chat commands twice, invoked non-existent methods in the\n second registration, and referenced an undefined `outputLog` during\n activation. The extension now constructs one decorator with the existing\n chat provider and module logger, registers each contributed command exactly\n once, and publishes the same six commands through the canonical IDE\n capability manifest. The activation fake now exercises the decorator path,\n so constructor or registration regressions fail the CLI matrix.\n- **Production REPL prompt interactions**: each real REPL session now owns a\n prompt interaction controller and slash-command registry for `/paste-image`,\n `/editor`, `/stash`, `/suggestions`, and `/recap`. Guarded keypress dispatch\n consumes configured interaction keys before readline, live assistant/session\n context feeds manual and automatic suggestions, and local clipboard data\n images join the existing multimodal vision-provider path while remote image\n chips fail closed. The focused REPL, prompt, keybinding, image, and provider\n matrix passes 200/200 locally; the exact-SHA three-platform release gates\n listed below also passed.\n- **Second command-surface migration batch**: eight explicitly legacy or\n in-memory governance commands (`bm25`, `ccron`, `compt`, `consol`, `fflag`,\n `pdfp`, `sganal`, and `vcheck`) now have canonical `cc lab ...` spellings.\n Their original top-level forms remain compatible through at least `0.164.0`\n and warn only on stderr. The registered graph remains 175 commands with zero\n net growth, while the recommended surface drops from 174 to 166; manifest,\n README, namespace help, and four shell completions share the same lifecycle\n source. Native manifest generation also now uses the real pure `/doctor`\n status exports instead of a nonexistent registry import.\n- **Third command-surface migration batch**: fifteen explicitly in-memory V2\n governance overlays (`execbe`, `itbudget`, `mcpscaf`, `meminj`, `orchgov`,\n `promcomp`, `seshhook`, `seshsearch`, `seshtail`, `seshu`, `slotfill`,\n `svccont`, `tms`, `topiccls`, and `uprof`) now use canonical `cc lab ...`\n spellings. Product-facing `todo`, `subagent`, `webfetch`, and `planmode`\n remain active top-level commands instead of being migrated by keyword alone.\n Legacy spellings remain compatible through at least `0.164.0` and warn only\n on stderr. The registered graph remains 175 commands with zero net growth;\n the recommended surface drops from 166 to 151, with manifest, README,\n namespace help, and four shell completions generated from one lifecycle\n policy.\n- **Published release evidence**: `0.162.193` remains an unauthorized historical\n registry record and is superseded by `0.162.197`; `0.162.194`, `0.162.195`,\n and `0.162.196` are not published and their failed tags remain immutable.\n Tag `v-npm-0-162-197` points to exact commit\n `a03ad1b548cc6f15c9bef8f82d519e9c625eef8d`. Its\n [CLI CI](https://github.com/chainlesschain/chainlesschain/actions/runs/30979565407),\n [CLI Strict Sandbox](https://github.com/chainlesschain/chainlesschain/actions/runs/30979565251),\n and [dedicated npm release](https://github.com/chainlesschain/chainlesschain/actions/runs/30979565206)\n passed across Ubuntu, Windows, and macOS, including exact-SHA, immutable\n tarball/SBOM, and provenance checks. A subsequent\n [registry readback](https://github.com/chainlesschain/chainlesschain/actions/runs/30983536627)\n verified package bytes, signed provenance, and workflow identity. Local,\n older-SHA, and partial results remain supplementary only."
|
|
14
53
|
}
|
|
15
54
|
]
|
|
16
55
|
},
|