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,60 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
* (UserPromptSubmit, SessionStart, and generic observe events) that live
|
|
6
|
-
* outside the executeTool seam.
|
|
4
|
+
* CommonJS compatibility helpers for canonical settings Hook events.
|
|
7
5
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* the
|
|
11
|
-
* `fireUserPromptSubmit`) stay separate + observe-only; these settings hooks
|
|
12
|
-
* are decision-capable (block) and can inject `additionalContext`.
|
|
13
|
-
*
|
|
14
|
-
* A hook's non-block stdout becomes context to inject: a JSON
|
|
15
|
-
* `{ "additionalContext": "..." }` field, or — for convenience — plain
|
|
16
|
-
* (non-JSON) stdout text. Exit 2 / `{decision:block}` aborts the turn.
|
|
6
|
+
* This module deliberately contains no Hook executor. Legacy CJS consumers
|
|
7
|
+
* delegate to settings-hook-events.js, where settings definitions are compiled
|
|
8
|
+
* by the Hooks v2 adapter and scheduled by the one canonical runtime.
|
|
17
9
|
*/
|
|
18
10
|
|
|
19
|
-
const { collectHooks } = require("./settings-hooks.cjs");
|
|
20
|
-
const hookRunner = require("./hook-runner.cjs");
|
|
21
|
-
const _deps = { runHooks: hookRunner.runHooks };
|
|
22
11
|
const { buildHookEnvelope } = require("./hook-event-bus.cjs");
|
|
23
12
|
const hookEventLog = require("./hook-event-log.cjs");
|
|
24
13
|
|
|
25
|
-
/**
|
|
26
|
-
* Publish lifecycle events to Hooks v2 without making the legacy settings hook
|
|
27
|
-
* path depend on the ESM runtime. Payloads are deliberately reduced before
|
|
28
|
-
* publication: prompt text and file contents must never become durable hook
|
|
29
|
-
* context merely because a lifecycle producer fired.
|
|
30
|
-
*/
|
|
31
|
-
function publishHooksV2Event(event, payload = {}) {
|
|
32
|
-
const safe = { ...payload };
|
|
33
|
-
delete safe.prompt;
|
|
34
|
-
delete safe.content;
|
|
35
|
-
delete safe.files;
|
|
36
|
-
void import("./hooks-v2-producers.js")
|
|
37
|
-
.then(({ emitHooksV2Event }) => {
|
|
38
|
-
emitHooksV2Event(event, safe);
|
|
39
|
-
})
|
|
40
|
-
.catch(() => {
|
|
41
|
-
// Optional producer bridge; legacy settings hooks remain authoritative.
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Stamp a unified-bus delivery id (event_id) onto a hook payload (P2 event bus).
|
|
47
|
-
* Additive — a hook that ignores it is unaffected; a hook that reads it gets a
|
|
48
|
-
* stable per-delivery id for correlation / `cc hook replay`. traceId/parentId
|
|
49
|
-
* are threaded when the caller provides them (else null).
|
|
50
|
-
*
|
|
51
|
-
* When `CC_HOOK_EVENT_LOG` is enabled, the FULL envelope is best-effort recorded
|
|
52
|
-
* to the hash-chained hook event log so `cc hook replay <event-id>` has a real
|
|
53
|
-
* source. Recording is opt-in and never throws, so the default firing path is
|
|
54
|
-
* byte-for-byte unchanged.
|
|
55
|
-
*/
|
|
56
14
|
function withDeliveryId(event, payload, { sessionId, traceId, parentId } = {}) {
|
|
57
|
-
const
|
|
15
|
+
const envelope = buildHookEnvelope({
|
|
58
16
|
eventType: event,
|
|
59
17
|
data: payload,
|
|
60
18
|
sessionId: sessionId || payload.session_id || null,
|
|
@@ -63,386 +21,64 @@ function withDeliveryId(event, payload, { sessionId, traceId, parentId } = {}) {
|
|
|
63
21
|
});
|
|
64
22
|
if (hookEventLog.isHookEventLogEnabled()) {
|
|
65
23
|
try {
|
|
66
|
-
hookEventLog.appendHookEvent(
|
|
24
|
+
hookEventLog.appendHookEvent(envelope);
|
|
67
25
|
} catch {
|
|
68
|
-
|
|
26
|
+
// The event replay log is optional. Mandatory execution audit is handled
|
|
27
|
+
// separately by the canonical Hook audit store.
|
|
69
28
|
}
|
|
70
29
|
}
|
|
71
|
-
// trace_id/parent_id are stamped onto the DELIVERED payload only when the
|
|
72
|
-
// caller actually threaded them (agent-core context) — absent they are
|
|
73
|
-
// omitted entirely, keeping every legacy payload byte-identical.
|
|
74
30
|
return {
|
|
75
31
|
...payload,
|
|
76
|
-
event_id:
|
|
77
|
-
...(
|
|
78
|
-
...(
|
|
32
|
+
event_id: envelope.event_id,
|
|
33
|
+
...(envelope.trace_id ? { trace_id: envelope.trace_id } : {}),
|
|
34
|
+
...(envelope.parent_id ? { parent_id: envelope.parent_id } : {}),
|
|
79
35
|
};
|
|
80
36
|
}
|
|
81
37
|
|
|
82
|
-
/**
|
|
83
|
-
* Split collected hooks into the blocking (sync) set and the fire-and-forget
|
|
84
|
-
* (`async: true`) set. Only NON-decision events should dispatch async hooks —
|
|
85
|
-
* an async hook can't gate a turn it no longer blocks, so a UserPromptSubmit
|
|
86
|
-
* hook that must be able to `block` should stay sync. The caller decides which
|
|
87
|
-
* events are eligible; this is just the partition.
|
|
88
|
-
* @returns {{ sync: Array, async: Array }}
|
|
89
|
-
*/
|
|
90
38
|
function partitionAsyncHooks(hooks) {
|
|
91
39
|
const sync = [];
|
|
92
40
|
const asyncHooks = [];
|
|
93
|
-
for (const
|
|
94
|
-
if (
|
|
95
|
-
else sync.push(
|
|
41
|
+
for (const hook of hooks || []) {
|
|
42
|
+
if (hook?.async === true) asyncHooks.push(hook);
|
|
43
|
+
else sync.push(hook);
|
|
96
44
|
}
|
|
97
45
|
return { sync, async: asyncHooks };
|
|
98
46
|
}
|
|
99
47
|
|
|
100
|
-
/** Join the context emitted by the hooks that ran (additionalContext / plain stdout). */
|
|
101
48
|
function aggregateContext(results) {
|
|
102
49
|
const parts = [];
|
|
103
|
-
for (const
|
|
104
|
-
if (
|
|
105
|
-
parts.push(String(
|
|
106
|
-
} else if (
|
|
107
|
-
const
|
|
108
|
-
if (
|
|
50
|
+
for (const result of results || []) {
|
|
51
|
+
if (result?.additionalContext) {
|
|
52
|
+
parts.push(String(result.additionalContext));
|
|
53
|
+
} else if (result?.exitCode === 0 && result.stdout) {
|
|
54
|
+
const text = String(result.stdout).trim();
|
|
55
|
+
if (text && text[0] !== "{") parts.push(text);
|
|
109
56
|
}
|
|
110
57
|
}
|
|
111
58
|
return parts.length > 0 ? parts.join("\n") : null;
|
|
112
59
|
}
|
|
113
60
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
*
|
|
118
|
-
* `async: true` hooks are EXCLUDED from this blocking run — they can't gate a
|
|
119
|
-
* turn they no longer block, so a fire-and-forget hook is dispatched separately
|
|
120
|
-
* (see dispatchAsyncHooks). This keeps the sync/decision path unchanged while a
|
|
121
|
-
* long-running check runs alongside the turn.
|
|
122
|
-
* @returns {{ blocked:boolean, reason?:string, hook?:string, additionalContext:string|null }}
|
|
123
|
-
*/
|
|
124
|
-
function runUserPromptSubmitHooks(
|
|
125
|
-
settingsHooks,
|
|
126
|
-
{ prompt, cwd, sessionId } = {},
|
|
127
|
-
) {
|
|
128
|
-
publishHooksV2Event("UserPromptSubmit", {
|
|
129
|
-
cwd: cwd || null,
|
|
130
|
-
session_id: sessionId || null,
|
|
131
|
-
});
|
|
132
|
-
if (!settingsHooks) return { blocked: false, additionalContext: null };
|
|
133
|
-
const matched = collectHooks(settingsHooks, "UserPromptSubmit", "");
|
|
134
|
-
if (matched.length === 0) return { blocked: false, additionalContext: null };
|
|
135
|
-
const { sync } = partitionAsyncHooks(matched);
|
|
136
|
-
if (sync.length === 0) return { blocked: false, additionalContext: null };
|
|
137
|
-
const payload = withDeliveryId(
|
|
138
|
-
"UserPromptSubmit",
|
|
139
|
-
{
|
|
140
|
-
hook_event_name: "UserPromptSubmit",
|
|
141
|
-
prompt: String(prompt || ""),
|
|
142
|
-
cwd,
|
|
143
|
-
session_id: sessionId || null,
|
|
144
|
-
},
|
|
145
|
-
{ sessionId },
|
|
146
|
-
);
|
|
147
|
-
const outcome = _deps.runHooks(sync, payload, {
|
|
148
|
-
cwd,
|
|
149
|
-
event: "UserPromptSubmit",
|
|
150
|
-
});
|
|
151
|
-
if (outcome.decision === "block" || outcome.decision === "ask") {
|
|
152
|
-
return {
|
|
153
|
-
blocked: true,
|
|
154
|
-
reason: outcome.reason,
|
|
155
|
-
hook: outcome.hook,
|
|
156
|
-
additionalContext: null,
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
return {
|
|
160
|
-
blocked: false,
|
|
161
|
-
additionalContext: aggregateContext(outcome.results),
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Dispatch the `async: true` hooks for an event fire-and-forget onto the given
|
|
167
|
-
* supervisor (see async-hook-supervisor). Sync hooks are ignored here — they run
|
|
168
|
-
* on the blocking path. No-op (returns []) without a supervisor or async hooks,
|
|
169
|
-
* so callers can wire it unconditionally.
|
|
170
|
-
*
|
|
171
|
-
* @param {object} settingsHooks merged hooks block
|
|
172
|
-
* @param {string} event UserPromptSubmit / PostToolUse / Stop / …
|
|
173
|
-
* @param {object} payload extra fields merged into the hook stdin JSON
|
|
174
|
-
* @param {object} opts { cwd, matchTarget, supervisor }
|
|
175
|
-
* @returns {Array<{command:string, dispatched:boolean, reason?:string}>}
|
|
176
|
-
*/
|
|
177
|
-
function dispatchAsyncHooks(settingsHooks, event, payload = {}, opts = {}) {
|
|
178
|
-
const supervisor = opts.supervisor;
|
|
179
|
-
if (!settingsHooks || !supervisor) return [];
|
|
180
|
-
const matched = collectHooks(settingsHooks, event, opts.matchTarget || "");
|
|
181
|
-
if (matched.length === 0) return [];
|
|
182
|
-
const { async: asyncHooks } = partitionAsyncHooks(matched);
|
|
183
|
-
if (asyncHooks.length === 0) return [];
|
|
184
|
-
return supervisor.dispatch(
|
|
185
|
-
asyncHooks,
|
|
186
|
-
{ hook_event_name: event, cwd: opts.cwd, ...payload },
|
|
187
|
-
{ cwd: opts.cwd, broker: opts.broker },
|
|
188
|
-
);
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* SessionStart settings hooks (observe + context injection). The `source`
|
|
193
|
-
* (startup / resume / clear) is the matcher target.
|
|
194
|
-
* @returns {{ additionalContext:string|null }}
|
|
195
|
-
*/
|
|
196
|
-
function runSessionStartHooks(settingsHooks, { source, cwd, sessionId } = {}) {
|
|
197
|
-
publishHooksV2Event("SessionStart", {
|
|
198
|
-
source: source || "startup",
|
|
199
|
-
cwd: cwd || null,
|
|
200
|
-
session_id: sessionId || null,
|
|
201
|
-
});
|
|
202
|
-
if (!settingsHooks) return { additionalContext: null };
|
|
203
|
-
const matched = collectHooks(settingsHooks, "SessionStart", source || "");
|
|
204
|
-
if (matched.length === 0) return { additionalContext: null };
|
|
205
|
-
const payload = withDeliveryId(
|
|
206
|
-
"SessionStart",
|
|
207
|
-
{
|
|
208
|
-
hook_event_name: "SessionStart",
|
|
209
|
-
source: source || "startup",
|
|
210
|
-
cwd,
|
|
211
|
-
session_id: sessionId || null,
|
|
212
|
-
},
|
|
213
|
-
{ sessionId },
|
|
214
|
-
);
|
|
215
|
-
const outcome = _deps.runHooks(matched, payload, {
|
|
216
|
-
cwd,
|
|
217
|
-
event: "SessionStart",
|
|
218
|
-
});
|
|
219
|
-
return { additionalContext: aggregateContext(outcome.results) };
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* CwdChanged settings hooks (observe + context injection). Fired when the
|
|
224
|
-
* working directory changes mid-session (`/cd`) — a distinct lifecycle event
|
|
225
|
-
* (Claude-Code-parity extension) automation can react to (re-audit trust of the
|
|
226
|
-
* new dir, reload a per-dir tool config, …). Observe-only: a cwd change never
|
|
227
|
-
* gates flow, so any `block` decision is ignored and only emitted context is
|
|
228
|
-
* returned. No-op (byte-unchanged) without a registered CwdChanged hook.
|
|
229
|
-
* @returns {{ additionalContext:string|null }}
|
|
230
|
-
*/
|
|
231
|
-
function runCwdChangedHooks(
|
|
232
|
-
settingsHooks,
|
|
233
|
-
{ oldCwd, newCwd, cwd, sessionId } = {},
|
|
234
|
-
) {
|
|
235
|
-
publishHooksV2Event("CwdChanged", {
|
|
236
|
-
old_cwd: oldCwd || null,
|
|
237
|
-
cwd: newCwd || cwd || null,
|
|
238
|
-
session_id: sessionId || null,
|
|
239
|
-
});
|
|
240
|
-
if (!settingsHooks) return { additionalContext: null };
|
|
241
|
-
const matched = collectHooks(settingsHooks, "CwdChanged", newCwd || "");
|
|
242
|
-
const { sync } = partitionAsyncHooks(matched);
|
|
243
|
-
if (sync.length === 0) return { additionalContext: null };
|
|
244
|
-
const payload = withDeliveryId(
|
|
245
|
-
"CwdChanged",
|
|
246
|
-
{
|
|
247
|
-
hook_event_name: "CwdChanged",
|
|
248
|
-
old_cwd: oldCwd || null,
|
|
249
|
-
cwd: newCwd || cwd || null,
|
|
250
|
-
session_id: sessionId || null,
|
|
251
|
-
},
|
|
252
|
-
{ sessionId },
|
|
253
|
-
);
|
|
254
|
-
const outcome = _deps.runHooks(sync, payload, {
|
|
255
|
-
cwd: newCwd || cwd,
|
|
256
|
-
event: "CwdChanged",
|
|
257
|
-
});
|
|
258
|
-
return { additionalContext: aggregateContext(outcome.results) };
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
/**
|
|
262
|
-
* WorktreeCreate settings hooks (observe + context injection). Fired right after
|
|
263
|
-
* `cc agent --worktree` carves a fresh isolated git worktree — a hook can react
|
|
264
|
-
* (register the worktree with an external tracker, seed per-branch tooling,
|
|
265
|
-
* warm a build cache). The matcher target is the branch name, so a regex matcher
|
|
266
|
-
* can scope to a branch pattern. Observe-only: worktree setup already succeeded,
|
|
267
|
-
* so a `block` decision is ignored and only emitted context is returned. No-op
|
|
268
|
-
* (byte-unchanged) without a registered WorktreeCreate hook.
|
|
269
|
-
* @returns {{ additionalContext:string|null }}
|
|
270
|
-
*/
|
|
271
|
-
function runWorktreeCreateHooks(
|
|
272
|
-
settingsHooks,
|
|
273
|
-
{ worktreePath, branch, baseSha, cwd, sessionId } = {},
|
|
274
|
-
) {
|
|
275
|
-
publishHooksV2Event("WorktreeCreate", {
|
|
276
|
-
worktree_path: worktreePath || null,
|
|
277
|
-
branch: branch || null,
|
|
278
|
-
base_sha: baseSha || null,
|
|
279
|
-
cwd: cwd || worktreePath || null,
|
|
280
|
-
session_id: sessionId || null,
|
|
281
|
-
});
|
|
282
|
-
if (!settingsHooks) return { additionalContext: null };
|
|
283
|
-
const matched = collectHooks(settingsHooks, "WorktreeCreate", branch || "");
|
|
284
|
-
const { sync } = partitionAsyncHooks(matched);
|
|
285
|
-
if (sync.length === 0) return { additionalContext: null };
|
|
286
|
-
const payload = withDeliveryId(
|
|
287
|
-
"WorktreeCreate",
|
|
288
|
-
{
|
|
289
|
-
hook_event_name: "WorktreeCreate",
|
|
290
|
-
worktree_path: worktreePath || null,
|
|
291
|
-
branch: branch || null,
|
|
292
|
-
base_sha: baseSha || null,
|
|
293
|
-
cwd: cwd || worktreePath || null,
|
|
294
|
-
session_id: sessionId || null,
|
|
295
|
-
},
|
|
296
|
-
{ sessionId },
|
|
297
|
-
);
|
|
298
|
-
const outcome = _deps.runHooks(sync, payload, {
|
|
299
|
-
cwd: cwd || worktreePath,
|
|
300
|
-
event: "WorktreeCreate",
|
|
301
|
-
});
|
|
302
|
-
return { additionalContext: aggregateContext(outcome.results) };
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* WorktreeRemove settings hooks (observe + context injection). Fired when a
|
|
307
|
-
* `cc agent --worktree` session finishes and its worktree is torn down (or when
|
|
308
|
-
* a `keep` decision leaves it in place — `removed` distinguishes the two) — a
|
|
309
|
-
* hook can react (unregister the worktree, prune a per-branch cache, notify CI).
|
|
310
|
-
* Matcher target is the branch name. Observe-only: teardown already happened, so
|
|
311
|
-
* a `block` decision is ignored and only emitted context is returned. No-op
|
|
312
|
-
* (byte-unchanged) without a registered WorktreeRemove hook.
|
|
313
|
-
* @returns {{ additionalContext:string|null }}
|
|
314
|
-
*/
|
|
315
|
-
function runWorktreeRemoveHooks(
|
|
316
|
-
settingsHooks,
|
|
317
|
-
{ worktreePath, branch, removed, reason, cwd, sessionId } = {},
|
|
318
|
-
) {
|
|
319
|
-
publishHooksV2Event("WorktreeRemove", {
|
|
320
|
-
worktree_path: worktreePath || null,
|
|
321
|
-
branch: branch || null,
|
|
322
|
-
removed: removed === true,
|
|
323
|
-
reason: reason || null,
|
|
324
|
-
cwd: cwd || worktreePath || null,
|
|
325
|
-
session_id: sessionId || null,
|
|
326
|
-
});
|
|
327
|
-
if (!settingsHooks) return { additionalContext: null };
|
|
328
|
-
const matched = collectHooks(settingsHooks, "WorktreeRemove", branch || "");
|
|
329
|
-
const { sync } = partitionAsyncHooks(matched);
|
|
330
|
-
if (sync.length === 0) return { additionalContext: null };
|
|
331
|
-
const payload = withDeliveryId(
|
|
332
|
-
"WorktreeRemove",
|
|
333
|
-
{
|
|
334
|
-
hook_event_name: "WorktreeRemove",
|
|
335
|
-
worktree_path: worktreePath || null,
|
|
336
|
-
branch: branch || null,
|
|
337
|
-
removed: removed === true,
|
|
338
|
-
reason: reason || null,
|
|
339
|
-
cwd: cwd || worktreePath || null,
|
|
340
|
-
session_id: sessionId || null,
|
|
341
|
-
},
|
|
342
|
-
{ sessionId },
|
|
343
|
-
);
|
|
344
|
-
const outcome = _deps.runHooks(sync, payload, {
|
|
345
|
-
cwd: cwd || worktreePath,
|
|
346
|
-
event: "WorktreeRemove",
|
|
347
|
-
});
|
|
348
|
-
return { additionalContext: aggregateContext(outcome.results) };
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
/**
|
|
352
|
-
* InstructionsLoaded settings hooks (observe + context injection). Fired once at
|
|
353
|
-
* session start after the project-instruction block (cc.md / CLAUDE.md / AGENTS.md
|
|
354
|
-
* hierarchy + `.claude/rules/*`) is composed into the system prompt — a hook can
|
|
355
|
-
* react to WHICH instruction files are authoritative this session (audit them,
|
|
356
|
-
* warn on an unexpected local override, load a companion tool config). The
|
|
357
|
-
* caller passes the EXACT loaded set; this producer trims each entry to
|
|
358
|
-
* `{path, scope, truncated}` (never the file CONTENT — a hook that wants content
|
|
359
|
-
* reads the path). Observe-only: instructions are already loaded, so a `block`
|
|
360
|
-
* decision is ignored and only emitted context is returned. No-op (byte-unchanged)
|
|
361
|
-
* without a registered InstructionsLoaded hook.
|
|
362
|
-
* @returns {{ additionalContext:string|null }}
|
|
363
|
-
*/
|
|
364
|
-
function runInstructionsLoadedHooks(
|
|
365
|
-
settingsHooks,
|
|
366
|
-
{ files, cwd, sessionId } = {},
|
|
367
|
-
) {
|
|
368
|
-
publishHooksV2Event("InstructionsLoaded", {
|
|
369
|
-
count: Array.isArray(files) ? files.length : 0,
|
|
370
|
-
cwd: cwd || null,
|
|
371
|
-
session_id: sessionId || null,
|
|
372
|
-
});
|
|
373
|
-
if (!settingsHooks) return { additionalContext: null };
|
|
374
|
-
const matched = collectHooks(settingsHooks, "InstructionsLoaded", "");
|
|
375
|
-
const { sync } = partitionAsyncHooks(matched);
|
|
376
|
-
if (sync.length === 0) return { additionalContext: null };
|
|
377
|
-
const list = Array.isArray(files) ? files : [];
|
|
378
|
-
const payload = withDeliveryId(
|
|
379
|
-
"InstructionsLoaded",
|
|
380
|
-
{
|
|
381
|
-
hook_event_name: "InstructionsLoaded",
|
|
382
|
-
files: list.map((f) => ({
|
|
383
|
-
path: f?.path || null,
|
|
384
|
-
scope: f?.scope || null,
|
|
385
|
-
truncated: f?.truncated === true,
|
|
386
|
-
})),
|
|
387
|
-
count: list.length,
|
|
388
|
-
cwd: cwd || null,
|
|
389
|
-
session_id: sessionId || null,
|
|
390
|
-
},
|
|
391
|
-
{ sessionId },
|
|
392
|
-
);
|
|
393
|
-
const outcome = _deps.runHooks(sync, payload, {
|
|
394
|
-
cwd,
|
|
395
|
-
event: "InstructionsLoaded",
|
|
396
|
-
});
|
|
397
|
-
return { additionalContext: aggregateContext(outcome.results) };
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
/**
|
|
401
|
-
* Generic observe-only fire (SessionEnd / Stop / PreCompact). Returns the raw
|
|
402
|
-
* runHooks outcome so callers can read a block reason; never gates flow here.
|
|
403
|
-
*
|
|
404
|
-
* `async: true` hooks are EXCLUDED from this synchronous run — they are always
|
|
405
|
-
* fire-and-forget and are dispatched separately (dispatchAsyncHooks), so running
|
|
406
|
-
* them here too would double-execute them.
|
|
407
|
-
*/
|
|
408
|
-
function runObserveHooks(
|
|
409
|
-
settingsHooks,
|
|
410
|
-
event,
|
|
411
|
-
payload = {},
|
|
412
|
-
{ cwd, matchTarget, traceId, parentId } = {},
|
|
413
|
-
) {
|
|
414
|
-
publishHooksV2Event(event, {
|
|
415
|
-
...payload,
|
|
416
|
-
cwd: cwd || payload.cwd || null,
|
|
417
|
-
trace_id: traceId || payload.trace_id || null,
|
|
418
|
-
parent_id: parentId || payload.parent_id || null,
|
|
419
|
-
});
|
|
420
|
-
if (!settingsHooks) return { decision: "continue", results: [] };
|
|
421
|
-
const matched = collectHooks(settingsHooks, event, matchTarget || "");
|
|
422
|
-
const { sync } = partitionAsyncHooks(matched);
|
|
423
|
-
if (sync.length === 0) return { decision: "continue", results: [] };
|
|
424
|
-
return _deps.runHooks(
|
|
425
|
-
sync,
|
|
426
|
-
withDeliveryId(
|
|
427
|
-
event,
|
|
428
|
-
{ hook_event_name: event, cwd, ...payload },
|
|
429
|
-
{ traceId, parentId },
|
|
430
|
-
),
|
|
431
|
-
{ cwd, event },
|
|
432
|
-
);
|
|
61
|
+
async function canonicalCall(name, args) {
|
|
62
|
+
const canonical = await import("./settings-hook-events.js");
|
|
63
|
+
return canonical[name](...args);
|
|
433
64
|
}
|
|
434
65
|
|
|
435
66
|
module.exports = {
|
|
436
67
|
withDeliveryId,
|
|
437
|
-
runUserPromptSubmitHooks,
|
|
438
|
-
runSessionStartHooks,
|
|
439
|
-
runCwdChangedHooks,
|
|
440
|
-
runWorktreeCreateHooks,
|
|
441
|
-
runWorktreeRemoveHooks,
|
|
442
|
-
runInstructionsLoadedHooks,
|
|
443
|
-
runObserveHooks,
|
|
444
68
|
aggregateContext,
|
|
445
69
|
partitionAsyncHooks,
|
|
446
|
-
|
|
447
|
-
|
|
70
|
+
// Async definitions are already scheduled exactly once by Hooks v2.
|
|
71
|
+
dispatchAsyncHooks: () => [],
|
|
72
|
+
runUserPromptSubmitHooks: (...args) =>
|
|
73
|
+
canonicalCall("runUserPromptSubmitHooks", args),
|
|
74
|
+
runSessionStartHooks: (...args) =>
|
|
75
|
+
canonicalCall("runSessionStartHooks", args),
|
|
76
|
+
runCwdChangedHooks: (...args) => canonicalCall("runCwdChangedHooks", args),
|
|
77
|
+
runWorktreeCreateHooks: (...args) =>
|
|
78
|
+
canonicalCall("runWorktreeCreateHooks", args),
|
|
79
|
+
runWorktreeRemoveHooks: (...args) =>
|
|
80
|
+
canonicalCall("runWorktreeRemoveHooks", args),
|
|
81
|
+
runInstructionsLoadedHooks: (...args) =>
|
|
82
|
+
canonicalCall("runInstructionsLoadedHooks", args),
|
|
83
|
+
runObserveHooks: (...args) => canonicalCall("runObserveHooks", args),
|
|
448
84
|
};
|