chainlesschain 0.162.188 → 0.162.193
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/README.md +61 -11
- package/bin/chainlesschain.js +7 -52
- package/completions/_cc +209 -0
- package/completions/cc.bash +18 -0
- package/completions/cc.fish +13 -0
- package/completions/cc.ps1 +226 -0
- package/package.json +10 -2
- package/src/assets/web-panel/assets/{AIOps-Brr1LVcE.js → AIOps-DBLkaTje.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DQU74DKG.js → ActionButton-BAy-Qebo.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CYp9178y.js → Analytics-Dfb1Mlau.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DW4SCYsW.js → AppLayout-BbFkN8m0.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CYlD_ed1.js → Artifacts-kM4-cEEH.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CWl1rZOi.js → Audit-BSQfYWf3.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BOR-LPsa.js → BackgroundAgents-CWDbI_fG.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DLpG7j1X.js → Backup-BxLPbq_Q.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-B35K9wdr.js → BaseInput-DuIbdrp6.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CwUJb9gB.js → Chat-NEmjGahU.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-1v6aMS1m.js → ChatBubbleRenderer-DfJEo-5_.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-pi3-tPNW.js → Checkbox-CaoeG3Ns.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-FyNF35eL.js → Codegen-BFf_g3xY.js} +1 -1
- package/src/assets/web-panel/assets/{Col-tGt_JDEr.js → Col-CNOd8mdQ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CC7LonQX.js → Community-BhpDqz-i.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BGXrHHjE.js → Compact-CQ42T7Z6.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DSW0TBZ8.js → Compliance-DI5PcLMN.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Bhk7rbvE.js → Cowork-wYYZe0wR.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DxyiQ2NZ.js → Cron-Dlq03DD_.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-B2ZkxHok.js → Crosschain-BzqS8PP3.js} +1 -1
- package/src/assets/web-panel/assets/{DID-yOJV99eJ.js → DID-It55Yem7.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CKsttz7D.js → Dashboard-9HkH6oxn.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CVFldXSL.js → Dropdown-00e2YWRB.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Bufv638J.js → EmailListRenderer-By-ugRDL.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-4ncjoIjL.js → FamilyGuardDashboard-C396yu5m.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DsknEDoX.js → Federation-BME5sbZY.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Cqe5jWXA.js → FormItemContext-B4TEZCr-.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-NAJaFKxc.js → GenericCardRenderer-_9CX9ieY.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CszKQpnl.js → Git-BrS6WVSr.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BXGodXi6.js → Governance-BMdCWnKF.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CkoYuG2c.js → Inference-Bcp3vzcA.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DFlEr_T0.js → KnowledgeGraph-DlLuqGY5.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CVaENddA.js → Logs-D-W_6x09.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DElGPxCZ.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CDlLT0fw.js → Marketplace-Dzn2guvI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DdwOyszN.js → McpTools-uPict-KL.js} +6 -6
- package/src/assets/web-panel/assets/{Memory-DKQnkKuG.js → Memory-BCw43kOb.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DGseqlzJ.js → MobileBridge-DmV8Wv7F.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-COBbEOlj.js → MobileProjects-C-HaCmSM.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-O61Vwyli.js → Mtc-C6jxJ34Y.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-Dw2SyasS.js → MtcAudit-Za8ExwhQ.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-hSu_l8kf.js → Multisig-KKDbuEgb.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CX1Epurr.js → NLProgramming-Dj97zbCk.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-R9xX8o8_.js → Notes-DBXvMraU.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-jtSNLCuK.js → NotificationSettings-DOxITLYl.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-7DVjZwMM.js +1 -0
- package/src/assets/web-panel/assets/{Organization-Pu2WO-U3.js → Organization-D1i73mjb.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BjnqUyFp.js → Overflow-kW6Q3rvg.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-jjkvz44c.js → P2P-C-v_8p2v.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-tUbbY64W.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-D4yDpivd.js → Permissions-DkHxEZ58.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-0qsL6iH1.js → PersonalDataHub-DWuMPGrK.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-Cx7Ybrk2.js → Pipeline-30IYXWWm.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-PbfR_M_V.js → Privacy-DZNQ4RrH.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CyV6Gsub.js → ProjectInit-De2MCElf.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C7KZ2Wdk.js → ProjectSettings-5uHk9wsC.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DQDjO-yK.js → Projects-XjDfrFLb.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DyFVBBMX.js → Providers-Bgwj6gcE.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CzB1BC9_.js → QrScannerModal-gKql9umv.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Bk636mC1.js → QuickAsk-BWvmwkh7.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DoWxHIT3.js → Recommend-Uok4hZPd.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-oOVIv9wq.js → RemoteSession-DLJzTk9a.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-BucoReGG.js → Reputation-ZVwIPMSO.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DzmOdJU7.js → Row-CN04HxWR.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C1tK7KGU.js → RssFeed-BdSrEG4g.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CSnInOqk.js → Search-5PwVd0IR.js} +1 -1
- package/src/assets/web-panel/assets/{Security-dlejr15l.js → Security-DdBo4zjN.js} +3 -3
- package/src/assets/web-panel/assets/{Services-BioPZuNh.js → Services-D3letU7M.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DWMibwpC.js → Skeleton--Jb83f1v.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BAAnx1B2.js → Skills-Bg-CulHX.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-jWNp4hNO.js → Sla-7QOa7S-X.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-y5kqKha-.js → SpeechSettings-DQwppjRw.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B9GNsc3e.js → SyncSettings-dNPQGL-s.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BDBYKRen.js → Tasks-Ggs-Z48q.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DRiE5eaN.js → Templates-78TYHgRO.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BGlAvExF.js → Tenant-xHwwv9vO.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B8uzrbNY.js → Terminal-BJXSJfm4.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Df48iveY.js → TimelineRenderer-fLbjRhJw.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CcmHndN6.js → Tokens-oMSBSBmB.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DPkWxmQ2.js → Trigger-CfnY_wX_.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DTb5a5AV.js → Trust-AdyTgYKO.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CBmg5vch.js → UkeySign-C5K_81dS.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B0mZrz4O.js → VideoEditing-vcGVDqki.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Bxs7_mpd.js → Wallet-hhOc3hlY.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-C8x3cMxU.js → WebAuthn-CVloC11s.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-DPrNznrP.js → WorkflowEditor-CYeE32R5.js} +1 -1
- package/src/assets/web-panel/assets/{chat-D3bYWu7S.js → chat-CNROR5bN.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DY-PwMu4.js → colors-Cjx-cnwU.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-LDk10Kw6.js → compact-item-DOIfelvD.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-C-2MZnFq.js → createContext-DfA7UZ8u.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-ChcCBGs7.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BQIBjcnB.js → hasIn-BMSCzcfM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQVb2dWp.js → index-5-HXgOX5.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdXnYMCZ.js → index-AWg-0M1S.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx6D_dx2.js → index-B4iYzpkL.js} +1 -1
- package/src/assets/web-panel/assets/{index-_HRO_cIu.js → index-B5Udeb_6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlRYqt3S.js → index-B7gf77CJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BrnRO9yE.js → index-BEMwBBHk.js} +1 -1
- package/src/assets/web-panel/assets/{index-VCh5zNJo.js → index-BM1y_9hM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRI3ngNg.js → index-BUonmKSE.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3GNvExG.js → index-BbQ2eQ8H.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSvo_bp0.js → index-BemJ2u_E.js} +1 -1
- package/src/assets/web-panel/assets/{index-L6qixyLc.js → index-BolaOQxx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BI4KgcYC.js → index-BxOk9vkG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CY4KnaO9.js → index-By61ojUx.js} +1 -1
- package/src/assets/web-panel/assets/{index-L3smcoQX.js → index-C2K9SNVX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BX2b9Orc.js → index-C3L5gdiD.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz4b6Z_7.js → index-C7xn0Nub.js} +1 -1
- package/src/assets/web-panel/assets/{index-COG61sRv.js → index-CAnvhwg6.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7FC8cP2.js → index-CEKMcOyU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BN-xdSWZ.js → index-CNC5onm4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY2FIrmz.js → index-CVL27kXC.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiTvBAr-.js → index-CVm1_i3t.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhRt9cYJ.js → index-CdYBye8B.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5pgtZnY.js → index-ClNMrqEY.js} +1 -1
- package/src/assets/web-panel/assets/{index-7xKu7Fns.js → index-Cs6l7uRu.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4K1weKc.js → index-CshQbilz.js} +1 -1
- package/src/assets/web-panel/assets/{index-k7C_oDCO.js → index-Cyweh0Hy.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3Oq-DLL.js → index-DBpWXFed.js} +3 -3
- package/src/assets/web-panel/assets/{index-DYyLJPlF.js → index-DHtpHZAQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dh-tkpKQ.js → index-DLmn0BoK.js} +1 -1
- package/src/assets/web-panel/assets/{index-8JC9BJa1.js → index-DPAWBrMf.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dd2Km97U.js → index-DjEsxO5h.js} +1 -1
- package/src/assets/web-panel/assets/{index-KFZO_lcx.js → index-FBc_CJBd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTIZpPtG.js → index-Icdoqmzt.js} +1 -1
- package/src/assets/web-panel/assets/index-Q2IajL54.js +1 -0
- package/src/assets/web-panel/assets/index-bRkHgOMc.js +1 -0
- package/src/assets/web-panel/assets/{index-lmm9p-jm.js → index-dCd8cSUq.js} +1 -1
- package/src/assets/web-panel/assets/{index-HasPt4-h.js → index-m2vG9gG_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaslYch6.js → index-mTpHoEzr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbR6ROOa.js → index-ti_lnTWl.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-zQPSHf2C.js → initDefaultProps-Bu8k7H1Y.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CKCStGVk.js → motion-s3iVK41k.js} +1 -1
- package/src/assets/web-panel/assets/{move-BufVDGYF.js → move-B6B-E5Jz.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DcaFxy5D.js → mtc-parser-BiYgTidA.js} +1 -1
- package/src/assets/web-panel/assets/{omit-EScpkGdo.js → omit-pU1RdUDA.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-72hG_qfT.js → pickAttrs-Cdoq_SeM.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CMFWiH20.js → placementArrow-DIuvAn2K.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DKQHS41p.js → responsiveObserve-8w16YR2D.js} +1 -1
- package/src/assets/web-panel/assets/{slide-QVAFHTIQ.js → slide-VZ01cZe3.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DIz38e2G.js → statusUtils-lh8YMN8Z.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-zK5cyLby.js → styleChecker-CmDyreec.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DhZngk62.js → useFlexGapSupport-hiJWMU5y.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BvV2cvkg.js → useFs-Thnu-Iaj.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CRmxb9l3.js → usePersonalDataHub-LBdOxjwY.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CgQIbobP.js → vnode-Cg6lFY_X.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-D4XrrO0R.js → zoom-DVfsR1YO.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/cli-help.js +181 -0
- package/src/command-help-index.json +181 -0
- package/src/command-manifest.json +1107 -175
- package/src/command-surface-policy.js +197 -0
- package/src/commands/agent.js +98 -33
- package/src/commands/artifacts.js +400 -2
- package/src/commands/background-session.js +41 -3
- package/src/commands/checkpoint-managed.js +1059 -0
- package/src/commands/checkpoint-restore-recovery.js +1476 -0
- package/src/commands/checkpoint.js +950 -22
- package/src/commands/compact.js +101 -25
- package/src/commands/config.js +506 -20
- package/src/commands/doctor.js +4 -1
- package/src/commands/hub.js +1 -1
- package/src/commands/mcp.js +688 -24
- package/src/commands/pack.js +16 -2
- package/src/commands/plugin.js +20 -12
- package/src/commands/session-mcp-recovery.js +218 -0
- package/src/commands/session.js +470 -110
- package/src/commands/setup.js +36 -10
- package/src/commands/skill.js +181 -110
- package/src/commands/status.js +21 -5
- package/src/commands/team-distributed.js +3324 -0
- package/src/commands/team.js +1130 -74
- package/src/commands/update.js +68 -6
- package/src/constants.js +11 -0
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/action-protocol.js +10 -0
- package/src/gateways/ws/session-protocol.js +555 -27
- package/src/gateways/ws/ws-agent-handler.js +541 -14
- package/src/gateways/ws/ws-session-gateway.js +129 -22
- package/src/gateways/ws/ws-session-state.js +431 -0
- package/src/harness/background-task-manager.js +233 -36
- package/src/harness/jsonl-session-store.js +2551 -167
- package/src/harness/mcp-client.js +802 -61
- package/src/harness/prompt-compressor.js +227 -27
- package/src/harness/session-index.js +89 -38
- package/src/harness/session-list-index.js +254 -0
- package/src/harness/structured-handoff.js +410 -0
- package/src/lazy-dispatch.js +747 -84
- package/src/lib/__tests__/logger.test.js +50 -2
- package/src/lib/advisor-runtime.js +1047 -0
- package/src/lib/agent-core.js +2 -0
- package/src/lib/agent-sandbox.js +120 -26
- package/src/lib/agent-session-export.js +20 -0
- package/src/lib/agent-team/task-lease.js +271 -3
- package/src/lib/agent-team/team-adjudication.js +1501 -0
- package/src/lib/agent-team/team-budget.js +4 -1
- package/src/lib/agent-team/team-control-store.js +582 -0
- package/src/lib/agent-team/team-distributed-queue.js +5246 -0
- package/src/lib/agent-team/team-process-checkpoint.js +211 -0
- package/src/lib/agent-team/team-runner.js +543 -24
- package/src/lib/agent-team/team-worktree.js +1403 -95
- package/src/lib/artifact-store.js +131 -8
- package/src/lib/background-agent-supervisor.js +185 -13
- package/src/lib/background-interaction-journal.js +37 -9
- package/src/lib/background-launch-profile.js +1058 -0
- package/src/lib/checkpoint-restore-already-completed-controller.js +902 -0
- package/src/lib/checkpoint-restore-orchestrator.js +987 -0
- package/src/lib/checkpoint-restore-partial-rollback-controller.js +1953 -0
- package/src/lib/checkpoint-restore-recovery-controller.js +689 -0
- package/src/lib/checkpoint-restore-recovery.js +884 -0
- package/src/lib/checkpoint-restore-retention.js +126 -0
- package/src/lib/checkpoint-restore-saga.js +5079 -0
- package/src/lib/checkpoint-restore-session-recovery.js +1178 -0
- package/src/lib/checkpoint-restore-workspace-target-verifier.js +270 -0
- package/src/lib/checkpoint-store.js +1688 -97
- package/src/lib/checkpoint-timeline-authority.js +522 -0
- package/src/lib/checkpoint-timeline.js +642 -0
- package/src/lib/config-keys.js +18 -119
- package/src/lib/config-manager.js +446 -27
- package/src/lib/config-redaction.js +57 -0
- package/src/lib/config-schema.js +853 -0
- package/src/lib/cowork-mcp-tools.js +5 -0
- package/src/lib/cowork-task-runner.js +458 -63
- package/src/lib/delivery-coordinator.js +1234 -0
- package/src/lib/delivery-evidence.js +450 -0
- package/src/lib/doctor-checkup.js +199 -14
- package/src/lib/executable-path.js +34 -0
- package/src/lib/fatal-handler.js +16 -0
- package/src/lib/file-checkpoint.js +4909 -186
- package/src/lib/file-lines.js +125 -0
- package/src/lib/headless-config-command.js +16 -5
- package/src/lib/hook-runner.cjs +139 -38
- package/src/lib/hooks-v2-workspace-context.js +10 -0
- package/src/lib/impacted-gate-selector.js +424 -0
- package/src/lib/interaction-adapter.js +62 -0
- package/src/lib/jsonl-session-store.js +1 -35
- package/src/lib/logger.js +66 -14
- package/src/lib/managed-checkpoint-render.js +60 -0
- package/src/lib/managed-tool-checkpoint.js +194 -0
- package/src/lib/mcp-call-ledger-store.js +1069 -0
- package/src/lib/mcp-call-ledger.js +747 -0
- package/src/lib/mcp-client.js +5 -0
- package/src/lib/mcp-conflict-scheduler.js +468 -0
- package/src/lib/mcp-effect-contract.js +102 -0
- package/src/lib/mcp-headers-helper-trust.js +145 -0
- package/src/lib/mcp-headers-helper.js +616 -0
- package/src/lib/mcp-host-recovery-runtime.js +131 -0
- package/src/lib/mcp-ledger-recovery-admission.js +1065 -0
- package/src/lib/mcp-recovery-adjudication.js +443 -0
- package/src/lib/output-context.js +86 -0
- package/src/lib/packer/file-identity.js +170 -0
- package/src/lib/packer/index.js +3 -0
- package/src/lib/packer/native-update-state.js +277 -0
- package/src/lib/packer/pack-update-applier.js +1983 -136
- package/src/lib/packer/pack-update-checker.js +34 -0
- package/src/lib/packer/pack-update-downloader.js +875 -86
- package/src/lib/packer/pack-update-signature.js +86 -0
- package/src/lib/packer/pkg-config-generator.js +6 -0
- package/src/lib/paths.js +65 -10
- package/src/lib/plan-mode.js +831 -14
- package/src/lib/plan-persistence.js +540 -0
- package/src/lib/plugin-runtime/hooks.js +227 -69
- package/src/lib/plugin-runtime/plugin-options.js +189 -44
- package/src/lib/pr-automation-policy.js +146 -8
- package/src/lib/process-execution-broker/credential-agent.js +7 -0
- package/src/lib/process-execution-broker/index.js +491 -13
- package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +28 -1
- package/src/lib/process-execution-broker/linux-generic-bwrap.js +28 -4
- package/src/lib/process-execution-broker/platform-sandbox.js +92 -70
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +284 -19
- package/src/lib/process-execution-broker/workspace-transaction.js +4459 -0
- package/src/lib/project-instructions.js +165 -29
- package/src/lib/project-mcp-trust.js +67 -0
- package/src/lib/public-ide-capability-manifest.js +272 -0
- package/src/lib/public-ide-capability-validation.js +351 -0
- package/src/lib/secret-store.js +267 -43
- package/src/lib/secure-file-identity.js +433 -0
- package/src/lib/secure-fs.js +1089 -0
- package/src/lib/security-audit.js +58 -0
- package/src/lib/service-manager.js +34 -13
- package/src/lib/session-budget-runtime.js +1452 -0
- package/src/lib/session-host-snapshot.js +388 -0
- package/src/lib/session-message-provenance.js +429 -0
- package/src/lib/session-projection.js +804 -0
- package/src/lib/session-resource-budget.js +1495 -0
- package/src/lib/settings-hooks.cjs +138 -22
- package/src/lib/settings-loader.cjs +25 -2
- package/src/lib/side-effect-ledger-store.js +45 -23
- package/src/lib/skill-execution-identity.js +217 -0
- package/src/lib/skill-loader.js +299 -18
- package/src/lib/sub-agent-context.js +236 -28
- package/src/lib/sub-agent-registry.js +5 -0
- package/src/lib/subagent-contract.js +94 -0
- package/src/lib/todo-manager.js +185 -18
- package/src/lib/todo-persistence.js +417 -0
- package/src/lib/turn-binding-store.js +41 -23
- package/src/lib/turn-binding.js +160 -2
- package/src/lib/with-file-lock.js +165 -24
- package/src/lib/ws-chat-handler.js +21 -0
- package/src/program-base.js +18 -0
- package/src/repl/advisor-command.js +103 -0
- package/src/repl/agent-repl.js +2175 -146
- package/src/repl/btw-command.js +93 -10
- package/src/repl/clipboard-image.js +119 -0
- package/src/repl/config-summary.js +64 -108
- package/src/repl/prompt-editor.js +233 -0
- package/src/repl/prompt-interactions.js +344 -0
- package/src/repl/prompt-stash.js +354 -0
- package/src/repl/prompt-suggestions.js +312 -0
- package/src/repl/repl-keybindings.js +227 -0
- package/src/repl/session-recap.js +217 -0
- package/src/repl/slash-command-registry.js +22 -0
- package/src/repl/terminal-layout.js +88 -0
- package/src/runtime/agent-core.js +1630 -447
- package/src/runtime/coding-agent-contract-shared.cjs +13 -1
- package/src/runtime/coding-agent-managed-tool-policy.cjs +7 -2
- package/src/runtime/diagnostics.js +32 -13
- package/src/runtime/headless-runner.js +310 -118
- package/src/runtime/headless-stream.js +356 -95
- package/src/runtime/mcp-config.js +148 -14
- package/src/runtime/policies/agent-policy.js +14 -0
- package/src/runtime/status-diagnostics-lite.js +137 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-7iWGwZ-r.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BU2Yqq5H.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-69ca_WeR.js +0 -7
- package/src/assets/web-panel/assets/devWarning-B4dXIJqD.js +0 -1
- package/src/assets/web-panel/assets/index-C-C7DaG6.js +0 -1
- package/src/assets/web-panel/assets/index-DkfWzWtd.js +0 -1
package/src/lib/skill-loader.js
CHANGED
|
@@ -32,6 +32,17 @@ import { normalizeSkillPaths } from "./skill-path-scope.js";
|
|
|
32
32
|
import { discoverPluginSkillLayers } from "./plugin-runtime/skills.js";
|
|
33
33
|
import settingsLoader from "./settings-loader.cjs";
|
|
34
34
|
import contextSourceLedger from "./context-source-ledger.js";
|
|
35
|
+
import {
|
|
36
|
+
assertControlledSkillExecution,
|
|
37
|
+
captureSkillExecutionSnapshot,
|
|
38
|
+
describeSkillExecutionAuthority,
|
|
39
|
+
executionIdentityMetadata,
|
|
40
|
+
isSkillExecutionContext,
|
|
41
|
+
skillDigestDriftError,
|
|
42
|
+
skillIdentityChangedError,
|
|
43
|
+
skillReauthorizationError,
|
|
44
|
+
skillTrustRequiredError,
|
|
45
|
+
} from "./skill-execution-identity.js";
|
|
35
46
|
|
|
36
47
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
37
48
|
|
|
@@ -235,7 +246,9 @@ function readSkillFrontmatter(skillMd, maxBytes = 256 * 1024) {
|
|
|
235
246
|
if (read <= 0) break;
|
|
236
247
|
chunks.push(chunk.subarray(0, read));
|
|
237
248
|
total += read;
|
|
238
|
-
const prefix = Buffer.concat(chunks)
|
|
249
|
+
const prefix = Buffer.concat(chunks)
|
|
250
|
+
.toString("utf-8")
|
|
251
|
+
.replace(/^\uFEFF/, "");
|
|
239
252
|
const firstLineEnd = prefix.search(/\r?\n/);
|
|
240
253
|
if (firstLineEnd >= 0 && prefix.slice(0, firstLineEnd).trim() !== "---") {
|
|
241
254
|
return {};
|
|
@@ -325,10 +338,24 @@ export function prepareSkillBody(skill, args) {
|
|
|
325
338
|
* Multi-layer CLI skill loader
|
|
326
339
|
*/
|
|
327
340
|
export class CLISkillLoader {
|
|
328
|
-
constructor({
|
|
341
|
+
constructor({
|
|
342
|
+
contextLedger = contextSourceLedger,
|
|
343
|
+
reauthorizeSkill = null,
|
|
344
|
+
// Only package-owned, immutable-at-install sources are trusted by
|
|
345
|
+
// default. The historical "managed" layer is actually the user-writable
|
|
346
|
+
// <userData>/skills directory (and `skill add --global` writes there), so
|
|
347
|
+
// treating it as enterprise-managed would bypass first-use digest consent.
|
|
348
|
+
trustedExecutionSources = ["bundled", "cli-bundled"],
|
|
349
|
+
} = {}) {
|
|
350
|
+
if (reauthorizeSkill !== null && typeof reauthorizeSkill !== "function") {
|
|
351
|
+
throw new TypeError("reauthorizeSkill must be a function or null");
|
|
352
|
+
}
|
|
329
353
|
this._cache = null;
|
|
330
354
|
this._bodyCache = new Map();
|
|
331
355
|
this._contextLedger = contextLedger;
|
|
356
|
+
this._reauthorizeSkill = reauthorizeSkill;
|
|
357
|
+
this._trustedExecutionSources = new Set(trustedExecutionSources);
|
|
358
|
+
this._authorizedExecutionDigests = new Map();
|
|
332
359
|
this._cacheStats = {
|
|
333
360
|
descriptorScans: 0,
|
|
334
361
|
descriptorCacheHits: 0,
|
|
@@ -339,6 +366,137 @@ export class CLISkillLoader {
|
|
|
339
366
|
};
|
|
340
367
|
}
|
|
341
368
|
|
|
369
|
+
_skillReauthorizationRequest(
|
|
370
|
+
skill,
|
|
371
|
+
snapshot,
|
|
372
|
+
context,
|
|
373
|
+
{ firstUseAuthorization, contentChanged, previouslyAuthorizedDigest },
|
|
374
|
+
) {
|
|
375
|
+
return Object.freeze({
|
|
376
|
+
skill: Object.freeze({
|
|
377
|
+
id: skill.id,
|
|
378
|
+
source: skill.source,
|
|
379
|
+
skillDir: skill.skillDir,
|
|
380
|
+
}),
|
|
381
|
+
identityDigest: snapshot.identityDigest,
|
|
382
|
+
reason:
|
|
383
|
+
firstUseAuthorization && !contentChanged
|
|
384
|
+
? "first-use"
|
|
385
|
+
: firstUseAuthorization
|
|
386
|
+
? "first-use-content-drift"
|
|
387
|
+
: "content-drift",
|
|
388
|
+
previousDigest:
|
|
389
|
+
previouslyAuthorizedDigest ||
|
|
390
|
+
(contentChanged
|
|
391
|
+
? skill.executionIdentity?.contentDigest || null
|
|
392
|
+
: null),
|
|
393
|
+
discoveredDigest: skill.executionIdentity?.contentDigest || null,
|
|
394
|
+
currentDigest: snapshot.contentDigest,
|
|
395
|
+
componentDigests: Object.freeze({ ...snapshot.componentDigests }),
|
|
396
|
+
loadedBecause: context.loadedBecause || "explicit",
|
|
397
|
+
sessionId: context.sessionId || null,
|
|
398
|
+
turnId: context.turnId || null,
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
_throwSkillAuthorizationDenial(
|
|
403
|
+
skill,
|
|
404
|
+
snapshot,
|
|
405
|
+
{ firstUseAuthorization, contentChanged },
|
|
406
|
+
) {
|
|
407
|
+
if (firstUseAuthorization && !contentChanged) {
|
|
408
|
+
throw skillTrustRequiredError(skill);
|
|
409
|
+
}
|
|
410
|
+
throw skillDigestDriftError(
|
|
411
|
+
skill,
|
|
412
|
+
skill.executionIdentity?.contentDigest || null,
|
|
413
|
+
snapshot.contentDigest,
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Await an execution-digest decision without weakening the synchronous
|
|
419
|
+
* loader API. IDE/CLI hosts may provide an async `reauthorizeSkill` callback;
|
|
420
|
+
* callers without one remain fail-closed. The digest is checked again by
|
|
421
|
+
* materializeSkillForExecution after the await, closing the prompt-time race.
|
|
422
|
+
*/
|
|
423
|
+
async _authorizeSkillExecutionDigest(skill, context = {}) {
|
|
424
|
+
const snapshot = captureSkillExecutionSnapshot({
|
|
425
|
+
skillDir: skill.skillDir,
|
|
426
|
+
skillId: skill.id,
|
|
427
|
+
source: skill.source,
|
|
428
|
+
});
|
|
429
|
+
const discovered = skill.executionIdentity;
|
|
430
|
+
if (
|
|
431
|
+
!discovered ||
|
|
432
|
+
discovered.identityDigest !== snapshot.identityDigest ||
|
|
433
|
+
discovered.handlerPresent !== snapshot.handlerPresent
|
|
434
|
+
) {
|
|
435
|
+
throw skillIdentityChangedError(skill);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
if (
|
|
439
|
+
isSkillExecutionContext(context) &&
|
|
440
|
+
skill.hasHandler === true &&
|
|
441
|
+
(skill.isolation !== true || context.loadedBecause !== "run_skill")
|
|
442
|
+
) {
|
|
443
|
+
assertControlledSkillExecution(skill, context);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
const contentChanged = discovered.contentDigest !== snapshot.contentDigest;
|
|
447
|
+
const executionRequiresTrust =
|
|
448
|
+
isSkillExecutionContext(context) &&
|
|
449
|
+
skill.hasHandler === true &&
|
|
450
|
+
!this._trustedExecutionSources.has(String(skill.source || ""));
|
|
451
|
+
const previouslyAuthorizedDigest = this._authorizedExecutionDigests.get(
|
|
452
|
+
snapshot.identityDigest,
|
|
453
|
+
);
|
|
454
|
+
const digestAuthorized =
|
|
455
|
+
previouslyAuthorizedDigest === snapshot.contentDigest;
|
|
456
|
+
const firstUseAuthorization = executionRequiresTrust && !digestAuthorized;
|
|
457
|
+
if ((!contentChanged && !firstUseAuthorization) || digestAuthorized) {
|
|
458
|
+
return executionIdentityMetadata(snapshot);
|
|
459
|
+
}
|
|
460
|
+
if (!this._reauthorizeSkill) {
|
|
461
|
+
this._throwSkillAuthorizationDenial(skill, snapshot, {
|
|
462
|
+
firstUseAuthorization,
|
|
463
|
+
contentChanged,
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
let decision;
|
|
468
|
+
try {
|
|
469
|
+
decision = await this._reauthorizeSkill(
|
|
470
|
+
this._skillReauthorizationRequest(skill, snapshot, context, {
|
|
471
|
+
firstUseAuthorization,
|
|
472
|
+
contentChanged,
|
|
473
|
+
previouslyAuthorizedDigest,
|
|
474
|
+
}),
|
|
475
|
+
);
|
|
476
|
+
} catch (cause) {
|
|
477
|
+
throw skillReauthorizationError(skill, cause);
|
|
478
|
+
}
|
|
479
|
+
if (decision !== true && decision?.authorized !== true) {
|
|
480
|
+
this._throwSkillAuthorizationDenial(skill, snapshot, {
|
|
481
|
+
firstUseAuthorization,
|
|
482
|
+
contentChanged,
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
this._authorizedExecutionDigests.set(
|
|
486
|
+
snapshot.identityDigest,
|
|
487
|
+
snapshot.contentDigest,
|
|
488
|
+
);
|
|
489
|
+
return executionIdentityMetadata(snapshot);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
async materializeSkillForExecution(skill, context = {}) {
|
|
493
|
+
const executionContext = { ...context, forExecution: true };
|
|
494
|
+
await this._authorizeSkillExecutionDigest(skill, executionContext);
|
|
495
|
+
// Re-capture and re-check after a potentially human-blocking async prompt.
|
|
496
|
+
// materializeSkill recognizes only the exact digest authorized above.
|
|
497
|
+
return this.materializeSkill(skill, executionContext);
|
|
498
|
+
}
|
|
499
|
+
|
|
342
500
|
/**
|
|
343
501
|
* Get paths for each layer
|
|
344
502
|
* @returns {{ layer: string, path: string, exists: boolean }[]}
|
|
@@ -496,9 +654,17 @@ export class CLISkillLoader {
|
|
|
496
654
|
try {
|
|
497
655
|
const data = readSkillFrontmatter(skillMd);
|
|
498
656
|
const stat = fs.statSync(skillMd);
|
|
657
|
+
const id = data.name || entry.name;
|
|
658
|
+
const isolation = data.isolation === true;
|
|
659
|
+
const snapshot = captureSkillExecutionSnapshot({
|
|
660
|
+
skillDir,
|
|
661
|
+
skillId: id,
|
|
662
|
+
source: layer,
|
|
663
|
+
});
|
|
664
|
+
const hasHandler = snapshot.handlerPresent;
|
|
499
665
|
|
|
500
666
|
out.push({
|
|
501
|
-
id
|
|
667
|
+
id,
|
|
502
668
|
displayName: data.displayName || entry.name,
|
|
503
669
|
description: data.description || "",
|
|
504
670
|
version: data.version || "1.0.0",
|
|
@@ -518,17 +684,22 @@ export class CLISkillLoader {
|
|
|
518
684
|
// context). null (the default) = applies everywhere.
|
|
519
685
|
paths: normalizeSkillPaths(data),
|
|
520
686
|
dirName: entry.name,
|
|
521
|
-
hasHandler
|
|
522
|
-
isolation
|
|
687
|
+
hasHandler,
|
|
688
|
+
isolation,
|
|
689
|
+
executionIdentity: executionIdentityMetadata(snapshot),
|
|
690
|
+
executionAuthority: describeSkillExecutionAuthority({
|
|
691
|
+
hasHandler,
|
|
692
|
+
isolation,
|
|
693
|
+
}),
|
|
523
694
|
// Two-tier loading: discovery retains only the descriptor. The body
|
|
524
695
|
// and embedded MCP declarations are populated on first use.
|
|
525
696
|
body: null,
|
|
526
697
|
bodyLoaded: false,
|
|
527
698
|
mcpServers: [],
|
|
528
699
|
source: layer,
|
|
529
|
-
skillDir,
|
|
530
|
-
skillMdPath:
|
|
531
|
-
skillFileBytes:
|
|
700
|
+
skillDir: snapshot.rootRealPath,
|
|
701
|
+
skillMdPath: path.join(snapshot.rootRealPath, "SKILL.md"),
|
|
702
|
+
skillFileBytes: snapshot.skillFileBytes,
|
|
532
703
|
skillFileMtimeMs: stat.mtimeMs,
|
|
533
704
|
});
|
|
534
705
|
} catch {
|
|
@@ -539,23 +710,134 @@ export class CLISkillLoader {
|
|
|
539
710
|
|
|
540
711
|
/**
|
|
541
712
|
* Materialize a descriptor's markdown body and embedded MCP declarations.
|
|
542
|
-
*
|
|
543
|
-
*
|
|
713
|
+
* The exact SKILL.md + handler.js digest is re-read before every execution or
|
|
714
|
+
* prompt materialization. Cache entries are keyed by that digest, not mutable
|
|
715
|
+
* size/mtime metadata, and provenance records never include source content.
|
|
544
716
|
*/
|
|
545
717
|
materializeSkill(skill, context = {}) {
|
|
546
718
|
if (!skill || !skill.skillMdPath) {
|
|
547
719
|
throw new TypeError("A discovered skill descriptor is required");
|
|
548
720
|
}
|
|
549
|
-
|
|
550
|
-
const
|
|
721
|
+
|
|
722
|
+
const snapshot = captureSkillExecutionSnapshot({
|
|
723
|
+
skillDir: skill.skillDir,
|
|
724
|
+
skillId: skill.id,
|
|
725
|
+
source: skill.source,
|
|
726
|
+
});
|
|
727
|
+
const discovered = skill.executionIdentity;
|
|
728
|
+
if (
|
|
729
|
+
!discovered ||
|
|
730
|
+
discovered.identityDigest !== snapshot.identityDigest ||
|
|
731
|
+
discovered.handlerPresent !== snapshot.handlerPresent
|
|
732
|
+
) {
|
|
733
|
+
throw skillIdentityChangedError(skill);
|
|
734
|
+
}
|
|
735
|
+
if (
|
|
736
|
+
isSkillExecutionContext(context) &&
|
|
737
|
+
skill.hasHandler === true &&
|
|
738
|
+
(skill.isolation !== true || context.loadedBecause !== "run_skill")
|
|
739
|
+
) {
|
|
740
|
+
assertControlledSkillExecution(skill, context);
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
const contentChanged = discovered.contentDigest !== snapshot.contentDigest;
|
|
744
|
+
const executionRequiresTrust =
|
|
745
|
+
isSkillExecutionContext(context) &&
|
|
746
|
+
skill.hasHandler === true &&
|
|
747
|
+
!this._trustedExecutionSources.has(String(skill.source || ""));
|
|
748
|
+
const previouslyAuthorizedDigest = this._authorizedExecutionDigests.get(
|
|
749
|
+
snapshot.identityDigest,
|
|
750
|
+
);
|
|
751
|
+
const digestAuthorized =
|
|
752
|
+
previouslyAuthorizedDigest === snapshot.contentDigest;
|
|
753
|
+
const firstUseAuthorization = executionRequiresTrust && !digestAuthorized;
|
|
754
|
+
if ((contentChanged || firstUseAuthorization) && !digestAuthorized) {
|
|
755
|
+
if (!this._reauthorizeSkill) {
|
|
756
|
+
if (firstUseAuthorization && !contentChanged) {
|
|
757
|
+
throw skillTrustRequiredError(skill);
|
|
758
|
+
}
|
|
759
|
+
throw skillDigestDriftError(
|
|
760
|
+
skill,
|
|
761
|
+
discovered.contentDigest,
|
|
762
|
+
snapshot.contentDigest,
|
|
763
|
+
);
|
|
764
|
+
}
|
|
765
|
+
let decision;
|
|
766
|
+
try {
|
|
767
|
+
decision = this._reauthorizeSkill(
|
|
768
|
+
this._skillReauthorizationRequest(skill, snapshot, context, {
|
|
769
|
+
firstUseAuthorization,
|
|
770
|
+
contentChanged,
|
|
771
|
+
previouslyAuthorizedDigest,
|
|
772
|
+
}),
|
|
773
|
+
);
|
|
774
|
+
} catch (cause) {
|
|
775
|
+
throw skillReauthorizationError(skill, cause);
|
|
776
|
+
}
|
|
777
|
+
if (decision && typeof decision.then === "function") {
|
|
778
|
+
// The synchronous API cannot await an IDE/CLI decision. Observe a
|
|
779
|
+
// possible rejection so fail-closed use does not create an unhandled
|
|
780
|
+
// promise; execution callers must use materializeSkillForExecution().
|
|
781
|
+
Promise.resolve(decision).catch(() => {});
|
|
782
|
+
throw skillReauthorizationError(
|
|
783
|
+
skill,
|
|
784
|
+
new TypeError("reauthorizeSkill must return synchronously"),
|
|
785
|
+
);
|
|
786
|
+
}
|
|
787
|
+
if (decision !== true && decision?.authorized !== true) {
|
|
788
|
+
if (firstUseAuthorization && !contentChanged) {
|
|
789
|
+
throw skillTrustRequiredError(skill);
|
|
790
|
+
}
|
|
791
|
+
throw skillDigestDriftError(
|
|
792
|
+
skill,
|
|
793
|
+
discovered.contentDigest,
|
|
794
|
+
snapshot.contentDigest,
|
|
795
|
+
);
|
|
796
|
+
}
|
|
797
|
+
if (executionRequiresTrust) {
|
|
798
|
+
this._authorizedExecutionDigests.set(
|
|
799
|
+
snapshot.identityDigest,
|
|
800
|
+
snapshot.contentDigest,
|
|
801
|
+
);
|
|
802
|
+
}
|
|
803
|
+
} else if (
|
|
804
|
+
isSkillExecutionContext(context) &&
|
|
805
|
+
skill.hasHandler === true &&
|
|
806
|
+
this._trustedExecutionSources.has(String(skill.source || ""))
|
|
807
|
+
) {
|
|
808
|
+
this._authorizedExecutionDigests.set(
|
|
809
|
+
snapshot.identityDigest,
|
|
810
|
+
snapshot.contentDigest,
|
|
811
|
+
);
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
const parsed = parseSkillMd(snapshot.skillMdContent);
|
|
815
|
+
const runtimeId = parsed.data.name || skill.dirName;
|
|
816
|
+
if (String(runtimeId) !== String(skill.id)) {
|
|
817
|
+
throw skillIdentityChangedError(skill);
|
|
818
|
+
}
|
|
819
|
+
const runtimeIsolation = parsed.data.isolation === true;
|
|
820
|
+
skill.handler = parsed.data.handler || null;
|
|
821
|
+
skill.capabilities = parsed.data.capabilities || [];
|
|
822
|
+
skill.isolation = runtimeIsolation;
|
|
823
|
+
skill.executionIdentity = executionIdentityMetadata(snapshot);
|
|
824
|
+
skill.executionAuthority = describeSkillExecutionAuthority({
|
|
825
|
+
hasHandler: skill.hasHandler,
|
|
826
|
+
isolation: runtimeIsolation,
|
|
827
|
+
});
|
|
828
|
+
|
|
829
|
+
// This is deliberately after fresh parsing/digest verification: a changed
|
|
830
|
+
// `isolation` field cannot reuse the descriptor's old authority decision.
|
|
831
|
+
assertControlledSkillExecution(skill, context);
|
|
832
|
+
|
|
833
|
+
const signature = snapshot.contentDigest;
|
|
551
834
|
let cached = this._bodyCache.get(skill.skillMdPath);
|
|
552
835
|
let cacheRead = false;
|
|
553
836
|
if (cached?.signature === signature) {
|
|
554
837
|
this._cacheStats.bodyCacheHits += 1;
|
|
555
838
|
cacheRead = true;
|
|
556
839
|
} else {
|
|
557
|
-
const
|
|
558
|
-
const { body } = parseSkillMd(content);
|
|
840
|
+
const { body } = parsed;
|
|
559
841
|
cached = {
|
|
560
842
|
signature,
|
|
561
843
|
body,
|
|
@@ -570,8 +852,8 @@ export class CLISkillLoader {
|
|
|
570
852
|
skill.body = cached.body;
|
|
571
853
|
skill.mcpServers = cached.mcpServers;
|
|
572
854
|
skill.bodyLoaded = true;
|
|
573
|
-
skill.skillFileBytes =
|
|
574
|
-
skill.skillFileMtimeMs =
|
|
855
|
+
skill.skillFileBytes = snapshot.skillFileBytes;
|
|
856
|
+
skill.skillFileMtimeMs = fs.statSync(skill.skillMdPath).mtimeMs;
|
|
575
857
|
|
|
576
858
|
const prior = this._cacheStats.bodyLoads.get(skill.skillMdPath) || {
|
|
577
859
|
id: skill.id,
|
|
@@ -604,8 +886,7 @@ export class CLISkillLoader {
|
|
|
604
886
|
// Only text that actually entered a model prompt consumes context
|
|
605
887
|
// tokens. Ordinary run_skill materialization is still recorded, but
|
|
606
888
|
// as a content-size/cache observation rather than a false token charge.
|
|
607
|
-
tokenCount:
|
|
608
|
-
context.bodyIncluded === true ? cached.estimatedTokens : 0,
|
|
889
|
+
tokenCount: context.bodyIncluded === true ? cached.estimatedTokens : 0,
|
|
609
890
|
metadata: {
|
|
610
891
|
source: skill.source,
|
|
611
892
|
loadedBecause: reason,
|