chainlesschain 0.166.9 → 0.166.13
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 +33 -0
- package/bin/chainlesschain.js +5 -0
- package/package.json +5 -2
- package/src/assets/web-panel/assets/{AIOps-DJvpifGx.js → AIOps-BN25cNOD.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-D2UhuF_A.js → ActionButton-Da9IP-m5.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C9ho9obu.js → Analytics-D7hkEvQm.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BvRCpFK3.js → AppLayout-CCV4Xnbc.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-jxrySvpk.js → Artifacts-CVSnVJeA.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-ovEw0ZYl.js → Audit-CuYdw5Ag.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-D7H5z6zS.js → BackgroundAgents-DZCnK-Tf.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BuXob8za.js → Backup-cV9FdpTy.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CtnszuQ2.js → BaseInput-BRnv6YSp.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-B_mYE8fJ.js → Chat-Bw5w87P4.js} +6 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-C0GjtUAw.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-ierdtcJD.js → Checkbox-DaoTqcdt.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-3VKPJD_B.js → Codegen-B4dYcEIi.js} +1 -1
- package/src/assets/web-panel/assets/{Col-1EdMyf5P.js → Col-mAhuOeuD.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D6H7UA8K.js → Community-BK6KEdBk.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BBAZvYIm.js → Compact-CCglmNu5.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CgsTrAoj.js → Compliance-Cm8S4of7.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-tnZgLoTE.js → Cowork-Dhs1QLMe.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-CPpZw2Nh.js → Cron-CLlhmXWk.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BymBcp5z.js → Crosschain-BnHVbaNs.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DKPxS_K1.js → DID-UzQP9-0O.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DvJhEmH9.js → Dashboard-CBdlPClz.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-b8iQyQIZ.js → Dropdown-axIRPdq1.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer--0-A-zKb.js → EmailListRenderer-DUalW5rx.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-C12iDN06.js → FamilyGuardDashboard-Bl4W9luY.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BRhaE2Z8.js → Federation-C1yP-uEu.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C4dnq7yf.js → FormItemContext-Xh6Ig5q8.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CGAdbR5n.js → GenericCardRenderer-C2cz3bt2.js} +1 -1
- package/src/assets/web-panel/assets/{Git-4eA2fYzL.js → Git-C_z63ixg.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BJuY9Y-9.js → Governance-BYqB33_3.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DZ5Dy4up.js → Inference-CEULuArm.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BMTjRs4A.js → KnowledgeGraph-fgMsu-0H.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BKEeQEfJ.js → Logs-DO9Hdcec.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BkrK04xW.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Dhho4fEg.js → Marketplace-B8zyLiFe.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BW6xxSlU.js → McpTools-BLAN2mWW.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-mPqlpSkq.js → Memory-CrQcFM7u.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Cb9N_DQI.js → MobileBridge-DVnyiiU-.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BNs8tah_.js → MobileProjects-qjCME5OD.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CaxBt8tn.js → Mtc-4JE3C3It.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-DRPQbp3t.js → MtcAudit-CjBuak9I.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CRm-d8bK.js → Multisig-BtPcYQcC.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BCCk3LPs.js → NLProgramming-Cx653_Ba.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cv8SN8gN.js → Notes-CkuD3YzS.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-CggIvTh5.js → NotificationSettings-BgNgU7HH.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BW3_bV12.js → OrderTableRenderer-BTC8W0a-.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BuRE-VCO.js → Organization-Dmd4Hjxz.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DBrm1gju.js → Overflow-C_5DA-G0.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CWVnDYgS.js → P2P-uwslV4XC.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-8RKUIpte.js → PdhVaultBrowser-CuNgwVnX.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-tDUAxogW.js → Permissions-CJayVX9H.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dv2-CFis.js → PersonalDataHub-Cb05H5go.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DM6kvFni.js → Pipeline-BZlGKapZ.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DzK-yL0d.js → Privacy-BIzZWYzd.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B5UrNpkj.js → ProjectInit-vEYYyQXQ.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CxJD43oW.js → ProjectSettings-MZqTy5CC.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CRARUOl8.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CYl4jRYK.js → Providers-80VAK8PX.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DeH2T0fH.js → QrScannerModal-CzRSoIwK.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Bw9k_kTk.js → QuickAsk-BpwQ2n4C.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Bl_jGwoi.js → Recommend-BC03TZ79.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-d6u01Kq0.js → RemoteSession-DE59-jaa.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Ds_Dfr-k.js → Reputation-DOHmeWyA.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BpQUQTNj.js → Row-hc5RZl1D.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BatpZBGt.js → RssFeed-Cv5uMP7E.js} +3 -3
- package/src/assets/web-panel/assets/{Search-D7hOObzi.js → Search-qohu7Ug0.js} +1 -1
- package/src/assets/web-panel/assets/{Security-dXQ4FKNt.js → Security-drCPFWV5.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D8wInGPa.js → Services-BAEgUeRy.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DXQCoYpM.js → Skeleton-CkJkKBlo.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-D3oLRIVn.js → Skills-bMuKEpez.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BmP4-LnJ.js → Sla-DxWQVHRC.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DLj-xzro.js → SpeechSettings-BpS8idmV.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-8KKaaRMr.js → SyncSettings-BPBLlW5v.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-GyK42I7C.js → Tasks-C4SLEeUh.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-n1y_8UBG.js → Templates-r-wfU39U.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-B39nBph8.js → Tenant-C7vjRmLN.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DCQoOKXe.js → Terminal-DdzeFCV2.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BkhbDfXk.js → TimelineRenderer-CYyWN2KD.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BeHIIU8D.js → Tokens-D8A9osUg.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BHvWXVOb.js → Trigger-DBvrNlyS.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-y2WaOSto.js → Trust-DBVAGc7o.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DBFeJBzt.js → UkeySign-C1vQUCRJ.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BEOWitC-.js → VideoEditing-BKs4dah4.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BITedTe6.js → Wallet-ByIuj3lD.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DMwlJVin.js → WebAuthn-DYlAFCm9.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-CKfGFEu1.js → WorkflowEditor-Dwyadd0c.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DR6gnBGF.js → chat-Bm2f3s08.js} +1 -1
- package/src/assets/web-panel/assets/{colors-C_Hw5NCn.js → colors-C8ORSh7V.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-B8IPwsEu.js → compact-item-1iVlnsM-.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-D-u4JVnJ.js → createContext-CmqNyUSL.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-B69RCDDH.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CZubdS4D.js → hasIn-rUMaX3Ul.js} +1 -1
- package/src/assets/web-panel/assets/index-9biMQ-tw.js +1 -0
- package/src/assets/web-panel/assets/{index-C25rOz7O.js → index-B53c3diB.js} +1 -1
- package/src/assets/web-panel/assets/{index-CfniPP5p.js → index-B59OWAs7.js} +1 -1
- package/src/assets/web-panel/assets/{index-11ASqx-A.js → index-B8BrB0Ls.js} +1 -1
- package/src/assets/web-panel/assets/{index-auyNYjLo.js → index-BC32_0xT.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ctje8Vl3.js → index-BC8Wb6cy.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cg2bCeol.js → index-BCOhTILd.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1w96gg9.js → index-BFniLMn9.js} +1 -1
- package/src/assets/web-panel/assets/{index-k1Xa5iw1.js → index-BIvM-uAX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DuOU5apg.js → index-BK-RY0-7.js} +1 -1
- package/src/assets/web-panel/assets/{index-D47jt8ET.js → index-BQL9r73Y.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2VmtNaQ.js → index-BVtnizyC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bizm87cX.js → index-Bf1PlIHp.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dt-w3xQ7.js → index-Bgw4Y2rU.js} +1 -1
- package/src/assets/web-panel/assets/{index-ffe7bvqP.js → index-BgwLNxmr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cl5RpreD.js → index-C-J5-pGH.js} +1 -1
- package/src/assets/web-panel/assets/{index-idZKyADQ.js → index-C-ZIHi42.js} +1 -1
- package/src/assets/web-panel/assets/{index-LvjAKDSl.js → index-C3B1S-mW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmRcgiYT.js → index-C5RfRciU.js} +1 -1
- package/src/assets/web-panel/assets/{index-rYBHSDcJ.js → index-CCEyz58d.js} +1 -1
- package/src/assets/web-panel/assets/index-COie87kl.js +1 -0
- package/src/assets/web-panel/assets/{index-DcFjRT-K.js → index-CTfEmKK0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjRrqooR.js → index-CfiHyVyl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpjHpRoq.js → index-CkFvuAex.js} +3 -3
- package/src/assets/web-panel/assets/{index-BzoFanEQ.js → index-D98FXb0w.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cbm8F0M2.js → index-DDHk911Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXS6wYJZ.js → index-DJxtPFOh.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY6MHo9D.js → index-DVJ1uKf4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiXkhOkY.js → index-Dcck8QfW.js} +1 -1
- package/src/assets/web-panel/assets/{index-mYZJxGH6.js → index-DgUE51Pz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqmLw8cs.js → index-Dsve5Gkv.js} +1 -1
- package/src/assets/web-panel/assets/{index-xoNssgz_.js → index-DvedhJeM.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfnzrUxU.js → index-DwMdWKiF.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bi21Etg4.js → index-OcbzdRpT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJ6pG79m.js → index-fPK6GFEg.js} +1 -1
- package/src/assets/web-panel/assets/{index-_nL79NT8.js → index-geQinnns.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTosx2Wu.js → index-pHWA7bmM.js} +1 -1
- package/src/assets/web-panel/assets/{index-cVqbas5C.js → index-reUHhuz8.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bv2132PO.js → index-tqTx5wXo.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-lcU_dT2r.js → initDefaultProps-CuA-cpkL.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Dc7UNXZ1.js → motion-CimmE_9b.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cll8ZXaL.js → move-DlGlrltz.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CAb_yLIM.js → mtc-parser-CK6BJQ07.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DurYMyTe.js → omit-BKjBfZfB.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BITQyOlw.js → pickAttrs-B2chVYw9.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Dg1rH91i.js → placementArrow-BW8aLJJ3.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-D_EWIeac.js → responsiveObserve-dXlPl66S.js} +1 -1
- package/src/assets/web-panel/assets/{slide-lK4d3zsh.js → slide-hSa89S4G.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Bflq-Git.js → statusUtils-DM6KLt-s.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Ccp0I-wt.js → styleChecker-C9MQAK15.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CYZbByYA.js → useFlexGapSupport-BpQDpP0z.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-B_x0nxFD.js → useFs-C7rtRViA.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DW55rL85.js → usePersonalDataHub-Dm15xafq.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Ca6MH3W8.js → vnode-mEiEytw4.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-NdHelOog.js → zoom-DzPxflhY.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +5 -5
- package/src/commands/agent.js +51 -20
- package/src/commands/compact.js +349 -3
- package/src/commands/context.js +72 -1
- package/src/commands/graph.js +26 -15
- package/src/commands/hmemory.js +21 -0
- package/src/commands/hook.js +256 -28
- package/src/commands/memory.js +209 -42
- package/src/commands/promcomp.js +17 -0
- package/src/commands/serve.js +94 -10
- package/src/commands/session.js +2 -3
- package/src/commands/team.js +7 -1
- package/src/data/changelog.json +41 -2
- package/src/gateways/ws/session-core-protocol.js +62 -3
- package/src/gateways/ws/session-protocol.js +123 -15
- package/src/gateways/ws/ws-agent-handler.js +157 -9
- package/src/gateways/ws/ws-session-gateway.js +204 -30
- package/src/generated/cc-agent-protocol.schema.json +2094 -4
- package/src/harness/prompt-compressor.js +5 -55
- package/src/lib/agent-sandbox.js +14 -4
- package/src/lib/agent-team/team-distributed-graph-bridge.js +3 -3
- package/src/lib/app-server/context-memory-notifications.js +54 -0
- package/src/lib/app-server/rollout-store-factory.js +115 -0
- package/src/lib/app-server/rollout-store.js +310 -23
- package/src/lib/app-server/server.js +184 -7
- package/src/lib/app-server/sqlite-rollout-store.js +59 -16
- package/src/lib/auto-mode-config.js +26 -0
- package/src/lib/causal-observability.js +13 -1
- package/src/lib/context-memory-kernel/authority.js +95 -0
- package/src/lib/context-memory-kernel/durable-memory-port.js +296 -0
- package/src/lib/context-memory-kernel/index.js +8 -0
- package/src/lib/context-memory-kernel/jsonl-session-context-port.js +232 -0
- package/src/lib/context-memory-kernel/live-compaction.js +375 -0
- package/src/lib/context-memory-kernel/memory-service.js +667 -0
- package/src/lib/context-memory-kernel/message-adapter.js +451 -0
- package/src/lib/context-memory-kernel/privacy-purge-port.js +244 -0
- package/src/lib/context-memory-kernel/provider-context.js +192 -0
- package/src/lib/context-memory-kernel/runtime.js +61 -0
- package/src/lib/direct-model-usage.js +22 -18
- package/src/lib/graph-kernel/cutover-authority-resolver.js +4 -5
- package/src/lib/graph-kernel/cutover-ledger.js +2 -2
- package/src/lib/graph-kernel/event-store.js +3 -5
- package/src/lib/graph-kernel/index.js +2 -0
- package/src/lib/graph-kernel/migration-saga.js +2 -2
- package/src/lib/graph-kernel/production-cutover-evidence.js +976 -0
- package/src/lib/graph-kernel/retirement-evidence.js +12 -4
- package/src/lib/hierarchical-memory.js +22 -0
- package/src/lib/hook-audit-store.js +170 -0
- package/src/lib/hook-event-bus.cjs +0 -0
- package/src/lib/hook-manager.js +25 -83
- package/src/lib/hook-runtime-adapters.js +233 -0
- package/src/lib/hook-runtime-contract.cjs +291 -0
- package/src/lib/hook-runtime-contract.js +21 -0
- package/src/lib/hook-trust.js +210 -0
- package/src/lib/hooks-v2-producers.js +52 -6
- package/src/lib/hooks-v2-runtime.js +443 -178
- package/src/lib/llm-pricing.js +10 -0
- package/src/lib/memory-manager.js +29 -4
- package/src/lib/model-context-window.js +52 -0
- package/src/lib/permanent-memory.js +17 -0
- package/src/lib/plan-mode.js +8 -4
- package/src/lib/process-execution-broker/index.js +208 -16
- package/src/lib/runtime-usage-ledger.js +20 -0
- package/src/lib/session-consolidator.js +59 -0
- package/src/lib/session-core-singletons.js +17 -4
- package/src/lib/session-hooks.js +29 -2
- package/src/lib/session-transcript-migration.js +188 -0
- package/src/lib/settings-hook-events.cjs +37 -401
- package/src/lib/settings-hook-events.js +210 -8
- package/src/lib/settings-hooks.cjs +42 -83
- package/src/lib/ws-session-manager.js +4 -1
- package/src/repl/agent-repl.js +186 -53
- package/src/runtime/agent-core.js +376 -350
- package/src/runtime/headless-runner.js +40 -33
- package/src/runtime/headless-stream.js +131 -30
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DaiA6CsX.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-B05DgASC.js +0 -1
- package/src/assets/web-panel/assets/Projects-Z2Orm8Ma.js +0 -1
- package/src/assets/web-panel/assets/devWarning-Cq6lSd_q.js +0 -1
- package/src/assets/web-panel/assets/index-BQ3213fz.js +0 -1
- package/src/assets/web-panel/assets/index-vJagfET2.js +0 -1
|
@@ -1,10 +1,216 @@
|
|
|
1
|
-
import { runHooks } from "./hook-runner.js";
|
|
2
1
|
import events from "./settings-hook-events.cjs";
|
|
2
|
+
import { executeHooksV2Event } from "./hooks-v2-producers.js";
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export const { withDeliveryId, partitionAsyncHooks } = events;
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
function canonicalContext(results = []) {
|
|
7
|
+
const values = [];
|
|
8
|
+
for (const entry of results) {
|
|
9
|
+
if (entry?.status !== "success" || !entry.result) continue;
|
|
10
|
+
const result = entry.result;
|
|
11
|
+
const value =
|
|
12
|
+
typeof result.additionalContext === "string"
|
|
13
|
+
? result.additionalContext
|
|
14
|
+
: typeof result.raw === "string"
|
|
15
|
+
? result.raw
|
|
16
|
+
: null;
|
|
17
|
+
const text = value?.trim();
|
|
18
|
+
if (text) values.push(text);
|
|
19
|
+
}
|
|
20
|
+
return values.length > 0 ? values.join("\n") : null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function aggregateContext(results = []) {
|
|
24
|
+
return canonicalContext(results) || events.aggregateContext(results);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function executeCanonicalSettingsEvent(
|
|
28
|
+
settingsHooks,
|
|
29
|
+
event,
|
|
30
|
+
payload,
|
|
31
|
+
{ cwd, matchTarget, failClosed = false, supervisor, broker } = {},
|
|
32
|
+
) {
|
|
33
|
+
const envelope = withDeliveryId(event, {
|
|
34
|
+
...payload,
|
|
35
|
+
hook_event_name: event,
|
|
36
|
+
cwd: cwd || payload.cwd || null,
|
|
37
|
+
});
|
|
38
|
+
return executeHooksV2Event(event, envelope, {
|
|
39
|
+
settingsHooks,
|
|
40
|
+
matchTarget: matchTarget || "",
|
|
41
|
+
cwd: cwd || payload.cwd || process.cwd(),
|
|
42
|
+
failClosed,
|
|
43
|
+
asyncDispatcher:
|
|
44
|
+
supervisor && typeof supervisor.dispatch === "function"
|
|
45
|
+
? (hook, context) =>
|
|
46
|
+
supervisor.dispatch([hook.legacyHook || hook], context, {
|
|
47
|
+
cwd: cwd || payload.cwd || process.cwd(),
|
|
48
|
+
broker,
|
|
49
|
+
})
|
|
50
|
+
: null,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export async function runUserPromptSubmitHooks(
|
|
55
|
+
settingsHooks,
|
|
56
|
+
{ prompt, cwd, sessionId } = {},
|
|
57
|
+
) {
|
|
58
|
+
const outcome = await executeCanonicalSettingsEvent(
|
|
59
|
+
settingsHooks,
|
|
60
|
+
"UserPromptSubmit",
|
|
61
|
+
{ prompt: String(prompt || ""), cwd, session_id: sessionId || null },
|
|
62
|
+
{ cwd, failClosed: true },
|
|
63
|
+
);
|
|
64
|
+
const result = {
|
|
65
|
+
blocked: outcome.blocked || outcome.decision === "ask",
|
|
66
|
+
additionalContext: canonicalContext(outcome.results),
|
|
67
|
+
};
|
|
68
|
+
const reason = outcome.blockingResult?.reason || null;
|
|
69
|
+
const hook = outcome.results?.find((entry) =>
|
|
70
|
+
["block", "ask"].includes(entry.decision),
|
|
71
|
+
)?.hookId;
|
|
72
|
+
if (reason) result.reason = reason;
|
|
73
|
+
if (hook) result.hook = hook;
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export async function runSessionStartHooks(
|
|
78
|
+
settingsHooks,
|
|
79
|
+
{ source, cwd, sessionId } = {},
|
|
80
|
+
) {
|
|
81
|
+
const outcome = await executeCanonicalSettingsEvent(
|
|
82
|
+
settingsHooks,
|
|
83
|
+
"SessionStart",
|
|
84
|
+
{
|
|
85
|
+
source: source || "startup",
|
|
86
|
+
cwd,
|
|
87
|
+
session_id: sessionId || null,
|
|
88
|
+
},
|
|
89
|
+
{ cwd, matchTarget: source || "" },
|
|
90
|
+
);
|
|
91
|
+
return { additionalContext: canonicalContext(outcome.results) };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export async function runCwdChangedHooks(
|
|
95
|
+
settingsHooks,
|
|
96
|
+
{ oldCwd, newCwd, cwd, sessionId } = {},
|
|
97
|
+
) {
|
|
98
|
+
const targetCwd = newCwd || cwd;
|
|
99
|
+
const outcome = await executeCanonicalSettingsEvent(
|
|
100
|
+
settingsHooks,
|
|
101
|
+
"CwdChanged",
|
|
102
|
+
{
|
|
103
|
+
old_cwd: oldCwd || null,
|
|
104
|
+
cwd: targetCwd || null,
|
|
105
|
+
session_id: sessionId || null,
|
|
106
|
+
},
|
|
107
|
+
{ cwd: targetCwd, matchTarget: newCwd || "" },
|
|
108
|
+
);
|
|
109
|
+
return { additionalContext: canonicalContext(outcome.results) };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export async function runWorktreeCreateHooks(
|
|
113
|
+
settingsHooks,
|
|
114
|
+
{ worktreePath, branch, baseSha, cwd, sessionId } = {},
|
|
115
|
+
) {
|
|
116
|
+
const targetCwd = cwd || worktreePath;
|
|
117
|
+
const outcome = await executeCanonicalSettingsEvent(
|
|
118
|
+
settingsHooks,
|
|
119
|
+
"WorktreeCreate",
|
|
120
|
+
{
|
|
121
|
+
worktree_path: worktreePath || null,
|
|
122
|
+
branch: branch || null,
|
|
123
|
+
base_sha: baseSha || null,
|
|
124
|
+
cwd: targetCwd || null,
|
|
125
|
+
session_id: sessionId || null,
|
|
126
|
+
},
|
|
127
|
+
{ cwd: targetCwd, matchTarget: branch || "" },
|
|
128
|
+
);
|
|
129
|
+
return { additionalContext: canonicalContext(outcome.results) };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export async function runWorktreeRemoveHooks(
|
|
133
|
+
settingsHooks,
|
|
134
|
+
{ worktreePath, branch, removed, reason, cwd, sessionId } = {},
|
|
135
|
+
) {
|
|
136
|
+
const targetCwd = cwd || worktreePath;
|
|
137
|
+
const outcome = await executeCanonicalSettingsEvent(
|
|
138
|
+
settingsHooks,
|
|
139
|
+
"WorktreeRemove",
|
|
140
|
+
{
|
|
141
|
+
worktree_path: worktreePath || null,
|
|
142
|
+
branch: branch || null,
|
|
143
|
+
removed: removed === true,
|
|
144
|
+
reason: reason || null,
|
|
145
|
+
cwd: targetCwd || null,
|
|
146
|
+
session_id: sessionId || null,
|
|
147
|
+
},
|
|
148
|
+
{ cwd: targetCwd, matchTarget: branch || "" },
|
|
149
|
+
);
|
|
150
|
+
return { additionalContext: canonicalContext(outcome.results) };
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export async function runInstructionsLoadedHooks(
|
|
154
|
+
settingsHooks,
|
|
155
|
+
{ files, cwd, sessionId } = {},
|
|
156
|
+
) {
|
|
157
|
+
const list = Array.isArray(files) ? files : [];
|
|
158
|
+
const outcome = await executeCanonicalSettingsEvent(
|
|
159
|
+
settingsHooks,
|
|
160
|
+
"InstructionsLoaded",
|
|
161
|
+
{
|
|
162
|
+
files: list.map((file) => ({
|
|
163
|
+
path: file?.path || null,
|
|
164
|
+
scope: file?.scope || null,
|
|
165
|
+
truncated: file?.truncated === true,
|
|
166
|
+
})),
|
|
167
|
+
count: list.length,
|
|
168
|
+
cwd: cwd || null,
|
|
169
|
+
session_id: sessionId || null,
|
|
170
|
+
},
|
|
171
|
+
{ cwd },
|
|
172
|
+
);
|
|
173
|
+
return { additionalContext: canonicalContext(outcome.results) };
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export async function runObserveHooks(
|
|
177
|
+
settingsHooks,
|
|
178
|
+
event,
|
|
179
|
+
payload = {},
|
|
180
|
+
{ cwd, matchTarget, traceId, parentId, supervisor, broker } = {},
|
|
181
|
+
) {
|
|
182
|
+
const outcome = await executeCanonicalSettingsEvent(
|
|
183
|
+
settingsHooks,
|
|
184
|
+
event,
|
|
185
|
+
{
|
|
186
|
+
...payload,
|
|
187
|
+
...(traceId ? { trace_id: traceId } : {}),
|
|
188
|
+
...(parentId ? { parent_id: parentId } : {}),
|
|
189
|
+
},
|
|
190
|
+
{ cwd, matchTarget, supervisor, broker },
|
|
191
|
+
);
|
|
192
|
+
return {
|
|
193
|
+
...outcome,
|
|
194
|
+
reason:
|
|
195
|
+
outcome.blockingResult?.reason || outcome.blockingResult?.message || null,
|
|
196
|
+
hook:
|
|
197
|
+
outcome.results?.find((entry) =>
|
|
198
|
+
["block", "ask"].includes(entry.decision),
|
|
199
|
+
)?.hookId || null,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Async definitions are selected and scheduled exactly once by the canonical
|
|
204
|
+
// runtime. This compatibility function prevents legacy callers from dispatching
|
|
205
|
+
// the same definition a second time.
|
|
206
|
+
export function dispatchAsyncHooks() {
|
|
207
|
+
return [];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export default {
|
|
7
211
|
withDeliveryId,
|
|
212
|
+
aggregateContext,
|
|
213
|
+
partitionAsyncHooks,
|
|
8
214
|
runUserPromptSubmitHooks,
|
|
9
215
|
runSessionStartHooks,
|
|
10
216
|
runCwdChangedHooks,
|
|
@@ -12,9 +218,5 @@ export const {
|
|
|
12
218
|
runWorktreeRemoveHooks,
|
|
13
219
|
runInstructionsLoadedHooks,
|
|
14
220
|
runObserveHooks,
|
|
15
|
-
aggregateContext,
|
|
16
|
-
partitionAsyncHooks,
|
|
17
221
|
dispatchAsyncHooks,
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export default events;
|
|
222
|
+
};
|
|
@@ -30,30 +30,12 @@ const fsDefault = require("node:fs");
|
|
|
30
30
|
const crypto = require("node:crypto");
|
|
31
31
|
const { SUGGEST_UMBRELLA } = require("./permission-rules.cjs");
|
|
32
32
|
const { projectRootBase } = require("./project-root.cjs");
|
|
33
|
+
const { HOOK_EVENT_TYPES } = require("./hook-runtime-contract.cjs");
|
|
33
34
|
|
|
34
35
|
const _deps = { fs: fsDefault, homedir: () => os.homedir() };
|
|
35
36
|
|
|
36
37
|
/** Events this loader understands (PreToolUse/PostToolUse are wired first). */
|
|
37
|
-
const HOOK_EVENTS = Object.freeze(
|
|
38
|
-
"PreToolUse",
|
|
39
|
-
"PostToolUse",
|
|
40
|
-
"UserPromptSubmit",
|
|
41
|
-
"Stop",
|
|
42
|
-
"SubagentStart",
|
|
43
|
-
"SubagentStop",
|
|
44
|
-
"SessionStart",
|
|
45
|
-
"SessionResume",
|
|
46
|
-
"SessionPause",
|
|
47
|
-
"SessionEnd",
|
|
48
|
-
"ConfigChange",
|
|
49
|
-
"PreCompact",
|
|
50
|
-
"Notification",
|
|
51
|
-
"PermissionRequest",
|
|
52
|
-
"CwdChanged",
|
|
53
|
-
"WorktreeCreate",
|
|
54
|
-
"WorktreeRemove",
|
|
55
|
-
"InstructionsLoaded",
|
|
56
|
-
]);
|
|
38
|
+
const HOOK_EVENTS = Object.freeze(Object.values(HOOK_EVENT_TYPES));
|
|
57
39
|
|
|
58
40
|
/**
|
|
59
41
|
* Same hierarchy as settings-loader (user < project-root < cwd < --settings).
|
|
@@ -138,7 +120,7 @@ function managedSettingsFile(env = process.env) {
|
|
|
138
120
|
|
|
139
121
|
function attachAuthoritySource(target, source) {
|
|
140
122
|
if (!source) return target;
|
|
141
|
-
const authoritySource =
|
|
123
|
+
const authoritySource = {
|
|
142
124
|
kind:
|
|
143
125
|
source.kind === "managed"
|
|
144
126
|
? "managed"
|
|
@@ -150,7 +132,22 @@ function attachAuthoritySource(target, source) {
|
|
|
150
132
|
? path.resolve(source.sourceFile)
|
|
151
133
|
: null,
|
|
152
134
|
digest: String(source.digest || ""),
|
|
135
|
+
};
|
|
136
|
+
Object.defineProperty(authoritySource, "scope", {
|
|
137
|
+
value: ["managed", "user", "project", "explicit", "plugin"].includes(
|
|
138
|
+
source.scope,
|
|
139
|
+
)
|
|
140
|
+
? source.scope
|
|
141
|
+
: source.kind === "managed"
|
|
142
|
+
? "managed"
|
|
143
|
+
: source.kind === "plugin"
|
|
144
|
+
? "plugin"
|
|
145
|
+
: "project",
|
|
146
|
+
enumerable: false,
|
|
147
|
+
writable: false,
|
|
148
|
+
configurable: false,
|
|
153
149
|
});
|
|
150
|
+
Object.freeze(authoritySource);
|
|
154
151
|
Object.defineProperty(target, "authoritySource", {
|
|
155
152
|
value: authoritySource,
|
|
156
153
|
enumerable: true,
|
|
@@ -166,6 +163,7 @@ function appendHookBlock(merged, data, authoritySource) {
|
|
|
166
163
|
if (!block) return false;
|
|
167
164
|
let contributed = false;
|
|
168
165
|
for (const [event, groups] of Object.entries(block)) {
|
|
166
|
+
if (!HOOK_EVENTS.includes(event)) continue;
|
|
169
167
|
if (!Array.isArray(groups)) continue;
|
|
170
168
|
for (const g of groups) {
|
|
171
169
|
if (!g || typeof g !== "object" || !Array.isArray(g.hooks)) continue;
|
|
@@ -195,6 +193,14 @@ function loadHooks({
|
|
|
195
193
|
const files = [];
|
|
196
194
|
const authorityErrors = [];
|
|
197
195
|
const managedFile = managedSettingsFile(env);
|
|
196
|
+
const userSettingsFile = path.resolve(
|
|
197
|
+
_deps.homedir(),
|
|
198
|
+
".claude",
|
|
199
|
+
"settings.json",
|
|
200
|
+
);
|
|
201
|
+
const explicitSettingsFile = settingsFile
|
|
202
|
+
? path.resolve(cwd, settingsFile)
|
|
203
|
+
: null;
|
|
198
204
|
let managed = null;
|
|
199
205
|
let managedRecord = null;
|
|
200
206
|
if (_deps.fs.existsSync(managedFile)) {
|
|
@@ -237,6 +243,13 @@ function loadHooks({
|
|
|
237
243
|
kind: "settings",
|
|
238
244
|
sourceFile: record.sourceFile,
|
|
239
245
|
digest: record.digest,
|
|
246
|
+
scope:
|
|
247
|
+
path.resolve(record.sourceFile) === userSettingsFile
|
|
248
|
+
? "user"
|
|
249
|
+
: explicitSettingsFile &&
|
|
250
|
+
path.resolve(record.sourceFile) === explicitSettingsFile
|
|
251
|
+
? "explicit"
|
|
252
|
+
: "project",
|
|
240
253
|
})
|
|
241
254
|
: false;
|
|
242
255
|
if (contributed) files.push(file);
|
|
@@ -247,6 +260,7 @@ function loadHooks({
|
|
|
247
260
|
kind: "managed",
|
|
248
261
|
sourceFile: managedRecord.sourceFile,
|
|
249
262
|
digest: managedRecord.digest,
|
|
263
|
+
scope: "managed",
|
|
250
264
|
})
|
|
251
265
|
) {
|
|
252
266
|
files.push(managedFile);
|
|
@@ -364,6 +378,7 @@ function collectHooks(hooksBlock, event, toolName) {
|
|
|
364
378
|
const collected = {
|
|
365
379
|
command: h.command,
|
|
366
380
|
timeout: h.timeout,
|
|
381
|
+
priority: h.priority,
|
|
367
382
|
event,
|
|
368
383
|
async: h.async === true,
|
|
369
384
|
asyncRewake: h.asyncRewake === true,
|
|
@@ -418,47 +433,10 @@ function extractCommandHooks(data) {
|
|
|
418
433
|
return out;
|
|
419
434
|
}
|
|
420
435
|
|
|
421
|
-
/** `~/.chainlesschain/hook-trust.json` — remembered first-run acknowledgments. */
|
|
422
|
-
function hookTrustStorePath() {
|
|
423
|
-
return path.join(_deps.homedir(), ".chainlesschain", "hook-trust.json");
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
function readHookTrustStore() {
|
|
427
|
-
try {
|
|
428
|
-
const f = hookTrustStorePath();
|
|
429
|
-
if (!_deps.fs.existsSync(f)) return {};
|
|
430
|
-
const parsed = JSON.parse(_deps.fs.readFileSync(f, "utf-8"));
|
|
431
|
-
return parsed && typeof parsed === "object" ? parsed : {};
|
|
432
|
-
} catch {
|
|
433
|
-
return {}; // unreadable store → treat as nothing acknowledged
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
function writeHookTrustStore(store) {
|
|
438
|
-
try {
|
|
439
|
-
const f = hookTrustStorePath();
|
|
440
|
-
_deps.fs.mkdirSync(path.dirname(f), { recursive: true });
|
|
441
|
-
_deps.fs.writeFileSync(f, JSON.stringify(store, null, 2), "utf-8");
|
|
442
|
-
return true;
|
|
443
|
-
} catch {
|
|
444
|
-
return false; // best-effort — a failed write just re-shows the notice
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
|
|
448
436
|
/**
|
|
449
|
-
*
|
|
450
|
-
*
|
|
451
|
-
*
|
|
452
|
-
* root + cwd) carry the cloned-repo auto-execution risk that Claude-Code 2.1.195
|
|
453
|
-
* gated ("untrusted project config must require explicit consent").
|
|
454
|
-
*
|
|
455
|
-
* Returns a one-line notice (and records an acknowledgment hash) the FIRST time
|
|
456
|
-
* a project's shell-running hooks are seen — and again only if those hooks
|
|
457
|
-
* change. Returns null when there are no project hooks, the hooks are unchanged
|
|
458
|
-
* since last acknowledged, or the notice is disabled (`CC_HOOK_TRUST_NOTICE=0`,
|
|
459
|
-
* or hooks themselves are off via `CC_SETTINGS_HOOKS=0`). Best-effort: a failed
|
|
460
|
-
* store write still returns the notice (shown again next run) rather than
|
|
461
|
-
* throwing — it must never abort agent startup.
|
|
437
|
+
* Explain the canonical project-Hook trust gate without granting trust.
|
|
438
|
+
* Execution is authorized only by the shared, content-addressed workspace
|
|
439
|
+
* trust ledger (`cc hook trust`); displaying this notice is never consent.
|
|
462
440
|
*
|
|
463
441
|
* @returns {string|null}
|
|
464
442
|
*/
|
|
@@ -498,31 +476,12 @@ function projectHookTrustNotice({ cwd = process.cwd(), settingsFile } = {}) {
|
|
|
498
476
|
}
|
|
499
477
|
if (entries.length === 0) return null;
|
|
500
478
|
|
|
501
|
-
const fingerprint = entries
|
|
502
|
-
.map((e) => `${e.event}${e.matcher ?? ""}${e.command}`)
|
|
503
|
-
.sort();
|
|
504
|
-
const hash = crypto
|
|
505
|
-
.createHash("sha256")
|
|
506
|
-
.update(JSON.stringify(fingerprint))
|
|
507
|
-
.digest("hex");
|
|
508
|
-
const key = projectRootBase(cwd, { fs: _deps.fs, path }) || cwd;
|
|
509
|
-
|
|
510
|
-
const store = readHookTrustStore();
|
|
511
|
-
if (store[key] && store[key].hash === hash) return null; // already acknowledged
|
|
512
|
-
store[key] = {
|
|
513
|
-
hash,
|
|
514
|
-
files: contributing,
|
|
515
|
-
count: entries.length,
|
|
516
|
-
at: new Date().toISOString(),
|
|
517
|
-
};
|
|
518
|
-
writeHookTrustStore(store); // best-effort acknowledgment
|
|
519
|
-
|
|
520
479
|
const fileList = contributing.map((f) => ` ${f}`).join("\n");
|
|
521
480
|
return (
|
|
522
481
|
`⚠ This project's .claude/settings.json defines ${entries.length} ` +
|
|
523
|
-
`shell-running hook(s)
|
|
524
|
-
` Review them
|
|
525
|
-
`disable all hooks with CC_SETTINGS_HOOKS=0.`
|
|
482
|
+
`shell-running hook(s), currently blocked until explicitly trusted:\n${fileList}\n` +
|
|
483
|
+
` Review them, then run cc hook trust. Any content change requires ` +
|
|
484
|
+
`reapproval; disable all hooks with CC_SETTINGS_HOOKS=0.`
|
|
526
485
|
);
|
|
527
486
|
}
|
|
528
487
|
|
|
@@ -9,4 +9,7 @@
|
|
|
9
9
|
* `packages/cli/src/gateways/ws/ws-session-gateway.js` in new code.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
export {
|
|
12
|
+
export {
|
|
13
|
+
WS_SESSION_ROLLOUT_EVENT,
|
|
14
|
+
WSSessionManager,
|
|
15
|
+
} from "../gateways/ws/ws-session-gateway.js";
|