chainlesschain 0.162.176 → 0.162.178
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 +10 -0
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BDLu5Elz.js → AIOps-DRftcSue.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DH5us-CK.js → ActionButton-BFvUaMKR.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BZ0u8IFG.js → Analytics-C0-Rru4P.js} +3 -3
- package/src/assets/web-panel/assets/AppLayout-bx-BCljj.js +9 -0
- package/src/assets/web-panel/assets/{Artifacts-Br2YBbh_.js → Artifacts-DAJ8B3Un.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-C3C6a482.js → Audit-hOk4L1lr.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CzHvebcj.js → BackgroundAgents-3pbDpM9z.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DZNHYDFd.js → Backup-BtziGDn9.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-VRiC4fIx.js → BaseInput-kmshphJ3.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Cm08WWAD.js → Chat-d7tGSosA.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CGHYrugQ.js → ChatBubbleRenderer-p-_PBpX_.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DtByk7d7.js → Checkbox-C4Eh4Tz5.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CphXXOfD.js → Codegen-r7gmhZyA.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Hz86TnLR.js → Col-U7mDaGlL.js} +1 -1
- package/src/assets/web-panel/assets/{Community-HP03ltpD.js → Community-Bpu8aH1T.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B_N1mqQz.js → Compact-CHb2XBJe.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CVztRpi8.js → Compliance-Cn_r4dey.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-wUVOyZih.js → Cowork-CdMWfDcz.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-DW5TLJKw.js → Cron-BtnREHWy.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CrAFGhWH.js → Crosschain-BKI9TSzr.js} +1 -1
- package/src/assets/web-panel/assets/{DID-pA-oD8ke.js → DID-pkNubzzJ.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-1rrz1snN.js +3 -0
- package/src/assets/web-panel/assets/{Dropdown-EweJcsek.js → Dropdown-DLyFVxDc.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-C9xVLPG4.js → EmailListRenderer-CtUWfYVq.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CDcEEqlu.js → FamilyGuardDashboard-B8eX2Qe4.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DtZda9A_.js → Federation-D8lsDGus.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CiYdcVz3.js → FormItemContext-CRYt_aIw.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DA13uwA0.js → GenericCardRenderer-ClKzY8_N.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DzRhZD1O.js → Git-BXj5Dney.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-D5RMgOSb.js → Governance-Cm-I8RMz.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BgrPfSNk.js → Inference-CPvbhvgt.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DzjnD571.js → KnowledgeGraph-sYNDZaoi.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BhWzVDtN.js → Logs-BZY_3CRZ.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BDape9cx.js → MarkdownRenderer-up0BW6pv.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DJtL5GV7.js → Marketplace-C5MEJ2Qe.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CZcQygI7.js → McpTools-ihdrn43I.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DUWSDUUu.js → Memory-Br8bPMlh.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BTwq2WKY.js → MobileBridge-BNntgrYW.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BdV915mw.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-BiGugEQm.js → Mtc-A3wDmlqL.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-DY7a6gUe.js → MtcAudit-CF-mBLWM.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BQbDu_w7.js → Multisig-Iy2k_MSo.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CM2wXTLv.js → NLProgramming-kk0W7HUb.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DI6gGs1v.js → Notes-B5u5t_4S.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BsZOLWAB.js → NotificationSettings-BN0POf6_.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CHkSUrXB.js +1 -0
- package/src/assets/web-panel/assets/{Organization-Cds0_tXr.js → Organization-DwWQESuN.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-WunYMD87.js → Overflow-DG6klrcC.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Bo6j4DDv.js → P2P-BwJcKkgZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Bh2XPD5f.js → PdhVaultBrowser-BwOHG0in.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-EMvMMC8N.js → Permissions-CGMXe4TX.js} +4 -4
- package/src/assets/web-panel/assets/PersonalDataHub-ziYqg7-A.js +8 -0
- package/src/assets/web-panel/assets/{Pipeline-BOx8HOgL.js → Pipeline-BzJfeoGt.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-tBeTVQVM.js → Privacy-DLh3Bblx.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CVYg1W4M.js → ProjectInit-USVWW36c.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Dvt5I7y1.js → ProjectSettings-CiiOn62h.js} +2 -2
- package/src/assets/web-panel/assets/Projects-6V-PNmcA.js +1 -0
- package/src/assets/web-panel/assets/{Providers-Ct8xqY-E.js → Providers-CBPWWzpu.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Cni8Ooja.js → QrScannerModal-QVwoRUq3.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BJVLKdxr.js → QuickAsk-CXnR-2Vn.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DPG8Rbbm.js → Recommend-ClaNzjmF.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DsdR7dCt.js → RemoteSession-C3rGw8vJ.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Csg1YM-b.js → Reputation-Ci-OWAoP.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D9DoFoEf.js → Row-DRhAwXOS.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BsvKrXMS.js → RssFeed-BQLJQ2_y.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DFUStfgQ.js → Search-QQUpkfFd.js} +1 -1
- package/src/assets/web-panel/assets/{Security-ILg1zxdK.js → Security-DdXKzuKT.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Dd41PCaY.js → Services-x2Zh62Qd.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Bzo1cN80.js → Skeleton-GdY4KwRz.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BDHh17P0.js → Skills-Bv4tY1Fd.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-jl7UTiRY.js → Sla-C3QnM-11.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BePa-RF6.js → SpeechSettings-Bl3ytvmI.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DiqqDKGZ.js → SyncSettings-Wp9IwTsP.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DYQ_6lxj.js → Tasks-CF3rIrDe.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-JiDeI06L.js → Templates-CGfvVVM9.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-hhgI6zwS.js → Tenant-CVXmwQ3U.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-bvwrt03E.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-B8uB5Llk.js → TimelineRenderer-D0g74KhH.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C3b_6r2z.js → Tokens-BH4IwzlT.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-tIP7HKVe.js → Trigger-DJOpM533.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-vjoc11vJ.js → Trust-B43EPRLr.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DUPBnGuH.js → UkeySign-BmBFG-em.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CBvhUY5T.js → VideoEditing-n9oJwB8k.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DUaQ0uA5.js → Wallet-D5QeivHp.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DllSivjE.js → WebAuthn-DcNy7igO.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-xc8D3uO6.js → WorkflowEditor-BVjc7-5-.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BVicU7oA.js → chat-Dy5Tfj3m.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DJzLmhLm.js → colors-C4c2CNZU.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BvYRfThE.js → compact-item-DPa3O5vN.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DGXxCBKR.js → createContext-TLcfNA6_.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BAwdDA_5.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-SBDJB1y4.js → hasIn-D41LVFkp.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7HimK0M.js → index-0oevYjfT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCdRAgjy.js → index-388pLGJ1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO1itZaY.js → index-B8nLBZbv.js} +3 -3
- package/src/assets/web-panel/assets/{index-DvUTDYXX.js → index-BPTGAjee.js} +1 -1
- package/src/assets/web-panel/assets/{index-hxTODbM1.js → index-BPtrOBmW.js} +1 -1
- package/src/assets/web-panel/assets/{index-wcCL-miV.js → index-BQiIxHBy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKyEivf8.js → index-BSM1cHVK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJZf9DhV.js → index-BYPr9fkz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHVLJ8q0.js → index-BsQ7Ev6i.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cs2rmLFt.js → index-Btk9qLL2.js} +1 -1
- package/src/assets/web-panel/assets/{index-z1ZylsLq.js → index-BvmziZSG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cf-O_g_8.js → index-BvopLC_T.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMarmfrv.js → index-C7xhTVyP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CoJAO1Lm.js → index-CNk_ZooP.js} +1 -1
- package/src/assets/web-panel/assets/{index-9gdI7uUW.js → index-CQrEHoOG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bf-ctERC.js → index-CSxex23J.js} +1 -1
- package/src/assets/web-panel/assets/{index-MjC4G09d.js → index-CVjgm992.js} +1 -1
- package/src/assets/web-panel/assets/{index-e4fXH_WO.js → index-CWK4zOPe.js} +1 -1
- package/src/assets/web-panel/assets/{index-xfluRkCT.js → index-CX0VsoP4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRfiXB_p.js → index-CXl0YPNG.js} +1 -1
- package/src/assets/web-panel/assets/{index-d5BVd-cL.js → index-Cip7LWml.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dm_77jgR.js → index-Cq_hlWNt.js} +1 -1
- package/src/assets/web-panel/assets/{index-YJkzy8ZF.js → index-CzZ49YZL.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtwqO5qo.js → index-D2Nkivlm.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYqz4Wrr.js → index-DBUgRs4D.js} +1 -1
- package/src/assets/web-panel/assets/index-DEjVkdzq.js +1 -0
- package/src/assets/web-panel/assets/{index-CdGY9P8a.js → index-DNsBj2Ob.js} +1 -1
- package/src/assets/web-panel/assets/{index-DonCnfMr.js → index-Di4X8cfI.js} +1 -1
- package/src/assets/web-panel/assets/{index-1SdDS6lR.js → index-DljFsVGI.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnjPdvR6.js → index-Korc3QIe.js} +1 -1
- package/src/assets/web-panel/assets/index-LMOc5xrS.js +1 -0
- package/src/assets/web-panel/assets/{index-VMfwIH5G.js → index-MKZDje0H.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKrvvWm4.js → index-OHAfRu_3.js} +1 -1
- package/src/assets/web-panel/assets/{index-FxZzRyE1.js → index-WEJr8PL5.js} +1 -1
- package/src/assets/web-panel/assets/{index-Crk5NTb0.js → index-WinCp6du.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCqRS6da.js → index-Yjr6cqSK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTrBGBJs.js → index-iQ6gtFih.js} +1 -1
- package/src/assets/web-panel/assets/{index-lpaGoTH3.js → index-pt3s7yvV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CloCgBUR.js → index-tQ3igERQ.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-C1zO1KnY.js → initDefaultProps-BFZu87WZ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CWLtEGmC.js → motion-DJIo7qvt.js} +1 -1
- package/src/assets/web-panel/assets/{move-DzD_C3Vm.js → move-Cfr5qknL.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-D880PYJl.js → mtc-parser-Bgc-OadH.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CFR_z2ov.js → omit-X3WI-TNp.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-srIhgrSC.js → pickAttrs-pJhU9IxK.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-C1rXpibP.js → placementArrow-BNg_Vj3T.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C30gRcSS.js → responsiveObserve-TeSEGQ5-.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CvtKiMfV.js → slide-D_t_P0bv.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DNHO7ITG.js → statusUtils-DrrIMwAT.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Dt_Sl-g4.js → styleChecker-BjZCuFRm.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Cjev42Gh.js → useFlexGapSupport-rTFdlqdQ.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Baxglj2V.js → useFs-BidCpfLX.js} +1 -1
- package/src/assets/web-panel/assets/usePersonalDataHub-C5mHttA9.js +1 -0
- package/src/assets/web-panel/assets/{vnode-mIRkdT7o.js → vnode-BrbcRiHZ.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-HzI5DlH_.js → zoom-PISX7AkR.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/__tests__/hub-wechat.test.js +45 -0
- package/src/commands/agenda.js +22 -6
- package/src/commands/agent.js +3 -3
- package/src/commands/background-session.js +16 -6
- package/src/commands/batch.js +79 -27
- package/src/commands/changelog.js +15 -4
- package/src/commands/context.js +33 -1
- package/src/commands/eval.js +21 -6
- package/src/commands/hook.js +2 -2
- package/src/commands/hub.js +473 -39
- package/src/commands/init.js +212 -110
- package/src/commands/llm.js +22 -6
- package/src/commands/loop.js +9 -2
- package/src/commands/skill.js +13 -1
- package/src/commands/statusline.js +3 -3
- package/src/data/changelog.json +53 -5
- package/src/gateways/ws/personal-data-hub-protocol.js +22 -2
- package/src/harness/background-task-manager.js +18 -6
- package/src/harness/background-task-worker.js +11 -18
- package/src/harness/golden-transcript.js +3 -0
- package/src/harness/mcp-client.js +9 -15
- package/src/harness/worktree-isolator.js +18 -21
- package/src/index.js +18 -7
- package/src/lib/agent-core.js +5 -0
- package/src/lib/agent-ipc-bus.js +12 -3
- package/src/lib/agent-team/team-worktree.js +28 -6
- package/src/lib/agent-worktree.js +20 -19
- package/src/lib/approval-authority-store.js +891 -0
- package/src/lib/async-hook-supervisor.cjs +134 -24
- package/src/lib/async-hook-supervisor.js +47 -0
- package/src/lib/background-agent-supervisor.js +35 -12
- package/src/lib/background-interaction-resolver.js +399 -54
- package/src/lib/background-session-transport.js +3 -1
- package/src/lib/background-task-manager.js +5 -1
- package/src/lib/changelog.js +57 -0
- package/src/lib/chrome-connector.js +6 -2
- package/src/lib/claude-code-bridge.js +24 -8
- package/src/lib/cli-anything-bridge.js +82 -25
- package/src/lib/context-breakdown.js +82 -3
- package/src/lib/doctor-checkup.js +18 -6
- package/src/lib/eval/tasks.js +25 -31
- package/src/lib/event-runtime-host.js +225 -0
- package/src/lib/event-runtime-store.js +102 -21
- package/src/lib/event-runtime-worker.js +70 -2
- package/src/lib/hook-runner.cjs +71 -36
- package/src/lib/hook-runner.js +55 -0
- package/src/lib/hooks-v2-producers.js +33 -8
- package/src/lib/hooks-v2-runtime.js +360 -40
- package/src/lib/host-adb-bridge.js +18 -3
- package/src/lib/interaction-adapter.js +66 -0
- package/src/lib/lsp/__tests__/benchmark.test.js +61 -0
- package/src/lib/lsp/__tests__/lsp-client.test.js +6 -1
- package/src/lib/lsp/benchmark.js +20 -4
- package/src/lib/lsp/lsp-client.js +6 -4
- package/src/lib/lsp/lsp-server-registry.js +0 -2
- package/src/lib/operation-fingerprint.js +107 -2
- package/src/lib/orchestrator.js +8 -2
- package/src/lib/packer/pack-update-applier.js +14 -2
- package/src/lib/packer/smoke-runner.js +18 -5
- package/src/lib/paths.js +1 -1
- package/src/lib/pdh-dedicated-batch-collectors.js +124 -0
- package/src/lib/personal-data-hub-wiring.js +327 -52
- package/src/lib/plugin-monitor-supervisor.js +20 -13
- package/src/lib/plugin-runtime/install.js +10 -3
- package/src/lib/process-execution-broker/credential-agent.js +954 -111
- package/src/lib/process-execution-broker/index.js +369 -85
- package/src/lib/process-execution-broker/platform-sandbox.js +320 -140
- package/src/lib/provider-http-error.js +94 -0
- package/src/lib/remote-approval-bridge.js +222 -26
- package/src/lib/repl-bang-memorize.js +10 -2
- package/src/lib/repl-goal.js +19 -2
- package/src/lib/settings-hook-events.cjs +13 -8
- package/src/lib/settings-hook-events.js +20 -0
- package/src/lib/side-effect-ledger-store.js +65 -14
- package/src/lib/skill-loader.js +215 -12
- package/src/lib/skill-packs/generator.js +18 -9
- package/src/lib/skill-process-broker.js +85 -0
- package/src/lib/slash-commands.js +10 -2
- package/src/lib/status-line.cjs +28 -7
- package/src/lib/status-line.js +33 -0
- package/src/lib/sub-agent-context.js +42 -0
- package/src/lib/turn-binding-store.js +64 -15
- package/src/lib/turn-binding.js +85 -16
- package/src/repl/agent-repl.js +88 -49
- package/src/repl/remote-approval.js +13 -13
- package/src/repl/repl-turn-binding.js +46 -16
- package/src/runtime/agent-core.js +419 -84
- package/src/runtime/coding-agent-contract-shared.cjs +16 -0
- package/src/runtime/headless-runner.js +172 -44
- package/src/runtime/headless-stream.js +221 -11
- package/src/runtime/session-slash-commands.js +506 -0
- package/src/skills/video-editing/extractors/audio-extractor.js +13 -5
- package/src/skills/video-editing/extractors/video-extractor.js +13 -3
- package/src/skills/video-editing/media-process.js +20 -0
- package/src/skills/video-editing/render/audio-mix.js +13 -3
- package/src/skills/video-editing/render/ffmpeg-concat.js +7 -2
- package/src/skills/video-editing/render/ffmpeg-extract.js +7 -2
- package/src/workers/background-agent-worker.js +76 -40
- package/src/assets/web-panel/assets/AppLayout-Duu8xR14.js +0 -9
- package/src/assets/web-panel/assets/Dashboard-CXrd5gAw.js +0 -3
- package/src/assets/web-panel/assets/MobileProjects-NZvvfDME.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-C48mu09U.js +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-AX3ypUDV.js +0 -9
- package/src/assets/web-panel/assets/Projects-Cc7FC9-e.js +0 -1
- package/src/assets/web-panel/assets/Terminal-CjTZPa37.js +0 -3
- package/src/assets/web-panel/assets/devWarning-BT46Y_QI.js +0 -1
- package/src/assets/web-panel/assets/index-B7nuIywP.js +0 -1
- package/src/assets/web-panel/assets/index-ycwAfC-i.js +0 -1
- package/src/assets/web-panel/assets/usePersonalDataHub-B4NkcLaP.js +0 -1
|
@@ -72,10 +72,13 @@ import {
|
|
|
72
72
|
startSession as jsonlStartSession,
|
|
73
73
|
appendUserMessage as jsonlAppendUserMessage,
|
|
74
74
|
appendAssistantMessage as jsonlAppendAssistantMessage,
|
|
75
|
+
appendEvent as jsonlAppendEvent,
|
|
76
|
+
readEvents as jsonlReadEvents,
|
|
75
77
|
rebuildMessages as jsonlRebuildMessages,
|
|
76
78
|
sessionExists as jsonlSessionExists,
|
|
77
79
|
} from "../harness/jsonl-session-store.js";
|
|
78
80
|
import {
|
|
81
|
+
SideEffectLedger,
|
|
79
82
|
reconcileSideEffects,
|
|
80
83
|
classifyToolSideEffect,
|
|
81
84
|
} from "../lib/side-effect-ledger.js";
|
|
@@ -85,7 +88,14 @@ import {
|
|
|
85
88
|
persistSideEffectLedger,
|
|
86
89
|
} from "../lib/side-effect-ledger-store.js";
|
|
87
90
|
import { operationIdempotencyKey } from "../lib/idempotency.js";
|
|
91
|
+
import { TurnBindingLog, createTurnBindingFeed } from "../lib/turn-binding.js";
|
|
92
|
+
import { TURN_BINDING_EVENT } from "../lib/turn-binding-store.js";
|
|
88
93
|
import { getPlanModeManager } from "../lib/plan-mode.js";
|
|
94
|
+
import {
|
|
95
|
+
SESSION_SLASH_COMMANDS,
|
|
96
|
+
executeSessionSlashCommand,
|
|
97
|
+
parseSessionSlashCommandEvent,
|
|
98
|
+
} from "./session-slash-commands.js";
|
|
89
99
|
|
|
90
100
|
/**
|
|
91
101
|
* Resolve the streaming-delta coalesce window (ms). Adjacent partial-message
|
|
@@ -429,6 +439,11 @@ export function parseInputEvent(line) {
|
|
|
429
439
|
if (obj.features !== undefined) offer.features = obj.features;
|
|
430
440
|
return { hello: offer };
|
|
431
441
|
}
|
|
442
|
+
// Session-scoped slash commands (IDE panel / SDK control plane). These are
|
|
443
|
+
// dispatched against live session state and never become model turns:
|
|
444
|
+
// {"type":"slash_command","command":"status","args":"","request_id":"r1"}
|
|
445
|
+
const slashCommand = parseSessionSlashCommandEvent(obj);
|
|
446
|
+
if (slashCommand) return { slashCommand };
|
|
432
447
|
// Plan-mode control events (chat-panel plan UI):
|
|
433
448
|
// {"type":"plan","action":"enter"|"approve"|"reject"}
|
|
434
449
|
if (obj && typeof obj === "object" && obj.type === "plan") {
|
|
@@ -687,7 +702,15 @@ function buildSideEffectRecovery(ledger) {
|
|
|
687
702
|
async function runTurn(
|
|
688
703
|
messages,
|
|
689
704
|
loopOptions,
|
|
690
|
-
{
|
|
705
|
+
{
|
|
706
|
+
runLoop,
|
|
707
|
+
emit,
|
|
708
|
+
costBudget,
|
|
709
|
+
nextToolUseId,
|
|
710
|
+
sideEffects,
|
|
711
|
+
turnNumber,
|
|
712
|
+
turnBindingFeed,
|
|
713
|
+
},
|
|
691
714
|
) {
|
|
692
715
|
const usage = {
|
|
693
716
|
input_tokens: 0,
|
|
@@ -731,12 +754,15 @@ async function runTurn(
|
|
|
731
754
|
collapseConsecutiveMessagesInPlace(messages);
|
|
732
755
|
}
|
|
733
756
|
for await (const event of runLoop(messages, loopOptions)) {
|
|
757
|
+
turnBindingFeed?.handleEvent(event);
|
|
734
758
|
switch (event.type) {
|
|
735
759
|
case "tool-executing": {
|
|
736
760
|
// Additive protocol-v1 correlation id ("tu-<n>", session-scoped —
|
|
737
761
|
// agent-sdk docs/PROTOCOL.md §1.2.1): the matching tool_result below
|
|
738
762
|
// echoes the same id so UIs can pair calls without adjacency.
|
|
739
|
-
const toolUseId =
|
|
763
|
+
const toolUseId =
|
|
764
|
+
event.tool_use_id ||
|
|
765
|
+
(nextToolUseId ? nextToolUseId() : undefined);
|
|
740
766
|
const pm = getPlanModeManager();
|
|
741
767
|
const planItem = pm.startPlanItemForTool(event.tool, {
|
|
742
768
|
toolUseId,
|
|
@@ -816,7 +842,10 @@ async function runTurn(
|
|
|
816
842
|
// recent tool_use (same adjacency rule the is_error attribution
|
|
817
843
|
// below has always used).
|
|
818
844
|
const lastCall =
|
|
819
|
-
|
|
845
|
+
(event.tool_use_id
|
|
846
|
+
? toolCalls.find((call) => call.id === event.tool_use_id)
|
|
847
|
+
: null) ||
|
|
848
|
+
(toolCalls.length > 0 ? toolCalls[toolCalls.length - 1] : null);
|
|
820
849
|
if (lastCall) lastCall.is_error = Boolean(err);
|
|
821
850
|
const pm = getPlanModeManager();
|
|
822
851
|
const settledItem = lastCall?.planItemId
|
|
@@ -943,6 +972,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
943
972
|
// runAgentHeadless for the full semantics. null = no file → unchanged.
|
|
944
973
|
let permissionRules = options.permissionRules || null;
|
|
945
974
|
let managedSettings = null;
|
|
975
|
+
let settingsFiles = [];
|
|
946
976
|
try {
|
|
947
977
|
const { loadSettings, applyManagedPermissionPolicy } =
|
|
948
978
|
await import("../lib/settings-loader.cjs");
|
|
@@ -952,6 +982,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
952
982
|
managedSettingsFile: options.managedSettingsFile,
|
|
953
983
|
});
|
|
954
984
|
managedSettings = loaded.managed;
|
|
985
|
+
settingsFiles = Array.isArray(loaded.files) ? loaded.files : [];
|
|
955
986
|
if (!permissionRules) {
|
|
956
987
|
const total =
|
|
957
988
|
loaded.rules.allow.length +
|
|
@@ -1016,6 +1047,8 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
1016
1047
|
const runLoop = deps.agentLoop || coreAgentLoop;
|
|
1017
1048
|
const doBootstrap = deps.bootstrap || bootstrap;
|
|
1018
1049
|
const doExpand = deps.expandFileRefs || expandFileRefsAsync;
|
|
1050
|
+
const runSessionSlashCommand =
|
|
1051
|
+
deps.executeSessionSlashCommand || executeSessionSlashCommand;
|
|
1019
1052
|
const writeOut = deps.writeOut || ((s) => process.stdout.write(s));
|
|
1020
1053
|
const writeErr = deps.writeErr || ((s) => process.stderr.write(s));
|
|
1021
1054
|
// Guard the real stdout/stderr against a downstream `| head` closing the pipe
|
|
@@ -1093,6 +1126,8 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
1093
1126
|
appendUserMessage: deps.appendUserMessage || jsonlAppendUserMessage,
|
|
1094
1127
|
appendAssistantMessage:
|
|
1095
1128
|
deps.appendAssistantMessage || jsonlAppendAssistantMessage,
|
|
1129
|
+
appendEvent: deps.appendEvent || jsonlAppendEvent,
|
|
1130
|
+
readEvents: deps.readEvents || jsonlReadEvents,
|
|
1096
1131
|
rebuildMessages: deps.rebuildMessages || jsonlRebuildMessages,
|
|
1097
1132
|
};
|
|
1098
1133
|
// --ephemeral forces persistence OFF even with an explicit session id (the
|
|
@@ -1111,12 +1146,15 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
1111
1146
|
const loadLedger = deps.loadSideEffectLedger || loadSideEffectLedger;
|
|
1112
1147
|
const persistLedger = deps.persistSideEffectLedger || persistSideEffectLedger;
|
|
1113
1148
|
let sideEffectLedger = null;
|
|
1149
|
+
let sideEffectLedgerLoadError = null;
|
|
1114
1150
|
if (persist) {
|
|
1115
1151
|
try {
|
|
1116
1152
|
sideEffectLedger = loadLedger(sessionId);
|
|
1117
|
-
} catch {
|
|
1118
|
-
//
|
|
1119
|
-
|
|
1153
|
+
} catch (error) {
|
|
1154
|
+
// Read-only turns remain available, but the first classified side effect
|
|
1155
|
+
// fails before the generator can resume into the actual operation.
|
|
1156
|
+
sideEffectLedger = new SideEffectLedger();
|
|
1157
|
+
sideEffectLedgerLoadError = error;
|
|
1120
1158
|
}
|
|
1121
1159
|
}
|
|
1122
1160
|
let sideEffectSeq = 0;
|
|
@@ -1127,11 +1165,111 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
1127
1165
|
const sideEffects = sideEffectLedger
|
|
1128
1166
|
? {
|
|
1129
1167
|
ledger: sideEffectLedger,
|
|
1130
|
-
persist: () =>
|
|
1168
|
+
persist: () => {
|
|
1169
|
+
if (sideEffectLedgerLoadError) throw sideEffectLedgerLoadError;
|
|
1170
|
+
const persisted = persistLedger(sessionId, sideEffectLedger);
|
|
1171
|
+
if (persisted === false) {
|
|
1172
|
+
const error = new Error(
|
|
1173
|
+
`Side-effect ledger persistence was rejected for ${sessionId}`,
|
|
1174
|
+
);
|
|
1175
|
+
error.code = "SIDE_EFFECT_LEDGER_PERSIST_FAILED";
|
|
1176
|
+
throw error;
|
|
1177
|
+
}
|
|
1178
|
+
return persisted;
|
|
1179
|
+
},
|
|
1131
1180
|
nextOpId: () => `${sideEffectRunNonce}:${sideEffectSeq++}`,
|
|
1132
1181
|
}
|
|
1133
1182
|
: null;
|
|
1134
1183
|
|
|
1184
|
+
// P1 unified turn/checkpoint producer for long-lived stream sessions. Load
|
|
1185
|
+
// the latest snapshot on resume, then append one explicit coverage record
|
|
1186
|
+
// for every input turn (including tool-free turns).
|
|
1187
|
+
let turnBindingLog = new TurnBindingLog();
|
|
1188
|
+
let turnBindingPersistenceError = null;
|
|
1189
|
+
let turnBindingDegradationEmitted = false;
|
|
1190
|
+
let turnBindingTerminalEmitted = false;
|
|
1191
|
+
const recordTurnBindingFailure = (error, operation) => {
|
|
1192
|
+
if (turnBindingPersistenceError) return turnBindingPersistenceError;
|
|
1193
|
+
const wrapped = new Error(
|
|
1194
|
+
`Turn binding ${operation} failed for ${sessionId}: ${
|
|
1195
|
+
error?.message || String(error)
|
|
1196
|
+
}`,
|
|
1197
|
+
{ cause: error },
|
|
1198
|
+
);
|
|
1199
|
+
wrapped.code =
|
|
1200
|
+
operation === "read"
|
|
1201
|
+
? "TURN_BINDING_READ_FAILED"
|
|
1202
|
+
: "TURN_BINDING_PERSIST_FAILED";
|
|
1203
|
+
turnBindingPersistenceError = wrapped;
|
|
1204
|
+
return wrapped;
|
|
1205
|
+
};
|
|
1206
|
+
const emitTurnBindingFailure = () => {
|
|
1207
|
+
if (!turnBindingPersistenceError) return false;
|
|
1208
|
+
if (!turnBindingDegradationEmitted) {
|
|
1209
|
+
emit({
|
|
1210
|
+
type: "recovery_degraded",
|
|
1211
|
+
component: "turn_binding",
|
|
1212
|
+
session_id: sessionId,
|
|
1213
|
+
error: turnBindingPersistenceError.message,
|
|
1214
|
+
});
|
|
1215
|
+
turnBindingDegradationEmitted = true;
|
|
1216
|
+
}
|
|
1217
|
+
if (!turnBindingTerminalEmitted) {
|
|
1218
|
+
emit({
|
|
1219
|
+
type: "result",
|
|
1220
|
+
subtype: "error",
|
|
1221
|
+
is_error: true,
|
|
1222
|
+
error: turnBindingPersistenceError.message,
|
|
1223
|
+
session_id: sessionId,
|
|
1224
|
+
});
|
|
1225
|
+
turnBindingTerminalEmitted = true;
|
|
1226
|
+
}
|
|
1227
|
+
return true;
|
|
1228
|
+
};
|
|
1229
|
+
if (persist) {
|
|
1230
|
+
try {
|
|
1231
|
+
const priorEvents = store.readEvents(sessionId) || [];
|
|
1232
|
+
for (let index = priorEvents.length - 1; index >= 0; index--) {
|
|
1233
|
+
const event = priorEvents[index];
|
|
1234
|
+
if (
|
|
1235
|
+
event?.type === TURN_BINDING_EVENT &&
|
|
1236
|
+
event.data &&
|
|
1237
|
+
typeof event.data === "object"
|
|
1238
|
+
) {
|
|
1239
|
+
turnBindingLog = TurnBindingLog.fromJSON(event.data);
|
|
1240
|
+
break;
|
|
1241
|
+
}
|
|
1242
|
+
}
|
|
1243
|
+
} catch (error) {
|
|
1244
|
+
recordTurnBindingFailure(error, "read");
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
const turnBindingFeed = persist
|
|
1248
|
+
? createTurnBindingFeed({
|
|
1249
|
+
log: turnBindingLog,
|
|
1250
|
+
nonce: sideEffectRunNonce,
|
|
1251
|
+
})
|
|
1252
|
+
: null;
|
|
1253
|
+
const persistTurnBindingLog = () => {
|
|
1254
|
+
if (!turnBindingFeed?.isDirty()) return true;
|
|
1255
|
+
if (turnBindingPersistenceError) return false;
|
|
1256
|
+
try {
|
|
1257
|
+
const persisted = store.appendEvent(
|
|
1258
|
+
sessionId,
|
|
1259
|
+
TURN_BINDING_EVENT,
|
|
1260
|
+
turnBindingLog.toJSON(),
|
|
1261
|
+
);
|
|
1262
|
+
if (persisted === false) {
|
|
1263
|
+
throw new Error("session store rejected the binding snapshot");
|
|
1264
|
+
}
|
|
1265
|
+
turnBindingFeed.clearDirty();
|
|
1266
|
+
return true;
|
|
1267
|
+
} catch (error) {
|
|
1268
|
+
recordTurnBindingFailure(error, "persistence");
|
|
1269
|
+
return false;
|
|
1270
|
+
}
|
|
1271
|
+
};
|
|
1272
|
+
|
|
1135
1273
|
// ── Interactive approvals (--interactive-approvals; chat-panel UX) ────────
|
|
1136
1274
|
// CONFIRM-tier decisions (risky shell via the ApprovalGate, settings/hook
|
|
1137
1275
|
// `ask`) normally fail closed in headless. With this opt-in they become a
|
|
@@ -1395,7 +1533,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
1395
1533
|
if (settingsHooks && _loadedInstructions) {
|
|
1396
1534
|
try {
|
|
1397
1535
|
const { runInstructionsLoadedHooks } =
|
|
1398
|
-
await import("../lib/settings-hook-events.
|
|
1536
|
+
await import("../lib/settings-hook-events.js");
|
|
1399
1537
|
const ctx = runInstructionsLoadedHooks(settingsHooks, {
|
|
1400
1538
|
files: _loadedInstructions.files,
|
|
1401
1539
|
cwd,
|
|
@@ -1436,7 +1574,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
1436
1574
|
if (settingsHooks) {
|
|
1437
1575
|
try {
|
|
1438
1576
|
const { runSessionStartHooks } =
|
|
1439
|
-
await import("../lib/settings-hook-events.
|
|
1577
|
+
await import("../lib/settings-hook-events.js");
|
|
1440
1578
|
const ctx = runSessionStartHooks(settingsHooks, {
|
|
1441
1579
|
source: "startup",
|
|
1442
1580
|
cwd,
|
|
@@ -1520,6 +1658,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
1520
1658
|
mcp: Boolean(options.mcpConfig) || options.useRegisteredMcp !== false,
|
|
1521
1659
|
enabledToolNames,
|
|
1522
1660
|
}),
|
|
1661
|
+
slash_commands: [...SESSION_SLASH_COMMANDS],
|
|
1523
1662
|
input_format: "stream-json",
|
|
1524
1663
|
additional_directories: additionalDirectories,
|
|
1525
1664
|
resumed_messages: resumedMessages,
|
|
@@ -1858,6 +1997,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
1858
1997
|
let wakeQueue = null;
|
|
1859
1998
|
let inputDone = false;
|
|
1860
1999
|
let currentAbort = null;
|
|
2000
|
+
let slashRequestSeq = 0;
|
|
1861
2001
|
(async () => {
|
|
1862
2002
|
try {
|
|
1863
2003
|
for await (const line of readJsonLines(input)) {
|
|
@@ -1946,6 +2086,65 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
1946
2086
|
for (;;) {
|
|
1947
2087
|
const parsed = await nextEvent();
|
|
1948
2088
|
if (parsed == null) break; // stdin closed
|
|
2089
|
+
if (turnBindingPersistenceError) {
|
|
2090
|
+
emitTurnBindingFailure();
|
|
2091
|
+
sawError = true;
|
|
2092
|
+
break;
|
|
2093
|
+
}
|
|
2094
|
+
|
|
2095
|
+
if (parsed.slashCommand) {
|
|
2096
|
+
const requestId =
|
|
2097
|
+
parsed.slashCommand.requestId || `slash-${++slashRequestSeq}`;
|
|
2098
|
+
let result;
|
|
2099
|
+
try {
|
|
2100
|
+
result = await runSessionSlashCommand(
|
|
2101
|
+
parsed.slashCommand,
|
|
2102
|
+
{
|
|
2103
|
+
sessionId,
|
|
2104
|
+
cwd,
|
|
2105
|
+
provider,
|
|
2106
|
+
model,
|
|
2107
|
+
apiKey,
|
|
2108
|
+
messages,
|
|
2109
|
+
messageCount: messages.length,
|
|
2110
|
+
additionalDirectories,
|
|
2111
|
+
extraRoots: additionalDirectories.length,
|
|
2112
|
+
mcp,
|
|
2113
|
+
permissionRules,
|
|
2114
|
+
permissionMode: options.permissionMode || "default",
|
|
2115
|
+
settingsHooks,
|
|
2116
|
+
settingsFiles,
|
|
2117
|
+
loadedInstructions: _loadedInstructions,
|
|
2118
|
+
projectMemoryEnabled:
|
|
2119
|
+
options.projectMemory !== false &&
|
|
2120
|
+
process.env.CC_PROJECT_MEMORY !== "0",
|
|
2121
|
+
},
|
|
2122
|
+
deps.sessionSlashCommandDeps || {},
|
|
2123
|
+
);
|
|
2124
|
+
} catch (error) {
|
|
2125
|
+
result = {
|
|
2126
|
+
ok: false,
|
|
2127
|
+
code: "COMMAND_FAILED",
|
|
2128
|
+
error: String(error?.message || error),
|
|
2129
|
+
};
|
|
2130
|
+
}
|
|
2131
|
+
emit({
|
|
2132
|
+
type: "slash_command_result",
|
|
2133
|
+
request_id: requestId,
|
|
2134
|
+
command: parsed.slashCommand.command,
|
|
2135
|
+
session_id: sessionId,
|
|
2136
|
+
ok: result?.ok === true,
|
|
2137
|
+
...(result?.ok === true
|
|
2138
|
+
? { text: String(result.output || "") }
|
|
2139
|
+
: {
|
|
2140
|
+
error: {
|
|
2141
|
+
code: result?.code || "COMMAND_FAILED",
|
|
2142
|
+
message: String(result?.error || "Slash command failed"),
|
|
2143
|
+
},
|
|
2144
|
+
}),
|
|
2145
|
+
});
|
|
2146
|
+
continue;
|
|
2147
|
+
}
|
|
1949
2148
|
|
|
1950
2149
|
// One-time version-skew reminder (see flag declaration above). Best-effort;
|
|
1951
2150
|
// never blocks a turn. detectVersionSkew() returns null when this process is
|
|
@@ -2244,7 +2443,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
2244
2443
|
if (settingsHooks) {
|
|
2245
2444
|
try {
|
|
2246
2445
|
const { runUserPromptSubmitHooks } =
|
|
2247
|
-
await import("../lib/settings-hook-events.
|
|
2446
|
+
await import("../lib/settings-hook-events.js");
|
|
2248
2447
|
const ups = runUserPromptSubmitHooks(settingsHooks, {
|
|
2249
2448
|
prompt: userContent,
|
|
2250
2449
|
cwd,
|
|
@@ -2348,6 +2547,9 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
2348
2547
|
}
|
|
2349
2548
|
}
|
|
2350
2549
|
turns += 1;
|
|
2550
|
+
turnBindingFeed?.beginTurn(messages.length, {
|
|
2551
|
+
worktreeId: options.worktreeId ?? null,
|
|
2552
|
+
});
|
|
2351
2553
|
|
|
2352
2554
|
// Per-turn abort scope: an {"type":"interrupt"} from the pump above
|
|
2353
2555
|
// aborts THIS turn (LLM fetch included — the signal reaches chatWithTools)
|
|
@@ -2418,6 +2620,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
2418
2620
|
nextToolUseId,
|
|
2419
2621
|
sideEffects,
|
|
2420
2622
|
turnNumber: turns,
|
|
2623
|
+
turnBindingFeed,
|
|
2421
2624
|
},
|
|
2422
2625
|
);
|
|
2423
2626
|
} catch (err) {
|
|
@@ -2461,6 +2664,13 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
2461
2664
|
});
|
|
2462
2665
|
sawError = true;
|
|
2463
2666
|
continue;
|
|
2667
|
+
} finally {
|
|
2668
|
+
persistTurnBindingLog();
|
|
2669
|
+
}
|
|
2670
|
+
if (turnBindingPersistenceError) {
|
|
2671
|
+
emitTurnBindingFailure();
|
|
2672
|
+
sawError = true;
|
|
2673
|
+
break;
|
|
2464
2674
|
}
|
|
2465
2675
|
currentAbort = null;
|
|
2466
2676
|
|
|
@@ -2596,7 +2806,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
2596
2806
|
if (settingsHooks) {
|
|
2597
2807
|
try {
|
|
2598
2808
|
const { runObserveHooks } =
|
|
2599
|
-
await import("../lib/settings-hook-events.
|
|
2809
|
+
await import("../lib/settings-hook-events.js");
|
|
2600
2810
|
runObserveHooks(
|
|
2601
2811
|
settingsHooks,
|
|
2602
2812
|
"SessionEnd",
|