remoteclaw 0.0.0 → 0.1.0-next.2abd2fa
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/CHANGELOG.md +7 -0
- package/LICENSE +661 -0
- package/README.md +490 -0
- package/assets/chrome-extension/README.md +23 -0
- package/assets/chrome-extension/background-utils.js +48 -0
- package/assets/chrome-extension/background.js +899 -0
- package/assets/chrome-extension/icons/icon128.png +0 -0
- package/assets/chrome-extension/icons/icon16.png +0 -0
- package/assets/chrome-extension/icons/icon32.png +0 -0
- package/assets/chrome-extension/icons/icon48.png +0 -0
- package/assets/chrome-extension/manifest.json +25 -0
- package/assets/chrome-extension/options-validation.js +57 -0
- package/assets/chrome-extension/options.html +200 -0
- package/assets/chrome-extension/options.js +74 -0
- package/assets/clawtributor-avatar-placeholder.png +0 -0
- package/assets/dmg-background-small.png +0 -0
- package/assets/dmg-background.png +0 -0
- package/dist/account-lookup-0KDSp5Mj.js +11 -0
- package/dist/account-lookup-zvANGr2x.js +11 -0
- package/dist/accounts-BFy_Z3od.js +272 -0
- package/dist/accounts-BTXSfPWi.js +270 -0
- package/dist/accounts-BxGS70Do.js +36 -0
- package/dist/accounts-CNY1TGj1.js +47 -0
- package/dist/accounts-DBohBlww.js +32 -0
- package/dist/accounts-DqRQ75w3.js +36 -0
- package/dist/accounts-iODF3SK2.js +47 -0
- package/dist/ack-reactions-B11TAC2D.js +446 -0
- package/dist/ack-reactions-BWVjL4H6.js +446 -0
- package/dist/acp-cli-CA1xMmVo.js +1320 -0
- package/dist/acp-cli-CGo6fJVZ.js +1326 -0
- package/dist/active-listener-VzhWW8W6.js +37 -0
- package/dist/active-listener-z0qVEcom.js +37 -0
- package/dist/agent-CTizRPIJ.js +732 -0
- package/dist/agent-D2RVoS5g.js +731 -0
- package/dist/agent-helpers-B6VfZ9_u.js +606 -0
- package/dist/agent-helpers-CTx5KKJu.js +606 -0
- package/dist/agent-scope-BGYzhtWQ.js +121 -0
- package/dist/agent-scope-C50VuLKh.js +119 -0
- package/dist/agents-BuYn-obw.js +788 -0
- package/dist/agents.config-BSTxuTVd.js +116 -0
- package/dist/agents.config-p3V3b9u6.js +116 -0
- package/dist/ansi-D04X81yq.js +14 -0
- package/dist/api-BeQMq2iS.js +17 -0
- package/dist/api-CxX8-gGz.js +17 -0
- package/dist/argv-Co-b9Zsc.js +101 -0
- package/dist/audio-DPOuhNq7.js +43 -0
- package/dist/audio-VBcVDa08.js +43 -0
- package/dist/audio-preflight-BwmCYeuM.js +64 -0
- package/dist/audio-preflight-co8gjlPX.js +69 -0
- package/dist/audit-oH4urD3G.js +3138 -0
- package/dist/audit-qgtCT3ik.js +3138 -0
- package/dist/auth-CAczFgAO.js +448 -0
- package/dist/auth-Deh9i9Eg.js +448 -0
- package/dist/auth-profiles-BquJGKLC.js +279 -0
- package/dist/auth-profiles-D8vKiBPq.js +281 -0
- package/dist/banner-Cf978khN.js +294 -0
- package/dist/binaries-DXW6oATV.js +13 -0
- package/dist/bindings-CRU_udk8.js +69 -0
- package/dist/bindings-DQZAu8Wv.js +69 -0
- package/dist/bonjour-discovery-DdAk1VyO.js +378 -0
- package/dist/bonjour-discovery-DuhiIZZx.js +378 -0
- package/dist/boot/handler.js +1498 -0
- package/dist/brew-C4zKZsHX.js +46 -0
- package/dist/brew-DbSbN8sD.js +46 -0
- package/dist/browser-cli-CZC4h5V4.js +1687 -0
- package/dist/browser-cli-DAgi_aQk.js +1692 -0
- package/dist/build-info.json +5 -0
- package/dist/bundled/boot/HOOK.md +24 -0
- package/dist/bundled/command-logger/HOOK.md +122 -0
- package/dist/call-BbwtB9Y-.js +2828 -0
- package/dist/call-PivL7Uex.js +2829 -0
- package/dist/canvas-host/a2ui/.bundle.hash +1 -0
- package/dist/canvas-host/a2ui/a2ui.bundle.js +13193 -0
- package/dist/canvas-host/a2ui/index.html +307 -0
- package/dist/catalog-BqO6yem_.js +185 -0
- package/dist/catalog-DFmaYwfk.js +185 -0
- package/dist/channel-account-context-CvIDAtHS.js +550 -0
- package/dist/channel-account-context-q-o0pG1A.js +550 -0
- package/dist/channel-activity-BaCNOZpP.js +94 -0
- package/dist/channel-activity-C-G4n9BK.js +292 -0
- package/dist/channel-activity-DTKGf3j5.js +94 -0
- package/dist/channel-options-Cyappik_.js +32 -0
- package/dist/channel-options-DFnypY5S.js +33 -0
- package/dist/channel-selection-BGl53D5K.js +51 -0
- package/dist/channel-selection-NNPbxnyZ.js +51 -0
- package/dist/channel-web-DmhVkWbP.js +2134 -0
- package/dist/channel-web-kRC3UYBJ.js +2136 -0
- package/dist/channels-cli-C5XRkPJl.js +1421 -0
- package/dist/channels-cli-D6TqCI0m.js +1426 -0
- package/dist/channels-status-issues-CUc9mpeW.js +18 -0
- package/dist/channels-status-issues-DwRDzwrV.js +18 -0
- package/dist/chat-envelope-DEZ-5RY8.js +248 -0
- package/dist/chat-envelope-el7Uo-Fe.js +248 -0
- package/dist/chat-type-CYPyHAj-.js +11 -0
- package/dist/chat-type-DKb2TlGZ.js +11 -0
- package/dist/chrome-0QaGKb3L.js +1732 -0
- package/dist/chrome-CFeWdP0Y.js +1733 -0
- package/dist/chunk-CSQfUhgF.js +341 -0
- package/dist/chunk-D0Y_w4oX.js +341 -0
- package/dist/clack-prompter-B7tOxhJd.js +122 -0
- package/dist/clack-prompter-CCFnKP_1.js +121 -0
- package/dist/cleanup-utils-CqAVZz2b.js +94 -0
- package/dist/cleanup-utils-CwQvD73q.js +94 -0
- package/dist/cli/daemon-cli.js +9 -0
- package/dist/cli-BR2J3c4l.js +125 -0
- package/dist/cli-C1q1vSmN.js +130 -0
- package/dist/cli-name-BicfmwQX.js +23 -0
- package/dist/cli-name-C6rJGl18.js +23 -0
- package/dist/cli-utils-BhXbz2UF.js +16 -0
- package/dist/cli-utils-DZe_rVkZ.js +16 -0
- package/dist/client-C61M8zI3.js +22 -0
- package/dist/client-DdpmATKq.js +22 -0
- package/dist/clipboard-D7_SKHPK.js +31 -0
- package/dist/clipboard-Dzkx6Q2K.js +31 -0
- package/dist/command-format-CVfo8I5f.js +18 -0
- package/dist/command-format-DgXcqxBt.js +32 -0
- package/dist/command-logger/handler.js +57 -0
- package/dist/command-options-C4paWSGf.js +26 -0
- package/dist/command-options-CA30lfLK.js +26 -0
- package/dist/command-registry-CYjvOp8W.js +215 -0
- package/dist/commands-CDonBOrw.js +41 -0
- package/dist/commands-D_-bgTlO.js +41 -0
- package/dist/commands-registry-CWJv6xe2.js +892 -0
- package/dist/commands-registry-Ci8_cFk9.js +893 -0
- package/dist/common-CMI-qsF8.js +156 -0
- package/dist/common-DSVmydhm.js +156 -0
- package/dist/completion-cli-8iZJqfmX.js +452 -0
- package/dist/completion-cli-CYDjEZSt.js +452 -0
- package/dist/config-D5XU45KD.js +6953 -0
- package/dist/config-FHu9Bn4R.js +6951 -0
- package/dist/config-cli-Gehy4sav.js +241 -0
- package/dist/config-cli-RC9qMgJq.js +246 -0
- package/dist/config-eval-CjGZtLwx.js +102 -0
- package/dist/config-eval-H_wlEYIG.js +102 -0
- package/dist/config-guard-J-Q_DFWk.js +97 -0
- package/dist/config-guard-cB5a_ANg.js +75 -0
- package/dist/config-validation-BPNyd9_3.js +18 -0
- package/dist/config-validation-BPWuvhVe.js +18 -0
- package/dist/configure-CC2XdRRm.js +891 -0
- package/dist/configure-DxFBJuhZ.js +889 -0
- package/dist/constants-BmRFoHl0.js +67 -0
- package/dist/constants-C9WPAluB.js +67 -0
- package/dist/constants-ChptG3d7.js +12 -0
- package/dist/constants-DY6b-_Wl.js +12 -0
- package/dist/control-auth-D0tpV3ts.js +397 -0
- package/dist/control-auth-_-0PGRUs.js +397 -0
- package/dist/control-ui/apple-touch-icon.png +0 -0
- package/dist/control-ui/assets/index-B4ZM1lW1.js +7738 -0
- package/dist/control-ui/assets/index-B4ZM1lW1.js.map +1 -0
- package/dist/control-ui/assets/index-PED72sKF.css +1 -0
- package/dist/control-ui/assets/pt-BR-eq0TfCI7.js +2 -0
- package/dist/control-ui/assets/pt-BR-eq0TfCI7.js.map +1 -0
- package/dist/control-ui/assets/zh-CN-DmLG2MF9.js +2 -0
- package/dist/control-ui/assets/zh-CN-DmLG2MF9.js.map +1 -0
- package/dist/control-ui/assets/zh-TW-BLErH0EM.js +2 -0
- package/dist/control-ui/assets/zh-TW-BLErH0EM.js.map +1 -0
- package/dist/control-ui/favicon-32.png +0 -0
- package/dist/control-ui/favicon.ico +0 -0
- package/dist/control-ui/favicon.svg +67 -0
- package/dist/control-ui/index.html +17 -0
- package/dist/control-ui-assets-Cx_mw4D0.js +186 -0
- package/dist/control-ui-assets-W1AUuGrO.js +186 -0
- package/dist/conversation-label-C4SDz4sT.js +36 -0
- package/dist/conversation-label-D1frnvYe.js +36 -0
- package/dist/credentials-BHWUBHMd.js +91 -0
- package/dist/credentials-DFsi1_e8.js +91 -0
- package/dist/cron-cli-BzERxhr5.js +495 -0
- package/dist/cron-cli-C8j_uslU.js +490 -0
- package/dist/daemon-cli-C95XNbX0.js +1199 -0
- package/dist/daemon-cli-e6sURMqd.js +1197 -0
- package/dist/daemon-cli.js +15243 -0
- package/dist/daemon-install-CcohRvKV.js +55 -0
- package/dist/daemon-install-DDshfT0J.js +60 -0
- package/dist/daemon-install-helpers-CFGAfRlj.js +462 -0
- package/dist/daemon-install-helpers-DIUzSFG1.js +462 -0
- package/dist/daemon-runtime-CMnbwryP.js +13 -0
- package/dist/daemon-runtime-CvqE4ysg.js +13 -0
- package/dist/dangerous-name-matching-BzmiLXmA.js +45 -0
- package/dist/dangerous-name-matching-DaVRgwer.js +45 -0
- package/dist/dangerous-tools-BOLoCRv4.js +253 -0
- package/dist/dangerous-tools-Baq7Q-i6.js +253 -0
- package/dist/defaults-B5KStIBg.js +7 -0
- package/dist/defaults-xUAL2Z-F.js +7 -0
- package/dist/deliver-912khjLK.js +481 -0
- package/dist/deliver-D56J4-1F.js +481 -0
- package/dist/delivery-queue-Cfa9Wmxp.js +244 -0
- package/dist/delivery-queue-CxVRi4tw.js +244 -0
- package/dist/devices-cli-0qDhTgZR.js +316 -0
- package/dist/devices-cli-6SKMR2bV.js +321 -0
- package/dist/diagnostics-99iCgBUh.js +46 -0
- package/dist/diagnostics-VC0cz7kX.js +46 -0
- package/dist/directory-cli-5YXdoVdn.js +217 -0
- package/dist/directory-cli-D3IKCHmn.js +222 -0
- package/dist/dm-policy-shared-4rkjhcrM.js +22 -0
- package/dist/dm-policy-shared-D8lgnmrC.js +22 -0
- package/dist/dns-cli-11CtErVU.js +197 -0
- package/dist/dns-cli-SiEd_1Lq.js +202 -0
- package/dist/dock-BqNINg7k.js +928 -0
- package/dist/dock-CQuu41bw.js +929 -0
- package/dist/doctor-completion-BR1SlAT3.js +92 -0
- package/dist/doctor-completion-CZwpEhIK.js +92 -0
- package/dist/doctor-config-flow-BVkHcvoj.js +1933 -0
- package/dist/doctor-config-flow-DVYRn0An.js +1934 -0
- package/dist/enable-DcJnkzfz.js +59 -0
- package/dist/enable-ibNq4UWy.js +59 -0
- package/dist/entry.js +2620 -0
- package/dist/env-DeF64iu0.js +60 -0
- package/dist/env-vars-7aZqKPhk.js +93 -0
- package/dist/env-vars-CLGbxdpL.js +93 -0
- package/dist/errors-8F-77i6m.js +35 -0
- package/dist/errors-DZ199hOo.js +35 -0
- package/dist/exec-DbKuYyM1.js +164 -0
- package/dist/exec-DkFE7lqU.js +164 -0
- package/dist/export-html/template.css +1060 -0
- package/dist/export-html/template.html +88 -0
- package/dist/export-html/template.js +1797 -0
- package/dist/export-html/vendor/highlight.min.js +1213 -0
- package/dist/export-html/vendor/marked.min.js +6 -0
- package/dist/extensionAPI.js +11520 -0
- package/dist/fetch-BFSBLBkA.js +67 -0
- package/dist/fetch-C6XKGA11.js +67 -0
- package/dist/fetch-CEDsOiql.js +67 -0
- package/dist/fetch-timeout-DTIN7CGM.js +43 -0
- package/dist/fetch-timeout-DoySHqfO.js +43 -0
- package/dist/file-identity-BxlKD8Ys.js +12 -0
- package/dist/file-lock-CIvloidc.js +107 -0
- package/dist/file-lock-CzBL_VIx.js +107 -0
- package/dist/format-duration-CqUERz51.js +35 -0
- package/dist/format-duration-Ct-yiwkS.js +35 -0
- package/dist/format-relative-79_Y1n2Y.js +55 -0
- package/dist/format-relative-CxLpEQOX.js +55 -0
- package/dist/fs-safe-DSwT85uK.js +88 -0
- package/dist/fs-safe-DkBhNAc3.js +98 -0
- package/dist/gateway-cli-BEEZhCHv.js +23747 -0
- package/dist/gateway-cli-Nob0g_4y.js +23742 -0
- package/dist/gateway-rpc-CksB-N83.js +28 -0
- package/dist/gateway-rpc-Dq44SkOv.js +28 -0
- package/dist/gmail-setup-utils-Cnx8A5pW.js +422 -0
- package/dist/gmail-setup-utils-nkabbKOE.js +423 -0
- package/dist/health-RT-F3hzT.js +1423 -0
- package/dist/health-SOuaKNRa.js +1420 -0
- package/dist/health-format-BG95OE6N.js +28 -0
- package/dist/health-format-B_QRD8Si.js +28 -0
- package/dist/heartbeat-visibility-BxkZjE5m.js +125 -0
- package/dist/heartbeat-visibility-CGG-G7px.js +125 -0
- package/dist/heartbeat-wake-LGEgcXjs.js +182 -0
- package/dist/heartbeat-wake-Y97geucO.js +182 -0
- package/dist/help-format-DAxf0l_h.js +17 -0
- package/dist/help-format-NNm_Ov4H.js +17 -0
- package/dist/helpers-BAsMXprO.js +25 -0
- package/dist/helpers-DLgbkcEn.js +25 -0
- package/dist/helpers-R7bU5IBz.js +10 -0
- package/dist/helpers-kkeXif0Q.js +10 -0
- package/dist/hook-runner-global-DJ14gXFP.js +527 -0
- package/dist/hooks-cli-DyEKryW8.js +1217 -0
- package/dist/hooks-cli-RuEn0-oy.js +1222 -0
- package/dist/host-env-security-Bms2_EMV.js +92 -0
- package/dist/host-env-security-szwfmhC4.js +92 -0
- package/dist/image-ops-Bi6JPSkD.js +354 -0
- package/dist/image-ops-DWytvdh_.js +354 -0
- package/dist/import-D8BBZQgl.js +170 -0
- package/dist/import-DQ6NI4Fz.js +168 -0
- package/dist/inbound-context-CPkkQW0i.js +68 -0
- package/dist/inbound-context-DS_kpIYI.js +68 -0
- package/dist/inbound-path-policy-Bg4gZBx-.js +250 -0
- package/dist/inbound-path-policy-sdr5Ji0k.js +250 -0
- package/dist/index.js +569 -0
- package/dist/input-provenance-Bn6thJNm.js +35 -0
- package/dist/input-provenance-xUsSMOsz.js +35 -0
- package/dist/inspect-Dt8hogS3.js +559 -0
- package/dist/inspect-vYIL1oA0.js +559 -0
- package/dist/installs-aM5dWAyn.js +325 -0
- package/dist/installs-pWdqG8HL.js +325 -0
- package/dist/ip-C9q3Oq20.js +200 -0
- package/dist/ip-D0zgNmBV.js +200 -0
- package/dist/ipv4--2WXMVtE.js +46 -0
- package/dist/ipv4-CDQpx1A7.js +46 -0
- package/dist/ir-BpaAMTfW.js +940 -0
- package/dist/is-main-DN8-sNR5.js +30 -0
- package/dist/json-file-B7l5-Xhr.js +25 -0
- package/dist/json-file-ChO_R9yh.js +25 -0
- package/dist/json-files-CmpYSF4G.js +46 -0
- package/dist/json-files-DzpTak5i.js +46 -0
- package/dist/lanes-ByWMUgrz.js +58 -0
- package/dist/lanes-cHJ5arWg.js +58 -0
- package/dist/links-Bz4V7R_p.js +15 -0
- package/dist/links-C3soDNDH.js +15 -0
- package/dist/loader-Ccwsh8Sh.js +22624 -0
- package/dist/loader-y9MhJewT.js +22621 -0
- package/dist/local-roots-BrH0Q63K.js +313 -0
- package/dist/local-roots-nImrw2WR.js +314 -0
- package/dist/location-DBWCGNLq.js +43 -0
- package/dist/location-GbZ0bBRU.js +43 -0
- package/dist/logger-BWMPnILd.js +47 -0
- package/dist/logger-Bw3cFE5t.js +49 -0
- package/dist/logger-DyL5G2DO.js +12 -0
- package/dist/logger-GvipVDfh.js +12 -0
- package/dist/logging-C-nxX2fn.js +20 -0
- package/dist/logging-D8-Kozjc.js +19 -0
- package/dist/login-C_Kt57nO.js +62 -0
- package/dist/login-DOmWDMeP.js +61 -0
- package/dist/login-qr-CXU0wC5K.js +322 -0
- package/dist/login-qr-D0u6fdeO.js +327 -0
- package/dist/logs-cli-CschwP4d.js +238 -0
- package/dist/logs-cli-D7ayUvz_.js +233 -0
- package/dist/markdown-tables-CrmghPAr.js +29 -0
- package/dist/markdown-tables-jrnSPvZ6.js +29 -0
- package/dist/media-CojxZ45J.js +10492 -0
- package/dist/media-DN7yRfrH.js +940 -0
- package/dist/message-action-names-CtEZcmlU.js +2521 -0
- package/dist/message-action-names-WglOO_DT.js +2521 -0
- package/dist/message-channel-DzJqHVZD.js +91 -0
- package/dist/message-channel-uWMAiywE.js +91 -0
- package/dist/mime-BS3jhcZE.js +149 -0
- package/dist/mime-Cxh_64P6.js +149 -0
- package/dist/mutable-allowlist-detectors-DiZDtmlZ.js +64 -0
- package/dist/mutable-allowlist-detectors-U5ThQr9V.js +64 -0
- package/dist/net-Cg8AQeke.js +225 -0
- package/dist/net-D6D0wgcF.js +225 -0
- package/dist/node-cli-Q2-n3Fgv.js +24 -0
- package/dist/node-cli-Uf6lAntf.js +24 -0
- package/dist/nodes-cli-C2SoKfCv.js +1343 -0
- package/dist/nodes-cli-CQmlfx0K.js +1348 -0
- package/dist/nodes-screen-BR9sYoPa.js +250 -0
- package/dist/nodes-screen-Cw7Hv7M2.js +250 -0
- package/dist/note-Dlv4NmlQ.js +92 -0
- package/dist/note-kvWV4xtw.js +92 -0
- package/dist/npm-registry-spec-0qiKawvv.js +786 -0
- package/dist/npm-registry-spec-COvUzy5J.js +786 -0
- package/dist/npm-resolution-6v_Zm-9G.js +86 -0
- package/dist/npm-resolution-BFz7LeoN.js +86 -0
- package/dist/onboard-CgyU-mDL.js +407 -0
- package/dist/onboard-RI4vNTZd.js +405 -0
- package/dist/onboard-channels-DN5JoKPd.js +2548 -0
- package/dist/onboard-channels-DyAd1OZr.js +2547 -0
- package/dist/onboard-config-BCTthQ7J.js +24 -0
- package/dist/onboard-config-y-2cgT0V.js +24 -0
- package/dist/onboard-helpers-BCzZUD0z.js +363 -0
- package/dist/onboard-helpers-sDc2Ky6H.js +362 -0
- package/dist/onboard-remote-CJrMtttl.js +127 -0
- package/dist/onboard-remote-hyQIBguz.js +127 -0
- package/dist/onboarding-DCu1iBTV.js +541 -0
- package/dist/onboarding-zKMitzpb.js +543 -0
- package/dist/onboarding.finalize-ClHhYE2E.js +401 -0
- package/dist/onboarding.finalize-D5JkVJgg.js +398 -0
- package/dist/onboarding.gateway-config-DFh71Ndn.js +198 -0
- package/dist/onboarding.gateway-config-VBk6AP9U.js +191 -0
- package/dist/outbound-BYlZshIw.js +221 -0
- package/dist/outbound-CFfJC1j5.js +220 -0
- package/dist/outbound-attachment-BCNs1u1F.js +18 -0
- package/dist/outbound-attachment-B_0D60Yr.js +18 -0
- package/dist/outbound-attachment-o0seS0CP.js +18 -0
- package/dist/pairing-cli-BeydfoF9.js +122 -0
- package/dist/pairing-cli-DWzX866x.js +127 -0
- package/dist/pairing-labels-B-N8S5Fc.js +9 -0
- package/dist/pairing-labels-B_53dY5L.js +9 -0
- package/dist/pairing-store-BxdqFZGK.js +460 -0
- package/dist/pairing-store-CTkD51uW.js +459 -0
- package/dist/parse-log-line-enq8pduH.js +44 -0
- package/dist/parse-log-line-mz9TG6ig.js +44 -0
- package/dist/parse-timeout-BMP8a0_a.js +16 -0
- package/dist/parse-timeout-CDkco8kd.js +16 -0
- package/dist/path-env-DR5vn3QL.js +89 -0
- package/dist/path-env-qRJbjJzj.js +89 -0
- package/dist/path-guards-CIx4hURU.js +31 -0
- package/dist/path-guards-CrQOUlsq.js +31 -0
- package/dist/path-safety-DkT9RmTG.js +14 -0
- package/dist/path-safety-juI2XbO1.js +14 -0
- package/dist/paths-BTaH3rLn.js +232 -0
- package/dist/plugin-auto-enable-D23gv7Aw.js +302 -0
- package/dist/plugin-auto-enable-DuPS9XiJ.js +301 -0
- package/dist/plugin-registry-CNu_1KZz.js +33 -0
- package/dist/plugin-registry-DeHwd2jk.js +33 -0
- package/dist/plugin-sdk/account-id.d.ts +1 -0
- package/dist/plugin-sdk/account-id.js +34 -0
- package/dist/plugin-sdk/agents/agent-helpers/errors.d.ts +55 -0
- package/dist/plugin-sdk/agents/agent-helpers/google.d.ts +3 -0
- package/dist/plugin-sdk/agents/agent-helpers/images.d.ts +21 -0
- package/dist/plugin-sdk/agents/agent-helpers/message-sanitization.d.ts +14 -0
- package/dist/plugin-sdk/agents/agent-helpers/messaging-dedupe.d.ts +10 -0
- package/dist/plugin-sdk/agents/agent-helpers/openai.d.ts +9 -0
- package/dist/plugin-sdk/agents/agent-helpers/thinking.d.ts +5 -0
- package/dist/plugin-sdk/agents/agent-helpers/turns.d.ts +20 -0
- package/dist/plugin-sdk/agents/agent-helpers/types.d.ts +1 -0
- package/dist/plugin-sdk/agents/agent-helpers.d.ts +11 -0
- package/dist/plugin-sdk/agents/agent-messaging.d.ts +8 -0
- package/dist/plugin-sdk/agents/agent-paths.d.ts +1 -0
- package/dist/plugin-sdk/agents/agent-scope.d.ts +61 -0
- package/dist/plugin-sdk/agents/agent-types.d.ts +78 -0
- package/dist/plugin-sdk/agents/agent-utils.d.ts +39 -0
- package/dist/plugin-sdk/agents/announce-idempotency.d.ts +11 -0
- package/dist/plugin-sdk/agents/api-key-rotation.d.ts +22 -0
- package/dist/plugin-sdk/agents/auth-profiles/constants.d.ts +16 -0
- package/dist/plugin-sdk/agents/auth-profiles/display.d.ts +7 -0
- package/dist/plugin-sdk/agents/auth-profiles/doctor.d.ts +8 -0
- package/dist/plugin-sdk/agents/auth-profiles/oauth.d.ts +14 -0
- package/dist/plugin-sdk/agents/auth-profiles/paths.d.ts +4 -0
- package/dist/plugin-sdk/agents/auth-profiles/profiles.d.ts +12 -0
- package/dist/plugin-sdk/agents/auth-profiles/session-override.d.ts +18 -0
- package/dist/plugin-sdk/agents/auth-profiles/store.d.ts +10 -0
- package/dist/plugin-sdk/agents/auth-profiles/types.d.ts +13 -0
- package/dist/plugin-sdk/agents/auth-profiles.d.ts +8 -0
- package/dist/plugin-sdk/agents/block-chunker.d.ts +19 -0
- package/dist/plugin-sdk/agents/channel-tools.d.ts +27 -0
- package/dist/plugin-sdk/agents/cli-session.d.ts +3 -0
- package/dist/plugin-sdk/agents/current-time.d.ts +17 -0
- package/dist/plugin-sdk/agents/date-time.d.ts +13 -0
- package/dist/plugin-sdk/agents/defaults.d.ts +3 -0
- package/dist/plugin-sdk/agents/identity-avatar.d.ts +15 -0
- package/dist/plugin-sdk/agents/identity.d.ts +28 -0
- package/dist/plugin-sdk/agents/image-sanitization.d.ts +8 -0
- package/dist/plugin-sdk/agents/lanes.d.ts +3 -0
- package/dist/plugin-sdk/agents/live-auth-keys.d.ts +6 -0
- package/dist/plugin-sdk/agents/owner-display.d.ts +19 -0
- package/dist/plugin-sdk/agents/provider-auth.d.ts +40 -0
- package/dist/plugin-sdk/agents/provider-utils.d.ts +21 -0
- package/dist/plugin-sdk/agents/schema/typebox.d.ts +14 -0
- package/dist/plugin-sdk/agents/session-write-lock.d.ts +53 -0
- package/dist/plugin-sdk/agents/stable-stringify.d.ts +1 -0
- package/dist/plugin-sdk/agents/subagent-announce-queue.d.ts +24 -0
- package/dist/plugin-sdk/agents/subagent-announce.d.ts +39 -0
- package/dist/plugin-sdk/agents/subagent-depth.d.ts +11 -0
- package/dist/plugin-sdk/agents/subagent-lifecycle-events.d.ts +18 -0
- package/dist/plugin-sdk/agents/subagent-registry-cleanup.d.ts +24 -0
- package/dist/plugin-sdk/agents/subagent-registry-completion.d.ts +15 -0
- package/dist/plugin-sdk/agents/subagent-registry-queries.d.ts +11 -0
- package/dist/plugin-sdk/agents/subagent-registry-state.d.ts +7 -0
- package/dist/plugin-sdk/agents/subagent-registry.d.ts +45 -0
- package/dist/plugin-sdk/agents/subagent-registry.store.d.ts +5 -0
- package/dist/plugin-sdk/agents/subagent-registry.types.d.ts +34 -0
- package/dist/plugin-sdk/agents/subagent-spawn.d.ts +47 -0
- package/dist/plugin-sdk/agents/timeout.d.ts +8 -0
- package/dist/plugin-sdk/agents/tool-call-id.d.ts +27 -0
- package/dist/plugin-sdk/agents/tool-display-common.d.ts +32 -0
- package/dist/plugin-sdk/agents/tool-display.d.ts +15 -0
- package/dist/plugin-sdk/agents/tool-images.d.ts +10 -0
- package/dist/plugin-sdk/agents/tools/agent-step.d.ts +15 -0
- package/dist/plugin-sdk/agents/tools/common.d.ts +80 -0
- package/dist/plugin-sdk/agents/tools/discord-actions-guild.d.ts +4 -0
- package/dist/plugin-sdk/agents/tools/discord-actions-messaging.d.ts +6 -0
- package/dist/plugin-sdk/agents/tools/discord-actions-moderation-shared.d.ts +13 -0
- package/dist/plugin-sdk/agents/tools/discord-actions-moderation.d.ts +4 -0
- package/dist/plugin-sdk/agents/tools/discord-actions-presence.d.ts +4 -0
- package/dist/plugin-sdk/agents/tools/discord-actions.d.ts +5 -0
- package/dist/plugin-sdk/agents/tools/sessions-access.d.ts +42 -0
- package/dist/plugin-sdk/agents/tools/sessions-helpers.d.ts +52 -0
- package/dist/plugin-sdk/agents/tools/sessions-resolution.d.ts +59 -0
- package/dist/plugin-sdk/agents/tools/sessions-send-helpers.d.ts +34 -0
- package/dist/plugin-sdk/agents/tools/slack-actions.d.ts +15 -0
- package/dist/plugin-sdk/agents/tools/telegram-actions.d.ts +7 -0
- package/dist/plugin-sdk/agents/tools/whatsapp-actions.d.ts +3 -0
- package/dist/plugin-sdk/agents/tools/whatsapp-target-auth.d.ts +10 -0
- package/dist/plugin-sdk/agents/usage.d.ts +49 -0
- package/dist/plugin-sdk/agents/workspace.d.ts +1 -0
- package/dist/plugin-sdk/auto-reply/chunk.d.ts +45 -0
- package/dist/plugin-sdk/auto-reply/command-auth.d.ts +17 -0
- package/dist/plugin-sdk/auto-reply/command-detection.d.ts +13 -0
- package/dist/plugin-sdk/auto-reply/commands-args.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/commands-registry.d.ts +47 -0
- package/dist/plugin-sdk/auto-reply/commands-registry.data.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/commands-registry.types.d.ts +66 -0
- package/dist/plugin-sdk/auto-reply/dispatch.d.ts +32 -0
- package/dist/plugin-sdk/auto-reply/envelope.d.ts +58 -0
- package/dist/plugin-sdk/auto-reply/fallback-state.d.ts +55 -0
- package/dist/plugin-sdk/auto-reply/group-activation.d.ts +6 -0
- package/dist/plugin-sdk/auto-reply/heartbeat-reply-payload.d.ts +2 -0
- package/dist/plugin-sdk/auto-reply/heartbeat.d.ts +16 -0
- package/dist/plugin-sdk/auto-reply/inbound-debounce.d.ts +17 -0
- package/dist/plugin-sdk/auto-reply/media-note.d.ts +2 -0
- package/dist/plugin-sdk/auto-reply/model-runtime.d.ts +17 -0
- package/dist/plugin-sdk/auto-reply/model.d.ts +8 -0
- package/dist/plugin-sdk/auto-reply/reply/abort.d.ts +32 -0
- package/dist/plugin-sdk/auto-reply/reply/agent-runner-execution.d.ts +59 -0
- package/dist/plugin-sdk/auto-reply/reply/agent-runner-helpers.d.ts +15 -0
- package/dist/plugin-sdk/auto-reply/reply/agent-runner-payloads.d.ts +27 -0
- package/dist/plugin-sdk/auto-reply/reply/agent-runner-utils.d.ts +152 -0
- package/dist/plugin-sdk/auto-reply/reply/agent-runner.d.ts +36 -0
- package/dist/plugin-sdk/auto-reply/reply/block-reply-coalescer.d.ts +15 -0
- package/dist/plugin-sdk/auto-reply/reply/block-reply-pipeline.d.ts +31 -0
- package/dist/plugin-sdk/auto-reply/reply/block-streaming.d.ts +22 -0
- package/dist/plugin-sdk/auto-reply/reply/body.d.ts +10 -0
- package/dist/plugin-sdk/auto-reply/reply/command-gates.d.ts +18 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-allowlist.d.ts +2 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-config.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-context.d.ts +12 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-core.d.ts +13 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-export-session.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-info.d.ts +11 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-plugin.d.ts +13 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-session.d.ts +8 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-setunset-standard.d.ts +10 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-setunset.d.ts +34 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-slash-parse.d.ts +24 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-status.d.ts +26 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-subagents/action-agents.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-subagents/action-focus.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-subagents/action-help.d.ts +2 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-subagents/action-info.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-subagents/action-kill.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-subagents/action-list.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-subagents/action-log.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-subagents/action-send.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-subagents/action-spawn.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-subagents/action-unfocus.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-subagents/shared.d.ts +81 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-subagents.d.ts +4 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-tts.d.ts +2 -0
- package/dist/plugin-sdk/auto-reply/reply/commands-types.d.ts +61 -0
- package/dist/plugin-sdk/auto-reply/reply/commands.d.ts +4 -0
- package/dist/plugin-sdk/auto-reply/reply/config-commands.d.ts +15 -0
- package/dist/plugin-sdk/auto-reply/reply/config-value.d.ts +4 -0
- package/dist/plugin-sdk/auto-reply/reply/debug-commands.d.ts +16 -0
- package/dist/plugin-sdk/auto-reply/reply/directive-handling.auth.d.ts +19 -0
- package/dist/plugin-sdk/auto-reply/reply/directive-handling.d.ts +6 -0
- package/dist/plugin-sdk/auto-reply/reply/directive-handling.fast-lane.d.ts +7 -0
- package/dist/plugin-sdk/auto-reply/reply/directive-handling.impl.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/directive-handling.levels.d.ts +20 -0
- package/dist/plugin-sdk/auto-reply/reply/directive-handling.params.d.ts +59 -0
- package/dist/plugin-sdk/auto-reply/reply/directive-handling.parse.d.ts +65 -0
- package/dist/plugin-sdk/auto-reply/reply/directive-handling.persist.d.ts +42 -0
- package/dist/plugin-sdk/auto-reply/reply/directive-handling.queue-validation.d.ts +10 -0
- package/dist/plugin-sdk/auto-reply/reply/directive-handling.shared.d.ts +29 -0
- package/dist/plugin-sdk/auto-reply/reply/directive-parsing.d.ts +5 -0
- package/dist/plugin-sdk/auto-reply/reply/directives.d.ts +58 -0
- package/dist/plugin-sdk/auto-reply/reply/dispatch-from-config.d.ts +16 -0
- package/dist/plugin-sdk/auto-reply/reply/dispatcher-registry.d.ts +24 -0
- package/dist/plugin-sdk/auto-reply/reply/elevated-allowlist-matcher.d.ts +20 -0
- package/dist/plugin-sdk/auto-reply/reply/elevated-unavailable.d.ts +8 -0
- package/dist/plugin-sdk/auto-reply/reply/followup-runner.d.ts +16 -0
- package/dist/plugin-sdk/auto-reply/reply/get-reply-directives-apply.d.ts +64 -0
- package/dist/plugin-sdk/auto-reply/reply/get-reply-directives-utils.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/get-reply-directives.d.ts +121 -0
- package/dist/plugin-sdk/auto-reply/reply/get-reply-inline-actions.d.ts +56 -0
- package/dist/plugin-sdk/auto-reply/reply/get-reply-run.d.ts +73 -0
- package/dist/plugin-sdk/auto-reply/reply/get-reply.d.ts +4 -0
- package/dist/plugin-sdk/auto-reply/reply/groups.d.ts +26 -0
- package/dist/plugin-sdk/auto-reply/reply/history.d.ts +72 -0
- package/dist/plugin-sdk/auto-reply/reply/inbound-context.d.ts +8 -0
- package/dist/plugin-sdk/auto-reply/reply/inbound-dedupe.d.ts +8 -0
- package/dist/plugin-sdk/auto-reply/reply/inbound-meta.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/inbound-text.d.ts +1 -0
- package/dist/plugin-sdk/auto-reply/reply/line-directives.d.ts +22 -0
- package/dist/plugin-sdk/auto-reply/reply/mentions.d.ts +19 -0
- package/dist/plugin-sdk/auto-reply/reply/normalize-reply.d.ts +11 -0
- package/dist/plugin-sdk/auto-reply/reply/origin-routing.d.ts +13 -0
- package/dist/plugin-sdk/auto-reply/reply/provider-dispatcher.d.ts +19 -0
- package/dist/plugin-sdk/auto-reply/reply/queue/cleanup.d.ts +6 -0
- package/dist/plugin-sdk/auto-reply/reply/queue/directive.d.ts +15 -0
- package/dist/plugin-sdk/auto-reply/reply/queue/drain.d.ts +2 -0
- package/dist/plugin-sdk/auto-reply/reply/queue/enqueue.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/queue/normalize.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/queue/settings.d.ts +2 -0
- package/dist/plugin-sdk/auto-reply/reply/queue/state.d.ts +20 -0
- package/dist/plugin-sdk/auto-reply/reply/queue/types.d.ts +87 -0
- package/dist/plugin-sdk/auto-reply/reply/queue-policy.d.ts +8 -0
- package/dist/plugin-sdk/auto-reply/reply/queue.d.ts +8 -0
- package/dist/plugin-sdk/auto-reply/reply/reply-delivery.d.ts +27 -0
- package/dist/plugin-sdk/auto-reply/reply/reply-directives.d.ts +14 -0
- package/dist/plugin-sdk/auto-reply/reply/reply-dispatcher.d.ts +53 -0
- package/dist/plugin-sdk/auto-reply/reply/reply-elevated.d.ts +16 -0
- package/dist/plugin-sdk/auto-reply/reply/reply-inline.d.ts +8 -0
- package/dist/plugin-sdk/auto-reply/reply/reply-payloads.d.ts +27 -0
- package/dist/plugin-sdk/auto-reply/reply/reply-reference.d.ts +20 -0
- package/dist/plugin-sdk/auto-reply/reply/reply-tags.d.ts +6 -0
- package/dist/plugin-sdk/auto-reply/reply/reply-threading.d.ts +9 -0
- package/dist/plugin-sdk/auto-reply/reply/response-prefix-template.d.ts +51 -0
- package/dist/plugin-sdk/auto-reply/reply/route-reply.d.ts +56 -0
- package/dist/plugin-sdk/auto-reply/reply/session-reset-prompt.d.ts +1 -0
- package/dist/plugin-sdk/auto-reply/reply/session-run-accounting.d.ts +11 -0
- package/dist/plugin-sdk/auto-reply/reply/session-updates.d.ts +18 -0
- package/dist/plugin-sdk/auto-reply/reply/session-usage.d.ts +21 -0
- package/dist/plugin-sdk/auto-reply/reply/session.d.ts +26 -0
- package/dist/plugin-sdk/auto-reply/reply/strip-inbound-meta.d.ts +27 -0
- package/dist/plugin-sdk/auto-reply/reply/subagents-utils.d.ts +26 -0
- package/dist/plugin-sdk/auto-reply/reply/typing-mode.d.ts +27 -0
- package/dist/plugin-sdk/auto-reply/reply/typing.d.ts +18 -0
- package/dist/plugin-sdk/auto-reply/reply/untrusted-context.d.ts +1 -0
- package/dist/plugin-sdk/auto-reply/reply.d.ts +5 -0
- package/dist/plugin-sdk/auto-reply/send-policy.d.ts +6 -0
- package/dist/plugin-sdk/auto-reply/status.d.ts +59 -0
- package/dist/plugin-sdk/auto-reply/templating.d.ts +159 -0
- package/dist/plugin-sdk/auto-reply/thinking.d.ts +22 -0
- package/dist/plugin-sdk/auto-reply/tokens.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/types.d.ts +82 -0
- package/dist/plugin-sdk/channel-web.d.ts +6 -0
- package/dist/plugin-sdk/channels/account-summary.d.ts +17 -0
- package/dist/plugin-sdk/channels/ack-reactions.d.ts +29 -0
- package/dist/plugin-sdk/channels/allow-from.d.ts +11 -0
- package/dist/plugin-sdk/channels/allowlist-match.d.ts +16 -0
- package/dist/plugin-sdk/channels/allowlists/resolve-utils.d.ts +33 -0
- package/dist/plugin-sdk/channels/channel-config.d.ts +39 -0
- package/dist/plugin-sdk/channels/chat-type.d.ts +2 -0
- package/dist/plugin-sdk/channels/command-gating.d.ts +20 -0
- package/dist/plugin-sdk/channels/conversation-label.d.ts +2 -0
- package/dist/plugin-sdk/channels/dock.d.ts +25 -0
- package/dist/plugin-sdk/channels/draft-stream-controls.d.ts +54 -0
- package/dist/plugin-sdk/channels/draft-stream-loop.d.ts +13 -0
- package/dist/plugin-sdk/channels/location.d.ts +21 -0
- package/dist/plugin-sdk/channels/logging.d.ts +20 -0
- package/dist/plugin-sdk/channels/mention-gating.d.ts +27 -0
- package/dist/plugin-sdk/channels/model-overrides.d.ts +18 -0
- package/dist/plugin-sdk/channels/plugins/account-action-gate.d.ts +5 -0
- package/dist/plugin-sdk/channels/plugins/account-helpers.d.ts +6 -0
- package/dist/plugin-sdk/channels/plugins/actions/discord/handle-action.d.ts +3 -0
- package/dist/plugin-sdk/channels/plugins/actions/discord/handle-action.guild-admin.d.ts +9 -0
- package/dist/plugin-sdk/channels/plugins/actions/discord.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/actions/shared.d.ts +7 -0
- package/dist/plugin-sdk/channels/plugins/actions/signal.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/actions/telegram.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/agent-tools/whatsapp-login.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/allowlist-match.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/bluebubbles-actions.d.ts +48 -0
- package/dist/plugin-sdk/channels/plugins/channel-config.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/config-helpers.d.ts +14 -0
- package/dist/plugin-sdk/channels/plugins/config-schema.d.ts +3 -0
- package/dist/plugin-sdk/channels/plugins/config-writes.d.ts +7 -0
- package/dist/plugin-sdk/channels/plugins/directory-config.d.ts +16 -0
- package/dist/plugin-sdk/channels/plugins/group-mentions.d.ts +18 -0
- package/dist/plugin-sdk/channels/plugins/helpers.d.ts +8 -0
- package/dist/plugin-sdk/channels/plugins/index.d.ts +8 -0
- package/dist/plugin-sdk/channels/plugins/media-limits.d.ts +9 -0
- package/dist/plugin-sdk/channels/plugins/media-payload.d.ts +15 -0
- package/dist/plugin-sdk/channels/plugins/message-action-names.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/normalize/discord.d.ts +14 -0
- package/dist/plugin-sdk/channels/plugins/normalize/imessage.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/normalize/shared.d.ts +6 -0
- package/dist/plugin-sdk/channels/plugins/normalize/signal.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/normalize/slack.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/normalize/telegram.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/normalize/whatsapp.d.ts +3 -0
- package/dist/plugin-sdk/channels/plugins/onboarding/channel-access-configure.d.ts +21 -0
- package/dist/plugin-sdk/channels/plugins/onboarding/channel-access.d.ts +31 -0
- package/dist/plugin-sdk/channels/plugins/onboarding/discord.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/onboarding/helpers.d.ts +177 -0
- package/dist/plugin-sdk/channels/plugins/onboarding/imessage.d.ts +6 -0
- package/dist/plugin-sdk/channels/plugins/onboarding/signal.d.ts +7 -0
- package/dist/plugin-sdk/channels/plugins/onboarding/slack.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/onboarding/telegram.d.ts +4 -0
- package/dist/plugin-sdk/channels/plugins/onboarding/whatsapp.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/onboarding-types.d.ts +77 -0
- package/dist/plugin-sdk/channels/plugins/outbound/load.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/pairing-message.d.ts +1 -0
- package/dist/plugin-sdk/channels/plugins/pairing.d.ts +16 -0
- package/dist/plugin-sdk/channels/plugins/registry-loader.d.ts +5 -0
- package/dist/plugin-sdk/channels/plugins/setup-helpers.d.ts +13 -0
- package/dist/plugin-sdk/channels/plugins/status-issues/bluebubbles.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/status-issues/discord.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/status-issues/shared.d.ts +29 -0
- package/dist/plugin-sdk/channels/plugins/status-issues/telegram.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/status-issues/whatsapp.d.ts +2 -0
- package/dist/plugin-sdk/channels/plugins/types.adapters.d.ts +288 -0
- package/dist/plugin-sdk/channels/plugins/types.core.d.ts +349 -0
- package/dist/plugin-sdk/channels/plugins/types.d.ts +6 -0
- package/dist/plugin-sdk/channels/plugins/types.plugin.d.ts +54 -0
- package/dist/plugin-sdk/channels/plugins/whatsapp-heartbeat.d.ts +11 -0
- package/dist/plugin-sdk/channels/plugins/whatsapp-shared.d.ts +5 -0
- package/dist/plugin-sdk/channels/registry.d.ts +15 -0
- package/dist/plugin-sdk/channels/reply-prefix.d.ts +24 -0
- package/dist/plugin-sdk/channels/sender-label.d.ts +9 -0
- package/dist/plugin-sdk/channels/session.d.ts +18 -0
- package/dist/plugin-sdk/channels/status-reactions.d.ts +62 -0
- package/dist/plugin-sdk/channels/targets.d.ts +42 -0
- package/dist/plugin-sdk/channels/telegram/api.d.ts +5 -0
- package/dist/plugin-sdk/channels/typing-lifecycle.d.ts +12 -0
- package/dist/plugin-sdk/channels/typing.d.ts +13 -0
- package/dist/plugin-sdk/channels/web/index.d.ts +1 -0
- package/dist/plugin-sdk/cli/cli-name.d.ts +3 -0
- package/dist/plugin-sdk/cli/command-format.d.ts +1 -0
- package/dist/plugin-sdk/cli/deps.d.ts +18 -0
- package/dist/plugin-sdk/cli/outbound-send-deps.d.ts +4 -0
- package/dist/plugin-sdk/cli/outbound-send-mapping.d.ts +10 -0
- package/dist/plugin-sdk/cli/parse-bytes.d.ts +4 -0
- package/dist/plugin-sdk/cli/parse-duration.d.ts +4 -0
- package/dist/plugin-sdk/cli/profile-utils.d.ts +2 -0
- package/dist/plugin-sdk/cli/progress.d.ts +24 -0
- package/dist/plugin-sdk/cli/wait.d.ts +1 -0
- package/dist/plugin-sdk/commands/agent/delivery.d.ts +25 -0
- package/dist/plugin-sdk/commands/agent/run-context.d.ts +2 -0
- package/dist/plugin-sdk/commands/agent/session-store.d.ts +16 -0
- package/dist/plugin-sdk/commands/agent/session.d.ts +33 -0
- package/dist/plugin-sdk/commands/agent/types.d.ts +89 -0
- package/dist/plugin-sdk/commands/agent.d.ts +14 -0
- package/dist/plugin-sdk/commands/daemon-runtime.d.ts +8 -0
- package/dist/plugin-sdk/commands/health.d.ts +63 -0
- package/dist/plugin-sdk/commands/oauth-flow.d.ts +21 -0
- package/dist/plugin-sdk/commands/onboard-helpers.d.ts +81 -0
- package/dist/plugin-sdk/commands/onboard-types.d.ts +69 -0
- package/dist/plugin-sdk/commands/signal-install.d.ts +30 -0
- package/dist/plugin-sdk/compat/legacy-names.d.ts +8 -0
- package/dist/plugin-sdk/config/agent-dirs.d.ts +14 -0
- package/dist/plugin-sdk/config/agent-limits.d.ts +6 -0
- package/dist/plugin-sdk/config/backup-rotation.d.ts +5 -0
- package/dist/plugin-sdk/config/cache-utils.d.ts +6 -0
- package/dist/plugin-sdk/config/commands.d.ts +20 -0
- package/dist/plugin-sdk/config/config-paths.d.ts +10 -0
- package/dist/plugin-sdk/config/config.d.ts +7 -0
- package/dist/plugin-sdk/config/dangerous-name-matching.d.ts +12 -0
- package/dist/plugin-sdk/config/defaults.d.ts +19 -0
- package/dist/plugin-sdk/config/discord-preview-streaming.d.ts +25 -0
- package/dist/plugin-sdk/config/env-preserve.d.ts +10 -0
- package/dist/plugin-sdk/config/env-substitution.d.ts +36 -0
- package/dist/plugin-sdk/config/env-vars.d.ts +6 -0
- package/dist/plugin-sdk/config/group-policy.d.ts +49 -0
- package/dist/plugin-sdk/config/includes.d.ts +32 -0
- package/dist/plugin-sdk/config/io.d.ts +60 -0
- package/dist/plugin-sdk/config/legacy-migrate.d.ts +5 -0
- package/dist/plugin-sdk/config/legacy.d.ts +6 -0
- package/dist/plugin-sdk/config/legacy.migrations.d.ts +1 -0
- package/dist/plugin-sdk/config/legacy.migrations.part-1.d.ts +2 -0
- package/dist/plugin-sdk/config/legacy.migrations.part-2.d.ts +2 -0
- package/dist/plugin-sdk/config/legacy.migrations.part-3.d.ts +2 -0
- package/dist/plugin-sdk/config/legacy.rules.d.ts +2 -0
- package/dist/plugin-sdk/config/legacy.shared.d.ts +19 -0
- package/dist/plugin-sdk/config/markdown-tables.d.ts +7 -0
- package/dist/plugin-sdk/config/merge-config.d.ts +7 -0
- package/dist/plugin-sdk/config/merge-patch.d.ts +5 -0
- package/dist/plugin-sdk/config/model-input.d.ts +9 -0
- package/dist/plugin-sdk/config/normalize-paths.d.ts +8 -0
- package/dist/plugin-sdk/config/paths.d.ts +57 -0
- package/dist/plugin-sdk/config/prototype-keys.d.ts +1 -0
- package/dist/plugin-sdk/config/runtime-group-policy.d.ts +56 -0
- package/dist/plugin-sdk/config/runtime-overrides.d.ts +15 -0
- package/dist/plugin-sdk/config/sessions/artifacts.d.ts +5 -0
- package/dist/plugin-sdk/config/sessions/constants.d.ts +2 -0
- package/dist/plugin-sdk/config/sessions/delivery-info.d.ts +16 -0
- package/dist/plugin-sdk/config/sessions/disk-budget.d.ts +28 -0
- package/dist/plugin-sdk/config/sessions/group.d.ts +11 -0
- package/dist/plugin-sdk/config/sessions/main-session.d.ts +43 -0
- package/dist/plugin-sdk/config/sessions/metadata.d.ts +16 -0
- package/dist/plugin-sdk/config/sessions/paths.d.ts +21 -0
- package/dist/plugin-sdk/config/sessions/reset.d.ts +43 -0
- package/dist/plugin-sdk/config/sessions/session-file.d.ts +15 -0
- package/dist/plugin-sdk/config/sessions/session-key.d.ts +8 -0
- package/dist/plugin-sdk/config/sessions/store.d.ts +123 -0
- package/dist/plugin-sdk/config/sessions/transcript.d.ts +18 -0
- package/dist/plugin-sdk/config/sessions/types.d.ts +160 -0
- package/dist/plugin-sdk/config/sessions.d.ts +13 -0
- package/dist/plugin-sdk/config/talk.d.ts +21 -0
- package/dist/plugin-sdk/config/telegram-custom-commands.d.ts +24 -0
- package/dist/plugin-sdk/config/types.agent-defaults.d.ts +268 -0
- package/dist/plugin-sdk/config/types.agents-shared.d.ts +49 -0
- package/dist/plugin-sdk/config/types.agents.d.ts +57 -0
- package/dist/plugin-sdk/config/types.approvals.d.ts +26 -0
- package/dist/plugin-sdk/config/types.auth.d.ts +28 -0
- package/dist/plugin-sdk/config/types.base.d.ts +203 -0
- package/dist/plugin-sdk/config/types.browser.d.ts +65 -0
- package/dist/plugin-sdk/config/types.channel-messaging-common.d.ts +44 -0
- package/dist/plugin-sdk/config/types.channels.d.ts +53 -0
- package/dist/plugin-sdk/config/types.cron.d.ts +26 -0
- package/dist/plugin-sdk/config/types.d.ts +27 -0
- package/dist/plugin-sdk/config/types.discord.d.ts +273 -0
- package/dist/plugin-sdk/config/types.gateway.d.ts +335 -0
- package/dist/plugin-sdk/config/types.googlechat.d.ts +107 -0
- package/dist/plugin-sdk/config/types.hooks.d.ts +123 -0
- package/dist/plugin-sdk/config/types.imessage.d.ts +77 -0
- package/dist/plugin-sdk/config/types.installs.d.ts +14 -0
- package/dist/plugin-sdk/config/types.irc.d.ts +54 -0
- package/dist/plugin-sdk/config/types.messages.d.ts +154 -0
- package/dist/plugin-sdk/config/types.models.d.ts +41 -0
- package/dist/plugin-sdk/config/types.msteams.d.ts +108 -0
- package/dist/plugin-sdk/config/types.node-host.d.ts +10 -0
- package/dist/plugin-sdk/config/types.plugins.d.ts +23 -0
- package/dist/plugin-sdk/config/types.queue.d.ts +14 -0
- package/dist/plugin-sdk/config/types.remoteclaw.d.ts +119 -0
- package/dist/plugin-sdk/config/types.signal.d.ts +46 -0
- package/dist/plugin-sdk/config/types.slack.d.ts +181 -0
- package/dist/plugin-sdk/config/types.telegram.d.ts +191 -0
- package/dist/plugin-sdk/config/types.tools.d.ts +322 -0
- package/dist/plugin-sdk/config/types.tts.d.ts +78 -0
- package/dist/plugin-sdk/config/types.whatsapp.d.ts +101 -0
- package/dist/plugin-sdk/config/validation.d.ts +37 -0
- package/dist/plugin-sdk/config/version.d.ts +8 -0
- package/dist/plugin-sdk/config/zod-schema.agent-defaults.d.ts +156 -0
- package/dist/plugin-sdk/config/zod-schema.agent-model.d.ts +5 -0
- package/dist/plugin-sdk/config/zod-schema.agent-runtime.d.ts +500 -0
- package/dist/plugin-sdk/config/zod-schema.agents.d.ts +298 -0
- package/dist/plugin-sdk/config/zod-schema.allowdeny.d.ts +13 -0
- package/dist/plugin-sdk/config/zod-schema.approvals.d.ts +15 -0
- package/dist/plugin-sdk/config/zod-schema.channels.d.ts +6 -0
- package/dist/plugin-sdk/config/zod-schema.core.d.ts +583 -0
- package/dist/plugin-sdk/config/zod-schema.d.ts +3434 -0
- package/dist/plugin-sdk/config/zod-schema.hooks.d.ts +85 -0
- package/dist/plugin-sdk/config/zod-schema.installs.d.ts +16 -0
- package/dist/plugin-sdk/config/zod-schema.providers-core.d.ts +3693 -0
- package/dist/plugin-sdk/config/zod-schema.providers-whatsapp.d.ts +235 -0
- package/dist/plugin-sdk/config/zod-schema.providers.d.ts +2200 -0
- package/dist/plugin-sdk/config/zod-schema.sensitive.d.ts +2 -0
- package/dist/plugin-sdk/config/zod-schema.session.d.ts +234 -0
- package/dist/plugin-sdk/cron/delivery.d.ts +9 -0
- package/dist/plugin-sdk/cron/legacy-delivery.d.ts +3 -0
- package/dist/plugin-sdk/cron/parse.d.ts +1 -0
- package/dist/plugin-sdk/cron/payload-migration.d.ts +3 -0
- package/dist/plugin-sdk/cron/schedule.d.ts +2 -0
- package/dist/plugin-sdk/cron/service/jobs.d.ts +21 -0
- package/dist/plugin-sdk/cron/service/locked.d.ts +2 -0
- package/dist/plugin-sdk/cron/service/normalize.d.ts +18 -0
- package/dist/plugin-sdk/cron/service/ops.d.ts +81 -0
- package/dist/plugin-sdk/cron/service/state.d.ts +125 -0
- package/dist/plugin-sdk/cron/service/store.d.ts +9 -0
- package/dist/plugin-sdk/cron/service/timer.d.ts +47 -0
- package/dist/plugin-sdk/cron/service.d.ts +66 -0
- package/dist/plugin-sdk/cron/session-reaper.d.ts +35 -0
- package/dist/plugin-sdk/cron/stagger.d.ts +8 -0
- package/dist/plugin-sdk/cron/store.d.ts +6 -0
- package/dist/plugin-sdk/cron/types.d.ts +131 -0
- package/dist/plugin-sdk/cron/webhook-url.d.ts +1 -0
- package/dist/plugin-sdk/daemon/constants.d.ts +35 -0
- package/dist/plugin-sdk/discord/accounts.d.ts +21 -0
- package/dist/plugin-sdk/discord/api.d.ts +11 -0
- package/dist/plugin-sdk/discord/audit.d.ts +29 -0
- package/dist/plugin-sdk/discord/chunk.d.ts +20 -0
- package/dist/plugin-sdk/discord/client.d.ts +21 -0
- package/dist/plugin-sdk/discord/components-registry.d.ts +16 -0
- package/dist/plugin-sdk/discord/components.d.ts +196 -0
- package/dist/plugin-sdk/discord/directory-live.d.ts +4 -0
- package/dist/plugin-sdk/discord/draft-chunking.d.ts +6 -0
- package/dist/plugin-sdk/discord/draft-stream.d.ts +21 -0
- package/dist/plugin-sdk/discord/gateway-logging.d.ts +8 -0
- package/dist/plugin-sdk/discord/guilds.d.ts +6 -0
- package/dist/plugin-sdk/discord/monitor/agent-components.d.ts +55 -0
- package/dist/plugin-sdk/discord/monitor/allow-list.d.ts +176 -0
- package/dist/plugin-sdk/discord/monitor/commands.d.ts +2 -0
- package/dist/plugin-sdk/discord/monitor/format.d.ts +13 -0
- package/dist/plugin-sdk/discord/monitor/gateway-plugin.d.ts +8 -0
- package/dist/plugin-sdk/discord/monitor/gateway-registry.d.ts +9 -0
- package/dist/plugin-sdk/discord/monitor/listeners.d.ts +44 -0
- package/dist/plugin-sdk/discord/monitor/message-handler.d.ts +5 -0
- package/dist/plugin-sdk/discord/monitor/message-handler.preflight.d.ts +14 -0
- package/dist/plugin-sdk/discord/monitor/message-handler.preflight.types.d.ts +95 -0
- package/dist/plugin-sdk/discord/monitor/message-handler.process.d.ts +2 -0
- package/dist/plugin-sdk/discord/monitor/message-utils.d.ts +40 -0
- package/dist/plugin-sdk/discord/monitor/native-command.d.ts +23 -0
- package/dist/plugin-sdk/discord/monitor/presence-cache.d.ts +9 -0
- package/dist/plugin-sdk/discord/monitor/presence.d.ts +5 -0
- package/dist/plugin-sdk/discord/monitor/provider.allowlist.d.ts +14 -0
- package/dist/plugin-sdk/discord/monitor/provider.d.ts +28 -0
- package/dist/plugin-sdk/discord/monitor/provider.lifecycle.d.ts +23 -0
- package/dist/plugin-sdk/discord/monitor/reply-context.d.ts +17 -0
- package/dist/plugin-sdk/discord/monitor/reply-delivery.d.ts +22 -0
- package/dist/plugin-sdk/discord/monitor/rest-fetch.d.ts +2 -0
- package/dist/plugin-sdk/discord/monitor/sender-identity.d.ts +31 -0
- package/dist/plugin-sdk/discord/monitor/system-events.d.ts +2 -0
- package/dist/plugin-sdk/discord/monitor/thread-bindings.d.ts +5 -0
- package/dist/plugin-sdk/discord/monitor/thread-bindings.discord-api.d.ts +36 -0
- package/dist/plugin-sdk/discord/monitor/thread-bindings.lifecycle.d.ts +30 -0
- package/dist/plugin-sdk/discord/monitor/thread-bindings.manager.d.ts +17 -0
- package/dist/plugin-sdk/discord/monitor/thread-bindings.messages.d.ts +17 -0
- package/dist/plugin-sdk/discord/monitor/thread-bindings.state.d.ts +61 -0
- package/dist/plugin-sdk/discord/monitor/thread-bindings.types.d.ts +64 -0
- package/dist/plugin-sdk/discord/monitor/threading.d.ts +106 -0
- package/dist/plugin-sdk/discord/monitor/typing.d.ts +5 -0
- package/dist/plugin-sdk/discord/monitor.d.ts +10 -0
- package/dist/plugin-sdk/discord/monitor.gateway.d.ts +12 -0
- package/dist/plugin-sdk/discord/pluralkit.d.ts +26 -0
- package/dist/plugin-sdk/discord/probe.d.ts +28 -0
- package/dist/plugin-sdk/discord/resolve-channels.d.ts +15 -0
- package/dist/plugin-sdk/discord/resolve-users.d.ts +14 -0
- package/dist/plugin-sdk/discord/send.channels.d.ts +17 -0
- package/dist/plugin-sdk/discord/send.components.d.ts +17 -0
- package/dist/plugin-sdk/discord/send.d.ts +10 -0
- package/dist/plugin-sdk/discord/send.emojis-stickers.d.ts +4 -0
- package/dist/plugin-sdk/discord/send.guild.d.ts +24 -0
- package/dist/plugin-sdk/discord/send.messages.d.ts +20 -0
- package/dist/plugin-sdk/discord/send.outbound.d.ts +57 -0
- package/dist/plugin-sdk/discord/send.permissions.d.ts +20 -0
- package/dist/plugin-sdk/discord/send.reactions.d.ts +15 -0
- package/dist/plugin-sdk/discord/send.shared.d.ts +85 -0
- package/dist/plugin-sdk/discord/send.types.d.ts +144 -0
- package/dist/plugin-sdk/discord/targets.d.ts +18 -0
- package/dist/plugin-sdk/discord/token.d.ts +11 -0
- package/dist/plugin-sdk/discord/voice/command.d.ts +15 -0
- package/dist/plugin-sdk/discord/voice/manager.d.ts +52 -0
- package/dist/plugin-sdk/discord/voice-message.d.ts +50 -0
- package/dist/plugin-sdk/gateway/call.d.ts +65 -0
- package/dist/plugin-sdk/gateway/chat-abort.d.ts +44 -0
- package/dist/plugin-sdk/gateway/chat-sanitize.d.ts +4 -0
- package/dist/plugin-sdk/gateway/client.d.ts +64 -0
- package/dist/plugin-sdk/gateway/control-ui-shared.d.ts +9 -0
- package/dist/plugin-sdk/gateway/credentials.d.ts +36 -0
- package/dist/plugin-sdk/gateway/device-auth.d.ts +11 -0
- package/dist/plugin-sdk/gateway/method-scopes.d.ts +22 -0
- package/dist/plugin-sdk/gateway/net.d.ts +77 -0
- package/dist/plugin-sdk/gateway/node-registry.d.ts +60 -0
- package/dist/plugin-sdk/gateway/protocol/client-info.d.ts +58 -0
- package/dist/plugin-sdk/gateway/protocol/index.d.ts +497 -0
- package/dist/plugin-sdk/gateway/protocol/schema/agent.d.ts +89 -0
- package/dist/plugin-sdk/gateway/protocol/schema/agents-models-skills.d.ts +188 -0
- package/dist/plugin-sdk/gateway/protocol/schema/channels.d.ts +134 -0
- package/dist/plugin-sdk/gateway/protocol/schema/config.d.ts +53 -0
- package/dist/plugin-sdk/gateway/protocol/schema/cron.d.ts +324 -0
- package/dist/plugin-sdk/gateway/protocol/schema/devices.d.ts +41 -0
- package/dist/plugin-sdk/gateway/protocol/schema/error-codes.d.ts +14 -0
- package/dist/plugin-sdk/gateway/protocol/schema/frames.d.ts +168 -0
- package/dist/plugin-sdk/gateway/protocol/schema/logs-chat.d.ts +45 -0
- package/dist/plugin-sdk/gateway/protocol/schema/nodes.d.ts +64 -0
- package/dist/plugin-sdk/gateway/protocol/schema/primitives.d.ts +4 -0
- package/dist/plugin-sdk/gateway/protocol/schema/protocol-schemas.d.ts +3 -0
- package/dist/plugin-sdk/gateway/protocol/schema/push.d.ts +15 -0
- package/dist/plugin-sdk/gateway/protocol/schema/sessions.d.ts +81 -0
- package/dist/plugin-sdk/gateway/protocol/schema/snapshot.d.ts +69 -0
- package/dist/plugin-sdk/gateway/protocol/schema/types.d.ts +120 -0
- package/dist/plugin-sdk/gateway/protocol/schema/wizard.d.ts +86 -0
- package/dist/plugin-sdk/gateway/protocol/schema.d.ts +16 -0
- package/dist/plugin-sdk/gateway/server/ws-types.d.ts +9 -0
- package/dist/plugin-sdk/gateway/server-broadcast.d.ts +17 -0
- package/dist/plugin-sdk/gateway/server-channels.d.ts +26 -0
- package/dist/plugin-sdk/gateway/server-constants.d.ts +10 -0
- package/dist/plugin-sdk/gateway/server-methods/types.d.ts +84 -0
- package/dist/plugin-sdk/gateway/server-shared.d.ts +7 -0
- package/dist/plugin-sdk/gateway/session-utils.fs.d.ts +48 -0
- package/dist/plugin-sdk/gateway/session-utils.types.d.ts +84 -0
- package/dist/plugin-sdk/gateway/ws-log.d.ts +5 -0
- package/dist/plugin-sdk/gateway/ws-logging.d.ts +4 -0
- package/dist/plugin-sdk/globals.d.ts +11 -0
- package/dist/plugin-sdk/hooks/internal-hooks.d.ts +140 -0
- package/dist/plugin-sdk/hooks/types.d.ts +62 -0
- package/dist/plugin-sdk/imessage/accounts.d.ts +16 -0
- package/dist/plugin-sdk/imessage/client.d.ts +46 -0
- package/dist/plugin-sdk/imessage/constants.d.ts +2 -0
- package/dist/plugin-sdk/imessage/monitor/abort-handler.d.ts +9 -0
- package/dist/plugin-sdk/imessage/monitor/deliver.d.ts +14 -0
- package/dist/plugin-sdk/imessage/monitor/echo-cache.d.ts +9 -0
- package/dist/plugin-sdk/imessage/monitor/inbound-processing.d.ts +96 -0
- package/dist/plugin-sdk/imessage/monitor/monitor-provider.d.ts +7 -0
- package/dist/plugin-sdk/imessage/monitor/parse-notification.d.ts +2 -0
- package/dist/plugin-sdk/imessage/monitor/runtime.d.ts +4 -0
- package/dist/plugin-sdk/imessage/monitor/types.d.ts +37 -0
- package/dist/plugin-sdk/imessage/monitor.d.ts +2 -0
- package/dist/plugin-sdk/imessage/probe.d.ts +17 -0
- package/dist/plugin-sdk/imessage/send.d.ts +34 -0
- package/dist/plugin-sdk/imessage/target-parsing-helpers.d.ts +45 -0
- package/dist/plugin-sdk/imessage/targets.d.ts +39 -0
- package/dist/plugin-sdk/index.d.ts +1 -0
- package/dist/plugin-sdk/index.js +24645 -0
- package/dist/plugin-sdk/infra/agent-events.d.ts +21 -0
- package/dist/plugin-sdk/infra/archive-path.d.ts +12 -0
- package/dist/plugin-sdk/infra/archive.d.ts +46 -0
- package/dist/plugin-sdk/infra/backoff.d.ts +8 -0
- package/dist/plugin-sdk/infra/brew.d.ts +8 -0
- package/dist/plugin-sdk/infra/channel-activity.d.ts +18 -0
- package/dist/plugin-sdk/infra/channel-summary.d.ts +6 -0
- package/dist/plugin-sdk/infra/dedupe.d.ts +12 -0
- package/dist/plugin-sdk/infra/device-auth-store.d.ts +18 -0
- package/dist/plugin-sdk/infra/device-identity.d.ts +11 -0
- package/dist/plugin-sdk/infra/device-pairing.d.ts +101 -0
- package/dist/plugin-sdk/infra/diagnostic-events.d.ts +140 -0
- package/dist/plugin-sdk/infra/diagnostic-flags.d.ts +4 -0
- package/dist/plugin-sdk/infra/dotenv.d.ts +3 -0
- package/dist/plugin-sdk/infra/env.d.ts +11 -0
- package/dist/plugin-sdk/infra/errors.d.ts +11 -0
- package/dist/plugin-sdk/infra/fetch.d.ts +2 -0
- package/dist/plugin-sdk/infra/file-identity.d.ts +5 -0
- package/dist/plugin-sdk/infra/file-lock.d.ts +2 -0
- package/dist/plugin-sdk/infra/format-time/format-datetime.d.ts +35 -0
- package/dist/plugin-sdk/infra/format-time/format-duration.d.ts +23 -0
- package/dist/plugin-sdk/infra/format-time/format-relative.d.ts +39 -0
- package/dist/plugin-sdk/infra/fs-safe.d.ts +25 -0
- package/dist/plugin-sdk/infra/gemini-auth.d.ts +16 -0
- package/dist/plugin-sdk/infra/git-commit.d.ts +4 -0
- package/dist/plugin-sdk/infra/git-root.d.ts +7 -0
- package/dist/plugin-sdk/infra/heartbeat-active-hours.d.ts +5 -0
- package/dist/plugin-sdk/infra/heartbeat-events-filter.d.ts +8 -0
- package/dist/plugin-sdk/infra/heartbeat-events.d.ts +21 -0
- package/dist/plugin-sdk/infra/heartbeat-reason.d.ts +5 -0
- package/dist/plugin-sdk/infra/heartbeat-runner.d.ts +45 -0
- package/dist/plugin-sdk/infra/heartbeat-visibility.d.ts +17 -0
- package/dist/plugin-sdk/infra/heartbeat-wake.d.ts +31 -0
- package/dist/plugin-sdk/infra/home-dir.d.ts +7 -0
- package/dist/plugin-sdk/infra/host-env-security.d.ts +21 -0
- package/dist/plugin-sdk/infra/http-body.d.ts +46 -0
- package/dist/plugin-sdk/infra/json-file.d.ts +2 -0
- package/dist/plugin-sdk/infra/json-files.d.ts +5 -0
- package/dist/plugin-sdk/infra/map-size.d.ts +1 -0
- package/dist/plugin-sdk/infra/net/fetch-guard.d.ts +21 -0
- package/dist/plugin-sdk/infra/net/hostname.d.ts +1 -0
- package/dist/plugin-sdk/infra/net/ssrf.d.ts +35 -0
- package/dist/plugin-sdk/infra/outbound/abort.d.ts +8 -0
- package/dist/plugin-sdk/infra/outbound/agent-delivery.d.ts +46 -0
- package/dist/plugin-sdk/infra/outbound/bound-delivery-router.d.ts +16 -0
- package/dist/plugin-sdk/infra/outbound/channel-selection.d.ts +11 -0
- package/dist/plugin-sdk/infra/outbound/channel-target.d.ts +6 -0
- package/dist/plugin-sdk/infra/outbound/deliver.d.ts +81 -0
- package/dist/plugin-sdk/infra/outbound/delivery-queue.d.ts +78 -0
- package/dist/plugin-sdk/infra/outbound/directory-cache.d.ts +24 -0
- package/dist/plugin-sdk/infra/outbound/envelope.d.ts +16 -0
- package/dist/plugin-sdk/infra/outbound/format.d.ts +39 -0
- package/dist/plugin-sdk/infra/outbound/identity.d.ts +8 -0
- package/dist/plugin-sdk/infra/outbound/message-action-spec.d.ts +5 -0
- package/dist/plugin-sdk/infra/outbound/payloads.d.ts +18 -0
- package/dist/plugin-sdk/infra/outbound/session-binding-service.d.ts +57 -0
- package/dist/plugin-sdk/infra/outbound/target-errors.d.ts +6 -0
- package/dist/plugin-sdk/infra/outbound/target-normalization.d.ts +4 -0
- package/dist/plugin-sdk/infra/outbound/target-resolver.d.ts +53 -0
- package/dist/plugin-sdk/infra/outbound/targets.d.ts +87 -0
- package/dist/plugin-sdk/infra/pairing-files.d.ts +23 -0
- package/dist/plugin-sdk/infra/pairing-pending.d.ts +13 -0
- package/dist/plugin-sdk/infra/pairing-token.d.ts +3 -0
- package/dist/plugin-sdk/infra/path-guards.d.ts +5 -0
- package/dist/plugin-sdk/infra/path-safety.d.ts +2 -0
- package/dist/plugin-sdk/infra/plain-object.d.ts +4 -0
- package/dist/plugin-sdk/infra/prototype-keys.d.ts +1 -0
- package/dist/plugin-sdk/infra/provider-usage.auth.d.ts +11 -0
- package/dist/plugin-sdk/infra/provider-usage.d.ts +4 -0
- package/dist/plugin-sdk/infra/provider-usage.fetch.claude.d.ts +2 -0
- package/dist/plugin-sdk/infra/provider-usage.fetch.codex.d.ts +2 -0
- package/dist/plugin-sdk/infra/provider-usage.fetch.copilot.d.ts +2 -0
- package/dist/plugin-sdk/infra/provider-usage.fetch.d.ts +6 -0
- package/dist/plugin-sdk/infra/provider-usage.fetch.gemini.d.ts +2 -0
- package/dist/plugin-sdk/infra/provider-usage.fetch.minimax.d.ts +2 -0
- package/dist/plugin-sdk/infra/provider-usage.fetch.shared.d.ts +12 -0
- package/dist/plugin-sdk/infra/provider-usage.fetch.zai.d.ts +2 -0
- package/dist/plugin-sdk/infra/provider-usage.format.d.ts +13 -0
- package/dist/plugin-sdk/infra/provider-usage.load.d.ts +12 -0
- package/dist/plugin-sdk/infra/provider-usage.shared.d.ts +8 -0
- package/dist/plugin-sdk/infra/provider-usage.types.d.ts +17 -0
- package/dist/plugin-sdk/infra/restart.d.ts +70 -0
- package/dist/plugin-sdk/infra/retry-policy.d.ts +25 -0
- package/dist/plugin-sdk/infra/retry.d.ts +21 -0
- package/dist/plugin-sdk/infra/safe-executable-value.d.ts +1 -0
- package/dist/plugin-sdk/infra/scp-host.d.ts +2 -0
- package/dist/plugin-sdk/infra/secure-random.d.ts +2 -0
- package/dist/plugin-sdk/infra/session-cost-usage.d.ts +45 -0
- package/dist/plugin-sdk/infra/session-cost-usage.types.d.ts +153 -0
- package/dist/plugin-sdk/infra/session-maintenance-warning.d.ts +10 -0
- package/dist/plugin-sdk/infra/shell-env.d.ts +34 -0
- package/dist/plugin-sdk/infra/system-events.d.ts +18 -0
- package/dist/plugin-sdk/infra/tailnet.d.ts +8 -0
- package/dist/plugin-sdk/infra/tls/fingerprint.d.ts +1 -0
- package/dist/plugin-sdk/infra/tls/gateway.d.ts +16 -0
- package/dist/plugin-sdk/infra/tmp-remoteclaw-dir.d.ts +18 -0
- package/dist/plugin-sdk/infra/transport-ready.d.ts +16 -0
- package/dist/plugin-sdk/infra/unhandled-rejections.d.ts +15 -0
- package/dist/plugin-sdk/infra/ws.d.ts +2 -0
- package/dist/plugin-sdk/infra/wsl.d.ts +11 -0
- package/dist/plugin-sdk/line/accounts.d.ts +10 -0
- package/dist/plugin-sdk/line/actions.d.ts +22 -0
- package/dist/plugin-sdk/line/auto-reply-delivery.d.ts +38 -0
- package/dist/plugin-sdk/line/bot-access.d.ts +17 -0
- package/dist/plugin-sdk/line/bot-handlers.d.ts +13 -0
- package/dist/plugin-sdk/line/bot-message-context.d.ts +118 -0
- package/dist/plugin-sdk/line/bot.d.ts +24 -0
- package/dist/plugin-sdk/line/channel-access-token.d.ts +4 -0
- package/dist/plugin-sdk/line/config-schema.d.ts +64 -0
- package/dist/plugin-sdk/line/download.d.ts +7 -0
- package/dist/plugin-sdk/line/flex-templates/basic-cards.d.ts +46 -0
- package/dist/plugin-sdk/line/flex-templates/common.d.ts +2 -0
- package/dist/plugin-sdk/line/flex-templates/media-control-cards.d.ts +73 -0
- package/dist/plugin-sdk/line/flex-templates/message.d.ts +6 -0
- package/dist/plugin-sdk/line/flex-templates/schedule-cards.d.ts +55 -0
- package/dist/plugin-sdk/line/flex-templates/types.d.ts +19 -0
- package/dist/plugin-sdk/line/flex-templates.d.ts +5 -0
- package/dist/plugin-sdk/line/markdown-to-line.d.ts +72 -0
- package/dist/plugin-sdk/line/monitor.d.ts +28 -0
- package/dist/plugin-sdk/line/probe.d.ts +2 -0
- package/dist/plugin-sdk/line/reply-chunks.d.ts +24 -0
- package/dist/plugin-sdk/line/send.d.ts +91 -0
- package/dist/plugin-sdk/line/signature.d.ts +1 -0
- package/dist/plugin-sdk/line/template-messages.d.ts +100 -0
- package/dist/plugin-sdk/line/types.d.ts +113 -0
- package/dist/plugin-sdk/line/webhook-node.d.ts +15 -0
- package/dist/plugin-sdk/line/webhook-utils.d.ts +3 -0
- package/dist/plugin-sdk/line/webhook.d.ts +19 -0
- package/dist/plugin-sdk/link-understanding/apply.d.ts +10 -0
- package/dist/plugin-sdk/link-understanding/defaults.d.ts +2 -0
- package/dist/plugin-sdk/link-understanding/detect.d.ts +3 -0
- package/dist/plugin-sdk/link-understanding/format.d.ts +4 -0
- package/dist/plugin-sdk/link-understanding/runner.d.ts +11 -0
- package/dist/plugin-sdk/logger.d.ts +6 -0
- package/dist/plugin-sdk/logging/config.d.ts +4 -0
- package/dist/plugin-sdk/logging/console.d.ts +23 -0
- package/dist/plugin-sdk/logging/diagnostic-session-state.d.ts +30 -0
- package/dist/plugin-sdk/logging/diagnostic.d.ts +65 -0
- package/dist/plugin-sdk/logging/env-log-level.d.ts +2 -0
- package/dist/plugin-sdk/logging/levels.d.ts +5 -0
- package/dist/plugin-sdk/logging/logger.d.ts +44 -0
- package/dist/plugin-sdk/logging/node-require.d.ts +1 -0
- package/dist/plugin-sdk/logging/redact-identifier.d.ts +4 -0
- package/dist/plugin-sdk/logging/redact.d.ts +9 -0
- package/dist/plugin-sdk/logging/state.d.ts +19 -0
- package/dist/plugin-sdk/logging/subsystem.d.ts +18 -0
- package/dist/plugin-sdk/logging/timestamps.d.ts +1 -0
- package/dist/plugin-sdk/logging.d.ts +10 -0
- package/dist/plugin-sdk/markdown/fences.d.ts +10 -0
- package/dist/plugin-sdk/markdown/ir.d.ts +32 -0
- package/dist/plugin-sdk/markdown/render.d.ts +18 -0
- package/dist/plugin-sdk/markdown/tables.d.ts +2 -0
- package/dist/plugin-sdk/markdown/whatsapp.d.ts +14 -0
- package/dist/plugin-sdk/media/audio-tags.d.ts +10 -0
- package/dist/plugin-sdk/media/audio.d.ts +19 -0
- package/dist/plugin-sdk/media/base64.d.ts +6 -0
- package/dist/plugin-sdk/media/constants.d.ts +7 -0
- package/dist/plugin-sdk/media/fetch.d.ts +23 -0
- package/dist/plugin-sdk/media/image-ops.d.ts +41 -0
- package/dist/plugin-sdk/media/inbound-path-policy.d.ts +18 -0
- package/dist/plugin-sdk/media/input-files.d.ts +95 -0
- package/dist/plugin-sdk/media/local-roots.d.ts +3 -0
- package/dist/plugin-sdk/media/mime.d.ts +16 -0
- package/dist/plugin-sdk/media/outbound-attachment.d.ts +6 -0
- package/dist/plugin-sdk/media/parse.d.ts +8 -0
- package/dist/plugin-sdk/media/png-encode.d.ts +8 -0
- package/dist/plugin-sdk/media/read-response-with-limit.d.ts +7 -0
- package/dist/plugin-sdk/media/store.d.ts +33 -0
- package/dist/plugin-sdk/media-understanding/apply.d.ts +19 -0
- package/dist/plugin-sdk/media-understanding/attachments.d.ts +49 -0
- package/dist/plugin-sdk/media-understanding/audio-preflight.d.ts +16 -0
- package/dist/plugin-sdk/media-understanding/concurrency.d.ts +1 -0
- package/dist/plugin-sdk/media-understanding/defaults.d.ts +12 -0
- package/dist/plugin-sdk/media-understanding/errors.d.ts +6 -0
- package/dist/plugin-sdk/media-understanding/format.d.ts +7 -0
- package/dist/plugin-sdk/media-understanding/fs.d.ts +1 -0
- package/dist/plugin-sdk/media-understanding/output-extract.d.ts +2 -0
- package/dist/plugin-sdk/media-understanding/providers/anthropic/index.d.ts +2 -0
- package/dist/plugin-sdk/media-understanding/providers/deepgram/audio.d.ts +4 -0
- package/dist/plugin-sdk/media-understanding/providers/deepgram/index.d.ts +2 -0
- package/dist/plugin-sdk/media-understanding/providers/google/audio.d.ts +3 -0
- package/dist/plugin-sdk/media-understanding/providers/google/index.d.ts +2 -0
- package/dist/plugin-sdk/media-understanding/providers/google/inline-data.d.ts +20 -0
- package/dist/plugin-sdk/media-understanding/providers/google/video.d.ts +3 -0
- package/dist/plugin-sdk/media-understanding/providers/groq/index.d.ts +2 -0
- package/dist/plugin-sdk/media-understanding/providers/index.d.ts +4 -0
- package/dist/plugin-sdk/media-understanding/providers/minimax/index.d.ts +2 -0
- package/dist/plugin-sdk/media-understanding/providers/mistral/index.d.ts +2 -0
- package/dist/plugin-sdk/media-understanding/providers/moonshot/index.d.ts +2 -0
- package/dist/plugin-sdk/media-understanding/providers/moonshot/video.d.ts +3 -0
- package/dist/plugin-sdk/media-understanding/providers/openai/audio.d.ts +3 -0
- package/dist/plugin-sdk/media-understanding/providers/openai/index.d.ts +2 -0
- package/dist/plugin-sdk/media-understanding/providers/shared.d.ts +20 -0
- package/dist/plugin-sdk/media-understanding/providers/zai/index.d.ts +2 -0
- package/dist/plugin-sdk/media-understanding/resolve.d.ts +44 -0
- package/dist/plugin-sdk/media-understanding/runner.d.ts +34 -0
- package/dist/plugin-sdk/media-understanding/runner.entries.d.ts +33 -0
- package/dist/plugin-sdk/media-understanding/scope.d.ts +9 -0
- package/dist/plugin-sdk/media-understanding/types.d.ts +74 -0
- package/dist/plugin-sdk/media-understanding/video.d.ts +2 -0
- package/dist/plugin-sdk/middleware/channel-bridge.d.ts +39 -0
- package/dist/plugin-sdk/middleware/cli-runtime-base.d.ts +35 -0
- package/dist/plugin-sdk/middleware/delivery-adapter.d.ts +36 -0
- package/dist/plugin-sdk/middleware/error-classifier.d.ts +14 -0
- package/dist/plugin-sdk/middleware/mcp-side-effects.d.ts +20 -0
- package/dist/plugin-sdk/middleware/runtime-factory.d.ts +4 -0
- package/dist/plugin-sdk/middleware/runtimes/claude.d.ts +27 -0
- package/dist/plugin-sdk/middleware/runtimes/codex.d.ts +74 -0
- package/dist/plugin-sdk/middleware/runtimes/gemini.d.ts +52 -0
- package/dist/plugin-sdk/middleware/runtimes/opencode.d.ts +54 -0
- package/dist/plugin-sdk/middleware/session-map.d.ts +36 -0
- package/dist/plugin-sdk/middleware/system-prompt.d.ts +30 -0
- package/dist/plugin-sdk/middleware/types.d.ts +188 -0
- package/dist/plugin-sdk/pairing/pairing-labels.d.ts +2 -0
- package/dist/plugin-sdk/pairing/pairing-messages.d.ts +6 -0
- package/dist/plugin-sdk/pairing/pairing-store.d.ts +48 -0
- package/dist/plugin-sdk/plugin-sdk/account-id.d.ts +1 -0
- package/dist/plugin-sdk/plugin-sdk/agent-media-payload.d.ts +12 -0
- package/dist/plugin-sdk/plugin-sdk/allow-from.d.ts +32 -0
- package/dist/plugin-sdk/plugin-sdk/command-auth.d.ts +25 -0
- package/dist/plugin-sdk/plugin-sdk/config-paths.d.ts +6 -0
- package/dist/plugin-sdk/plugin-sdk/file-lock.d.ts +16 -0
- package/dist/plugin-sdk/plugin-sdk/group-access.d.ts +16 -0
- package/dist/plugin-sdk/plugin-sdk/index.d.ts +162 -0
- package/dist/plugin-sdk/plugin-sdk/json-store.d.ts +5 -0
- package/dist/plugin-sdk/plugin-sdk/onboarding.d.ts +11 -0
- package/dist/plugin-sdk/plugin-sdk/persistent-dedupe.d.ts +20 -0
- package/dist/plugin-sdk/plugin-sdk/reply-payload.d.ts +22 -0
- package/dist/plugin-sdk/plugin-sdk/run-command.d.ts +12 -0
- package/dist/plugin-sdk/plugin-sdk/runtime.d.ts +10 -0
- package/dist/plugin-sdk/plugin-sdk/slack-message-actions.d.ts +11 -0
- package/dist/plugin-sdk/plugin-sdk/status-helpers.d.ts +88 -0
- package/dist/plugin-sdk/plugin-sdk/temp-path.d.ts +12 -0
- package/dist/plugin-sdk/plugin-sdk/text-chunking.d.ts +1 -0
- package/dist/plugin-sdk/plugin-sdk/tool-send.d.ts +4 -0
- package/dist/plugin-sdk/plugin-sdk/webhook-path.d.ts +6 -0
- package/dist/plugin-sdk/plugin-sdk/webhook-targets.d.ts +23 -0
- package/dist/plugin-sdk/plugins/bundled-dir.d.ts +1 -0
- package/dist/plugin-sdk/plugins/commands.d.ts +83 -0
- package/dist/plugin-sdk/plugins/config-schema.d.ts +2 -0
- package/dist/plugin-sdk/plugins/config-state.d.ts +30 -0
- package/dist/plugin-sdk/plugins/discovery.d.ts +24 -0
- package/dist/plugin-sdk/plugins/hook-runner-global.d.ts +37 -0
- package/dist/plugin-sdk/plugins/hooks.d.ts +49 -0
- package/dist/plugin-sdk/plugins/http-path.d.ts +1 -0
- package/dist/plugin-sdk/plugins/http-registry.d.ts +13 -0
- package/dist/plugin-sdk/plugins/manifest-registry.d.ts +34 -0
- package/dist/plugin-sdk/plugins/manifest.d.ts +66 -0
- package/dist/plugin-sdk/plugins/path-safety.d.ts +5 -0
- package/dist/plugin-sdk/plugins/registry.d.ts +130 -0
- package/dist/plugin-sdk/plugins/runtime/native-deps.d.ts +8 -0
- package/dist/plugin-sdk/plugins/runtime/types.d.ts +310 -0
- package/dist/plugin-sdk/plugins/runtime.d.ts +5 -0
- package/dist/plugin-sdk/plugins/schema-validator.d.ts +10 -0
- package/dist/plugin-sdk/plugins/types.d.ts +487 -0
- package/dist/plugin-sdk/polls.d.ts +31 -0
- package/dist/plugin-sdk/process/command-queue.d.ts +51 -0
- package/dist/plugin-sdk/process/exec.d.ts +30 -0
- package/dist/plugin-sdk/process/lanes.d.ts +6 -0
- package/dist/plugin-sdk/process/spawn-utils.d.ts +26 -0
- package/dist/plugin-sdk/routing/account-id.d.ts +3 -0
- package/dist/plugin-sdk/routing/account-lookup.d.ts +1 -0
- package/dist/plugin-sdk/routing/bindings.d.ts +11 -0
- package/dist/plugin-sdk/routing/resolve-route.d.ts +42 -0
- package/dist/plugin-sdk/routing/session-key.d.ts +48 -0
- package/dist/plugin-sdk/runtime.d.ts +7 -0
- package/dist/plugin-sdk/security/channel-metadata.d.ts +6 -0
- package/dist/plugin-sdk/security/dm-policy-shared.d.ts +33 -0
- package/dist/plugin-sdk/security/external-content.d.ts +53 -0
- package/dist/plugin-sdk/security/safe-regex.d.ts +2 -0
- package/dist/plugin-sdk/security/scan-paths.d.ts +5 -0
- package/dist/plugin-sdk/security/secret-equal.d.ts +1 -0
- package/dist/plugin-sdk/sessions/input-provenance.d.ts +16 -0
- package/dist/plugin-sdk/sessions/level-overrides.d.ts +10 -0
- package/dist/plugin-sdk/sessions/model-overrides.d.ts +14 -0
- package/dist/plugin-sdk/sessions/send-policy.d.ts +11 -0
- package/dist/plugin-sdk/sessions/session-key-utils.d.ts +16 -0
- package/dist/plugin-sdk/sessions/session-label.d.ts +9 -0
- package/dist/plugin-sdk/sessions/transcript-events.d.ts +7 -0
- package/dist/plugin-sdk/shared/avatar-policy.d.ts +16 -0
- package/dist/plugin-sdk/shared/chat-content.d.ts +5 -0
- package/dist/plugin-sdk/shared/chat-envelope.d.ts +2 -0
- package/dist/plugin-sdk/shared/device-auth.d.ts +13 -0
- package/dist/plugin-sdk/shared/gateway-bind-url.d.ts +14 -0
- package/dist/plugin-sdk/shared/net/ip.d.ts +19 -0
- package/dist/plugin-sdk/shared/operator-scope-compat.d.ts +5 -0
- package/dist/plugin-sdk/shared/pid-alive.d.ts +1 -0
- package/dist/plugin-sdk/shared/process-scoped-map.d.ts +1 -0
- package/dist/plugin-sdk/shared/string-normalization.d.ts +4 -0
- package/dist/plugin-sdk/shared/subagents-format.d.ts +15 -0
- package/dist/plugin-sdk/shared/tailscale-status.d.ts +8 -0
- package/dist/plugin-sdk/shared/text/code-regions.d.ts +6 -0
- package/dist/plugin-sdk/shared/text/reasoning-tags.d.ts +6 -0
- package/dist/plugin-sdk/shared/text-chunking.d.ts +1 -0
- package/dist/plugin-sdk/signal/accounts.d.ts +17 -0
- package/dist/plugin-sdk/signal/client.d.ts +32 -0
- package/dist/plugin-sdk/signal/daemon.d.ts +26 -0
- package/dist/plugin-sdk/signal/format.d.ts +17 -0
- package/dist/plugin-sdk/signal/identity.d.ts +24 -0
- package/dist/plugin-sdk/signal/index.d.ts +5 -0
- package/dist/plugin-sdk/signal/monitor/event-handler.d.ts +5 -0
- package/dist/plugin-sdk/signal/monitor/event-handler.types.d.ts +125 -0
- package/dist/plugin-sdk/signal/monitor/mentions.d.ts +2 -0
- package/dist/plugin-sdk/signal/monitor.d.ts +25 -0
- package/dist/plugin-sdk/signal/probe.d.ts +7 -0
- package/dist/plugin-sdk/signal/reaction-level.d.ts +17 -0
- package/dist/plugin-sdk/signal/rpc-context.d.ts +9 -0
- package/dist/plugin-sdk/signal/send-reactions.d.ts +32 -0
- package/dist/plugin-sdk/signal/send.d.ts +25 -0
- package/dist/plugin-sdk/signal/sse-reconnect.d.ts +13 -0
- package/dist/plugin-sdk/slack/accounts.d.ts +32 -0
- package/dist/plugin-sdk/slack/actions.d.ts +56 -0
- package/dist/plugin-sdk/slack/blocks-fallback.d.ts +2 -0
- package/dist/plugin-sdk/slack/blocks-input.d.ts +3 -0
- package/dist/plugin-sdk/slack/channel-migration.d.ts +20 -0
- package/dist/plugin-sdk/slack/client.d.ts +4 -0
- package/dist/plugin-sdk/slack/directory-live.d.ts +4 -0
- package/dist/plugin-sdk/slack/draft-stream.d.ts +25 -0
- package/dist/plugin-sdk/slack/format.d.ts +7 -0
- package/dist/plugin-sdk/slack/http/index.d.ts +1 -0
- package/dist/plugin-sdk/slack/http/registry.d.ts +12 -0
- package/dist/plugin-sdk/slack/index.d.ts +6 -0
- package/dist/plugin-sdk/slack/message-actions.d.ts +4 -0
- package/dist/plugin-sdk/slack/modal-metadata.d.ts +7 -0
- package/dist/plugin-sdk/slack/monitor/allow-list.d.ts +23 -0
- package/dist/plugin-sdk/slack/monitor/auth.d.ts +11 -0
- package/dist/plugin-sdk/slack/monitor/channel-config.d.ts +43 -0
- package/dist/plugin-sdk/slack/monitor/commands.d.ts +9 -0
- package/dist/plugin-sdk/slack/monitor/context.d.ts +104 -0
- package/dist/plugin-sdk/slack/monitor/events/channels.d.ts +4 -0
- package/dist/plugin-sdk/slack/monitor/events/interactions.d.ts +4 -0
- package/dist/plugin-sdk/slack/monitor/events/members.d.ts +4 -0
- package/dist/plugin-sdk/slack/monitor/events/messages.d.ts +6 -0
- package/dist/plugin-sdk/slack/monitor/events/pins.d.ts +4 -0
- package/dist/plugin-sdk/slack/monitor/events/reactions.d.ts +4 -0
- package/dist/plugin-sdk/slack/monitor/events.d.ts +8 -0
- package/dist/plugin-sdk/slack/monitor/external-arg-menu-store.d.ts +18 -0
- package/dist/plugin-sdk/slack/monitor/media.d.ts +66 -0
- package/dist/plugin-sdk/slack/monitor/message-handler/dispatch.d.ts +12 -0
- package/dist/plugin-sdk/slack/monitor/message-handler/prepare.d.ts +13 -0
- package/dist/plugin-sdk/slack/monitor/message-handler/types.d.ts +22 -0
- package/dist/plugin-sdk/slack/monitor/message-handler.d.ts +11 -0
- package/dist/plugin-sdk/slack/monitor/mrkdwn.d.ts +1 -0
- package/dist/plugin-sdk/slack/monitor/policy.d.ts +5 -0
- package/dist/plugin-sdk/slack/monitor/provider.d.ts +7 -0
- package/dist/plugin-sdk/slack/monitor/replies.d.ts +53 -0
- package/dist/plugin-sdk/slack/monitor/room-context.d.ts +14 -0
- package/dist/plugin-sdk/slack/monitor/slash.d.ts +6 -0
- package/dist/plugin-sdk/slack/monitor/thread-resolution.d.ts +12 -0
- package/dist/plugin-sdk/slack/monitor/types.d.ts +97 -0
- package/dist/plugin-sdk/slack/monitor.d.ts +5 -0
- package/dist/plugin-sdk/slack/probe.d.ts +14 -0
- package/dist/plugin-sdk/slack/resolve-channels.d.ts +19 -0
- package/dist/plugin-sdk/slack/resolve-users.d.ts +26 -0
- package/dist/plugin-sdk/slack/send.d.ts +22 -0
- package/dist/plugin-sdk/slack/stream-mode.d.ts +23 -0
- package/dist/plugin-sdk/slack/streaming.d.ts +72 -0
- package/dist/plugin-sdk/slack/targets.d.ts +7 -0
- package/dist/plugin-sdk/slack/threading-tool-context.d.ts +10 -0
- package/dist/plugin-sdk/slack/threading.d.ts +29 -0
- package/dist/plugin-sdk/slack/token.d.ts +3 -0
- package/dist/plugin-sdk/slack/types.d.ts +58 -0
- package/dist/plugin-sdk/telegram/accounts.d.ts +21 -0
- package/dist/plugin-sdk/telegram/allowed-updates.d.ts +4 -0
- package/dist/plugin-sdk/telegram/api-logging.d.ts +11 -0
- package/dist/plugin-sdk/telegram/audit.d.ts +29 -0
- package/dist/plugin-sdk/telegram/bot/delivery.d.ts +35 -0
- package/dist/plugin-sdk/telegram/bot/helpers.d.ts +128 -0
- package/dist/plugin-sdk/telegram/bot/types.d.ts +28 -0
- package/dist/plugin-sdk/telegram/bot-access.d.ts +26 -0
- package/dist/plugin-sdk/telegram/bot-handlers.d.ts +2 -0
- package/dist/plugin-sdk/telegram/bot-message-context.d.ts +145 -0
- package/dist/plugin-sdk/telegram/bot-message-dispatch.d.ts +19 -0
- package/dist/plugin-sdk/telegram/bot-message.d.ts +20 -0
- package/dist/plugin-sdk/telegram/bot-native-command-menu.d.ts +33 -0
- package/dist/plugin-sdk/telegram/bot-native-commands.d.ts +59 -0
- package/dist/plugin-sdk/telegram/bot-updates.d.ts +31 -0
- package/dist/plugin-sdk/telegram/bot.d.ts +62 -0
- package/dist/plugin-sdk/telegram/button-types.d.ts +7 -0
- package/dist/plugin-sdk/telegram/caption.d.ts +5 -0
- package/dist/plugin-sdk/telegram/dm-access.d.ts +18 -0
- package/dist/plugin-sdk/telegram/draft-stream.d.ts +37 -0
- package/dist/plugin-sdk/telegram/fetch.d.ts +5 -0
- package/dist/plugin-sdk/telegram/format.d.ts +18 -0
- package/dist/plugin-sdk/telegram/group-access.d.ts +54 -0
- package/dist/plugin-sdk/telegram/group-config-helpers.d.ts +8 -0
- package/dist/plugin-sdk/telegram/group-migration.d.ts +20 -0
- package/dist/plugin-sdk/telegram/inline-buttons.d.ts +11 -0
- package/dist/plugin-sdk/telegram/lane-delivery.d.ts +56 -0
- package/dist/plugin-sdk/telegram/monitor.d.ts +19 -0
- package/dist/plugin-sdk/telegram/network-config.d.ts +33 -0
- package/dist/plugin-sdk/telegram/network-errors.d.ts +5 -0
- package/dist/plugin-sdk/telegram/outbound-params.d.ts +2 -0
- package/dist/plugin-sdk/telegram/probe.d.ts +17 -0
- package/dist/plugin-sdk/telegram/proxy.d.ts +1 -0
- package/dist/plugin-sdk/telegram/reaction-level.d.ts +11 -0
- package/dist/plugin-sdk/telegram/reasoning-lane-coordinator.d.ts +18 -0
- package/dist/plugin-sdk/telegram/send.d.ts +153 -0
- package/dist/plugin-sdk/telegram/sent-message-cache.d.ts +16 -0
- package/dist/plugin-sdk/telegram/status-reaction-variants.d.ts +21 -0
- package/dist/plugin-sdk/telegram/sticker-cache.d.ts +47 -0
- package/dist/plugin-sdk/telegram/target-writeback.d.ts +7 -0
- package/dist/plugin-sdk/telegram/targets.d.ts +11 -0
- package/dist/plugin-sdk/telegram/token.d.ts +13 -0
- package/dist/plugin-sdk/telegram/update-offset-store.d.ts +15 -0
- package/dist/plugin-sdk/telegram/voice.d.ts +16 -0
- package/dist/plugin-sdk/telegram/webhook.d.ts +20 -0
- package/dist/plugin-sdk/terminal/ansi.d.ts +2 -0
- package/dist/plugin-sdk/terminal/health-style.d.ts +1 -0
- package/dist/plugin-sdk/terminal/links.d.ts +6 -0
- package/dist/plugin-sdk/terminal/palette.d.ts +10 -0
- package/dist/plugin-sdk/terminal/progress-line.d.ts +3 -0
- package/dist/plugin-sdk/terminal/prompt-style.d.ts +3 -0
- package/dist/plugin-sdk/terminal/restore.d.ts +17 -0
- package/dist/plugin-sdk/terminal/theme.d.ts +15 -0
- package/dist/plugin-sdk/tts/tts-core.d.ts +38 -0
- package/dist/plugin-sdk/tts/tts.d.ts +177 -0
- package/dist/plugin-sdk/types/agent-types.d.ts +1 -0
- package/dist/plugin-sdk/utils/account-id.d.ts +1 -0
- package/dist/plugin-sdk/utils/boolean.d.ts +5 -0
- package/dist/plugin-sdk/utils/chunk-items.d.ts +1 -0
- package/dist/plugin-sdk/utils/delivery-context.d.ts +29 -0
- package/dist/plugin-sdk/utils/directive-tags.d.ts +29 -0
- package/dist/plugin-sdk/utils/fetch-timeout.d.ts +13 -0
- package/dist/plugin-sdk/utils/mask-api-key.d.ts +1 -0
- package/dist/plugin-sdk/utils/message-channel.d.ts +27 -0
- package/dist/plugin-sdk/utils/normalize-secret-input.d.ts +11 -0
- package/dist/plugin-sdk/utils/provider-utils.d.ts +9 -0
- package/dist/plugin-sdk/utils/queue-helpers.d.ts +80 -0
- package/dist/plugin-sdk/utils/reaction-level.d.ts +15 -0
- package/dist/plugin-sdk/utils/run-with-concurrency.d.ts +11 -0
- package/dist/plugin-sdk/utils/transcript-tools.d.ts +8 -0
- package/dist/plugin-sdk/utils/usage-format.d.ts +26 -0
- package/dist/plugin-sdk/utils/with-timeout.d.ts +1 -0
- package/dist/plugin-sdk/utils.d.ts +63 -0
- package/dist/plugin-sdk/version.d.ts +8 -0
- package/dist/plugin-sdk/web/accounts.d.ts +39 -0
- package/dist/plugin-sdk/web/active-listener.d.ts +25 -0
- package/dist/plugin-sdk/web/auth-store.d.ts +26 -0
- package/dist/plugin-sdk/web/auto-reply/constants.d.ts +1 -0
- package/dist/plugin-sdk/web/auto-reply/deliver-reply.d.ts +19 -0
- package/dist/plugin-sdk/web/auto-reply/heartbeat-runner.d.ts +20 -0
- package/dist/plugin-sdk/web/auto-reply/loggers.d.ts +4 -0
- package/dist/plugin-sdk/web/auto-reply/mentions.d.ts +19 -0
- package/dist/plugin-sdk/web/auto-reply/monitor/ack-reaction.d.ts +13 -0
- package/dist/plugin-sdk/web/auto-reply/monitor/broadcast.d.ts +16 -0
- package/dist/plugin-sdk/web/auto-reply/monitor/commands.d.ts +2 -0
- package/dist/plugin-sdk/web/auto-reply/monitor/echo.d.ts +17 -0
- package/dist/plugin-sdk/web/auto-reply/monitor/group-activation.d.ts +9 -0
- package/dist/plugin-sdk/web/auto-reply/monitor/group-gating.d.ts +33 -0
- package/dist/plugin-sdk/web/auto-reply/monitor/group-members.d.ts +6 -0
- package/dist/plugin-sdk/web/auto-reply/monitor/last-route.d.ts +15 -0
- package/dist/plugin-sdk/web/auto-reply/monitor/message-line.d.ts +11 -0
- package/dist/plugin-sdk/web/auto-reply/monitor/on-message.d.ts +24 -0
- package/dist/plugin-sdk/web/auto-reply/monitor/peer.d.ts +2 -0
- package/dist/plugin-sdk/web/auto-reply/monitor/process-message.d.ts +40 -0
- package/dist/plugin-sdk/web/auto-reply/monitor.d.ts +5 -0
- package/dist/plugin-sdk/web/auto-reply/session-snapshot.d.ts +17 -0
- package/dist/plugin-sdk/web/auto-reply/types.d.ts +30 -0
- package/dist/plugin-sdk/web/auto-reply/util.d.ts +2 -0
- package/dist/plugin-sdk/web/auto-reply.d.ts +1 -0
- package/dist/plugin-sdk/web/auto-reply.impl.d.ts +5 -0
- package/dist/plugin-sdk/web/inbound/access-control.d.ts +36 -0
- package/dist/plugin-sdk/web/inbound/dedupe.d.ts +2 -0
- package/dist/plugin-sdk/web/inbound/extract.d.ts +13 -0
- package/dist/plugin-sdk/web/inbound/media.d.ts +7 -0
- package/dist/plugin-sdk/web/inbound/monitor.d.ts +30 -0
- package/dist/plugin-sdk/web/inbound/send-api.d.ts +22 -0
- package/dist/plugin-sdk/web/inbound/types.d.ts +41 -0
- package/dist/plugin-sdk/web/inbound.d.ts +4 -0
- package/dist/plugin-sdk/web/login-qr.d.ts +19 -0
- package/dist/plugin-sdk/web/login.d.ts +3 -0
- package/dist/plugin-sdk/web/media.d.ts +43 -0
- package/dist/plugin-sdk/web/outbound.d.ts +24 -0
- package/dist/plugin-sdk/web/qr-image.d.ts +4 -0
- package/dist/plugin-sdk/web/reconnect.d.ts +12 -0
- package/dist/plugin-sdk/web/session.d.ts +14 -0
- package/dist/plugin-sdk/web/vcard.d.ts +6 -0
- package/dist/plugin-sdk/whatsapp/normalize.d.ts +6 -0
- package/dist/plugin-sdk/whatsapp/resolve-outbound-target.d.ts +12 -0
- package/dist/plugin-sdk/wizard/prompts.d.ts +43 -0
- package/dist/plugin-sdk/wizard/session.d.ts +42 -0
- package/dist/plugins-BflZz0sp.js +453 -0
- package/dist/plugins-allowlist-BbTQ5Z2k.js +15 -0
- package/dist/plugins-allowlist-C20oaESO.js +15 -0
- package/dist/plugins-cli-DV82scUw.js +798 -0
- package/dist/plugins-cli-Qj1UyIZO.js +793 -0
- package/dist/plugins-woGRXMzU.js +455 -0
- package/dist/polls-B0CCBDeR.js +33 -0
- package/dist/polls-CwwHzYBM.js +33 -0
- package/dist/ports-DrruB2fK.js +370 -0
- package/dist/ports-GT1yV-Tg.js +96 -0
- package/dist/ports-NPqtlfp0.js +316 -0
- package/dist/ports-QMI4-F9m.js +96 -0
- package/dist/ports-lsof-Wteul3ju.js +27 -0
- package/dist/process-scoped-map-CV9kDvfG.js +39 -0
- package/dist/process-scoped-map-PEvnG75N.js +39 -0
- package/dist/program-CQmIaRUI.js +244 -0
- package/dist/program-context-DEU6ACnL.js +474 -0
- package/dist/program-context-jqeI5alP.js +17 -0
- package/dist/progress-C1kUfYL-.js +123 -0
- package/dist/progress-CBkSaM6z.js +124 -0
- package/dist/prompt-Bllj1dhc.js +21 -0
- package/dist/prompt-Yn2yClg1.js +21 -0
- package/dist/prompt-select-styled-BhTN6zE2.js +1650 -0
- package/dist/prompt-select-styled-WopXnjIy.js +1647 -0
- package/dist/prompt-style-DVEm3BZW.js +9 -0
- package/dist/prompt-style-DjEYC_s-.js +9 -0
- package/dist/provider-dispatcher-B4QMe-I6.js +659 -0
- package/dist/provider-dispatcher-Bfauw6zz.js +660 -0
- package/dist/provider-utils-3JTMJroG.js +79 -0
- package/dist/provider-utils-FaBmofiq.js +79 -0
- package/dist/proxy-DL3MD6-P.js +16 -0
- package/dist/proxy-DpNv2cSV.js +16 -0
- package/dist/push-apns-C0LyG-WB.js +713 -0
- package/dist/push-apns-DuG95AKC.js +711 -0
- package/dist/pw-ai-D9n6-Wa6.js +1906 -0
- package/dist/pw-ai-T280E6Mn.js +1910 -0
- package/dist/pw-ai-state-CGfLv6nV.js +11 -0
- package/dist/pw-ai-state-Dynx20hr.js +11 -0
- package/dist/qr-cli-DVECWTHN.js +352 -0
- package/dist/qr-cli-hSLixZCe.js +347 -0
- package/dist/redact-Dx1Fue21.js +191 -0
- package/dist/redact-eZq1uwNK.js +191 -0
- package/dist/redact-identifier-BTIWtaa-.js +15 -0
- package/dist/redact-identifier-CAagcfWA.js +15 -0
- package/dist/redact-snapshot-BZYLIqe-.js +2028 -0
- package/dist/redact-snapshot-C6hVx_9I.js +2028 -0
- package/dist/register.agent-Dmj-sgEl.js +1043 -0
- package/dist/register.agent-IspcBFeD.js +286 -0
- package/dist/register.configure-BqJEqyGL.js +130 -0
- package/dist/register.configure-PPkU_4Ea.js +124 -0
- package/dist/register.import-Bs-UkOs-.js +27 -0
- package/dist/register.import-DLng8g-e.js +30 -0
- package/dist/register.maintenance-BbpkJil3.js +497 -0
- package/dist/register.maintenance-C5nkOQxa.js +494 -0
- package/dist/register.message-C83Hi1b3.js +681 -0
- package/dist/register.message-D16isu4u.js +686 -0
- package/dist/register.onboard-B8EzX3wY.js +257 -0
- package/dist/register.onboard-CyRbr_0V.js +262 -0
- package/dist/register.setup-DWyoowAz.js +109 -0
- package/dist/register.setup-Dz6GwMnu.js +114 -0
- package/dist/register.status-health-sessions-CbQOfycz.js +423 -0
- package/dist/register.status-health-sessions-DXIWG47y.js +669 -0
- package/dist/register.subclis-DeGP5UPU.js +267 -0
- package/dist/remoteclaw-root-C2HV2VeC.js +88 -0
- package/dist/remoteclaw-root-DybYl8PL.js +88 -0
- package/dist/render-6ahYfPwj.js +104 -0
- package/dist/render-CCLsW6Lz.js +104 -0
- package/dist/render-uf6PvGMV.js +104 -0
- package/dist/replies-BKrzM0QI.js +136 -0
- package/dist/replies-Cl2gYBVt.js +136 -0
- package/dist/reply-CCu_DY64.js +13900 -0
- package/dist/reply-DSKC8kyS.js +13897 -0
- package/dist/reply-directives-BHJKp1Du.js +182 -0
- package/dist/reply-directives-CD2WycBM.js +182 -0
- package/dist/reply-payloads-D_BM1Anb.js +527 -0
- package/dist/reply-prefix-DBLCYiup.js +38 -0
- package/dist/reply-prefix-Q4DOJSn_.js +38 -0
- package/dist/resolve-route-CBVbY0xS.js +249 -0
- package/dist/resolve-route-DGEgTEif.js +249 -0
- package/dist/response-prefix-template-rVZQOViK.js +136 -0
- package/dist/response-prefix-template-up4REfuR.js +136 -0
- package/dist/retry-BhuXOEVR.js +77 -0
- package/dist/retry-DUjAzOBy.js +77 -0
- package/dist/retry-DnqPAqWp.js +77 -0
- package/dist/rolldown-runtime-Cbj13DAv.js +20 -0
- package/dist/run-main-Um5xhxla.js +320 -0
- package/dist/runner-yVJ4HB2K.js +2294 -0
- package/dist/runner-z92MWZ3m.js +2294 -0
- package/dist/runtime-DJNp29jv.js +94 -0
- package/dist/runtime-guard-DZ_xuCc4.js +60 -0
- package/dist/runtime-guard-U-ewY_QH.js +60 -0
- package/dist/secret-equal-BbHdTtqY.js +11 -0
- package/dist/secret-equal-CXJEZiWb.js +11 -0
- package/dist/secure-random-CS2mSdTn.js +12 -0
- package/dist/secure-random-Pl9rPl0l.js +44 -0
- package/dist/secure-random-_dzDDlFo.js +12 -0
- package/dist/security-cli-CdwbWZUj.js +484 -0
- package/dist/security-cli-DP5QJpa5.js +478 -0
- package/dist/send-B1_Ymjb9.js +1778 -0
- package/dist/send-B84axiIa.js +29 -0
- package/dist/send-BN_zYVlx.js +547 -0
- package/dist/send-BqVOxAmK.js +1174 -0
- package/dist/send-Bx9bUGav.js +492 -0
- package/dist/send-C3pdJ6p-.js +2245 -0
- package/dist/send-CBGSXjfD.js +2245 -0
- package/dist/send-CGXyTF22.js +426 -0
- package/dist/send-CKavrhXj.js +11 -0
- package/dist/send-D08Je6DL.js +374 -0
- package/dist/send-D1aYEG-k.js +332 -0
- package/dist/send-DHldI3gf.js +492 -0
- package/dist/send-D_DUQJ6H.js +349 -0
- package/dist/send-Ds63eF4a.js +349 -0
- package/dist/send-YRVDWfSs.js +547 -0
- package/dist/send-xnwty9cY.js +1775 -0
- package/dist/server-BQFoyCRR.js +200 -0
- package/dist/server-DhXw25Jq.js +205 -0
- package/dist/server-lifecycle-BjCCyD3w.js +2437 -0
- package/dist/server-lifecycle-Coyr6Lda.js +2437 -0
- package/dist/server-node-events-De4WZQQD.js +393 -0
- package/dist/server-node-events-dXXayuqY.js +398 -0
- package/dist/service-Bjqii5nW.js +670 -0
- package/dist/service-fp29z5Ww.js +670 -0
- package/dist/session-DBL5nHDy.js +170 -0
- package/dist/session-cost-usage-DX09eTPU.js +627 -0
- package/dist/session-cost-usage-yYi525j3.js +627 -0
- package/dist/session-dirs-Cj5xi7zX.js +947 -0
- package/dist/session-dirs-DdF6TDsE.js +947 -0
- package/dist/session-key-5YLnn_qf.js +235 -0
- package/dist/session-key-C2n-VILA.js +235 -0
- package/dist/session-utils-CEtEq6bi.js +625 -0
- package/dist/session-utils-WmlWAs1r.js +625 -0
- package/dist/session-xKIW6gL2.js +170 -0
- package/dist/sessions--PykPynp.js +2593 -0
- package/dist/sessions-Bw4LRnSr.js +252 -0
- package/dist/ssrf-Ck9HDZpv.js +183 -0
- package/dist/ssrf-m7kFIobZ.js +183 -0
- package/dist/stagger-BXv_apuy.js +56 -0
- package/dist/stagger-MI9gd2rQ.js +56 -0
- package/dist/status-BmtCS3T1.js +21 -0
- package/dist/status-BrwHRn2B.js +21 -0
- package/dist/status-CtzYFLLF.js +2072 -0
- package/dist/status-DiN1cq2p.js +2068 -0
- package/dist/status.update-C55QM2xs.js +79 -0
- package/dist/status.update-CBmPXwYN.js +79 -0
- package/dist/store-C3tOpizT.js +64 -0
- package/dist/store-CPJXuhvQ.js +53 -0
- package/dist/store-SusmIfz7.js +2595 -0
- package/dist/store-v3P-OWhi.js +64 -0
- package/dist/strip-inbound-meta-DjKcSFaW.js +110 -0
- package/dist/strip-inbound-meta-jy3bkUab.js +110 -0
- package/dist/subagent-registry-Db4Ho_2Y.js +4858 -0
- package/dist/subagent-registry-Du_j0Fnt.js +4860 -0
- package/dist/subsystem-BUXAJwPD.js +1079 -0
- package/dist/subsystem-COd61u0P.js +1139 -0
- package/dist/system-cli-DYCpLO3T.js +75 -0
- package/dist/system-cli-eAk5wVbP.js +70 -0
- package/dist/systemd-DSnlM3jX.js +547 -0
- package/dist/systemd-TfK8GuTx.js +547 -0
- package/dist/systemd-linger-Axnc1xCb.js +75 -0
- package/dist/systemd-linger-_0_-RY4v.js +75 -0
- package/dist/table-C1rdyYl9.js +278 -0
- package/dist/table-DPTzZyhu.js +279 -0
- package/dist/tables-DI5LGEr1.js +55 -0
- package/dist/tables-PxcSPSO0.js +55 -0
- package/dist/tables-TWiml6b1.js +55 -0
- package/dist/tailnet-CEudzG0i.js +40 -0
- package/dist/tailnet-PnMrjwGT.js +40 -0
- package/dist/tailscale-DTATQxAG.js +230 -0
- package/dist/tailscale-Dbyahx0J.js +230 -0
- package/dist/target-errors-BDpPcwh5.js +26 -0
- package/dist/target-errors-DdIAPcMM.js +26 -0
- package/dist/targets-BMenhVHg.js +39 -0
- package/dist/targets-C-2xwh9f.js +45 -0
- package/dist/targets-C1NeMn2J.js +220 -0
- package/dist/targets-CcTME3bp.js +46 -0
- package/dist/targets-CmC5m7Ey.js +53 -0
- package/dist/targets-D-qLBpTA.js +79 -0
- package/dist/targets-D-u6Kyio.js +650 -0
- package/dist/targets-D7OKVXMI.js +650 -0
- package/dist/targets-D7PT_rdO.js +45 -0
- package/dist/targets-DB4vBpIQ.js +2172 -0
- package/dist/targets-DfqPGOmM.js +2173 -0
- package/dist/targets-DyybKefq.js +53 -0
- package/dist/targets-JCISV-hS.js +120 -0
- package/dist/targets-UncQvCVs.js +79 -0
- package/dist/text-format-BQ3z_OXA.js +9 -0
- package/dist/text-format-oWqzVmah.js +9 -0
- package/dist/tokens-B-jmvNR9.js +21 -0
- package/dist/tokens-DzFOtLlW.js +21 -0
- package/dist/tool-display-Br6mwaJc.js +785 -0
- package/dist/tool-display-sgNwLOBj.js +785 -0
- package/dist/tool-images-BNfIJ_Kj.js +263 -0
- package/dist/tool-images-kloBqxqK.js +263 -0
- package/dist/trash-DPi0aCCQ.js +125 -0
- package/dist/trash-D_Jd_yQZ.js +125 -0
- package/dist/tui-CHc0EfJO.js +3392 -0
- package/dist/tui-CyHwc2uX.js +3392 -0
- package/dist/tui-cli-BvwbrIYO.js +63 -0
- package/dist/tui-cli-C9I18SfW.js +58 -0
- package/dist/update-DxyjwCL2.js +349 -0
- package/dist/update-IX7vdqA8.js +349 -0
- package/dist/update-cli-CBeXUSzq.js +1373 -0
- package/dist/update-cli-DkAWmUrp.js +1370 -0
- package/dist/usage-BdhBT0Vz.js +57 -0
- package/dist/usage-BtQcAnf6.js +57 -0
- package/dist/usage-CYlQW4M2.js +5279 -0
- package/dist/usage-format-C3mNLfhI.js +31 -0
- package/dist/usage-format-DAaPzr_z.js +31 -0
- package/dist/utils-LBKvDoPx.js +631 -0
- package/dist/warning-filter.js +48 -0
- package/dist/web-BUYUdnRH.js +3065 -0
- package/dist/web-Dquzwqf4.js +70 -0
- package/dist/web-tS8diboh.js +76 -0
- package/dist/webhooks-cli-B7Vw3CMz.js +333 -0
- package/dist/webhooks-cli-BpZHQlVd.js +328 -0
- package/dist/whatsapp-actions-D5HXezjp.js +128 -0
- package/dist/whatsapp-actions-DaA291Ya.js +122 -0
- package/dist/widearea-dns-CsmBVbez.js +127 -0
- package/dist/widearea-dns-DSoaA-eH.js +127 -0
- package/dist/workspace-B4ZvVYT9.js +447 -0
- package/dist/workspace-B8PA8oxJ.js +449 -0
- package/dist/workspace-BzPeZDew.js +10 -0
- package/dist/workspace-DkGLVfOl.js +10 -0
- package/dist/wsl-BCnYV9O0.js +52 -0
- package/dist/wsl-B_sPlzWw.js +52 -0
- package/extensions/bluebubbles/README.md +45 -0
- package/extensions/bluebubbles/index.ts +19 -0
- package/extensions/bluebubbles/package.json +33 -0
- package/extensions/bluebubbles/remoteclaw.plugin.json +9 -0
- package/extensions/bluebubbles/src/account-resolve.ts +35 -0
- package/extensions/bluebubbles/src/accounts.ts +90 -0
- package/extensions/bluebubbles/src/actions.ts +460 -0
- package/extensions/bluebubbles/src/attachments.ts +268 -0
- package/extensions/bluebubbles/src/channel.ts +418 -0
- package/extensions/bluebubbles/src/chat.ts +329 -0
- package/extensions/bluebubbles/src/config-schema.ts +65 -0
- package/extensions/bluebubbles/src/history.ts +177 -0
- package/extensions/bluebubbles/src/media-send.ts +317 -0
- package/extensions/bluebubbles/src/monitor-normalize.ts +825 -0
- package/extensions/bluebubbles/src/monitor-processing.ts +1448 -0
- package/extensions/bluebubbles/src/monitor-reply-cache.ts +185 -0
- package/extensions/bluebubbles/src/monitor-shared.ts +41 -0
- package/extensions/bluebubbles/src/monitor.ts +534 -0
- package/extensions/bluebubbles/src/multipart.ts +32 -0
- package/extensions/bluebubbles/src/onboarding.ts +340 -0
- package/extensions/bluebubbles/src/probe.ts +163 -0
- package/extensions/bluebubbles/src/reactions.ts +182 -0
- package/extensions/bluebubbles/src/request-url.ts +12 -0
- package/extensions/bluebubbles/src/runtime.ts +34 -0
- package/extensions/bluebubbles/src/send-helpers.ts +53 -0
- package/extensions/bluebubbles/src/send.ts +472 -0
- package/extensions/bluebubbles/src/targets.ts +370 -0
- package/extensions/bluebubbles/src/test-harness.ts +79 -0
- package/extensions/bluebubbles/src/test-mocks.ts +11 -0
- package/extensions/bluebubbles/src/types.ts +135 -0
- package/extensions/device-pair/index.ts +529 -0
- package/extensions/device-pair/remoteclaw.plugin.json +20 -0
- package/extensions/diagnostics-otel/index.ts +15 -0
- package/extensions/diagnostics-otel/package.json +24 -0
- package/extensions/diagnostics-otel/remoteclaw.plugin.json +8 -0
- package/extensions/diagnostics-otel/src/service.ts +682 -0
- package/extensions/discord/index.ts +19 -0
- package/extensions/discord/package.json +11 -0
- package/extensions/discord/remoteclaw.plugin.json +9 -0
- package/extensions/discord/src/channel.ts +451 -0
- package/extensions/discord/src/runtime.ts +14 -0
- package/extensions/discord/src/subagent-hooks.ts +152 -0
- package/extensions/feishu/index.ts +63 -0
- package/extensions/feishu/package.json +34 -0
- package/extensions/feishu/remoteclaw.plugin.json +10 -0
- package/extensions/feishu/skills/feishu-doc/SKILL.md +105 -0
- package/extensions/feishu/skills/feishu-doc/references/block-types.md +103 -0
- package/extensions/feishu/skills/feishu-drive/SKILL.md +97 -0
- package/extensions/feishu/skills/feishu-perm/SKILL.md +119 -0
- package/extensions/feishu/skills/feishu-wiki/SKILL.md +111 -0
- package/extensions/feishu/src/accounts.ts +144 -0
- package/extensions/feishu/src/bitable.ts +739 -0
- package/extensions/feishu/src/bot.ts +1006 -0
- package/extensions/feishu/src/channel.ts +359 -0
- package/extensions/feishu/src/client.ts +118 -0
- package/extensions/feishu/src/config-schema.ts +226 -0
- package/extensions/feishu/src/dedup.ts +54 -0
- package/extensions/feishu/src/directory.ts +177 -0
- package/extensions/feishu/src/doc-schema.ts +47 -0
- package/extensions/feishu/src/docx.ts +536 -0
- package/extensions/feishu/src/drive-schema.ts +46 -0
- package/extensions/feishu/src/drive.ts +227 -0
- package/extensions/feishu/src/dynamic-agent.ts +131 -0
- package/extensions/feishu/src/external-keys.ts +19 -0
- package/extensions/feishu/src/media.ts +441 -0
- package/extensions/feishu/src/mention.ts +133 -0
- package/extensions/feishu/src/monitor.ts +397 -0
- package/extensions/feishu/src/onboarding.ts +351 -0
- package/extensions/feishu/src/outbound.ts +55 -0
- package/extensions/feishu/src/perm-schema.ts +52 -0
- package/extensions/feishu/src/perm.ts +173 -0
- package/extensions/feishu/src/policy.ts +120 -0
- package/extensions/feishu/src/probe.ts +44 -0
- package/extensions/feishu/src/reactions.ts +160 -0
- package/extensions/feishu/src/reply-dispatcher.ts +239 -0
- package/extensions/feishu/src/runtime.ts +14 -0
- package/extensions/feishu/src/send-result.ts +29 -0
- package/extensions/feishu/src/send-target.ts +25 -0
- package/extensions/feishu/src/send.ts +313 -0
- package/extensions/feishu/src/streaming-card.ts +218 -0
- package/extensions/feishu/src/targets.ts +78 -0
- package/extensions/feishu/src/tools-config.ts +21 -0
- package/extensions/feishu/src/types.ts +81 -0
- package/extensions/feishu/src/typing.ts +80 -0
- package/extensions/feishu/src/wiki-schema.ts +55 -0
- package/extensions/feishu/src/wiki.ts +232 -0
- package/extensions/googlechat/index.ts +19 -0
- package/extensions/googlechat/node_modules/.bin/remoteclaw +21 -0
- package/extensions/googlechat/package.json +37 -0
- package/extensions/googlechat/remoteclaw.plugin.json +9 -0
- package/extensions/googlechat/src/accounts.ts +147 -0
- package/extensions/googlechat/src/actions.ts +176 -0
- package/extensions/googlechat/src/api.ts +282 -0
- package/extensions/googlechat/src/auth.ts +137 -0
- package/extensions/googlechat/src/channel.ts +576 -0
- package/extensions/googlechat/src/monitor.ts +965 -0
- package/extensions/googlechat/src/onboarding.ts +270 -0
- package/extensions/googlechat/src/runtime.ts +14 -0
- package/extensions/googlechat/src/targets.ts +65 -0
- package/extensions/googlechat/src/types.config.ts +3 -0
- package/extensions/googlechat/src/types.ts +73 -0
- package/extensions/imessage/index.ts +17 -0
- package/extensions/imessage/package.json +12 -0
- package/extensions/imessage/remoteclaw.plugin.json +9 -0
- package/extensions/imessage/src/channel.ts +304 -0
- package/extensions/imessage/src/runtime.ts +14 -0
- package/extensions/irc/index.ts +17 -0
- package/extensions/irc/package.json +11 -0
- package/extensions/irc/remoteclaw.plugin.json +9 -0
- package/extensions/irc/src/accounts.ts +268 -0
- package/extensions/irc/src/channel.ts +364 -0
- package/extensions/irc/src/client.ts +439 -0
- package/extensions/irc/src/config-schema.ts +91 -0
- package/extensions/irc/src/connect-options.ts +30 -0
- package/extensions/irc/src/control-chars.ts +22 -0
- package/extensions/irc/src/inbound.ts +372 -0
- package/extensions/irc/src/monitor.ts +146 -0
- package/extensions/irc/src/normalize.ts +123 -0
- package/extensions/irc/src/onboarding.ts +479 -0
- package/extensions/irc/src/policy.ts +166 -0
- package/extensions/irc/src/probe.ts +53 -0
- package/extensions/irc/src/protocol.ts +169 -0
- package/extensions/irc/src/runtime.ts +14 -0
- package/extensions/irc/src/send.ts +88 -0
- package/extensions/irc/src/types.ts +99 -0
- package/extensions/line/index.ts +19 -0
- package/extensions/line/package.json +27 -0
- package/extensions/line/remoteclaw.plugin.json +9 -0
- package/extensions/line/src/card-command.ts +344 -0
- package/extensions/line/src/channel.ts +797 -0
- package/extensions/line/src/runtime.ts +14 -0
- package/extensions/matrix/CHANGELOG.md +32 -0
- package/extensions/matrix/index.ts +17 -0
- package/extensions/matrix/node_modules/.bin/markdown-it +21 -0
- package/extensions/matrix/package.json +33 -0
- package/extensions/matrix/remoteclaw.plugin.json +9 -0
- package/extensions/matrix/src/actions.ts +195 -0
- package/extensions/matrix/src/channel.ts +486 -0
- package/extensions/matrix/src/config-schema.ts +63 -0
- package/extensions/matrix/src/directory-live.ts +208 -0
- package/extensions/matrix/src/group-mentions.ts +52 -0
- package/extensions/matrix/src/matrix/accounts.ts +137 -0
- package/extensions/matrix/src/matrix/actions/client.ts +47 -0
- package/extensions/matrix/src/matrix/actions/limits.ts +6 -0
- package/extensions/matrix/src/matrix/actions/messages.ts +126 -0
- package/extensions/matrix/src/matrix/actions/pins.ts +84 -0
- package/extensions/matrix/src/matrix/actions/reactions.ts +102 -0
- package/extensions/matrix/src/matrix/actions/room.ts +85 -0
- package/extensions/matrix/src/matrix/actions/summary.ts +75 -0
- package/extensions/matrix/src/matrix/actions/types.ts +85 -0
- package/extensions/matrix/src/matrix/actions.ts +15 -0
- package/extensions/matrix/src/matrix/active-client.ts +32 -0
- package/extensions/matrix/src/matrix/client/config.ts +219 -0
- package/extensions/matrix/src/matrix/client/create-client.ts +123 -0
- package/extensions/matrix/src/matrix/client/logging.ts +36 -0
- package/extensions/matrix/src/matrix/client/runtime.ts +4 -0
- package/extensions/matrix/src/matrix/client/shared.ts +201 -0
- package/extensions/matrix/src/matrix/client/storage.ts +131 -0
- package/extensions/matrix/src/matrix/client/types.ts +34 -0
- package/extensions/matrix/src/matrix/client-bootstrap.ts +39 -0
- package/extensions/matrix/src/matrix/client.ts +14 -0
- package/extensions/matrix/src/matrix/credentials.ts +125 -0
- package/extensions/matrix/src/matrix/deps.ts +60 -0
- package/extensions/matrix/src/matrix/format.ts +22 -0
- package/extensions/matrix/src/matrix/index.ts +11 -0
- package/extensions/matrix/src/matrix/monitor/allowlist.ts +103 -0
- package/extensions/matrix/src/matrix/monitor/auto-join.ts +71 -0
- package/extensions/matrix/src/matrix/monitor/direct.ts +104 -0
- package/extensions/matrix/src/matrix/monitor/events.ts +148 -0
- package/extensions/matrix/src/matrix/monitor/handler.ts +688 -0
- package/extensions/matrix/src/matrix/monitor/index.ts +358 -0
- package/extensions/matrix/src/matrix/monitor/location.ts +100 -0
- package/extensions/matrix/src/matrix/monitor/media.ts +118 -0
- package/extensions/matrix/src/matrix/monitor/mentions.ts +62 -0
- package/extensions/matrix/src/matrix/monitor/replies.ts +124 -0
- package/extensions/matrix/src/matrix/monitor/room-info.ts +55 -0
- package/extensions/matrix/src/matrix/monitor/rooms.ts +47 -0
- package/extensions/matrix/src/matrix/monitor/threads.ts +68 -0
- package/extensions/matrix/src/matrix/monitor/types.ts +39 -0
- package/extensions/matrix/src/matrix/poll-types.ts +167 -0
- package/extensions/matrix/src/matrix/probe.ts +69 -0
- package/extensions/matrix/src/matrix/send/client.ts +97 -0
- package/extensions/matrix/src/matrix/send/formatting.ts +93 -0
- package/extensions/matrix/src/matrix/send/media.ts +230 -0
- package/extensions/matrix/src/matrix/send/targets.ts +150 -0
- package/extensions/matrix/src/matrix/send/types.ts +109 -0
- package/extensions/matrix/src/matrix/send-queue.ts +44 -0
- package/extensions/matrix/src/matrix/send.ts +265 -0
- package/extensions/matrix/src/onboarding.ts +446 -0
- package/extensions/matrix/src/outbound.ts +55 -0
- package/extensions/matrix/src/resolve-targets.ts +126 -0
- package/extensions/matrix/src/runtime.ts +14 -0
- package/extensions/matrix/src/tool-actions.ts +164 -0
- package/extensions/matrix/src/types.ts +116 -0
- package/extensions/mattermost/index.ts +17 -0
- package/extensions/mattermost/package.json +25 -0
- package/extensions/mattermost/remoteclaw.plugin.json +9 -0
- package/extensions/mattermost/src/channel.ts +439 -0
- package/extensions/mattermost/src/config-schema.ts +62 -0
- package/extensions/mattermost/src/group-mentions.ts +15 -0
- package/extensions/mattermost/src/mattermost/accounts.ts +128 -0
- package/extensions/mattermost/src/mattermost/client.ts +230 -0
- package/extensions/mattermost/src/mattermost/index.ts +9 -0
- package/extensions/mattermost/src/mattermost/monitor-helpers.ts +72 -0
- package/extensions/mattermost/src/mattermost/monitor-onchar.ts +25 -0
- package/extensions/mattermost/src/mattermost/monitor-websocket.ts +221 -0
- package/extensions/mattermost/src/mattermost/monitor.ts +1061 -0
- package/extensions/mattermost/src/mattermost/probe.ts +61 -0
- package/extensions/mattermost/src/mattermost/reactions.test-helpers.ts +83 -0
- package/extensions/mattermost/src/mattermost/reactions.ts +124 -0
- package/extensions/mattermost/src/mattermost/reconnect.ts +103 -0
- package/extensions/mattermost/src/mattermost/send.ts +231 -0
- package/extensions/mattermost/src/normalize.ts +46 -0
- package/extensions/mattermost/src/onboarding-helpers.ts +1 -0
- package/extensions/mattermost/src/onboarding.ts +182 -0
- package/extensions/mattermost/src/runtime.ts +14 -0
- package/extensions/mattermost/src/types.ts +62 -0
- package/extensions/msteams/CHANGELOG.md +35 -0
- package/extensions/msteams/index.ts +17 -0
- package/extensions/msteams/package.json +32 -0
- package/extensions/msteams/remoteclaw.plugin.json +9 -0
- package/extensions/msteams/src/attachments/download.ts +282 -0
- package/extensions/msteams/src/attachments/graph.ts +354 -0
- package/extensions/msteams/src/attachments/html.ts +90 -0
- package/extensions/msteams/src/attachments/payload.ts +14 -0
- package/extensions/msteams/src/attachments/remote-media.ts +42 -0
- package/extensions/msteams/src/attachments/shared.ts +404 -0
- package/extensions/msteams/src/attachments/types.ts +37 -0
- package/extensions/msteams/src/attachments.ts +18 -0
- package/extensions/msteams/src/channel.ts +464 -0
- package/extensions/msteams/src/conversation-store-fs.ts +165 -0
- package/extensions/msteams/src/conversation-store-memory.ts +47 -0
- package/extensions/msteams/src/conversation-store.ts +41 -0
- package/extensions/msteams/src/directory-live.ts +108 -0
- package/extensions/msteams/src/errors.ts +190 -0
- package/extensions/msteams/src/file-consent-helpers.ts +73 -0
- package/extensions/msteams/src/file-consent.ts +126 -0
- package/extensions/msteams/src/file-lock.ts +1 -0
- package/extensions/msteams/src/graph-chat.ts +53 -0
- package/extensions/msteams/src/graph-upload.ts +452 -0
- package/extensions/msteams/src/graph-users.ts +29 -0
- package/extensions/msteams/src/graph.ts +81 -0
- package/extensions/msteams/src/inbound.ts +48 -0
- package/extensions/msteams/src/index.ts +4 -0
- package/extensions/msteams/src/media-helpers.ts +105 -0
- package/extensions/msteams/src/mentions.ts +114 -0
- package/extensions/msteams/src/messenger.ts +484 -0
- package/extensions/msteams/src/monitor-handler/inbound-media.ts +128 -0
- package/extensions/msteams/src/monitor-handler/message-handler.ts +661 -0
- package/extensions/msteams/src/monitor-handler.ts +162 -0
- package/extensions/msteams/src/monitor-types.ts +5 -0
- package/extensions/msteams/src/monitor.ts +305 -0
- package/extensions/msteams/src/onboarding.ts +406 -0
- package/extensions/msteams/src/outbound.ts +46 -0
- package/extensions/msteams/src/pending-uploads.ts +89 -0
- package/extensions/msteams/src/policy.ts +259 -0
- package/extensions/msteams/src/polls-store-memory.ts +32 -0
- package/extensions/msteams/src/polls.ts +315 -0
- package/extensions/msteams/src/probe.ts +94 -0
- package/extensions/msteams/src/reply-dispatcher.ts +132 -0
- package/extensions/msteams/src/resolve-allowlist.ts +198 -0
- package/extensions/msteams/src/runtime.ts +14 -0
- package/extensions/msteams/src/sdk-types.ts +19 -0
- package/extensions/msteams/src/sdk.ts +33 -0
- package/extensions/msteams/src/send-context.ts +164 -0
- package/extensions/msteams/src/send.ts +530 -0
- package/extensions/msteams/src/sent-message-cache.ts +44 -0
- package/extensions/msteams/src/storage.ts +25 -0
- package/extensions/msteams/src/store-fs.ts +44 -0
- package/extensions/msteams/src/test-runtime.ts +16 -0
- package/extensions/msteams/src/token-response.ts +11 -0
- package/extensions/msteams/src/token.ts +19 -0
- package/extensions/nextcloud-talk/index.ts +17 -0
- package/extensions/nextcloud-talk/package.json +30 -0
- package/extensions/nextcloud-talk/remoteclaw.plugin.json +9 -0
- package/extensions/nextcloud-talk/src/accounts.ts +170 -0
- package/extensions/nextcloud-talk/src/channel.ts +416 -0
- package/extensions/nextcloud-talk/src/config-schema.ts +72 -0
- package/extensions/nextcloud-talk/src/format.ts +79 -0
- package/extensions/nextcloud-talk/src/inbound.ts +343 -0
- package/extensions/nextcloud-talk/src/monitor.ts +275 -0
- package/extensions/nextcloud-talk/src/normalize.ts +39 -0
- package/extensions/nextcloud-talk/src/onboarding.ts +349 -0
- package/extensions/nextcloud-talk/src/policy.ts +180 -0
- package/extensions/nextcloud-talk/src/room-info.ts +125 -0
- package/extensions/nextcloud-talk/src/runtime.ts +14 -0
- package/extensions/nextcloud-talk/src/send.ts +215 -0
- package/extensions/nextcloud-talk/src/signature.ts +72 -0
- package/extensions/nextcloud-talk/src/types.ts +185 -0
- package/extensions/nostr/CHANGELOG.md +44 -0
- package/extensions/nostr/README.md +136 -0
- package/extensions/nostr/index.ts +68 -0
- package/extensions/nostr/package.json +30 -0
- package/extensions/nostr/remoteclaw.plugin.json +9 -0
- package/extensions/nostr/src/channel.ts +345 -0
- package/extensions/nostr/src/config-schema.ts +90 -0
- package/extensions/nostr/src/metrics.ts +458 -0
- package/extensions/nostr/src/nostr-bus.ts +719 -0
- package/extensions/nostr/src/nostr-profile-http.ts +519 -0
- package/extensions/nostr/src/nostr-profile-import.ts +262 -0
- package/extensions/nostr/src/nostr-profile.ts +277 -0
- package/extensions/nostr/src/nostr-state-store.ts +226 -0
- package/extensions/nostr/src/runtime.ts +14 -0
- package/extensions/nostr/src/seen-tracker.ts +289 -0
- package/extensions/nostr/src/types.ts +101 -0
- package/extensions/phone-control/index.ts +421 -0
- package/extensions/phone-control/remoteclaw.plugin.json +10 -0
- package/extensions/shared/resolve-target-test-helpers.ts +66 -0
- package/extensions/signal/index.ts +17 -0
- package/extensions/signal/package.json +12 -0
- package/extensions/signal/remoteclaw.plugin.json +9 -0
- package/extensions/signal/src/channel.ts +299 -0
- package/extensions/signal/src/runtime.ts +14 -0
- package/extensions/slack/index.ts +17 -0
- package/extensions/slack/package.json +12 -0
- package/extensions/slack/remoteclaw.plugin.json +9 -0
- package/extensions/slack/src/channel.ts +421 -0
- package/extensions/slack/src/runtime.ts +14 -0
- package/extensions/synology-chat/index.ts +17 -0
- package/extensions/synology-chat/package.json +28 -0
- package/extensions/synology-chat/remoteclaw.plugin.json +9 -0
- package/extensions/synology-chat/src/accounts.ts +87 -0
- package/extensions/synology-chat/src/channel.ts +347 -0
- package/extensions/synology-chat/src/client.ts +142 -0
- package/extensions/synology-chat/src/runtime.ts +20 -0
- package/extensions/synology-chat/src/security.ts +140 -0
- package/extensions/synology-chat/src/types.ts +60 -0
- package/extensions/synology-chat/src/webhook-handler.ts +221 -0
- package/extensions/talk-voice/index.ts +150 -0
- package/extensions/talk-voice/remoteclaw.plugin.json +10 -0
- package/extensions/telegram/index.ts +17 -0
- package/extensions/telegram/package.json +12 -0
- package/extensions/telegram/remoteclaw.plugin.json +9 -0
- package/extensions/telegram/src/channel.ts +569 -0
- package/extensions/telegram/src/runtime.ts +14 -0
- package/extensions/test-utils/runtime-env.ts +12 -0
- package/extensions/thread-ownership/index.ts +133 -0
- package/extensions/thread-ownership/remoteclaw.plugin.json +28 -0
- package/extensions/tlon/README.md +5 -0
- package/extensions/tlon/index.ts +17 -0
- package/extensions/tlon/package.json +29 -0
- package/extensions/tlon/remoteclaw.plugin.json +9 -0
- package/extensions/tlon/src/account-fields.ts +25 -0
- package/extensions/tlon/src/channel.ts +384 -0
- package/extensions/tlon/src/config-schema.ts +41 -0
- package/extensions/tlon/src/monitor/discovery.ts +78 -0
- package/extensions/tlon/src/monitor/history.ts +92 -0
- package/extensions/tlon/src/monitor/index.ts +596 -0
- package/extensions/tlon/src/monitor/processed-messages.ts +33 -0
- package/extensions/tlon/src/monitor/utils.ts +106 -0
- package/extensions/tlon/src/onboarding.ts +229 -0
- package/extensions/tlon/src/runtime.ts +14 -0
- package/extensions/tlon/src/targets.ts +89 -0
- package/extensions/tlon/src/types.ts +99 -0
- package/extensions/tlon/src/urbit/auth.ts +48 -0
- package/extensions/tlon/src/urbit/base-url.ts +57 -0
- package/extensions/tlon/src/urbit/channel-client.ts +158 -0
- package/extensions/tlon/src/urbit/channel-ops.ts +164 -0
- package/extensions/tlon/src/urbit/context.ts +47 -0
- package/extensions/tlon/src/urbit/errors.ts +51 -0
- package/extensions/tlon/src/urbit/fetch.ts +39 -0
- package/extensions/tlon/src/urbit/send.ts +131 -0
- package/extensions/tlon/src/urbit/sse-client.ts +431 -0
- package/extensions/twitch/CHANGELOG.md +39 -0
- package/extensions/twitch/README.md +89 -0
- package/extensions/twitch/index.ts +20 -0
- package/extensions/twitch/package.json +17 -0
- package/extensions/twitch/remoteclaw.plugin.json +9 -0
- package/extensions/twitch/src/access-control.ts +166 -0
- package/extensions/twitch/src/actions.ts +174 -0
- package/extensions/twitch/src/client-manager-registry.ts +115 -0
- package/extensions/twitch/src/config-schema.ts +84 -0
- package/extensions/twitch/src/config.ts +116 -0
- package/extensions/twitch/src/monitor.ts +273 -0
- package/extensions/twitch/src/onboarding.ts +417 -0
- package/extensions/twitch/src/outbound.ts +187 -0
- package/extensions/twitch/src/plugin.ts +274 -0
- package/extensions/twitch/src/probe.ts +119 -0
- package/extensions/twitch/src/resolver.ts +137 -0
- package/extensions/twitch/src/runtime.ts +14 -0
- package/extensions/twitch/src/send.ts +136 -0
- package/extensions/twitch/src/status.ts +179 -0
- package/extensions/twitch/src/test-fixtures.ts +30 -0
- package/extensions/twitch/src/token.ts +94 -0
- package/extensions/twitch/src/twitch-client.ts +277 -0
- package/extensions/twitch/src/types.ts +141 -0
- package/extensions/twitch/src/utils/markdown.ts +98 -0
- package/extensions/twitch/src/utils/twitch.ts +80 -0
- package/extensions/voice-call/CHANGELOG.md +49 -0
- package/extensions/voice-call/README.md +181 -0
- package/extensions/voice-call/index.ts +512 -0
- package/extensions/voice-call/package.json +16 -0
- package/extensions/voice-call/remoteclaw.plugin.json +559 -0
- package/extensions/voice-call/src/allowlist.ts +19 -0
- package/extensions/voice-call/src/cli.ts +380 -0
- package/extensions/voice-call/src/config.ts +477 -0
- package/extensions/voice-call/src/core-bridge.ts +170 -0
- package/extensions/voice-call/src/manager/context.ts +41 -0
- package/extensions/voice-call/src/manager/events.ts +242 -0
- package/extensions/voice-call/src/manager/lookup.ts +35 -0
- package/extensions/voice-call/src/manager/outbound.ts +380 -0
- package/extensions/voice-call/src/manager/state.ts +48 -0
- package/extensions/voice-call/src/manager/store.ts +94 -0
- package/extensions/voice-call/src/manager/timers.ts +112 -0
- package/extensions/voice-call/src/manager/twiml.ts +9 -0
- package/extensions/voice-call/src/manager.ts +209 -0
- package/extensions/voice-call/src/media-stream.ts +527 -0
- package/extensions/voice-call/src/providers/base.ts +67 -0
- package/extensions/voice-call/src/providers/index.ts +10 -0
- package/extensions/voice-call/src/providers/mock.ts +165 -0
- package/extensions/voice-call/src/providers/plivo.ts +560 -0
- package/extensions/voice-call/src/providers/stt-openai-realtime.ts +311 -0
- package/extensions/voice-call/src/providers/telnyx.ts +318 -0
- package/extensions/voice-call/src/providers/tts-openai.ts +259 -0
- package/extensions/voice-call/src/providers/twilio/api.ts +42 -0
- package/extensions/voice-call/src/providers/twilio/webhook.ts +33 -0
- package/extensions/voice-call/src/providers/twilio.ts +688 -0
- package/extensions/voice-call/src/response-generator.ts +174 -0
- package/extensions/voice-call/src/runtime.ts +217 -0
- package/extensions/voice-call/src/telephony-audio.ts +90 -0
- package/extensions/voice-call/src/telephony-tts.ts +106 -0
- package/extensions/voice-call/src/tunnel.ts +314 -0
- package/extensions/voice-call/src/types.ts +280 -0
- package/extensions/voice-call/src/utils.ts +14 -0
- package/extensions/voice-call/src/voice-mapping.ts +67 -0
- package/extensions/voice-call/src/webhook-security.ts +880 -0
- package/extensions/voice-call/src/webhook.ts +556 -0
- package/extensions/whatsapp/index.ts +17 -0
- package/extensions/whatsapp/package.json +12 -0
- package/extensions/whatsapp/remoteclaw.plugin.json +9 -0
- package/extensions/whatsapp/src/channel.ts +459 -0
- package/extensions/whatsapp/src/runtime.ts +14 -0
- package/extensions/zalo/CHANGELOG.md +29 -0
- package/extensions/zalo/README.md +50 -0
- package/extensions/zalo/index.ts +19 -0
- package/extensions/zalo/package.json +32 -0
- package/extensions/zalo/remoteclaw.plugin.json +9 -0
- package/extensions/zalo/src/accounts.ts +82 -0
- package/extensions/zalo/src/actions.ts +56 -0
- package/extensions/zalo/src/api.ts +208 -0
- package/extensions/zalo/src/channel.ts +398 -0
- package/extensions/zalo/src/config-schema.ts +27 -0
- package/extensions/zalo/src/group-access.ts +48 -0
- package/extensions/zalo/src/monitor.ts +675 -0
- package/extensions/zalo/src/monitor.webhook.ts +219 -0
- package/extensions/zalo/src/onboarding.ts +398 -0
- package/extensions/zalo/src/probe.ts +45 -0
- package/extensions/zalo/src/proxy.ts +24 -0
- package/extensions/zalo/src/runtime.ts +14 -0
- package/extensions/zalo/src/send.ts +124 -0
- package/extensions/zalo/src/status-issues.ts +53 -0
- package/extensions/zalo/src/token.ts +62 -0
- package/extensions/zalo/src/types.ts +48 -0
- package/extensions/zalouser/CHANGELOG.md +31 -0
- package/extensions/zalouser/README.md +225 -0
- package/extensions/zalouser/index.ts +31 -0
- package/extensions/zalouser/package.json +32 -0
- package/extensions/zalouser/remoteclaw.plugin.json +9 -0
- package/extensions/zalouser/src/accounts.ts +138 -0
- package/extensions/zalouser/src/channel.ts +652 -0
- package/extensions/zalouser/src/config-schema.ts +28 -0
- package/extensions/zalouser/src/monitor.ts +619 -0
- package/extensions/zalouser/src/onboarding.ts +428 -0
- package/extensions/zalouser/src/probe.ts +27 -0
- package/extensions/zalouser/src/runtime.ts +14 -0
- package/extensions/zalouser/src/send.ts +141 -0
- package/extensions/zalouser/src/status-issues.ts +89 -0
- package/extensions/zalouser/src/tool.ts +166 -0
- package/extensions/zalouser/src/types.ts +105 -0
- package/extensions/zalouser/src/zca.ts +198 -0
- package/package.json +251 -15
- package/remoteclaw.mjs +56 -0
- package/index.js +0 -4
|
@@ -0,0 +1,2593 @@
|
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
|
+
import { Q as normalizeE164, dn as resolveRequiredHomeDir, o as createSubsystemLogger } from "./entry.js";
|
|
3
|
+
import { n as isPidAlive, t as resolveProcessScopedMap } from "./process-scoped-map-PEvnG75N.js";
|
|
4
|
+
import { c as normalizeMainKey, g as normalizeOptionalAccountId, l as resolveAgentIdFromSessionKey, r as buildAgentMainSessionKey, s as normalizeAgentId, t as DEFAULT_AGENT_ID } from "./session-key-C2n-VILA.js";
|
|
5
|
+
import { _ as parseDurationMs, i as loadConfig, v as parseByteSize } from "./config-FHu9Bn4R.js";
|
|
6
|
+
import { c as normalizeHyphenSlug, t as getChannelDock } from "./dock-BqNINg7k.js";
|
|
7
|
+
import { c as normalizeMessageChannel, s as listDeliverableMessageChannels } from "./message-channel-uWMAiywE.js";
|
|
8
|
+
import { t as normalizeChatType } from "./chat-type-CYPyHAj-.js";
|
|
9
|
+
import { n as resolveConversationLabel } from "./conversation-label-C4SDz4sT.js";
|
|
10
|
+
import { r as normalizeChannelId } from "./plugins-BflZz0sp.js";
|
|
11
|
+
import { a as hasToolCall, c as resolveSessionFilePath, d as resolveSessionTranscriptPathInDir, f as resolveSessionTranscriptsDir, h as validateSessionId, i as extractToolCallNames, l as resolveSessionFilePathOptions, m as resolveStorePath, n as stripMessageIdHints, o as SAFE_SESSION_ID_RE, p as resolveSessionTranscriptsDirForAgent, s as resolveDefaultSessionStorePath, t as stripEnvelope, u as resolveSessionTranscriptPath } from "./chat-envelope-DEZ-5RY8.js";
|
|
12
|
+
import { n as hasInterSessionUserProvenance } from "./input-provenance-xUsSMOsz.js";
|
|
13
|
+
import { t as stripInboundMetadata } from "./strip-inbound-meta-DjKcSFaW.js";
|
|
14
|
+
import os from "node:os";
|
|
15
|
+
import path from "node:path";
|
|
16
|
+
import fs from "node:fs";
|
|
17
|
+
import fsp from "node:fs/promises";
|
|
18
|
+
import crypto from "node:crypto";
|
|
19
|
+
|
|
20
|
+
//#region src/config/sessions/group.ts
|
|
21
|
+
const getGroupSurfaces = () => new Set([...listDeliverableMessageChannels(), "webchat"]);
|
|
22
|
+
function normalizeGroupLabel(raw) {
|
|
23
|
+
return normalizeHyphenSlug(raw);
|
|
24
|
+
}
|
|
25
|
+
function shortenGroupId(value) {
|
|
26
|
+
const trimmed = value?.trim() ?? "";
|
|
27
|
+
if (!trimmed) return "";
|
|
28
|
+
if (trimmed.length <= 14) return trimmed;
|
|
29
|
+
return `${trimmed.slice(0, 6)}...${trimmed.slice(-4)}`;
|
|
30
|
+
}
|
|
31
|
+
function buildGroupDisplayName(params) {
|
|
32
|
+
const providerKey = (params.provider?.trim().toLowerCase() || "group").trim();
|
|
33
|
+
const groupChannel = params.groupChannel?.trim();
|
|
34
|
+
const space = params.space?.trim();
|
|
35
|
+
const subject = params.subject?.trim();
|
|
36
|
+
const detail = (groupChannel && space ? `${space}${groupChannel.startsWith("#") ? "" : "#"}${groupChannel}` : groupChannel || subject || space || "") || "";
|
|
37
|
+
const fallbackId = params.id?.trim() || params.key;
|
|
38
|
+
const rawLabel = detail || fallbackId;
|
|
39
|
+
let token = normalizeGroupLabel(rawLabel);
|
|
40
|
+
if (!token) token = normalizeGroupLabel(shortenGroupId(rawLabel));
|
|
41
|
+
if (!params.groupChannel && token.startsWith("#")) token = token.replace(/^#+/, "");
|
|
42
|
+
if (token && !/^[@#]/.test(token) && !token.startsWith("g-") && !token.includes("#")) token = `g-${token}`;
|
|
43
|
+
return token ? `${providerKey}:${token}` : providerKey;
|
|
44
|
+
}
|
|
45
|
+
function resolveGroupSessionKey(ctx) {
|
|
46
|
+
const from = typeof ctx.From === "string" ? ctx.From.trim() : "";
|
|
47
|
+
const chatType = ctx.ChatType?.trim().toLowerCase();
|
|
48
|
+
const normalizedChatType = chatType === "channel" ? "channel" : chatType === "group" ? "group" : void 0;
|
|
49
|
+
const isWhatsAppGroupId = from.toLowerCase().endsWith("@g.us");
|
|
50
|
+
if (!(normalizedChatType === "group" || normalizedChatType === "channel" || from.includes(":group:") || from.includes(":channel:") || isWhatsAppGroupId)) return null;
|
|
51
|
+
const providerHint = ctx.Provider?.trim().toLowerCase();
|
|
52
|
+
const parts = from.split(":").filter(Boolean);
|
|
53
|
+
const head = parts[0]?.trim().toLowerCase() ?? "";
|
|
54
|
+
const headIsSurface = head ? getGroupSurfaces().has(head) : false;
|
|
55
|
+
const provider = headIsSurface ? head : providerHint ?? (isWhatsAppGroupId ? "whatsapp" : void 0);
|
|
56
|
+
if (!provider) return null;
|
|
57
|
+
const second = parts[1]?.trim().toLowerCase();
|
|
58
|
+
const secondIsKind = second === "group" || second === "channel";
|
|
59
|
+
const kind = secondIsKind ? second : from.includes(":channel:") || normalizedChatType === "channel" ? "channel" : "group";
|
|
60
|
+
const finalId = (headIsSurface ? secondIsKind ? parts.slice(2).join(":") : parts.slice(1).join(":") : from).trim().toLowerCase();
|
|
61
|
+
if (!finalId) return null;
|
|
62
|
+
return {
|
|
63
|
+
key: `${provider}:${kind}:${finalId}`,
|
|
64
|
+
channel: provider,
|
|
65
|
+
id: finalId,
|
|
66
|
+
chatType: kind === "channel" ? "channel" : "group"
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
//#endregion
|
|
71
|
+
//#region src/config/sessions/artifacts.ts
|
|
72
|
+
const ARCHIVE_TIMESTAMP_RE = /^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(?:\.\d{3})?Z$/;
|
|
73
|
+
const LEGACY_STORE_BACKUP_RE = /^sessions\.json\.bak\.\d+$/;
|
|
74
|
+
function hasArchiveSuffix(fileName, reason) {
|
|
75
|
+
const marker = `.${reason}.`;
|
|
76
|
+
const index = fileName.lastIndexOf(marker);
|
|
77
|
+
if (index < 0) return false;
|
|
78
|
+
const raw = fileName.slice(index + marker.length);
|
|
79
|
+
return ARCHIVE_TIMESTAMP_RE.test(raw);
|
|
80
|
+
}
|
|
81
|
+
function isSessionArchiveArtifactName(fileName) {
|
|
82
|
+
if (LEGACY_STORE_BACKUP_RE.test(fileName)) return true;
|
|
83
|
+
return hasArchiveSuffix(fileName, "deleted") || hasArchiveSuffix(fileName, "reset") || hasArchiveSuffix(fileName, "bak");
|
|
84
|
+
}
|
|
85
|
+
function isPrimarySessionTranscriptFileName(fileName) {
|
|
86
|
+
if (fileName === "sessions.json") return false;
|
|
87
|
+
if (!fileName.endsWith(".jsonl")) return false;
|
|
88
|
+
return !isSessionArchiveArtifactName(fileName);
|
|
89
|
+
}
|
|
90
|
+
function formatSessionArchiveTimestamp(nowMs = Date.now()) {
|
|
91
|
+
return new Date(nowMs).toISOString().replaceAll(":", "-");
|
|
92
|
+
}
|
|
93
|
+
function restoreSessionArchiveTimestamp(raw) {
|
|
94
|
+
const [datePart, timePart] = raw.split("T");
|
|
95
|
+
if (!datePart || !timePart) return raw;
|
|
96
|
+
return `${datePart}T${timePart.replace(/-/g, ":")}`;
|
|
97
|
+
}
|
|
98
|
+
function parseSessionArchiveTimestamp(fileName, reason) {
|
|
99
|
+
const marker = `.${reason}.`;
|
|
100
|
+
const index = fileName.lastIndexOf(marker);
|
|
101
|
+
if (index < 0) return null;
|
|
102
|
+
const raw = fileName.slice(index + marker.length);
|
|
103
|
+
if (!raw) return null;
|
|
104
|
+
if (!ARCHIVE_TIMESTAMP_RE.test(raw)) return null;
|
|
105
|
+
const timestamp = Date.parse(restoreSessionArchiveTimestamp(raw));
|
|
106
|
+
return Number.isNaN(timestamp) ? null : timestamp;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
//#endregion
|
|
110
|
+
//#region src/config/sessions/metadata.ts
|
|
111
|
+
const mergeOrigin = (existing, next) => {
|
|
112
|
+
if (!existing && !next) return;
|
|
113
|
+
const merged = existing ? { ...existing } : {};
|
|
114
|
+
if (next?.label) merged.label = next.label;
|
|
115
|
+
if (next?.provider) merged.provider = next.provider;
|
|
116
|
+
if (next?.surface) merged.surface = next.surface;
|
|
117
|
+
if (next?.chatType) merged.chatType = next.chatType;
|
|
118
|
+
if (next?.from) merged.from = next.from;
|
|
119
|
+
if (next?.to) merged.to = next.to;
|
|
120
|
+
if (next?.accountId) merged.accountId = next.accountId;
|
|
121
|
+
if (next?.threadId != null && next.threadId !== "") merged.threadId = next.threadId;
|
|
122
|
+
return Object.keys(merged).length > 0 ? merged : void 0;
|
|
123
|
+
};
|
|
124
|
+
function deriveSessionOrigin(ctx) {
|
|
125
|
+
const label = resolveConversationLabel(ctx)?.trim();
|
|
126
|
+
const provider = normalizeMessageChannel(typeof ctx.OriginatingChannel === "string" && ctx.OriginatingChannel || ctx.Surface || ctx.Provider);
|
|
127
|
+
const surface = ctx.Surface?.trim().toLowerCase();
|
|
128
|
+
const chatType = normalizeChatType(ctx.ChatType) ?? void 0;
|
|
129
|
+
const from = ctx.From?.trim();
|
|
130
|
+
const to = (typeof ctx.OriginatingTo === "string" ? ctx.OriginatingTo : ctx.To)?.trim() ?? void 0;
|
|
131
|
+
const accountId = ctx.AccountId?.trim();
|
|
132
|
+
const threadId = ctx.MessageThreadId ?? void 0;
|
|
133
|
+
const origin = {};
|
|
134
|
+
if (label) origin.label = label;
|
|
135
|
+
if (provider) origin.provider = provider;
|
|
136
|
+
if (surface) origin.surface = surface;
|
|
137
|
+
if (chatType) origin.chatType = chatType;
|
|
138
|
+
if (from) origin.from = from;
|
|
139
|
+
if (to) origin.to = to;
|
|
140
|
+
if (accountId) origin.accountId = accountId;
|
|
141
|
+
if (threadId != null && threadId !== "") origin.threadId = threadId;
|
|
142
|
+
return Object.keys(origin).length > 0 ? origin : void 0;
|
|
143
|
+
}
|
|
144
|
+
function snapshotSessionOrigin(entry) {
|
|
145
|
+
if (!entry?.origin) return;
|
|
146
|
+
return { ...entry.origin };
|
|
147
|
+
}
|
|
148
|
+
function deriveGroupSessionPatch(params) {
|
|
149
|
+
const resolution = params.groupResolution ?? resolveGroupSessionKey(params.ctx);
|
|
150
|
+
if (!resolution?.channel) return null;
|
|
151
|
+
const channel = resolution.channel;
|
|
152
|
+
const subject = params.ctx.GroupSubject?.trim();
|
|
153
|
+
const space = params.ctx.GroupSpace?.trim();
|
|
154
|
+
const explicitChannel = params.ctx.GroupChannel?.trim();
|
|
155
|
+
const normalizedChannel = normalizeChannelId(channel);
|
|
156
|
+
const isChannelProvider = Boolean(normalizedChannel && getChannelDock(normalizedChannel)?.capabilities.chatTypes.includes("channel"));
|
|
157
|
+
const nextGroupChannel = explicitChannel ?? ((resolution.chatType === "channel" || isChannelProvider) && subject && subject.startsWith("#") ? subject : void 0);
|
|
158
|
+
const nextSubject = nextGroupChannel ? void 0 : subject;
|
|
159
|
+
const patch = {
|
|
160
|
+
chatType: resolution.chatType ?? "group",
|
|
161
|
+
channel,
|
|
162
|
+
groupId: resolution.id
|
|
163
|
+
};
|
|
164
|
+
if (nextSubject) patch.subject = nextSubject;
|
|
165
|
+
if (nextGroupChannel) patch.groupChannel = nextGroupChannel;
|
|
166
|
+
if (space) patch.space = space;
|
|
167
|
+
const displayName = buildGroupDisplayName({
|
|
168
|
+
provider: channel,
|
|
169
|
+
subject: nextSubject ?? params.existing?.subject,
|
|
170
|
+
groupChannel: nextGroupChannel ?? params.existing?.groupChannel,
|
|
171
|
+
space: space ?? params.existing?.space,
|
|
172
|
+
id: resolution.id,
|
|
173
|
+
key: params.sessionKey
|
|
174
|
+
});
|
|
175
|
+
if (displayName) patch.displayName = displayName;
|
|
176
|
+
return patch;
|
|
177
|
+
}
|
|
178
|
+
function deriveSessionMetaPatch(params) {
|
|
179
|
+
const groupPatch = deriveGroupSessionPatch(params);
|
|
180
|
+
const origin = deriveSessionOrigin(params.ctx);
|
|
181
|
+
if (!groupPatch && !origin) return null;
|
|
182
|
+
const patch = groupPatch ? { ...groupPatch } : {};
|
|
183
|
+
const mergedOrigin = mergeOrigin(params.existing?.origin, origin);
|
|
184
|
+
if (mergedOrigin) patch.origin = mergedOrigin;
|
|
185
|
+
return Object.keys(patch).length > 0 ? patch : null;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
//#endregion
|
|
189
|
+
//#region src/config/sessions/main-session.ts
|
|
190
|
+
function resolveMainSessionKey(cfg) {
|
|
191
|
+
if (cfg?.session?.scope === "global") return "global";
|
|
192
|
+
const agents = cfg?.agents?.list ?? [];
|
|
193
|
+
return buildAgentMainSessionKey({
|
|
194
|
+
agentId: normalizeAgentId(agents.find((agent) => agent?.default)?.id ?? agents[0]?.id ?? DEFAULT_AGENT_ID),
|
|
195
|
+
mainKey: normalizeMainKey(cfg?.session?.mainKey)
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
function resolveMainSessionKeyFromConfig() {
|
|
199
|
+
return resolveMainSessionKey(loadConfig());
|
|
200
|
+
}
|
|
201
|
+
function resolveAgentMainSessionKey(params) {
|
|
202
|
+
const mainKey = normalizeMainKey(params.cfg?.session?.mainKey);
|
|
203
|
+
return buildAgentMainSessionKey({
|
|
204
|
+
agentId: params.agentId,
|
|
205
|
+
mainKey
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
function resolveExplicitAgentSessionKey(params) {
|
|
209
|
+
const agentId = params.agentId?.trim();
|
|
210
|
+
if (!agentId) return;
|
|
211
|
+
return resolveAgentMainSessionKey({
|
|
212
|
+
cfg: params.cfg,
|
|
213
|
+
agentId
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
function canonicalizeMainSessionAlias(params) {
|
|
217
|
+
const raw = params.sessionKey.trim();
|
|
218
|
+
if (!raw) return raw;
|
|
219
|
+
const agentId = normalizeAgentId(params.agentId);
|
|
220
|
+
const mainKey = normalizeMainKey(params.cfg?.session?.mainKey);
|
|
221
|
+
const agentMainSessionKey = buildAgentMainSessionKey({
|
|
222
|
+
agentId,
|
|
223
|
+
mainKey
|
|
224
|
+
});
|
|
225
|
+
const agentMainAliasKey = buildAgentMainSessionKey({
|
|
226
|
+
agentId,
|
|
227
|
+
mainKey: "main"
|
|
228
|
+
});
|
|
229
|
+
const isMainAlias = raw === "main" || raw === mainKey || raw === agentMainSessionKey || raw === agentMainAliasKey;
|
|
230
|
+
if (params.cfg?.session?.scope === "global" && isMainAlias) return "global";
|
|
231
|
+
if (isMainAlias) return agentMainSessionKey;
|
|
232
|
+
return raw;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
//#endregion
|
|
236
|
+
//#region src/config/sessions/types.ts
|
|
237
|
+
function normalizeRuntimeField(value) {
|
|
238
|
+
const trimmed = value?.trim();
|
|
239
|
+
return trimmed ? trimmed : void 0;
|
|
240
|
+
}
|
|
241
|
+
function normalizeSessionRuntimeModelFields(entry) {
|
|
242
|
+
const normalizedModel = normalizeRuntimeField(entry.model);
|
|
243
|
+
const normalizedProvider = normalizeRuntimeField(entry.modelProvider);
|
|
244
|
+
let next = entry;
|
|
245
|
+
if (!normalizedModel) {
|
|
246
|
+
if (entry.model !== void 0 || entry.modelProvider !== void 0) {
|
|
247
|
+
next = { ...next };
|
|
248
|
+
delete next.model;
|
|
249
|
+
delete next.modelProvider;
|
|
250
|
+
}
|
|
251
|
+
return next;
|
|
252
|
+
}
|
|
253
|
+
if (entry.model !== normalizedModel) {
|
|
254
|
+
if (next === entry) next = { ...next };
|
|
255
|
+
next.model = normalizedModel;
|
|
256
|
+
}
|
|
257
|
+
if (!normalizedProvider) {
|
|
258
|
+
if (entry.modelProvider !== void 0) {
|
|
259
|
+
if (next === entry) next = { ...next };
|
|
260
|
+
delete next.modelProvider;
|
|
261
|
+
}
|
|
262
|
+
return next;
|
|
263
|
+
}
|
|
264
|
+
if (entry.modelProvider !== normalizedProvider) {
|
|
265
|
+
if (next === entry) next = { ...next };
|
|
266
|
+
next.modelProvider = normalizedProvider;
|
|
267
|
+
}
|
|
268
|
+
return next;
|
|
269
|
+
}
|
|
270
|
+
function setSessionRuntimeModel(entry, runtime) {
|
|
271
|
+
const provider = runtime.provider.trim();
|
|
272
|
+
const model = runtime.model.trim();
|
|
273
|
+
if (!provider || !model) return false;
|
|
274
|
+
entry.modelProvider = provider;
|
|
275
|
+
entry.model = model;
|
|
276
|
+
return true;
|
|
277
|
+
}
|
|
278
|
+
function mergeSessionEntry(existing, patch) {
|
|
279
|
+
const sessionId = patch.sessionId ?? existing?.sessionId ?? crypto.randomUUID();
|
|
280
|
+
const updatedAt = Math.max(existing?.updatedAt ?? 0, patch.updatedAt ?? 0, Date.now());
|
|
281
|
+
if (!existing) return normalizeSessionRuntimeModelFields({
|
|
282
|
+
...patch,
|
|
283
|
+
sessionId,
|
|
284
|
+
updatedAt
|
|
285
|
+
});
|
|
286
|
+
const next = {
|
|
287
|
+
...existing,
|
|
288
|
+
...patch,
|
|
289
|
+
sessionId,
|
|
290
|
+
updatedAt
|
|
291
|
+
};
|
|
292
|
+
if (Object.hasOwn(patch, "model") && !Object.hasOwn(patch, "modelProvider")) {
|
|
293
|
+
const patchedModel = normalizeRuntimeField(patch.model);
|
|
294
|
+
const existingModel = normalizeRuntimeField(existing.model);
|
|
295
|
+
if (patchedModel && patchedModel !== existingModel) delete next.modelProvider;
|
|
296
|
+
}
|
|
297
|
+
return normalizeSessionRuntimeModelFields(next);
|
|
298
|
+
}
|
|
299
|
+
function resolveFreshSessionTotalTokens(entry) {
|
|
300
|
+
const total = entry?.totalTokens;
|
|
301
|
+
if (typeof total !== "number" || !Number.isFinite(total) || total < 0) return;
|
|
302
|
+
if (entry?.totalTokensFresh === false) return;
|
|
303
|
+
return total;
|
|
304
|
+
}
|
|
305
|
+
function isSessionTotalTokensFresh(entry) {
|
|
306
|
+
return resolveFreshSessionTotalTokens(entry) !== void 0;
|
|
307
|
+
}
|
|
308
|
+
const DEFAULT_RESET_TRIGGER = "/new";
|
|
309
|
+
const DEFAULT_RESET_TRIGGERS = ["/new", "/reset"];
|
|
310
|
+
const DEFAULT_IDLE_MINUTES = 60;
|
|
311
|
+
|
|
312
|
+
//#endregion
|
|
313
|
+
//#region src/config/sessions/reset.ts
|
|
314
|
+
const DEFAULT_RESET_MODE = "daily";
|
|
315
|
+
const DEFAULT_RESET_AT_HOUR = 4;
|
|
316
|
+
const THREAD_SESSION_MARKERS = [":thread:", ":topic:"];
|
|
317
|
+
const GROUP_SESSION_MARKERS = [":group:", ":channel:"];
|
|
318
|
+
function isThreadSessionKey(sessionKey) {
|
|
319
|
+
const normalized = (sessionKey ?? "").toLowerCase();
|
|
320
|
+
if (!normalized) return false;
|
|
321
|
+
return THREAD_SESSION_MARKERS.some((marker) => normalized.includes(marker));
|
|
322
|
+
}
|
|
323
|
+
function resolveSessionResetType(params) {
|
|
324
|
+
if (params.isThread || isThreadSessionKey(params.sessionKey)) return "thread";
|
|
325
|
+
if (params.isGroup) return "group";
|
|
326
|
+
const normalized = (params.sessionKey ?? "").toLowerCase();
|
|
327
|
+
if (GROUP_SESSION_MARKERS.some((marker) => normalized.includes(marker))) return "group";
|
|
328
|
+
return "direct";
|
|
329
|
+
}
|
|
330
|
+
function resolveThreadFlag(params) {
|
|
331
|
+
if (params.messageThreadId != null) return true;
|
|
332
|
+
if (params.threadLabel?.trim()) return true;
|
|
333
|
+
if (params.threadStarterBody?.trim()) return true;
|
|
334
|
+
if (params.parentSessionKey?.trim()) return true;
|
|
335
|
+
return isThreadSessionKey(params.sessionKey);
|
|
336
|
+
}
|
|
337
|
+
function resolveDailyResetAtMs(now, atHour) {
|
|
338
|
+
const normalizedAtHour = normalizeResetAtHour(atHour);
|
|
339
|
+
const resetAt = new Date(now);
|
|
340
|
+
resetAt.setHours(normalizedAtHour, 0, 0, 0);
|
|
341
|
+
if (now < resetAt.getTime()) resetAt.setDate(resetAt.getDate() - 1);
|
|
342
|
+
return resetAt.getTime();
|
|
343
|
+
}
|
|
344
|
+
function resolveSessionResetPolicy(params) {
|
|
345
|
+
const sessionCfg = params.sessionCfg;
|
|
346
|
+
const baseReset = params.resetOverride ?? sessionCfg?.reset;
|
|
347
|
+
const typeReset = params.resetOverride ? void 0 : sessionCfg?.resetByType?.[params.resetType] ?? (params.resetType === "direct" ? (sessionCfg?.resetByType)?.dm : void 0);
|
|
348
|
+
const hasExplicitReset = Boolean(baseReset || sessionCfg?.resetByType);
|
|
349
|
+
const legacyIdleMinutes = params.resetOverride ? void 0 : sessionCfg?.idleMinutes;
|
|
350
|
+
const mode = typeReset?.mode ?? baseReset?.mode ?? (!hasExplicitReset && legacyIdleMinutes != null ? "idle" : DEFAULT_RESET_MODE);
|
|
351
|
+
const atHour = normalizeResetAtHour(typeReset?.atHour ?? baseReset?.atHour ?? DEFAULT_RESET_AT_HOUR);
|
|
352
|
+
const idleMinutesRaw = typeReset?.idleMinutes ?? baseReset?.idleMinutes ?? legacyIdleMinutes;
|
|
353
|
+
let idleMinutes;
|
|
354
|
+
if (idleMinutesRaw != null) {
|
|
355
|
+
const normalized = Math.floor(idleMinutesRaw);
|
|
356
|
+
if (Number.isFinite(normalized)) idleMinutes = Math.max(normalized, 1);
|
|
357
|
+
} else if (mode === "idle") idleMinutes = DEFAULT_IDLE_MINUTES;
|
|
358
|
+
return {
|
|
359
|
+
mode,
|
|
360
|
+
atHour,
|
|
361
|
+
idleMinutes
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
function resolveChannelResetConfig(params) {
|
|
365
|
+
const resetByChannel = params.sessionCfg?.resetByChannel;
|
|
366
|
+
if (!resetByChannel) return;
|
|
367
|
+
const normalized = normalizeMessageChannel(params.channel);
|
|
368
|
+
const fallback = params.channel?.trim().toLowerCase();
|
|
369
|
+
const key = normalized ?? fallback;
|
|
370
|
+
if (!key) return;
|
|
371
|
+
return resetByChannel[key] ?? resetByChannel[key.toLowerCase()];
|
|
372
|
+
}
|
|
373
|
+
function evaluateSessionFreshness(params) {
|
|
374
|
+
const dailyResetAt = params.policy.mode === "daily" ? resolveDailyResetAtMs(params.now, params.policy.atHour) : void 0;
|
|
375
|
+
const idleExpiresAt = params.policy.idleMinutes != null ? params.updatedAt + params.policy.idleMinutes * 6e4 : void 0;
|
|
376
|
+
const staleDaily = dailyResetAt != null && params.updatedAt < dailyResetAt;
|
|
377
|
+
const staleIdle = idleExpiresAt != null && params.now > idleExpiresAt;
|
|
378
|
+
return {
|
|
379
|
+
fresh: !(staleDaily || staleIdle),
|
|
380
|
+
dailyResetAt,
|
|
381
|
+
idleExpiresAt
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
function normalizeResetAtHour(value) {
|
|
385
|
+
if (typeof value !== "number" || !Number.isFinite(value)) return DEFAULT_RESET_AT_HOUR;
|
|
386
|
+
const normalized = Math.floor(value);
|
|
387
|
+
if (!Number.isFinite(normalized)) return DEFAULT_RESET_AT_HOUR;
|
|
388
|
+
if (normalized < 0) return 0;
|
|
389
|
+
if (normalized > 23) return 23;
|
|
390
|
+
return normalized;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
//#endregion
|
|
394
|
+
//#region src/config/sessions/session-key.ts
|
|
395
|
+
function deriveSessionKey(scope, ctx) {
|
|
396
|
+
if (scope === "global") return "global";
|
|
397
|
+
const resolvedGroup = resolveGroupSessionKey(ctx);
|
|
398
|
+
if (resolvedGroup) return resolvedGroup.key;
|
|
399
|
+
return (ctx.From ? normalizeE164(ctx.From) : "") || "unknown";
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Resolve the session key with a canonical direct-chat bucket (default: "main").
|
|
403
|
+
* All non-group direct chats collapse to this bucket; groups stay isolated.
|
|
404
|
+
*/
|
|
405
|
+
function resolveSessionKey(scope, ctx, mainKey) {
|
|
406
|
+
const explicit = ctx.SessionKey?.trim();
|
|
407
|
+
if (explicit) return explicit.toLowerCase();
|
|
408
|
+
const raw = deriveSessionKey(scope, ctx);
|
|
409
|
+
if (scope === "global") return raw;
|
|
410
|
+
const canonical = buildAgentMainSessionKey({
|
|
411
|
+
agentId: DEFAULT_AGENT_ID,
|
|
412
|
+
mainKey: normalizeMainKey(mainKey)
|
|
413
|
+
});
|
|
414
|
+
if (!(raw.includes(":group:") || raw.includes(":channel:"))) return canonical;
|
|
415
|
+
return `agent:${DEFAULT_AGENT_ID}:${raw}`;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
//#endregion
|
|
419
|
+
//#region src/agents/session-write-lock.ts
|
|
420
|
+
const CLEANUP_SIGNALS = [
|
|
421
|
+
"SIGINT",
|
|
422
|
+
"SIGTERM",
|
|
423
|
+
"SIGQUIT",
|
|
424
|
+
"SIGABRT"
|
|
425
|
+
];
|
|
426
|
+
const CLEANUP_STATE_KEY = Symbol.for("remoteclaw.sessionWriteLockCleanupState");
|
|
427
|
+
const HELD_LOCKS_KEY = Symbol.for("remoteclaw.sessionWriteLockHeldLocks");
|
|
428
|
+
const WATCHDOG_STATE_KEY = Symbol.for("remoteclaw.sessionWriteLockWatchdogState");
|
|
429
|
+
const DEFAULT_STALE_MS = 1800 * 1e3;
|
|
430
|
+
const DEFAULT_MAX_HOLD_MS = 300 * 1e3;
|
|
431
|
+
const DEFAULT_WATCHDOG_INTERVAL_MS = 6e4;
|
|
432
|
+
const DEFAULT_TIMEOUT_GRACE_MS = 120 * 1e3;
|
|
433
|
+
const HELD_LOCKS = resolveProcessScopedMap(HELD_LOCKS_KEY);
|
|
434
|
+
function resolveCleanupState() {
|
|
435
|
+
const proc = process;
|
|
436
|
+
if (!proc[CLEANUP_STATE_KEY]) proc[CLEANUP_STATE_KEY] = {
|
|
437
|
+
registered: false,
|
|
438
|
+
cleanupHandlers: /* @__PURE__ */ new Map()
|
|
439
|
+
};
|
|
440
|
+
return proc[CLEANUP_STATE_KEY];
|
|
441
|
+
}
|
|
442
|
+
function resolveWatchdogState() {
|
|
443
|
+
const proc = process;
|
|
444
|
+
if (!proc[WATCHDOG_STATE_KEY]) proc[WATCHDOG_STATE_KEY] = {
|
|
445
|
+
started: false,
|
|
446
|
+
intervalMs: DEFAULT_WATCHDOG_INTERVAL_MS
|
|
447
|
+
};
|
|
448
|
+
return proc[WATCHDOG_STATE_KEY];
|
|
449
|
+
}
|
|
450
|
+
function resolvePositiveMs(value, fallback, opts = {}) {
|
|
451
|
+
if (typeof value !== "number" || Number.isNaN(value) || value <= 0) return fallback;
|
|
452
|
+
if (value === Number.POSITIVE_INFINITY) return opts.allowInfinity ? value : fallback;
|
|
453
|
+
if (!Number.isFinite(value)) return fallback;
|
|
454
|
+
return value;
|
|
455
|
+
}
|
|
456
|
+
async function releaseHeldLock(normalizedSessionFile, held, opts = {}) {
|
|
457
|
+
if (HELD_LOCKS.get(normalizedSessionFile) !== held) return false;
|
|
458
|
+
if (opts.force) held.count = 0;
|
|
459
|
+
else {
|
|
460
|
+
held.count -= 1;
|
|
461
|
+
if (held.count > 0) return false;
|
|
462
|
+
}
|
|
463
|
+
if (held.releasePromise) {
|
|
464
|
+
await held.releasePromise.catch(() => void 0);
|
|
465
|
+
return true;
|
|
466
|
+
}
|
|
467
|
+
HELD_LOCKS.delete(normalizedSessionFile);
|
|
468
|
+
held.releasePromise = (async () => {
|
|
469
|
+
try {
|
|
470
|
+
await held.handle.close();
|
|
471
|
+
} catch {}
|
|
472
|
+
try {
|
|
473
|
+
await fsp.rm(held.lockPath, { force: true });
|
|
474
|
+
} catch {}
|
|
475
|
+
})();
|
|
476
|
+
try {
|
|
477
|
+
await held.releasePromise;
|
|
478
|
+
return true;
|
|
479
|
+
} finally {
|
|
480
|
+
held.releasePromise = void 0;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Synchronously release all held locks.
|
|
485
|
+
* Used during process exit when async operations aren't reliable.
|
|
486
|
+
*/
|
|
487
|
+
function releaseAllLocksSync() {
|
|
488
|
+
for (const [sessionFile, held] of HELD_LOCKS) {
|
|
489
|
+
try {
|
|
490
|
+
if (typeof held.handle.close === "function") held.handle.close().catch(() => {});
|
|
491
|
+
} catch {}
|
|
492
|
+
try {
|
|
493
|
+
fs.rmSync(held.lockPath, { force: true });
|
|
494
|
+
} catch {}
|
|
495
|
+
HELD_LOCKS.delete(sessionFile);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
async function runLockWatchdogCheck(nowMs = Date.now()) {
|
|
499
|
+
let released = 0;
|
|
500
|
+
for (const [sessionFile, held] of HELD_LOCKS.entries()) {
|
|
501
|
+
const heldForMs = nowMs - held.acquiredAt;
|
|
502
|
+
if (heldForMs <= held.maxHoldMs) continue;
|
|
503
|
+
console.warn(`[session-write-lock] releasing lock held for ${heldForMs}ms (max=${held.maxHoldMs}ms): ${held.lockPath}`);
|
|
504
|
+
if (await releaseHeldLock(sessionFile, held, { force: true })) released += 1;
|
|
505
|
+
}
|
|
506
|
+
return released;
|
|
507
|
+
}
|
|
508
|
+
function ensureWatchdogStarted(intervalMs) {
|
|
509
|
+
const watchdogState = resolveWatchdogState();
|
|
510
|
+
if (watchdogState.started) return;
|
|
511
|
+
watchdogState.started = true;
|
|
512
|
+
watchdogState.intervalMs = intervalMs;
|
|
513
|
+
watchdogState.timer = setInterval(() => {
|
|
514
|
+
runLockWatchdogCheck().catch(() => {});
|
|
515
|
+
}, intervalMs);
|
|
516
|
+
watchdogState.timer.unref?.();
|
|
517
|
+
}
|
|
518
|
+
function handleTerminationSignal(signal) {
|
|
519
|
+
releaseAllLocksSync();
|
|
520
|
+
const cleanupState = resolveCleanupState();
|
|
521
|
+
if (process.listenerCount(signal) === 1) {
|
|
522
|
+
const handler = cleanupState.cleanupHandlers.get(signal);
|
|
523
|
+
if (handler) {
|
|
524
|
+
process.off(signal, handler);
|
|
525
|
+
cleanupState.cleanupHandlers.delete(signal);
|
|
526
|
+
}
|
|
527
|
+
try {
|
|
528
|
+
process.kill(process.pid, signal);
|
|
529
|
+
} catch {}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
function registerCleanupHandlers() {
|
|
533
|
+
const cleanupState = resolveCleanupState();
|
|
534
|
+
if (!cleanupState.registered) {
|
|
535
|
+
cleanupState.registered = true;
|
|
536
|
+
process.on("exit", () => {
|
|
537
|
+
releaseAllLocksSync();
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
ensureWatchdogStarted(DEFAULT_WATCHDOG_INTERVAL_MS);
|
|
541
|
+
for (const signal of CLEANUP_SIGNALS) {
|
|
542
|
+
if (cleanupState.cleanupHandlers.has(signal)) continue;
|
|
543
|
+
try {
|
|
544
|
+
const handler = () => handleTerminationSignal(signal);
|
|
545
|
+
cleanupState.cleanupHandlers.set(signal, handler);
|
|
546
|
+
process.on(signal, handler);
|
|
547
|
+
} catch {}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
async function readLockPayload(lockPath) {
|
|
551
|
+
try {
|
|
552
|
+
const raw = await fsp.readFile(lockPath, "utf8");
|
|
553
|
+
const parsed = JSON.parse(raw);
|
|
554
|
+
const payload = {};
|
|
555
|
+
if (typeof parsed.pid === "number") payload.pid = parsed.pid;
|
|
556
|
+
if (typeof parsed.createdAt === "string") payload.createdAt = parsed.createdAt;
|
|
557
|
+
return payload;
|
|
558
|
+
} catch {
|
|
559
|
+
return null;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
function inspectLockPayload(payload, staleMs, nowMs) {
|
|
563
|
+
const pid = typeof payload?.pid === "number" ? payload.pid : null;
|
|
564
|
+
const pidAlive = pid !== null ? isPidAlive(pid) : false;
|
|
565
|
+
const createdAt = typeof payload?.createdAt === "string" ? payload.createdAt : null;
|
|
566
|
+
const createdAtMs = createdAt ? Date.parse(createdAt) : NaN;
|
|
567
|
+
const ageMs = Number.isFinite(createdAtMs) ? Math.max(0, nowMs - createdAtMs) : null;
|
|
568
|
+
const staleReasons = [];
|
|
569
|
+
if (pid === null) staleReasons.push("missing-pid");
|
|
570
|
+
else if (!pidAlive) staleReasons.push("dead-pid");
|
|
571
|
+
if (ageMs === null) staleReasons.push("invalid-createdAt");
|
|
572
|
+
else if (ageMs > staleMs) staleReasons.push("too-old");
|
|
573
|
+
return {
|
|
574
|
+
pid,
|
|
575
|
+
pidAlive,
|
|
576
|
+
createdAt,
|
|
577
|
+
ageMs,
|
|
578
|
+
stale: staleReasons.length > 0,
|
|
579
|
+
staleReasons
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
function lockInspectionNeedsMtimeStaleFallback(details) {
|
|
583
|
+
return details.stale && details.staleReasons.every((reason) => reason === "missing-pid" || reason === "invalid-createdAt");
|
|
584
|
+
}
|
|
585
|
+
async function shouldReclaimContendedLockFile(lockPath, details, staleMs, nowMs) {
|
|
586
|
+
if (!details.stale) return false;
|
|
587
|
+
if (!lockInspectionNeedsMtimeStaleFallback(details)) return true;
|
|
588
|
+
try {
|
|
589
|
+
const stat = await fsp.stat(lockPath);
|
|
590
|
+
return Math.max(0, nowMs - stat.mtimeMs) > staleMs;
|
|
591
|
+
} catch (error) {
|
|
592
|
+
return error?.code !== "ENOENT";
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
async function cleanStaleLockFiles(params) {
|
|
596
|
+
const sessionsDir = path.resolve(params.sessionsDir);
|
|
597
|
+
const staleMs = resolvePositiveMs(params.staleMs, DEFAULT_STALE_MS);
|
|
598
|
+
const removeStale = params.removeStale !== false;
|
|
599
|
+
const nowMs = params.nowMs ?? Date.now();
|
|
600
|
+
let entries = [];
|
|
601
|
+
try {
|
|
602
|
+
entries = await fsp.readdir(sessionsDir, { withFileTypes: true });
|
|
603
|
+
} catch (err) {
|
|
604
|
+
if (err.code === "ENOENT") return {
|
|
605
|
+
locks: [],
|
|
606
|
+
cleaned: []
|
|
607
|
+
};
|
|
608
|
+
throw err;
|
|
609
|
+
}
|
|
610
|
+
const locks = [];
|
|
611
|
+
const cleaned = [];
|
|
612
|
+
const lockEntries = entries.filter((entry) => entry.name.endsWith(".jsonl.lock")).toSorted((a, b) => a.name.localeCompare(b.name));
|
|
613
|
+
for (const entry of lockEntries) {
|
|
614
|
+
const lockPath = path.join(sessionsDir, entry.name);
|
|
615
|
+
const lockInfo = {
|
|
616
|
+
lockPath,
|
|
617
|
+
...inspectLockPayload(await readLockPayload(lockPath), staleMs, nowMs),
|
|
618
|
+
removed: false
|
|
619
|
+
};
|
|
620
|
+
if (lockInfo.stale && removeStale) {
|
|
621
|
+
await fsp.rm(lockPath, { force: true });
|
|
622
|
+
lockInfo.removed = true;
|
|
623
|
+
cleaned.push(lockInfo);
|
|
624
|
+
params.log?.warn?.(`removed stale session lock: ${lockPath} (${lockInfo.staleReasons.join(", ") || "unknown"})`);
|
|
625
|
+
}
|
|
626
|
+
locks.push(lockInfo);
|
|
627
|
+
}
|
|
628
|
+
return {
|
|
629
|
+
locks,
|
|
630
|
+
cleaned
|
|
631
|
+
};
|
|
632
|
+
}
|
|
633
|
+
async function acquireSessionWriteLock(params) {
|
|
634
|
+
registerCleanupHandlers();
|
|
635
|
+
const timeoutMs = resolvePositiveMs(params.timeoutMs, 1e4, { allowInfinity: true });
|
|
636
|
+
const staleMs = resolvePositiveMs(params.staleMs, DEFAULT_STALE_MS);
|
|
637
|
+
const maxHoldMs = resolvePositiveMs(params.maxHoldMs, DEFAULT_MAX_HOLD_MS);
|
|
638
|
+
const sessionFile = path.resolve(params.sessionFile);
|
|
639
|
+
const sessionDir = path.dirname(sessionFile);
|
|
640
|
+
await fsp.mkdir(sessionDir, { recursive: true });
|
|
641
|
+
let normalizedDir = sessionDir;
|
|
642
|
+
try {
|
|
643
|
+
normalizedDir = await fsp.realpath(sessionDir);
|
|
644
|
+
} catch {}
|
|
645
|
+
const normalizedSessionFile = path.join(normalizedDir, path.basename(sessionFile));
|
|
646
|
+
const lockPath = `${normalizedSessionFile}.lock`;
|
|
647
|
+
const allowReentrant = params.allowReentrant ?? true;
|
|
648
|
+
const held = HELD_LOCKS.get(normalizedSessionFile);
|
|
649
|
+
if (allowReentrant && held) {
|
|
650
|
+
held.count += 1;
|
|
651
|
+
return { release: async () => {
|
|
652
|
+
await releaseHeldLock(normalizedSessionFile, held);
|
|
653
|
+
} };
|
|
654
|
+
}
|
|
655
|
+
const startedAt = Date.now();
|
|
656
|
+
let attempt = 0;
|
|
657
|
+
while (Date.now() - startedAt < timeoutMs) {
|
|
658
|
+
attempt += 1;
|
|
659
|
+
let handle = null;
|
|
660
|
+
try {
|
|
661
|
+
handle = await fsp.open(lockPath, "wx");
|
|
662
|
+
const createdAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
663
|
+
await handle.writeFile(JSON.stringify({
|
|
664
|
+
pid: process.pid,
|
|
665
|
+
createdAt
|
|
666
|
+
}, null, 2), "utf8");
|
|
667
|
+
const createdHeld = {
|
|
668
|
+
count: 1,
|
|
669
|
+
handle,
|
|
670
|
+
lockPath,
|
|
671
|
+
acquiredAt: Date.now(),
|
|
672
|
+
maxHoldMs
|
|
673
|
+
};
|
|
674
|
+
HELD_LOCKS.set(normalizedSessionFile, createdHeld);
|
|
675
|
+
return { release: async () => {
|
|
676
|
+
await releaseHeldLock(normalizedSessionFile, createdHeld);
|
|
677
|
+
} };
|
|
678
|
+
} catch (err) {
|
|
679
|
+
if (handle) {
|
|
680
|
+
try {
|
|
681
|
+
await handle.close();
|
|
682
|
+
} catch {}
|
|
683
|
+
try {
|
|
684
|
+
await fsp.rm(lockPath, { force: true });
|
|
685
|
+
} catch {}
|
|
686
|
+
}
|
|
687
|
+
if (err.code !== "EEXIST") throw err;
|
|
688
|
+
const payload = await readLockPayload(lockPath);
|
|
689
|
+
const nowMs = Date.now();
|
|
690
|
+
if (await shouldReclaimContendedLockFile(lockPath, inspectLockPayload(payload, staleMs, nowMs), staleMs, nowMs)) {
|
|
691
|
+
await fsp.rm(lockPath, { force: true });
|
|
692
|
+
continue;
|
|
693
|
+
}
|
|
694
|
+
const delay = Math.min(1e3, 50 * attempt);
|
|
695
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
const payload = await readLockPayload(lockPath);
|
|
699
|
+
const owner = typeof payload?.pid === "number" ? `pid=${payload.pid}` : "unknown";
|
|
700
|
+
throw new Error(`session file locked (timeout ${timeoutMs}ms): ${owner} ${lockPath}`);
|
|
701
|
+
}
|
|
702
|
+
const __testing = {
|
|
703
|
+
cleanupSignals: [...CLEANUP_SIGNALS],
|
|
704
|
+
handleTerminationSignal,
|
|
705
|
+
releaseAllLocksSync,
|
|
706
|
+
runLockWatchdogCheck
|
|
707
|
+
};
|
|
708
|
+
|
|
709
|
+
//#endregion
|
|
710
|
+
//#region src/utils/directive-tags.ts
|
|
711
|
+
const AUDIO_TAG_RE = /\[\[\s*audio_as_voice\s*\]\]/gi;
|
|
712
|
+
const REPLY_TAG_RE = /\[\[\s*(?:reply_to_current|reply_to\s*:\s*([^\]\n]+))\s*\]\]/gi;
|
|
713
|
+
function normalizeDirectiveWhitespace(text) {
|
|
714
|
+
return text.replace(/[ \t]+/g, " ").replace(/[ \t]*\n[ \t]*/g, "\n").trim();
|
|
715
|
+
}
|
|
716
|
+
function stripInlineDirectiveTagsForDisplay(text) {
|
|
717
|
+
if (!text) return {
|
|
718
|
+
text,
|
|
719
|
+
changed: false
|
|
720
|
+
};
|
|
721
|
+
const stripped = text.replace(AUDIO_TAG_RE, "").replace(REPLY_TAG_RE, "");
|
|
722
|
+
return {
|
|
723
|
+
text: stripped,
|
|
724
|
+
changed: stripped !== text
|
|
725
|
+
};
|
|
726
|
+
}
|
|
727
|
+
function isMessageTextPart(part) {
|
|
728
|
+
return Boolean(part) && part?.type === "text" && typeof part.text === "string";
|
|
729
|
+
}
|
|
730
|
+
/**
|
|
731
|
+
* Strips inline directive tags from message text blocks while preserving message shape.
|
|
732
|
+
* Empty post-strip text stays empty-string to preserve caller semantics.
|
|
733
|
+
*/
|
|
734
|
+
function stripInlineDirectiveTagsFromMessageForDisplay(message) {
|
|
735
|
+
if (!message) return message;
|
|
736
|
+
if (!Array.isArray(message.content)) return message;
|
|
737
|
+
const cleaned = message.content.map((part) => {
|
|
738
|
+
if (!part || typeof part !== "object") return part;
|
|
739
|
+
const record = part;
|
|
740
|
+
if (!isMessageTextPart(record)) return part;
|
|
741
|
+
return {
|
|
742
|
+
...record,
|
|
743
|
+
text: stripInlineDirectiveTagsForDisplay(record.text).text
|
|
744
|
+
};
|
|
745
|
+
});
|
|
746
|
+
return {
|
|
747
|
+
...message,
|
|
748
|
+
content: cleaned
|
|
749
|
+
};
|
|
750
|
+
}
|
|
751
|
+
function parseInlineDirectives(text, options = {}) {
|
|
752
|
+
const { currentMessageId, stripAudioTag = true, stripReplyTags = true } = options;
|
|
753
|
+
if (!text) return {
|
|
754
|
+
text: "",
|
|
755
|
+
audioAsVoice: false,
|
|
756
|
+
replyToCurrent: false,
|
|
757
|
+
hasAudioTag: false,
|
|
758
|
+
hasReplyTag: false
|
|
759
|
+
};
|
|
760
|
+
let cleaned = text;
|
|
761
|
+
let audioAsVoice = false;
|
|
762
|
+
let hasAudioTag = false;
|
|
763
|
+
let hasReplyTag = false;
|
|
764
|
+
let sawCurrent = false;
|
|
765
|
+
let lastExplicitId;
|
|
766
|
+
cleaned = cleaned.replace(AUDIO_TAG_RE, (match) => {
|
|
767
|
+
audioAsVoice = true;
|
|
768
|
+
hasAudioTag = true;
|
|
769
|
+
return stripAudioTag ? " " : match;
|
|
770
|
+
});
|
|
771
|
+
cleaned = cleaned.replace(REPLY_TAG_RE, (match, idRaw) => {
|
|
772
|
+
hasReplyTag = true;
|
|
773
|
+
if (idRaw === void 0) sawCurrent = true;
|
|
774
|
+
else {
|
|
775
|
+
const id = idRaw.trim();
|
|
776
|
+
if (id) lastExplicitId = id;
|
|
777
|
+
}
|
|
778
|
+
return stripReplyTags ? " " : match;
|
|
779
|
+
});
|
|
780
|
+
cleaned = normalizeDirectiveWhitespace(cleaned);
|
|
781
|
+
const replyToId = lastExplicitId ?? (sawCurrent ? currentMessageId?.trim() || void 0 : void 0);
|
|
782
|
+
return {
|
|
783
|
+
text: cleaned,
|
|
784
|
+
audioAsVoice,
|
|
785
|
+
replyToId,
|
|
786
|
+
replyToExplicitId: lastExplicitId,
|
|
787
|
+
replyToCurrent: sawCurrent,
|
|
788
|
+
hasAudioTag,
|
|
789
|
+
hasReplyTag
|
|
790
|
+
};
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
//#endregion
|
|
794
|
+
//#region src/gateway/chat-sanitize.ts
|
|
795
|
+
function stripEnvelopeFromContentWithRole(content, stripUserEnvelope) {
|
|
796
|
+
let changed = false;
|
|
797
|
+
return {
|
|
798
|
+
content: content.map((item) => {
|
|
799
|
+
if (!item || typeof item !== "object") return item;
|
|
800
|
+
const entry = item;
|
|
801
|
+
if (entry.type !== "text" || typeof entry.text !== "string") return item;
|
|
802
|
+
const inboundStripped = stripInboundMetadata(entry.text);
|
|
803
|
+
const stripped = stripUserEnvelope ? stripMessageIdHints(stripEnvelope(inboundStripped)) : inboundStripped;
|
|
804
|
+
if (stripped === entry.text) return item;
|
|
805
|
+
changed = true;
|
|
806
|
+
return {
|
|
807
|
+
...entry,
|
|
808
|
+
text: stripped
|
|
809
|
+
};
|
|
810
|
+
}),
|
|
811
|
+
changed
|
|
812
|
+
};
|
|
813
|
+
}
|
|
814
|
+
function stripEnvelopeFromMessage(message) {
|
|
815
|
+
if (!message || typeof message !== "object") return message;
|
|
816
|
+
const entry = message;
|
|
817
|
+
const stripUserEnvelope = (typeof entry.role === "string" ? entry.role.toLowerCase() : "") === "user";
|
|
818
|
+
let changed = false;
|
|
819
|
+
const next = { ...entry };
|
|
820
|
+
if (typeof entry.content === "string") {
|
|
821
|
+
const inboundStripped = stripInboundMetadata(entry.content);
|
|
822
|
+
const stripped = stripUserEnvelope ? stripMessageIdHints(stripEnvelope(inboundStripped)) : inboundStripped;
|
|
823
|
+
if (stripped !== entry.content) {
|
|
824
|
+
next.content = stripped;
|
|
825
|
+
changed = true;
|
|
826
|
+
}
|
|
827
|
+
} else if (Array.isArray(entry.content)) {
|
|
828
|
+
const updated = stripEnvelopeFromContentWithRole(entry.content, stripUserEnvelope);
|
|
829
|
+
if (updated.changed) {
|
|
830
|
+
next.content = updated.content;
|
|
831
|
+
changed = true;
|
|
832
|
+
}
|
|
833
|
+
} else if (typeof entry.text === "string") {
|
|
834
|
+
const inboundStripped = stripInboundMetadata(entry.text);
|
|
835
|
+
const stripped = stripUserEnvelope ? stripMessageIdHints(stripEnvelope(inboundStripped)) : inboundStripped;
|
|
836
|
+
if (stripped !== entry.text) {
|
|
837
|
+
next.text = stripped;
|
|
838
|
+
changed = true;
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
return changed ? next : message;
|
|
842
|
+
}
|
|
843
|
+
function stripEnvelopeFromMessages(messages) {
|
|
844
|
+
if (messages.length === 0) return messages;
|
|
845
|
+
let changed = false;
|
|
846
|
+
const next = messages.map((message) => {
|
|
847
|
+
const stripped = stripEnvelopeFromMessage(message);
|
|
848
|
+
if (stripped !== message) changed = true;
|
|
849
|
+
return stripped;
|
|
850
|
+
});
|
|
851
|
+
return changed ? next : messages;
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
//#endregion
|
|
855
|
+
//#region src/gateway/session-utils.fs.ts
|
|
856
|
+
const sessionTitleFieldsCache = /* @__PURE__ */ new Map();
|
|
857
|
+
const MAX_SESSION_TITLE_FIELDS_CACHE_ENTRIES = 5e3;
|
|
858
|
+
function readSessionTitleFieldsCacheKey(filePath, opts) {
|
|
859
|
+
return `${filePath}\t${opts?.includeInterSession === true ? "1" : "0"}`;
|
|
860
|
+
}
|
|
861
|
+
function getCachedSessionTitleFields(cacheKey, stat) {
|
|
862
|
+
const cached = sessionTitleFieldsCache.get(cacheKey);
|
|
863
|
+
if (!cached) return null;
|
|
864
|
+
if (cached.mtimeMs !== stat.mtimeMs || cached.size !== stat.size) {
|
|
865
|
+
sessionTitleFieldsCache.delete(cacheKey);
|
|
866
|
+
return null;
|
|
867
|
+
}
|
|
868
|
+
sessionTitleFieldsCache.delete(cacheKey);
|
|
869
|
+
sessionTitleFieldsCache.set(cacheKey, cached);
|
|
870
|
+
return {
|
|
871
|
+
firstUserMessage: cached.firstUserMessage,
|
|
872
|
+
lastMessagePreview: cached.lastMessagePreview
|
|
873
|
+
};
|
|
874
|
+
}
|
|
875
|
+
function setCachedSessionTitleFields(cacheKey, stat, value) {
|
|
876
|
+
sessionTitleFieldsCache.set(cacheKey, {
|
|
877
|
+
...value,
|
|
878
|
+
mtimeMs: stat.mtimeMs,
|
|
879
|
+
size: stat.size
|
|
880
|
+
});
|
|
881
|
+
while (sessionTitleFieldsCache.size > MAX_SESSION_TITLE_FIELDS_CACHE_ENTRIES) {
|
|
882
|
+
const oldestKey = sessionTitleFieldsCache.keys().next().value;
|
|
883
|
+
if (typeof oldestKey !== "string" || !oldestKey) break;
|
|
884
|
+
sessionTitleFieldsCache.delete(oldestKey);
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
function readSessionMessages(sessionId, storePath, sessionFile) {
|
|
888
|
+
const filePath = resolveSessionTranscriptCandidates(sessionId, storePath, sessionFile).find((p) => fs.existsSync(p));
|
|
889
|
+
if (!filePath) return [];
|
|
890
|
+
const lines = fs.readFileSync(filePath, "utf-8").split(/\r?\n/);
|
|
891
|
+
const messages = [];
|
|
892
|
+
for (const line of lines) {
|
|
893
|
+
if (!line.trim()) continue;
|
|
894
|
+
try {
|
|
895
|
+
const parsed = JSON.parse(line);
|
|
896
|
+
if (parsed?.message) {
|
|
897
|
+
messages.push(parsed.message);
|
|
898
|
+
continue;
|
|
899
|
+
}
|
|
900
|
+
if (parsed?.type === "compaction") {
|
|
901
|
+
const ts = typeof parsed.timestamp === "string" ? Date.parse(parsed.timestamp) : NaN;
|
|
902
|
+
const timestamp = Number.isFinite(ts) ? ts : Date.now();
|
|
903
|
+
messages.push({
|
|
904
|
+
role: "system",
|
|
905
|
+
content: [{
|
|
906
|
+
type: "text",
|
|
907
|
+
text: "Compaction"
|
|
908
|
+
}],
|
|
909
|
+
timestamp,
|
|
910
|
+
__remoteclaw: {
|
|
911
|
+
kind: "compaction",
|
|
912
|
+
id: typeof parsed.id === "string" ? parsed.id : void 0
|
|
913
|
+
}
|
|
914
|
+
});
|
|
915
|
+
}
|
|
916
|
+
} catch {}
|
|
917
|
+
}
|
|
918
|
+
return messages;
|
|
919
|
+
}
|
|
920
|
+
function resolveSessionTranscriptCandidates(sessionId, storePath, sessionFile, agentId) {
|
|
921
|
+
const candidates = [];
|
|
922
|
+
const pushCandidate = (resolve) => {
|
|
923
|
+
try {
|
|
924
|
+
candidates.push(resolve());
|
|
925
|
+
} catch {}
|
|
926
|
+
};
|
|
927
|
+
if (storePath) {
|
|
928
|
+
const sessionsDir = path.dirname(storePath);
|
|
929
|
+
if (sessionFile) pushCandidate(() => resolveSessionFilePath(sessionId, { sessionFile }, {
|
|
930
|
+
sessionsDir,
|
|
931
|
+
agentId
|
|
932
|
+
}));
|
|
933
|
+
pushCandidate(() => resolveSessionTranscriptPathInDir(sessionId, sessionsDir));
|
|
934
|
+
} else if (sessionFile) if (agentId) pushCandidate(() => resolveSessionFilePath(sessionId, { sessionFile }, { agentId }));
|
|
935
|
+
else {
|
|
936
|
+
const trimmed = sessionFile.trim();
|
|
937
|
+
if (trimmed) candidates.push(path.resolve(trimmed));
|
|
938
|
+
}
|
|
939
|
+
if (agentId) pushCandidate(() => resolveSessionTranscriptPath(sessionId, agentId));
|
|
940
|
+
const home = resolveRequiredHomeDir(process.env, os.homedir);
|
|
941
|
+
const legacyDir = path.join(home, ".remoteclaw", "sessions");
|
|
942
|
+
pushCandidate(() => resolveSessionTranscriptPathInDir(sessionId, legacyDir));
|
|
943
|
+
return Array.from(new Set(candidates));
|
|
944
|
+
}
|
|
945
|
+
function canonicalizePathForComparison$1(filePath) {
|
|
946
|
+
const resolved = path.resolve(filePath);
|
|
947
|
+
try {
|
|
948
|
+
return fs.realpathSync(resolved);
|
|
949
|
+
} catch {
|
|
950
|
+
return resolved;
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
function archiveFileOnDisk(filePath, reason) {
|
|
954
|
+
const archived = `${filePath}.${reason}.${formatSessionArchiveTimestamp()}`;
|
|
955
|
+
fs.renameSync(filePath, archived);
|
|
956
|
+
return archived;
|
|
957
|
+
}
|
|
958
|
+
/**
|
|
959
|
+
* Archives all transcript files for a given session.
|
|
960
|
+
* Best-effort: silently skips files that don't exist or fail to rename.
|
|
961
|
+
*/
|
|
962
|
+
function archiveSessionTranscripts(opts) {
|
|
963
|
+
const archived = [];
|
|
964
|
+
const storeDir = opts.restrictToStoreDir && opts.storePath ? canonicalizePathForComparison$1(path.dirname(opts.storePath)) : null;
|
|
965
|
+
for (const candidate of resolveSessionTranscriptCandidates(opts.sessionId, opts.storePath, opts.sessionFile, opts.agentId)) {
|
|
966
|
+
const candidatePath = canonicalizePathForComparison$1(candidate);
|
|
967
|
+
if (storeDir) {
|
|
968
|
+
const relative = path.relative(storeDir, candidatePath);
|
|
969
|
+
if (!relative || relative.startsWith("..") || path.isAbsolute(relative)) continue;
|
|
970
|
+
}
|
|
971
|
+
if (!fs.existsSync(candidatePath)) continue;
|
|
972
|
+
try {
|
|
973
|
+
archived.push(archiveFileOnDisk(candidatePath, opts.reason));
|
|
974
|
+
} catch {}
|
|
975
|
+
}
|
|
976
|
+
return archived;
|
|
977
|
+
}
|
|
978
|
+
async function cleanupArchivedSessionTranscripts(opts) {
|
|
979
|
+
if (!Number.isFinite(opts.olderThanMs) || opts.olderThanMs < 0) return {
|
|
980
|
+
removed: 0,
|
|
981
|
+
scanned: 0
|
|
982
|
+
};
|
|
983
|
+
const now = opts.nowMs ?? Date.now();
|
|
984
|
+
const reason = opts.reason ?? "deleted";
|
|
985
|
+
const directories = Array.from(new Set(opts.directories.map((dir) => path.resolve(dir))));
|
|
986
|
+
let removed = 0;
|
|
987
|
+
let scanned = 0;
|
|
988
|
+
for (const dir of directories) {
|
|
989
|
+
const entries = await fs.promises.readdir(dir).catch(() => []);
|
|
990
|
+
for (const entry of entries) {
|
|
991
|
+
const timestamp = parseSessionArchiveTimestamp(entry, reason);
|
|
992
|
+
if (timestamp == null) continue;
|
|
993
|
+
scanned += 1;
|
|
994
|
+
if (now - timestamp <= opts.olderThanMs) continue;
|
|
995
|
+
const fullPath = path.join(dir, entry);
|
|
996
|
+
if (!(await fs.promises.stat(fullPath).catch(() => null))?.isFile()) continue;
|
|
997
|
+
await fs.promises.rm(fullPath).catch(() => void 0);
|
|
998
|
+
removed += 1;
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
return {
|
|
1002
|
+
removed,
|
|
1003
|
+
scanned
|
|
1004
|
+
};
|
|
1005
|
+
}
|
|
1006
|
+
function jsonUtf8Bytes(value) {
|
|
1007
|
+
try {
|
|
1008
|
+
return Buffer.byteLength(JSON.stringify(value), "utf8");
|
|
1009
|
+
} catch {
|
|
1010
|
+
return Buffer.byteLength(String(value), "utf8");
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
function capArrayByJsonBytes(items, maxBytes) {
|
|
1014
|
+
if (items.length === 0) return {
|
|
1015
|
+
items,
|
|
1016
|
+
bytes: 2
|
|
1017
|
+
};
|
|
1018
|
+
const parts = items.map((item) => jsonUtf8Bytes(item));
|
|
1019
|
+
let bytes = 2 + parts.reduce((a, b) => a + b, 0) + (items.length - 1);
|
|
1020
|
+
let start = 0;
|
|
1021
|
+
while (bytes > maxBytes && start < items.length - 1) {
|
|
1022
|
+
bytes -= parts[start] + 1;
|
|
1023
|
+
start += 1;
|
|
1024
|
+
}
|
|
1025
|
+
return {
|
|
1026
|
+
items: start > 0 ? items.slice(start) : items,
|
|
1027
|
+
bytes
|
|
1028
|
+
};
|
|
1029
|
+
}
|
|
1030
|
+
const MAX_LINES_TO_SCAN = 10;
|
|
1031
|
+
function readSessionTitleFieldsFromTranscript(sessionId, storePath, sessionFile, agentId, opts) {
|
|
1032
|
+
const filePath = resolveSessionTranscriptCandidates(sessionId, storePath, sessionFile, agentId).find((p) => fs.existsSync(p));
|
|
1033
|
+
if (!filePath) return {
|
|
1034
|
+
firstUserMessage: null,
|
|
1035
|
+
lastMessagePreview: null
|
|
1036
|
+
};
|
|
1037
|
+
let stat;
|
|
1038
|
+
try {
|
|
1039
|
+
stat = fs.statSync(filePath);
|
|
1040
|
+
} catch {
|
|
1041
|
+
return {
|
|
1042
|
+
firstUserMessage: null,
|
|
1043
|
+
lastMessagePreview: null
|
|
1044
|
+
};
|
|
1045
|
+
}
|
|
1046
|
+
const cacheKey = readSessionTitleFieldsCacheKey(filePath, opts);
|
|
1047
|
+
const cached = getCachedSessionTitleFields(cacheKey, stat);
|
|
1048
|
+
if (cached) return cached;
|
|
1049
|
+
if (stat.size === 0) {
|
|
1050
|
+
const empty = {
|
|
1051
|
+
firstUserMessage: null,
|
|
1052
|
+
lastMessagePreview: null
|
|
1053
|
+
};
|
|
1054
|
+
setCachedSessionTitleFields(cacheKey, stat, empty);
|
|
1055
|
+
return empty;
|
|
1056
|
+
}
|
|
1057
|
+
let fd = null;
|
|
1058
|
+
try {
|
|
1059
|
+
fd = fs.openSync(filePath, "r");
|
|
1060
|
+
const size = stat.size;
|
|
1061
|
+
let firstUserMessage = null;
|
|
1062
|
+
try {
|
|
1063
|
+
const chunk = readTranscriptHeadChunk(fd);
|
|
1064
|
+
if (chunk) firstUserMessage = extractFirstUserMessageFromTranscriptChunk(chunk, opts);
|
|
1065
|
+
} catch {}
|
|
1066
|
+
let lastMessagePreview = null;
|
|
1067
|
+
try {
|
|
1068
|
+
lastMessagePreview = readLastMessagePreviewFromOpenTranscript({
|
|
1069
|
+
fd,
|
|
1070
|
+
size
|
|
1071
|
+
});
|
|
1072
|
+
} catch {}
|
|
1073
|
+
const result = {
|
|
1074
|
+
firstUserMessage,
|
|
1075
|
+
lastMessagePreview
|
|
1076
|
+
};
|
|
1077
|
+
setCachedSessionTitleFields(cacheKey, stat, result);
|
|
1078
|
+
return result;
|
|
1079
|
+
} catch {
|
|
1080
|
+
return {
|
|
1081
|
+
firstUserMessage: null,
|
|
1082
|
+
lastMessagePreview: null
|
|
1083
|
+
};
|
|
1084
|
+
} finally {
|
|
1085
|
+
if (fd !== null) try {
|
|
1086
|
+
fs.closeSync(fd);
|
|
1087
|
+
} catch {}
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
function extractTextFromContent(content) {
|
|
1091
|
+
if (typeof content === "string") return stripInlineDirectiveTagsForDisplay(content).text.trim() || null;
|
|
1092
|
+
if (!Array.isArray(content)) return null;
|
|
1093
|
+
for (const part of content) {
|
|
1094
|
+
if (!part || typeof part.text !== "string") continue;
|
|
1095
|
+
if (part.type === "text" || part.type === "output_text" || part.type === "input_text") {
|
|
1096
|
+
const normalized = stripInlineDirectiveTagsForDisplay(part.text).text.trim();
|
|
1097
|
+
if (normalized) return normalized;
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1100
|
+
return null;
|
|
1101
|
+
}
|
|
1102
|
+
function readTranscriptHeadChunk(fd, maxBytes = 8192) {
|
|
1103
|
+
const buf = Buffer.alloc(maxBytes);
|
|
1104
|
+
const bytesRead = fs.readSync(fd, buf, 0, buf.length, 0);
|
|
1105
|
+
if (bytesRead <= 0) return null;
|
|
1106
|
+
return buf.toString("utf-8", 0, bytesRead);
|
|
1107
|
+
}
|
|
1108
|
+
function extractFirstUserMessageFromTranscriptChunk(chunk, opts) {
|
|
1109
|
+
const lines = chunk.split(/\r?\n/).slice(0, MAX_LINES_TO_SCAN);
|
|
1110
|
+
for (const line of lines) {
|
|
1111
|
+
if (!line.trim()) continue;
|
|
1112
|
+
try {
|
|
1113
|
+
const msg = JSON.parse(line)?.message;
|
|
1114
|
+
if (msg?.role !== "user") continue;
|
|
1115
|
+
if (opts?.includeInterSession !== true && hasInterSessionUserProvenance(msg)) continue;
|
|
1116
|
+
const text = extractTextFromContent(msg.content);
|
|
1117
|
+
if (text) return text;
|
|
1118
|
+
} catch {}
|
|
1119
|
+
}
|
|
1120
|
+
return null;
|
|
1121
|
+
}
|
|
1122
|
+
const LAST_MSG_MAX_BYTES = 16384;
|
|
1123
|
+
const LAST_MSG_MAX_LINES = 20;
|
|
1124
|
+
function readLastMessagePreviewFromOpenTranscript(params) {
|
|
1125
|
+
const readStart = Math.max(0, params.size - LAST_MSG_MAX_BYTES);
|
|
1126
|
+
const readLen = Math.min(params.size, LAST_MSG_MAX_BYTES);
|
|
1127
|
+
const buf = Buffer.alloc(readLen);
|
|
1128
|
+
fs.readSync(params.fd, buf, 0, readLen, readStart);
|
|
1129
|
+
const tailLines = buf.toString("utf-8").split(/\r?\n/).filter((l) => l.trim()).slice(-LAST_MSG_MAX_LINES);
|
|
1130
|
+
for (let i = tailLines.length - 1; i >= 0; i--) {
|
|
1131
|
+
const line = tailLines[i];
|
|
1132
|
+
try {
|
|
1133
|
+
const msg = JSON.parse(line)?.message;
|
|
1134
|
+
if (msg?.role !== "user" && msg?.role !== "assistant") continue;
|
|
1135
|
+
const text = extractTextFromContent(msg.content);
|
|
1136
|
+
if (text) return text;
|
|
1137
|
+
} catch {}
|
|
1138
|
+
}
|
|
1139
|
+
return null;
|
|
1140
|
+
}
|
|
1141
|
+
const PREVIEW_READ_SIZES = [
|
|
1142
|
+
64 * 1024,
|
|
1143
|
+
256 * 1024,
|
|
1144
|
+
1024 * 1024
|
|
1145
|
+
];
|
|
1146
|
+
const PREVIEW_MAX_LINES = 200;
|
|
1147
|
+
function normalizeRole(role, isTool) {
|
|
1148
|
+
if (isTool) return "tool";
|
|
1149
|
+
switch ((role ?? "").toLowerCase()) {
|
|
1150
|
+
case "user": return "user";
|
|
1151
|
+
case "assistant": return "assistant";
|
|
1152
|
+
case "system": return "system";
|
|
1153
|
+
case "tool": return "tool";
|
|
1154
|
+
default: return "other";
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
function truncatePreviewText(text, maxChars) {
|
|
1158
|
+
if (maxChars <= 0 || text.length <= maxChars) return text;
|
|
1159
|
+
if (maxChars <= 3) return text.slice(0, maxChars);
|
|
1160
|
+
return `${text.slice(0, maxChars - 3)}...`;
|
|
1161
|
+
}
|
|
1162
|
+
function extractPreviewText(message) {
|
|
1163
|
+
if (typeof message.content === "string") {
|
|
1164
|
+
const normalized = stripInlineDirectiveTagsForDisplay(message.content).text.trim();
|
|
1165
|
+
return normalized ? normalized : null;
|
|
1166
|
+
}
|
|
1167
|
+
if (Array.isArray(message.content)) {
|
|
1168
|
+
const parts = message.content.map((entry) => typeof entry?.text === "string" ? stripInlineDirectiveTagsForDisplay(entry.text).text : "").filter((text) => text.trim().length > 0);
|
|
1169
|
+
if (parts.length > 0) return parts.join("\n").trim();
|
|
1170
|
+
}
|
|
1171
|
+
if (typeof message.text === "string") {
|
|
1172
|
+
const normalized = stripInlineDirectiveTagsForDisplay(message.text).text.trim();
|
|
1173
|
+
return normalized ? normalized : null;
|
|
1174
|
+
}
|
|
1175
|
+
return null;
|
|
1176
|
+
}
|
|
1177
|
+
function isToolCall(message) {
|
|
1178
|
+
return hasToolCall(message);
|
|
1179
|
+
}
|
|
1180
|
+
function extractToolNames(message) {
|
|
1181
|
+
return extractToolCallNames(message);
|
|
1182
|
+
}
|
|
1183
|
+
function extractMediaSummary(message) {
|
|
1184
|
+
if (!Array.isArray(message.content)) return null;
|
|
1185
|
+
for (const entry of message.content) {
|
|
1186
|
+
const raw = typeof entry?.type === "string" ? entry.type.trim().toLowerCase() : "";
|
|
1187
|
+
if (!raw || raw === "text" || raw === "toolcall" || raw === "tool_call") continue;
|
|
1188
|
+
return `[${raw}]`;
|
|
1189
|
+
}
|
|
1190
|
+
return null;
|
|
1191
|
+
}
|
|
1192
|
+
function buildPreviewItems(messages, maxItems, maxChars) {
|
|
1193
|
+
const items = [];
|
|
1194
|
+
for (const message of messages) {
|
|
1195
|
+
const toolCall = isToolCall(message);
|
|
1196
|
+
const role = normalizeRole(message.role, toolCall);
|
|
1197
|
+
let text = extractPreviewText(message);
|
|
1198
|
+
if (!text) {
|
|
1199
|
+
const toolNames = extractToolNames(message);
|
|
1200
|
+
if (toolNames.length > 0) {
|
|
1201
|
+
const shown = toolNames.slice(0, 2);
|
|
1202
|
+
const overflow = toolNames.length - shown.length;
|
|
1203
|
+
text = `call ${shown.join(", ")}`;
|
|
1204
|
+
if (overflow > 0) text += ` +${overflow}`;
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
if (!text) text = extractMediaSummary(message);
|
|
1208
|
+
if (!text) continue;
|
|
1209
|
+
let trimmed = text.trim();
|
|
1210
|
+
if (!trimmed) continue;
|
|
1211
|
+
if (role === "user") trimmed = stripEnvelope(trimmed);
|
|
1212
|
+
trimmed = truncatePreviewText(trimmed, maxChars);
|
|
1213
|
+
items.push({
|
|
1214
|
+
role,
|
|
1215
|
+
text: trimmed
|
|
1216
|
+
});
|
|
1217
|
+
}
|
|
1218
|
+
if (items.length <= maxItems) return items;
|
|
1219
|
+
return items.slice(-maxItems);
|
|
1220
|
+
}
|
|
1221
|
+
function readRecentMessagesFromTranscript(filePath, maxMessages, readBytes) {
|
|
1222
|
+
let fd = null;
|
|
1223
|
+
try {
|
|
1224
|
+
fd = fs.openSync(filePath, "r");
|
|
1225
|
+
const size = fs.fstatSync(fd).size;
|
|
1226
|
+
if (size === 0) return [];
|
|
1227
|
+
const readStart = Math.max(0, size - readBytes);
|
|
1228
|
+
const readLen = Math.min(size, readBytes);
|
|
1229
|
+
const buf = Buffer.alloc(readLen);
|
|
1230
|
+
fs.readSync(fd, buf, 0, readLen, readStart);
|
|
1231
|
+
const tailLines = buf.toString("utf-8").split(/\r?\n/).filter((l) => l.trim()).slice(-PREVIEW_MAX_LINES);
|
|
1232
|
+
const collected = [];
|
|
1233
|
+
for (let i = tailLines.length - 1; i >= 0; i--) {
|
|
1234
|
+
const line = tailLines[i];
|
|
1235
|
+
try {
|
|
1236
|
+
const msg = JSON.parse(line)?.message;
|
|
1237
|
+
if (msg && typeof msg === "object") {
|
|
1238
|
+
collected.push(msg);
|
|
1239
|
+
if (collected.length >= maxMessages) break;
|
|
1240
|
+
}
|
|
1241
|
+
} catch {}
|
|
1242
|
+
}
|
|
1243
|
+
return collected.toReversed();
|
|
1244
|
+
} catch {
|
|
1245
|
+
return [];
|
|
1246
|
+
} finally {
|
|
1247
|
+
if (fd !== null) fs.closeSync(fd);
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
function readSessionPreviewItemsFromTranscript(sessionId, storePath, sessionFile, agentId, maxItems, maxChars) {
|
|
1251
|
+
const filePath = resolveSessionTranscriptCandidates(sessionId, storePath, sessionFile, agentId).find((p) => fs.existsSync(p));
|
|
1252
|
+
if (!filePath) return [];
|
|
1253
|
+
const boundedItems = Math.max(1, Math.min(maxItems, 50));
|
|
1254
|
+
const boundedChars = Math.max(20, Math.min(maxChars, 2e3));
|
|
1255
|
+
for (const readSize of PREVIEW_READ_SIZES) {
|
|
1256
|
+
const messages = readRecentMessagesFromTranscript(filePath, boundedItems, readSize);
|
|
1257
|
+
if (messages.length > 0 || readSize === PREVIEW_READ_SIZES[PREVIEW_READ_SIZES.length - 1]) return buildPreviewItems(messages, boundedItems, boundedChars);
|
|
1258
|
+
}
|
|
1259
|
+
return [];
|
|
1260
|
+
}
|
|
1261
|
+
|
|
1262
|
+
//#endregion
|
|
1263
|
+
//#region src/utils/account-id.ts
|
|
1264
|
+
function normalizeAccountId(value) {
|
|
1265
|
+
return normalizeOptionalAccountId(value);
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
//#endregion
|
|
1269
|
+
//#region src/utils/delivery-context.ts
|
|
1270
|
+
function normalizeDeliveryContext(context) {
|
|
1271
|
+
if (!context) return;
|
|
1272
|
+
const channel = typeof context.channel === "string" ? normalizeMessageChannel(context.channel) ?? context.channel.trim() : void 0;
|
|
1273
|
+
const to = typeof context.to === "string" ? context.to.trim() : void 0;
|
|
1274
|
+
const accountId = normalizeAccountId(context.accountId);
|
|
1275
|
+
const threadId = typeof context.threadId === "number" && Number.isFinite(context.threadId) ? Math.trunc(context.threadId) : typeof context.threadId === "string" ? context.threadId.trim() : void 0;
|
|
1276
|
+
const normalizedThreadId = typeof threadId === "string" ? threadId ? threadId : void 0 : threadId;
|
|
1277
|
+
if (!channel && !to && !accountId && normalizedThreadId == null) return;
|
|
1278
|
+
const normalized = {
|
|
1279
|
+
channel: channel || void 0,
|
|
1280
|
+
to: to || void 0,
|
|
1281
|
+
accountId
|
|
1282
|
+
};
|
|
1283
|
+
if (normalizedThreadId != null) normalized.threadId = normalizedThreadId;
|
|
1284
|
+
return normalized;
|
|
1285
|
+
}
|
|
1286
|
+
function normalizeSessionDeliveryFields(source) {
|
|
1287
|
+
if (!source) return {
|
|
1288
|
+
deliveryContext: void 0,
|
|
1289
|
+
lastChannel: void 0,
|
|
1290
|
+
lastTo: void 0,
|
|
1291
|
+
lastAccountId: void 0,
|
|
1292
|
+
lastThreadId: void 0
|
|
1293
|
+
};
|
|
1294
|
+
const merged = mergeDeliveryContext(normalizeDeliveryContext({
|
|
1295
|
+
channel: source.lastChannel ?? source.channel,
|
|
1296
|
+
to: source.lastTo,
|
|
1297
|
+
accountId: source.lastAccountId,
|
|
1298
|
+
threadId: source.lastThreadId
|
|
1299
|
+
}), normalizeDeliveryContext(source.deliveryContext));
|
|
1300
|
+
if (!merged) return {
|
|
1301
|
+
deliveryContext: void 0,
|
|
1302
|
+
lastChannel: void 0,
|
|
1303
|
+
lastTo: void 0,
|
|
1304
|
+
lastAccountId: void 0,
|
|
1305
|
+
lastThreadId: void 0
|
|
1306
|
+
};
|
|
1307
|
+
return {
|
|
1308
|
+
deliveryContext: merged,
|
|
1309
|
+
lastChannel: merged.channel,
|
|
1310
|
+
lastTo: merged.to,
|
|
1311
|
+
lastAccountId: merged.accountId,
|
|
1312
|
+
lastThreadId: merged.threadId
|
|
1313
|
+
};
|
|
1314
|
+
}
|
|
1315
|
+
function deliveryContextFromSession(entry) {
|
|
1316
|
+
if (!entry) return;
|
|
1317
|
+
return normalizeSessionDeliveryFields({
|
|
1318
|
+
channel: entry.channel,
|
|
1319
|
+
lastChannel: entry.lastChannel,
|
|
1320
|
+
lastTo: entry.lastTo,
|
|
1321
|
+
lastAccountId: entry.lastAccountId,
|
|
1322
|
+
lastThreadId: entry.lastThreadId ?? entry.deliveryContext?.threadId ?? entry.origin?.threadId,
|
|
1323
|
+
deliveryContext: entry.deliveryContext
|
|
1324
|
+
}).deliveryContext;
|
|
1325
|
+
}
|
|
1326
|
+
function mergeDeliveryContext(primary, fallback) {
|
|
1327
|
+
const normalizedPrimary = normalizeDeliveryContext(primary);
|
|
1328
|
+
const normalizedFallback = normalizeDeliveryContext(fallback);
|
|
1329
|
+
if (!normalizedPrimary && !normalizedFallback) return;
|
|
1330
|
+
return normalizeDeliveryContext({
|
|
1331
|
+
channel: normalizedPrimary?.channel ?? normalizedFallback?.channel,
|
|
1332
|
+
to: normalizedPrimary?.to ?? normalizedFallback?.to,
|
|
1333
|
+
accountId: normalizedPrimary?.accountId ?? normalizedFallback?.accountId,
|
|
1334
|
+
threadId: normalizedPrimary?.threadId ?? normalizedFallback?.threadId
|
|
1335
|
+
});
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
//#endregion
|
|
1339
|
+
//#region src/config/cache-utils.ts
|
|
1340
|
+
function resolveCacheTtlMs(params) {
|
|
1341
|
+
const { envValue, defaultTtlMs } = params;
|
|
1342
|
+
if (envValue) {
|
|
1343
|
+
const parsed = Number.parseInt(envValue, 10);
|
|
1344
|
+
if (Number.isFinite(parsed) && parsed >= 0) return parsed;
|
|
1345
|
+
}
|
|
1346
|
+
return defaultTtlMs;
|
|
1347
|
+
}
|
|
1348
|
+
function isCacheEnabled(ttlMs) {
|
|
1349
|
+
return ttlMs > 0;
|
|
1350
|
+
}
|
|
1351
|
+
function getFileMtimeMs(filePath) {
|
|
1352
|
+
try {
|
|
1353
|
+
return fs.statSync(filePath).mtimeMs;
|
|
1354
|
+
} catch {
|
|
1355
|
+
return;
|
|
1356
|
+
}
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1359
|
+
//#endregion
|
|
1360
|
+
//#region src/config/sessions/disk-budget.ts
|
|
1361
|
+
const NOOP_LOGGER = {
|
|
1362
|
+
warn: () => {},
|
|
1363
|
+
info: () => {}
|
|
1364
|
+
};
|
|
1365
|
+
function canonicalizePathForComparison(filePath) {
|
|
1366
|
+
const resolved = path.resolve(filePath);
|
|
1367
|
+
try {
|
|
1368
|
+
return fs.realpathSync(resolved);
|
|
1369
|
+
} catch {
|
|
1370
|
+
return resolved;
|
|
1371
|
+
}
|
|
1372
|
+
}
|
|
1373
|
+
function measureStoreBytes(store) {
|
|
1374
|
+
return Buffer.byteLength(JSON.stringify(store, null, 2), "utf-8");
|
|
1375
|
+
}
|
|
1376
|
+
function measureStoreEntryChunkBytes(key, entry) {
|
|
1377
|
+
const singleEntryStore = JSON.stringify({ [key]: entry }, null, 2);
|
|
1378
|
+
if (!singleEntryStore.startsWith("{\n") || !singleEntryStore.endsWith("\n}")) return measureStoreBytes({ [key]: entry }) - 4;
|
|
1379
|
+
const chunk = singleEntryStore.slice(2, -2);
|
|
1380
|
+
return Buffer.byteLength(chunk, "utf-8");
|
|
1381
|
+
}
|
|
1382
|
+
function buildStoreEntryChunkSizeMap(store) {
|
|
1383
|
+
const out = /* @__PURE__ */ new Map();
|
|
1384
|
+
for (const [key, entry] of Object.entries(store)) out.set(key, measureStoreEntryChunkBytes(key, entry));
|
|
1385
|
+
return out;
|
|
1386
|
+
}
|
|
1387
|
+
function getEntryUpdatedAt$1(entry) {
|
|
1388
|
+
if (!entry) return 0;
|
|
1389
|
+
const updatedAt = entry.updatedAt;
|
|
1390
|
+
return Number.isFinite(updatedAt) ? updatedAt : 0;
|
|
1391
|
+
}
|
|
1392
|
+
function buildSessionIdRefCounts(store) {
|
|
1393
|
+
const counts = /* @__PURE__ */ new Map();
|
|
1394
|
+
for (const entry of Object.values(store)) {
|
|
1395
|
+
const sessionId = entry?.sessionId;
|
|
1396
|
+
if (!sessionId) continue;
|
|
1397
|
+
counts.set(sessionId, (counts.get(sessionId) ?? 0) + 1);
|
|
1398
|
+
}
|
|
1399
|
+
return counts;
|
|
1400
|
+
}
|
|
1401
|
+
function resolveSessionTranscriptPathForEntry(params) {
|
|
1402
|
+
if (!params.entry.sessionId) return null;
|
|
1403
|
+
try {
|
|
1404
|
+
const resolved = resolveSessionFilePath(params.entry.sessionId, params.entry, { sessionsDir: params.sessionsDir });
|
|
1405
|
+
const resolvedSessionsDir = canonicalizePathForComparison(params.sessionsDir);
|
|
1406
|
+
const resolvedPath = canonicalizePathForComparison(resolved);
|
|
1407
|
+
const relative = path.relative(resolvedSessionsDir, resolvedPath);
|
|
1408
|
+
if (!relative || relative.startsWith("..") || path.isAbsolute(relative)) return null;
|
|
1409
|
+
return resolvedPath;
|
|
1410
|
+
} catch {
|
|
1411
|
+
return null;
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
function resolveReferencedSessionTranscriptPaths(params) {
|
|
1415
|
+
const referenced = /* @__PURE__ */ new Set();
|
|
1416
|
+
for (const entry of Object.values(params.store)) {
|
|
1417
|
+
const resolved = resolveSessionTranscriptPathForEntry({
|
|
1418
|
+
sessionsDir: params.sessionsDir,
|
|
1419
|
+
entry
|
|
1420
|
+
});
|
|
1421
|
+
if (resolved) referenced.add(canonicalizePathForComparison(resolved));
|
|
1422
|
+
}
|
|
1423
|
+
return referenced;
|
|
1424
|
+
}
|
|
1425
|
+
async function readSessionsDirFiles(sessionsDir) {
|
|
1426
|
+
const dirEntries = await fs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
|
|
1427
|
+
const files = [];
|
|
1428
|
+
for (const dirent of dirEntries) {
|
|
1429
|
+
if (!dirent.isFile()) continue;
|
|
1430
|
+
const filePath = path.join(sessionsDir, dirent.name);
|
|
1431
|
+
const stat = await fs.promises.stat(filePath).catch(() => null);
|
|
1432
|
+
if (!stat?.isFile()) continue;
|
|
1433
|
+
files.push({
|
|
1434
|
+
path: filePath,
|
|
1435
|
+
canonicalPath: canonicalizePathForComparison(filePath),
|
|
1436
|
+
name: dirent.name,
|
|
1437
|
+
size: stat.size,
|
|
1438
|
+
mtimeMs: stat.mtimeMs
|
|
1439
|
+
});
|
|
1440
|
+
}
|
|
1441
|
+
return files;
|
|
1442
|
+
}
|
|
1443
|
+
async function removeFileIfExists(filePath) {
|
|
1444
|
+
const stat = await fs.promises.stat(filePath).catch(() => null);
|
|
1445
|
+
if (!stat?.isFile()) return 0;
|
|
1446
|
+
await fs.promises.rm(filePath, { force: true }).catch(() => void 0);
|
|
1447
|
+
return stat.size;
|
|
1448
|
+
}
|
|
1449
|
+
async function removeFileForBudget(params) {
|
|
1450
|
+
const resolvedPath = path.resolve(params.filePath);
|
|
1451
|
+
const canonicalPath = params.canonicalPath ?? canonicalizePathForComparison(resolvedPath);
|
|
1452
|
+
if (params.dryRun) {
|
|
1453
|
+
if (params.simulatedRemovedPaths.has(canonicalPath)) return 0;
|
|
1454
|
+
const size = params.fileSizesByPath.get(canonicalPath) ?? 0;
|
|
1455
|
+
if (size <= 0) return 0;
|
|
1456
|
+
params.simulatedRemovedPaths.add(canonicalPath);
|
|
1457
|
+
return size;
|
|
1458
|
+
}
|
|
1459
|
+
return removeFileIfExists(resolvedPath);
|
|
1460
|
+
}
|
|
1461
|
+
async function enforceSessionDiskBudget(params) {
|
|
1462
|
+
const maxBytes = params.maintenance.maxDiskBytes;
|
|
1463
|
+
const highWaterBytes = params.maintenance.highWaterBytes;
|
|
1464
|
+
if (maxBytes == null || highWaterBytes == null) return null;
|
|
1465
|
+
const log = params.log ?? NOOP_LOGGER;
|
|
1466
|
+
const dryRun = params.dryRun === true;
|
|
1467
|
+
const sessionsDir = path.dirname(params.storePath);
|
|
1468
|
+
const files = await readSessionsDirFiles(sessionsDir);
|
|
1469
|
+
const fileSizesByPath = new Map(files.map((file) => [file.canonicalPath, file.size]));
|
|
1470
|
+
const simulatedRemovedPaths = /* @__PURE__ */ new Set();
|
|
1471
|
+
const resolvedStorePath = canonicalizePathForComparison(params.storePath);
|
|
1472
|
+
const storeFile = files.find((file) => file.canonicalPath === resolvedStorePath);
|
|
1473
|
+
let projectedStoreBytes = measureStoreBytes(params.store);
|
|
1474
|
+
let total = files.reduce((sum, file) => sum + file.size, 0) - (storeFile?.size ?? 0) + projectedStoreBytes;
|
|
1475
|
+
const totalBefore = total;
|
|
1476
|
+
if (total <= maxBytes) return {
|
|
1477
|
+
totalBytesBefore: totalBefore,
|
|
1478
|
+
totalBytesAfter: total,
|
|
1479
|
+
removedFiles: 0,
|
|
1480
|
+
removedEntries: 0,
|
|
1481
|
+
freedBytes: 0,
|
|
1482
|
+
maxBytes,
|
|
1483
|
+
highWaterBytes,
|
|
1484
|
+
overBudget: false
|
|
1485
|
+
};
|
|
1486
|
+
if (params.warnOnly) {
|
|
1487
|
+
log.warn("session disk budget exceeded (warn-only mode)", {
|
|
1488
|
+
sessionsDir,
|
|
1489
|
+
totalBytes: total,
|
|
1490
|
+
maxBytes,
|
|
1491
|
+
highWaterBytes
|
|
1492
|
+
});
|
|
1493
|
+
return {
|
|
1494
|
+
totalBytesBefore: totalBefore,
|
|
1495
|
+
totalBytesAfter: total,
|
|
1496
|
+
removedFiles: 0,
|
|
1497
|
+
removedEntries: 0,
|
|
1498
|
+
freedBytes: 0,
|
|
1499
|
+
maxBytes,
|
|
1500
|
+
highWaterBytes,
|
|
1501
|
+
overBudget: true
|
|
1502
|
+
};
|
|
1503
|
+
}
|
|
1504
|
+
let removedFiles = 0;
|
|
1505
|
+
let removedEntries = 0;
|
|
1506
|
+
let freedBytes = 0;
|
|
1507
|
+
const referencedPaths = resolveReferencedSessionTranscriptPaths({
|
|
1508
|
+
sessionsDir,
|
|
1509
|
+
store: params.store
|
|
1510
|
+
});
|
|
1511
|
+
const removableFileQueue = files.filter((file) => isSessionArchiveArtifactName(file.name) || isPrimarySessionTranscriptFileName(file.name) && !referencedPaths.has(file.canonicalPath)).toSorted((a, b) => a.mtimeMs - b.mtimeMs);
|
|
1512
|
+
for (const file of removableFileQueue) {
|
|
1513
|
+
if (total <= highWaterBytes) break;
|
|
1514
|
+
const deletedBytes = await removeFileForBudget({
|
|
1515
|
+
filePath: file.path,
|
|
1516
|
+
canonicalPath: file.canonicalPath,
|
|
1517
|
+
dryRun,
|
|
1518
|
+
fileSizesByPath,
|
|
1519
|
+
simulatedRemovedPaths
|
|
1520
|
+
});
|
|
1521
|
+
if (deletedBytes <= 0) continue;
|
|
1522
|
+
total -= deletedBytes;
|
|
1523
|
+
freedBytes += deletedBytes;
|
|
1524
|
+
removedFiles += 1;
|
|
1525
|
+
}
|
|
1526
|
+
if (total > highWaterBytes) {
|
|
1527
|
+
const activeSessionKey = params.activeSessionKey?.trim().toLowerCase();
|
|
1528
|
+
const sessionIdRefCounts = buildSessionIdRefCounts(params.store);
|
|
1529
|
+
const entryChunkBytesByKey = buildStoreEntryChunkSizeMap(params.store);
|
|
1530
|
+
const keys = Object.keys(params.store).toSorted((a, b) => {
|
|
1531
|
+
return getEntryUpdatedAt$1(params.store[a]) - getEntryUpdatedAt$1(params.store[b]);
|
|
1532
|
+
});
|
|
1533
|
+
for (const key of keys) {
|
|
1534
|
+
if (total <= highWaterBytes) break;
|
|
1535
|
+
if (activeSessionKey && key.trim().toLowerCase() === activeSessionKey) continue;
|
|
1536
|
+
const entry = params.store[key];
|
|
1537
|
+
if (!entry) continue;
|
|
1538
|
+
const previousProjectedBytes = projectedStoreBytes;
|
|
1539
|
+
delete params.store[key];
|
|
1540
|
+
const chunkBytes = entryChunkBytesByKey.get(key);
|
|
1541
|
+
entryChunkBytesByKey.delete(key);
|
|
1542
|
+
if (typeof chunkBytes === "number" && Number.isFinite(chunkBytes) && chunkBytes >= 0) projectedStoreBytes = Math.max(2, projectedStoreBytes - (chunkBytes + 2));
|
|
1543
|
+
else projectedStoreBytes = measureStoreBytes(params.store);
|
|
1544
|
+
total += projectedStoreBytes - previousProjectedBytes;
|
|
1545
|
+
removedEntries += 1;
|
|
1546
|
+
const sessionId = entry.sessionId;
|
|
1547
|
+
if (!sessionId) continue;
|
|
1548
|
+
const nextRefCount = (sessionIdRefCounts.get(sessionId) ?? 1) - 1;
|
|
1549
|
+
if (nextRefCount > 0) {
|
|
1550
|
+
sessionIdRefCounts.set(sessionId, nextRefCount);
|
|
1551
|
+
continue;
|
|
1552
|
+
}
|
|
1553
|
+
sessionIdRefCounts.delete(sessionId);
|
|
1554
|
+
const transcriptPath = resolveSessionTranscriptPathForEntry({
|
|
1555
|
+
sessionsDir,
|
|
1556
|
+
entry
|
|
1557
|
+
});
|
|
1558
|
+
if (!transcriptPath) continue;
|
|
1559
|
+
const deletedBytes = await removeFileForBudget({
|
|
1560
|
+
filePath: transcriptPath,
|
|
1561
|
+
dryRun,
|
|
1562
|
+
fileSizesByPath,
|
|
1563
|
+
simulatedRemovedPaths
|
|
1564
|
+
});
|
|
1565
|
+
if (deletedBytes <= 0) continue;
|
|
1566
|
+
total -= deletedBytes;
|
|
1567
|
+
freedBytes += deletedBytes;
|
|
1568
|
+
removedFiles += 1;
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
if (!dryRun) {
|
|
1572
|
+
if (total > highWaterBytes) log.warn("session disk budget still above high-water target after cleanup", {
|
|
1573
|
+
sessionsDir,
|
|
1574
|
+
totalBytes: total,
|
|
1575
|
+
maxBytes,
|
|
1576
|
+
highWaterBytes,
|
|
1577
|
+
removedFiles,
|
|
1578
|
+
removedEntries
|
|
1579
|
+
});
|
|
1580
|
+
else if (removedFiles > 0 || removedEntries > 0) log.info("applied session disk budget cleanup", {
|
|
1581
|
+
sessionsDir,
|
|
1582
|
+
totalBytesBefore: totalBefore,
|
|
1583
|
+
totalBytesAfter: total,
|
|
1584
|
+
maxBytes,
|
|
1585
|
+
highWaterBytes,
|
|
1586
|
+
removedFiles,
|
|
1587
|
+
removedEntries
|
|
1588
|
+
});
|
|
1589
|
+
}
|
|
1590
|
+
return {
|
|
1591
|
+
totalBytesBefore: totalBefore,
|
|
1592
|
+
totalBytesAfter: total,
|
|
1593
|
+
removedFiles,
|
|
1594
|
+
removedEntries,
|
|
1595
|
+
freedBytes,
|
|
1596
|
+
maxBytes,
|
|
1597
|
+
highWaterBytes,
|
|
1598
|
+
overBudget: true
|
|
1599
|
+
};
|
|
1600
|
+
}
|
|
1601
|
+
|
|
1602
|
+
//#endregion
|
|
1603
|
+
//#region src/config/sessions/store.ts
|
|
1604
|
+
const log = createSubsystemLogger("sessions/store");
|
|
1605
|
+
const SESSION_STORE_CACHE = /* @__PURE__ */ new Map();
|
|
1606
|
+
const DEFAULT_SESSION_STORE_TTL_MS = 45e3;
|
|
1607
|
+
function isSessionStoreRecord(value) {
|
|
1608
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
1609
|
+
}
|
|
1610
|
+
function getSessionStoreTtl() {
|
|
1611
|
+
return resolveCacheTtlMs({
|
|
1612
|
+
envValue: process.env.REMOTECLAW_SESSION_CACHE_TTL_MS,
|
|
1613
|
+
defaultTtlMs: DEFAULT_SESSION_STORE_TTL_MS
|
|
1614
|
+
});
|
|
1615
|
+
}
|
|
1616
|
+
function isSessionStoreCacheEnabled() {
|
|
1617
|
+
return isCacheEnabled(getSessionStoreTtl());
|
|
1618
|
+
}
|
|
1619
|
+
function isSessionStoreCacheValid(entry) {
|
|
1620
|
+
const now = Date.now();
|
|
1621
|
+
const ttl = getSessionStoreTtl();
|
|
1622
|
+
return now - entry.loadedAt <= ttl;
|
|
1623
|
+
}
|
|
1624
|
+
function invalidateSessionStoreCache(storePath) {
|
|
1625
|
+
SESSION_STORE_CACHE.delete(storePath);
|
|
1626
|
+
}
|
|
1627
|
+
function normalizeSessionEntryDelivery(entry) {
|
|
1628
|
+
const normalized = normalizeSessionDeliveryFields({
|
|
1629
|
+
channel: entry.channel,
|
|
1630
|
+
lastChannel: entry.lastChannel,
|
|
1631
|
+
lastTo: entry.lastTo,
|
|
1632
|
+
lastAccountId: entry.lastAccountId,
|
|
1633
|
+
lastThreadId: entry.lastThreadId ?? entry.deliveryContext?.threadId ?? entry.origin?.threadId,
|
|
1634
|
+
deliveryContext: entry.deliveryContext
|
|
1635
|
+
});
|
|
1636
|
+
const nextDelivery = normalized.deliveryContext;
|
|
1637
|
+
const sameDelivery = (entry.deliveryContext?.channel ?? void 0) === nextDelivery?.channel && (entry.deliveryContext?.to ?? void 0) === nextDelivery?.to && (entry.deliveryContext?.accountId ?? void 0) === nextDelivery?.accountId && (entry.deliveryContext?.threadId ?? void 0) === nextDelivery?.threadId;
|
|
1638
|
+
const sameLast = entry.lastChannel === normalized.lastChannel && entry.lastTo === normalized.lastTo && entry.lastAccountId === normalized.lastAccountId && entry.lastThreadId === normalized.lastThreadId;
|
|
1639
|
+
if (sameDelivery && sameLast) return entry;
|
|
1640
|
+
return {
|
|
1641
|
+
...entry,
|
|
1642
|
+
deliveryContext: nextDelivery,
|
|
1643
|
+
lastChannel: normalized.lastChannel,
|
|
1644
|
+
lastTo: normalized.lastTo,
|
|
1645
|
+
lastAccountId: normalized.lastAccountId,
|
|
1646
|
+
lastThreadId: normalized.lastThreadId
|
|
1647
|
+
};
|
|
1648
|
+
}
|
|
1649
|
+
function removeThreadFromDeliveryContext(context) {
|
|
1650
|
+
if (!context || context.threadId == null) return context;
|
|
1651
|
+
const next = { ...context };
|
|
1652
|
+
delete next.threadId;
|
|
1653
|
+
return next;
|
|
1654
|
+
}
|
|
1655
|
+
function normalizeStoreSessionKey(sessionKey) {
|
|
1656
|
+
return sessionKey.trim().toLowerCase();
|
|
1657
|
+
}
|
|
1658
|
+
function resolveStoreSessionEntry(params) {
|
|
1659
|
+
const trimmedKey = params.sessionKey.trim();
|
|
1660
|
+
const normalizedKey = normalizeStoreSessionKey(trimmedKey);
|
|
1661
|
+
const legacyKeySet = /* @__PURE__ */ new Set();
|
|
1662
|
+
if (trimmedKey !== normalizedKey && Object.prototype.hasOwnProperty.call(params.store, trimmedKey)) legacyKeySet.add(trimmedKey);
|
|
1663
|
+
let existing = params.store[normalizedKey] ?? (legacyKeySet.size > 0 ? params.store[trimmedKey] : void 0);
|
|
1664
|
+
let existingUpdatedAt = existing?.updatedAt ?? 0;
|
|
1665
|
+
for (const [candidateKey, candidateEntry] of Object.entries(params.store)) {
|
|
1666
|
+
if (candidateKey === normalizedKey) continue;
|
|
1667
|
+
if (candidateKey.toLowerCase() !== normalizedKey) continue;
|
|
1668
|
+
legacyKeySet.add(candidateKey);
|
|
1669
|
+
const candidateUpdatedAt = candidateEntry?.updatedAt ?? 0;
|
|
1670
|
+
if (!existing || candidateUpdatedAt > existingUpdatedAt) {
|
|
1671
|
+
existing = candidateEntry;
|
|
1672
|
+
existingUpdatedAt = candidateUpdatedAt;
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1675
|
+
return {
|
|
1676
|
+
normalizedKey,
|
|
1677
|
+
existing,
|
|
1678
|
+
legacyKeys: [...legacyKeySet]
|
|
1679
|
+
};
|
|
1680
|
+
}
|
|
1681
|
+
function normalizeSessionStore(store) {
|
|
1682
|
+
for (const [key, entry] of Object.entries(store)) {
|
|
1683
|
+
if (!entry) continue;
|
|
1684
|
+
const normalized = normalizeSessionEntryDelivery(normalizeSessionRuntimeModelFields(entry));
|
|
1685
|
+
if (normalized !== entry) store[key] = normalized;
|
|
1686
|
+
}
|
|
1687
|
+
}
|
|
1688
|
+
function clearSessionStoreCacheForTest() {
|
|
1689
|
+
SESSION_STORE_CACHE.clear();
|
|
1690
|
+
for (const queue of LOCK_QUEUES.values()) for (const task of queue.pending) task.reject(/* @__PURE__ */ new Error("session store queue cleared for test"));
|
|
1691
|
+
LOCK_QUEUES.clear();
|
|
1692
|
+
}
|
|
1693
|
+
/** Expose lock queue size for tests. */
|
|
1694
|
+
function getSessionStoreLockQueueSizeForTest() {
|
|
1695
|
+
return LOCK_QUEUES.size;
|
|
1696
|
+
}
|
|
1697
|
+
async function withSessionStoreLockForTest(storePath, fn, opts = {}) {
|
|
1698
|
+
return await withSessionStoreLock(storePath, fn, opts);
|
|
1699
|
+
}
|
|
1700
|
+
function loadSessionStore(storePath, opts = {}) {
|
|
1701
|
+
if (!opts.skipCache && isSessionStoreCacheEnabled()) {
|
|
1702
|
+
const cached = SESSION_STORE_CACHE.get(storePath);
|
|
1703
|
+
if (cached && isSessionStoreCacheValid(cached)) {
|
|
1704
|
+
if (getFileMtimeMs(storePath) === cached.mtimeMs) return structuredClone(cached.store);
|
|
1705
|
+
invalidateSessionStoreCache(storePath);
|
|
1706
|
+
}
|
|
1707
|
+
}
|
|
1708
|
+
let store = {};
|
|
1709
|
+
let mtimeMs = getFileMtimeMs(storePath);
|
|
1710
|
+
const maxReadAttempts = process.platform === "win32" ? 3 : 1;
|
|
1711
|
+
const retryBuf = maxReadAttempts > 1 ? new Int32Array(new SharedArrayBuffer(4)) : void 0;
|
|
1712
|
+
for (let attempt = 0; attempt < maxReadAttempts; attempt++) try {
|
|
1713
|
+
const raw = fs.readFileSync(storePath, "utf-8");
|
|
1714
|
+
if (raw.length === 0 && attempt < maxReadAttempts - 1) {
|
|
1715
|
+
Atomics.wait(retryBuf, 0, 0, 50);
|
|
1716
|
+
continue;
|
|
1717
|
+
}
|
|
1718
|
+
const parsed = JSON.parse(raw);
|
|
1719
|
+
if (isSessionStoreRecord(parsed)) store = parsed;
|
|
1720
|
+
mtimeMs = getFileMtimeMs(storePath) ?? mtimeMs;
|
|
1721
|
+
break;
|
|
1722
|
+
} catch {
|
|
1723
|
+
if (attempt < maxReadAttempts - 1) {
|
|
1724
|
+
Atomics.wait(retryBuf, 0, 0, 50);
|
|
1725
|
+
continue;
|
|
1726
|
+
}
|
|
1727
|
+
}
|
|
1728
|
+
for (const entry of Object.values(store)) {
|
|
1729
|
+
if (!entry || typeof entry !== "object") continue;
|
|
1730
|
+
const rec = entry;
|
|
1731
|
+
if (typeof rec.channel !== "string" && typeof rec.provider === "string") {
|
|
1732
|
+
rec.channel = rec.provider;
|
|
1733
|
+
delete rec.provider;
|
|
1734
|
+
}
|
|
1735
|
+
if (typeof rec.lastChannel !== "string" && typeof rec.lastProvider === "string") {
|
|
1736
|
+
rec.lastChannel = rec.lastProvider;
|
|
1737
|
+
delete rec.lastProvider;
|
|
1738
|
+
}
|
|
1739
|
+
if (typeof rec.groupChannel !== "string" && typeof rec.room === "string") {
|
|
1740
|
+
rec.groupChannel = rec.room;
|
|
1741
|
+
delete rec.room;
|
|
1742
|
+
} else if ("room" in rec) delete rec.room;
|
|
1743
|
+
}
|
|
1744
|
+
if (!opts.skipCache && isSessionStoreCacheEnabled()) SESSION_STORE_CACHE.set(storePath, {
|
|
1745
|
+
store: structuredClone(store),
|
|
1746
|
+
loadedAt: Date.now(),
|
|
1747
|
+
storePath,
|
|
1748
|
+
mtimeMs
|
|
1749
|
+
});
|
|
1750
|
+
return structuredClone(store);
|
|
1751
|
+
}
|
|
1752
|
+
function readSessionUpdatedAt(params) {
|
|
1753
|
+
try {
|
|
1754
|
+
return resolveStoreSessionEntry({
|
|
1755
|
+
store: loadSessionStore(params.storePath),
|
|
1756
|
+
sessionKey: params.sessionKey
|
|
1757
|
+
}).existing?.updatedAt;
|
|
1758
|
+
} catch {
|
|
1759
|
+
return;
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
const DEFAULT_SESSION_PRUNE_AFTER_MS = 720 * 60 * 60 * 1e3;
|
|
1763
|
+
const DEFAULT_SESSION_MAX_ENTRIES = 500;
|
|
1764
|
+
const DEFAULT_SESSION_ROTATE_BYTES = 10485760;
|
|
1765
|
+
const DEFAULT_SESSION_MAINTENANCE_MODE = "warn";
|
|
1766
|
+
const DEFAULT_SESSION_DISK_BUDGET_HIGH_WATER_RATIO = .8;
|
|
1767
|
+
function resolvePruneAfterMs(maintenance) {
|
|
1768
|
+
const raw = maintenance?.pruneAfter ?? maintenance?.pruneDays;
|
|
1769
|
+
if (raw === void 0 || raw === null || raw === "") return DEFAULT_SESSION_PRUNE_AFTER_MS;
|
|
1770
|
+
try {
|
|
1771
|
+
return parseDurationMs(String(raw).trim(), { defaultUnit: "d" });
|
|
1772
|
+
} catch {
|
|
1773
|
+
return DEFAULT_SESSION_PRUNE_AFTER_MS;
|
|
1774
|
+
}
|
|
1775
|
+
}
|
|
1776
|
+
function resolveRotateBytes(maintenance) {
|
|
1777
|
+
const raw = maintenance?.rotateBytes;
|
|
1778
|
+
if (raw === void 0 || raw === null || raw === "") return DEFAULT_SESSION_ROTATE_BYTES;
|
|
1779
|
+
try {
|
|
1780
|
+
return parseByteSize(String(raw).trim(), { defaultUnit: "b" });
|
|
1781
|
+
} catch {
|
|
1782
|
+
return DEFAULT_SESSION_ROTATE_BYTES;
|
|
1783
|
+
}
|
|
1784
|
+
}
|
|
1785
|
+
function resolveResetArchiveRetentionMs(maintenance, pruneAfterMs) {
|
|
1786
|
+
const raw = maintenance?.resetArchiveRetention;
|
|
1787
|
+
if (raw === false) return null;
|
|
1788
|
+
if (raw === void 0 || raw === null || raw === "") return pruneAfterMs;
|
|
1789
|
+
try {
|
|
1790
|
+
return parseDurationMs(String(raw).trim(), { defaultUnit: "d" });
|
|
1791
|
+
} catch {
|
|
1792
|
+
return pruneAfterMs;
|
|
1793
|
+
}
|
|
1794
|
+
}
|
|
1795
|
+
function resolveMaxDiskBytes(maintenance) {
|
|
1796
|
+
const raw = maintenance?.maxDiskBytes;
|
|
1797
|
+
if (raw === void 0 || raw === null || raw === "") return null;
|
|
1798
|
+
try {
|
|
1799
|
+
return parseByteSize(String(raw).trim(), { defaultUnit: "b" });
|
|
1800
|
+
} catch {
|
|
1801
|
+
return null;
|
|
1802
|
+
}
|
|
1803
|
+
}
|
|
1804
|
+
function resolveHighWaterBytes(maintenance, maxDiskBytes) {
|
|
1805
|
+
const computeDefault = () => {
|
|
1806
|
+
if (maxDiskBytes == null) return null;
|
|
1807
|
+
if (maxDiskBytes <= 0) return 0;
|
|
1808
|
+
return Math.max(1, Math.min(maxDiskBytes, Math.floor(maxDiskBytes * DEFAULT_SESSION_DISK_BUDGET_HIGH_WATER_RATIO)));
|
|
1809
|
+
};
|
|
1810
|
+
if (maxDiskBytes == null) return null;
|
|
1811
|
+
const raw = maintenance?.highWaterBytes;
|
|
1812
|
+
if (raw === void 0 || raw === null || raw === "") return computeDefault();
|
|
1813
|
+
try {
|
|
1814
|
+
const parsed = parseByteSize(String(raw).trim(), { defaultUnit: "b" });
|
|
1815
|
+
return Math.min(parsed, maxDiskBytes);
|
|
1816
|
+
} catch {
|
|
1817
|
+
return computeDefault();
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
/**
|
|
1821
|
+
* Resolve maintenance settings from remoteclaw.json (`session.maintenance`).
|
|
1822
|
+
* Falls back to built-in defaults when config is missing or unset.
|
|
1823
|
+
*/
|
|
1824
|
+
function resolveMaintenanceConfig() {
|
|
1825
|
+
let maintenance;
|
|
1826
|
+
try {
|
|
1827
|
+
maintenance = loadConfig().session?.maintenance;
|
|
1828
|
+
} catch {}
|
|
1829
|
+
const pruneAfterMs = resolvePruneAfterMs(maintenance);
|
|
1830
|
+
const maxDiskBytes = resolveMaxDiskBytes(maintenance);
|
|
1831
|
+
return {
|
|
1832
|
+
mode: maintenance?.mode ?? DEFAULT_SESSION_MAINTENANCE_MODE,
|
|
1833
|
+
pruneAfterMs,
|
|
1834
|
+
maxEntries: maintenance?.maxEntries ?? DEFAULT_SESSION_MAX_ENTRIES,
|
|
1835
|
+
rotateBytes: resolveRotateBytes(maintenance),
|
|
1836
|
+
resetArchiveRetentionMs: resolveResetArchiveRetentionMs(maintenance, pruneAfterMs),
|
|
1837
|
+
maxDiskBytes,
|
|
1838
|
+
highWaterBytes: resolveHighWaterBytes(maintenance, maxDiskBytes)
|
|
1839
|
+
};
|
|
1840
|
+
}
|
|
1841
|
+
/**
|
|
1842
|
+
* Remove entries whose `updatedAt` is older than the configured threshold.
|
|
1843
|
+
* Entries without `updatedAt` are kept (cannot determine staleness).
|
|
1844
|
+
* Mutates `store` in-place.
|
|
1845
|
+
*/
|
|
1846
|
+
function pruneStaleEntries(store, overrideMaxAgeMs, opts = {}) {
|
|
1847
|
+
const maxAgeMs = overrideMaxAgeMs ?? resolveMaintenanceConfig().pruneAfterMs;
|
|
1848
|
+
const cutoffMs = Date.now() - maxAgeMs;
|
|
1849
|
+
let pruned = 0;
|
|
1850
|
+
for (const [key, entry] of Object.entries(store)) if (entry?.updatedAt != null && entry.updatedAt < cutoffMs) {
|
|
1851
|
+
opts.onPruned?.({
|
|
1852
|
+
key,
|
|
1853
|
+
entry
|
|
1854
|
+
});
|
|
1855
|
+
delete store[key];
|
|
1856
|
+
pruned++;
|
|
1857
|
+
}
|
|
1858
|
+
if (pruned > 0 && opts.log !== false) log.info("pruned stale session entries", {
|
|
1859
|
+
pruned,
|
|
1860
|
+
maxAgeMs
|
|
1861
|
+
});
|
|
1862
|
+
return pruned;
|
|
1863
|
+
}
|
|
1864
|
+
/**
|
|
1865
|
+
* Cap the store to the N most recently updated entries.
|
|
1866
|
+
* Entries without `updatedAt` are sorted last (removed first when over limit).
|
|
1867
|
+
* Mutates `store` in-place.
|
|
1868
|
+
*/
|
|
1869
|
+
function getEntryUpdatedAt(entry) {
|
|
1870
|
+
return entry?.updatedAt ?? Number.NEGATIVE_INFINITY;
|
|
1871
|
+
}
|
|
1872
|
+
function getActiveSessionMaintenanceWarning(params) {
|
|
1873
|
+
const activeSessionKey = params.activeSessionKey.trim();
|
|
1874
|
+
if (!activeSessionKey) return null;
|
|
1875
|
+
const activeEntry = params.store[activeSessionKey];
|
|
1876
|
+
if (!activeEntry) return null;
|
|
1877
|
+
const cutoffMs = (params.nowMs ?? Date.now()) - params.pruneAfterMs;
|
|
1878
|
+
const wouldPrune = activeEntry.updatedAt != null ? activeEntry.updatedAt < cutoffMs : false;
|
|
1879
|
+
const keys = Object.keys(params.store);
|
|
1880
|
+
const wouldCap = keys.length > params.maxEntries && keys.toSorted((a, b) => getEntryUpdatedAt(params.store[b]) - getEntryUpdatedAt(params.store[a])).slice(params.maxEntries).includes(activeSessionKey);
|
|
1881
|
+
if (!wouldPrune && !wouldCap) return null;
|
|
1882
|
+
return {
|
|
1883
|
+
activeSessionKey,
|
|
1884
|
+
activeUpdatedAt: activeEntry.updatedAt,
|
|
1885
|
+
totalEntries: keys.length,
|
|
1886
|
+
pruneAfterMs: params.pruneAfterMs,
|
|
1887
|
+
maxEntries: params.maxEntries,
|
|
1888
|
+
wouldPrune,
|
|
1889
|
+
wouldCap
|
|
1890
|
+
};
|
|
1891
|
+
}
|
|
1892
|
+
function capEntryCount(store, overrideMax, opts = {}) {
|
|
1893
|
+
const maxEntries = overrideMax ?? resolveMaintenanceConfig().maxEntries;
|
|
1894
|
+
const keys = Object.keys(store);
|
|
1895
|
+
if (keys.length <= maxEntries) return 0;
|
|
1896
|
+
const toRemove = keys.toSorted((a, b) => {
|
|
1897
|
+
const aTime = getEntryUpdatedAt(store[a]);
|
|
1898
|
+
return getEntryUpdatedAt(store[b]) - aTime;
|
|
1899
|
+
}).slice(maxEntries);
|
|
1900
|
+
for (const key of toRemove) {
|
|
1901
|
+
const entry = store[key];
|
|
1902
|
+
if (entry) opts.onCapped?.({
|
|
1903
|
+
key,
|
|
1904
|
+
entry
|
|
1905
|
+
});
|
|
1906
|
+
delete store[key];
|
|
1907
|
+
}
|
|
1908
|
+
if (opts.log !== false) log.info("capped session entry count", {
|
|
1909
|
+
removed: toRemove.length,
|
|
1910
|
+
maxEntries
|
|
1911
|
+
});
|
|
1912
|
+
return toRemove.length;
|
|
1913
|
+
}
|
|
1914
|
+
async function getSessionFileSize(storePath) {
|
|
1915
|
+
try {
|
|
1916
|
+
return (await fs.promises.stat(storePath)).size;
|
|
1917
|
+
} catch {
|
|
1918
|
+
return null;
|
|
1919
|
+
}
|
|
1920
|
+
}
|
|
1921
|
+
/**
|
|
1922
|
+
* Rotate the sessions file if it exceeds the configured size threshold.
|
|
1923
|
+
* Renames the current file to `sessions.json.bak.{timestamp}` and cleans up
|
|
1924
|
+
* old rotation backups, keeping only the 3 most recent `.bak.*` files.
|
|
1925
|
+
*/
|
|
1926
|
+
async function rotateSessionFile(storePath, overrideBytes) {
|
|
1927
|
+
const maxBytes = overrideBytes ?? resolveMaintenanceConfig().rotateBytes;
|
|
1928
|
+
const fileSize = await getSessionFileSize(storePath);
|
|
1929
|
+
if (fileSize == null) return false;
|
|
1930
|
+
if (fileSize <= maxBytes) return false;
|
|
1931
|
+
const backupPath = `${storePath}.bak.${Date.now()}`;
|
|
1932
|
+
try {
|
|
1933
|
+
await fs.promises.rename(storePath, backupPath);
|
|
1934
|
+
log.info("rotated session store file", {
|
|
1935
|
+
backupPath: path.basename(backupPath),
|
|
1936
|
+
sizeBytes: fileSize
|
|
1937
|
+
});
|
|
1938
|
+
} catch {
|
|
1939
|
+
return false;
|
|
1940
|
+
}
|
|
1941
|
+
try {
|
|
1942
|
+
const dir = path.dirname(storePath);
|
|
1943
|
+
const baseName = path.basename(storePath);
|
|
1944
|
+
const backups = (await fs.promises.readdir(dir)).filter((f) => f.startsWith(`${baseName}.bak.`)).toSorted().toReversed();
|
|
1945
|
+
const maxBackups = 3;
|
|
1946
|
+
if (backups.length > maxBackups) {
|
|
1947
|
+
const toDelete = backups.slice(maxBackups);
|
|
1948
|
+
for (const old of toDelete) await fs.promises.unlink(path.join(dir, old)).catch(() => void 0);
|
|
1949
|
+
log.info("cleaned up old session store backups", { deleted: toDelete.length });
|
|
1950
|
+
}
|
|
1951
|
+
} catch {}
|
|
1952
|
+
return true;
|
|
1953
|
+
}
|
|
1954
|
+
async function saveSessionStoreUnlocked(storePath, store, opts) {
|
|
1955
|
+
invalidateSessionStoreCache(storePath);
|
|
1956
|
+
normalizeSessionStore(store);
|
|
1957
|
+
if (!opts?.skipMaintenance) {
|
|
1958
|
+
const maintenance = {
|
|
1959
|
+
...resolveMaintenanceConfig(),
|
|
1960
|
+
...opts?.maintenanceOverride
|
|
1961
|
+
};
|
|
1962
|
+
const shouldWarnOnly = maintenance.mode === "warn";
|
|
1963
|
+
const beforeCount = Object.keys(store).length;
|
|
1964
|
+
if (shouldWarnOnly) {
|
|
1965
|
+
const activeSessionKey = opts?.activeSessionKey?.trim();
|
|
1966
|
+
if (activeSessionKey) {
|
|
1967
|
+
const warning = getActiveSessionMaintenanceWarning({
|
|
1968
|
+
store,
|
|
1969
|
+
activeSessionKey,
|
|
1970
|
+
pruneAfterMs: maintenance.pruneAfterMs,
|
|
1971
|
+
maxEntries: maintenance.maxEntries
|
|
1972
|
+
});
|
|
1973
|
+
if (warning) {
|
|
1974
|
+
log.warn("session maintenance would evict active session; skipping enforcement", {
|
|
1975
|
+
activeSessionKey: warning.activeSessionKey,
|
|
1976
|
+
wouldPrune: warning.wouldPrune,
|
|
1977
|
+
wouldCap: warning.wouldCap,
|
|
1978
|
+
pruneAfterMs: warning.pruneAfterMs,
|
|
1979
|
+
maxEntries: warning.maxEntries
|
|
1980
|
+
});
|
|
1981
|
+
await opts?.onWarn?.(warning);
|
|
1982
|
+
}
|
|
1983
|
+
}
|
|
1984
|
+
const diskBudget = await enforceSessionDiskBudget({
|
|
1985
|
+
store,
|
|
1986
|
+
storePath,
|
|
1987
|
+
activeSessionKey: opts?.activeSessionKey,
|
|
1988
|
+
maintenance,
|
|
1989
|
+
warnOnly: true,
|
|
1990
|
+
log
|
|
1991
|
+
});
|
|
1992
|
+
await opts?.onMaintenanceApplied?.({
|
|
1993
|
+
mode: maintenance.mode,
|
|
1994
|
+
beforeCount,
|
|
1995
|
+
afterCount: Object.keys(store).length,
|
|
1996
|
+
pruned: 0,
|
|
1997
|
+
capped: 0,
|
|
1998
|
+
diskBudget
|
|
1999
|
+
});
|
|
2000
|
+
} else {
|
|
2001
|
+
const removedSessionFiles = /* @__PURE__ */ new Map();
|
|
2002
|
+
const pruned = pruneStaleEntries(store, maintenance.pruneAfterMs, { onPruned: ({ entry }) => {
|
|
2003
|
+
if (!removedSessionFiles.has(entry.sessionId) || entry.sessionFile) removedSessionFiles.set(entry.sessionId, entry.sessionFile);
|
|
2004
|
+
} });
|
|
2005
|
+
const capped = capEntryCount(store, maintenance.maxEntries, { onCapped: ({ entry }) => {
|
|
2006
|
+
if (!removedSessionFiles.has(entry.sessionId) || entry.sessionFile) removedSessionFiles.set(entry.sessionId, entry.sessionFile);
|
|
2007
|
+
} });
|
|
2008
|
+
const archivedDirs = /* @__PURE__ */ new Set();
|
|
2009
|
+
const referencedSessionIds = new Set(Object.values(store).map((entry) => entry?.sessionId).filter((id) => Boolean(id)));
|
|
2010
|
+
for (const [sessionId, sessionFile] of removedSessionFiles) {
|
|
2011
|
+
if (referencedSessionIds.has(sessionId)) continue;
|
|
2012
|
+
const archived = archiveSessionTranscripts({
|
|
2013
|
+
sessionId,
|
|
2014
|
+
storePath,
|
|
2015
|
+
sessionFile,
|
|
2016
|
+
reason: "deleted",
|
|
2017
|
+
restrictToStoreDir: true
|
|
2018
|
+
});
|
|
2019
|
+
for (const archivedPath of archived) archivedDirs.add(path.dirname(archivedPath));
|
|
2020
|
+
}
|
|
2021
|
+
if (archivedDirs.size > 0 || maintenance.resetArchiveRetentionMs != null) {
|
|
2022
|
+
const targetDirs = archivedDirs.size > 0 ? [...archivedDirs] : [path.dirname(path.resolve(storePath))];
|
|
2023
|
+
await cleanupArchivedSessionTranscripts({
|
|
2024
|
+
directories: targetDirs,
|
|
2025
|
+
olderThanMs: maintenance.pruneAfterMs,
|
|
2026
|
+
reason: "deleted"
|
|
2027
|
+
});
|
|
2028
|
+
if (maintenance.resetArchiveRetentionMs != null) await cleanupArchivedSessionTranscripts({
|
|
2029
|
+
directories: targetDirs,
|
|
2030
|
+
olderThanMs: maintenance.resetArchiveRetentionMs,
|
|
2031
|
+
reason: "reset"
|
|
2032
|
+
});
|
|
2033
|
+
}
|
|
2034
|
+
await rotateSessionFile(storePath, maintenance.rotateBytes);
|
|
2035
|
+
const diskBudget = await enforceSessionDiskBudget({
|
|
2036
|
+
store,
|
|
2037
|
+
storePath,
|
|
2038
|
+
activeSessionKey: opts?.activeSessionKey,
|
|
2039
|
+
maintenance,
|
|
2040
|
+
warnOnly: false,
|
|
2041
|
+
log
|
|
2042
|
+
});
|
|
2043
|
+
await opts?.onMaintenanceApplied?.({
|
|
2044
|
+
mode: maintenance.mode,
|
|
2045
|
+
beforeCount,
|
|
2046
|
+
afterCount: Object.keys(store).length,
|
|
2047
|
+
pruned,
|
|
2048
|
+
capped,
|
|
2049
|
+
diskBudget
|
|
2050
|
+
});
|
|
2051
|
+
}
|
|
2052
|
+
}
|
|
2053
|
+
await fs.promises.mkdir(path.dirname(storePath), { recursive: true });
|
|
2054
|
+
const json = JSON.stringify(store, null, 2);
|
|
2055
|
+
if (process.platform === "win32") {
|
|
2056
|
+
const tmp = `${storePath}.${process.pid}.${crypto.randomUUID()}.tmp`;
|
|
2057
|
+
try {
|
|
2058
|
+
await fs.promises.writeFile(tmp, json, "utf-8");
|
|
2059
|
+
for (let i = 0; i < 5; i++) try {
|
|
2060
|
+
await fs.promises.rename(tmp, storePath);
|
|
2061
|
+
break;
|
|
2062
|
+
} catch {
|
|
2063
|
+
if (i < 4) await new Promise((r) => setTimeout(r, 50 * (i + 1)));
|
|
2064
|
+
if (i === 4) log.warn(`rename failed after 5 attempts: ${storePath}`);
|
|
2065
|
+
}
|
|
2066
|
+
} catch (err) {
|
|
2067
|
+
if ((err && typeof err === "object" && "code" in err ? String(err.code) : null) === "ENOENT") return;
|
|
2068
|
+
throw err;
|
|
2069
|
+
} finally {
|
|
2070
|
+
await fs.promises.rm(tmp, { force: true }).catch(() => void 0);
|
|
2071
|
+
}
|
|
2072
|
+
return;
|
|
2073
|
+
}
|
|
2074
|
+
const tmp = `${storePath}.${process.pid}.${crypto.randomUUID()}.tmp`;
|
|
2075
|
+
try {
|
|
2076
|
+
await fs.promises.writeFile(tmp, json, {
|
|
2077
|
+
mode: 384,
|
|
2078
|
+
encoding: "utf-8"
|
|
2079
|
+
});
|
|
2080
|
+
await fs.promises.rename(tmp, storePath);
|
|
2081
|
+
await fs.promises.chmod(storePath, 384);
|
|
2082
|
+
} catch (err) {
|
|
2083
|
+
if ((err && typeof err === "object" && "code" in err ? String(err.code) : null) === "ENOENT") {
|
|
2084
|
+
try {
|
|
2085
|
+
await fs.promises.mkdir(path.dirname(storePath), { recursive: true });
|
|
2086
|
+
await fs.promises.writeFile(storePath, json, {
|
|
2087
|
+
mode: 384,
|
|
2088
|
+
encoding: "utf-8"
|
|
2089
|
+
});
|
|
2090
|
+
await fs.promises.chmod(storePath, 384);
|
|
2091
|
+
} catch (err2) {
|
|
2092
|
+
if ((err2 && typeof err2 === "object" && "code" in err2 ? String(err2.code) : null) === "ENOENT") return;
|
|
2093
|
+
throw err2;
|
|
2094
|
+
}
|
|
2095
|
+
return;
|
|
2096
|
+
}
|
|
2097
|
+
throw err;
|
|
2098
|
+
} finally {
|
|
2099
|
+
await fs.promises.rm(tmp, { force: true });
|
|
2100
|
+
}
|
|
2101
|
+
}
|
|
2102
|
+
async function saveSessionStore(storePath, store, opts) {
|
|
2103
|
+
await withSessionStoreLock(storePath, async () => {
|
|
2104
|
+
await saveSessionStoreUnlocked(storePath, store, opts);
|
|
2105
|
+
});
|
|
2106
|
+
}
|
|
2107
|
+
async function updateSessionStore(storePath, mutator, opts) {
|
|
2108
|
+
return await withSessionStoreLock(storePath, async () => {
|
|
2109
|
+
const store = loadSessionStore(storePath, { skipCache: true });
|
|
2110
|
+
const result = await mutator(store);
|
|
2111
|
+
await saveSessionStoreUnlocked(storePath, store, opts);
|
|
2112
|
+
return result;
|
|
2113
|
+
});
|
|
2114
|
+
}
|
|
2115
|
+
const LOCK_QUEUES = /* @__PURE__ */ new Map();
|
|
2116
|
+
function lockTimeoutError(storePath) {
|
|
2117
|
+
return /* @__PURE__ */ new Error(`timeout waiting for session store lock: ${storePath}`);
|
|
2118
|
+
}
|
|
2119
|
+
function getOrCreateLockQueue(storePath) {
|
|
2120
|
+
const existing = LOCK_QUEUES.get(storePath);
|
|
2121
|
+
if (existing) return existing;
|
|
2122
|
+
const created = {
|
|
2123
|
+
running: false,
|
|
2124
|
+
pending: []
|
|
2125
|
+
};
|
|
2126
|
+
LOCK_QUEUES.set(storePath, created);
|
|
2127
|
+
return created;
|
|
2128
|
+
}
|
|
2129
|
+
async function drainSessionStoreLockQueue(storePath) {
|
|
2130
|
+
const queue = LOCK_QUEUES.get(storePath);
|
|
2131
|
+
if (!queue || queue.running) return;
|
|
2132
|
+
queue.running = true;
|
|
2133
|
+
try {
|
|
2134
|
+
while (queue.pending.length > 0) {
|
|
2135
|
+
const task = queue.pending.shift();
|
|
2136
|
+
if (!task) continue;
|
|
2137
|
+
const remainingTimeoutMs = task.timeoutMs ?? Number.POSITIVE_INFINITY;
|
|
2138
|
+
if (task.timeoutMs != null && remainingTimeoutMs <= 0) {
|
|
2139
|
+
task.reject(lockTimeoutError(storePath));
|
|
2140
|
+
continue;
|
|
2141
|
+
}
|
|
2142
|
+
let lock;
|
|
2143
|
+
let result;
|
|
2144
|
+
let failed;
|
|
2145
|
+
let hasFailure = false;
|
|
2146
|
+
try {
|
|
2147
|
+
lock = await acquireSessionWriteLock({
|
|
2148
|
+
sessionFile: storePath,
|
|
2149
|
+
timeoutMs: remainingTimeoutMs,
|
|
2150
|
+
staleMs: task.staleMs
|
|
2151
|
+
});
|
|
2152
|
+
result = await task.fn();
|
|
2153
|
+
} catch (err) {
|
|
2154
|
+
hasFailure = true;
|
|
2155
|
+
failed = err;
|
|
2156
|
+
} finally {
|
|
2157
|
+
await lock?.release().catch(() => void 0);
|
|
2158
|
+
}
|
|
2159
|
+
if (hasFailure) {
|
|
2160
|
+
task.reject(failed);
|
|
2161
|
+
continue;
|
|
2162
|
+
}
|
|
2163
|
+
task.resolve(result);
|
|
2164
|
+
}
|
|
2165
|
+
} finally {
|
|
2166
|
+
queue.running = false;
|
|
2167
|
+
if (queue.pending.length === 0) LOCK_QUEUES.delete(storePath);
|
|
2168
|
+
else queueMicrotask(() => {
|
|
2169
|
+
drainSessionStoreLockQueue(storePath);
|
|
2170
|
+
});
|
|
2171
|
+
}
|
|
2172
|
+
}
|
|
2173
|
+
async function withSessionStoreLock(storePath, fn, opts = {}) {
|
|
2174
|
+
if (!storePath || typeof storePath !== "string") throw new Error(`withSessionStoreLock: storePath must be a non-empty string, got ${JSON.stringify(storePath)}`);
|
|
2175
|
+
const timeoutMs = opts.timeoutMs ?? 1e4;
|
|
2176
|
+
const staleMs = opts.staleMs ?? 3e4;
|
|
2177
|
+
opts.pollIntervalMs;
|
|
2178
|
+
const hasTimeout = timeoutMs > 0 && Number.isFinite(timeoutMs);
|
|
2179
|
+
const queue = getOrCreateLockQueue(storePath);
|
|
2180
|
+
return await new Promise((resolve, reject) => {
|
|
2181
|
+
const task = {
|
|
2182
|
+
fn: async () => await fn(),
|
|
2183
|
+
resolve: (value) => resolve(value),
|
|
2184
|
+
reject,
|
|
2185
|
+
timeoutMs: hasTimeout ? timeoutMs : void 0,
|
|
2186
|
+
staleMs
|
|
2187
|
+
};
|
|
2188
|
+
queue.pending.push(task);
|
|
2189
|
+
drainSessionStoreLockQueue(storePath);
|
|
2190
|
+
});
|
|
2191
|
+
}
|
|
2192
|
+
async function updateSessionStoreEntry(params) {
|
|
2193
|
+
const { storePath, sessionKey, update } = params;
|
|
2194
|
+
return await withSessionStoreLock(storePath, async () => {
|
|
2195
|
+
const store = loadSessionStore(storePath, { skipCache: true });
|
|
2196
|
+
const resolved = resolveStoreSessionEntry({
|
|
2197
|
+
store,
|
|
2198
|
+
sessionKey
|
|
2199
|
+
});
|
|
2200
|
+
const existing = resolved.existing;
|
|
2201
|
+
if (!existing) return null;
|
|
2202
|
+
const patch = await update(existing);
|
|
2203
|
+
if (!patch) return existing;
|
|
2204
|
+
const next = mergeSessionEntry(existing, patch);
|
|
2205
|
+
store[resolved.normalizedKey] = next;
|
|
2206
|
+
for (const legacyKey of resolved.legacyKeys) delete store[legacyKey];
|
|
2207
|
+
await saveSessionStoreUnlocked(storePath, store, { activeSessionKey: resolved.normalizedKey });
|
|
2208
|
+
return next;
|
|
2209
|
+
});
|
|
2210
|
+
}
|
|
2211
|
+
async function recordSessionMetaFromInbound(params) {
|
|
2212
|
+
const { storePath, sessionKey, ctx } = params;
|
|
2213
|
+
const createIfMissing = params.createIfMissing ?? true;
|
|
2214
|
+
return await updateSessionStore(storePath, (store) => {
|
|
2215
|
+
const resolved = resolveStoreSessionEntry({
|
|
2216
|
+
store,
|
|
2217
|
+
sessionKey
|
|
2218
|
+
});
|
|
2219
|
+
const existing = resolved.existing;
|
|
2220
|
+
const patch = deriveSessionMetaPatch({
|
|
2221
|
+
ctx,
|
|
2222
|
+
sessionKey: resolved.normalizedKey,
|
|
2223
|
+
existing,
|
|
2224
|
+
groupResolution: params.groupResolution
|
|
2225
|
+
});
|
|
2226
|
+
if (!patch) {
|
|
2227
|
+
if (existing && resolved.legacyKeys.length > 0) {
|
|
2228
|
+
store[resolved.normalizedKey] = existing;
|
|
2229
|
+
for (const legacyKey of resolved.legacyKeys) delete store[legacyKey];
|
|
2230
|
+
}
|
|
2231
|
+
return existing ?? null;
|
|
2232
|
+
}
|
|
2233
|
+
if (!existing && !createIfMissing) return null;
|
|
2234
|
+
const next = mergeSessionEntry(existing, patch);
|
|
2235
|
+
store[resolved.normalizedKey] = next;
|
|
2236
|
+
for (const legacyKey of resolved.legacyKeys) delete store[legacyKey];
|
|
2237
|
+
return next;
|
|
2238
|
+
}, { activeSessionKey: normalizeStoreSessionKey(sessionKey) });
|
|
2239
|
+
}
|
|
2240
|
+
async function updateLastRoute(params) {
|
|
2241
|
+
const { storePath, sessionKey, channel, to, accountId, threadId, ctx } = params;
|
|
2242
|
+
return await withSessionStoreLock(storePath, async () => {
|
|
2243
|
+
const store = loadSessionStore(storePath);
|
|
2244
|
+
const resolved = resolveStoreSessionEntry({
|
|
2245
|
+
store,
|
|
2246
|
+
sessionKey
|
|
2247
|
+
});
|
|
2248
|
+
const existing = resolved.existing;
|
|
2249
|
+
const now = Date.now();
|
|
2250
|
+
const explicitContext = normalizeDeliveryContext(params.deliveryContext);
|
|
2251
|
+
const inlineContext = normalizeDeliveryContext({
|
|
2252
|
+
channel,
|
|
2253
|
+
to,
|
|
2254
|
+
accountId,
|
|
2255
|
+
threadId
|
|
2256
|
+
});
|
|
2257
|
+
const mergedInput = mergeDeliveryContext(explicitContext, inlineContext);
|
|
2258
|
+
const explicitDeliveryContext = params.deliveryContext;
|
|
2259
|
+
const explicitThreadValue = (explicitDeliveryContext != null && Object.prototype.hasOwnProperty.call(explicitDeliveryContext, "threadId") ? explicitDeliveryContext.threadId : void 0) ?? (threadId != null && threadId !== "" ? threadId : void 0);
|
|
2260
|
+
const merged = mergeDeliveryContext(mergedInput, Boolean(explicitContext?.channel || explicitContext?.to || inlineContext?.channel || inlineContext?.to) && explicitThreadValue == null ? removeThreadFromDeliveryContext(deliveryContextFromSession(existing)) : deliveryContextFromSession(existing));
|
|
2261
|
+
const normalized = normalizeSessionDeliveryFields({ deliveryContext: {
|
|
2262
|
+
channel: merged?.channel,
|
|
2263
|
+
to: merged?.to,
|
|
2264
|
+
accountId: merged?.accountId,
|
|
2265
|
+
threadId: merged?.threadId
|
|
2266
|
+
} });
|
|
2267
|
+
const metaPatch = ctx ? deriveSessionMetaPatch({
|
|
2268
|
+
ctx,
|
|
2269
|
+
sessionKey: resolved.normalizedKey,
|
|
2270
|
+
existing,
|
|
2271
|
+
groupResolution: params.groupResolution
|
|
2272
|
+
}) : null;
|
|
2273
|
+
const basePatch = {
|
|
2274
|
+
updatedAt: Math.max(existing?.updatedAt ?? 0, now),
|
|
2275
|
+
deliveryContext: normalized.deliveryContext,
|
|
2276
|
+
lastChannel: normalized.lastChannel,
|
|
2277
|
+
lastTo: normalized.lastTo,
|
|
2278
|
+
lastAccountId: normalized.lastAccountId,
|
|
2279
|
+
lastThreadId: normalized.lastThreadId
|
|
2280
|
+
};
|
|
2281
|
+
const next = mergeSessionEntry(existing, metaPatch ? {
|
|
2282
|
+
...basePatch,
|
|
2283
|
+
...metaPatch
|
|
2284
|
+
} : basePatch);
|
|
2285
|
+
store[resolved.normalizedKey] = next;
|
|
2286
|
+
for (const legacyKey of resolved.legacyKeys) delete store[legacyKey];
|
|
2287
|
+
await saveSessionStoreUnlocked(storePath, store, { activeSessionKey: resolved.normalizedKey });
|
|
2288
|
+
return next;
|
|
2289
|
+
});
|
|
2290
|
+
}
|
|
2291
|
+
|
|
2292
|
+
//#endregion
|
|
2293
|
+
//#region src/sessions/transcript-events.ts
|
|
2294
|
+
const SESSION_TRANSCRIPT_LISTENERS = /* @__PURE__ */ new Set();
|
|
2295
|
+
function emitSessionTranscriptUpdate(sessionFile) {
|
|
2296
|
+
const trimmed = sessionFile.trim();
|
|
2297
|
+
if (!trimmed) return;
|
|
2298
|
+
const update = { sessionFile: trimmed };
|
|
2299
|
+
for (const listener of SESSION_TRANSCRIPT_LISTENERS) listener(update);
|
|
2300
|
+
}
|
|
2301
|
+
|
|
2302
|
+
//#endregion
|
|
2303
|
+
//#region src/config/sessions/constants.ts
|
|
2304
|
+
/** Session transcript format version (matches pi-coding-agent SessionManager v3 layout). */
|
|
2305
|
+
const CURRENT_SESSION_VERSION = 3;
|
|
2306
|
+
|
|
2307
|
+
//#endregion
|
|
2308
|
+
//#region src/config/sessions/session-file.ts
|
|
2309
|
+
async function resolveAndPersistSessionFile(params) {
|
|
2310
|
+
const { sessionId, sessionKey, sessionStore, storePath } = params;
|
|
2311
|
+
const baseEntry = params.sessionEntry ?? sessionStore[sessionKey] ?? {
|
|
2312
|
+
sessionId,
|
|
2313
|
+
updatedAt: Date.now()
|
|
2314
|
+
};
|
|
2315
|
+
const fallbackSessionFile = params.fallbackSessionFile?.trim();
|
|
2316
|
+
const sessionFile = resolveSessionFilePath(sessionId, !baseEntry.sessionFile && fallbackSessionFile ? {
|
|
2317
|
+
...baseEntry,
|
|
2318
|
+
sessionFile: fallbackSessionFile
|
|
2319
|
+
} : baseEntry, {
|
|
2320
|
+
agentId: params.agentId,
|
|
2321
|
+
sessionsDir: params.sessionsDir
|
|
2322
|
+
});
|
|
2323
|
+
const persistedEntry = {
|
|
2324
|
+
...baseEntry,
|
|
2325
|
+
sessionId,
|
|
2326
|
+
updatedAt: Date.now(),
|
|
2327
|
+
sessionFile
|
|
2328
|
+
};
|
|
2329
|
+
if (baseEntry.sessionId !== sessionId || baseEntry.sessionFile !== sessionFile) {
|
|
2330
|
+
sessionStore[sessionKey] = persistedEntry;
|
|
2331
|
+
await updateSessionStore(storePath, (store) => {
|
|
2332
|
+
store[sessionKey] = {
|
|
2333
|
+
...store[sessionKey],
|
|
2334
|
+
...persistedEntry
|
|
2335
|
+
};
|
|
2336
|
+
}, params.activeSessionKey ? { activeSessionKey: params.activeSessionKey } : void 0);
|
|
2337
|
+
return {
|
|
2338
|
+
sessionFile,
|
|
2339
|
+
sessionEntry: persistedEntry
|
|
2340
|
+
};
|
|
2341
|
+
}
|
|
2342
|
+
sessionStore[sessionKey] = persistedEntry;
|
|
2343
|
+
return {
|
|
2344
|
+
sessionFile,
|
|
2345
|
+
sessionEntry: persistedEntry
|
|
2346
|
+
};
|
|
2347
|
+
}
|
|
2348
|
+
|
|
2349
|
+
//#endregion
|
|
2350
|
+
//#region src/config/sessions/transcript.ts
|
|
2351
|
+
function stripQuery(value) {
|
|
2352
|
+
const noHash = value.split("#")[0] ?? value;
|
|
2353
|
+
return noHash.split("?")[0] ?? noHash;
|
|
2354
|
+
}
|
|
2355
|
+
function extractFileNameFromMediaUrl(value) {
|
|
2356
|
+
const trimmed = value.trim();
|
|
2357
|
+
if (!trimmed) return null;
|
|
2358
|
+
const cleaned = stripQuery(trimmed);
|
|
2359
|
+
try {
|
|
2360
|
+
const parsed = new URL(cleaned);
|
|
2361
|
+
const base = path.basename(parsed.pathname);
|
|
2362
|
+
if (!base) return null;
|
|
2363
|
+
try {
|
|
2364
|
+
return decodeURIComponent(base);
|
|
2365
|
+
} catch {
|
|
2366
|
+
return base;
|
|
2367
|
+
}
|
|
2368
|
+
} catch {
|
|
2369
|
+
const base = path.basename(cleaned);
|
|
2370
|
+
if (!base || base === "/" || base === ".") return null;
|
|
2371
|
+
return base;
|
|
2372
|
+
}
|
|
2373
|
+
}
|
|
2374
|
+
function resolveMirroredTranscriptText(params) {
|
|
2375
|
+
const mediaUrls = params.mediaUrls?.filter((url) => url && url.trim()) ?? [];
|
|
2376
|
+
if (mediaUrls.length > 0) {
|
|
2377
|
+
const names = mediaUrls.map((url) => extractFileNameFromMediaUrl(url)).filter((name) => Boolean(name && name.trim()));
|
|
2378
|
+
if (names.length > 0) return names.join(", ");
|
|
2379
|
+
return "media";
|
|
2380
|
+
}
|
|
2381
|
+
const trimmed = (params.text ?? "").trim();
|
|
2382
|
+
return trimmed ? trimmed : null;
|
|
2383
|
+
}
|
|
2384
|
+
async function ensureSessionHeader(params) {
|
|
2385
|
+
if (fs.existsSync(params.sessionFile)) return;
|
|
2386
|
+
await fs.promises.mkdir(path.dirname(params.sessionFile), { recursive: true });
|
|
2387
|
+
const header = {
|
|
2388
|
+
type: "session",
|
|
2389
|
+
version: CURRENT_SESSION_VERSION,
|
|
2390
|
+
id: params.sessionId,
|
|
2391
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2392
|
+
cwd: process.cwd()
|
|
2393
|
+
};
|
|
2394
|
+
await fs.promises.writeFile(params.sessionFile, `${JSON.stringify(header)}\n`, {
|
|
2395
|
+
encoding: "utf-8",
|
|
2396
|
+
mode: 384
|
|
2397
|
+
});
|
|
2398
|
+
}
|
|
2399
|
+
async function appendAssistantMessageToSessionTranscript(params) {
|
|
2400
|
+
const sessionKey = params.sessionKey.trim();
|
|
2401
|
+
if (!sessionKey) return {
|
|
2402
|
+
ok: false,
|
|
2403
|
+
reason: "missing sessionKey"
|
|
2404
|
+
};
|
|
2405
|
+
const mirrorText = resolveMirroredTranscriptText({
|
|
2406
|
+
text: params.text,
|
|
2407
|
+
mediaUrls: params.mediaUrls
|
|
2408
|
+
});
|
|
2409
|
+
if (!mirrorText) return {
|
|
2410
|
+
ok: false,
|
|
2411
|
+
reason: "empty text"
|
|
2412
|
+
};
|
|
2413
|
+
const storePath = params.storePath ?? resolveDefaultSessionStorePath(params.agentId);
|
|
2414
|
+
const store = loadSessionStore(storePath, { skipCache: true });
|
|
2415
|
+
const entry = store[sessionKey];
|
|
2416
|
+
if (!entry?.sessionId) return {
|
|
2417
|
+
ok: false,
|
|
2418
|
+
reason: `unknown sessionKey: ${sessionKey}`
|
|
2419
|
+
};
|
|
2420
|
+
let sessionFile;
|
|
2421
|
+
try {
|
|
2422
|
+
sessionFile = (await resolveAndPersistSessionFile({
|
|
2423
|
+
sessionId: entry.sessionId,
|
|
2424
|
+
sessionKey,
|
|
2425
|
+
sessionStore: store,
|
|
2426
|
+
storePath,
|
|
2427
|
+
sessionEntry: entry,
|
|
2428
|
+
agentId: params.agentId,
|
|
2429
|
+
sessionsDir: path.dirname(storePath)
|
|
2430
|
+
})).sessionFile;
|
|
2431
|
+
} catch (err) {
|
|
2432
|
+
return {
|
|
2433
|
+
ok: false,
|
|
2434
|
+
reason: err instanceof Error ? err.message : String(err)
|
|
2435
|
+
};
|
|
2436
|
+
}
|
|
2437
|
+
await ensureSessionHeader({
|
|
2438
|
+
sessionFile,
|
|
2439
|
+
sessionId: entry.sessionId
|
|
2440
|
+
});
|
|
2441
|
+
const line = {
|
|
2442
|
+
type: "message",
|
|
2443
|
+
message: {
|
|
2444
|
+
role: "assistant",
|
|
2445
|
+
content: [{
|
|
2446
|
+
type: "text",
|
|
2447
|
+
text: mirrorText
|
|
2448
|
+
}],
|
|
2449
|
+
api: "openai-responses",
|
|
2450
|
+
provider: "remoteclaw",
|
|
2451
|
+
model: "delivery-mirror",
|
|
2452
|
+
usage: {
|
|
2453
|
+
input: 0,
|
|
2454
|
+
output: 0,
|
|
2455
|
+
cacheRead: 0,
|
|
2456
|
+
cacheWrite: 0,
|
|
2457
|
+
totalTokens: 0,
|
|
2458
|
+
cost: {
|
|
2459
|
+
input: 0,
|
|
2460
|
+
output: 0,
|
|
2461
|
+
cacheRead: 0,
|
|
2462
|
+
cacheWrite: 0,
|
|
2463
|
+
total: 0
|
|
2464
|
+
}
|
|
2465
|
+
},
|
|
2466
|
+
stopReason: "stop",
|
|
2467
|
+
timestamp: Date.now()
|
|
2468
|
+
}
|
|
2469
|
+
};
|
|
2470
|
+
await fs.promises.appendFile(sessionFile, `${JSON.stringify(line)}\n`, "utf-8");
|
|
2471
|
+
emitSessionTranscriptUpdate(sessionFile);
|
|
2472
|
+
return {
|
|
2473
|
+
ok: true,
|
|
2474
|
+
sessionFile
|
|
2475
|
+
};
|
|
2476
|
+
}
|
|
2477
|
+
|
|
2478
|
+
//#endregion
|
|
2479
|
+
//#region src/config/sessions/delivery-info.ts
|
|
2480
|
+
/**
|
|
2481
|
+
* Extract deliveryContext and threadId from a sessionKey.
|
|
2482
|
+
* Supports both :thread: (most channels) and :topic: (Telegram).
|
|
2483
|
+
*/
|
|
2484
|
+
function parseSessionThreadInfo(sessionKey) {
|
|
2485
|
+
if (!sessionKey) return {
|
|
2486
|
+
baseSessionKey: void 0,
|
|
2487
|
+
threadId: void 0
|
|
2488
|
+
};
|
|
2489
|
+
const topicIndex = sessionKey.lastIndexOf(":topic:");
|
|
2490
|
+
const threadIndex = sessionKey.lastIndexOf(":thread:");
|
|
2491
|
+
const markerIndex = Math.max(topicIndex, threadIndex);
|
|
2492
|
+
const marker = topicIndex > threadIndex ? ":topic:" : ":thread:";
|
|
2493
|
+
return {
|
|
2494
|
+
baseSessionKey: markerIndex === -1 ? sessionKey : sessionKey.slice(0, markerIndex),
|
|
2495
|
+
threadId: (markerIndex === -1 ? void 0 : sessionKey.slice(markerIndex + marker.length))?.trim() || void 0
|
|
2496
|
+
};
|
|
2497
|
+
}
|
|
2498
|
+
function extractDeliveryInfo(sessionKey) {
|
|
2499
|
+
const { baseSessionKey, threadId } = parseSessionThreadInfo(sessionKey);
|
|
2500
|
+
if (!sessionKey || !baseSessionKey) return {
|
|
2501
|
+
deliveryContext: void 0,
|
|
2502
|
+
threadId
|
|
2503
|
+
};
|
|
2504
|
+
let deliveryContext;
|
|
2505
|
+
try {
|
|
2506
|
+
const store = loadSessionStore(resolveStorePath(loadConfig().session?.store));
|
|
2507
|
+
let entry = store[sessionKey];
|
|
2508
|
+
if (!entry?.deliveryContext && baseSessionKey !== sessionKey) entry = store[baseSessionKey];
|
|
2509
|
+
if (entry?.deliveryContext) deliveryContext = {
|
|
2510
|
+
channel: entry.deliveryContext.channel,
|
|
2511
|
+
to: entry.deliveryContext.to,
|
|
2512
|
+
accountId: entry.deliveryContext.accountId
|
|
2513
|
+
};
|
|
2514
|
+
} catch {}
|
|
2515
|
+
return {
|
|
2516
|
+
deliveryContext,
|
|
2517
|
+
threadId
|
|
2518
|
+
};
|
|
2519
|
+
}
|
|
2520
|
+
|
|
2521
|
+
//#endregion
|
|
2522
|
+
//#region src/config/sessions.ts
|
|
2523
|
+
var sessions_exports = /* @__PURE__ */ __exportAll({
|
|
2524
|
+
DEFAULT_IDLE_MINUTES: () => DEFAULT_IDLE_MINUTES,
|
|
2525
|
+
DEFAULT_RESET_AT_HOUR: () => DEFAULT_RESET_AT_HOUR,
|
|
2526
|
+
DEFAULT_RESET_MODE: () => DEFAULT_RESET_MODE,
|
|
2527
|
+
DEFAULT_RESET_TRIGGER: () => DEFAULT_RESET_TRIGGER,
|
|
2528
|
+
DEFAULT_RESET_TRIGGERS: () => DEFAULT_RESET_TRIGGERS,
|
|
2529
|
+
SAFE_SESSION_ID_RE: () => SAFE_SESSION_ID_RE,
|
|
2530
|
+
appendAssistantMessageToSessionTranscript: () => appendAssistantMessageToSessionTranscript,
|
|
2531
|
+
buildGroupDisplayName: () => buildGroupDisplayName,
|
|
2532
|
+
canonicalizeMainSessionAlias: () => canonicalizeMainSessionAlias,
|
|
2533
|
+
capEntryCount: () => capEntryCount,
|
|
2534
|
+
clearSessionStoreCacheForTest: () => clearSessionStoreCacheForTest,
|
|
2535
|
+
deriveGroupSessionPatch: () => deriveGroupSessionPatch,
|
|
2536
|
+
deriveSessionKey: () => deriveSessionKey,
|
|
2537
|
+
deriveSessionMetaPatch: () => deriveSessionMetaPatch,
|
|
2538
|
+
deriveSessionOrigin: () => deriveSessionOrigin,
|
|
2539
|
+
enforceSessionDiskBudget: () => enforceSessionDiskBudget,
|
|
2540
|
+
evaluateSessionFreshness: () => evaluateSessionFreshness,
|
|
2541
|
+
extractDeliveryInfo: () => extractDeliveryInfo,
|
|
2542
|
+
formatSessionArchiveTimestamp: () => formatSessionArchiveTimestamp,
|
|
2543
|
+
getActiveSessionMaintenanceWarning: () => getActiveSessionMaintenanceWarning,
|
|
2544
|
+
getSessionStoreLockQueueSizeForTest: () => getSessionStoreLockQueueSizeForTest,
|
|
2545
|
+
isPrimarySessionTranscriptFileName: () => isPrimarySessionTranscriptFileName,
|
|
2546
|
+
isSessionArchiveArtifactName: () => isSessionArchiveArtifactName,
|
|
2547
|
+
isSessionTotalTokensFresh: () => isSessionTotalTokensFresh,
|
|
2548
|
+
isThreadSessionKey: () => isThreadSessionKey,
|
|
2549
|
+
loadSessionStore: () => loadSessionStore,
|
|
2550
|
+
mergeSessionEntry: () => mergeSessionEntry,
|
|
2551
|
+
normalizeSessionRuntimeModelFields: () => normalizeSessionRuntimeModelFields,
|
|
2552
|
+
parseSessionArchiveTimestamp: () => parseSessionArchiveTimestamp,
|
|
2553
|
+
parseSessionThreadInfo: () => parseSessionThreadInfo,
|
|
2554
|
+
pruneStaleEntries: () => pruneStaleEntries,
|
|
2555
|
+
readSessionUpdatedAt: () => readSessionUpdatedAt,
|
|
2556
|
+
recordSessionMetaFromInbound: () => recordSessionMetaFromInbound,
|
|
2557
|
+
resolveAgentIdFromSessionKey: () => resolveAgentIdFromSessionKey,
|
|
2558
|
+
resolveAgentMainSessionKey: () => resolveAgentMainSessionKey,
|
|
2559
|
+
resolveAndPersistSessionFile: () => resolveAndPersistSessionFile,
|
|
2560
|
+
resolveChannelResetConfig: () => resolveChannelResetConfig,
|
|
2561
|
+
resolveDailyResetAtMs: () => resolveDailyResetAtMs,
|
|
2562
|
+
resolveDefaultSessionStorePath: () => resolveDefaultSessionStorePath,
|
|
2563
|
+
resolveExplicitAgentSessionKey: () => resolveExplicitAgentSessionKey,
|
|
2564
|
+
resolveFreshSessionTotalTokens: () => resolveFreshSessionTotalTokens,
|
|
2565
|
+
resolveGroupSessionKey: () => resolveGroupSessionKey,
|
|
2566
|
+
resolveMainSessionKey: () => resolveMainSessionKey,
|
|
2567
|
+
resolveMainSessionKeyFromConfig: () => resolveMainSessionKeyFromConfig,
|
|
2568
|
+
resolveMaintenanceConfig: () => resolveMaintenanceConfig,
|
|
2569
|
+
resolveMirroredTranscriptText: () => resolveMirroredTranscriptText,
|
|
2570
|
+
resolveSessionFilePath: () => resolveSessionFilePath,
|
|
2571
|
+
resolveSessionFilePathOptions: () => resolveSessionFilePathOptions,
|
|
2572
|
+
resolveSessionKey: () => resolveSessionKey,
|
|
2573
|
+
resolveSessionResetPolicy: () => resolveSessionResetPolicy,
|
|
2574
|
+
resolveSessionResetType: () => resolveSessionResetType,
|
|
2575
|
+
resolveSessionTranscriptPath: () => resolveSessionTranscriptPath,
|
|
2576
|
+
resolveSessionTranscriptPathInDir: () => resolveSessionTranscriptPathInDir,
|
|
2577
|
+
resolveSessionTranscriptsDir: () => resolveSessionTranscriptsDir,
|
|
2578
|
+
resolveSessionTranscriptsDirForAgent: () => resolveSessionTranscriptsDirForAgent,
|
|
2579
|
+
resolveStorePath: () => resolveStorePath,
|
|
2580
|
+
resolveThreadFlag: () => resolveThreadFlag,
|
|
2581
|
+
rotateSessionFile: () => rotateSessionFile,
|
|
2582
|
+
saveSessionStore: () => saveSessionStore,
|
|
2583
|
+
setSessionRuntimeModel: () => setSessionRuntimeModel,
|
|
2584
|
+
snapshotSessionOrigin: () => snapshotSessionOrigin,
|
|
2585
|
+
updateLastRoute: () => updateLastRoute,
|
|
2586
|
+
updateSessionStore: () => updateSessionStore,
|
|
2587
|
+
updateSessionStoreEntry: () => updateSessionStoreEntry,
|
|
2588
|
+
validateSessionId: () => validateSessionId,
|
|
2589
|
+
withSessionStoreLockForTest: () => withSessionStoreLockForTest
|
|
2590
|
+
});
|
|
2591
|
+
|
|
2592
|
+
//#endregion
|
|
2593
|
+
export { snapshotSessionOrigin as $, readSessionTitleFieldsFromTranscript as A, resolveChannelResetConfig as B, normalizeAccountId as C, cleanupArchivedSessionTranscripts as D, capArrayByJsonBytes as E, stripInlineDirectiveTagsForDisplay as F, resolveFreshSessionTotalTokens as G, resolveSessionResetType as H, stripInlineDirectiveTagsFromMessageForDisplay as I, resolveAgentMainSessionKey as J, setSessionRuntimeModel as K, cleanStaleLockFiles as L, stripEnvelopeFromMessage as M, stripEnvelopeFromMessages as N, readSessionMessages as O, parseInlineDirectives as P, deriveSessionMetaPatch as Q, resolveSessionKey as R, normalizeSessionDeliveryFields as S, archiveSessionTranscripts as T, resolveThreadFlag as U, resolveSessionResetPolicy as V, DEFAULT_RESET_TRIGGERS as W, resolveMainSessionKey as X, resolveExplicitAgentSessionKey as Y, resolveMainSessionKeyFromConfig as Z, updateSessionStoreEntry as _, resolveMirroredTranscriptText as a, mergeDeliveryContext as b, capEntryCount as c, readSessionUpdatedAt as d, formatSessionArchiveTimestamp as et, recordSessionMetaFromInbound as f, updateSessionStore as g, updateLastRoute as h, appendAssistantMessageToSessionTranscript as i, resolveSessionTranscriptCandidates as j, readSessionPreviewItemsFromTranscript as k, loadSessionStore as l, saveSessionStore as m, extractDeliveryInfo as n, buildGroupDisplayName as nt, resolveAndPersistSessionFile as o, resolveMaintenanceConfig as p, canonicalizeMainSessionAlias as q, parseSessionThreadInfo as r, resolveGroupSessionKey as rt, CURRENT_SESSION_VERSION as s, sessions_exports as t, isPrimarySessionTranscriptFileName as tt, pruneStaleEntries as u, enforceSessionDiskBudget as v, archiveFileOnDisk as w, normalizeDeliveryContext as x, deliveryContextFromSession as y, evaluateSessionFreshness as z };
|