@gaodefa/daocore 2026.5.25 → 2026.5.26
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/dist/abort-By0wxKlI.js +277 -0
- package/dist/abort.runtime-C7zfjxBp.js +2 -0
- package/dist/abort.runtime.js +1 -1
- package/dist/account-inspect-DTeLlJz-.js +173 -0
- package/dist/accounts-B776XBaL.js +119 -0
- package/dist/accounts-CLyZILFF.js +107 -0
- package/dist/accounts-DiXgq14W.js +107 -0
- package/dist/accounts-iTlRLYN8.js +2 -0
- package/dist/acp/control-plane/manager.d.ts +2 -1
- package/dist/acp-runtime-D9YQyGax.js +26 -0
- package/dist/acp-spawn-CWciV70C.js +1275 -0
- package/dist/acp-spawn-DjaS4O_V.js +2 -0
- package/dist/acp-stateful-target-driver-ByvGCj_i.js +89 -0
- package/dist/action-kill-DXeOA6YH.js +33 -0
- package/dist/action-runtime-BjQnG6qb.js +469 -0
- package/dist/action-runtime-api-a73ODsYk.js +2 -0
- package/dist/action-send-B_F3xwIu.js +39 -0
- package/dist/action-spawn-BFiW7gZJ.js +47 -0
- package/dist/actions-Bi7eE2I6.js +161 -0
- package/dist/actions.runtime-DmtbCLld.js +5 -0
- package/dist/agent-BOI4AdYK.js +3 -0
- package/dist/agent-DQPyDWP5.js +2 -0
- package/dist/agent-command-ClCxEw82.js +1367 -0
- package/dist/agent-command-DKqx29vm.d.ts +105 -0
- package/dist/agent-components.runtime-C5wxy4D_.js +10 -0
- package/dist/agent-components.runtime.js +1 -1
- package/dist/agent-harness-BsBVO7nU.d.ts +146 -0
- package/dist/agent-harness-runtime-CkdXIMHI.js +180 -0
- package/dist/agent-harness-runtime-KHFO733B.d.ts +691 -0
- package/dist/agent-harness-task-runtime-CDtn5RjX.js +140 -0
- package/dist/agent-runner-execution-lXW8y0i2.js +1713 -0
- package/dist/agent-runner-utils-OdM9hLGt.js +266 -0
- package/dist/agent-runner.runtime-fZnfhCJI.js +3455 -0
- package/dist/agent-runner.runtime.js +1 -1
- package/dist/agent-runtime-Dp0RDnX1.js +229 -0
- package/dist/agent-via-gateway-vsBf3nqZ.js +463 -0
- package/dist/agents/pi-embedded-runner/tool-split.d.ts +1 -1
- package/dist/agents.commands.add-C94vGOFH.js +304 -0
- package/dist/agents.commands.delete-D-p2NL4v.js +128 -0
- package/dist/api-BZ2QC7WM.js +2 -0
- package/dist/api-BmYK5Dge.js +6 -0
- package/dist/api-CGdlHCIH.js +3 -0
- package/dist/api-CGjlsXii.js +134 -0
- package/dist/api-DGqp6wZo.js +2 -0
- package/dist/api-DKpE-zdY.js +639 -0
- package/dist/api-DNyivJXK.d.ts +52 -0
- package/dist/apply-GK4z5lYw.js +54 -0
- package/dist/apply-_yxsBkiR.js +41 -0
- package/dist/approval-handler.runtime-C7d9p3DG.js +130 -0
- package/dist/assistant-B-h25aRy.js +291 -0
- package/dist/attachment-normalize-DWZ4Nrn-.js +225 -0
- package/dist/attempt-execution-BY9C1EOu.js +558 -0
- package/dist/attempt-execution.runtime-SR7eolDa.js +3 -0
- package/dist/attempt-execution.runtime.js +1 -1
- package/dist/attempt-execution.shared-h6uYmkJz.js +38 -0
- package/dist/attempt.prompt-helpers-COc5m_TZ.js +475 -0
- package/dist/attempt.tool-run-context-CAtfgOqC.js +2094 -0
- package/dist/auth-BdkNYTYU.js +541 -0
- package/dist/banner-0TOO6XHd.js +397 -0
- package/dist/banner-DTHug6Ey.js +2 -0
- package/dist/binding-routing-BJ_A83Nl.js +113 -0
- package/dist/binding-targets-D5dmPh4R.js +121 -0
- package/dist/bot-DX1uG3P-.js +7894 -0
- package/dist/bot-deps-BpaYejaN.js +2 -0
- package/dist/bot-deps-CKFDy5y3.js +747 -0
- package/dist/bot-message-context.runtime-BKOeRg34.js +7 -0
- package/dist/bot-message-context.runtime.js +1 -1
- package/dist/bot-message-context.session.runtime-xgZdFv6P.js +12 -0
- package/dist/bot-message-context.session.runtime.js +1 -1
- package/dist/bot-native-commands.delivery.runtime-DDMQrRfJ.js +4 -0
- package/dist/bot-native-commands.delivery.runtime.js +1 -1
- package/dist/bot-native-commands.runtime-CVVvUz0h.js +13 -0
- package/dist/bot-native-commands.runtime.js +1 -1
- package/dist/bridge-server-37OWsDZc.js +113 -0
- package/dist/browser-cli-BC_6aZJV.js +2 -0
- package/dist/browser-cli-Dg1ipmgf.js +230 -0
- package/dist/browser-cli-actions-input-B0QuzzSW.js +473 -0
- package/dist/browser-cli-actions-observe-C246bas5.js +81 -0
- package/dist/browser-cli-debug-F64e_v4B.js +137 -0
- package/dist/browser-cli-inspect-Srn6eWjO.js +104 -0
- package/dist/browser-cli-manage-CaZ97-Me.js +443 -0
- package/dist/browser-cli-resize-CUR20fvZ.js +26 -0
- package/dist/browser-cli-shared-BhphnFVo.js +50 -0
- package/dist/browser-cli-state-CzaNXNWF.js +337 -0
- package/dist/browser-control-auth-DTY0Wx2B.js +2 -0
- package/dist/browser-profiles-BDGPPDJ7.js +2 -0
- package/dist/browser-runtime-aqBKI8Oi.js +384 -0
- package/dist/build-CG7aTzO9.js +257 -0
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +2 -2
- package/dist/bundled/session-memory/handler.js +1 -1
- package/dist/bundled-channel-config-schema-vrKpzJVf.d.ts +3163 -0
- package/dist/call-Za47o1YZ.d.ts +43 -0
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/capability-cli-BhF26gVm.js +1782 -0
- package/dist/channel-5RHqx1Ge.d.ts +26 -0
- package/dist/channel-5_XS0Mss.js +508 -0
- package/dist/channel-7L-vyWOO.js +362 -0
- package/dist/channel-B07xPK0L.d.ts +114 -0
- package/dist/channel-B9b-GX-e.d.ts +14 -0
- package/dist/channel-BBWX_bA0.d.ts +7 -0
- package/dist/channel-BVxTyJ0I.js +376 -0
- package/dist/channel-BWIsr1r-.js +808 -0
- package/dist/channel-Ba0p4xM-.js +1134 -0
- package/dist/channel-Bi2nTop1.js +481 -0
- package/dist/channel-Bj29iFgF.js +740 -0
- package/dist/channel-Bl8tKAuG.d.ts +427 -0
- package/dist/channel-Bqy7BYGm.d.ts +28 -0
- package/dist/channel-BvzHMdKo.d.ts +8 -0
- package/dist/channel-C6G6-tH6.js +562 -0
- package/dist/channel-CBhuuq-_.js +2126 -0
- package/dist/channel-CMmVpcnl.js +867 -0
- package/dist/channel-COc7idAe.js +653 -0
- package/dist/channel-CcsuLAYt.d.ts +49 -0
- package/dist/channel-CjfuHhSU.js +1556 -0
- package/dist/channel-Cquy73C-.js +1249 -0
- package/dist/channel-Cu7Jxm_X.d.ts +104 -0
- package/dist/channel-CzvuskEn.js +955 -0
- package/dist/channel-D6u-243v.js +1777 -0
- package/dist/channel-DId5JNlc.d.ts +47 -0
- package/dist/channel-DR8PbP31.js +238 -0
- package/dist/channel-DUYRu5km.d.ts +7 -0
- package/dist/channel-DUZ0s98I.js +1496 -0
- package/dist/channel-DXelghSl.d.ts +8 -0
- package/dist/channel-FhfE8D-t.d.ts +6 -0
- package/dist/channel-PEX_yYEO.d.ts +64 -0
- package/dist/channel-aWqPl-K4.d.ts +106 -0
- package/dist/channel-actions.runtime-BzEqt_Va.js +265 -0
- package/dist/channel-actions.runtime.js +1 -1
- package/dist/channel-cSdO0kAq.d.ts +8 -0
- package/dist/channel-core-ClgodQav.d.ts +6 -0
- package/dist/channel-core-DDZnTvT6.js +5 -0
- package/dist/channel-entry-contract-Bzkb_oJX.d.ts +112 -0
- package/dist/channel-inbound-C2wLEE7Q.js +80 -0
- package/dist/channel-lifecycle-DCTZ2J_8.d.ts +126 -0
- package/dist/channel-pairing-pKisqGWj.d.ts +58 -0
- package/dist/channel-plugin-runtime-B8AWkA0i.js +998 -0
- package/dist/channel-plugin-runtime-ntEeH9SC.d.ts +7 -0
- package/dist/channel-runtime-CciKN6E5.js +408 -0
- package/dist/channel-za2kUUnL.d.ts +12 -0
- package/dist/channel.runtime-BQN8Bkb0.js +254 -0
- package/dist/channel.runtime-BXeGEvv7.js +21009 -0
- package/dist/channel.runtime-C40ILulM.js +1008 -0
- package/dist/channel.runtime-CJ2DSojv.js +733 -0
- package/dist/channel.runtime-CUaygROD.js +652 -0
- package/dist/channel.runtime-CcCbJhDb.js +88 -0
- package/dist/channel.runtime-DJbKu9D3.js +4 -0
- package/dist/channel.runtime-DgRuSo5T.js +109 -0
- package/dist/channel.runtime-tRXUD2p2.js +2528 -0
- package/dist/channel.setup-3aVku-g-.js +1098 -0
- package/dist/channel.setup-Cau-V9UT.d.ts +7 -0
- package/dist/channel.setup-DT7Z9egu.js +343 -0
- package/dist/channel.setup-DhlkGTJV.js +10 -0
- package/dist/channel.setup-P5V7jWHY.d.ts +6 -0
- package/dist/channel.setup-x333W0eZ.d.ts +8 -0
- package/dist/chat-D3LWYymW.js +2666 -0
- package/dist/chrome--ATU1T0X.js +1503 -0
- package/dist/cli/run-main.js +9 -9
- package/dist/cli-D8hIXnS1.js +1341 -0
- package/dist/cli-backend-C1JA33SE.d.ts +5 -0
- package/dist/cli-backend-D8WmqNqJ.d.ts +5 -0
- package/dist/cli-compaction-jmi3u2HG.js +347 -0
- package/dist/cli-daS2Mzjd.d.ts +20 -0
- package/dist/cli-metadata-Cy9MEdPv.js +22 -0
- package/dist/cli-runner-DuT8oeZF.js +540 -0
- package/dist/cli-runner-DvKgnkCL.js +2 -0
- package/dist/cli-runner.runtime-B-aD16MD.js +4 -0
- package/dist/cli-runner.runtime-DofcKX1U.js +3 -0
- package/dist/cli-runner.runtime.js +1 -1
- package/dist/cli-shared-BFZytJBA.d.ts +20 -0
- package/dist/cli-startup-metadata.json +13 -13
- package/dist/client-B5IcAlfB.js +650 -0
- package/dist/client-adapter-CXA67h2E.js +897 -0
- package/dist/client-factory-aY6TuKfQ.js +9 -0
- package/dist/command-auth-DS9XgXEG.js +135 -0
- package/dist/command-execution-startup-DQOLt5Sz.js +87 -0
- package/dist/command-handlers-DqxF-IM9.js +1609 -0
- package/dist/command-registry-BSVx1oOc.js +4 -0
- package/dist/command-registry-CsPIOiQ3.js +9 -0
- package/dist/command-registry-core-Bzu5ff5F.js +110 -0
- package/dist/command-status.runtime-MKsizBC-.js +90 -0
- package/dist/command-status.runtime.js +1 -1
- package/dist/commands-B6Y6rqal.d.ts +113 -0
- package/dist/commands-acp-ClJofWty.js +74 -0
- package/dist/commands-compact.runtime-7VqYX4tS.js +10 -0
- package/dist/commands-compact.runtime.js +1 -1
- package/dist/commands-handlers.runtime-Dfqf_Oyp.js +6154 -0
- package/dist/commands-handlers.runtime.js +1 -1
- package/dist/commands-status-CRaEj9Vf.js +16 -0
- package/dist/commands-status-uDaqCP2F.js +3 -0
- package/dist/commands-status.runtime-uDaqCP2F.js +3 -0
- package/dist/commands-status.runtime.js +1 -1
- package/dist/commands-subagents-control.runtime-BaYcGLtc.js +2 -0
- package/dist/commands-subagents-control.runtime-C4xMpLed.js +3 -0
- package/dist/commands-subagents-control.runtime.js +1 -1
- package/dist/commands-system-prompt-C3lzz7wW.js +162 -0
- package/dist/commands-system-prompt-DpiW5FkQ.js +2 -0
- package/dist/commands.runtime-l4fGcB5c.js +176 -0
- package/dist/commands.runtime.js +1 -1
- package/dist/commitments/runtime.js +1 -1
- package/dist/compact-Dq0mi-y_.js +480 -0
- package/dist/compact-voJdoXm-.js +1141 -0
- package/dist/compact.runtime-BNLPSDQQ.js +12 -0
- package/dist/compact.runtime.js +1 -1
- package/dist/completion-cli-qHUelvvd.js +315 -0
- package/dist/computer-use-dP3FCUtq.js +367 -0
- package/dist/config-BDGPPDJ7.js +2 -0
- package/dist/config-Dg3sgjXu.js +373 -0
- package/dist/config-cli-INHPnZOG.js +1633 -0
- package/dist/config-mutations-CAgnXnDt.js +159 -0
- package/dist/config-schema-BkkovNaj.d.ts +20 -0
- package/dist/configure-M1VU0h9O.js +3 -0
- package/dist/configure.commands-CM8RXyn3.js +1251 -0
- package/dist/configure.commands-PvOJd4nu.js +2 -0
- package/dist/context-engine-host-compat-D7I7Q63Z.js +288 -0
- package/dist/context-engine-host-compat-DGHUiQUV.js +2 -0
- package/dist/context-engine-lifecycle-Zsi-S6qy.js +1274 -0
- package/dist/contracts-testkit-Ch7UfUw6.d.ts +145 -0
- package/dist/control-auth-BKUTwIvH.js +114 -0
- package/dist/control-service-CKUzEAa0.js +145 -0
- package/dist/control-ui/assets/agents-CUjpwxUf.js +1008 -0
- package/dist/control-ui/assets/channel-config-extras-Dd4z5RQ8.js +2 -0
- package/dist/control-ui/assets/channels-554ojNKp.js +367 -0
- package/dist/control-ui/assets/cron-BAd2PXq5.js +1013 -0
- package/dist/control-ui/assets/debug-BGCb3cT4.js +97 -0
- package/dist/control-ui/assets/index-BXico1DI.js +7370 -0
- package/dist/control-ui/assets/instances-EkBPy6m3.js +57 -0
- package/dist/control-ui/assets/logs-zcOeZekZ.js +74 -0
- package/dist/control-ui/assets/nodes-BymRwDa6.js +436 -0
- package/dist/control-ui/assets/sessions-C_oSuy7x.js +399 -0
- package/dist/control-ui/assets/skills-BVjEetcV.js +314 -0
- package/dist/control-ui/assets/skills-shared-weS2ZYM5.js +11 -0
- package/dist/control-ui/index.html +1 -1
- package/dist/control-ui/sw.js +1 -1
- package/dist/conversation-binding-runtime-rXAYUZyM.js +4 -0
- package/dist/conversation-runtime-CV0pSg81.js +31 -0
- package/dist/core-BV0irASW.js +282 -0
- package/dist/core-DIjsbXou.d.ts +224 -0
- package/dist/core-api-CyhjZVzn.js +5 -0
- package/dist/core-api-YdHGjff8.js +2 -0
- package/dist/crestodian/crestodian.js +1 -1
- package/dist/crestodian/rescue-message.js +1 -1
- package/dist/crestodian-n5FVHIW5.js +55 -0
- package/dist/daocore-runtime-DhfJoXrT.d.ts +151 -0
- package/dist/daocore-tools-CXDZ1Xhe.js +11727 -0
- package/dist/dashboard-CeQV6L1K.js +263 -0
- package/dist/delivery-D7LfafSk.js +1002 -0
- package/dist/dev-BSY4rs1s.js +97 -0
- package/dist/dialogue-DWFnjTiN.js +37 -0
- package/dist/dir-fetch-tool-BnlEyfZh.js +565 -0
- package/dist/dir-list-tool-Blhg_vTH.js +100 -0
- package/dist/direct-dm-DJPIaf5J.js +64 -0
- package/dist/directive-handling.fast-lane-DGV6PZYZ.js +68 -0
- package/dist/directive-handling.impl-CTDwclQa.js +818 -0
- package/dist/directive-handling.impl-_zI0_GsT.js +2 -0
- package/dist/directive-handling.model-selection-C8lG4FHQ.js +122 -0
- package/dist/directive-handling.persist.runtime-CmLb1evR.js +263 -0
- package/dist/directive-handling.persist.runtime.js +1 -1
- package/dist/dispatch-DvZRbIrc.js +1640 -0
- package/dist/dispatch-acp-transcript.runtime-PehNIsnR.js +40 -0
- package/dist/dispatch-acp-transcript.runtime.js +1 -1
- package/dist/dispatch-acp.runtime-Dg8ft-Ve.js +18 -0
- package/dist/dispatch-acp.runtime.js +1 -1
- package/dist/doctor-DJFM3lrT.js +6 -0
- package/dist/doctor-_ob4EiVf.js +2 -0
- package/dist/doctor-config-flow-D6iEk-en.js +1741 -0
- package/dist/doctor-core-checks-CCfWWL1-.js +573 -0
- package/dist/doctor-core-checks-CqkHUVcZ.js +2 -0
- package/dist/doctor-health-CrNPft4G.js +65 -0
- package/dist/doctor-health-contributions-Bwu5M_GQ.js +696 -0
- package/dist/doctor-lint-B2Wb_jEn.js +94 -0
- package/dist/doctor-prompter-cXq7RExi.js +58 -0
- package/dist/doctor-state-integrity-DfYyVFbQ.js +1231 -0
- package/dist/dynamic-tools-CbHsYkuk.js +486 -0
- package/dist/embedded-backend-IYuqoxzv.js +579 -0
- package/dist/embedded-gateway-stub.runtime-BjJ_93Pp.js +12 -0
- package/dist/embedded-gateway-stub.runtime.js +1 -1
- package/dist/embedding-provider-B50jxKn8.d.ts +65 -0
- package/dist/embedding-provider-DOktf4gm.d.ts +21 -0
- package/dist/embedding-provider-DZOjws8e.d.ts +16 -0
- package/dist/entry.d.ts +1 -1
- package/dist/entry.js +1 -1
- package/dist/exec-approvals-VjIKwFog.js +149 -0
- package/dist/extensionAPI.js +1 -1
- package/dist/extensions/active-memory/index.d.ts +1 -1
- package/dist/extensions/active-memory/index.js +1 -1
- package/dist/extensions/admin-http-rpc/index.d.ts +1 -1
- package/dist/extensions/admin-http-rpc/index.js +1 -1
- package/dist/extensions/alibaba/index.d.ts +1 -1
- package/dist/extensions/anthropic/api.d.ts +3 -3
- package/dist/extensions/anthropic/cli-backend-api.d.ts +2 -2
- package/dist/extensions/anthropic/cli-backend.d.ts +1 -1
- package/dist/extensions/anthropic/cli-migration.d.ts +1 -1
- package/dist/extensions/anthropic/cli-shared.d.ts +1 -1
- package/dist/extensions/anthropic/contract-api.d.ts +1 -1
- package/dist/extensions/anthropic/index.d.ts +1 -1
- package/dist/extensions/anthropic/provider-contract-api.d.ts +1 -1
- package/dist/extensions/anthropic/provider-discovery.d.ts +1 -1
- package/dist/extensions/anthropic/provider-policy-api.d.ts +1 -1
- package/dist/extensions/anthropic/register.runtime.d.ts +1 -1
- package/dist/extensions/anthropic/replay-policy.d.ts +1 -1
- package/dist/extensions/anthropic/setup-api.d.ts +1 -1
- package/dist/extensions/anthropic/stream-wrappers.d.ts +1 -1
- package/dist/extensions/anthropic/test-api.d.ts +2 -2
- package/dist/extensions/arcee/index.d.ts +1 -1
- package/dist/extensions/azure-speech/index.d.ts +1 -1
- package/dist/extensions/azure-speech/speech-provider.d.ts +1 -1
- package/dist/extensions/bonjour/index.d.ts +1 -1
- package/dist/extensions/browser/browser-bridge.js +1 -1
- package/dist/extensions/browser/browser-config.js +4 -4
- package/dist/extensions/browser/browser-control-auth.js +2 -2
- package/dist/extensions/browser/browser-doctor.js +2 -2
- package/dist/extensions/browser/browser-maintenance.js +1 -1
- package/dist/extensions/browser/browser-profiles.js +2 -2
- package/dist/extensions/browser/browser-runtime-api.js +11 -11
- package/dist/extensions/browser/cli-metadata.d.ts +1 -1
- package/dist/extensions/browser/cli-metadata.js +1 -1
- package/dist/extensions/browser/index.d.ts +1 -1
- package/dist/extensions/browser/index.js +1 -1
- package/dist/extensions/browser/plugin-registration.d.ts +1 -1
- package/dist/extensions/browser/plugin-registration.js +1 -1
- package/dist/extensions/browser/register.runtime.d.ts +2 -2
- package/dist/extensions/browser/register.runtime.js +4 -4
- package/dist/extensions/browser/runtime-api.d.ts +3 -3
- package/dist/extensions/browser/runtime-api.js +13 -13
- package/dist/extensions/browser/setup-api.d.ts +1 -1
- package/dist/extensions/byteplus/index.d.ts +1 -1
- package/dist/extensions/byteplus/provider-discovery.d.ts +1 -1
- package/dist/extensions/canvas/cli-metadata.d.ts +1 -1
- package/dist/extensions/canvas/index.d.ts +1 -1
- package/dist/extensions/canvas/index.js +1 -1
- package/dist/extensions/canvas/runtime-api.d.ts +2 -2
- package/dist/extensions/canvas/setup-api.d.ts +1 -1
- package/dist/extensions/cerebras/index.d.ts +1 -1
- package/dist/extensions/chutes/index.d.ts +1 -1
- package/dist/extensions/clickclack/api.d.ts +2 -2
- package/dist/extensions/clickclack/api.js +2 -2
- package/dist/extensions/clickclack/channel-plugin-api.d.ts +1 -1
- package/dist/extensions/clickclack/channel-plugin-api.js +1 -1
- package/dist/extensions/clickclack/index.d.ts +2 -2
- package/dist/extensions/clickclack/runtime-api.d.ts +2 -2
- package/dist/extensions/clickclack/runtime-api.js +2 -2
- package/dist/extensions/cloudflare-ai-gateway/index.d.ts +1 -1
- package/dist/extensions/cloudflare-ai-gateway/stream-wrappers.d.ts +1 -1
- package/dist/extensions/comfy/index.d.ts +1 -1
- package/dist/extensions/copilot-proxy/index.d.ts +1 -1
- package/dist/extensions/copilot-proxy/runtime-api.d.ts +2 -2
- package/dist/extensions/deepgram/index.d.ts +1 -1
- package/dist/extensions/deepgram/realtime-transcription-provider.d.ts +1 -1
- package/dist/extensions/deepgram/test-api.d.ts +1 -1
- package/dist/extensions/deepinfra/api.d.ts +2 -2
- package/dist/extensions/deepinfra/embedding-provider.d.ts +1 -1
- package/dist/extensions/deepinfra/index.d.ts +1 -1
- package/dist/extensions/deepinfra/memory-embedding-adapter.d.ts +1 -1
- package/dist/extensions/deepinfra/speech-provider.d.ts +1 -1
- package/dist/extensions/deepseek/api.d.ts +1 -1
- package/dist/extensions/deepseek/index.d.ts +1 -1
- package/dist/extensions/deepseek/provider-discovery.d.ts +1 -1
- package/dist/extensions/deepseek/provider-policy-api.d.ts +1 -1
- package/dist/extensions/deepseek/stream.d.ts +1 -1
- package/dist/extensions/deepseek/thinking.d.ts +1 -1
- package/dist/extensions/device-pair/api.d.ts +3 -3
- package/dist/extensions/device-pair/api.js +1 -1
- package/dist/extensions/device-pair/index.d.ts +1 -1
- package/dist/extensions/device-pair/notify.d.ts +1 -1
- package/dist/extensions/device-pair/pair-command-approve.js +1 -1
- package/dist/extensions/document-extract/index.d.ts +1 -1
- package/dist/extensions/duckduckgo/index.d.ts +1 -1
- package/dist/extensions/elevenlabs/index.d.ts +1 -1
- package/dist/extensions/elevenlabs/realtime-transcription-provider.d.ts +1 -1
- package/dist/extensions/elevenlabs/setup-api.d.ts +1 -1
- package/dist/extensions/elevenlabs/speech-provider.d.ts +1 -1
- package/dist/extensions/elevenlabs/test-api.d.ts +2 -2
- package/dist/extensions/exa/index.d.ts +1 -1
- package/dist/extensions/fal/index.d.ts +1 -1
- package/dist/extensions/fal/provider-contract-api.d.ts +1 -1
- package/dist/extensions/fal/provider-registration.d.ts +1 -1
- package/dist/extensions/file-transfer/index.d.ts +1 -1
- package/dist/extensions/file-transfer/index.js +4 -4
- package/dist/extensions/firecrawl/index.d.ts +1 -1
- package/dist/extensions/fireworks/index.d.ts +1 -1
- package/dist/extensions/fireworks/provider-policy-api.d.ts +1 -1
- package/dist/extensions/fireworks/stream.d.ts +1 -1
- package/dist/extensions/fireworks/thinking-policy.d.ts +1 -1
- package/dist/extensions/github-copilot/embeddings.d.ts +1 -1
- package/dist/extensions/github-copilot/index.d.ts +1 -1
- package/dist/extensions/github-copilot/models.d.ts +1 -1
- package/dist/extensions/github-copilot/register.runtime.d.ts +2 -2
- package/dist/extensions/github-copilot/stream.d.ts +1 -1
- package/dist/extensions/google/api.d.ts +5 -5
- package/dist/extensions/google/cli-backend.d.ts +1 -1
- package/dist/extensions/google/embedding-batch.d.ts +1 -1
- package/dist/extensions/google/embedding-provider.d.ts +1 -1
- package/dist/extensions/google/gemini-cli-provider.d.ts +1 -1
- package/dist/extensions/google/index.d.ts +1 -1
- package/dist/extensions/google/memory-embedding-adapter.d.ts +1 -1
- package/dist/extensions/google/provider-contract-api.d.ts +1 -1
- package/dist/extensions/google/provider-hooks.d.ts +2 -2
- package/dist/extensions/google/provider-models.d.ts +1 -1
- package/dist/extensions/google/provider-policy-api.d.ts +1 -1
- package/dist/extensions/google/provider-policy.d.ts +1 -1
- package/dist/extensions/google/provider-registration.d.ts +1 -1
- package/dist/extensions/google/realtime-voice-provider.d.ts +1 -1
- package/dist/extensions/google/runtime-api.d.ts +3 -3
- package/dist/extensions/google/setup-api.d.ts +1 -1
- package/dist/extensions/google/speech-provider.d.ts +1 -1
- package/dist/extensions/google/test-api.d.ts +2 -2
- package/dist/extensions/google/thinking-api.d.ts +1 -1
- package/dist/extensions/google/thinking.d.ts +1 -1
- package/dist/extensions/google/transport-stream.d.ts +1 -1
- package/dist/extensions/gradium/index.d.ts +1 -1
- package/dist/extensions/gradium/speech-provider.d.ts +1 -1
- package/dist/extensions/groq/index.d.ts +1 -1
- package/dist/extensions/huggingface/index.d.ts +1 -1
- package/dist/extensions/image-generation-core/api.d.ts +4 -4
- package/dist/extensions/image-generation-core/runtime-api.d.ts +1 -1
- package/dist/extensions/imessage/api.d.ts +2 -2
- package/dist/extensions/imessage/api.js +2 -2
- package/dist/extensions/imessage/channel-plugin-api.d.ts +1 -1
- package/dist/extensions/imessage/channel-plugin-api.js +1 -1
- package/dist/extensions/imessage/index.d.ts +2 -2
- package/dist/extensions/imessage/message-tool-api.d.ts +1 -1
- package/dist/extensions/imessage/runtime-api.d.ts +4 -4
- package/dist/extensions/imessage/runtime-api.js +3 -3
- package/dist/extensions/imessage/setup-entry.d.ts +2 -2
- package/dist/extensions/imessage/test-api.d.ts +1 -1
- package/dist/extensions/inworld/index.d.ts +1 -1
- package/dist/extensions/inworld/speech-provider.d.ts +1 -1
- package/dist/extensions/irc/api.d.ts +1 -1
- package/dist/extensions/irc/api.js +2 -2
- package/dist/extensions/irc/channel-plugin-api.d.ts +1 -1
- package/dist/extensions/irc/channel-plugin-api.js +1 -1
- package/dist/extensions/irc/index.d.ts +2 -2
- package/dist/extensions/irc/setup-entry.d.ts +2 -2
- package/dist/extensions/kilocode/index.d.ts +1 -1
- package/dist/extensions/kimi-coding/index.d.ts +1 -1
- package/dist/extensions/kimi-coding/stream.d.ts +1 -1
- package/dist/extensions/litellm/index.d.ts +1 -1
- package/dist/extensions/llm-task/api.d.ts +2 -2
- package/dist/extensions/llm-task/index.d.ts +1 -1
- package/dist/extensions/llm-task/index.js +1 -1
- package/dist/extensions/lmstudio/api.d.ts +1 -1
- package/dist/extensions/lmstudio/index.d.ts +1 -1
- package/dist/extensions/lmstudio/memory-embedding-adapter.d.ts +1 -1
- package/dist/extensions/mattermost/api.js +1 -1
- package/dist/extensions/mattermost/channel-plugin-api.d.ts +2 -2
- package/dist/extensions/mattermost/channel-plugin-api.js +1 -1
- package/dist/extensions/mattermost/channel-plugin-runtime.d.ts +1 -1
- package/dist/extensions/mattermost/channel-plugin-runtime.js +1 -1
- package/dist/extensions/mattermost/index.d.ts +2 -2
- package/dist/extensions/mattermost/policy-api.js +1 -1
- package/dist/extensions/mattermost/runtime-api.d.ts +9 -9
- package/dist/extensions/mattermost/runtime-api.js +2 -2
- package/dist/extensions/mattermost/setup-entry.d.ts +2 -2
- package/dist/extensions/mattermost/slash-route-api.d.ts +1 -1
- package/dist/extensions/mattermost/slash-route-api.js +1 -1
- package/dist/extensions/memory-core/api.d.ts +1 -1
- package/dist/extensions/memory-core/cli-metadata.d.ts +1 -1
- package/dist/extensions/memory-core/cli-metadata.js +1 -1
- package/dist/extensions/memory-core/index.d.ts +1 -1
- package/dist/extensions/memory-core/manager-runtime.d.ts +1 -1
- package/dist/extensions/memory-core/runtime-api.d.ts +2 -2
- package/dist/extensions/memory-wiki/api.d.ts +3 -3
- package/dist/extensions/memory-wiki/cli-metadata.d.ts +1 -1
- package/dist/extensions/memory-wiki/index.d.ts +1 -1
- package/dist/extensions/memory-wiki/setup-api.d.ts +1 -1
- package/dist/extensions/microsoft/index.d.ts +1 -1
- package/dist/extensions/microsoft/speech-provider.d.ts +1 -1
- package/dist/extensions/microsoft/test-api.d.ts +1 -1
- package/dist/extensions/microsoft-foundry/auth.d.ts +1 -1
- package/dist/extensions/microsoft-foundry/cli.d.ts +1 -1
- package/dist/extensions/microsoft-foundry/index.d.ts +1 -1
- package/dist/extensions/microsoft-foundry/onboard.d.ts +3 -3
- package/dist/extensions/microsoft-foundry/provider.d.ts +1 -1
- package/dist/extensions/microsoft-foundry/runtime.d.ts +1 -1
- package/dist/extensions/microsoft-foundry/shared-runtime.d.ts +1 -1
- package/dist/extensions/microsoft-foundry/shared.d.ts +1 -1
- package/dist/extensions/migrate-claude/apply.d.ts +1 -1
- package/dist/extensions/migrate-claude/apply.js +1 -1
- package/dist/extensions/migrate-claude/config.d.ts +1 -1
- package/dist/extensions/migrate-claude/helpers.d.ts +1 -1
- package/dist/extensions/migrate-claude/index.d.ts +1 -1
- package/dist/extensions/migrate-claude/index.js +1 -1
- package/dist/extensions/migrate-claude/memory.d.ts +2 -2
- package/dist/extensions/migrate-claude/plan.d.ts +1 -1
- package/dist/extensions/migrate-claude/plan.js +1 -1
- package/dist/extensions/migrate-claude/provider.d.ts +1 -1
- package/dist/extensions/migrate-claude/provider.js +1 -1
- package/dist/extensions/migrate-claude/skills.d.ts +2 -2
- package/dist/extensions/migrate-claude/targets.d.ts +1 -1
- package/dist/extensions/migrate-claude/targets.js +1 -1
- package/dist/extensions/migrate-hermes/apply.d.ts +1 -1
- package/dist/extensions/migrate-hermes/apply.js +1 -1
- package/dist/extensions/migrate-hermes/config.d.ts +1 -1
- package/dist/extensions/migrate-hermes/helpers.d.ts +1 -1
- package/dist/extensions/migrate-hermes/index.d.ts +1 -1
- package/dist/extensions/migrate-hermes/index.js +1 -1
- package/dist/extensions/migrate-hermes/items.d.ts +1 -1
- package/dist/extensions/migrate-hermes/model.d.ts +1 -1
- package/dist/extensions/migrate-hermes/model.js +1 -1
- package/dist/extensions/migrate-hermes/plan.d.ts +1 -1
- package/dist/extensions/migrate-hermes/plan.js +1 -1
- package/dist/extensions/migrate-hermes/provider.d.ts +1 -1
- package/dist/extensions/migrate-hermes/provider.js +1 -1
- package/dist/extensions/migrate-hermes/secrets.d.ts +2 -2
- package/dist/extensions/migrate-hermes/secrets.js +1 -1
- package/dist/extensions/migrate-hermes/skills.d.ts +2 -2
- package/dist/extensions/migrate-hermes/targets.d.ts +1 -1
- package/dist/extensions/migrate-hermes/targets.js +1 -1
- package/dist/extensions/minimax/index.d.ts +1 -1
- package/dist/extensions/minimax/provider-contract-api.d.ts +1 -1
- package/dist/extensions/minimax/provider-registration.d.ts +1 -1
- package/dist/extensions/minimax/speech-provider.d.ts +1 -1
- package/dist/extensions/mistral/embedding-provider.d.ts +1 -1
- package/dist/extensions/mistral/index.d.ts +1 -1
- package/dist/extensions/mistral/memory-embedding-adapter.d.ts +1 -1
- package/dist/extensions/mistral/realtime-transcription-provider.d.ts +1 -1
- package/dist/extensions/mistral/test-api.d.ts +1 -1
- package/dist/extensions/moonshot/index.d.ts +1 -1
- package/dist/extensions/moonshot/provider-contract-api.d.ts +1 -1
- package/dist/extensions/moonshot/provider-discovery.d.ts +1 -1
- package/dist/extensions/nvidia/index.d.ts +1 -1
- package/dist/extensions/oc-path/cli-metadata.d.ts +1 -1
- package/dist/extensions/oc-path/cli-registration.d.ts +1 -1
- package/dist/extensions/oc-path/index.d.ts +1 -1
- package/dist/extensions/ollama/api.d.ts +1 -1
- package/dist/extensions/ollama/index.d.ts +1 -1
- package/dist/extensions/ollama/provider-discovery.d.ts +1 -1
- package/dist/extensions/ollama/provider-policy-api.d.ts +1 -1
- package/dist/extensions/ollama/runtime-api.d.ts +1 -1
- package/dist/extensions/open-prose/index.d.ts +1 -1
- package/dist/extensions/open-prose/runtime-api.d.ts +2 -2
- package/dist/extensions/openai/api.d.ts +4 -4
- package/dist/extensions/openai/embedding-batch.d.ts +1 -1
- package/dist/extensions/openai/embedding-provider.d.ts +1 -1
- package/dist/extensions/openai/index.d.ts +1 -1
- package/dist/extensions/openai/memory-embedding-adapter.d.ts +1 -1
- package/dist/extensions/openai/openai-codex-oauth.runtime.d.ts +1 -1
- package/dist/extensions/openai/openai-codex-provider.d.ts +1 -1
- package/dist/extensions/openai/openai-provider.d.ts +1 -1
- package/dist/extensions/openai/prompt-overlay.d.ts +1 -1
- package/dist/extensions/openai/provider-contract-api.d.ts +1 -1
- package/dist/extensions/openai/provider-policy-api.d.ts +1 -1
- package/dist/extensions/openai/realtime-transcription-provider.d.ts +1 -1
- package/dist/extensions/openai/realtime-voice-provider.d.ts +1 -1
- package/dist/extensions/openai/register.runtime.d.ts +6 -6
- package/dist/extensions/openai/replay-policy.d.ts +1 -1
- package/dist/extensions/openai/setup-api.d.ts +1 -1
- package/dist/extensions/openai/shared.d.ts +3 -3
- package/dist/extensions/openai/speech-provider.d.ts +1 -1
- package/dist/extensions/openai/test-api.d.ts +3 -3
- package/dist/extensions/openai/thinking-policy.d.ts +1 -1
- package/dist/extensions/openai/transport-policy.d.ts +1 -1
- package/dist/extensions/opencode/index.d.ts +1 -1
- package/dist/extensions/opencode/provider-policy-api.d.ts +1 -1
- package/dist/extensions/opencode-go/index.d.ts +1 -1
- package/dist/extensions/opencode-go/provider-catalog.d.ts +1 -1
- package/dist/extensions/opencode-go/stream.d.ts +1 -1
- package/dist/extensions/openrouter/api.d.ts +1 -1
- package/dist/extensions/openrouter/index.d.ts +1 -1
- package/dist/extensions/openrouter/provider-contract-api.d.ts +1 -1
- package/dist/extensions/openrouter/provider-policy-api.d.ts +1 -1
- package/dist/extensions/openrouter/speech-provider.d.ts +1 -1
- package/dist/extensions/openrouter/stream.d.ts +1 -1
- package/dist/extensions/openrouter/test-api.d.ts +1 -1
- package/dist/extensions/openrouter/thinking-policy.d.ts +1 -1
- package/dist/extensions/openrouter/video-generation-provider.d.ts +1 -1
- package/dist/extensions/openrouter/video-model-catalog.d.ts +1 -1
- package/dist/extensions/perplexity/index.d.ts +1 -1
- package/dist/extensions/phone-control/index.d.ts +1 -1
- package/dist/extensions/phone-control/runtime-api.d.ts +2 -2
- package/dist/extensions/policy/api.js +1 -1
- package/dist/extensions/policy/index.d.ts +1 -1
- package/dist/extensions/policy/index.js +2 -2
- package/dist/extensions/qianfan/index.d.ts +1 -1
- package/dist/extensions/qwen/api.d.ts +1 -1
- package/dist/extensions/qwen/index.d.ts +1 -1
- package/dist/extensions/qwen/stream.d.ts +1 -1
- package/dist/extensions/runway/index.d.ts +1 -1
- package/dist/extensions/searxng/index.d.ts +1 -1
- package/dist/extensions/senseaudio/index.d.ts +1 -1
- package/dist/extensions/sglang/index.d.ts +1 -1
- package/dist/extensions/signal/api.d.ts +3 -3
- package/dist/extensions/signal/api.js +6 -6
- package/dist/extensions/signal/channel-entry.d.ts +2 -2
- package/dist/extensions/signal/channel-plugin-api.d.ts +1 -1
- package/dist/extensions/signal/channel-plugin-api.js +1 -1
- package/dist/extensions/signal/index.d.ts +2 -2
- package/dist/extensions/signal/reaction-runtime-api.js +1 -1
- package/dist/extensions/signal/runtime-api.d.ts +7 -7
- package/dist/extensions/signal/runtime-api.js +7 -7
- package/dist/extensions/signal/setup-entry.d.ts +2 -2
- package/dist/extensions/skill-workshop/api.d.ts +2 -2
- package/dist/extensions/skill-workshop/api.js +1 -1
- package/dist/extensions/skill-workshop/index.d.ts +1 -1
- package/dist/extensions/skill-workshop/index.js +2 -2
- package/dist/extensions/speech-core/api.d.ts +3 -3
- package/dist/extensions/speech-core/runtime-api.d.ts +2 -2
- package/dist/extensions/stepfun/index.d.ts +1 -1
- package/dist/extensions/synthetic/index.d.ts +1 -1
- package/dist/extensions/talk-voice/api.d.ts +2 -2
- package/dist/extensions/talk-voice/index.d.ts +1 -1
- package/dist/extensions/tavily/index.d.ts +1 -1
- package/dist/extensions/telegram/account-inspect-api.js +1 -1
- package/dist/extensions/telegram/api.d.ts +4 -4
- package/dist/extensions/telegram/api.js +11 -11
- package/dist/extensions/telegram/channel-plugin-api.d.ts +2 -2
- package/dist/extensions/telegram/channel-plugin-api.js +2 -2
- package/dist/extensions/telegram/contract-api.d.ts +1 -1
- package/dist/extensions/telegram/contract-api.js +3 -3
- package/dist/extensions/telegram/index.d.ts +2 -2
- package/dist/extensions/telegram/runtime-api.d.ts +4 -4
- package/dist/extensions/telegram/runtime-api.js +7 -7
- package/dist/extensions/telegram/security-audit-contract-api.js +1 -1
- package/dist/extensions/telegram/setup-entry.d.ts +2 -2
- package/dist/extensions/telegram/setup-plugin-api.d.ts +1 -1
- package/dist/extensions/telegram/setup-plugin-api.js +1 -1
- package/dist/extensions/telegram/test-api.js +2 -2
- package/dist/extensions/tencent/index.d.ts +1 -1
- package/dist/extensions/tencent/provider-discovery.d.ts +1 -1
- package/dist/extensions/thread-ownership/api.d.ts +2 -2
- package/dist/extensions/thread-ownership/index.d.ts +1 -1
- package/dist/extensions/together/index.d.ts +1 -1
- package/dist/extensions/tokenjuice/index.d.ts +1 -1
- package/dist/extensions/tokenjuice/tool-result-middleware.d.ts +1 -1
- package/dist/extensions/tts-local-cli/index.d.ts +1 -1
- package/dist/extensions/tts-local-cli/speech-provider.d.ts +1 -1
- package/dist/extensions/venice/index.d.ts +1 -1
- package/dist/extensions/venice/stream.d.ts +1 -1
- package/dist/extensions/vercel-ai-gateway/index.d.ts +1 -1
- package/dist/extensions/vercel-ai-gateway/thinking.d.ts +1 -1
- package/dist/extensions/video-generation-core/api.d.ts +3 -3
- package/dist/extensions/video-generation-core/runtime-api.d.ts +1 -1
- package/dist/extensions/vllm/api.d.ts +1 -1
- package/dist/extensions/vllm/index.d.ts +1 -1
- package/dist/extensions/vllm/stream.d.ts +1 -1
- package/dist/extensions/volcengine/index.d.ts +1 -1
- package/dist/extensions/volcengine/provider-discovery.d.ts +1 -1
- package/dist/extensions/volcengine/speech-provider.d.ts +1 -1
- package/dist/extensions/voyage/embedding-batch.d.ts +1 -1
- package/dist/extensions/voyage/embedding-provider.d.ts +1 -1
- package/dist/extensions/voyage/index.d.ts +1 -1
- package/dist/extensions/voyage/memory-embedding-adapter.d.ts +1 -1
- package/dist/extensions/vydra/index.d.ts +1 -1
- package/dist/extensions/vydra/speech-provider.d.ts +1 -1
- package/dist/extensions/web-readability/index.d.ts +1 -1
- package/dist/extensions/webhooks/api.d.ts +2 -2
- package/dist/extensions/webhooks/api.js +1 -1
- package/dist/extensions/webhooks/index.d.ts +1 -1
- package/dist/extensions/webhooks/index.js +1 -1
- package/dist/extensions/webhooks/runtime-api.d.ts +2 -2
- package/dist/extensions/xai/api.d.ts +1 -1
- package/dist/extensions/xai/index.d.ts +1 -1
- package/dist/extensions/xai/index.js +4 -4
- package/dist/extensions/xai/provider-contract-api.d.ts +1 -1
- package/dist/extensions/xai/provider-discovery.d.ts +1 -1
- package/dist/extensions/xai/provider-models.d.ts +1 -1
- package/dist/extensions/xai/provider-policy-api.d.ts +1 -1
- package/dist/extensions/xai/realtime-transcription-provider.d.ts +1 -1
- package/dist/extensions/xai/realtime-transcription-provider.js +1 -1
- package/dist/extensions/xai/setup-api.d.ts +1 -1
- package/dist/extensions/xai/speech-provider.d.ts +1 -1
- package/dist/extensions/xai/speech-provider.js +1 -1
- package/dist/extensions/xai/stream.d.ts +1 -1
- package/dist/extensions/xai/test-api.js +1 -1
- package/dist/extensions/xai/tts.js +1 -1
- package/dist/extensions/xai/web-search.js +1 -1
- package/dist/extensions/xai/xai-oauth.d.ts +1 -1
- package/dist/extensions/xai/xai-oauth.js +1 -1
- package/dist/extensions/xiaomi/index.d.ts +1 -1
- package/dist/extensions/xiaomi/speech-provider.d.ts +1 -1
- package/dist/extensions/xiaomi/stream.d.ts +1 -1
- package/dist/extensions/xiaomi/thinking.d.ts +1 -1
- package/dist/extensions/zai/index.d.ts +1 -1
- package/dist/file-fetch-tool-smMykVXl.js +124 -0
- package/dist/file-write-tool-yEYLZ2hU.js +127 -0
- package/dist/format-DyREJP5V.js +1145 -0
- package/dist/gateway/protocol/index.d.ts +1 -1
- package/dist/gateway-cli-D4yhwJa8.js +435 -0
- package/dist/gateway-method-runtime-B8AOnwqD.js +21 -0
- package/dist/gateway-runtime-BqKz92h9.d.ts +163 -0
- package/dist/gemini-cli-provider-wUxyeRzT.d.ts +6 -0
- package/dist/get-reply-Co-_Qlr-.js +4689 -0
- package/dist/get-reply-from-config.runtime-BcbRKxzJ.js +2 -0
- package/dist/get-reply-from-config.runtime.js +1 -1
- package/dist/graph-users-CF7Dlee2.js +1419 -0
- package/dist/group-access-BTU-w5S5.js +112 -0
- package/dist/group-keys-B_lbVBmI.d.ts +17 -0
- package/dist/handle-action.guild-admin-DS29y_6h.js +288 -0
- package/dist/harness-d9YmZWA3.js +61 -0
- package/dist/health-Cov1Kryj.js +4 -0
- package/dist/heartbeat-runner-B2wo_xDj.js +5 -0
- package/dist/heartbeat-runner.runtime-DrHZD-P2.js +4 -0
- package/dist/heartbeat-runner.runtime.js +1 -1
- package/dist/help-BgDd1atJ.js +136 -0
- package/dist/hook-runtime-UU80d5qW.d.ts +108 -0
- package/dist/hooks-CgXKCJSD.js +534 -0
- package/dist/http-registry-CBDAGRJy.d.ts +23 -0
- package/dist/image-generation-runtime-BFOnMPYD.d.ts +21 -0
- package/dist/inbound-direct-dm-runtime-DjOHl6c_.js +2 -0
- package/dist/inbound-reply-dispatch-BCTiM2jm.js +148 -0
- package/dist/index-D7Vsu6c4.d.ts +3971 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/init-CreYGHpp.js +59 -0
- package/dist/inline-buttons-C94TOhmL.js +40 -0
- package/dist/interactive-dispatch-AIMj_vt7.d.ts +143 -0
- package/dist/interactive-dispatch-Bh_T3uZG.d.ts +56 -0
- package/dist/internal-events-B6D5bqsn.js +90 -0
- package/dist/isolated-agent-9faqxl7c.js +1118 -0
- package/dist/isolated-agent-CaY4uTcE.js +2 -0
- package/dist/lifecycle-pTz4liUn.js +571 -0
- package/dist/list.probe-B8pt-DOd.js +449 -0
- package/dist/list.status-command-Wgmt361J.js +789 -0
- package/dist/llm-slug-generator-Do4oXnXl.js +78 -0
- package/dist/llm-slug-generator.js +1 -1
- package/dist/loader-BFBzvUK_.d.ts +142 -0
- package/dist/local-dispatch.runtime-7keeuHHm.js +9 -0
- package/dist/local-dispatch.runtime.js +1 -1
- package/dist/manager-D058VQAp.d.ts +10 -0
- package/dist/manager-DerRaxsV.d.ts +356 -0
- package/dist/manager.core-DKeUsAcV.d.ts +198 -0
- package/dist/manager.runtime-B3nVh8Nl.js +2714 -0
- package/dist/manager.runtime.js +1 -1
- package/dist/markdown-to-line-CZLeX0SL.js +811 -0
- package/dist/mcp-http-LaAmzBev.js +2 -0
- package/dist/mcp-http-M4GjuKFd.js +555 -0
- package/dist/media-understanding-provider-DLA6VsQZ.js +339 -0
- package/dist/memory-core-host-engine-storage-MF-67Z8w.d.ts +54 -0
- package/dist/memory-embedding-adapter-CEwgurWU.d.ts +5 -0
- package/dist/message-actions-Dlv-B5yk.js +145 -0
- package/dist/message-handler-2HSbEoAi.js +384 -0
- package/dist/message-handler-XiApv_iS.js +1715 -0
- package/dist/message-handler.preflight-CN-g4nxs.js +1125 -0
- package/dist/message-handler.process-BzVq3Lq_.js +1484 -0
- package/dist/migration-BXmTbRk9.d.ts +45 -0
- package/dist/model-Ci5kQ7PA.d.ts +33 -0
- package/dist/model-Sqz99RFi.js +74 -0
- package/dist/model-selection-Bh9QtqlJ.js +272 -0
- package/dist/models-C_dD1FNN.js +2 -0
- package/dist/models-CtpB-fi2.js +104 -0
- package/dist/models-Cxa7r3rl.d.ts +24 -0
- package/dist/models-cli-I2sJE5tg.js +256 -0
- package/dist/monitor-B4J6Kn4-.js +60 -0
- package/dist/monitor-BIFxJ3Ql.js +2788 -0
- package/dist/monitor-BTkcXHvw.js +834 -0
- package/dist/monitor-BX7Encm5.js +1657 -0
- package/dist/monitor-CZsJ4D3J.js +4377 -0
- package/dist/monitor-CvKt9k7P.js +2 -0
- package/dist/monitor-Dy9phiVJ.js +1370 -0
- package/dist/monitor-auth-CjtJPc9C.js +179 -0
- package/dist/monitor-jQpVHEky.js +715 -0
- package/dist/monitor-polling.runtime-Li4-3e2G.js +883 -0
- package/dist/monitor-polling.runtime.js +1 -1
- package/dist/monitor-webhook.runtime-CQ2kN5ya.js +387 -0
- package/dist/monitor-webhook.runtime.js +1 -1
- package/dist/monitor.account-CFdazLEm.js +5233 -0
- package/dist/monitor.runtime-B774iFU_.js +2 -0
- package/dist/monitor.runtime.js +1 -1
- package/dist/monitor.webhook-NNrWA5P9.js +180 -0
- package/dist/node-cli-sessions-Ct-6bGab.js +1228 -0
- package/dist/onboard-DEUA1HCQ.js +733 -0
- package/dist/onboard-helpers-Cupkjkec.js +251 -0
- package/dist/onboard-helpers-D1Pvowo1.js +6 -0
- package/dist/onboard-remote-BN_7wNqG.js +2 -0
- package/dist/onboard-remote-BqYAK5dF.js +212 -0
- package/dist/onboard-skills-BM40qOkc.js +160 -0
- package/dist/onboard-skills-rSLgDOzB.js +2 -0
- package/dist/openai-codex-provider-Fo-TKiyf.d.ts +5 -0
- package/dist/openai-http-BRnxRJ_y.js +824 -0
- package/dist/openai-provider-BqDrspuV.d.ts +5 -0
- package/dist/openresponses-http-Dg3OL0qA.js +1173 -0
- package/dist/operations-jvr0A8cu.js +805 -0
- package/dist/outbound-adapter-BJej9JpO.js +543 -0
- package/dist/outbound-session-route-D3QVwFKr.js +45 -0
- package/dist/outbound.runtime-gdOoPtOh.js +2 -0
- package/dist/outbound.runtime.js +1 -1
- package/dist/pairing-store-C-WQTUHq.d.ts +87 -0
- package/dist/pi-embedded-CwD_xrGP.js +3796 -0
- package/dist/pi-embedded-DL6l8KBl.js +4 -0
- package/dist/pi-embedded.runtime-DyGCj24d.js +4 -0
- package/dist/pi-embedded.runtime.js +1 -1
- package/dist/pi-tools-BzbgexEG.js +2413 -0
- package/dist/plan-HWBV2Rhq.js +112 -0
- package/dist/plan-iN77JYw-.js +81 -0
- package/dist/plugin-BbOOGgCS.d.ts +17 -0
- package/dist/plugin-CbNvjum_.js +12396 -0
- package/dist/plugin-app-cache-key-CHpwYM0e.js +46 -0
- package/dist/plugin-enabled-DjbDhNRG.js +233 -0
- package/dist/plugin-entry-B3_M6paP.d.ts +47 -0
- package/dist/plugin-registration-BM_Iko3e.js +88 -0
- package/dist/plugin-runtime-QzTPitsy.d.ts +117 -0
- package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
- package/dist/plugin-sdk/acp-runtime-backend.js +1 -1
- package/dist/plugin-sdk/acp-runtime.js +2 -2
- package/dist/plugin-sdk/agent-harness-runtime.js +6 -6
- package/dist/plugin-sdk/agent-harness-task-runtime.js +1 -1
- package/dist/plugin-sdk/agent-harness.js +7 -7
- package/dist/plugin-sdk/agent-runtime.js +2 -2
- package/dist/plugin-sdk/channel-core.js +2 -2
- package/dist/plugin-sdk/channel-inbound.js +2 -2
- package/dist/plugin-sdk/channel-test-helpers.js +1 -1
- package/dist/plugin-sdk/command-auth.js +1 -1
- package/dist/plugin-sdk/command-status-runtime.js +1 -1
- package/dist/plugin-sdk/compat.js +1 -1
- package/dist/plugin-sdk/conversation-binding-runtime.js +2 -2
- package/dist/plugin-sdk/conversation-runtime.js +3 -3
- package/dist/plugin-sdk/core.js +2 -2
- package/dist/plugin-sdk/direct-dm.js +1 -1
- package/dist/plugin-sdk/gateway-method-runtime.js +1 -1
- package/dist/plugin-sdk/health.js +2 -2
- package/dist/plugin-sdk/inbound-reply-dispatch.js +1 -1
- package/dist/plugin-sdk/index.js +1 -1
- package/dist/plugin-sdk/mattermost.js +1 -1
- package/dist/plugin-sdk/plugin-test-contracts.js +2 -2
- package/dist/plugin-sdk/provider-test-contracts.js +4 -4
- package/dist/plugin-sdk/reply-runtime.js +4 -4
- package/dist/plugin-sdk/testing.js +2 -2
- package/dist/plugin-sdk/zalouser.js +1 -1
- package/dist/plugin-service-CVyMm03C.js +1229 -0
- package/dist/plugin-service-bHD8oLfO.d.ts +24 -0
- package/dist/plugins/build-smoke-entry.d.ts +2 -2
- package/dist/plugins/loader.d.ts +1 -1
- package/dist/plugins/provider-discovery.runtime.d.ts +1 -1
- package/dist/plugins/provider-runtime.runtime.d.ts +1 -1
- package/dist/plugins/runtime/index.js +4 -4
- package/dist/policy-B2lTxn8H.js +680 -0
- package/dist/policy-Bp9GYcSZ.js +138 -0
- package/dist/prepare.runtime-CxhQeo9l.js +732 -0
- package/dist/prepare.runtime.js +1 -1
- package/dist/preview-warnings-FVRS7Mcs.js +392 -0
- package/dist/probe-BRLc43oX.js +47 -0
- package/dist/probe-C1eD9yG7.js +2204 -0
- package/dist/probe-C1giMJtz.js +682 -0
- package/dist/probe-rIUNPFef.js +2 -0
- package/dist/program-DfIqBXRH.js +131 -0
- package/dist/prompt-overlay-Bq3sUpDV.d.ts +23 -0
- package/dist/provider-BCxvG42s.js +152 -0
- package/dist/provider-BHPMcHk-.js +32 -0
- package/dist/provider-CIAQ8D7q.js +32 -0
- package/dist/provider-api-key-auth-BsEQw2pm.d.ts +27 -0
- package/dist/provider-auth-result-B204hPXB.d.ts +21 -0
- package/dist/provider-catalog-runtime-Dcyw8skT.d.ts +23 -0
- package/dist/provider-catalog-shared-qfgsIQS-.d.ts +62 -0
- package/dist/provider-dispatcher-DyJDef6y.js +22 -0
- package/dist/provider-dispatcher.runtime.js +1 -1
- package/dist/provider-hook-runtime-NiAPyKFa.d.ts +61 -0
- package/dist/provider-j7cYms68.js +8735 -0
- package/dist/provider-model-shared-BwE02tDa.d.ts +143 -0
- package/dist/provider-models-hfm5XTTN.d.ts +12 -0
- package/dist/provider-policy-BB7uTrIp.d.ts +30 -0
- package/dist/provider-registration-DEjYSu9M.d.ts +6 -0
- package/dist/provider-registry-D5hn-VAM.d.ts +8 -0
- package/dist/provider-registry-DHIsMEbc.d.ts +8 -0
- package/dist/provider-registry-VyHjmzoh.d.ts +30 -0
- package/dist/provider-runtime-CdtuIOgf.d.ts +359 -0
- package/dist/provider-self-hosted-setup-xR0Nsu7L.d.ts +74 -0
- package/dist/provider-session.runtime-CmNY15Mr.js +9 -0
- package/dist/provider-session.runtime.js +1 -1
- package/dist/provider-stream-CxVko1CO.d.ts +140 -0
- package/dist/provider-stream-shared-BxFPKFGe.d.ts +128 -0
- package/dist/provider.runtime-DJO3dwrX.js +2 -0
- package/dist/provider.runtime.js +1 -1
- package/dist/providers.runtime-CJOUbS2S.d.ts +25 -0
- package/dist/public-surface-loader-CgBnme5n.js +114 -0
- package/dist/pw-ai-UeRWGzcL.js +3029 -0
- package/dist/pw-role-snapshot-BtlutwlO.js +333 -0
- package/dist/reaction-level-DWOV-qJM.js +19 -0
- package/dist/reaction-runtime-api-5ZiPcbGJ.js +116 -0
- package/dist/realtime-transcription-CZadifvk.d.ts +43 -0
- package/dist/realtime-transcription-provider-BF9HxM3d.d.ts +5 -0
- package/dist/realtime-transcription-provider-Bcj92hEI.d.ts +32 -0
- package/dist/realtime-transcription-provider-DKZ9iHkc.d.ts +28 -0
- package/dist/realtime-transcription-provider-DcsAmQEp.js +205 -0
- package/dist/realtime-transcription-provider-DhjVTTqb.d.ts +37 -0
- package/dist/realtime-voice-B2W34yTP.d.ts +333 -0
- package/dist/realtime-voice-provider-CgNNrGwQ.d.ts +5 -0
- package/dist/register-Dga1nJRL.js +2178 -0
- package/dist/register.agent-VIgyZLKG.js +156 -0
- package/dist/register.configure-C21zJ4Qb.js +16 -0
- package/dist/register.crestodian-Bam6mUXr.js +24 -0
- package/dist/register.maintenance-D9E-Hh90.js +83 -0
- package/dist/register.onboard-BnUcaZsb.js +113 -0
- package/dist/register.runtime-BdRAp4xz.js +54 -0
- package/dist/register.runtime-D3abILg7.d.ts +6 -0
- package/dist/register.setup-Bq-9IQdV.js +40 -0
- package/dist/register.subclis-DubBtg8Z.js +31 -0
- package/dist/register.subclis-H_qmmDFx.js +3 -0
- package/dist/register.subclis-core-fg3DalSH.js +273 -0
- package/dist/registry-CPtiHUu_.d.ts +91 -0
- package/dist/registry-types-XtFJDNYl.d.ts +392 -0
- package/dist/repair-sequencing-Dn0sDvBE.js +640 -0
- package/dist/reply-delivery-DZGfRh-W.js +196 -0
- package/dist/reply-runtime-BdCPL-OF.js +11 -0
- package/dist/reply-runtime-DuaOZ9MH.d.ts +34 -0
- package/dist/reply.runtime-BcbRKxzJ.js +2 -0
- package/dist/reply.runtime.js +1 -1
- package/dist/request-Ca681Kt1.js +54 -0
- package/dist/resolve-allowlist-DWjCzDq1.js +220 -0
- package/dist/result-fallback-classifier-BWIh0wzc.js +79 -0
- package/dist/root-help-8a3TWleF.js +43 -0
- package/dist/route-BsWREv6-.js +469 -0
- package/dist/route-resolution-D8FyF30I.js +274 -0
- package/dist/routes-BxkaJuyM.js +3602 -0
- package/dist/routes-DdwFgSv9.js +2 -0
- package/dist/run-attempt-Ca7HP1Nd.js +7704 -0
- package/dist/run-command-JwrnqCIB.js +2 -0
- package/dist/run-command-wWvfXyIf.js +23 -0
- package/dist/run-embedded.runtime-0QIAc8PG.js +4 -0
- package/dist/run-embedded.runtime.js +1 -1
- package/dist/run-execution-cli.runtime-LhD-S0h_.js +4 -0
- package/dist/run-execution-cli.runtime.js +1 -1
- package/dist/run-executor.runtime.js +1 -1
- package/dist/run-prKMVvM2.js +1162 -0
- package/dist/run-subagent-registry.runtime-C07jSlV2.js +2 -0
- package/dist/run-subagent-registry.runtime.js +1 -1
- package/dist/runtime-3PDZU_1b.d.ts +17 -0
- package/dist/runtime-7Xhj2T8S.js +6179 -0
- package/dist/runtime-CXUwJU3q.js +438 -0
- package/dist/runtime-DeQypuDs.js +1287 -0
- package/dist/runtime-api-0djTIsuz.js +13 -0
- package/dist/runtime-api-9CEihqK3.d.ts +3151 -0
- package/dist/runtime-api-Bz1h0p3i.js +17 -0
- package/dist/runtime-api-CLcJZKu2.js +13 -0
- package/dist/runtime-api-Ce7axAAW.js +24 -0
- package/dist/runtime-api-CoAsju8a.js +4 -0
- package/dist/runtime-api-DEuynhDr.js +3 -0
- package/dist/runtime-api-oZFIOS9l.js +21 -0
- package/dist/runtime-api.actions-Blt2bAHw.d.ts +23 -0
- package/dist/runtime-api.actions-DWLRlSej.js +3 -0
- package/dist/runtime-api.monitor-DtXB3_sf.js +6 -0
- package/dist/runtime-api.send-BU586hbs.js +4 -0
- package/dist/runtime-api.send-BygcWA7R.d.ts +38 -0
- package/dist/runtime-api.threads-Djhr5AJy.js +2 -0
- package/dist/runtime-channel-BIgBTs_X.js +2 -0
- package/dist/runtime-channel-CsUTBjYU.js +150 -0
- package/dist/runtime-embedded-pi.runtime-Rszd_KCt.js +2 -0
- package/dist/runtime-embedded-pi.runtime.js +1 -1
- package/dist/runtime-taskflow-s80xQc2H.d.ts +435 -0
- package/dist/sanitize-outbound-2umQeW_U.js +127 -0
- package/dist/sdk-setup-tools-TiaNam05.js +8 -0
- package/dist/secrets-BmyFSkt-.js +113 -0
- package/dist/secrets-cli-DPAwFvtH.js +149 -0
- package/dist/security-audit-BR9FBcLD.js +122 -0
- package/dist/security-audit-RKut1lWG.js +118 -0
- package/dist/security-audit.runtime-Pe7YbS9P.js +2 -0
- package/dist/security-audit.runtime.js +1 -1
- package/dist/selection-Cqhmjpyl.js +16157 -0
- package/dist/selection-xFFMaq92.js +3 -0
- package/dist/send-BDHagrwl.js +1631 -0
- package/dist/send-BETlETJ5.d.ts +231 -0
- package/dist/send-BV_O_Ljd.js +192 -0
- package/dist/send-CpcmWYrM.d.ts +104 -0
- package/dist/send-W-DVyil6.js +2 -0
- package/dist/send-jUp2-szO.js +143 -0
- package/dist/send.components-BR_yPtKv.js +500 -0
- package/dist/send.components-CK7UbpRP.js +2 -0
- package/dist/send.runtime-DHLfdHbS.js +2 -0
- package/dist/send.runtime.js +1 -1
- package/dist/send.types-D_3tsfSL.d.ts +159 -0
- package/dist/server-DRcdRu6J.js +73 -0
- package/dist/server-Ddv-oAKv.js +24 -0
- package/dist/server-close.runtime.d.ts +1 -1
- package/dist/server-close.runtime.js +1 -1
- package/dist/server-context-9rW0Cvdw.js +2 -0
- package/dist/server-context-uRD5N8_D.js +955 -0
- package/dist/server-cron-BClEPtbv.js +2 -0
- package/dist/server-cron-CNGar45o.js +2989 -0
- package/dist/server-methods-CAMhJf7g.js +16494 -0
- package/dist/server-node-events-DW5DoAxk.js +596 -0
- package/dist/server-plugin-bootstrap-CqX4dDcN.js +70 -0
- package/dist/server-plugins-BIhs3eCz.js +432 -0
- package/dist/server-reload-handlers-54HSfSr7.js +714 -0
- package/dist/server-restart-sentinel-C47-O08k.js +747 -0
- package/dist/server-restart-sentinel-Cx-3Rzl0.js +2 -0
- package/dist/server-runtime-services-D-SWzUww.js +267 -0
- package/dist/server-runtime-services-D0GOFPFq.js +2 -0
- package/dist/server-startup-plugins-C8pzVvkb.js +113 -0
- package/dist/server-startup-post-attach-2xoGJJts.js +716 -0
- package/dist/server-ws-runtime-Dywo6GC-.js +349 -0
- package/dist/server.impl-xK22fZyJ.js +2586 -0
- package/dist/service-Ci8roOZn.js +1446 -0
- package/dist/session-binding-BsdbGBhb.js +219 -0
- package/dist/session-binding-D42jROcb.js +2 -0
- package/dist/session-kill-http-kU4rUj1_.js +121 -0
- package/dist/session-reset-service-DkCGElAA.js +625 -0
- package/dist/session-route-hmQSEijy.js +93 -0
- package/dist/session-status.runtime-Dsz-54he.js +2 -0
- package/dist/session-status.runtime.js +1 -1
- package/dist/session-subagent-reactivation.runtime-CYJIkiW8.js +2 -0
- package/dist/session-subagent-reactivation.runtime.js +1 -1
- package/dist/session-tab-registry-YfQve--K.js +521 -0
- package/dist/sessions-history-http-DeuZSSGj.js +430 -0
- package/dist/sessions.runtime-wAccC8Lk.js +2 -0
- package/dist/sessions.runtime.js +1 -1
- package/dist/setup-B8caUFIZ.js +586 -0
- package/dist/setup-CgHGdMpV.js +2 -0
- package/dist/setup-api-Uew7qBry.js +29 -0
- package/dist/setup-core-BP_fjsmA.js +174 -0
- package/dist/setup-onboard-configure-help-fast-path-ykLp2JqU.js +64 -0
- package/dist/setup-surface-BgEGrdZ3.js +320 -0
- package/dist/setup-surface-BvSqsFEu.js +221 -0
- package/dist/setup-surface-CHzMJ7_T.js +405 -0
- package/dist/setup-surface-DYm3Xvgt.js +288 -0
- package/dist/setup.finalize-BgLIjblM.js +582 -0
- package/dist/setup.gateway-config-BBguRpIc.js +281 -0
- package/dist/setup.migration-import-BY06brv-.js +200 -0
- package/dist/setup.migration-import-Igj5NMey.js +2 -0
- package/dist/shared-client-GL2KQ2Eu.js +2 -0
- package/dist/shared-client-Mc7bTBoQ.js +629 -0
- package/dist/shared-moi7PK0C.js +121 -0
- package/dist/shared-rlOyTpAw.d.ts +115 -0
- package/dist/side-question-BEHswpGw.js +683 -0
- package/dist/simple-completion-runtime-CsXJkjY5.d.ts +73 -0
- package/dist/skill-tool-dispatch.runtime-O5uXeees.js +143 -0
- package/dist/skill-tool-dispatch.runtime.js +1 -1
- package/dist/slash-state-BAYUTcHl.js +2166 -0
- package/dist/speech-BAP4NgqI.d.ts +47 -0
- package/dist/speech-core-DZmhKq_b.d.ts +36 -0
- package/dist/speech-provider-22oDk8Tz.js +184 -0
- package/dist/speech-provider-79S_bTlE.d.ts +8 -0
- package/dist/speech-provider-BYJna1nq.d.ts +5 -0
- package/dist/speech-provider-BvKhsuyg.d.ts +5 -0
- package/dist/speech-provider-CdVIHtT6.d.ts +5 -0
- package/dist/speech-provider-OiRKJFwo.d.ts +8 -0
- package/dist/speech-provider-xUDd1kmD.d.ts +34 -0
- package/dist/src-C8wkJgE6.js +4256 -0
- package/dist/startup-context-BhLJufFU.js +313 -0
- package/dist/status-C20LHDLA.js +73 -0
- package/dist/status-message-CmzgS8zM.js +484 -0
- package/dist/status-message.runtime-iG6qi7wn.js +6 -0
- package/dist/status-message.runtime.js +1 -1
- package/dist/status-subagents.runtime-D49P_RIr.js +18 -0
- package/dist/status-subagents.runtime.js +1 -1
- package/dist/status-text-BI7Q1z4U.js +296 -0
- package/dist/status.runtime-RQes0TI5.js +2 -0
- package/dist/sticker-cache-Dh4joqan.js +206 -0
- package/dist/sticker-vision.runtime-5SRgpo_k.js +17 -0
- package/dist/sticker-vision.runtime.js +1 -1
- package/dist/stream-BrMwI7HV.d.ts +10 -0
- package/dist/stream-Bx_akKgo.d.ts +16 -0
- package/dist/stream-D094UIVI.d.ts +5 -0
- package/dist/stream-D5DoOmTT.d.ts +19 -0
- package/dist/stream-Tt9cSOCl.d.ts +120 -0
- package/dist/stream-wrappers-CUkNtyZK.d.ts +21 -0
- package/dist/subagent-announce-BEPlkjCS.js +354 -0
- package/dist/subagent-announce-delivery-jcxPIfNG.js +958 -0
- package/dist/subagent-control-DdMWVJXs.js +508 -0
- package/dist/subagent-hooks-BsTVb6ur.js +2 -0
- package/dist/subagent-hooks-CBlMBrss.js +2 -0
- package/dist/subagent-hooks-Ch5oDUxb.js +116 -0
- package/dist/subagent-hooks-DmUeAwY3.js +146 -0
- package/dist/subagent-hooks-PNuPbYEl.js +2 -0
- package/dist/subagent-hooks-api-BQ051dF0.js +23 -0
- package/dist/subagent-hooks-api-DcVS0aJZ.js +22 -0
- package/dist/subagent-hooks-api-Dlbc5Mtd.js +23 -0
- package/dist/subagent-hooks-dwsegI07.js +230 -0
- package/dist/subagent-orphan-recovery-Cl_y6Poi.js +352 -0
- package/dist/subagent-registry-BVVgDSdq.d.ts +1 -0
- package/dist/subagent-registry-BosUdBW6.js +2351 -0
- package/dist/subagent-registry-Bxd6vaAO.js +3 -0
- package/dist/subagent-registry-read-BVVgDSdq.d.ts +1 -0
- package/dist/subagent-registry.runtime.js +1 -1
- package/dist/subagent-session-cleanup-Bd6d93qi.js +525 -0
- package/dist/subagent-spawn-ViO3XAR1.js +1164 -0
- package/dist/target-id-Bje_v2Ax.js +107 -0
- package/dist/targets-9q_q5M9n.d.ts +10 -0
- package/dist/targets-C4byiOgQ.js +19 -0
- package/dist/targets-J0MVE-dD.js +44 -0
- package/dist/targets-ZMEvyNa8.js +19 -0
- package/dist/targets-qBcfKetP.d.ts +10 -0
- package/dist/task-registry-control.runtime.d.ts +1 -1
- package/dist/task-registry-control.runtime.js +1 -1
- package/dist/telegram/token.js +1 -1
- package/dist/testing-Dk757Ggg.js +267 -0
- package/dist/thinking-policy-DO6T8IfK.d.ts +5 -0
- package/dist/thread-bindings-CYrmTzFY.js +232 -0
- package/dist/thread-bindings-Cf7fkXxk.js +571 -0
- package/dist/thread-bindings-DI6LNGbW.js +8 -0
- package/dist/thread-bindings-DdmuKtVD.js +228 -0
- package/dist/thread-bindings.discord-api-C01V3kFk.js +187 -0
- package/dist/thread-bindings.manager--WOGVrL-.js +2 -0
- package/dist/thread-bindings.manager-HzjqZNiL.js +536 -0
- package/dist/thread-lifecycle-CJKTxWnQ.js +1614 -0
- package/dist/token-D-FQ8AQz.js +134 -0
- package/dist/tool-DTCfs0DU.js +139 -0
- package/dist/tool-actions.runtime-Cb3iA3Os.js +534 -0
- package/dist/tool-actions.runtime.js +1 -1
- package/dist/tool-plugin-CbbLM31f.d.ts +77 -0
- package/dist/tool-resolution-CbqzNutV.js +149 -0
- package/dist/tool-split-bLqMPHTZ.d.ts +19 -0
- package/dist/tools-effective-inventory-BsAax-ML.js +204 -0
- package/dist/tools-invoke-http-DAqZxikd.js +67 -0
- package/dist/tools-invoke-shared-CsVRemTL.js +200 -0
- package/dist/transport-stream-DOXZsjVL.d.ts +42 -0
- package/dist/tts-Ckj6MJNr.js +66 -0
- package/dist/tui-CwwCXMCq.js +2 -0
- package/dist/tui-DpJn3v2D.js +4709 -0
- package/dist/tui-backend-DQ9wF5es.js +256 -0
- package/dist/tui-cli-k3AYPBn3.js +37 -0
- package/dist/types--0xYmMG9.d.ts +786 -0
- package/dist/types-CMDl9l_P2.d.ts +3650 -0
- package/dist/types.public-DvhPzYJi.d.ts +70 -0
- package/dist/update-cli-DB5Doqld.js +3664 -0
- package/dist/video-generation-runtime-CTQN-4SI.d.ts +21 -0
- package/dist/video-model-catalog-CTyt4dXa.d.ts +16 -0
- package/dist/vision-tools-Dp0JrLRi.js +1409 -0
- package/dist/web-search-B0yvxuiq.js +62 -0
- package/dist/web-search-provider.runtime-B-cNT-5J.js +2 -0
- package/dist/web-search-provider.runtime-HhmIlk_Z.js +328 -0
- package/dist/web-search-provider.runtime.js +1 -1
- package/dist/webhook-targets-3u4hOqRl.d.ts +99 -0
- package/dist/xai-oauth-cZGjnEjh.js +479 -0
- package/dist/xai-user-agent-DA8le6vP.js +32 -0
- package/dist/zod-schema.core-i5HaY1T4.d.ts +166 -0
- package/package.json +1 -1
- package/dist/abort-CvuLeqr1.js +0 -277
- package/dist/abort.runtime-DNoavlKn.js +0 -2
- package/dist/account-inspect-ByX21U_z.js +0 -173
- package/dist/accounts-B0sjdn0w.js +0 -119
- package/dist/accounts-BF_AfTED.js +0 -107
- package/dist/accounts-DX1c8NKM.js +0 -107
- package/dist/accounts-EA2GGTep.js +0 -2
- package/dist/acp-runtime-BC8oA7xM.js +0 -26
- package/dist/acp-spawn-CPYDCZ95.js +0 -2
- package/dist/acp-spawn-Cqi47GCL.js +0 -1275
- package/dist/acp-stateful-target-driver-CcWMRAQ2.js +0 -89
- package/dist/action-kill-CZrPfOIS.js +0 -33
- package/dist/action-runtime-DuhVKLRJ.js +0 -469
- package/dist/action-runtime-api-BKaUWi7b.js +0 -2
- package/dist/action-send-_NpIHMwj.js +0 -39
- package/dist/action-spawn-Dymn4rUo.js +0 -47
- package/dist/actions-Bk_WaEAa.js +0 -161
- package/dist/actions.runtime-Hh7HYOlJ.js +0 -5
- package/dist/agent-CQzGVmy1.js +0 -2
- package/dist/agent-ClmYyW81.js +0 -3
- package/dist/agent-command-D5KxwCVS.d.ts +0 -141
- package/dist/agent-command-DbU2fo-p.js +0 -1367
- package/dist/agent-components.runtime-BpXJmJXk.js +0 -10
- package/dist/agent-harness-D8c6PLE_.d.ts +0 -146
- package/dist/agent-harness-runtime-AHXS4Jj3.d.ts +0 -691
- package/dist/agent-harness-runtime-TzbK9YTz.js +0 -180
- package/dist/agent-harness-task-runtime-CZWJEsKk.js +0 -140
- package/dist/agent-runner-execution-CmHT78Vr.js +0 -1713
- package/dist/agent-runner-utils-B0i1PW18.js +0 -266
- package/dist/agent-runner.runtime-B6Ah_MlB.js +0 -3455
- package/dist/agent-runtime-BOMioAX6.js +0 -229
- package/dist/agent-via-gateway-DfxQCPit.js +0 -463
- package/dist/agents.commands.add-CszEBxoJ.js +0 -304
- package/dist/agents.commands.delete-ulnJ7RH9.js +0 -128
- package/dist/api-6SmEQDkK.js +0 -134
- package/dist/api-B7QdoMF5.js +0 -2
- package/dist/api-BBgby6ck.js +0 -639
- package/dist/api-DwKV-xfM.d.ts +0 -52
- package/dist/api-RfjCqA7Y.js +0 -6
- package/dist/api-VDkFlOiv.js +0 -2
- package/dist/api-We4xoZFr.js +0 -3
- package/dist/apply-Cgtzilem.js +0 -41
- package/dist/apply-Csp3U8cA.js +0 -54
- package/dist/approval-handler.runtime-aQaSBbpF.js +0 -130
- package/dist/assistant-UMyirSUH.js +0 -291
- package/dist/attachment-normalize-BupK-_Ox.js +0 -225
- package/dist/attempt-execution-oLlyFjHk.js +0 -558
- package/dist/attempt-execution.runtime-Cq8RE0x_.js +0 -3
- package/dist/attempt-execution.shared-DyBzUJGB.js +0 -38
- package/dist/attempt.prompt-helpers-CVBP6t5J.js +0 -475
- package/dist/attempt.tool-run-context-UU1BUUC9.js +0 -2094
- package/dist/auth-BDaK_y-g.js +0 -541
- package/dist/banner-VbID973v.js +0 -2
- package/dist/banner-W77piyz6.js +0 -397
- package/dist/binding-routing-DahKvjr3.js +0 -113
- package/dist/binding-targets-C3mqUdUT.js +0 -121
- package/dist/bot-DonUKEuy.js +0 -7894
- package/dist/bot-deps-CroXwZeM.js +0 -747
- package/dist/bot-deps-DKoy3x0l.js +0 -2
- package/dist/bot-message-context.runtime-BI_zyqDu.js +0 -7
- package/dist/bot-message-context.session.runtime-Cpy2H9Ez.js +0 -12
- package/dist/bot-native-commands.delivery.runtime-CsHg3h1O.js +0 -4
- package/dist/bot-native-commands.runtime-rmoBpwZY.js +0 -13
- package/dist/bridge-server-BmDNWgHD.js +0 -113
- package/dist/browser-cli-BQLwmLw3.js +0 -2
- package/dist/browser-cli-CHHIN-of.js +0 -230
- package/dist/browser-cli-actions-input-DBZ7uwag.js +0 -473
- package/dist/browser-cli-actions-observe-BdH2-WTk.js +0 -81
- package/dist/browser-cli-debug-C82Apbgb.js +0 -137
- package/dist/browser-cli-inspect-CrO1qca7.js +0 -104
- package/dist/browser-cli-manage-Dgm1IUZT.js +0 -443
- package/dist/browser-cli-resize-DqgMr3DY.js +0 -26
- package/dist/browser-cli-shared-BTnXMCKA.js +0 -50
- package/dist/browser-cli-state-DT3bVOtg.js +0 -337
- package/dist/browser-control-auth-BRwKCt45.js +0 -2
- package/dist/browser-profiles-DhGtxK9v.js +0 -2
- package/dist/browser-runtime-BL6b-qtr.js +0 -384
- package/dist/build-33AnG55F.js +0 -257
- package/dist/bundled-channel-config-schema-4eXcH-RE.d.ts +0 -3163
- package/dist/call-dct8amtn.d.ts +0 -43
- package/dist/capability-cli-D-KoVyyP.js +0 -1782
- package/dist/channel-0tgrzPag.js +0 -867
- package/dist/channel-4g20sJKJ.d.ts +0 -104
- package/dist/channel-6tG8jWsw.d.ts +0 -8
- package/dist/channel-7OEbQ8xS.d.ts +0 -6
- package/dist/channel-7rVapSdN.d.ts +0 -8
- package/dist/channel-B1fZN0iI.d.ts +0 -427
- package/dist/channel-B5Q7fRiN.js +0 -1134
- package/dist/channel-BEg_0h_C.d.ts +0 -12
- package/dist/channel-BNp1J_eZ.js +0 -376
- package/dist/channel-BP6RWm-M.d.ts +0 -47
- package/dist/channel-BRjqrJfj.d.ts +0 -49
- package/dist/channel-BUoyH_tP.d.ts +0 -114
- package/dist/channel-BVBG4Tmn.d.ts +0 -28
- package/dist/channel-Bap23sAx.js +0 -481
- package/dist/channel-BhZ7x0SB.d.ts +0 -26
- package/dist/channel-Bxod9CjX.js +0 -508
- package/dist/channel-C6LASGjS.js +0 -808
- package/dist/channel-COWZEKCw.js +0 -1249
- package/dist/channel-CRAIreZ3.js +0 -238
- package/dist/channel-CVY2hnJh.js +0 -1556
- package/dist/channel-CgKdh_Jd.d.ts +0 -106
- package/dist/channel-Cxo62btA.js +0 -1496
- package/dist/channel-D5SzoyWI.js +0 -562
- package/dist/channel-DE4vIsYF.d.ts +0 -64
- package/dist/channel-DOdRHxJg.js +0 -1777
- package/dist/channel-DZygtXdy.js +0 -362
- package/dist/channel-DfhOnM71.d.ts +0 -7
- package/dist/channel-DhZiptRe.d.ts +0 -8
- package/dist/channel-DqPZviVV.js +0 -2126
- package/dist/channel-Dssy3NQA.js +0 -740
- package/dist/channel-actions.runtime-CDaMC9SV.js +0 -265
- package/dist/channel-buMY8xZQ.d.ts +0 -7
- package/dist/channel-core-CBhC_PNR.js +0 -5
- package/dist/channel-core-x9b94azO.d.ts +0 -6
- package/dist/channel-cvGHll3-.js +0 -955
- package/dist/channel-entry-contract-BfZdcgTS.d.ts +0 -112
- package/dist/channel-inbound-CNdyzYlz.js +0 -80
- package/dist/channel-l8amaSI9.js +0 -653
- package/dist/channel-lifecycle-DCl2GbRW.d.ts +0 -125
- package/dist/channel-pairing-BRqfYy30.d.ts +0 -58
- package/dist/channel-plugin-runtime-CvcVGjj4.js +0 -998
- package/dist/channel-plugin-runtime-D5n9A86n.d.ts +0 -7
- package/dist/channel-runtime-BAbg8Dcv.js +0 -408
- package/dist/channel-sWtDTVwd.d.ts +0 -14
- package/dist/channel.runtime-9o-iF8zm.js +0 -2528
- package/dist/channel.runtime-BotO7RD0.js +0 -21009
- package/dist/channel.runtime-BrDb4cP8.js +0 -88
- package/dist/channel.runtime-C1cLfrDt.js +0 -254
- package/dist/channel.runtime-CTM3VO2E.js +0 -4
- package/dist/channel.runtime-CnodqvCJ.js +0 -733
- package/dist/channel.runtime-Dmr8503H.js +0 -1008
- package/dist/channel.runtime-DqzR3Gd9.js +0 -109
- package/dist/channel.runtime-LOf0PHu_.js +0 -652
- package/dist/channel.setup-1leD5F5B.js +0 -343
- package/dist/channel.setup-D9UyWhXM.js +0 -1098
- package/dist/channel.setup-DkVld-9Z.d.ts +0 -7
- package/dist/channel.setup-DxT4prSl.d.ts +0 -8
- package/dist/channel.setup-IHNFkdUD.js +0 -10
- package/dist/channel.setup-YwXqilBB.d.ts +0 -6
- package/dist/chat-DrycI6KH.js +0 -2666
- package/dist/chrome-CgGY9FsG.js +0 -1503
- package/dist/cli-backend-B3aNoTD4.d.ts +0 -5
- package/dist/cli-backend-BVUFOLXj.d.ts +0 -5
- package/dist/cli-compaction-DPmSHZx7.js +0 -347
- package/dist/cli-metadata-eFfCoGmY.js +0 -22
- package/dist/cli-nmYmL8lb.js +0 -1341
- package/dist/cli-runner-BTOYShgV.js +0 -2
- package/dist/cli-runner-DgXAxJVr.js +0 -540
- package/dist/cli-runner.runtime-BeMsKcaS.js +0 -4
- package/dist/cli-runner.runtime-DMD8X8-h.js +0 -3
- package/dist/cli-shared-BAuePn3e.d.ts +0 -20
- package/dist/cli-v6XF4hHd.d.ts +0 -20
- package/dist/client-CKLZqMCW.js +0 -650
- package/dist/client-adapter-B_0W-6Fx.js +0 -897
- package/dist/client-factory-CdMLQFeA.js +0 -9
- package/dist/command-auth-BxYfnQzs.js +0 -135
- package/dist/command-execution-startup-CiV5yFW1.js +0 -87
- package/dist/command-handlers-BAWROGlt.js +0 -1609
- package/dist/command-registry-BqTMebZr.js +0 -4
- package/dist/command-registry-C2Y8GeJl.js +0 -9
- package/dist/command-registry-core-Bi-d0-WH.js +0 -110
- package/dist/command-status.runtime-BSXHZzOq.js +0 -90
- package/dist/commands-Z6AfrJar.d.ts +0 -113
- package/dist/commands-acp-BYWOkjAx.js +0 -74
- package/dist/commands-compact.runtime-Cyb7Pu12.js +0 -10
- package/dist/commands-handlers.runtime-DdJ20XTn.js +0 -6154
- package/dist/commands-status-6uhiUw13.js +0 -3
- package/dist/commands-status-BJ5AnkOG.js +0 -16
- package/dist/commands-status.runtime-6uhiUw13.js +0 -3
- package/dist/commands-subagents-control.runtime-DZrrLjSk.js +0 -2
- package/dist/commands-subagents-control.runtime-_R3XgUpp.js +0 -3
- package/dist/commands-system-prompt-CHGtJPnx.js +0 -162
- package/dist/commands-system-prompt-CM23NlDu.js +0 -2
- package/dist/commands.runtime-DUEbtHG1.js +0 -176
- package/dist/compact-BA6lVtLj.js +0 -480
- package/dist/compact-BfC-utPW.js +0 -1141
- package/dist/compact.runtime-BRL2wCqh.js +0 -12
- package/dist/completion-cli-CYKoLZLl.js +0 -315
- package/dist/computer-use-BWgYktaW.js +0 -367
- package/dist/config-B_HanwOV.js +0 -373
- package/dist/config-DhGtxK9v.js +0 -2
- package/dist/config-cli-CI5UtWr-.js +0 -1633
- package/dist/config-mutations-D2GtlLMA.js +0 -159
- package/dist/config-schema-BKOfHz23.d.ts +0 -20
- package/dist/configure-CuPwIiwW.js +0 -3
- package/dist/configure.commands-BWpwrafi.js +0 -1251
- package/dist/configure.commands-qzipmoDP.js +0 -2
- package/dist/context-engine-host-compat-D246ZMR2.js +0 -2
- package/dist/context-engine-host-compat-KMl-oqCw.js +0 -288
- package/dist/context-engine-lifecycle-DvEDHkQz.js +0 -1274
- package/dist/contracts-testkit-Ym3exIK5.d.ts +0 -145
- package/dist/control-auth-B_RiUaHt.js +0 -114
- package/dist/control-service-DcQFx6_O.js +0 -145
- package/dist/control-ui/assets/agents-Bc8cIfWF.js +0 -1008
- package/dist/control-ui/assets/channel-config-extras-DQru4ECs.js +0 -2
- package/dist/control-ui/assets/channels-BfncerPV.js +0 -367
- package/dist/control-ui/assets/cron-DHLcga_r.js +0 -1013
- package/dist/control-ui/assets/debug-DprDzDn1.js +0 -97
- package/dist/control-ui/assets/index-XTZKpkBL.js +0 -7370
- package/dist/control-ui/assets/instances-D1_lOT13.js +0 -57
- package/dist/control-ui/assets/logs-DINx8syb.js +0 -74
- package/dist/control-ui/assets/nodes-BH4XOUmD.js +0 -436
- package/dist/control-ui/assets/sessions-D5Xt25SY.js +0 -399
- package/dist/control-ui/assets/skills-BmayrBHY.js +0 -314
- package/dist/control-ui/assets/skills-shared-CHaYSJ_s.js +0 -11
- package/dist/conversation-binding-runtime-_jhzwiiC.js +0 -4
- package/dist/conversation-runtime-F5kCN0Sj.js +0 -31
- package/dist/core-BpeKfqbI.d.ts +0 -224
- package/dist/core-DE71gncT.js +0 -282
- package/dist/core-api-B4L5WkKc.js +0 -5
- package/dist/core-api-Q9oM19yY.js +0 -2
- package/dist/crestodian-DLpxYmzP.js +0 -55
- package/dist/daocore-runtime-BnYtDbMC.d.ts +0 -151
- package/dist/daocore-tools-wNTIZIO3.js +0 -11727
- package/dist/dashboard-SHmcCcnT.js +0 -263
- package/dist/delivery-BA4di5Tw.js +0 -1002
- package/dist/dev-Cr2Dhgoc.js +0 -97
- package/dist/dialogue-xI4qAuLY.js +0 -37
- package/dist/dir-fetch-tool-6d4yElM4.js +0 -565
- package/dist/dir-list-tool-D2k-hax6.js +0 -100
- package/dist/direct-dm-eGyFHTug.js +0 -64
- package/dist/directive-handling.fast-lane-Ci1l6GN_.js +0 -68
- package/dist/directive-handling.impl-Co3i_YQ4.js +0 -818
- package/dist/directive-handling.impl-DHKC0TrU.js +0 -2
- package/dist/directive-handling.model-selection-bv5KrHOw.js +0 -122
- package/dist/directive-handling.persist.runtime-CPLg-YHh.js +0 -263
- package/dist/dispatch-CdvERWY-.js +0 -1640
- package/dist/dispatch-acp-transcript.runtime-BhQo1XEg.js +0 -40
- package/dist/dispatch-acp.runtime-Dtiu2EgE.js +0 -18
- package/dist/doctor-BzsPHvLP.js +0 -2
- package/dist/doctor-Cg4FWB15.js +0 -6
- package/dist/doctor-config-flow-SYjHcyu4.js +0 -1741
- package/dist/doctor-core-checks-75amkN-e.js +0 -2
- package/dist/doctor-core-checks-B1fu7KDm.js +0 -573
- package/dist/doctor-health-contributions-BMdJKStr.js +0 -696
- package/dist/doctor-health-vLyDQqfq.js +0 -65
- package/dist/doctor-lint-DfvFyBgL.js +0 -94
- package/dist/doctor-prompter-C-dTuOnw.js +0 -58
- package/dist/doctor-state-integrity-Cv-ECLuv.js +0 -1231
- package/dist/dynamic-tools-BG8ijDFH.js +0 -486
- package/dist/embedded-backend-bRfALCWz.js +0 -579
- package/dist/embedded-gateway-stub.runtime-CAh3IhtZ.js +0 -12
- package/dist/embedding-provider-B7kg9IhC.d.ts +0 -16
- package/dist/embedding-provider-jB1zjkZy.d.ts +0 -65
- package/dist/embedding-provider-sea2CddJ.d.ts +0 -21
- package/dist/exec-approvals-BBa28Sct.js +0 -149
- package/dist/file-fetch-tool-DRIsI7eQ.js +0 -124
- package/dist/file-write-tool-vTMh7eW6.js +0 -127
- package/dist/format-nrhTS41q.js +0 -1145
- package/dist/gateway-cli-CCgw11Ik.js +0 -435
- package/dist/gateway-method-runtime-BNAVGCC_.js +0 -21
- package/dist/gateway-runtime-DGdJumdK.d.ts +0 -163
- package/dist/gemini-cli-provider-Bbpd5lx5.d.ts +0 -6
- package/dist/get-reply-DGFCqKen.js +0 -4689
- package/dist/get-reply-from-config.runtime-l7NTyCh5.js +0 -2
- package/dist/graph-users-CGpakgek.js +0 -1419
- package/dist/group-access-D095jQ78.js +0 -112
- package/dist/group-keys-DnxWQtll.d.ts +0 -17
- package/dist/handle-action.guild-admin-B3pALmMq.js +0 -288
- package/dist/harness-Bs-sPbOD.js +0 -61
- package/dist/health-4gWMIKHu.js +0 -4
- package/dist/heartbeat-runner-Sky_Rjw7.js +0 -5
- package/dist/heartbeat-runner.runtime-CRZ-NbrW.js +0 -4
- package/dist/help-B68Ov4LD.js +0 -136
- package/dist/hook-runtime-Cm73yH0T.d.ts +0 -107
- package/dist/hooks-DWSdYas_.js +0 -534
- package/dist/http-registry-CHKiFHCC.d.ts +0 -23
- package/dist/image-generation-runtime-p-dfXZTf.d.ts +0 -21
- package/dist/inbound-direct-dm-runtime-5z3W9Oqn.js +0 -2
- package/dist/inbound-reply-dispatch-D7NeeFC1.js +0 -148
- package/dist/index-CKAHTIU4.d.ts +0 -3971
- package/dist/init-BXF3o80o.js +0 -59
- package/dist/inline-buttons-DsHwKEVU.js +0 -40
- package/dist/interactive-dispatch-BsKWomnh.d.ts +0 -143
- package/dist/interactive-dispatch-CItEYOu3.d.ts +0 -56
- package/dist/internal-events-TAN9dPEj.js +0 -90
- package/dist/isolated-agent-CTrVGI6q.js +0 -2
- package/dist/isolated-agent-DPyibJ8B.js +0 -1118
- package/dist/lifecycle-BwTg0Djv.js +0 -571
- package/dist/list.probe-BpM4PKu7.js +0 -449
- package/dist/list.status-command-BbcloYBd.js +0 -789
- package/dist/llm-slug-generator-UG7Bhj_y.js +0 -78
- package/dist/loader-D6z2PEKl.d.ts +0 -142
- package/dist/local-dispatch.runtime-CU6Y-BDa.js +0 -9
- package/dist/manager-C3AVKMSl.d.ts +0 -356
- package/dist/manager-CSN9j9hh.d.ts +0 -205
- package/dist/manager.runtime-Da5LiiaQ.js +0 -2714
- package/dist/markdown-to-line-BnESmsY4.js +0 -811
- package/dist/mcp-http-C38KS7On.js +0 -2
- package/dist/mcp-http-CcGhAZcF.js +0 -555
- package/dist/media-understanding-provider-BCz5dVl6.js +0 -339
- package/dist/memory-core-host-engine-storage-sWQlfr8J.d.ts +0 -54
- package/dist/memory-embedding-adapter-BrGY0ecB.d.ts +0 -5
- package/dist/message-actions-CQURSOZH.js +0 -145
- package/dist/message-handler-C2U3bt-X.js +0 -1715
- package/dist/message-handler-CwZfuHhP.js +0 -384
- package/dist/message-handler.preflight-Cosa3kg0.js +0 -1125
- package/dist/message-handler.process-BlKFMYXw.js +0 -1484
- package/dist/migration-hAtbc95i.d.ts +0 -45
- package/dist/model-B8M2deNL.js +0 -74
- package/dist/model-Ck-vNyGd.d.ts +0 -33
- package/dist/model-selection-v2wQWgsT.js +0 -272
- package/dist/models-B7IiQBWY.js +0 -104
- package/dist/models-CnWFsPX6.d.ts +0 -24
- package/dist/models-DMNzBNgt.js +0 -2
- package/dist/models-cli-CQaOg02d.js +0 -256
- package/dist/monitor-Bd9kOezJ.js +0 -1370
- package/dist/monitor-Cy6D6MyS.js +0 -715
- package/dist/monitor-DStY23C4.js +0 -834
- package/dist/monitor-DnF8eltK.js +0 -1657
- package/dist/monitor-DrFJ63I1.js +0 -4377
- package/dist/monitor-J8jOsDaJ.js +0 -60
- package/dist/monitor-auth-DKkbt_CR.js +0 -179
- package/dist/monitor-jp3H9Ri_.js +0 -2
- package/dist/monitor-polling.runtime-DPCAacPc.js +0 -883
- package/dist/monitor-tBNmyf1s.js +0 -2788
- package/dist/monitor-webhook.runtime-BnjEsLRS.js +0 -387
- package/dist/monitor.account-Gh8FuMEq.js +0 -5233
- package/dist/monitor.runtime-Bdh6dxyq.js +0 -2
- package/dist/monitor.webhook-BosT2ylg.js +0 -180
- package/dist/node-cli-sessions-B0_DtIxz.js +0 -1228
- package/dist/onboard-CiTp3HuT.js +0 -733
- package/dist/onboard-helpers-6NgX4RkW.js +0 -251
- package/dist/onboard-helpers-BwxJT_0T.js +0 -6
- package/dist/onboard-remote-CNCFouj7.js +0 -212
- package/dist/onboard-remote-DXzWgH_H.js +0 -2
- package/dist/onboard-skills-Dx58zrXg.js +0 -160
- package/dist/onboard-skills-qaynAMqw.js +0 -2
- package/dist/openai-codex-provider-Bj9cyh4I.d.ts +0 -5
- package/dist/openai-http-Dp0cp01u.js +0 -824
- package/dist/openai-provider-Dm3YkkWf.d.ts +0 -5
- package/dist/openresponses-http-acbxr5UW.js +0 -1173
- package/dist/operations-BZVuEl9E.js +0 -805
- package/dist/outbound-adapter-BKGzT1Rl.js +0 -543
- package/dist/outbound-session-route-mWVuRF9I.js +0 -45
- package/dist/outbound.runtime-BTjY78St.js +0 -2
- package/dist/pairing-challenge-DD0D0sfM.d.ts +0 -87
- package/dist/pi-embedded-CFP2IrYS.js +0 -3796
- package/dist/pi-embedded-D8caT0Nm.js +0 -4
- package/dist/pi-embedded.runtime-eBik36nq.js +0 -4
- package/dist/pi-tools-DOiFN8QJ.js +0 -2413
- package/dist/plan-Cq2-YWkv.js +0 -112
- package/dist/plan-DZacZ3Zv.js +0 -81
- package/dist/plugin-BcNkVMQf.d.ts +0 -17
- package/dist/plugin-app-cache-key-CBK84hKp.js +0 -46
- package/dist/plugin-enabled-CMfz3hfi.js +0 -233
- package/dist/plugin-entry-BS5QKDoz.d.ts +0 -47
- package/dist/plugin-k9ChkvvX.js +0 -12396
- package/dist/plugin-registration-DzPoDboh.js +0 -88
- package/dist/plugin-runtime-BNGhLQ-_.d.ts +0 -117
- package/dist/plugin-service-BynKHNHj.d.ts +0 -24
- package/dist/plugin-service-Ckp9CgP5.js +0 -1229
- package/dist/policy-CBa8yH5k.js +0 -680
- package/dist/policy-Dlam-IbU.js +0 -138
- package/dist/prepare.runtime-B8h04--2.js +0 -732
- package/dist/preview-warnings-DPDK9HPk.js +0 -392
- package/dist/probe-Bts3wK7l.js +0 -682
- package/dist/probe-ByHrOECy.js +0 -47
- package/dist/probe-CXqCx5yV.js +0 -2204
- package/dist/probe-fhhJ0LMx.js +0 -2
- package/dist/program-DfNLP_PI.js +0 -131
- package/dist/prompt-overlay-qKGGXVs-.d.ts +0 -23
- package/dist/provider-CeG5mirD.js +0 -8735
- package/dist/provider-D_TXf9b1.js +0 -152
- package/dist/provider-Fb0fhEC5.js +0 -32
- package/dist/provider-api-key-auth-BIph5btg.d.ts +0 -27
- package/dist/provider-auth-result-BFvMZrH6.d.ts +0 -21
- package/dist/provider-catalog-runtime-Du74RUel.d.ts +0 -23
- package/dist/provider-catalog-shared-B3nN3sf2.d.ts +0 -62
- package/dist/provider-dispatcher-DQ0FP7Oj.js +0 -22
- package/dist/provider-hook-runtime-CRpS8VJ_.d.ts +0 -61
- package/dist/provider-model-shared-GrPEK3SY.d.ts +0 -143
- package/dist/provider-models-iUJVn9QI.d.ts +0 -12
- package/dist/provider-policy-DliVEM__.d.ts +0 -30
- package/dist/provider-registration-BxzmE1yB.d.ts +0 -6
- package/dist/provider-registry-B4AQXjYK.d.ts +0 -8
- package/dist/provider-registry-BHyB46kI.d.ts +0 -30
- package/dist/provider-registry-CnfpUSqh.d.ts +0 -8
- package/dist/provider-runtime-D3j0VBbF.d.ts +0 -359
- package/dist/provider-self-hosted-setup-_11XAmRH.d.ts +0 -74
- package/dist/provider-session.runtime-CIMJ-7ay.js +0 -9
- package/dist/provider-stream-mWxYXsAm.d.ts +0 -140
- package/dist/provider-stream-shared-QayId-fm.d.ts +0 -128
- package/dist/provider-xNaUQ5Lv.js +0 -32
- package/dist/provider.runtime-CGsYbZGk.js +0 -2
- package/dist/providers.runtime-fmZQlSRt.d.ts +0 -25
- package/dist/public-surface-loader-CuVkM64A.js +0 -114
- package/dist/pw-ai-BDGftH9e.js +0 -3029
- package/dist/pw-role-snapshot-C_P091Iv.js +0 -333
- package/dist/reaction-level-DKxiNfWB.js +0 -19
- package/dist/reaction-runtime-api-TY4aPHui.js +0 -116
- package/dist/realtime-transcription-CmRx7wX7.d.ts +0 -43
- package/dist/realtime-transcription-provider-BNca2pAl.js +0 -205
- package/dist/realtime-transcription-provider-Csl2NRiB.d.ts +0 -5
- package/dist/realtime-transcription-provider-CtUTdTS4.d.ts +0 -37
- package/dist/realtime-transcription-provider-DKd69ns6.d.ts +0 -28
- package/dist/realtime-transcription-provider-DPj1VZIg.d.ts +0 -32
- package/dist/realtime-voice-CVgV9cqF.d.ts +0 -333
- package/dist/realtime-voice-provider-CmtxwZon.d.ts +0 -5
- package/dist/register-DLjqO2vR.js +0 -2178
- package/dist/register.agent-FV7a6yzo.js +0 -156
- package/dist/register.configure-DrkSyKW3.js +0 -16
- package/dist/register.crestodian-CQGAa8z2.js +0 -24
- package/dist/register.maintenance-tocHfiS3.js +0 -83
- package/dist/register.onboard-BomHnBGE.js +0 -113
- package/dist/register.runtime-6AmV3Vgs.js +0 -54
- package/dist/register.runtime-CSz0gVBB.d.ts +0 -6
- package/dist/register.setup-ENYtNAA5.js +0 -40
- package/dist/register.subclis-BC6TefAM.js +0 -31
- package/dist/register.subclis-DZdEZgSS.js +0 -3
- package/dist/register.subclis-core-C-EfowrU.js +0 -273
- package/dist/registry-VitXYFE8.d.ts +0 -91
- package/dist/registry-types-C4eAzEgQ.d.ts +0 -392
- package/dist/repair-sequencing-l8dFaytn.js +0 -640
- package/dist/reply-delivery-DdeUWVuk.js +0 -196
- package/dist/reply-runtime-Bd91JEZL.js +0 -11
- package/dist/reply.runtime-l7NTyCh5.js +0 -2
- package/dist/request-BY_4UukN.js +0 -54
- package/dist/resolve-allowlist-C4lmxl4V.js +0 -220
- package/dist/result-fallback-classifier-XORMMp30.js +0 -79
- package/dist/root-help-CTW0Wyrf.js +0 -43
- package/dist/route-dOf1WMkJ.js +0 -469
- package/dist/route-resolution-BddNYZEI.js +0 -274
- package/dist/routes-D0xw72Lf.js +0 -3602
- package/dist/routes-TXSPQFWS.js +0 -2
- package/dist/run-DpvUuaWB.js +0 -1162
- package/dist/run-attempt-Bet0PiSc.js +0 -7704
- package/dist/run-command-C5vMVqMt.js +0 -23
- package/dist/run-command-pNDd7NqP.js +0 -2
- package/dist/run-embedded.runtime-CBZV6YWj.js +0 -4
- package/dist/run-execution-cli.runtime-DTQLV8tA.js +0 -4
- package/dist/run-subagent-registry.runtime-DJCvSdhY.js +0 -2
- package/dist/runtime-CNXeG8vX.js +0 -1287
- package/dist/runtime-DEOSWxv9.js +0 -438
- package/dist/runtime-DbTiSX85.d.ts +0 -17
- package/dist/runtime-api-BCM7T4WV.js +0 -17
- package/dist/runtime-api-BTnMvj8L.js +0 -13
- package/dist/runtime-api-By6LEySM.js +0 -3
- package/dist/runtime-api-Cd0b5LPQ.js +0 -4
- package/dist/runtime-api-CtuDiikz.js +0 -21
- package/dist/runtime-api-DjySILXC.js +0 -13
- package/dist/runtime-api-XJTq_pyQ.js +0 -24
- package/dist/runtime-api-k3v6Q0lb2.d.ts +0 -3151
- package/dist/runtime-api.actions-BmsSg8Ai.js +0 -3
- package/dist/runtime-api.actions-C2-n4QQ5.d.ts +0 -23
- package/dist/runtime-api.monitor-DSk7Pd5H.js +0 -6
- package/dist/runtime-api.send-D3sPncy9.js +0 -4
- package/dist/runtime-api.send-t0FX9tXf.d.ts +0 -38
- package/dist/runtime-api.threads-BK9cB4L1.js +0 -2
- package/dist/runtime-channel--Wjr2ePx.js +0 -150
- package/dist/runtime-channel-WdTa9hHZ.js +0 -2
- package/dist/runtime-embedded-pi.runtime-BNYBvaxo.js +0 -2
- package/dist/runtime-r3jS5wSq.js +0 -6179
- package/dist/runtime-taskflow-DMBY6o56.d.ts +0 -435
- package/dist/sanitize-outbound-D6IBCCpn.js +0 -127
- package/dist/sdk-setup-tools-DcDrd8tW.js +0 -8
- package/dist/secrets-OV1uTwRt.js +0 -113
- package/dist/secrets-cli-llC7t41S.js +0 -149
- package/dist/security-audit-BM_fypcl.js +0 -118
- package/dist/security-audit-CQ2yKgF8.js +0 -122
- package/dist/security-audit.runtime-CRgJUegH.js +0 -2
- package/dist/selection-DkJ7MaPC.js +0 -16157
- package/dist/selection-LeUiOSn0.js +0 -3
- package/dist/send-B5TXXeBz.d.ts +0 -231
- package/dist/send-C0ZHzB6o.js +0 -1631
- package/dist/send-CXL3cM-w.js +0 -192
- package/dist/send-CuDA29HM.js +0 -2
- package/dist/send-D7qhwK7Z.js +0 -143
- package/dist/send-DEMaBWpw.d.ts +0 -105
- package/dist/send.components-BNeg1zrc.js +0 -2
- package/dist/send.components-DwRyC_Hc.js +0 -500
- package/dist/send.runtime-DBIUdxpO.js +0 -2
- package/dist/send.types-DywwIqYK.d.ts +0 -160
- package/dist/server-DGcm6Swr.js +0 -24
- package/dist/server-DPvleC-x.js +0 -73
- package/dist/server-context-BWBM4f-_.js +0 -955
- package/dist/server-context-CFgwcLlu.js +0 -2
- package/dist/server-cron-C1kChsjw.js +0 -2989
- package/dist/server-cron-CS1EP5Li.js +0 -2
- package/dist/server-methods-BcIlC8iD.js +0 -16494
- package/dist/server-node-events-BAZCvZOy.js +0 -596
- package/dist/server-plugin-bootstrap-cQUi21Uu.js +0 -70
- package/dist/server-plugins-BRFre223.js +0 -432
- package/dist/server-reload-handlers-DfcsAX-5.js +0 -714
- package/dist/server-restart-sentinel-CFX5zQkM.js +0 -747
- package/dist/server-restart-sentinel-DUvs77Q0.js +0 -2
- package/dist/server-runtime-services-0vm5XmvV.js +0 -2
- package/dist/server-runtime-services-CLz_vkLy.js +0 -267
- package/dist/server-startup-plugins-CPXqqIRV.js +0 -113
- package/dist/server-startup-post-attach-BkNe1Z6g.js +0 -716
- package/dist/server-ws-runtime-rcJeRHFO.js +0 -349
- package/dist/server.impl-a6knQ-N8.js +0 -2586
- package/dist/service-H-BcELwS.js +0 -1446
- package/dist/session-binding-BQliaqL7.js +0 -2
- package/dist/session-binding-DPvZil_F.js +0 -219
- package/dist/session-kill-http-DJMipluP.js +0 -121
- package/dist/session-reset-service-Dn9FU5wA.js +0 -625
- package/dist/session-route-JLWNmJxD.js +0 -93
- package/dist/session-status.runtime-D0OptHcW.js +0 -2
- package/dist/session-subagent-reactivation.runtime-BUmf1vNS.js +0 -2
- package/dist/session-tab-registry-CoBvJVRj.js +0 -521
- package/dist/sessions-history-http-B8CkLDAn.js +0 -430
- package/dist/sessions.runtime-DbNqS_Gy.js +0 -2
- package/dist/setup-CTZUUn1s.js +0 -586
- package/dist/setup-D6fXOEjD.js +0 -2
- package/dist/setup-api-DLPEXHCv.js +0 -29
- package/dist/setup-core-DLXb29jm.js +0 -174
- package/dist/setup-onboard-configure-help-fast-path-CrcZmKPI.js +0 -64
- package/dist/setup-surface--Cct-rCt.js +0 -288
- package/dist/setup-surface-CW8YN207.js +0 -320
- package/dist/setup-surface-DIxcfqD0.js +0 -221
- package/dist/setup-surface-IJ6kmKgi.js +0 -405
- package/dist/setup.finalize-gWpWnCCk.js +0 -582
- package/dist/setup.gateway-config-D_DaSfpW.js +0 -281
- package/dist/setup.migration-import-CYZjCkle.js +0 -2
- package/dist/setup.migration-import-CZJU4scH.js +0 -200
- package/dist/shared-Bp_Fgv6B.js +0 -121
- package/dist/shared-CLqPY0yv.d.ts +0 -115
- package/dist/shared-client-OQdg8NGC.js +0 -629
- package/dist/shared-client-dk1ICVBm.js +0 -2
- package/dist/side-question-CbhRW3UI.js +0 -683
- package/dist/simple-completion-runtime-XIF65b47.d.ts +0 -73
- package/dist/skill-tool-dispatch.runtime-EcycYnWE.js +0 -143
- package/dist/slash-state-BoX6WwB5.js +0 -2166
- package/dist/speech-CvkJG5Mt.d.ts +0 -47
- package/dist/speech-core-MG83lB3i.d.ts +0 -36
- package/dist/speech-provider-1EN9hT-3.d.ts +0 -8
- package/dist/speech-provider-67ebyEcs.js +0 -184
- package/dist/speech-provider-B6tb45De.d.ts +0 -5
- package/dist/speech-provider-C74wAyBX.d.ts +0 -5
- package/dist/speech-provider-CYJoZZpj.d.ts +0 -8
- package/dist/speech-provider-DavEMdKC.d.ts +0 -34
- package/dist/speech-provider-DvFtveg6.d.ts +0 -5
- package/dist/src-CbfOifft.js +0 -4256
- package/dist/startup-context-YF24NARp.js +0 -313
- package/dist/status-message-CcrZdfCO.js +0 -484
- package/dist/status-message.runtime-Cptt1EPV.js +0 -6
- package/dist/status-subagents.runtime-v2eijc4R.js +0 -18
- package/dist/status-text-BWwar3Yc.js +0 -296
- package/dist/status-tn3uQDY7.js +0 -73
- package/dist/status.runtime-BFjTHLiQ.js +0 -2
- package/dist/sticker-cache-Cs7LV_3a.js +0 -206
- package/dist/sticker-vision.runtime-CyPMpoCs.js +0 -17
- package/dist/stream-1rWKMSqV.d.ts +0 -16
- package/dist/stream-Bk9TnoRV.d.ts +0 -10
- package/dist/stream-DZeY9rhs.d.ts +0 -120
- package/dist/stream-DgCoKjcL.d.ts +0 -19
- package/dist/stream-exnufPSG.d.ts +0 -5
- package/dist/stream-wrappers-D2EuY1tP.d.ts +0 -21
- package/dist/subagent-announce-CRjGGxSB.js +0 -354
- package/dist/subagent-announce-delivery-CbfRRdwt.js +0 -958
- package/dist/subagent-control-VTsWynTB.js +0 -508
- package/dist/subagent-hooks-BB__aHul.js +0 -2
- package/dist/subagent-hooks-Cb5fJ2H0.js +0 -146
- package/dist/subagent-hooks-CwVBMhp_.js +0 -2
- package/dist/subagent-hooks-Cx9_GAMF.js +0 -116
- package/dist/subagent-hooks-DOJhvTDx.js +0 -230
- package/dist/subagent-hooks-DUMqhB3r.js +0 -2
- package/dist/subagent-hooks-api-BDGmCxB2.js +0 -22
- package/dist/subagent-hooks-api-CcTdPqP1.js +0 -23
- package/dist/subagent-hooks-api-D18tQta6.js +0 -23
- package/dist/subagent-orphan-recovery-6bNIX25Q.js +0 -352
- package/dist/subagent-registry-DokIxoQ6.js +0 -2351
- package/dist/subagent-registry-tlyJE0hN.js +0 -3
- package/dist/subagent-session-cleanup-BWHQ6rcm.js +0 -525
- package/dist/subagent-spawn-BUdUAwoc.js +0 -1164
- package/dist/target-id-CI1U3MSO.js +0 -107
- package/dist/targets-CbBORUXB.d.ts +0 -10
- package/dist/targets-CgmlXrhv.js +0 -44
- package/dist/targets-D-jSrLUN.js +0 -19
- package/dist/targets-DPDu8x6v.js +0 -19
- package/dist/targets-D_fXvxrg.d.ts +0 -10
- package/dist/testing-D-48HuIK.js +0 -267
- package/dist/thinking-policy-CY16OlCs.d.ts +0 -5
- package/dist/thread-bindings-B9J0nGG7.js +0 -232
- package/dist/thread-bindings-BByWvFZq.js +0 -8
- package/dist/thread-bindings-Cxjm2mLg.js +0 -571
- package/dist/thread-bindings-DQWmglaO.js +0 -228
- package/dist/thread-bindings.discord-api-DWWDvMgL.js +0 -187
- package/dist/thread-bindings.manager-CQW6bNs5.js +0 -2
- package/dist/thread-bindings.manager-DpBYBs9s.js +0 -536
- package/dist/thread-lifecycle-PpB8gTx1.js +0 -1614
- package/dist/token-CBy6YYM_.js +0 -134
- package/dist/tool-BCHcwX9p.js +0 -139
- package/dist/tool-actions.runtime-Cwxr2NmB.js +0 -534
- package/dist/tool-plugin-DHZYdwyJ.d.ts +0 -77
- package/dist/tool-resolution-DQpf531V.js +0 -149
- package/dist/tool-split-ClZW5eN5.d.ts +0 -19
- package/dist/tools-effective-inventory-BHxeIAri.js +0 -204
- package/dist/tools-invoke-http-Bv2LES5Q.js +0 -67
- package/dist/tools-invoke-shared-Cf_ifab9.js +0 -200
- package/dist/transport-stream-D_pZ9Qwv.d.ts +0 -42
- package/dist/tts-CjTcF0YS.js +0 -66
- package/dist/tui-D3_WpyGV.js +0 -2
- package/dist/tui-Y8IezK6P.js +0 -4709
- package/dist/tui-backend-BIJbrfDK.js +0 -256
- package/dist/tui-cli-YVLQJGLU.js +0 -37
- package/dist/types-CnKegQ41.d.ts +0 -786
- package/dist/types-Dyry5PA_2.d.ts +0 -3650
- package/dist/types.public-AUFnQi6j.d.ts +0 -70
- package/dist/update-cli-B7MOXy4Y.js +0 -3664
- package/dist/video-generation-runtime-Cc8klYNS.d.ts +0 -21
- package/dist/video-model-catalog-XG42YlJS.d.ts +0 -16
- package/dist/vision-tools-kEwnV2UO.js +0 -1409
- package/dist/web-search-DH1W_lfx.js +0 -62
- package/dist/web-search-provider.runtime-BX9TezsY.js +0 -328
- package/dist/web-search-provider.runtime-BhRjYeyp.js +0 -2
- package/dist/webhook-targets--wGRjxMd.d.ts +0 -99
- package/dist/xai-oauth-BZQ--94U.js +0 -479
- package/dist/xai-user-agent-SpZaKTGR.js +0 -32
- package/dist/zod-schema.core-BhLPa6BF.d.ts +0 -166
- /package/dist/{accounts-CqgATPC-2.d.ts → accounts-CqgATPC-.d.ts} +0 -0
- /package/dist/{acp-runtime-backend-DU5R8SXu.js → acp-runtime-backend-DHyoMnZY.js} +0 -0
- /package/dist/{channel-actions-Ce2Sna1a.js → channel-actions-B5OPAiNK.js} +0 -0
- /package/dist/{command-status-runtime-Cj5vB8lc.js → command-status-runtime-BqQvv1BR.js} +0 -0
- /package/dist/{delegate-BeKeQwNR.js → delegate-B1QIF1j8.js} +0 -0
- /package/dist/{dispatch-acp-DXlzEM_A.js → dispatch-acp-Ch9ZmM4b.js} +0 -0
- /package/dist/{heartbeat-runner-Dncw_0KS.js → heartbeat-runner-BkgH94IS.js} +0 -0
- /package/dist/{library-6cU4n1-c.js → library-DP1oARlw.js} +0 -0
- /package/dist/{run-executor.runtime-DjwaphFT.js → run-executor.runtime-Czk4Lxkj.js} +0 -0
- /package/dist/{video-generation-core-BVVgDSdq.d.ts → server-plugins-BVVgDSdq.d.ts} +0 -0
- /package/dist/{shared-BE5PSFeb.js → shared-SiM6kZAE.js} +0 -0
- /package/dist/{model-ref-mtPT-mlX.d.ts → video-generation-core-mtPT-mlX.d.ts} +0 -0
package/dist/monitor-tBNmyf1s.js
DELETED
|
@@ -1,2788 +0,0 @@
|
|
|
1
|
-
import { v as resolveStateDir } from "./paths-ZwPDM6zn.js";
|
|
2
|
-
import { c as isRecord, y as truncateUtf16Safe } from "./utils-CNnMhEDp.js";
|
|
3
|
-
import { s as normalizeStringEntries } from "./string-normalization-DiPHgdft.js";
|
|
4
|
-
import { t as createNonExitingRuntime } from "./runtime-E_A14BX_.js";
|
|
5
|
-
import { n as resolvePreferredDaoCoreTmpDir } from "./tmp-daocore-dir-kDRsiZXM.js";
|
|
6
|
-
import { a as shouldLogVerbose, r as logVerbose, s as warn, t as danger } from "./globals-CTkTxjGR.js";
|
|
7
|
-
import { i as getRuntimeConfig } from "./io-CcynUC5m.js";
|
|
8
|
-
import { t as sanitizeTerminalText } from "./safe-text-J_0sTthZ.js";
|
|
9
|
-
import { u as resolveStorePath } from "./paths-8MFrTNIB.js";
|
|
10
|
-
import { a as readSessionUpdatedAt } from "./store-BMkMyEnW.js";
|
|
11
|
-
import { c as kindFromMime } from "./mime-DppuT-pZ.js";
|
|
12
|
-
import { a as enqueueSystemEvent } from "./system-events-BcFIWc-9.js";
|
|
13
|
-
import { h as isInsideCode, m as findCodeRegions } from "./assistant-visible-text-BoF6Ixue.js";
|
|
14
|
-
import { r as stripInlineDirectiveTagsForDelivery } from "./directive-tags-CClLEtM7.js";
|
|
15
|
-
import { i as writeJsonFileAtomically, n as readJsonFileWithFallback } from "./json-store-GaAZLixM.js";
|
|
16
|
-
import { a as settleReplyDispatcher, t as dispatchInboundMessage } from "./dispatch-CdvERWY-.js";
|
|
17
|
-
import { i as deliverTextOrMediaReply, m as resolveSendableOutboundReplyParts } from "./reply-payload-DMPQsrQC.js";
|
|
18
|
-
import { n as resolveChannelGroupRequireMention, t as resolveChannelGroupPolicy } from "./group-policy-BZKACSgl.js";
|
|
19
|
-
import { a as resolveInboundLastRouteSessionKey, i as resolveAgentRoute } from "./resolve-route-CRSNQKby.js";
|
|
20
|
-
import { a as readChannelAllowFromStore, d as upsertChannelPairingRequest } from "./pairing-store-CxQuF0Pk.js";
|
|
21
|
-
import { n as resolveInboundMentionDecision } from "./mention-gating-3P8aSD7o.js";
|
|
22
|
-
import { c as defineStableChannelIngressIdentity, n as createChannelIngressResolver } from "./runtime-GmtZRRes.js";
|
|
23
|
-
import { a as warnMissingProviderGroupPolicyFallbackOnce, i as resolveOpenProviderRuntimeGroupPolicy, r as resolveDefaultGroupPolicy } from "./runtime-group-policy-CmZDlIwd.js";
|
|
24
|
-
import { l as resolvePinnedMainDmOwnerFromAllowlist } from "./dm-policy-shared-DvyNntb4.js";
|
|
25
|
-
import { u as saveMediaBuffer } from "./store-53qCOCD8.js";
|
|
26
|
-
import { t as loadWebMedia } from "./web-media-Cvh2Nkiu.js";
|
|
27
|
-
import { i as resolveHumanDelayConfig } from "./identity-CQsFzQh6.js";
|
|
28
|
-
import { c as resolveTextChunkLimit, o as chunkTextWithMode, s as resolveChunkMode } from "./chunk-DirkQqDP.js";
|
|
29
|
-
import { t as createMessageReceiptFromOutboundResults } from "./receipt-vrVTwZtS.js";
|
|
30
|
-
import { t as isInboundPathAllowed } from "./inbound-path-policy-DEbcUBWg.js";
|
|
31
|
-
import "./temp-path-B9Am6Z7s.js";
|
|
32
|
-
import { t as resolveOutboundAttachmentFromUrl } from "./outbound-attachment-U5O0c_aP.js";
|
|
33
|
-
import { n as buildMentionRegexes, r as matchesMentionPatterns } from "./mentions-CxYnZfYf.js";
|
|
34
|
-
import { n as createReplyDispatcherWithTyping } from "./reply-dispatcher-C3a0y_0v.js";
|
|
35
|
-
import { t as finalizeInboundContext } from "./inbound-context-Cg0uCtqQ.js";
|
|
36
|
-
import "./runtime-env-B7syXtKu.js";
|
|
37
|
-
import "./string-coerce-runtime-DcopKqDR.js";
|
|
38
|
-
import "./state-paths-C63v_0Tp.js";
|
|
39
|
-
import "./routing-tpBhvjSA.js";
|
|
40
|
-
import { t as hasControlCommand } from "./command-detection-4C6lkmWa.js";
|
|
41
|
-
import { a as resolveEnvelopeFormatOptions, i as formatInboundFromLabel, r as formatInboundEnvelope } from "./envelope-DUI2KFD9.js";
|
|
42
|
-
import { t as recordInboundSession } from "./session-DzYTJdkx.js";
|
|
43
|
-
import "./history-tSxfyRRl.js";
|
|
44
|
-
import { t as createChannelReplyPipeline } from "./reply-pipeline-Bm6cMDK_.js";
|
|
45
|
-
import { t as evaluateSupplementalContextVisibility } from "./context-visibility-C9pX_aod.js";
|
|
46
|
-
import { t as createChannelHistoryWindow } from "./history-window-C5iLdHGW.js";
|
|
47
|
-
import { t as resolveMarkdownTableMode } from "./markdown-tables-Dk_iPU8Q.js";
|
|
48
|
-
import { t as convertMarkdownTables } from "./tables-Bff93hv8.js";
|
|
49
|
-
import "./channel-policy-BdHBOuWF.js";
|
|
50
|
-
import "./reply-history-DtXwRuqo.js";
|
|
51
|
-
import { t as requireRuntimeConfig } from "./plugin-config-runtime-Do2X7q_h.js";
|
|
52
|
-
import { t as resolveChannelContextVisibilityMode } from "./context-visibility-Si-TIKp_.js";
|
|
53
|
-
import "./reply-runtime-Bd91JEZL.js";
|
|
54
|
-
import { d as runInboundReplyTurn } from "./inbound-reply-dispatch-D7NeeFC1.js";
|
|
55
|
-
import { t as waitForTransportReady } from "./transport-ready-CxrgFDFi.js";
|
|
56
|
-
import "./web-media-DkR41HE5.js";
|
|
57
|
-
import "./system-event-runtime-C-Rn-SPr.js";
|
|
58
|
-
import "./transport-ready-runtime-CObgq_V-.js";
|
|
59
|
-
import { r as normalizeScpRemoteHost } from "./scp-host-CIH1Vnml.js";
|
|
60
|
-
import "./runtime-config-snapshot-LpIAYlab.js";
|
|
61
|
-
import "./media-runtime-BgoHtCXx.js";
|
|
62
|
-
import "./media-store-OUXlIgle.js";
|
|
63
|
-
import { n as resolveConfiguredBindingRoute, r as resolveRuntimeConversationBindingRoute } from "./binding-routing-DahKvjr3.js";
|
|
64
|
-
import "./conversation-runtime-F5kCN0Sj.js";
|
|
65
|
-
import "./text-chunking-CAiWc6uE.js";
|
|
66
|
-
import "./agent-runtime-BOMioAX6.js";
|
|
67
|
-
import "./security-runtime-ZkIitjef.js";
|
|
68
|
-
import "./markdown-table-runtime-xR9__QEn.js";
|
|
69
|
-
import "./command-auth-native-A9u4UiS4.js";
|
|
70
|
-
import { n as logInboundDrop, r as logTypingFailure } from "./logging-Dr3f0mtP.js";
|
|
71
|
-
import "./channel-feedback-TFG-nswW.js";
|
|
72
|
-
import { o as createChannelInboundDebouncer, s as shouldDebounceTextInbound } from "./channel-inbound-CNdyzYlz.js";
|
|
73
|
-
import "./channel-ingress-runtime-DztBpKpZ.js";
|
|
74
|
-
import { a as deliverInboundReplyWithMessageSendContext } from "./channel-message-BntYSBp1.js";
|
|
75
|
-
import { t as createChannelPairingChallengeIssuer } from "./channel-pairing-DH0uve3l.js";
|
|
76
|
-
import "./session-store-runtime-iBECMRQO.js";
|
|
77
|
-
import "./text-utility-runtime-Ca71VHQh.js";
|
|
78
|
-
import { i as resolveIMessageAccount } from "./accounts-DteRRvB9.js";
|
|
79
|
-
import { t as createIMessageRpcClient } from "./client-gxUhSVxo.js";
|
|
80
|
-
import { n as imessageRpcSupportsMethod, t as getCachedIMessagePrivateApiStatus } from "./private-api-status-hXzk6Zzf.js";
|
|
81
|
-
import { c as parseIMessageTarget, o as normalizeIMessageHandle, r as isAllowedIMessageReplyContextSender, s as parseIMessageAllowTarget, t as formatIMessageChatTarget } from "./targets-B75TeI7V.js";
|
|
82
|
-
import { n as isKnownFromMeIMessageMessageId, r as rememberIMessageReplyCache } from "./monitor-reply-cache-EAySxtp2.js";
|
|
83
|
-
import { t as probeIMessage } from "./probe-CdjBA0Db.js";
|
|
84
|
-
import { n as resolveIMessageInboundConversationId, t as sanitizeOutboundText } from "./sanitize-outbound-D6IBCCpn.js";
|
|
85
|
-
import { n as resolveIMessageAttachmentRoots, r as resolveIMessageRemoteAttachmentRoots } from "./media-contract-RbwqUy7-.js";
|
|
86
|
-
import { t as extractMarkdownFormatRuns } from "./markdown-format-Cqti91oT.js";
|
|
87
|
-
import fs from "node:fs";
|
|
88
|
-
import path from "node:path";
|
|
89
|
-
import fs$1 from "node:fs/promises";
|
|
90
|
-
import { createHash } from "node:crypto";
|
|
91
|
-
//#region extensions/imessage/src/chat.ts
|
|
92
|
-
function buildChatTargetParams(to, opts) {
|
|
93
|
-
const cfg = requireRuntimeConfig(opts.cfg, "iMessage chat action");
|
|
94
|
-
const account = opts.account ?? resolveIMessageAccount({
|
|
95
|
-
cfg,
|
|
96
|
-
accountId: opts.accountId
|
|
97
|
-
});
|
|
98
|
-
const target = parseIMessageTarget(opts.chatId ? formatIMessageChatTarget(opts.chatId) : to);
|
|
99
|
-
const params = {};
|
|
100
|
-
if (target.kind === "chat_id") params.chat_id = target.chatId;
|
|
101
|
-
else if (target.kind === "chat_guid") params.chat_guid = target.chatGuid;
|
|
102
|
-
else if (target.kind === "chat_identifier") params.chat_identifier = target.chatIdentifier;
|
|
103
|
-
else params.to = target.to;
|
|
104
|
-
return {
|
|
105
|
-
params,
|
|
106
|
-
service: opts.service ?? (target.kind === "handle" ? target.service : void 0) ?? account.config.service,
|
|
107
|
-
region: opts.region?.trim() || account.config.region?.trim() || "US",
|
|
108
|
-
account
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
async function runChatAction(method, params, opts) {
|
|
112
|
-
const cfg = requireRuntimeConfig(opts.cfg, "iMessage chat action");
|
|
113
|
-
const account = opts.account ?? resolveIMessageAccount({
|
|
114
|
-
cfg,
|
|
115
|
-
accountId: opts.accountId
|
|
116
|
-
});
|
|
117
|
-
const cliPath = opts.cliPath?.trim() || account.config.cliPath?.trim() || "imsg";
|
|
118
|
-
const dbPath = opts.dbPath?.trim() || account.config.dbPath?.trim();
|
|
119
|
-
const client = opts.client ?? await createIMessageRpcClient({
|
|
120
|
-
cliPath,
|
|
121
|
-
dbPath
|
|
122
|
-
});
|
|
123
|
-
const shouldClose = !opts.client;
|
|
124
|
-
try {
|
|
125
|
-
return await client.request(method, params, { timeoutMs: opts.timeoutMs });
|
|
126
|
-
} finally {
|
|
127
|
-
if (shouldClose) await client.stop();
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
async function sendIMessageTyping(to, isTyping, opts) {
|
|
131
|
-
const { params, service } = buildChatTargetParams(to, opts);
|
|
132
|
-
params.typing = isTyping;
|
|
133
|
-
if (service) params.service = service;
|
|
134
|
-
await runChatAction("typing", params, opts);
|
|
135
|
-
}
|
|
136
|
-
async function markIMessageChatRead(to, opts) {
|
|
137
|
-
const { params } = buildChatTargetParams(to, opts);
|
|
138
|
-
await runChatAction("read", params, opts);
|
|
139
|
-
}
|
|
140
|
-
//#endregion
|
|
141
|
-
//#region extensions/imessage/src/monitor/persisted-echo-cache.ts
|
|
142
|
-
const PERSISTED_ECHO_TTL_MS = 720 * 60 * 1e3;
|
|
143
|
-
const MAX_PERSISTED_ECHO_ENTRIES = 256;
|
|
144
|
-
const PERSISTED_ECHO_DIR_MODE = 448;
|
|
145
|
-
const PERSISTED_ECHO_FILE_MODE = 384;
|
|
146
|
-
function resolvePersistedEchoPath() {
|
|
147
|
-
return path.join(resolveStateDir(), "imessage", "sent-echoes.jsonl");
|
|
148
|
-
}
|
|
149
|
-
function clampPersistedEchoModes(filePath) {
|
|
150
|
-
try {
|
|
151
|
-
fs.chmodSync(path.dirname(filePath), PERSISTED_ECHO_DIR_MODE);
|
|
152
|
-
fs.chmodSync(filePath, PERSISTED_ECHO_FILE_MODE);
|
|
153
|
-
} catch {}
|
|
154
|
-
}
|
|
155
|
-
function normalizeText$1(text) {
|
|
156
|
-
return text?.replace(/\r\n?/g, "\n").trim() || void 0;
|
|
157
|
-
}
|
|
158
|
-
function normalizeMessageId(messageId) {
|
|
159
|
-
const normalized = messageId?.trim();
|
|
160
|
-
if (!normalized || normalized === "ok" || normalized === "unknown") return;
|
|
161
|
-
return normalized;
|
|
162
|
-
}
|
|
163
|
-
function parseEntry(line) {
|
|
164
|
-
try {
|
|
165
|
-
const parsed = JSON.parse(line);
|
|
166
|
-
if (typeof parsed.scope !== "string" || typeof parsed.timestamp !== "number") return null;
|
|
167
|
-
return {
|
|
168
|
-
scope: parsed.scope,
|
|
169
|
-
text: typeof parsed.text === "string" ? parsed.text : void 0,
|
|
170
|
-
messageId: typeof parsed.messageId === "string" ? parsed.messageId : void 0,
|
|
171
|
-
timestamp: parsed.timestamp
|
|
172
|
-
};
|
|
173
|
-
} catch {
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
let mirror = null;
|
|
178
|
-
let persistenceFailureLogged = false;
|
|
179
|
-
function reportFailure(scope, err) {
|
|
180
|
-
if (persistenceFailureLogged) return;
|
|
181
|
-
persistenceFailureLogged = true;
|
|
182
|
-
logVerbose(`imessage echo-cache: ${scope} disabled after first failure: ${String(err)}`);
|
|
183
|
-
}
|
|
184
|
-
function loadMirrorIfStale() {
|
|
185
|
-
const filePath = resolvePersistedEchoPath();
|
|
186
|
-
let mtimeMs;
|
|
187
|
-
try {
|
|
188
|
-
mtimeMs = fs.statSync(filePath).mtimeMs;
|
|
189
|
-
} catch (err) {
|
|
190
|
-
if (err?.code !== "ENOENT") reportFailure("stat", err);
|
|
191
|
-
mirror = {
|
|
192
|
-
entries: [],
|
|
193
|
-
mtimeMs: 0
|
|
194
|
-
};
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
if (mirror && mirror.mtimeMs === mtimeMs) return;
|
|
198
|
-
let raw;
|
|
199
|
-
try {
|
|
200
|
-
raw = fs.readFileSync(filePath, "utf8");
|
|
201
|
-
} catch (err) {
|
|
202
|
-
reportFailure("read", err);
|
|
203
|
-
mirror = {
|
|
204
|
-
entries: [],
|
|
205
|
-
mtimeMs
|
|
206
|
-
};
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
const cutoff = Date.now() - PERSISTED_ECHO_TTL_MS;
|
|
210
|
-
mirror = {
|
|
211
|
-
entries: raw.split(/\n+/).map(parseEntry).filter((entry) => Boolean(entry && entry.timestamp >= cutoff)).slice(-256),
|
|
212
|
-
mtimeMs
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
function readRecentEntries() {
|
|
216
|
-
loadMirrorIfStale();
|
|
217
|
-
return mirror?.entries ?? [];
|
|
218
|
-
}
|
|
219
|
-
const COMPACT_AT_ENTRY_COUNT = MAX_PERSISTED_ECHO_ENTRIES * 2;
|
|
220
|
-
function compactRecentEntries(entries) {
|
|
221
|
-
const filePath = resolvePersistedEchoPath();
|
|
222
|
-
try {
|
|
223
|
-
fs.mkdirSync(path.dirname(filePath), {
|
|
224
|
-
recursive: true,
|
|
225
|
-
mode: PERSISTED_ECHO_DIR_MODE
|
|
226
|
-
});
|
|
227
|
-
fs.writeFileSync(filePath, entries.map((entry) => JSON.stringify(entry)).join("\n") + (entries.length ? "\n" : ""), {
|
|
228
|
-
encoding: "utf8",
|
|
229
|
-
mode: PERSISTED_ECHO_FILE_MODE
|
|
230
|
-
});
|
|
231
|
-
clampPersistedEchoModes(filePath);
|
|
232
|
-
} catch (err) {
|
|
233
|
-
reportFailure("compact", err);
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
let mtimeMs = 0;
|
|
237
|
-
try {
|
|
238
|
-
mtimeMs = fs.statSync(filePath).mtimeMs;
|
|
239
|
-
} catch {}
|
|
240
|
-
mirror = {
|
|
241
|
-
entries: [...entries],
|
|
242
|
-
mtimeMs
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
function appendEntry(entry) {
|
|
246
|
-
const filePath = resolvePersistedEchoPath();
|
|
247
|
-
try {
|
|
248
|
-
fs.mkdirSync(path.dirname(filePath), {
|
|
249
|
-
recursive: true,
|
|
250
|
-
mode: PERSISTED_ECHO_DIR_MODE
|
|
251
|
-
});
|
|
252
|
-
fs.appendFileSync(filePath, `${JSON.stringify(entry)}\n`, {
|
|
253
|
-
encoding: "utf8",
|
|
254
|
-
mode: PERSISTED_ECHO_FILE_MODE
|
|
255
|
-
});
|
|
256
|
-
clampPersistedEchoModes(filePath);
|
|
257
|
-
} catch (err) {
|
|
258
|
-
reportFailure("append", err);
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
let mtimeMs = 0;
|
|
262
|
-
try {
|
|
263
|
-
mtimeMs = fs.statSync(filePath).mtimeMs;
|
|
264
|
-
} catch {}
|
|
265
|
-
if (mirror) mirror = {
|
|
266
|
-
entries: [...mirror.entries, entry],
|
|
267
|
-
mtimeMs
|
|
268
|
-
};
|
|
269
|
-
else mirror = {
|
|
270
|
-
entries: [entry],
|
|
271
|
-
mtimeMs
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
function rememberPersistedIMessageEcho(params) {
|
|
275
|
-
const entry = {
|
|
276
|
-
scope: params.scope,
|
|
277
|
-
text: normalizeText$1(params.text),
|
|
278
|
-
messageId: normalizeMessageId(params.messageId),
|
|
279
|
-
timestamp: Date.now()
|
|
280
|
-
};
|
|
281
|
-
if (!entry.text && !entry.messageId) return;
|
|
282
|
-
loadMirrorIfStale();
|
|
283
|
-
appendEntry(entry);
|
|
284
|
-
const total = mirror?.entries.length ?? 0;
|
|
285
|
-
const cutoff = Date.now() - PERSISTED_ECHO_TTL_MS;
|
|
286
|
-
const oldestStale = mirror?.entries[0] && mirror.entries[0].timestamp < cutoff;
|
|
287
|
-
if (total > COMPACT_AT_ENTRY_COUNT || oldestStale) compactRecentEntries((mirror?.entries ?? []).filter((e) => e.timestamp >= cutoff).slice(-256));
|
|
288
|
-
}
|
|
289
|
-
function hasPersistedIMessageEcho(params) {
|
|
290
|
-
const text = normalizeText$1(params.text);
|
|
291
|
-
const messageId = normalizeMessageId(params.messageId);
|
|
292
|
-
if (!text && !messageId) return false;
|
|
293
|
-
for (const entry of readRecentEntries()) {
|
|
294
|
-
if (entry.scope !== params.scope) continue;
|
|
295
|
-
if (messageId && entry.messageId === messageId) return true;
|
|
296
|
-
if (text && entry.text === text) return true;
|
|
297
|
-
}
|
|
298
|
-
return false;
|
|
299
|
-
}
|
|
300
|
-
//#endregion
|
|
301
|
-
//#region extensions/imessage/src/send.ts
|
|
302
|
-
const MAX_REPLY_TO_ID_LENGTH = 256;
|
|
303
|
-
function stripUnsafeReplyTagChars(value) {
|
|
304
|
-
let next = "";
|
|
305
|
-
for (const ch of value) {
|
|
306
|
-
const code = ch.charCodeAt(0);
|
|
307
|
-
if (code >= 0 && code <= 31 || code === 127 || ch === "[" || ch === "]") continue;
|
|
308
|
-
next += ch;
|
|
309
|
-
}
|
|
310
|
-
return next;
|
|
311
|
-
}
|
|
312
|
-
function sanitizeReplyToId(rawReplyToId) {
|
|
313
|
-
const trimmed = rawReplyToId?.trim();
|
|
314
|
-
if (!trimmed) return;
|
|
315
|
-
const sanitized = stripUnsafeReplyTagChars(trimmed).trim();
|
|
316
|
-
if (!sanitized) return;
|
|
317
|
-
if (sanitized.length > MAX_REPLY_TO_ID_LENGTH) return sanitized.slice(0, MAX_REPLY_TO_ID_LENGTH);
|
|
318
|
-
return sanitized;
|
|
319
|
-
}
|
|
320
|
-
function resolveMessageId(result) {
|
|
321
|
-
if (!result) return null;
|
|
322
|
-
const raw = typeof result.messageId === "string" && result.messageId.trim() || typeof result.message_id === "string" && result.message_id.trim() || typeof result.id === "string" && result.id.trim() || typeof result.guid === "string" && result.guid.trim() || (typeof result.message_id === "number" ? String(result.message_id) : null) || (typeof result.id === "number" ? String(result.id) : null);
|
|
323
|
-
return raw ? raw.trim() : null;
|
|
324
|
-
}
|
|
325
|
-
function resolveOutboundEchoText(text, mediaContentType) {
|
|
326
|
-
if (text.trim()) return text;
|
|
327
|
-
const kind = kindFromMime(mediaContentType ?? void 0);
|
|
328
|
-
if (!kind) return;
|
|
329
|
-
return kind === "image" ? "<media:image>" : `<media:${kind}>`;
|
|
330
|
-
}
|
|
331
|
-
function createIMessageSendReceipt(params) {
|
|
332
|
-
const messageId = params.messageId.trim();
|
|
333
|
-
const results = messageId && messageId !== "unknown" && messageId !== "ok" ? [{
|
|
334
|
-
channel: "imessage",
|
|
335
|
-
messageId,
|
|
336
|
-
meta: { targetKind: params.target.kind }
|
|
337
|
-
}] : [];
|
|
338
|
-
if (results[0]) {
|
|
339
|
-
if (params.target.kind === "chat_id") results[0].chatId = String(params.target.chatId);
|
|
340
|
-
else if (params.target.kind === "chat_guid") results[0].conversationId = params.target.chatGuid;
|
|
341
|
-
else if (params.target.kind === "chat_identifier") results[0].conversationId = params.target.chatIdentifier;
|
|
342
|
-
}
|
|
343
|
-
const receiptParams = {
|
|
344
|
-
results,
|
|
345
|
-
kind: params.kind
|
|
346
|
-
};
|
|
347
|
-
if (params.replyToId) receiptParams.replyToId = params.replyToId;
|
|
348
|
-
return createMessageReceiptFromOutboundResults(receiptParams);
|
|
349
|
-
}
|
|
350
|
-
function resolveOutboundEchoScope(params) {
|
|
351
|
-
if (params.target.kind === "chat_id") return `${params.accountId}:${formatIMessageChatTarget(params.target.chatId)}`;
|
|
352
|
-
if (params.target.kind === "chat_guid") return `${params.accountId}:chat_guid:${params.target.chatGuid}`;
|
|
353
|
-
if (params.target.kind === "chat_identifier") return `${params.accountId}:chat_identifier:${params.target.chatIdentifier}`;
|
|
354
|
-
return `${params.accountId}:imessage:${params.target.to}`;
|
|
355
|
-
}
|
|
356
|
-
async function sendMessageIMessage(to, text, opts) {
|
|
357
|
-
const cfg = requireRuntimeConfig(opts.config, "iMessage send");
|
|
358
|
-
const account = opts.account ?? resolveIMessageAccount({
|
|
359
|
-
cfg,
|
|
360
|
-
accountId: opts.accountId
|
|
361
|
-
});
|
|
362
|
-
const cliPath = opts.cliPath?.trim() || account.config.cliPath?.trim() || "imsg";
|
|
363
|
-
const dbPath = opts.dbPath?.trim() || account.config.dbPath?.trim();
|
|
364
|
-
const target = parseIMessageTarget(opts.chatId ? formatIMessageChatTarget(opts.chatId) : to);
|
|
365
|
-
const service = opts.service ?? (target.kind === "handle" ? target.service : void 0) ?? account.config.service;
|
|
366
|
-
const region = opts.region?.trim() || account.config.region?.trim() || "US";
|
|
367
|
-
const maxBytes = typeof opts.maxBytes === "number" ? opts.maxBytes : typeof account.config.mediaMaxMb === "number" ? account.config.mediaMaxMb * 1024 * 1024 : 16 * 1024 * 1024;
|
|
368
|
-
let message = text ?? "";
|
|
369
|
-
let filePath;
|
|
370
|
-
let mediaContentType;
|
|
371
|
-
if (opts.mediaUrl?.trim()) {
|
|
372
|
-
const resolved = await (opts.resolveAttachmentImpl ?? resolveOutboundAttachmentFromUrl)(opts.mediaUrl.trim(), maxBytes, {
|
|
373
|
-
localRoots: opts.mediaLocalRoots,
|
|
374
|
-
readFile: opts.mediaReadFile
|
|
375
|
-
});
|
|
376
|
-
filePath = resolved.path;
|
|
377
|
-
mediaContentType = resolved.contentType ?? void 0;
|
|
378
|
-
}
|
|
379
|
-
if (!message.trim() && !filePath) throw new Error("iMessage send requires text or media");
|
|
380
|
-
if (message.trim()) {
|
|
381
|
-
const tableMode = resolveMarkdownTableMode({
|
|
382
|
-
cfg,
|
|
383
|
-
channel: "imessage",
|
|
384
|
-
accountId: account.accountId
|
|
385
|
-
});
|
|
386
|
-
message = convertMarkdownTables(message, tableMode);
|
|
387
|
-
}
|
|
388
|
-
message = stripInlineDirectiveTagsForDelivery(message).text;
|
|
389
|
-
if (!message.trim() && !filePath) throw new Error("iMessage send requires text or media");
|
|
390
|
-
const formatted = message.trim() ? extractMarkdownFormatRuns(message) : {
|
|
391
|
-
text: message,
|
|
392
|
-
ranges: []
|
|
393
|
-
};
|
|
394
|
-
message = formatted.text;
|
|
395
|
-
if (!message.trim() && !filePath) throw new Error("iMessage send requires text or media");
|
|
396
|
-
const echoText = resolveOutboundEchoText(message, filePath ? mediaContentType : void 0);
|
|
397
|
-
const resolvedReplyToId = sanitizeReplyToId(opts.replyToId);
|
|
398
|
-
const params = {
|
|
399
|
-
text: message,
|
|
400
|
-
service: service || "auto",
|
|
401
|
-
region
|
|
402
|
-
};
|
|
403
|
-
if (resolvedReplyToId) params.reply_to = resolvedReplyToId;
|
|
404
|
-
if (formatted.ranges.length > 0) params.formatting = formatted.ranges;
|
|
405
|
-
if (filePath) params.file = filePath;
|
|
406
|
-
if (target.kind === "chat_id") params.chat_id = target.chatId;
|
|
407
|
-
else if (target.kind === "chat_guid") params.chat_guid = target.chatGuid;
|
|
408
|
-
else if (target.kind === "chat_identifier") params.chat_identifier = target.chatIdentifier;
|
|
409
|
-
else params.to = target.to;
|
|
410
|
-
const client = opts.client ?? (opts.createClient ? await opts.createClient({
|
|
411
|
-
cliPath,
|
|
412
|
-
dbPath
|
|
413
|
-
}) : await createIMessageRpcClient({
|
|
414
|
-
cliPath,
|
|
415
|
-
dbPath
|
|
416
|
-
}));
|
|
417
|
-
const shouldClose = !opts.client;
|
|
418
|
-
try {
|
|
419
|
-
const result = await client.request("send", params, { timeoutMs: opts.timeoutMs });
|
|
420
|
-
const resolvedId = resolveMessageId(result);
|
|
421
|
-
const messageId = resolvedId ?? (result?.ok ? "ok" : "unknown");
|
|
422
|
-
const echoScope = resolveOutboundEchoScope({
|
|
423
|
-
accountId: account.accountId,
|
|
424
|
-
target
|
|
425
|
-
});
|
|
426
|
-
if (echoScope) rememberPersistedIMessageEcho({
|
|
427
|
-
scope: echoScope,
|
|
428
|
-
text: echoText,
|
|
429
|
-
messageId: resolvedId ?? void 0
|
|
430
|
-
});
|
|
431
|
-
if (resolvedId) rememberIMessageReplyCache({
|
|
432
|
-
accountId: account.accountId,
|
|
433
|
-
messageId: resolvedId,
|
|
434
|
-
chatGuid: target.kind === "chat_guid" ? target.chatGuid : void 0,
|
|
435
|
-
chatIdentifier: target.kind === "chat_identifier" ? target.chatIdentifier : target.kind === "handle" ? `${target.service === "sms" ? "SMS" : "iMessage"};-;${target.to}` : void 0,
|
|
436
|
-
chatId: target.kind === "chat_id" ? target.chatId : void 0,
|
|
437
|
-
timestamp: Date.now(),
|
|
438
|
-
isFromMe: true
|
|
439
|
-
});
|
|
440
|
-
return {
|
|
441
|
-
messageId,
|
|
442
|
-
sentText: message,
|
|
443
|
-
...echoText ? { echoText } : {},
|
|
444
|
-
receipt: createIMessageSendReceipt({
|
|
445
|
-
messageId,
|
|
446
|
-
target,
|
|
447
|
-
kind: filePath ? "media" : "text",
|
|
448
|
-
...resolvedReplyToId ? { replyToId: resolvedReplyToId } : {}
|
|
449
|
-
})
|
|
450
|
-
};
|
|
451
|
-
} finally {
|
|
452
|
-
if (shouldClose) await client.stop();
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
//#endregion
|
|
456
|
-
//#region extensions/imessage/src/monitor/abort-handler.ts
|
|
457
|
-
function attachIMessageMonitorAbortHandler(params) {
|
|
458
|
-
const abort = params.abortSignal;
|
|
459
|
-
if (!abort) return () => {};
|
|
460
|
-
const onAbort = () => {
|
|
461
|
-
const subscriptionId = params.getSubscriptionId();
|
|
462
|
-
if (subscriptionId) params.client.request("watch.unsubscribe", { subscription: subscriptionId }).catch(() => {});
|
|
463
|
-
params.client.stop().catch(() => {});
|
|
464
|
-
};
|
|
465
|
-
abort.addEventListener("abort", onAbort, { once: true });
|
|
466
|
-
return () => abort.removeEventListener("abort", onAbort);
|
|
467
|
-
}
|
|
468
|
-
//#endregion
|
|
469
|
-
//#region extensions/imessage/src/monitor/catchup.ts
|
|
470
|
-
const DEFAULT_MAX_AGE_MINUTES = 120;
|
|
471
|
-
const MAX_MAX_AGE_MINUTES = 720;
|
|
472
|
-
const DEFAULT_PER_RUN_LIMIT = 50;
|
|
473
|
-
const MAX_PER_RUN_LIMIT = 500;
|
|
474
|
-
const DEFAULT_FIRST_RUN_LOOKBACK_MINUTES = 30;
|
|
475
|
-
const DEFAULT_MAX_FAILURE_RETRIES = 10;
|
|
476
|
-
const MAX_MAX_FAILURE_RETRIES = 1e3;
|
|
477
|
-
const MAX_FAILURE_RETRY_MAP_SIZE = 5e3;
|
|
478
|
-
function resolveStateDirFromEnv(env = process.env) {
|
|
479
|
-
if (env.DAOCORE_STATE_DIR?.trim()) return resolveStateDir(env);
|
|
480
|
-
if (env.VITEST || env.NODE_ENV === "test") {
|
|
481
|
-
const name = "daocore-vitest-" + process.pid;
|
|
482
|
-
return path.join(resolvePreferredDaoCoreTmpDir(), name);
|
|
483
|
-
}
|
|
484
|
-
return resolveStateDir(env);
|
|
485
|
-
}
|
|
486
|
-
function resolveCursorFilePath(accountId) {
|
|
487
|
-
const safePrefix = accountId.replace(/[^a-zA-Z0-9_-]/g, "_") || "account";
|
|
488
|
-
const hash = createHash("sha256").update(accountId, "utf8").digest("hex").slice(0, 12);
|
|
489
|
-
return path.join(resolveStateDirFromEnv(), "imessage", "catchup", `${safePrefix}__${hash}.json`);
|
|
490
|
-
}
|
|
491
|
-
function sanitizeFailureRetriesInput(raw) {
|
|
492
|
-
if (!raw || typeof raw !== "object") return {};
|
|
493
|
-
const out = {};
|
|
494
|
-
for (const [guid, count] of Object.entries(raw)) {
|
|
495
|
-
if (!guid || typeof guid !== "string") continue;
|
|
496
|
-
if (typeof count !== "number" || !Number.isFinite(count) || count <= 0) continue;
|
|
497
|
-
out[guid] = Math.floor(count);
|
|
498
|
-
}
|
|
499
|
-
return out;
|
|
500
|
-
}
|
|
501
|
-
/**
|
|
502
|
-
* Cursor file path: `<daocoreStateDir>/imessage/catchup/<safePrefix>__<sha256[:12]>.json`.
|
|
503
|
-
* `daocoreStateDir` resolves through `DAOCORE_STATE_DIR` (or the plugin-sdk default,
|
|
504
|
-
* `~/.daocore`). On a default install the cursor lands at
|
|
505
|
-
* `~/.daocore/imessage/catchup/<safePrefix>__<sha256[:12]>.json`.
|
|
506
|
-
*/
|
|
507
|
-
async function loadIMessageCatchupCursor(accountId) {
|
|
508
|
-
const { value } = await readJsonFileWithFallback(resolveCursorFilePath(accountId), null);
|
|
509
|
-
if (!value || typeof value !== "object") return null;
|
|
510
|
-
if (typeof value.lastSeenMs !== "number" || !Number.isFinite(value.lastSeenMs)) return null;
|
|
511
|
-
if (typeof value.lastSeenRowid !== "number" || !Number.isFinite(value.lastSeenRowid)) return null;
|
|
512
|
-
const failureRetries = sanitizeFailureRetriesInput(value.failureRetries);
|
|
513
|
-
const hasRetries = Object.keys(failureRetries).length > 0;
|
|
514
|
-
return {
|
|
515
|
-
lastSeenMs: value.lastSeenMs,
|
|
516
|
-
lastSeenRowid: value.lastSeenRowid,
|
|
517
|
-
updatedAt: typeof value.updatedAt === "number" ? value.updatedAt : 0,
|
|
518
|
-
...hasRetries ? { failureRetries } : {}
|
|
519
|
-
};
|
|
520
|
-
}
|
|
521
|
-
async function saveIMessageCatchupCursor(accountId, next) {
|
|
522
|
-
const filePath = resolveCursorFilePath(accountId);
|
|
523
|
-
const sanitized = sanitizeFailureRetriesInput(next.failureRetries);
|
|
524
|
-
const hasRetries = Object.keys(sanitized).length > 0;
|
|
525
|
-
await writeJsonFileAtomically(filePath, {
|
|
526
|
-
lastSeenMs: next.lastSeenMs,
|
|
527
|
-
lastSeenRowid: next.lastSeenRowid,
|
|
528
|
-
updatedAt: Date.now(),
|
|
529
|
-
...hasRetries ? { failureRetries: sanitized } : {}
|
|
530
|
-
});
|
|
531
|
-
}
|
|
532
|
-
/**
|
|
533
|
-
* Bound the retry map so a pathological storm of unique failing GUIDs
|
|
534
|
-
* cannot grow the cursor file without limit. Keeps the `maxSize` entries
|
|
535
|
-
* with the highest counts (closest to give-up) when over the bound.
|
|
536
|
-
*/
|
|
537
|
-
function capFailureRetriesMap(map, maxSize = MAX_FAILURE_RETRY_MAP_SIZE) {
|
|
538
|
-
const entries = Object.entries(map);
|
|
539
|
-
if (entries.length <= maxSize) return map;
|
|
540
|
-
entries.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));
|
|
541
|
-
const capped = {};
|
|
542
|
-
for (let i = 0; i < maxSize; i++) {
|
|
543
|
-
const [guid, count] = entries[i];
|
|
544
|
-
capped[guid] = count;
|
|
545
|
-
}
|
|
546
|
-
return capped;
|
|
547
|
-
}
|
|
548
|
-
function clampInt(value, min, max, fallback) {
|
|
549
|
-
if (typeof value !== "number" || !Number.isFinite(value)) return fallback;
|
|
550
|
-
return Math.min(max, Math.max(min, Math.floor(value)));
|
|
551
|
-
}
|
|
552
|
-
function resolveCatchupConfig(raw) {
|
|
553
|
-
return {
|
|
554
|
-
enabled: Boolean(raw?.enabled),
|
|
555
|
-
maxAgeMinutes: clampInt(raw?.maxAgeMinutes, 1, MAX_MAX_AGE_MINUTES, DEFAULT_MAX_AGE_MINUTES),
|
|
556
|
-
perRunLimit: clampInt(raw?.perRunLimit, 1, MAX_PER_RUN_LIMIT, DEFAULT_PER_RUN_LIMIT),
|
|
557
|
-
firstRunLookbackMinutes: clampInt(raw?.firstRunLookbackMinutes, 1, MAX_MAX_AGE_MINUTES, DEFAULT_FIRST_RUN_LOOKBACK_MINUTES),
|
|
558
|
-
maxFailureRetries: clampInt(raw?.maxFailureRetries, 1, MAX_MAX_FAILURE_RETRIES, DEFAULT_MAX_FAILURE_RETRIES)
|
|
559
|
-
};
|
|
560
|
-
}
|
|
561
|
-
/**
|
|
562
|
-
* One catchup pass. Loads the cursor, fetches `messages.history`, replays
|
|
563
|
-
* each row through `dispatch`, advances the cursor on success / give-up,
|
|
564
|
-
* persists the cursor, returns a summary.
|
|
565
|
-
*
|
|
566
|
-
* The fetch and dispatch functions are injected so this loop is unit-testable
|
|
567
|
-
* without standing up an `imsg` daemon. The wiring in `monitor-provider.ts`
|
|
568
|
-
* passes the live `client.request("messages.history", ...)` adapter as
|
|
569
|
-
* `fetch` and the `evaluateIMessageInbound` + `dispatchInboundMessage`
|
|
570
|
-
* pipeline as `dispatch`.
|
|
571
|
-
*/
|
|
572
|
-
async function performIMessageCatchup(params) {
|
|
573
|
-
const now = params.now ?? Date.now();
|
|
574
|
-
const cfg = params.config;
|
|
575
|
-
const cursor = await loadIMessageCatchupCursor(params.accountId);
|
|
576
|
-
const lookbackMs = cursor === null ? cfg.firstRunLookbackMinutes * 6e4 : cfg.maxAgeMinutes * 6e4;
|
|
577
|
-
const ageBoundMs = now - cfg.maxAgeMinutes * 6e4;
|
|
578
|
-
const windowStartMs = Math.max(cursor?.lastSeenMs ?? now - lookbackMs, ageBoundMs);
|
|
579
|
-
const windowEndMs = now;
|
|
580
|
-
const sinceRowid = cursor?.lastSeenRowid ?? 0;
|
|
581
|
-
const summary = {
|
|
582
|
-
querySucceeded: false,
|
|
583
|
-
fetchedCount: 0,
|
|
584
|
-
replayed: 0,
|
|
585
|
-
skippedFromMe: 0,
|
|
586
|
-
skippedPreCursor: 0,
|
|
587
|
-
skippedGivenUp: 0,
|
|
588
|
-
failed: 0,
|
|
589
|
-
givenUp: 0,
|
|
590
|
-
cursorBefore: cursor ? {
|
|
591
|
-
lastSeenMs: cursor.lastSeenMs,
|
|
592
|
-
lastSeenRowid: cursor.lastSeenRowid
|
|
593
|
-
} : null,
|
|
594
|
-
cursorAfter: {
|
|
595
|
-
lastSeenMs: cursor?.lastSeenMs ?? windowStartMs,
|
|
596
|
-
lastSeenRowid: cursor?.lastSeenRowid ?? 0
|
|
597
|
-
},
|
|
598
|
-
windowStartMs,
|
|
599
|
-
windowEndMs
|
|
600
|
-
};
|
|
601
|
-
let fetchResult;
|
|
602
|
-
try {
|
|
603
|
-
fetchResult = await params.fetch({
|
|
604
|
-
sinceMs: windowStartMs,
|
|
605
|
-
sinceRowid,
|
|
606
|
-
limit: cfg.perRunLimit
|
|
607
|
-
});
|
|
608
|
-
} catch (err) {
|
|
609
|
-
params.warn?.(`imessage catchup: fetch failed: ${String(err)}`);
|
|
610
|
-
return summary;
|
|
611
|
-
}
|
|
612
|
-
if (!fetchResult.resolved) {
|
|
613
|
-
params.warn?.(`imessage catchup: fetch returned unresolved result`);
|
|
614
|
-
return summary;
|
|
615
|
-
}
|
|
616
|
-
summary.querySucceeded = true;
|
|
617
|
-
summary.fetchedCount = fetchResult.rows.length;
|
|
618
|
-
const rows = fetchResult.rows.toSorted((a, b) => a.rowid - b.rowid);
|
|
619
|
-
const failureRetries = { ...cursor?.failureRetries };
|
|
620
|
-
const cursorBeforeMs = cursor?.lastSeenMs ?? windowStartMs;
|
|
621
|
-
const cursorBeforeRowid = cursor?.lastSeenRowid ?? 0;
|
|
622
|
-
let highWatermarkMs = cursorBeforeMs;
|
|
623
|
-
let highWatermarkRowid = cursorBeforeRowid;
|
|
624
|
-
let earliestHeldFailureRow = null;
|
|
625
|
-
for (const row of rows) {
|
|
626
|
-
if (row.rowid <= sinceRowid) {
|
|
627
|
-
summary.skippedPreCursor += 1;
|
|
628
|
-
continue;
|
|
629
|
-
}
|
|
630
|
-
if (row.date < ageBoundMs) {
|
|
631
|
-
summary.skippedPreCursor += 1;
|
|
632
|
-
highWatermarkMs = Math.max(highWatermarkMs, row.date);
|
|
633
|
-
highWatermarkRowid = Math.max(highWatermarkRowid, row.rowid);
|
|
634
|
-
continue;
|
|
635
|
-
}
|
|
636
|
-
if (row.isFromMe) {
|
|
637
|
-
summary.skippedFromMe += 1;
|
|
638
|
-
highWatermarkMs = Math.max(highWatermarkMs, row.date);
|
|
639
|
-
highWatermarkRowid = Math.max(highWatermarkRowid, row.rowid);
|
|
640
|
-
continue;
|
|
641
|
-
}
|
|
642
|
-
const priorCount = failureRetries[row.guid] ?? 0;
|
|
643
|
-
if (priorCount >= cfg.maxFailureRetries) {
|
|
644
|
-
summary.skippedGivenUp += 1;
|
|
645
|
-
highWatermarkMs = Math.max(highWatermarkMs, row.date);
|
|
646
|
-
highWatermarkRowid = Math.max(highWatermarkRowid, row.rowid);
|
|
647
|
-
continue;
|
|
648
|
-
}
|
|
649
|
-
let dispatched;
|
|
650
|
-
try {
|
|
651
|
-
dispatched = await params.dispatch(row);
|
|
652
|
-
} catch (err) {
|
|
653
|
-
params.warn?.(`imessage catchup: dispatch threw for guid=${row.guid}: ${String(err)}`);
|
|
654
|
-
dispatched = { ok: false };
|
|
655
|
-
}
|
|
656
|
-
if (dispatched.ok) {
|
|
657
|
-
summary.replayed += 1;
|
|
658
|
-
delete failureRetries[row.guid];
|
|
659
|
-
highWatermarkMs = Math.max(highWatermarkMs, row.date);
|
|
660
|
-
highWatermarkRowid = Math.max(highWatermarkRowid, row.rowid);
|
|
661
|
-
continue;
|
|
662
|
-
}
|
|
663
|
-
const nextCount = priorCount + 1;
|
|
664
|
-
failureRetries[row.guid] = nextCount;
|
|
665
|
-
summary.failed += 1;
|
|
666
|
-
if (nextCount >= cfg.maxFailureRetries) {
|
|
667
|
-
summary.givenUp += 1;
|
|
668
|
-
params.warn?.(`imessage catchup: giving up on guid=${row.guid} after ${nextCount} failures; advancing cursor past it`);
|
|
669
|
-
highWatermarkMs = Math.max(highWatermarkMs, row.date);
|
|
670
|
-
highWatermarkRowid = Math.max(highWatermarkRowid, row.rowid);
|
|
671
|
-
continue;
|
|
672
|
-
}
|
|
673
|
-
if (earliestHeldFailureRow === null || row.rowid < earliestHeldFailureRow.rowid) earliestHeldFailureRow = row;
|
|
674
|
-
}
|
|
675
|
-
if (earliestHeldFailureRow === null) {
|
|
676
|
-
if (typeof fetchResult.highWatermarkMs === "number") highWatermarkMs = Math.max(highWatermarkMs, fetchResult.highWatermarkMs);
|
|
677
|
-
if (typeof fetchResult.highWatermarkRowid === "number") highWatermarkRowid = Math.max(highWatermarkRowid, fetchResult.highWatermarkRowid);
|
|
678
|
-
}
|
|
679
|
-
let lastSeenMs;
|
|
680
|
-
let lastSeenRowid;
|
|
681
|
-
if (earliestHeldFailureRow !== null) {
|
|
682
|
-
lastSeenMs = Math.max(cursorBeforeMs, earliestHeldFailureRow.date - 1);
|
|
683
|
-
lastSeenRowid = Math.max(cursorBeforeRowid, earliestHeldFailureRow.rowid - 1);
|
|
684
|
-
} else {
|
|
685
|
-
lastSeenMs = highWatermarkMs;
|
|
686
|
-
lastSeenRowid = highWatermarkRowid;
|
|
687
|
-
}
|
|
688
|
-
const capped = capFailureRetriesMap(failureRetries);
|
|
689
|
-
summary.cursorAfter = {
|
|
690
|
-
lastSeenMs,
|
|
691
|
-
lastSeenRowid
|
|
692
|
-
};
|
|
693
|
-
await saveIMessageCatchupCursor(params.accountId, {
|
|
694
|
-
lastSeenMs,
|
|
695
|
-
lastSeenRowid,
|
|
696
|
-
failureRetries: capped
|
|
697
|
-
});
|
|
698
|
-
if (summary.replayed > 0 || summary.failed > 0 || summary.givenUp > 0) params.log?.(`imessage catchup: replayed=${summary.replayed} skippedFromMe=${summary.skippedFromMe} skippedGivenUp=${summary.skippedGivenUp} failed=${summary.failed} givenUp=${summary.givenUp} fetchedCount=${summary.fetchedCount}`);
|
|
699
|
-
return summary;
|
|
700
|
-
}
|
|
701
|
-
//#endregion
|
|
702
|
-
//#region extensions/imessage/src/monitor/strip-imsg-length-prefixed-text.ts
|
|
703
|
-
const utf8Decoder = new TextDecoder();
|
|
704
|
-
function readVarint(buf, start) {
|
|
705
|
-
let offset = start;
|
|
706
|
-
let value = 0;
|
|
707
|
-
let shift = 0;
|
|
708
|
-
while (offset < buf.length && shift <= 28) {
|
|
709
|
-
const byte = buf[offset];
|
|
710
|
-
offset += 1;
|
|
711
|
-
value |= (byte & 127) << shift;
|
|
712
|
-
if ((byte & 128) === 0) return {
|
|
713
|
-
nextOffset: offset,
|
|
714
|
-
value
|
|
715
|
-
};
|
|
716
|
-
shift += 7;
|
|
717
|
-
}
|
|
718
|
-
return null;
|
|
719
|
-
}
|
|
720
|
-
function tryStripImessageLengthPrefixedUtf8Buffer(buf) {
|
|
721
|
-
const key = readVarint(buf, 0);
|
|
722
|
-
if (!key || key.nextOffset >= buf.length) return null;
|
|
723
|
-
if (key.value !== 10) return null;
|
|
724
|
-
const length = readVarint(buf, key.nextOffset);
|
|
725
|
-
if (!length || length.value === 0) return null;
|
|
726
|
-
if (length.nextOffset + length.value !== buf.length) return null;
|
|
727
|
-
return buf.subarray(length.nextOffset, buf.length);
|
|
728
|
-
}
|
|
729
|
-
function stripImessageLengthPrefixedUtf8Text(text) {
|
|
730
|
-
if (!text) return text;
|
|
731
|
-
const stripped = tryStripImessageLengthPrefixedUtf8Buffer(Buffer.from(text, "utf8"));
|
|
732
|
-
if (!stripped) return text;
|
|
733
|
-
const inner = utf8Decoder.decode(stripped);
|
|
734
|
-
return inner.length > 0 ? inner : text;
|
|
735
|
-
}
|
|
736
|
-
//#endregion
|
|
737
|
-
//#region extensions/imessage/src/monitor/parse-notification.ts
|
|
738
|
-
function isOptionalString(value) {
|
|
739
|
-
return value === void 0 || value === null || typeof value === "string";
|
|
740
|
-
}
|
|
741
|
-
function isOptionalStringOrNumber(value) {
|
|
742
|
-
return value === void 0 || value === null || typeof value === "string" || typeof value === "number";
|
|
743
|
-
}
|
|
744
|
-
function isOptionalNumber(value) {
|
|
745
|
-
return value === void 0 || value === null || typeof value === "number";
|
|
746
|
-
}
|
|
747
|
-
function isOptionalBoolean(value) {
|
|
748
|
-
return value === void 0 || value === null || typeof value === "boolean";
|
|
749
|
-
}
|
|
750
|
-
function isOptionalStringArray(value) {
|
|
751
|
-
return value === void 0 || value === null || Array.isArray(value) && value.every((entry) => typeof entry === "string");
|
|
752
|
-
}
|
|
753
|
-
function isOptionalAttachments(value) {
|
|
754
|
-
if (value === void 0 || value === null) return true;
|
|
755
|
-
if (!Array.isArray(value)) return false;
|
|
756
|
-
return value.every((attachment) => {
|
|
757
|
-
if (!isRecord(attachment)) return false;
|
|
758
|
-
return isOptionalString(attachment.original_path) && isOptionalString(attachment.mime_type) && isOptionalBoolean(attachment.missing) && isOptionalString(attachment.transfer_name) && isOptionalString(attachment.uti);
|
|
759
|
-
});
|
|
760
|
-
}
|
|
761
|
-
function parseIMessageNotification(raw) {
|
|
762
|
-
if (!isRecord(raw)) return null;
|
|
763
|
-
const maybeMessage = raw.message;
|
|
764
|
-
if (!isRecord(maybeMessage)) return null;
|
|
765
|
-
const message = maybeMessage;
|
|
766
|
-
if (!isOptionalNumber(message.id) || !isOptionalString(message.guid) || !isOptionalNumber(message.chat_id) || !isOptionalString(message.sender) || !isOptionalString(message.destination_caller_id) || !isOptionalBoolean(message.is_from_me) || !isOptionalString(message.text) || !isOptionalStringOrNumber(message.reply_to_id) || !isOptionalString(message.reply_to_text) || !isOptionalString(message.reply_to_sender) || !isOptionalString(message.created_at) || !isOptionalBoolean(message.is_reaction) || !isOptionalBoolean(message.is_tapback) || !isOptionalString(message.associated_message_guid) || !isOptionalNumber(message.associated_message_type) || !isOptionalString(message.reaction_type) || !isOptionalString(message.reaction_emoji) || !isOptionalBoolean(message.is_reaction_add) || !isOptionalString(message.reacted_to_guid) || !isOptionalAttachments(message.attachments) || !isOptionalString(message.chat_identifier) || !isOptionalString(message.chat_guid) || !isOptionalString(message.chat_name) || !isOptionalStringArray(message.participants) || !isOptionalBoolean(message.is_group)) return null;
|
|
767
|
-
return {
|
|
768
|
-
...message,
|
|
769
|
-
text: typeof message.text === "string" ? stripImessageLengthPrefixedUtf8Text(message.text) : message.text,
|
|
770
|
-
reply_to_text: typeof message.reply_to_text === "string" ? stripImessageLengthPrefixedUtf8Text(message.reply_to_text) : message.reply_to_text
|
|
771
|
-
};
|
|
772
|
-
}
|
|
773
|
-
//#endregion
|
|
774
|
-
//#region extensions/imessage/src/monitor/catchup-bridge.ts
|
|
775
|
-
const PER_CHAT_HISTORY_LIMIT_CAP = 500;
|
|
776
|
-
const CATCHUP_CHATS_LIST_LIMIT = 200;
|
|
777
|
-
const CATCHUP_RPC_TIMEOUT_MS = 3e4;
|
|
778
|
-
/**
|
|
779
|
-
* Wire `performIMessageCatchup` against the live `imsg` JSON-RPC client.
|
|
780
|
-
*
|
|
781
|
-
* Catchup recovers messages that landed in `chat.db` while the gateway was
|
|
782
|
-
* offline (crash, restart, mac sleep) by:
|
|
783
|
-
* 1. listing recently-active chats via `chats.list`,
|
|
784
|
-
* 2. fetching per-chat history since the cursor via `messages.history`,
|
|
785
|
-
* 3. sorting cross-chat by `rowid`, capping at `perRunLimit`,
|
|
786
|
-
* 4. replaying each row through the same `dispatchPayload` handler used
|
|
787
|
-
* by the live notification loop, so existing dedupe / coalesce / echo
|
|
788
|
-
* / read-receipt behavior covers replayed rows for free.
|
|
789
|
-
*
|
|
790
|
-
* Runs at most once per `monitorIMessageProvider` invocation, between
|
|
791
|
-
* `watch.subscribe` and the live dispatch loop. Anything that arrives during
|
|
792
|
-
* catchup itself flows through live dispatch; the existing inbound-dedupe
|
|
793
|
-
* cache absorbs any overlap.
|
|
794
|
-
*/
|
|
795
|
-
async function runIMessageCatchup(params) {
|
|
796
|
-
const { client, accountId, config, includeAttachments, dispatchPayload, runtime } = params;
|
|
797
|
-
const log = (msg) => runtime?.log?.(msg);
|
|
798
|
-
const warnLog = (msg) => runtime?.log?.(warn(msg));
|
|
799
|
-
const payloadByGuid = /* @__PURE__ */ new Map();
|
|
800
|
-
const fetchFn = async ({ sinceMs, sinceRowid, limit }) => {
|
|
801
|
-
let chatsResult;
|
|
802
|
-
try {
|
|
803
|
-
chatsResult = await client.request("chats.list", { limit: CATCHUP_CHATS_LIST_LIMIT }, { timeoutMs: CATCHUP_RPC_TIMEOUT_MS });
|
|
804
|
-
} catch (err) {
|
|
805
|
-
warnLog(`imessage catchup: chats.list failed: ${String(err)}`);
|
|
806
|
-
return {
|
|
807
|
-
resolved: false,
|
|
808
|
-
rows: []
|
|
809
|
-
};
|
|
810
|
-
}
|
|
811
|
-
const chats = chatsResult?.chats ?? [];
|
|
812
|
-
const sinceISO = new Date(sinceMs).toISOString();
|
|
813
|
-
const collected = [];
|
|
814
|
-
const perChatLimit = Math.min(limit, PER_CHAT_HISTORY_LIMIT_CAP);
|
|
815
|
-
let rawWatermarkRowid = -Infinity;
|
|
816
|
-
let rawWatermarkMs = -Infinity;
|
|
817
|
-
for (const chat of chats) {
|
|
818
|
-
const chatId = typeof chat.id === "number" && Number.isFinite(chat.id) ? chat.id : null;
|
|
819
|
-
if (chatId === null) continue;
|
|
820
|
-
const lastMs = typeof chat.last_message_at === "string" ? Date.parse(chat.last_message_at) : NaN;
|
|
821
|
-
if (Number.isFinite(lastMs) && lastMs < sinceMs) continue;
|
|
822
|
-
let historyResult;
|
|
823
|
-
try {
|
|
824
|
-
historyResult = await client.request("messages.history", {
|
|
825
|
-
chat_id: chatId,
|
|
826
|
-
limit: perChatLimit,
|
|
827
|
-
start: sinceISO,
|
|
828
|
-
attachments: includeAttachments
|
|
829
|
-
}, { timeoutMs: CATCHUP_RPC_TIMEOUT_MS });
|
|
830
|
-
} catch (err) {
|
|
831
|
-
warnLog(`imessage catchup: messages.history failed for chat_id=${chatId}: ${String(err)}`);
|
|
832
|
-
continue;
|
|
833
|
-
}
|
|
834
|
-
const messages = Array.isArray(historyResult?.messages) ? historyResult.messages : [];
|
|
835
|
-
for (const raw of messages) {
|
|
836
|
-
const rawRecord = raw && typeof raw === "object" ? raw : null;
|
|
837
|
-
const rawRowid = rawRecord && typeof rawRecord.id === "number" && Number.isFinite(rawRecord.id) ? rawRecord.id : null;
|
|
838
|
-
const rawCreatedAt = rawRecord && typeof rawRecord.created_at === "string" ? rawRecord.created_at : null;
|
|
839
|
-
const rawDateMs = rawCreatedAt ? Date.parse(rawCreatedAt) : NaN;
|
|
840
|
-
if (rawRowid !== null) rawWatermarkRowid = Math.max(rawWatermarkRowid, rawRowid);
|
|
841
|
-
if (Number.isFinite(rawDateMs)) rawWatermarkMs = Math.max(rawWatermarkMs, rawDateMs);
|
|
842
|
-
const payload = parseIMessageNotification({ message: raw });
|
|
843
|
-
if (!payload) continue;
|
|
844
|
-
const guid = payload.guid?.trim();
|
|
845
|
-
const rowid = typeof payload.id === "number" ? payload.id : null;
|
|
846
|
-
const dateMs = typeof payload.created_at === "string" ? Date.parse(payload.created_at) : NaN;
|
|
847
|
-
if (!guid || rowid === null || !Number.isFinite(rowid) || !Number.isFinite(dateMs)) continue;
|
|
848
|
-
if (rowid <= sinceRowid) continue;
|
|
849
|
-
collected.push({
|
|
850
|
-
guid,
|
|
851
|
-
rowid,
|
|
852
|
-
date: dateMs,
|
|
853
|
-
isFromMe: payload.is_from_me === true
|
|
854
|
-
});
|
|
855
|
-
payloadByGuid.set(guid, payload);
|
|
856
|
-
}
|
|
857
|
-
}
|
|
858
|
-
const sorted = collected.toSorted((a, b) => a.rowid - b.rowid);
|
|
859
|
-
const capped = sorted.slice(0, limit);
|
|
860
|
-
const isCapTruncated = capped.length < sorted.length;
|
|
861
|
-
if (isCapTruncated) {
|
|
862
|
-
warnLog(`imessage catchup: fetched ${sorted.length} rows across chats, capped to perRunLimit=${limit} (oldest first); next startup picks up the rest`);
|
|
863
|
-
const keep = new Set(capped.map((row) => row.guid));
|
|
864
|
-
for (const guid of payloadByGuid.keys()) if (!keep.has(guid)) payloadByGuid.delete(guid);
|
|
865
|
-
}
|
|
866
|
-
let effectiveWatermarkRowid = rawWatermarkRowid;
|
|
867
|
-
let effectiveWatermarkMs = rawWatermarkMs;
|
|
868
|
-
if (isCapTruncated && capped.length > 0) {
|
|
869
|
-
const last = capped.at(-1);
|
|
870
|
-
if (last) {
|
|
871
|
-
effectiveWatermarkRowid = Math.min(effectiveWatermarkRowid, last.rowid);
|
|
872
|
-
effectiveWatermarkMs = Math.min(effectiveWatermarkMs, last.date);
|
|
873
|
-
}
|
|
874
|
-
} else if (isCapTruncated && capped.length === 0) {
|
|
875
|
-
effectiveWatermarkRowid = NaN;
|
|
876
|
-
effectiveWatermarkMs = NaN;
|
|
877
|
-
}
|
|
878
|
-
return {
|
|
879
|
-
resolved: true,
|
|
880
|
-
rows: capped,
|
|
881
|
-
...Number.isFinite(effectiveWatermarkRowid) ? { highWatermarkRowid: effectiveWatermarkRowid } : {},
|
|
882
|
-
...Number.isFinite(effectiveWatermarkMs) ? { highWatermarkMs: effectiveWatermarkMs } : {}
|
|
883
|
-
};
|
|
884
|
-
};
|
|
885
|
-
const dispatchFn = async (row) => {
|
|
886
|
-
const payload = payloadByGuid.get(row.guid);
|
|
887
|
-
if (!payload) {
|
|
888
|
-
warnLog(`imessage catchup: missing payload for guid=${row.guid}, skipping`);
|
|
889
|
-
return { ok: false };
|
|
890
|
-
}
|
|
891
|
-
try {
|
|
892
|
-
await dispatchPayload(payload);
|
|
893
|
-
return { ok: true };
|
|
894
|
-
} catch (err) {
|
|
895
|
-
warnLog(`imessage catchup: dispatch threw for guid=${row.guid}: ${String(err)}`);
|
|
896
|
-
return { ok: false };
|
|
897
|
-
}
|
|
898
|
-
};
|
|
899
|
-
return await performIMessageCatchup({
|
|
900
|
-
accountId,
|
|
901
|
-
config,
|
|
902
|
-
fetch: fetchFn,
|
|
903
|
-
dispatch: dispatchFn,
|
|
904
|
-
log,
|
|
905
|
-
warn: warnLog,
|
|
906
|
-
...params.now ? { now: params.now() } : {}
|
|
907
|
-
});
|
|
908
|
-
}
|
|
909
|
-
//#endregion
|
|
910
|
-
//#region extensions/imessage/src/monitor/coalesce.ts
|
|
911
|
-
/**
|
|
912
|
-
* Bounds on the merged output when multiple inbound iMessage payloads are
|
|
913
|
-
* folded into one agent turn. Caps each merge so a sender who
|
|
914
|
-
* rapid-fires DMs inside the debounce window cannot amplify the downstream
|
|
915
|
-
* prompt past a safe ceiling. Every source GUID still surfaces via
|
|
916
|
-
* `coalescedMessageGuids` so a future replay path can recognize duplicates.
|
|
917
|
-
*/
|
|
918
|
-
const MAX_COALESCED_TEXT_CHARS = 4e3;
|
|
919
|
-
/**
|
|
920
|
-
* Combine consecutive same-sender iMessage payloads into a single payload for
|
|
921
|
-
* downstream dispatch. Used when the debouncer flushes a bucket containing
|
|
922
|
-
* more than one event — e.g. Apple's split-send for `Dump https://example.com`
|
|
923
|
-
* arriving as two separate `chat.db` rows ~0.8-2.0 s apart.
|
|
924
|
-
*
|
|
925
|
-
* The first payload anchors the merged shape (preserving its GUID for reply
|
|
926
|
-
* threading). Text is concatenated with deduplication, attachments are merged
|
|
927
|
-
* (capped), and the latest `created_at` wins so downstream sees the most
|
|
928
|
-
* recent activity timestamp.
|
|
929
|
-
*/
|
|
930
|
-
function combineIMessagePayloads(payloads) {
|
|
931
|
-
if (payloads.length === 0) throw new Error("combineIMessagePayloads: cannot combine empty payloads");
|
|
932
|
-
if (payloads.length === 1) return payloads[0];
|
|
933
|
-
const first = payloads[0];
|
|
934
|
-
const last = payloads[payloads.length - 1];
|
|
935
|
-
const boundedPayloads = payloads.length > 10 ? [...payloads.slice(0, 9), last] : payloads;
|
|
936
|
-
const seenTexts = /* @__PURE__ */ new Set();
|
|
937
|
-
const textParts = [];
|
|
938
|
-
for (const payload of boundedPayloads) {
|
|
939
|
-
const text = (payload.text ?? "").trim();
|
|
940
|
-
if (!text) continue;
|
|
941
|
-
const normalized = text.toLowerCase();
|
|
942
|
-
if (seenTexts.has(normalized)) continue;
|
|
943
|
-
seenTexts.add(normalized);
|
|
944
|
-
textParts.push(text);
|
|
945
|
-
}
|
|
946
|
-
let combinedText = textParts.join(" ");
|
|
947
|
-
if (combinedText.length > 4e3) combinedText = `${combinedText.slice(0, MAX_COALESCED_TEXT_CHARS)}…[truncated]`;
|
|
948
|
-
const allAttachments = boundedPayloads.flatMap((p) => p.attachments ?? []).slice(0, 20);
|
|
949
|
-
const createdAts = payloads.map((p) => p.created_at).filter((c) => typeof c === "string" && c.length > 0);
|
|
950
|
-
const latestCreatedAt = createdAts.length > 0 ? createdAts.reduce((a, b) => a > b ? a : b) : first.created_at;
|
|
951
|
-
const seenGuids = /* @__PURE__ */ new Set();
|
|
952
|
-
const coalescedMessageGuids = [];
|
|
953
|
-
for (const payload of payloads) {
|
|
954
|
-
const guid = payload.guid?.trim();
|
|
955
|
-
if (!guid || seenGuids.has(guid)) continue;
|
|
956
|
-
seenGuids.add(guid);
|
|
957
|
-
coalescedMessageGuids.push(guid);
|
|
958
|
-
}
|
|
959
|
-
const entryWithReply = payloads.find((p) => p.reply_to_id != null);
|
|
960
|
-
return {
|
|
961
|
-
...first,
|
|
962
|
-
text: combinedText,
|
|
963
|
-
attachments: allAttachments.length > 0 ? allAttachments : null,
|
|
964
|
-
created_at: latestCreatedAt,
|
|
965
|
-
reply_to_id: entryWithReply?.reply_to_id ?? first.reply_to_id ?? null,
|
|
966
|
-
reply_to_text: entryWithReply?.reply_to_text ?? first.reply_to_text ?? null,
|
|
967
|
-
reply_to_sender: entryWithReply?.reply_to_sender ?? first.reply_to_sender ?? null,
|
|
968
|
-
coalescedMessageGuids: coalescedMessageGuids.length > 0 ? coalescedMessageGuids : void 0
|
|
969
|
-
};
|
|
970
|
-
}
|
|
971
|
-
//#endregion
|
|
972
|
-
//#region extensions/imessage/src/monitor/deliver.ts
|
|
973
|
-
async function deliverReplies(params) {
|
|
974
|
-
const { replies, target, client, runtime, maxBytes, textLimit, accountId, sentMessageCache } = params;
|
|
975
|
-
const scope = `${accountId ?? ""}:${target}`;
|
|
976
|
-
const { cfg } = params;
|
|
977
|
-
const tableMode = resolveMarkdownTableMode({
|
|
978
|
-
cfg,
|
|
979
|
-
channel: "imessage",
|
|
980
|
-
accountId
|
|
981
|
-
});
|
|
982
|
-
const chunkMode = resolveChunkMode(cfg, "imessage", accountId);
|
|
983
|
-
for (const payload of replies) if (await deliverTextOrMediaReply({
|
|
984
|
-
payload,
|
|
985
|
-
text: resolveSendableOutboundReplyParts(payload, { text: convertMarkdownTables(sanitizeOutboundText(payload.text ?? ""), tableMode) }).text,
|
|
986
|
-
chunkText: (value) => chunkTextWithMode(value, textLimit, chunkMode),
|
|
987
|
-
sendText: async (chunk) => {
|
|
988
|
-
const sent = await sendMessageIMessage(target, chunk, {
|
|
989
|
-
config: params.cfg,
|
|
990
|
-
maxBytes,
|
|
991
|
-
client,
|
|
992
|
-
accountId,
|
|
993
|
-
replyToId: payload.replyToId
|
|
994
|
-
});
|
|
995
|
-
sentMessageCache?.remember(scope, {
|
|
996
|
-
text: sent.echoText ?? sent.sentText,
|
|
997
|
-
messageId: sent.messageId
|
|
998
|
-
});
|
|
999
|
-
},
|
|
1000
|
-
sendMedia: async ({ mediaUrl, caption }) => {
|
|
1001
|
-
const sent = await sendMessageIMessage(target, caption ?? "", {
|
|
1002
|
-
config: params.cfg,
|
|
1003
|
-
mediaUrl,
|
|
1004
|
-
maxBytes,
|
|
1005
|
-
client,
|
|
1006
|
-
accountId,
|
|
1007
|
-
replyToId: payload.replyToId
|
|
1008
|
-
});
|
|
1009
|
-
sentMessageCache?.remember(scope, {
|
|
1010
|
-
text: sent.echoText ?? (sent.sentText || void 0),
|
|
1011
|
-
messageId: sent.messageId
|
|
1012
|
-
});
|
|
1013
|
-
}
|
|
1014
|
-
}) !== "empty") runtime.log?.(`imessage: delivered reply to ${target}`);
|
|
1015
|
-
}
|
|
1016
|
-
function createIMessageEchoCachingSend(params) {
|
|
1017
|
-
return async (target, text, opts) => {
|
|
1018
|
-
const sent = await sendMessageIMessage(target, sanitizeOutboundText(text), {
|
|
1019
|
-
...opts,
|
|
1020
|
-
client: params.client
|
|
1021
|
-
});
|
|
1022
|
-
const scope = `${params.accountId ?? opts.accountId ?? ""}:${target}`;
|
|
1023
|
-
params.sentMessageCache?.remember(scope, {
|
|
1024
|
-
text: sent.echoText ?? (sent.sentText || void 0),
|
|
1025
|
-
messageId: sent.messageId
|
|
1026
|
-
});
|
|
1027
|
-
return sent;
|
|
1028
|
-
};
|
|
1029
|
-
}
|
|
1030
|
-
//#endregion
|
|
1031
|
-
//#region extensions/imessage/src/monitor/echo-cache.ts
|
|
1032
|
-
const SENT_MESSAGE_TEXT_TTL_MS = 4e3;
|
|
1033
|
-
const SENT_MESSAGE_ID_TTL_MS = 6e4;
|
|
1034
|
-
const LEADING_ATTRIBUTED_BODY_CORRUPTION_MARKERS = /^[\uFEFF\uFFFD\uFFFE\uFFFF]+/u;
|
|
1035
|
-
function normalizeEchoTextKey(text) {
|
|
1036
|
-
if (!text) return null;
|
|
1037
|
-
const normalized = text.replace(/\r\n?/g, "\n").trim().replace(LEADING_ATTRIBUTED_BODY_CORRUPTION_MARKERS, "").trim();
|
|
1038
|
-
return normalized ? normalized : null;
|
|
1039
|
-
}
|
|
1040
|
-
function normalizeEchoMessageIdKey(messageId) {
|
|
1041
|
-
if (!messageId) return null;
|
|
1042
|
-
const normalized = messageId.trim();
|
|
1043
|
-
if (!normalized || normalized === "ok" || normalized === "unknown") return null;
|
|
1044
|
-
return normalized;
|
|
1045
|
-
}
|
|
1046
|
-
var DefaultSentMessageCache = class {
|
|
1047
|
-
constructor() {
|
|
1048
|
-
this.textCache = /* @__PURE__ */ new Map();
|
|
1049
|
-
this.textBackedByIdCache = /* @__PURE__ */ new Map();
|
|
1050
|
-
this.messageIdCache = /* @__PURE__ */ new Map();
|
|
1051
|
-
}
|
|
1052
|
-
remember(scope, lookup) {
|
|
1053
|
-
const textKey = normalizeEchoTextKey(lookup.text);
|
|
1054
|
-
if (textKey) this.textCache.set(`${scope}:${textKey}`, Date.now());
|
|
1055
|
-
const messageIdKey = normalizeEchoMessageIdKey(lookup.messageId);
|
|
1056
|
-
if (messageIdKey) {
|
|
1057
|
-
this.messageIdCache.set(`${scope}:${messageIdKey}`, Date.now());
|
|
1058
|
-
if (textKey) this.textBackedByIdCache.set(`${scope}:${textKey}`, Date.now());
|
|
1059
|
-
}
|
|
1060
|
-
this.cleanup();
|
|
1061
|
-
}
|
|
1062
|
-
has(scope, lookup, skipIdShortCircuit = false) {
|
|
1063
|
-
this.cleanup();
|
|
1064
|
-
if (hasPersistedIMessageEcho({
|
|
1065
|
-
scope,
|
|
1066
|
-
...lookup
|
|
1067
|
-
})) return true;
|
|
1068
|
-
const textKey = normalizeEchoTextKey(lookup.text);
|
|
1069
|
-
const messageIdKey = normalizeEchoMessageIdKey(lookup.messageId);
|
|
1070
|
-
if (messageIdKey) {
|
|
1071
|
-
const idTimestamp = this.messageIdCache.get(`${scope}:${messageIdKey}`);
|
|
1072
|
-
if (idTimestamp && Date.now() - idTimestamp <= SENT_MESSAGE_ID_TTL_MS) return true;
|
|
1073
|
-
const textTimestamp = textKey ? this.textCache.get(`${scope}:${textKey}`) : void 0;
|
|
1074
|
-
const textBackedByIdTimestamp = textKey ? this.textBackedByIdCache.get(`${scope}:${textKey}`) : void 0;
|
|
1075
|
-
if (!skipIdShortCircuit && !(typeof textTimestamp === "number" && (!textBackedByIdTimestamp || textTimestamp > textBackedByIdTimestamp))) return false;
|
|
1076
|
-
}
|
|
1077
|
-
if (textKey) {
|
|
1078
|
-
const textTimestamp = this.textCache.get(`${scope}:${textKey}`);
|
|
1079
|
-
if (textTimestamp && Date.now() - textTimestamp <= SENT_MESSAGE_TEXT_TTL_MS) return true;
|
|
1080
|
-
}
|
|
1081
|
-
return false;
|
|
1082
|
-
}
|
|
1083
|
-
cleanup() {
|
|
1084
|
-
const now = Date.now();
|
|
1085
|
-
for (const [key, timestamp] of this.textCache.entries()) if (now - timestamp > SENT_MESSAGE_TEXT_TTL_MS) this.textCache.delete(key);
|
|
1086
|
-
for (const [key, timestamp] of this.textBackedByIdCache.entries()) if (now - timestamp > SENT_MESSAGE_TEXT_TTL_MS) this.textBackedByIdCache.delete(key);
|
|
1087
|
-
for (const [key, timestamp] of this.messageIdCache.entries()) if (now - timestamp > SENT_MESSAGE_ID_TTL_MS) this.messageIdCache.delete(key);
|
|
1088
|
-
}
|
|
1089
|
-
};
|
|
1090
|
-
function createSentMessageCache() {
|
|
1091
|
-
return new DefaultSentMessageCache();
|
|
1092
|
-
}
|
|
1093
|
-
//#endregion
|
|
1094
|
-
//#region extensions/imessage/src/monitor/group-allowlist-warnings.ts
|
|
1095
|
-
const startupWarned = /* @__PURE__ */ new Set();
|
|
1096
|
-
const perChatWarned = /* @__PURE__ */ new Set();
|
|
1097
|
-
/**
|
|
1098
|
-
* Fires once per `accountId` at monitor startup when `groupPolicy === "allowlist"`
|
|
1099
|
-
* but `channels.imessage.groups` is empty (no `"*"` wildcard, no explicit
|
|
1100
|
-
* `chat_id` entries). Without one of those, every group message is dropped at
|
|
1101
|
-
* the second gate even when the sender passes `groupAllowFrom`.
|
|
1102
|
-
*/
|
|
1103
|
-
function warnGroupAllowlistMisconfigOnce(params) {
|
|
1104
|
-
if (params.groupPolicy !== "allowlist") return false;
|
|
1105
|
-
if ((params.groups ? Object.keys(params.groups) : []).length > 0) return false;
|
|
1106
|
-
const key = `imessage:${params.accountId}`;
|
|
1107
|
-
if (startupWarned.has(key)) return false;
|
|
1108
|
-
startupWarned.add(key);
|
|
1109
|
-
params.log(`imessage: groupPolicy="allowlist" but channels.imessage.groups is empty for account "${params.accountId}". Every inbound group message will be dropped. Add channels.imessage.groups["*"] = { requireMention: true } to allow all groups, or explicit per-chat_id entries to allow specific groups.`);
|
|
1110
|
-
return true;
|
|
1111
|
-
}
|
|
1112
|
-
/**
|
|
1113
|
-
* Fires once per `accountId:chat_id` when the runtime allowlist gate drops a
|
|
1114
|
-
* group message because that chat_id is not in `channels.imessage.groups`.
|
|
1115
|
-
* Bounded by the number of distinct group chats the gateway sees.
|
|
1116
|
-
*/
|
|
1117
|
-
function warnGroupAllowlistDropPerChatOnce(params) {
|
|
1118
|
-
const chat = params.chatId == null ? "" : String(params.chatId).trim();
|
|
1119
|
-
if (!chat) return false;
|
|
1120
|
-
const key = `imessage:${params.accountId}:${chat}`;
|
|
1121
|
-
if (perChatWarned.has(key)) return false;
|
|
1122
|
-
perChatWarned.add(key);
|
|
1123
|
-
params.log(`imessage: dropping group message from chat_id=${chat} (account "${params.accountId}") — not in channels.imessage.groups allowlist. Add channels.imessage.groups["${chat}"] or channels.imessage.groups["*"] to allow it.`);
|
|
1124
|
-
return true;
|
|
1125
|
-
}
|
|
1126
|
-
//#endregion
|
|
1127
|
-
//#region extensions/imessage/src/conversation-route.ts
|
|
1128
|
-
function resolveIMessageConversationRoute(params) {
|
|
1129
|
-
let route = resolveAgentRoute({
|
|
1130
|
-
cfg: params.cfg,
|
|
1131
|
-
channel: "imessage",
|
|
1132
|
-
accountId: params.accountId,
|
|
1133
|
-
peer: {
|
|
1134
|
-
kind: params.isGroup ? "group" : "direct",
|
|
1135
|
-
id: params.peerId
|
|
1136
|
-
}
|
|
1137
|
-
});
|
|
1138
|
-
const conversationId = resolveIMessageInboundConversationId({
|
|
1139
|
-
isGroup: params.isGroup,
|
|
1140
|
-
sender: params.sender,
|
|
1141
|
-
chatId: params.chatId
|
|
1142
|
-
});
|
|
1143
|
-
if (!conversationId) return route;
|
|
1144
|
-
route = resolveConfiguredBindingRoute({
|
|
1145
|
-
cfg: params.cfg,
|
|
1146
|
-
route,
|
|
1147
|
-
conversation: {
|
|
1148
|
-
channel: "imessage",
|
|
1149
|
-
accountId: params.accountId,
|
|
1150
|
-
conversationId
|
|
1151
|
-
}
|
|
1152
|
-
}).route;
|
|
1153
|
-
const runtimeRoute = resolveRuntimeConversationBindingRoute({
|
|
1154
|
-
route,
|
|
1155
|
-
conversation: {
|
|
1156
|
-
channel: "imessage",
|
|
1157
|
-
accountId: params.accountId,
|
|
1158
|
-
conversationId
|
|
1159
|
-
}
|
|
1160
|
-
});
|
|
1161
|
-
route = runtimeRoute.route;
|
|
1162
|
-
if (runtimeRoute.bindingRecord && !runtimeRoute.boundSessionKey) logVerbose(`imessage: plugin-bound conversation ${conversationId}`);
|
|
1163
|
-
else if (runtimeRoute.boundSessionKey) logVerbose(`imessage: routed via bound conversation ${conversationId} -> ${runtimeRoute.boundSessionKey}`);
|
|
1164
|
-
return route;
|
|
1165
|
-
}
|
|
1166
|
-
//#endregion
|
|
1167
|
-
//#region extensions/imessage/src/monitor/reflection-guard.ts
|
|
1168
|
-
const REFLECTION_PATTERNS = [
|
|
1169
|
-
{
|
|
1170
|
-
re: /(?:#\+){2,}#?/,
|
|
1171
|
-
label: "internal-separator"
|
|
1172
|
-
},
|
|
1173
|
-
{
|
|
1174
|
-
re: /\bassistant\s+to\s*=\s*\w+/i,
|
|
1175
|
-
label: "assistant-role-marker"
|
|
1176
|
-
},
|
|
1177
|
-
{
|
|
1178
|
-
re: /<\s*\/?\s*(?:think(?:ing)?|thought|antthinking)\b[^<>]*>/i,
|
|
1179
|
-
label: "thinking-tag"
|
|
1180
|
-
},
|
|
1181
|
-
{
|
|
1182
|
-
re: /<\s*\/?\s*relevant[-_]memories\b[^<>]*>/i,
|
|
1183
|
-
label: "relevant-memories-tag"
|
|
1184
|
-
},
|
|
1185
|
-
{
|
|
1186
|
-
re: /<\s*\/?\s*final\b[^<>]*>/i,
|
|
1187
|
-
label: "final-tag"
|
|
1188
|
-
},
|
|
1189
|
-
{
|
|
1190
|
-
re: /\bACP error\s*\(\s*ACP_[A-Z0-9_]+\s*\):/i,
|
|
1191
|
-
label: "acp-error"
|
|
1192
|
-
},
|
|
1193
|
-
{
|
|
1194
|
-
re: /\bMissing API key for\b.+\bon the gateway\b/i,
|
|
1195
|
-
label: "gateway-missing-api-key"
|
|
1196
|
-
}
|
|
1197
|
-
];
|
|
1198
|
-
function hasMatchOutsideCode(text, re) {
|
|
1199
|
-
const codeRegions = findCodeRegions(text);
|
|
1200
|
-
const globalRe = new RegExp(re.source, re.flags.includes("g") ? re.flags : `${re.flags}g`);
|
|
1201
|
-
for (const match of text.matchAll(globalRe)) {
|
|
1202
|
-
const start = match.index ?? -1;
|
|
1203
|
-
if (start >= 0 && !isInsideCode(start, codeRegions)) return true;
|
|
1204
|
-
}
|
|
1205
|
-
return false;
|
|
1206
|
-
}
|
|
1207
|
-
/**
|
|
1208
|
-
* Check whether an inbound message appears to be a reflection of
|
|
1209
|
-
* assistant-originated content. Returns matched pattern labels for telemetry.
|
|
1210
|
-
*/
|
|
1211
|
-
function detectReflectedContent(text) {
|
|
1212
|
-
if (!text) return {
|
|
1213
|
-
isReflection: false,
|
|
1214
|
-
matchedLabels: []
|
|
1215
|
-
};
|
|
1216
|
-
const matchedLabels = [];
|
|
1217
|
-
for (const { re, label } of REFLECTION_PATTERNS) if (hasMatchOutsideCode(text, re)) matchedLabels.push(label);
|
|
1218
|
-
return {
|
|
1219
|
-
isReflection: matchedLabels.length > 0,
|
|
1220
|
-
matchedLabels
|
|
1221
|
-
};
|
|
1222
|
-
}
|
|
1223
|
-
//#endregion
|
|
1224
|
-
//#region extensions/imessage/src/monitor/inbound-processing.ts
|
|
1225
|
-
const TAPBACK_TEXT_PATTERNS = [
|
|
1226
|
-
{
|
|
1227
|
-
prefix: "loved",
|
|
1228
|
-
action: "added",
|
|
1229
|
-
emoji: "❤️"
|
|
1230
|
-
},
|
|
1231
|
-
{
|
|
1232
|
-
prefix: "liked",
|
|
1233
|
-
action: "added",
|
|
1234
|
-
emoji: "👍"
|
|
1235
|
-
},
|
|
1236
|
-
{
|
|
1237
|
-
prefix: "disliked",
|
|
1238
|
-
action: "added",
|
|
1239
|
-
emoji: "👎"
|
|
1240
|
-
},
|
|
1241
|
-
{
|
|
1242
|
-
prefix: "laughed at",
|
|
1243
|
-
action: "added",
|
|
1244
|
-
emoji: "😂"
|
|
1245
|
-
},
|
|
1246
|
-
{
|
|
1247
|
-
prefix: "emphasized",
|
|
1248
|
-
action: "added",
|
|
1249
|
-
emoji: "‼️"
|
|
1250
|
-
},
|
|
1251
|
-
{
|
|
1252
|
-
prefix: "questioned",
|
|
1253
|
-
action: "added",
|
|
1254
|
-
emoji: "❓"
|
|
1255
|
-
},
|
|
1256
|
-
{
|
|
1257
|
-
prefix: "removed a heart from",
|
|
1258
|
-
action: "removed",
|
|
1259
|
-
emoji: "❤️"
|
|
1260
|
-
},
|
|
1261
|
-
{
|
|
1262
|
-
prefix: "removed a like from",
|
|
1263
|
-
action: "removed",
|
|
1264
|
-
emoji: "👍"
|
|
1265
|
-
},
|
|
1266
|
-
{
|
|
1267
|
-
prefix: "removed a dislike from",
|
|
1268
|
-
action: "removed",
|
|
1269
|
-
emoji: "👎"
|
|
1270
|
-
},
|
|
1271
|
-
{
|
|
1272
|
-
prefix: "removed a laugh from",
|
|
1273
|
-
action: "removed",
|
|
1274
|
-
emoji: "😂"
|
|
1275
|
-
},
|
|
1276
|
-
{
|
|
1277
|
-
prefix: "removed an emphasis from",
|
|
1278
|
-
action: "removed",
|
|
1279
|
-
emoji: "‼️"
|
|
1280
|
-
},
|
|
1281
|
-
{
|
|
1282
|
-
prefix: "removed a question from",
|
|
1283
|
-
action: "removed",
|
|
1284
|
-
emoji: "❓"
|
|
1285
|
-
}
|
|
1286
|
-
];
|
|
1287
|
-
function normalizeReactionValue(value) {
|
|
1288
|
-
return typeof value === "string" ? value.trim().replace(/^p:\d+\//iu, "") || void 0 : void 0;
|
|
1289
|
-
}
|
|
1290
|
-
function resolveReactionTargetGuidCandidates(...values) {
|
|
1291
|
-
const candidates = [];
|
|
1292
|
-
for (const value of values) {
|
|
1293
|
-
if (typeof value !== "string") continue;
|
|
1294
|
-
const raw = value.trim();
|
|
1295
|
-
if (!raw) continue;
|
|
1296
|
-
const normalized = raw.replace(/^p:\d+\//iu, "");
|
|
1297
|
-
for (const candidate of [normalized, raw]) if (candidate && !candidates.includes(candidate)) candidates.push(candidate);
|
|
1298
|
-
}
|
|
1299
|
-
return candidates;
|
|
1300
|
-
}
|
|
1301
|
-
function resolveTapbackTextContext(bodyText) {
|
|
1302
|
-
const lower = bodyText.toLowerCase();
|
|
1303
|
-
for (const pattern of TAPBACK_TEXT_PATTERNS) {
|
|
1304
|
-
if (!lower.startsWith(pattern.prefix)) continue;
|
|
1305
|
-
const afterPrefix = bodyText.slice(pattern.prefix.length).trim();
|
|
1306
|
-
if (!/^["\u201c]/u.test(afterPrefix)) continue;
|
|
1307
|
-
return {
|
|
1308
|
-
action: pattern.action,
|
|
1309
|
-
emoji: pattern.emoji,
|
|
1310
|
-
targetText: afterPrefix.replace(/^["\u201c]/u, "").replace(/["\u201d]$/u, "").trim()
|
|
1311
|
-
};
|
|
1312
|
-
}
|
|
1313
|
-
return null;
|
|
1314
|
-
}
|
|
1315
|
-
function resolveIMessageReactionContext(message, bodyText) {
|
|
1316
|
-
if (message.is_reaction === true || message.is_tapback === true || typeof message.associated_message_type === "number" && Number.isFinite(message.associated_message_type) && message.associated_message_type >= 2e3 && message.associated_message_type < 4e3) {
|
|
1317
|
-
const targetGuids = resolveReactionTargetGuidCandidates(message.reacted_to_guid, message.associated_message_guid);
|
|
1318
|
-
return {
|
|
1319
|
-
action: message.is_reaction_add === false ? "removed" : "added",
|
|
1320
|
-
emoji: normalizeReactionValue(message.reaction_emoji) ?? normalizeReactionValue(message.reaction_type) ?? "reaction",
|
|
1321
|
-
targetGuid: targetGuids[0],
|
|
1322
|
-
targetGuids
|
|
1323
|
-
};
|
|
1324
|
-
}
|
|
1325
|
-
return resolveTapbackTextContext(bodyText);
|
|
1326
|
-
}
|
|
1327
|
-
const normalizeNonEmpty = (value) => value.trim() || null;
|
|
1328
|
-
const imessageConversationIdentityKinds = new Set([
|
|
1329
|
-
"plugin:imessage-chat-id",
|
|
1330
|
-
"plugin:imessage-chat-guid",
|
|
1331
|
-
"plugin:imessage-chat-identifier"
|
|
1332
|
-
]);
|
|
1333
|
-
const matchIMessageIngressEntry = ({ entry, context }) => {
|
|
1334
|
-
if (imessageConversationIdentityKinds.has(entry.kind) && context !== "group") return false;
|
|
1335
|
-
};
|
|
1336
|
-
function isIMessageConversationAllowTarget(entry) {
|
|
1337
|
-
const parsed = parseIMessageAllowTarget(entry);
|
|
1338
|
-
return parsed.kind === "chat_id" || parsed.kind === "chat_guid" || parsed.kind === "chat_identifier";
|
|
1339
|
-
}
|
|
1340
|
-
function mergeIMessageGroupAllowFromWithLegacyChatTargets(params) {
|
|
1341
|
-
if (params.groupAllowFrom.length > 0 || !params.allowLegacyConversationTargets) return params.groupAllowFrom;
|
|
1342
|
-
const legacyChatTargets = params.allowFrom.filter((entry) => isIMessageConversationAllowTarget(entry));
|
|
1343
|
-
if (legacyChatTargets.length === 0) return params.groupAllowFrom;
|
|
1344
|
-
return Array.from(new Set([...params.groupAllowFrom, ...legacyChatTargets]));
|
|
1345
|
-
}
|
|
1346
|
-
const imessageIngressIdentity = defineStableChannelIngressIdentity({
|
|
1347
|
-
key: "imessage-sender",
|
|
1348
|
-
normalizeEntry: normalizeIMessageHandleEntry,
|
|
1349
|
-
normalizeSubject: normalizeIMessageHandle,
|
|
1350
|
-
sensitivity: "pii",
|
|
1351
|
-
matchEntry: matchIMessageIngressEntry,
|
|
1352
|
-
aliases: [
|
|
1353
|
-
[
|
|
1354
|
-
"imessage-chat-id",
|
|
1355
|
-
"plugin:imessage-chat-id",
|
|
1356
|
-
normalizeIMessageChatIdEntry
|
|
1357
|
-
],
|
|
1358
|
-
[
|
|
1359
|
-
"imessage-chat-guid",
|
|
1360
|
-
"plugin:imessage-chat-guid",
|
|
1361
|
-
normalizeIMessageChatGuidEntry
|
|
1362
|
-
],
|
|
1363
|
-
[
|
|
1364
|
-
"imessage-chat-identifier",
|
|
1365
|
-
"plugin:imessage-chat-identifier",
|
|
1366
|
-
normalizeIMessageChatIdentifierEntry
|
|
1367
|
-
]
|
|
1368
|
-
].map(([key, kind, normalizeEntry]) => ({
|
|
1369
|
-
key,
|
|
1370
|
-
kind,
|
|
1371
|
-
normalizeEntry,
|
|
1372
|
-
normalizeSubject: normalizeNonEmpty,
|
|
1373
|
-
sensitivity: "pii"
|
|
1374
|
-
})),
|
|
1375
|
-
resolveEntryId: ({ entryIndex }) => `imessage-entry-${entryIndex + 1}`
|
|
1376
|
-
});
|
|
1377
|
-
function normalizeIMessageHandleEntry(entry) {
|
|
1378
|
-
const parsed = parseIMessageAllowTarget(entry.trim());
|
|
1379
|
-
return parsed.kind === "handle" ? normalizeIMessageHandle(parsed.handle) : null;
|
|
1380
|
-
}
|
|
1381
|
-
function normalizeIMessageChatIdEntry(entry) {
|
|
1382
|
-
const parsed = parseIMessageAllowTarget(entry.trim());
|
|
1383
|
-
return parsed.kind === "chat_id" ? String(parsed.chatId) : null;
|
|
1384
|
-
}
|
|
1385
|
-
function normalizeIMessageChatGuidEntry(entry) {
|
|
1386
|
-
const parsed = parseIMessageAllowTarget(entry.trim());
|
|
1387
|
-
return parsed.kind === "chat_guid" ? parsed.chatGuid.trim() || null : null;
|
|
1388
|
-
}
|
|
1389
|
-
function normalizeIMessageChatIdentifierEntry(entry) {
|
|
1390
|
-
const parsed = parseIMessageAllowTarget(entry.trim());
|
|
1391
|
-
return parsed.kind === "chat_identifier" ? parsed.chatIdentifier.trim() || null : null;
|
|
1392
|
-
}
|
|
1393
|
-
function normalizeDmPolicy(policy) {
|
|
1394
|
-
return policy === "open" || policy === "allowlist" || policy === "disabled" ? policy : "pairing";
|
|
1395
|
-
}
|
|
1396
|
-
function normalizeGroupPolicy(policy) {
|
|
1397
|
-
return policy === "open" || policy === "disabled" ? policy : "allowlist";
|
|
1398
|
-
}
|
|
1399
|
-
function normalizeReplyField(value) {
|
|
1400
|
-
if (typeof value === "string") {
|
|
1401
|
-
const trimmed = value.trim();
|
|
1402
|
-
return trimmed ? trimmed : void 0;
|
|
1403
|
-
}
|
|
1404
|
-
if (typeof value === "number") return String(value);
|
|
1405
|
-
}
|
|
1406
|
-
function describeReplyContext(message) {
|
|
1407
|
-
const body = normalizeReplyField(message.reply_to_text);
|
|
1408
|
-
if (!body) return null;
|
|
1409
|
-
return {
|
|
1410
|
-
body,
|
|
1411
|
-
id: normalizeReplyField(message.reply_to_id),
|
|
1412
|
-
sender: normalizeReplyField(message.reply_to_sender)
|
|
1413
|
-
};
|
|
1414
|
-
}
|
|
1415
|
-
function resolveInboundEchoMessageIds(message) {
|
|
1416
|
-
const values = [message.id != null ? String(message.id) : void 0, normalizeReplyField(message.guid)];
|
|
1417
|
-
const ids = [];
|
|
1418
|
-
for (const value of values) {
|
|
1419
|
-
if (!value || ids.includes(value)) continue;
|
|
1420
|
-
ids.push(value);
|
|
1421
|
-
}
|
|
1422
|
-
return ids;
|
|
1423
|
-
}
|
|
1424
|
-
function hasIMessageEchoMatch(params) {
|
|
1425
|
-
const scopes = typeof params.scope === "string" ? [params.scope] : params.scope;
|
|
1426
|
-
for (const scope of scopes) {
|
|
1427
|
-
if (!scope) continue;
|
|
1428
|
-
for (const messageId of params.messageIds) if (params.echoCache.has(scope, { messageId })) return true;
|
|
1429
|
-
const fallbackMessageId = params.messageIds[0];
|
|
1430
|
-
if (!params.text && !fallbackMessageId) continue;
|
|
1431
|
-
if (params.echoCache.has(scope, {
|
|
1432
|
-
text: params.text,
|
|
1433
|
-
messageId: fallbackMessageId
|
|
1434
|
-
}, params.skipIdShortCircuit)) return true;
|
|
1435
|
-
}
|
|
1436
|
-
return false;
|
|
1437
|
-
}
|
|
1438
|
-
function isKnownFromMeIMessageReactionTarget(params) {
|
|
1439
|
-
const { messageId, accountId, chatId, chatGuid, chatIdentifier } = params;
|
|
1440
|
-
const ctx = {
|
|
1441
|
-
accountId,
|
|
1442
|
-
chatId,
|
|
1443
|
-
chatGuid,
|
|
1444
|
-
chatIdentifier
|
|
1445
|
-
};
|
|
1446
|
-
if (params.isKnownFromMeMessageId) return params.isKnownFromMeMessageId(messageId, ctx);
|
|
1447
|
-
return isKnownFromMeIMessageMessageId(messageId, ctx);
|
|
1448
|
-
}
|
|
1449
|
-
/**
|
|
1450
|
-
* Per-group `systemPrompt` resolution. Mirrors `resolveWhatsAppGroupSystemPrompt`
|
|
1451
|
-
* in `extensions/whatsapp/src/system-prompt.ts`:
|
|
1452
|
-
*
|
|
1453
|
-
* 1. If the matched per-`chat_id` entry exists AND defines `systemPrompt` (key
|
|
1454
|
-
* is present, value is non-null), use it. Trim whitespace; if the trim
|
|
1455
|
-
* leaves an empty string, return `undefined` and DO NOT fall through to the
|
|
1456
|
-
* wildcard. This is how operators say "this specific group has no prompt"
|
|
1457
|
-
* without inheriting from `groups["*"]`.
|
|
1458
|
-
* 2. Otherwise, return the wildcard `groups["*"].systemPrompt` (trimmed; empty
|
|
1459
|
-
* after trim → `undefined`).
|
|
1460
|
-
*/
|
|
1461
|
-
function resolveIMessageGroupSystemPrompt(params) {
|
|
1462
|
-
const specific = params.groupConfig;
|
|
1463
|
-
if (specific != null && specific.systemPrompt != null) return specific.systemPrompt.trim() || void 0;
|
|
1464
|
-
const wildcard = params.defaultConfig?.systemPrompt;
|
|
1465
|
-
return wildcard != null ? wildcard.trim() || void 0 : void 0;
|
|
1466
|
-
}
|
|
1467
|
-
async function resolveIMessageInboundDecision(params) {
|
|
1468
|
-
const sender = (params.message.sender ?? "").trim();
|
|
1469
|
-
if (!sender) return {
|
|
1470
|
-
kind: "drop",
|
|
1471
|
-
reason: "missing sender"
|
|
1472
|
-
};
|
|
1473
|
-
const senderNormalized = normalizeIMessageHandle(sender);
|
|
1474
|
-
const chatId = params.message.chat_id ?? void 0;
|
|
1475
|
-
const chatGuid = params.message.chat_guid ?? void 0;
|
|
1476
|
-
const chatIdentifier = params.message.chat_identifier ?? void 0;
|
|
1477
|
-
const destinationCallerId = params.message.destination_caller_id ?? void 0;
|
|
1478
|
-
const createdAt = params.message.created_at ? Date.parse(params.message.created_at) : void 0;
|
|
1479
|
-
const messageText = params.messageText.trim();
|
|
1480
|
-
const bodyText = params.bodyText.trim();
|
|
1481
|
-
const reactionContext = resolveIMessageReactionContext(params.message, bodyText || messageText);
|
|
1482
|
-
const groupIdCandidate = chatId !== void 0 ? String(chatId) : void 0;
|
|
1483
|
-
const groupAllowFromWithLegacyChatTargets = mergeIMessageGroupAllowFromWithLegacyChatTargets({
|
|
1484
|
-
groupAllowFrom: params.groupAllowFrom,
|
|
1485
|
-
allowFrom: params.allowFrom,
|
|
1486
|
-
allowLegacyConversationTargets: params.allowLegacyConversationAllowFromForGroup
|
|
1487
|
-
});
|
|
1488
|
-
const groupListPolicy = groupIdCandidate ? resolveChannelGroupPolicy({
|
|
1489
|
-
cfg: params.cfg,
|
|
1490
|
-
channel: "imessage",
|
|
1491
|
-
accountId: params.accountId,
|
|
1492
|
-
groupId: groupIdCandidate,
|
|
1493
|
-
hasGroupAllowFrom: groupAllowFromWithLegacyChatTargets.length > 0
|
|
1494
|
-
}) : {
|
|
1495
|
-
allowlistEnabled: false,
|
|
1496
|
-
allowed: true,
|
|
1497
|
-
groupConfig: void 0,
|
|
1498
|
-
defaultConfig: void 0
|
|
1499
|
-
};
|
|
1500
|
-
const treatAsGroupByConfig = Boolean(groupIdCandidate && groupListPolicy.allowlistEnabled && groupListPolicy.groupConfig);
|
|
1501
|
-
const isGroup = Boolean(params.message.is_group) || treatAsGroupByConfig;
|
|
1502
|
-
const selfChatLookup = {
|
|
1503
|
-
accountId: params.accountId,
|
|
1504
|
-
isGroup,
|
|
1505
|
-
chatId,
|
|
1506
|
-
sender,
|
|
1507
|
-
text: bodyText,
|
|
1508
|
-
createdAt
|
|
1509
|
-
};
|
|
1510
|
-
const chatIdentifierNormalized = normalizeIMessageHandle(chatIdentifier ?? "") || void 0;
|
|
1511
|
-
const destinationCallerIdNormalized = normalizeIMessageHandle(destinationCallerId ?? "") || void 0;
|
|
1512
|
-
const isSelfChat = !isGroup && chatIdentifierNormalized != null && senderNormalized === chatIdentifierNormalized && destinationCallerIdNormalized != null && destinationCallerIdNormalized === senderNormalized;
|
|
1513
|
-
const isAmbiguousSelfThread = !isGroup && chatIdentifierNormalized != null && senderNormalized === chatIdentifierNormalized && destinationCallerIdNormalized == null;
|
|
1514
|
-
let skipSelfChatHasCheck = false;
|
|
1515
|
-
const inboundMessageIds = resolveInboundEchoMessageIds(params.message);
|
|
1516
|
-
const inboundMessageId = inboundMessageIds[0];
|
|
1517
|
-
const hasInboundGuid = Boolean(normalizeReplyField(params.message.guid));
|
|
1518
|
-
if (params.message.is_from_me) {
|
|
1519
|
-
if (isAmbiguousSelfThread) params.selfChatCache?.remember(selfChatLookup);
|
|
1520
|
-
if (isSelfChat) {
|
|
1521
|
-
params.selfChatCache?.remember(selfChatLookup);
|
|
1522
|
-
const echoScope = buildIMessageEchoScope({
|
|
1523
|
-
accountId: params.accountId,
|
|
1524
|
-
isGroup,
|
|
1525
|
-
chatId,
|
|
1526
|
-
chatGuid,
|
|
1527
|
-
chatIdentifier,
|
|
1528
|
-
sender
|
|
1529
|
-
});
|
|
1530
|
-
if (params.echoCache && (bodyText || inboundMessageId) && hasIMessageEchoMatch({
|
|
1531
|
-
echoCache: params.echoCache,
|
|
1532
|
-
scope: echoScope,
|
|
1533
|
-
text: bodyText || void 0,
|
|
1534
|
-
messageIds: inboundMessageIds,
|
|
1535
|
-
skipIdShortCircuit: !hasInboundGuid
|
|
1536
|
-
})) return {
|
|
1537
|
-
kind: "drop",
|
|
1538
|
-
reason: "agent echo in self-chat"
|
|
1539
|
-
};
|
|
1540
|
-
skipSelfChatHasCheck = true;
|
|
1541
|
-
} else return {
|
|
1542
|
-
kind: "drop",
|
|
1543
|
-
reason: "from me"
|
|
1544
|
-
};
|
|
1545
|
-
}
|
|
1546
|
-
if (isGroup && !chatId) return {
|
|
1547
|
-
kind: "drop",
|
|
1548
|
-
reason: "group without chat_id"
|
|
1549
|
-
};
|
|
1550
|
-
const groupId = isGroup ? groupIdCandidate : void 0;
|
|
1551
|
-
const hasControlCommandInMessage = hasControlCommand(messageText, params.cfg);
|
|
1552
|
-
const groupAllowFromForAccess = isGroup ? groupAllowFromWithLegacyChatTargets : params.groupAllowFrom;
|
|
1553
|
-
const { commandAccess, senderAccess } = await createChannelIngressResolver({
|
|
1554
|
-
channelId: "imessage",
|
|
1555
|
-
accountId: params.accountId,
|
|
1556
|
-
identity: imessageIngressIdentity,
|
|
1557
|
-
cfg: params.cfg,
|
|
1558
|
-
readStoreAllowFrom: async () => params.storeAllowFrom
|
|
1559
|
-
}).message({
|
|
1560
|
-
subject: {
|
|
1561
|
-
stableId: sender,
|
|
1562
|
-
aliases: {
|
|
1563
|
-
...chatId != null ? { "imessage-chat-id": String(chatId) } : {},
|
|
1564
|
-
...chatGuid ? { "imessage-chat-guid": chatGuid } : {},
|
|
1565
|
-
...chatIdentifier ? { "imessage-chat-identifier": chatIdentifier } : {}
|
|
1566
|
-
}
|
|
1567
|
-
},
|
|
1568
|
-
conversation: {
|
|
1569
|
-
kind: isGroup ? "group" : "direct",
|
|
1570
|
-
id: isGroup ? String(chatId ?? chatGuid ?? chatIdentifier ?? "unknown") : normalizeIMessageHandle(sender)
|
|
1571
|
-
},
|
|
1572
|
-
dmPolicy: normalizeDmPolicy(params.dmPolicy),
|
|
1573
|
-
groupPolicy: normalizeGroupPolicy(params.groupPolicy),
|
|
1574
|
-
policy: { groupAllowFromFallbackToAllowFrom: false },
|
|
1575
|
-
allowFrom: params.allowFrom,
|
|
1576
|
-
groupAllowFrom: groupAllowFromForAccess,
|
|
1577
|
-
command: {
|
|
1578
|
-
allowTextCommands: isGroup,
|
|
1579
|
-
hasControlCommand: hasControlCommandInMessage,
|
|
1580
|
-
directGroupAllowFrom: "effective"
|
|
1581
|
-
}
|
|
1582
|
-
});
|
|
1583
|
-
const effectiveGroupAllowFrom = senderAccess.effectiveGroupAllowFrom;
|
|
1584
|
-
if (senderAccess.decision !== "allow") {
|
|
1585
|
-
if (isGroup) {
|
|
1586
|
-
if (senderAccess.reasonCode === "group_policy_disabled") {
|
|
1587
|
-
params.logVerbose?.("Blocked iMessage group message (groupPolicy: disabled)");
|
|
1588
|
-
return {
|
|
1589
|
-
kind: "drop",
|
|
1590
|
-
reason: "groupPolicy disabled"
|
|
1591
|
-
};
|
|
1592
|
-
}
|
|
1593
|
-
if (senderAccess.reasonCode === "group_policy_empty_allowlist") {
|
|
1594
|
-
params.logVerbose?.("Blocked iMessage group message (groupPolicy: allowlist, no groupAllowFrom)");
|
|
1595
|
-
return {
|
|
1596
|
-
kind: "drop",
|
|
1597
|
-
reason: "groupPolicy allowlist (empty groupAllowFrom)"
|
|
1598
|
-
};
|
|
1599
|
-
}
|
|
1600
|
-
if (senderAccess.reasonCode === "group_policy_not_allowlisted") {
|
|
1601
|
-
params.logVerbose?.(`Blocked iMessage sender ${sender} (not in groupAllowFrom)`);
|
|
1602
|
-
return {
|
|
1603
|
-
kind: "drop",
|
|
1604
|
-
reason: "not in groupAllowFrom"
|
|
1605
|
-
};
|
|
1606
|
-
}
|
|
1607
|
-
params.logVerbose?.(`Blocked iMessage group message (${senderAccess.reasonCode})`);
|
|
1608
|
-
return {
|
|
1609
|
-
kind: "drop",
|
|
1610
|
-
reason: senderAccess.reasonCode
|
|
1611
|
-
};
|
|
1612
|
-
}
|
|
1613
|
-
if (senderAccess.reasonCode === "dm_policy_disabled") return {
|
|
1614
|
-
kind: "drop",
|
|
1615
|
-
reason: "dmPolicy disabled"
|
|
1616
|
-
};
|
|
1617
|
-
if (senderAccess.decision === "pairing") return {
|
|
1618
|
-
kind: "pairing",
|
|
1619
|
-
senderId: senderNormalized
|
|
1620
|
-
};
|
|
1621
|
-
params.logVerbose?.(`Blocked iMessage sender ${sender} (dmPolicy=${params.dmPolicy})`);
|
|
1622
|
-
return {
|
|
1623
|
-
kind: "drop",
|
|
1624
|
-
reason: "dmPolicy blocked"
|
|
1625
|
-
};
|
|
1626
|
-
}
|
|
1627
|
-
if (isGroup && groupListPolicy.allowlistEnabled && !groupListPolicy.allowed) {
|
|
1628
|
-
params.logVerbose?.(`imessage: skipping group message (${groupId ?? "unknown"}) not in allowlist`);
|
|
1629
|
-
return {
|
|
1630
|
-
kind: "drop",
|
|
1631
|
-
reason: "group id not in allowlist"
|
|
1632
|
-
};
|
|
1633
|
-
}
|
|
1634
|
-
const route = resolveIMessageConversationRoute({
|
|
1635
|
-
cfg: params.cfg,
|
|
1636
|
-
accountId: params.accountId,
|
|
1637
|
-
isGroup,
|
|
1638
|
-
peerId: isGroup ? String(chatId ?? "unknown") : senderNormalized,
|
|
1639
|
-
sender,
|
|
1640
|
-
chatId
|
|
1641
|
-
});
|
|
1642
|
-
if (reactionContext) {
|
|
1643
|
-
const notificationMode = params.reactionNotifications ?? "own";
|
|
1644
|
-
if (notificationMode === "off") return {
|
|
1645
|
-
kind: "drop",
|
|
1646
|
-
reason: "reaction notifications disabled"
|
|
1647
|
-
};
|
|
1648
|
-
const targetGuid = reactionContext.targetGuid;
|
|
1649
|
-
const targetGuids = reactionContext.targetGuids ?? (targetGuid ? [targetGuid] : []);
|
|
1650
|
-
const targetIsOwn = Boolean(targetGuid && (params.echoCache && hasIMessageEchoMatch({
|
|
1651
|
-
echoCache: params.echoCache,
|
|
1652
|
-
scope: buildIMessageEchoScope({
|
|
1653
|
-
accountId: params.accountId,
|
|
1654
|
-
isGroup,
|
|
1655
|
-
chatId,
|
|
1656
|
-
chatGuid,
|
|
1657
|
-
chatIdentifier,
|
|
1658
|
-
sender
|
|
1659
|
-
}),
|
|
1660
|
-
messageIds: targetGuids
|
|
1661
|
-
}) || targetGuids.some((messageId) => isKnownFromMeIMessageReactionTarget({
|
|
1662
|
-
messageId,
|
|
1663
|
-
accountId: params.accountId,
|
|
1664
|
-
chatId,
|
|
1665
|
-
chatGuid,
|
|
1666
|
-
chatIdentifier,
|
|
1667
|
-
isKnownFromMeMessageId: params.isKnownFromMeMessageId
|
|
1668
|
-
}))));
|
|
1669
|
-
if (notificationMode === "own" && !targetIsOwn) return {
|
|
1670
|
-
kind: "drop",
|
|
1671
|
-
reason: "reaction target not sent by agent"
|
|
1672
|
-
};
|
|
1673
|
-
const target = targetGuid ? `msg ${targetGuid}` : reactionContext.targetText ? `message "${truncateUtf16Safe(reactionContext.targetText, 80)}"` : "a message";
|
|
1674
|
-
return {
|
|
1675
|
-
kind: "reaction",
|
|
1676
|
-
isGroup,
|
|
1677
|
-
chatId,
|
|
1678
|
-
chatGuid,
|
|
1679
|
-
chatIdentifier,
|
|
1680
|
-
sender,
|
|
1681
|
-
senderNormalized,
|
|
1682
|
-
route,
|
|
1683
|
-
reaction: reactionContext,
|
|
1684
|
-
text: `iMessage reaction ${reactionContext.action}: ${reactionContext.emoji} by ${senderNormalized} on ${target}`,
|
|
1685
|
-
contextKey: [
|
|
1686
|
-
"imessage",
|
|
1687
|
-
"reaction",
|
|
1688
|
-
reactionContext.action,
|
|
1689
|
-
chatId ?? chatGuid ?? chatIdentifier ?? senderNormalized,
|
|
1690
|
-
targetGuid ?? reactionContext.targetText ?? "unknown",
|
|
1691
|
-
senderNormalized,
|
|
1692
|
-
reactionContext.emoji
|
|
1693
|
-
].join(":")
|
|
1694
|
-
};
|
|
1695
|
-
}
|
|
1696
|
-
const mentionRegexes = buildMentionRegexes(params.cfg, route.agentId);
|
|
1697
|
-
if (!bodyText) return {
|
|
1698
|
-
kind: "drop",
|
|
1699
|
-
reason: "empty body"
|
|
1700
|
-
};
|
|
1701
|
-
if (skipSelfChatHasCheck ? false : params.selfChatCache?.has({
|
|
1702
|
-
...selfChatLookup,
|
|
1703
|
-
text: bodyText
|
|
1704
|
-
})) {
|
|
1705
|
-
const preview = sanitizeTerminalText(truncateUtf16Safe(bodyText, 50));
|
|
1706
|
-
params.logVerbose?.(`imessage: dropping self-chat reflected duplicate: "${preview}"`);
|
|
1707
|
-
return {
|
|
1708
|
-
kind: "drop",
|
|
1709
|
-
reason: "self-chat echo"
|
|
1710
|
-
};
|
|
1711
|
-
}
|
|
1712
|
-
if (params.echoCache && (messageText || inboundMessageId)) {
|
|
1713
|
-
const echoScope = buildIMessageEchoScope({
|
|
1714
|
-
accountId: params.accountId,
|
|
1715
|
-
isGroup,
|
|
1716
|
-
chatId,
|
|
1717
|
-
chatGuid,
|
|
1718
|
-
chatIdentifier,
|
|
1719
|
-
sender
|
|
1720
|
-
});
|
|
1721
|
-
if (hasIMessageEchoMatch({
|
|
1722
|
-
echoCache: params.echoCache,
|
|
1723
|
-
scope: echoScope,
|
|
1724
|
-
text: bodyText || void 0,
|
|
1725
|
-
messageIds: inboundMessageIds
|
|
1726
|
-
})) {
|
|
1727
|
-
params.logVerbose?.(describeIMessageEchoDropLog({
|
|
1728
|
-
messageText: bodyText,
|
|
1729
|
-
messageId: inboundMessageId
|
|
1730
|
-
}));
|
|
1731
|
-
return {
|
|
1732
|
-
kind: "drop",
|
|
1733
|
-
reason: "echo"
|
|
1734
|
-
};
|
|
1735
|
-
}
|
|
1736
|
-
}
|
|
1737
|
-
const reflection = detectReflectedContent(messageText);
|
|
1738
|
-
if (reflection.isReflection) {
|
|
1739
|
-
params.logVerbose?.(`imessage: dropping reflected assistant content (markers: ${reflection.matchedLabels.join(", ")})`);
|
|
1740
|
-
return {
|
|
1741
|
-
kind: "drop",
|
|
1742
|
-
reason: "reflected assistant content"
|
|
1743
|
-
};
|
|
1744
|
-
}
|
|
1745
|
-
const replyContext = describeReplyContext(params.message);
|
|
1746
|
-
const contextVisibilityMode = resolveChannelContextVisibilityMode({
|
|
1747
|
-
cfg: params.cfg,
|
|
1748
|
-
channel: "imessage",
|
|
1749
|
-
accountId: params.accountId
|
|
1750
|
-
});
|
|
1751
|
-
const replyContextAllowFrom = Array.from(new Set([...groupAllowFromForAccess, ...effectiveGroupAllowFrom]));
|
|
1752
|
-
const replySenderAllowed = !isGroup || replyContextAllowFrom.length === 0 ? true : replyContext?.sender ? isAllowedIMessageReplyContextSender({
|
|
1753
|
-
allowFrom: replyContextAllowFrom,
|
|
1754
|
-
sender: replyContext.sender,
|
|
1755
|
-
chatId,
|
|
1756
|
-
chatGuid,
|
|
1757
|
-
chatIdentifier
|
|
1758
|
-
}) : false;
|
|
1759
|
-
const filteredReplyContext = !replyContext || evaluateSupplementalContextVisibility({
|
|
1760
|
-
mode: contextVisibilityMode,
|
|
1761
|
-
kind: "quote",
|
|
1762
|
-
senderAllowed: replySenderAllowed
|
|
1763
|
-
}).include ? replyContext : null;
|
|
1764
|
-
if (replyContext && !filteredReplyContext && isGroup) params.logVerbose?.(`imessage: drop reply context (mode=${contextVisibilityMode}, sender_allowed=${replySenderAllowed ? "yes" : "no"})`);
|
|
1765
|
-
const historyKey = isGroup ? String(chatId ?? chatGuid ?? chatIdentifier ?? "unknown") : void 0;
|
|
1766
|
-
const mentioned = isGroup ? matchesMentionPatterns(messageText, mentionRegexes) : true;
|
|
1767
|
-
const requireMention = resolveChannelGroupRequireMention({
|
|
1768
|
-
cfg: params.cfg,
|
|
1769
|
-
channel: "imessage",
|
|
1770
|
-
accountId: params.accountId,
|
|
1771
|
-
groupId,
|
|
1772
|
-
requireMentionOverride: params.opts?.requireMention,
|
|
1773
|
-
overrideOrder: "before-config"
|
|
1774
|
-
});
|
|
1775
|
-
const canDetectMention = mentionRegexes.length > 0;
|
|
1776
|
-
const commandAuthorized = commandAccess.authorized;
|
|
1777
|
-
if (commandAccess.shouldBlockControlCommand) {
|
|
1778
|
-
if (params.logVerbose) logInboundDrop({
|
|
1779
|
-
log: params.logVerbose,
|
|
1780
|
-
channel: "imessage",
|
|
1781
|
-
reason: "control command (unauthorized)",
|
|
1782
|
-
target: sender
|
|
1783
|
-
});
|
|
1784
|
-
return {
|
|
1785
|
-
kind: "drop",
|
|
1786
|
-
reason: "control command (unauthorized)"
|
|
1787
|
-
};
|
|
1788
|
-
}
|
|
1789
|
-
const mentionDecision = resolveInboundMentionDecision({
|
|
1790
|
-
facts: {
|
|
1791
|
-
canDetectMention,
|
|
1792
|
-
wasMentioned: mentioned,
|
|
1793
|
-
hasAnyMention: false,
|
|
1794
|
-
implicitMentionKinds: []
|
|
1795
|
-
},
|
|
1796
|
-
policy: {
|
|
1797
|
-
isGroup,
|
|
1798
|
-
requireMention,
|
|
1799
|
-
allowTextCommands: true,
|
|
1800
|
-
hasControlCommand: hasControlCommandInMessage,
|
|
1801
|
-
commandAuthorized
|
|
1802
|
-
}
|
|
1803
|
-
});
|
|
1804
|
-
const effectiveWasMentioned = mentionDecision.effectiveWasMentioned;
|
|
1805
|
-
if (isGroup && requireMention && canDetectMention && mentionDecision.shouldSkip) {
|
|
1806
|
-
params.logVerbose?.(`imessage: skipping group message (no mention)`);
|
|
1807
|
-
createChannelHistoryWindow({ historyMap: params.groupHistories }).record({
|
|
1808
|
-
historyKey: historyKey ?? "",
|
|
1809
|
-
limit: params.historyLimit,
|
|
1810
|
-
entry: historyKey ? {
|
|
1811
|
-
sender: senderNormalized,
|
|
1812
|
-
body: bodyText,
|
|
1813
|
-
timestamp: createdAt,
|
|
1814
|
-
messageId: params.message.id ? String(params.message.id) : void 0
|
|
1815
|
-
} : null
|
|
1816
|
-
});
|
|
1817
|
-
return {
|
|
1818
|
-
kind: "drop",
|
|
1819
|
-
reason: "no mention"
|
|
1820
|
-
};
|
|
1821
|
-
}
|
|
1822
|
-
return {
|
|
1823
|
-
kind: "dispatch",
|
|
1824
|
-
isGroup,
|
|
1825
|
-
chatId,
|
|
1826
|
-
chatGuid,
|
|
1827
|
-
chatIdentifier,
|
|
1828
|
-
groupId,
|
|
1829
|
-
historyKey,
|
|
1830
|
-
sender,
|
|
1831
|
-
senderNormalized,
|
|
1832
|
-
route,
|
|
1833
|
-
bodyText,
|
|
1834
|
-
createdAt,
|
|
1835
|
-
replyContext: filteredReplyContext,
|
|
1836
|
-
effectiveWasMentioned,
|
|
1837
|
-
commandAuthorized,
|
|
1838
|
-
groupSystemPrompt: isGroup ? resolveIMessageGroupSystemPrompt({
|
|
1839
|
-
groupConfig: groupListPolicy.groupConfig,
|
|
1840
|
-
defaultConfig: groupListPolicy.defaultConfig
|
|
1841
|
-
}) : void 0
|
|
1842
|
-
};
|
|
1843
|
-
}
|
|
1844
|
-
function buildIMessageInboundContext(params) {
|
|
1845
|
-
const envelopeOptions = params.envelopeOptions ?? resolveEnvelopeFormatOptions(params.cfg);
|
|
1846
|
-
const { decision } = params;
|
|
1847
|
-
const chatId = decision.chatId;
|
|
1848
|
-
const chatTarget = decision.isGroup && chatId != null ? formatIMessageChatTarget(chatId) : void 0;
|
|
1849
|
-
const messageGuid = normalizeReplyField(params.message.guid);
|
|
1850
|
-
const messageSid = (messageGuid ? rememberIMessageReplyCache({
|
|
1851
|
-
accountId: decision.route.accountId,
|
|
1852
|
-
messageId: messageGuid,
|
|
1853
|
-
chatGuid: decision.chatGuid,
|
|
1854
|
-
chatIdentifier: decision.chatIdentifier,
|
|
1855
|
-
chatId: decision.chatId,
|
|
1856
|
-
timestamp: Date.now(),
|
|
1857
|
-
isFromMe: false
|
|
1858
|
-
}) : null)?.shortId || void 0;
|
|
1859
|
-
const replySuffix = decision.replyContext ? `\n\n[Replying to ${decision.replyContext.sender ?? "unknown sender"}${decision.replyContext.id ? ` id:${decision.replyContext.id}` : ""}]\n${decision.replyContext.body}\n[/Replying]` : "";
|
|
1860
|
-
const fromLabel = formatInboundFromLabel({
|
|
1861
|
-
isGroup: decision.isGroup,
|
|
1862
|
-
groupLabel: params.message.chat_name ?? void 0,
|
|
1863
|
-
groupId: chatId !== void 0 ? String(chatId) : "unknown",
|
|
1864
|
-
groupFallback: "Group",
|
|
1865
|
-
directLabel: decision.senderNormalized,
|
|
1866
|
-
directId: decision.sender
|
|
1867
|
-
});
|
|
1868
|
-
let combinedBody = formatInboundEnvelope({
|
|
1869
|
-
channel: "iMessage",
|
|
1870
|
-
from: fromLabel,
|
|
1871
|
-
timestamp: decision.createdAt,
|
|
1872
|
-
body: `${decision.bodyText}${replySuffix}`,
|
|
1873
|
-
chatType: decision.isGroup ? "group" : "direct",
|
|
1874
|
-
sender: {
|
|
1875
|
-
name: decision.senderNormalized,
|
|
1876
|
-
id: decision.sender
|
|
1877
|
-
},
|
|
1878
|
-
previousTimestamp: params.previousTimestamp,
|
|
1879
|
-
envelope: envelopeOptions
|
|
1880
|
-
});
|
|
1881
|
-
if (decision.isGroup && decision.historyKey) combinedBody = createChannelHistoryWindow({ historyMap: params.groupHistories }).buildPendingContext({
|
|
1882
|
-
historyKey: decision.historyKey,
|
|
1883
|
-
limit: params.historyLimit,
|
|
1884
|
-
currentMessage: combinedBody,
|
|
1885
|
-
formatEntry: (entry) => formatInboundEnvelope({
|
|
1886
|
-
channel: "iMessage",
|
|
1887
|
-
from: fromLabel,
|
|
1888
|
-
timestamp: entry.timestamp,
|
|
1889
|
-
body: `${entry.body}${entry.messageId ? ` [id:${entry.messageId}]` : ""}`,
|
|
1890
|
-
chatType: "group",
|
|
1891
|
-
senderLabel: entry.sender,
|
|
1892
|
-
envelope: envelopeOptions
|
|
1893
|
-
})
|
|
1894
|
-
});
|
|
1895
|
-
const imessageTo = (decision.isGroup ? chatTarget : void 0) || `imessage:${decision.sender}`;
|
|
1896
|
-
const inboundHistory = decision.isGroup && decision.historyKey && params.historyLimit > 0 ? createChannelHistoryWindow({ historyMap: params.groupHistories }).buildInboundHistory({
|
|
1897
|
-
historyKey: decision.historyKey,
|
|
1898
|
-
limit: params.historyLimit
|
|
1899
|
-
}) : void 0;
|
|
1900
|
-
return {
|
|
1901
|
-
ctxPayload: finalizeInboundContext({
|
|
1902
|
-
Body: combinedBody,
|
|
1903
|
-
BodyForAgent: decision.bodyText,
|
|
1904
|
-
InboundHistory: inboundHistory,
|
|
1905
|
-
RawBody: decision.bodyText,
|
|
1906
|
-
CommandBody: decision.bodyText,
|
|
1907
|
-
From: decision.isGroup ? `imessage:group:${chatId ?? "unknown"}` : `imessage:${decision.sender}`,
|
|
1908
|
-
To: imessageTo,
|
|
1909
|
-
SessionKey: decision.route.sessionKey,
|
|
1910
|
-
AccountId: decision.route.accountId,
|
|
1911
|
-
ChatType: decision.isGroup ? "group" : "direct",
|
|
1912
|
-
ConversationLabel: fromLabel,
|
|
1913
|
-
GroupSubject: decision.isGroup ? params.message.chat_name ?? void 0 : void 0,
|
|
1914
|
-
GroupSystemPrompt: decision.isGroup ? decision.groupSystemPrompt : void 0,
|
|
1915
|
-
GroupMembers: decision.isGroup ? (params.message.participants ?? []).filter(Boolean).join(", ") : void 0,
|
|
1916
|
-
SenderName: decision.senderNormalized,
|
|
1917
|
-
SenderId: decision.sender,
|
|
1918
|
-
Provider: "imessage",
|
|
1919
|
-
Surface: "imessage",
|
|
1920
|
-
MessageSid: messageSid,
|
|
1921
|
-
MessageSidFull: messageGuid,
|
|
1922
|
-
ReplyToId: decision.replyContext?.id,
|
|
1923
|
-
ReplyToBody: decision.replyContext?.body,
|
|
1924
|
-
ReplyToSender: decision.replyContext?.sender,
|
|
1925
|
-
Timestamp: decision.createdAt,
|
|
1926
|
-
MediaPath: params.media?.path,
|
|
1927
|
-
MediaType: params.media?.type,
|
|
1928
|
-
MediaUrl: params.media?.path,
|
|
1929
|
-
MediaPaths: params.media?.paths && params.media.paths.length > 0 ? params.media.paths : void 0,
|
|
1930
|
-
MediaTypes: params.media?.types && params.media.types.length > 0 ? params.media.types : void 0,
|
|
1931
|
-
MediaUrls: params.media?.paths && params.media.paths.length > 0 ? params.media.paths : void 0,
|
|
1932
|
-
MediaRemoteHost: params.remoteHost,
|
|
1933
|
-
WasMentioned: decision.effectiveWasMentioned,
|
|
1934
|
-
CommandAuthorized: decision.commandAuthorized,
|
|
1935
|
-
OriginatingChannel: "imessage",
|
|
1936
|
-
OriginatingTo: imessageTo
|
|
1937
|
-
}),
|
|
1938
|
-
fromLabel,
|
|
1939
|
-
chatTarget,
|
|
1940
|
-
imessageTo,
|
|
1941
|
-
inboundHistory
|
|
1942
|
-
};
|
|
1943
|
-
}
|
|
1944
|
-
function buildIMessageEchoScope(params) {
|
|
1945
|
-
const scopes = [];
|
|
1946
|
-
if (params.isGroup) {
|
|
1947
|
-
const chatIdScope = formatIMessageChatTarget(params.chatId);
|
|
1948
|
-
if (chatIdScope) scopes.push(`${params.accountId}:${chatIdScope}`);
|
|
1949
|
-
} else scopes.push(`${params.accountId}:imessage:${params.sender}`);
|
|
1950
|
-
if (params.chatGuid) scopes.push(`${params.accountId}:chat_guid:${params.chatGuid}`);
|
|
1951
|
-
if (params.chatIdentifier) scopes.push(`${params.accountId}:chat_identifier:${params.chatIdentifier}`);
|
|
1952
|
-
return scopes;
|
|
1953
|
-
}
|
|
1954
|
-
function describeIMessageEchoDropLog(params) {
|
|
1955
|
-
const preview = truncateUtf16Safe(params.messageText, 50);
|
|
1956
|
-
return `imessage: skipping echo message${params.messageId ? ` id=${params.messageId}` : ""}: "${preview}"`;
|
|
1957
|
-
}
|
|
1958
|
-
//#endregion
|
|
1959
|
-
//#region extensions/imessage/src/monitor/loop-rate-limiter.ts
|
|
1960
|
-
/**
|
|
1961
|
-
* Per-conversation rate limiter that detects rapid-fire identical echo
|
|
1962
|
-
* patterns and suppresses them before they amplify into queue overflow.
|
|
1963
|
-
*/
|
|
1964
|
-
const DEFAULT_WINDOW_MS = 6e4;
|
|
1965
|
-
const DEFAULT_MAX_HITS = 5;
|
|
1966
|
-
const CLEANUP_INTERVAL_MS = 12e4;
|
|
1967
|
-
function createLoopRateLimiter(opts) {
|
|
1968
|
-
const windowMs = opts?.windowMs ?? DEFAULT_WINDOW_MS;
|
|
1969
|
-
const maxHits = opts?.maxHits ?? DEFAULT_MAX_HITS;
|
|
1970
|
-
const conversations = /* @__PURE__ */ new Map();
|
|
1971
|
-
let lastCleanup = Date.now();
|
|
1972
|
-
function cleanup() {
|
|
1973
|
-
const now = Date.now();
|
|
1974
|
-
if (now - lastCleanup < CLEANUP_INTERVAL_MS) return;
|
|
1975
|
-
lastCleanup = now;
|
|
1976
|
-
for (const [key, win] of conversations.entries()) {
|
|
1977
|
-
const recent = win.timestamps.filter((ts) => now - ts <= windowMs);
|
|
1978
|
-
if (recent.length === 0) conversations.delete(key);
|
|
1979
|
-
else win.timestamps = recent;
|
|
1980
|
-
}
|
|
1981
|
-
}
|
|
1982
|
-
return {
|
|
1983
|
-
record(conversationKey) {
|
|
1984
|
-
cleanup();
|
|
1985
|
-
let win = conversations.get(conversationKey);
|
|
1986
|
-
if (!win) {
|
|
1987
|
-
win = { timestamps: [] };
|
|
1988
|
-
conversations.set(conversationKey, win);
|
|
1989
|
-
}
|
|
1990
|
-
win.timestamps.push(Date.now());
|
|
1991
|
-
},
|
|
1992
|
-
isRateLimited(conversationKey) {
|
|
1993
|
-
cleanup();
|
|
1994
|
-
const win = conversations.get(conversationKey);
|
|
1995
|
-
if (!win) return false;
|
|
1996
|
-
const now = Date.now();
|
|
1997
|
-
const recent = win.timestamps.filter((ts) => now - ts <= windowMs);
|
|
1998
|
-
win.timestamps = recent;
|
|
1999
|
-
return recent.length >= maxHits;
|
|
2000
|
-
}
|
|
2001
|
-
};
|
|
2002
|
-
}
|
|
2003
|
-
//#endregion
|
|
2004
|
-
//#region extensions/imessage/src/monitor/media-staging.ts
|
|
2005
|
-
function isHeicAttachment(attachmentPath, mimeType) {
|
|
2006
|
-
const normalizedMime = mimeType?.toLowerCase();
|
|
2007
|
-
if (normalizedMime === "image/heic" || normalizedMime === "image/heif") return true;
|
|
2008
|
-
const ext = path.extname(attachmentPath).toLowerCase();
|
|
2009
|
-
return ext === ".heic" || ext === ".heif";
|
|
2010
|
-
}
|
|
2011
|
-
function jpegFilenameForAttachment(attachmentPath) {
|
|
2012
|
-
return `${path.parse(attachmentPath).name || "imessage-attachment"}.jpg`;
|
|
2013
|
-
}
|
|
2014
|
-
function hasWildcardSegment(root) {
|
|
2015
|
-
return root.replaceAll("\\", "/").split("/").includes("*");
|
|
2016
|
-
}
|
|
2017
|
-
async function canonicalizeAllowedRoots(roots) {
|
|
2018
|
-
const canonicalRoots = [];
|
|
2019
|
-
for (const root of roots) {
|
|
2020
|
-
canonicalRoots.push(root);
|
|
2021
|
-
if (hasWildcardSegment(root)) continue;
|
|
2022
|
-
const canonicalRoot = await fs$1.realpath(root).catch(() => void 0);
|
|
2023
|
-
if (canonicalRoot && canonicalRoot !== root) canonicalRoots.push(canonicalRoot);
|
|
2024
|
-
}
|
|
2025
|
-
return canonicalRoots;
|
|
2026
|
-
}
|
|
2027
|
-
async function resolveAllowedCanonicalAttachmentPath(params) {
|
|
2028
|
-
if (!params.allowedRoots) return params.attachmentPath;
|
|
2029
|
-
const canonicalPath = await fs$1.realpath(params.attachmentPath);
|
|
2030
|
-
if (!isInboundPathAllowed({
|
|
2031
|
-
filePath: canonicalPath,
|
|
2032
|
-
roots: await canonicalizeAllowedRoots(params.allowedRoots)
|
|
2033
|
-
})) throw new Error("attachment path resolves outside allowed roots");
|
|
2034
|
-
return canonicalPath;
|
|
2035
|
-
}
|
|
2036
|
-
async function readAttachmentBuffer(params) {
|
|
2037
|
-
const stat = await fs$1.lstat(params.attachmentPath);
|
|
2038
|
-
if (stat.isSymbolicLink()) throw new Error("attachment path is a symlink");
|
|
2039
|
-
if (!stat.isFile()) throw new Error("attachment path is not a file");
|
|
2040
|
-
if (stat.size > params.maxBytes) throw new Error(`attachment exceeds ${Math.round(params.maxBytes / (1024 * 1024))}MB limit`);
|
|
2041
|
-
const canonicalPath = await resolveAllowedCanonicalAttachmentPath({
|
|
2042
|
-
attachmentPath: params.attachmentPath,
|
|
2043
|
-
allowedRoots: params.allowedRoots
|
|
2044
|
-
});
|
|
2045
|
-
const canonicalStat = await fs$1.stat(canonicalPath);
|
|
2046
|
-
if (!canonicalStat.isFile()) throw new Error("attachment path is not a file");
|
|
2047
|
-
if (canonicalStat.size > params.maxBytes) throw new Error(`attachment exceeds ${Math.round(params.maxBytes / (1024 * 1024))}MB limit`);
|
|
2048
|
-
if (isHeicAttachment(params.attachmentPath, params.mimeType)) try {
|
|
2049
|
-
const convert = params.deps.convertHeicToJpeg;
|
|
2050
|
-
const converted = convert ? {
|
|
2051
|
-
buffer: await convert(canonicalPath, params.maxBytes),
|
|
2052
|
-
fileName: jpegFilenameForAttachment(params.attachmentPath)
|
|
2053
|
-
} : await loadWebMedia(canonicalPath, {
|
|
2054
|
-
maxBytes: params.maxBytes,
|
|
2055
|
-
localRoots: [path.dirname(canonicalPath)]
|
|
2056
|
-
});
|
|
2057
|
-
return {
|
|
2058
|
-
buffer: converted.buffer,
|
|
2059
|
-
contentType: "image/jpeg",
|
|
2060
|
-
originalFilename: converted.fileName ?? jpegFilenameForAttachment(params.attachmentPath)
|
|
2061
|
-
};
|
|
2062
|
-
} catch (err) {
|
|
2063
|
-
params.deps.logVerbose?.(`imessage: HEIC attachment conversion failed; staging original instead: ${String(err)}`);
|
|
2064
|
-
}
|
|
2065
|
-
return {
|
|
2066
|
-
buffer: await fs$1.readFile(canonicalPath),
|
|
2067
|
-
contentType: params.mimeType ?? void 0,
|
|
2068
|
-
originalFilename: path.basename(params.attachmentPath)
|
|
2069
|
-
};
|
|
2070
|
-
}
|
|
2071
|
-
async function stageIMessageAttachments(attachments, params) {
|
|
2072
|
-
const deps = params.deps ?? {};
|
|
2073
|
-
const save = deps.saveMediaBuffer ?? saveMediaBuffer;
|
|
2074
|
-
const staged = [];
|
|
2075
|
-
for (const attachment of attachments) {
|
|
2076
|
-
const attachmentPath = attachment.original_path?.trim();
|
|
2077
|
-
if (!attachmentPath || attachment.missing) continue;
|
|
2078
|
-
try {
|
|
2079
|
-
const media = await readAttachmentBuffer({
|
|
2080
|
-
attachmentPath,
|
|
2081
|
-
mimeType: attachment.mime_type,
|
|
2082
|
-
maxBytes: params.maxBytes,
|
|
2083
|
-
allowedRoots: params.allowedRoots,
|
|
2084
|
-
deps
|
|
2085
|
-
});
|
|
2086
|
-
const saved = await save(media.buffer, media.contentType, "inbound", params.maxBytes, media.originalFilename);
|
|
2087
|
-
staged.push({
|
|
2088
|
-
path: saved.path,
|
|
2089
|
-
contentType: saved.contentType
|
|
2090
|
-
});
|
|
2091
|
-
} catch (err) {
|
|
2092
|
-
deps.logVerbose?.(`imessage: failed to stage inbound attachment: ${String(err)}`);
|
|
2093
|
-
}
|
|
2094
|
-
}
|
|
2095
|
-
return staged;
|
|
2096
|
-
}
|
|
2097
|
-
//#endregion
|
|
2098
|
-
//#region extensions/imessage/src/monitor/reaction-system-event.ts
|
|
2099
|
-
function enqueueIMessageReactionSystemEvent(params) {
|
|
2100
|
-
const { decision, runtime } = params;
|
|
2101
|
-
const queued = enqueueSystemEvent(decision.text, {
|
|
2102
|
-
sessionKey: decision.route.sessionKey,
|
|
2103
|
-
contextKey: decision.contextKey
|
|
2104
|
-
});
|
|
2105
|
-
runtime.log?.(`imessage: reaction system event ${queued ? "queued" : "deduped"} session=${decision.route.sessionKey} target=${decision.reaction.targetGuid ?? "unknown"} action=${decision.reaction.action} emoji=${decision.reaction.emoji}`);
|
|
2106
|
-
params.logVerbose?.(`imessage: reaction event enqueued: ${decision.text}`);
|
|
2107
|
-
return queued;
|
|
2108
|
-
}
|
|
2109
|
-
//#endregion
|
|
2110
|
-
//#region extensions/imessage/src/monitor/runtime.ts
|
|
2111
|
-
function resolveRuntime(opts) {
|
|
2112
|
-
return opts.runtime ?? createNonExitingRuntime();
|
|
2113
|
-
}
|
|
2114
|
-
function normalizeAllowList(list) {
|
|
2115
|
-
return normalizeStringEntries(list);
|
|
2116
|
-
}
|
|
2117
|
-
//#endregion
|
|
2118
|
-
//#region extensions/imessage/src/monitor/self-chat-cache.ts
|
|
2119
|
-
const SELF_CHAT_TTL_MS = 1e4;
|
|
2120
|
-
const MAX_SELF_CHAT_CACHE_ENTRIES = 512;
|
|
2121
|
-
const CLEANUP_MIN_INTERVAL_MS = 1e3;
|
|
2122
|
-
function normalizeText(text) {
|
|
2123
|
-
if (!text) return null;
|
|
2124
|
-
const normalized = text.replace(/\r\n?/g, "\n").trim();
|
|
2125
|
-
return normalized ? normalized : null;
|
|
2126
|
-
}
|
|
2127
|
-
function isUsableTimestamp(createdAt) {
|
|
2128
|
-
return typeof createdAt === "number" && Number.isFinite(createdAt);
|
|
2129
|
-
}
|
|
2130
|
-
function digestText(text) {
|
|
2131
|
-
return createHash("sha256").update(text).digest("hex");
|
|
2132
|
-
}
|
|
2133
|
-
function buildScope(parts) {
|
|
2134
|
-
if (!parts.isGroup) return `${parts.accountId}:imessage:${parts.sender}`;
|
|
2135
|
-
const chatTarget = formatIMessageChatTarget(parts.chatId) || "chat_id:unknown";
|
|
2136
|
-
return `${parts.accountId}:${chatTarget}:imessage:${parts.sender}`;
|
|
2137
|
-
}
|
|
2138
|
-
var DefaultSelfChatCache = class {
|
|
2139
|
-
constructor() {
|
|
2140
|
-
this.cache = /* @__PURE__ */ new Map();
|
|
2141
|
-
this.lastCleanupAt = 0;
|
|
2142
|
-
}
|
|
2143
|
-
buildKey(lookup) {
|
|
2144
|
-
const text = normalizeText(lookup.text);
|
|
2145
|
-
if (!text || !isUsableTimestamp(lookup.createdAt)) return null;
|
|
2146
|
-
return `${buildScope(lookup)}:${lookup.createdAt}:${digestText(text)}`;
|
|
2147
|
-
}
|
|
2148
|
-
remember(lookup) {
|
|
2149
|
-
const key = this.buildKey(lookup);
|
|
2150
|
-
if (!key) return;
|
|
2151
|
-
this.cache.set(key, Date.now());
|
|
2152
|
-
this.maybeCleanup();
|
|
2153
|
-
}
|
|
2154
|
-
has(lookup) {
|
|
2155
|
-
this.maybeCleanup();
|
|
2156
|
-
const key = this.buildKey(lookup);
|
|
2157
|
-
if (!key) return false;
|
|
2158
|
-
const timestamp = this.cache.get(key);
|
|
2159
|
-
return typeof timestamp === "number" && Date.now() - timestamp <= SELF_CHAT_TTL_MS;
|
|
2160
|
-
}
|
|
2161
|
-
maybeCleanup() {
|
|
2162
|
-
const now = Date.now();
|
|
2163
|
-
if (now - this.lastCleanupAt < CLEANUP_MIN_INTERVAL_MS) return;
|
|
2164
|
-
this.lastCleanupAt = now;
|
|
2165
|
-
for (const [key, timestamp] of this.cache.entries()) if (now - timestamp > SELF_CHAT_TTL_MS) this.cache.delete(key);
|
|
2166
|
-
while (this.cache.size > MAX_SELF_CHAT_CACHE_ENTRIES) {
|
|
2167
|
-
const oldestKey = this.cache.keys().next().value;
|
|
2168
|
-
if (typeof oldestKey !== "string") break;
|
|
2169
|
-
this.cache.delete(oldestKey);
|
|
2170
|
-
}
|
|
2171
|
-
}
|
|
2172
|
-
};
|
|
2173
|
-
function createSelfChatCache() {
|
|
2174
|
-
return new DefaultSelfChatCache();
|
|
2175
|
-
}
|
|
2176
|
-
//#endregion
|
|
2177
|
-
//#region extensions/imessage/src/monitor/watch-error-log.ts
|
|
2178
|
-
const MAX_WATCH_ERROR_MESSAGE_CHARS = 200;
|
|
2179
|
-
function sanitizeIMessageWatchErrorPayload(payload) {
|
|
2180
|
-
if (!isRecord(payload)) return {};
|
|
2181
|
-
const safe = {};
|
|
2182
|
-
if (typeof payload.code === "number" && Number.isFinite(payload.code)) safe.code = payload.code;
|
|
2183
|
-
if (typeof payload.message === "string") {
|
|
2184
|
-
const sanitizedMessage = sanitizeTerminalText(payload.message);
|
|
2185
|
-
if (sanitizedMessage) safe.message = sanitizedMessage.length > MAX_WATCH_ERROR_MESSAGE_CHARS ? `${truncateUtf16Safe(sanitizedMessage, MAX_WATCH_ERROR_MESSAGE_CHARS - 1)}…` : sanitizedMessage;
|
|
2186
|
-
}
|
|
2187
|
-
return safe;
|
|
2188
|
-
}
|
|
2189
|
-
//#endregion
|
|
2190
|
-
//#region extensions/imessage/src/monitor/monitor-provider.ts
|
|
2191
|
-
const WATCH_SUBSCRIBE_MAX_ATTEMPTS = 3;
|
|
2192
|
-
const WATCH_SUBSCRIBE_RETRY_DELAY_MS = 1e3;
|
|
2193
|
-
function isIMessagePluginPayloadAttachment(attachment) {
|
|
2194
|
-
const attachmentPath = attachment.original_path?.trim().toLowerCase() ?? "";
|
|
2195
|
-
const transferName = attachment.transfer_name?.trim().toLowerCase() ?? "";
|
|
2196
|
-
const uti = attachment.uti?.trim().toLowerCase() ?? "";
|
|
2197
|
-
return attachmentPath.endsWith(".pluginpayloadattachment") || transferName.endsWith(".pluginpayloadattachment") || uti === "com.apple.messages.pluginpayloadattachment";
|
|
2198
|
-
}
|
|
2199
|
-
async function detectRemoteHostFromCliPath(cliPath) {
|
|
2200
|
-
try {
|
|
2201
|
-
const expanded = cliPath.startsWith("~") ? cliPath.replace(/^~/, process.env.HOME ?? "") : cliPath;
|
|
2202
|
-
const content = await fs$1.readFile(expanded, "utf8");
|
|
2203
|
-
const userHostMatch = content.match(/\bssh\b[^\n]*?\s+([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+)/);
|
|
2204
|
-
if (userHostMatch) return userHostMatch[1];
|
|
2205
|
-
return content.match(/\bssh\b[^\n]*?\s+([a-zA-Z][a-zA-Z0-9._-]*)\s+\S*\bimsg\b/)?.[1];
|
|
2206
|
-
} catch (err) {
|
|
2207
|
-
const code = err?.code;
|
|
2208
|
-
if (code !== "ENOENT" && code !== "ENOTDIR") logVerbose(`imessage: failed to inspect cliPath ${cliPath} for remoteHost detection: ${String(err)}`);
|
|
2209
|
-
return;
|
|
2210
|
-
}
|
|
2211
|
-
}
|
|
2212
|
-
const warnIfImsgUpgradeNeeded = (() => {
|
|
2213
|
-
let fired = false;
|
|
2214
|
-
return { fireOnce: (rpcMethods, runtime) => {
|
|
2215
|
-
if (fired) return;
|
|
2216
|
-
fired = true;
|
|
2217
|
-
const detail = rpcMethods.length === 0 ? "imsg build pre-dates the rpc_methods capability list" : `imsg rpc_methods=[${rpcMethods.join(", ")}] does not include typing/read`;
|
|
2218
|
-
runtime.log?.(warn(`imessage: typing indicators / read receipts gated off (${detail}). Upgrade imsg (current bridge needs typing+read in rpc_methods).`));
|
|
2219
|
-
} };
|
|
2220
|
-
})();
|
|
2221
|
-
function isRetriableWatchSubscribeStartupError(error) {
|
|
2222
|
-
return /imsg rpc timeout \(watch\.subscribe\)|imsg rpc (closed|exited|not running)/i.test(String(error));
|
|
2223
|
-
}
|
|
2224
|
-
async function waitForWatchSubscribeRetryDelay(params) {
|
|
2225
|
-
if (params.ms <= 0) return;
|
|
2226
|
-
await new Promise((resolve) => {
|
|
2227
|
-
const timer = setTimeout(() => {
|
|
2228
|
-
params.abortSignal?.removeEventListener("abort", onAbort);
|
|
2229
|
-
resolve();
|
|
2230
|
-
}, params.ms);
|
|
2231
|
-
const onAbort = () => {
|
|
2232
|
-
clearTimeout(timer);
|
|
2233
|
-
params.abortSignal?.removeEventListener("abort", onAbort);
|
|
2234
|
-
resolve();
|
|
2235
|
-
};
|
|
2236
|
-
params.abortSignal?.addEventListener("abort", onAbort, { once: true });
|
|
2237
|
-
});
|
|
2238
|
-
}
|
|
2239
|
-
async function monitorIMessageProvider(opts = {}) {
|
|
2240
|
-
const runtime = resolveRuntime(opts);
|
|
2241
|
-
const cfg = opts.config ?? getRuntimeConfig();
|
|
2242
|
-
const accountInfo = resolveIMessageAccount({
|
|
2243
|
-
cfg,
|
|
2244
|
-
accountId: opts.accountId
|
|
2245
|
-
});
|
|
2246
|
-
const imessageCfg = accountInfo.config;
|
|
2247
|
-
const historyLimit = Math.max(0, imessageCfg.historyLimit ?? cfg.messages?.groupChat?.historyLimit ?? 50);
|
|
2248
|
-
const groupHistories = /* @__PURE__ */ new Map();
|
|
2249
|
-
const sentMessageCache = createSentMessageCache();
|
|
2250
|
-
const selfChatCache = createSelfChatCache();
|
|
2251
|
-
const loopRateLimiter = createLoopRateLimiter();
|
|
2252
|
-
const textLimit = resolveTextChunkLimit(cfg, "imessage", accountInfo.accountId);
|
|
2253
|
-
const allowFrom = normalizeAllowList(opts.allowFrom ?? imessageCfg.allowFrom);
|
|
2254
|
-
const configuredGroupAllowFrom = opts.groupAllowFrom ?? imessageCfg.groupAllowFrom;
|
|
2255
|
-
const groupAllowFrom = normalizeAllowList(configuredGroupAllowFrom ?? (imessageCfg.allowFrom && imessageCfg.allowFrom.length > 0 ? imessageCfg.allowFrom : []));
|
|
2256
|
-
const allowLegacyConversationAllowFromForGroup = configuredGroupAllowFrom == null;
|
|
2257
|
-
const defaultGroupPolicy = resolveDefaultGroupPolicy(cfg);
|
|
2258
|
-
const { groupPolicy, providerMissingFallbackApplied } = resolveOpenProviderRuntimeGroupPolicy({
|
|
2259
|
-
providerConfigPresent: cfg.channels?.imessage !== void 0,
|
|
2260
|
-
groupPolicy: imessageCfg.groupPolicy,
|
|
2261
|
-
defaultGroupPolicy
|
|
2262
|
-
});
|
|
2263
|
-
warnMissingProviderGroupPolicyFallbackOnce({
|
|
2264
|
-
providerMissingFallbackApplied,
|
|
2265
|
-
providerKey: "imessage",
|
|
2266
|
-
accountId: accountInfo.accountId,
|
|
2267
|
-
log: (message) => runtime.log?.(warn(message))
|
|
2268
|
-
});
|
|
2269
|
-
warnGroupAllowlistMisconfigOnce({
|
|
2270
|
-
groupPolicy,
|
|
2271
|
-
groups: imessageCfg.groups,
|
|
2272
|
-
accountId: accountInfo.accountId,
|
|
2273
|
-
log: (message) => runtime.log?.(warn(message))
|
|
2274
|
-
});
|
|
2275
|
-
const dmPolicy = imessageCfg.dmPolicy ?? "pairing";
|
|
2276
|
-
const includeAttachments = opts.includeAttachments ?? imessageCfg.includeAttachments ?? false;
|
|
2277
|
-
const mediaMaxBytes = (opts.mediaMaxMb ?? imessageCfg.mediaMaxMb ?? 16) * 1024 * 1024;
|
|
2278
|
-
const cliPath = opts.cliPath ?? imessageCfg.cliPath ?? "imsg";
|
|
2279
|
-
const dbPath = opts.dbPath ?? imessageCfg.dbPath;
|
|
2280
|
-
const probeTimeoutMs = imessageCfg.probeTimeoutMs ?? 1e4;
|
|
2281
|
-
const attachmentRoots = resolveIMessageAttachmentRoots({
|
|
2282
|
-
cfg,
|
|
2283
|
-
accountId: accountInfo.accountId
|
|
2284
|
-
});
|
|
2285
|
-
const remoteAttachmentRoots = resolveIMessageRemoteAttachmentRoots({
|
|
2286
|
-
cfg,
|
|
2287
|
-
accountId: accountInfo.accountId
|
|
2288
|
-
});
|
|
2289
|
-
const configuredRemoteHost = normalizeScpRemoteHost(imessageCfg.remoteHost);
|
|
2290
|
-
if (imessageCfg.remoteHost && !configuredRemoteHost) logVerbose("imessage: ignoring unsafe channels.imessage.remoteHost value");
|
|
2291
|
-
let remoteHost = configuredRemoteHost;
|
|
2292
|
-
if (!remoteHost && cliPath && cliPath !== "imsg") {
|
|
2293
|
-
const detected = await detectRemoteHostFromCliPath(cliPath);
|
|
2294
|
-
const normalizedDetected = normalizeScpRemoteHost(detected);
|
|
2295
|
-
if (detected && !normalizedDetected) logVerbose("imessage: ignoring unsafe auto-detected remoteHost from cliPath");
|
|
2296
|
-
remoteHost = normalizedDetected;
|
|
2297
|
-
if (remoteHost) logVerbose(`imessage: detected remoteHost=${remoteHost} from cliPath`);
|
|
2298
|
-
}
|
|
2299
|
-
const coalesceSameSenderDms = imessageCfg.coalesceSameSenderDms === true;
|
|
2300
|
-
const inboundCfg = cfg.messages?.inbound;
|
|
2301
|
-
const hasExplicitInboundDebounce = typeof inboundCfg?.debounceMs === "number" || typeof inboundCfg?.byChannel?.imessage === "number";
|
|
2302
|
-
const { debouncer: inboundDebouncer } = createChannelInboundDebouncer({
|
|
2303
|
-
cfg,
|
|
2304
|
-
channel: "imessage",
|
|
2305
|
-
debounceMsOverride: coalesceSameSenderDms && !hasExplicitInboundDebounce ? 2500 : void 0,
|
|
2306
|
-
buildKey: (entry) => {
|
|
2307
|
-
const msg = entry.message;
|
|
2308
|
-
const sender = msg.sender?.trim();
|
|
2309
|
-
if (!sender) return null;
|
|
2310
|
-
const conversationId = msg.chat_id != null ? `chat:${msg.chat_id}` : msg.chat_guid ?? msg.chat_identifier ?? "unknown";
|
|
2311
|
-
if (coalesceSameSenderDms && msg.is_group !== true) return `imessage:${accountInfo.accountId}:dm:${conversationId}:${sender}`;
|
|
2312
|
-
return `imessage:${accountInfo.accountId}:${conversationId}:${sender}`;
|
|
2313
|
-
},
|
|
2314
|
-
shouldDebounce: (entry) => {
|
|
2315
|
-
const msg = entry.message;
|
|
2316
|
-
if (resolveIMessageReactionContext(msg, (msg.text ?? "").trim())) return false;
|
|
2317
|
-
if (msg.is_from_me === true) return false;
|
|
2318
|
-
if (coalesceSameSenderDms) return msg.is_group !== true;
|
|
2319
|
-
return shouldDebounceTextInbound({
|
|
2320
|
-
text: msg.text,
|
|
2321
|
-
cfg,
|
|
2322
|
-
hasMedia: Boolean(msg.attachments?.some((attachment) => !isIMessagePluginPayloadAttachment(attachment)))
|
|
2323
|
-
});
|
|
2324
|
-
},
|
|
2325
|
-
onFlush: async (entries) => {
|
|
2326
|
-
if (entries.length === 0) return;
|
|
2327
|
-
if (entries.length === 1) {
|
|
2328
|
-
await handleMessageNow(entries[0].message);
|
|
2329
|
-
return;
|
|
2330
|
-
}
|
|
2331
|
-
const combined = combineIMessagePayloads(entries.map((e) => e.message));
|
|
2332
|
-
if (shouldLogVerbose()) {
|
|
2333
|
-
const text = combined.text ?? "";
|
|
2334
|
-
const preview = text.slice(0, 50);
|
|
2335
|
-
const ellipsis = text.length > 50 ? "..." : "";
|
|
2336
|
-
logVerbose(`[imessage] coalesced ${entries.length} messages: "${preview}${ellipsis}"`);
|
|
2337
|
-
}
|
|
2338
|
-
await handleMessageNow(combined);
|
|
2339
|
-
},
|
|
2340
|
-
onError: (err) => {
|
|
2341
|
-
runtime.error?.(`imessage debounce flush failed: ${String(err)}`);
|
|
2342
|
-
}
|
|
2343
|
-
});
|
|
2344
|
-
let client;
|
|
2345
|
-
let detachAbortHandler = () => {};
|
|
2346
|
-
const getActiveClient = () => {
|
|
2347
|
-
if (!client) throw new Error("imessage monitor client not initialized");
|
|
2348
|
-
return client;
|
|
2349
|
-
};
|
|
2350
|
-
async function handleMessageNow(message) {
|
|
2351
|
-
const messageText = (message.text ?? "").trim();
|
|
2352
|
-
const attachments = includeAttachments ? message.attachments ?? [] : [];
|
|
2353
|
-
const effectiveAttachmentRoots = remoteHost ? remoteAttachmentRoots : attachmentRoots;
|
|
2354
|
-
const validAttachments = attachments.filter((entry) => {
|
|
2355
|
-
if (isIMessagePluginPayloadAttachment(entry)) return false;
|
|
2356
|
-
const attachmentPath = entry?.original_path?.trim();
|
|
2357
|
-
if (!attachmentPath || entry?.missing) return false;
|
|
2358
|
-
if (isInboundPathAllowed({
|
|
2359
|
-
filePath: attachmentPath,
|
|
2360
|
-
roots: effectiveAttachmentRoots
|
|
2361
|
-
})) return true;
|
|
2362
|
-
logVerbose(`imessage: dropping inbound attachment outside allowed roots: ${attachmentPath}`);
|
|
2363
|
-
return false;
|
|
2364
|
-
});
|
|
2365
|
-
const rawMediaAttachments = validAttachments.flatMap((a) => {
|
|
2366
|
-
const attachmentPath = a.original_path?.trim();
|
|
2367
|
-
return attachmentPath ? [{
|
|
2368
|
-
path: attachmentPath,
|
|
2369
|
-
contentType: a.mime_type ?? void 0
|
|
2370
|
-
}] : [];
|
|
2371
|
-
});
|
|
2372
|
-
const placeholderMediaType = rawMediaAttachments[0]?.contentType;
|
|
2373
|
-
const kind = kindFromMime(placeholderMediaType ?? void 0);
|
|
2374
|
-
const placeholder = kind ? `<media:${kind}>` : validAttachments.length ? "<media:attachment>" : "";
|
|
2375
|
-
const bodyText = messageText || placeholder;
|
|
2376
|
-
const storeAllowFrom = await readChannelAllowFromStore("imessage", process.env, accountInfo.accountId).catch(() => []);
|
|
2377
|
-
const decision = await resolveIMessageInboundDecision({
|
|
2378
|
-
cfg,
|
|
2379
|
-
accountId: accountInfo.accountId,
|
|
2380
|
-
message,
|
|
2381
|
-
opts,
|
|
2382
|
-
messageText,
|
|
2383
|
-
bodyText,
|
|
2384
|
-
allowFrom,
|
|
2385
|
-
groupAllowFrom,
|
|
2386
|
-
allowLegacyConversationAllowFromForGroup,
|
|
2387
|
-
groupPolicy,
|
|
2388
|
-
dmPolicy,
|
|
2389
|
-
storeAllowFrom,
|
|
2390
|
-
historyLimit,
|
|
2391
|
-
groupHistories,
|
|
2392
|
-
echoCache: sentMessageCache,
|
|
2393
|
-
selfChatCache,
|
|
2394
|
-
reactionNotifications: imessageCfg.reactionNotifications,
|
|
2395
|
-
logVerbose
|
|
2396
|
-
});
|
|
2397
|
-
const chatId = message.chat_id ?? void 0;
|
|
2398
|
-
const senderForKey = (message.sender ?? "").trim();
|
|
2399
|
-
const conversationKey = chatId != null ? `group:${chatId}` : `dm:${senderForKey}`;
|
|
2400
|
-
const rateLimitKey = `${accountInfo.accountId}:${conversationKey}`;
|
|
2401
|
-
if (decision.kind === "drop") {
|
|
2402
|
-
if (decision.reason === "echo" || decision.reason === "self-chat echo" || decision.reason === "reflected assistant content" || decision.reason === "from me") loopRateLimiter.record(rateLimitKey);
|
|
2403
|
-
if (decision.reason === "group id not in allowlist") warnGroupAllowlistDropPerChatOnce({
|
|
2404
|
-
accountId: accountInfo.accountId,
|
|
2405
|
-
chatId: message.chat_id ?? void 0,
|
|
2406
|
-
log: (msg) => runtime.log?.(warn(msg))
|
|
2407
|
-
});
|
|
2408
|
-
return;
|
|
2409
|
-
}
|
|
2410
|
-
if (decision.kind === "dispatch" && loopRateLimiter.isRateLimited(rateLimitKey)) {
|
|
2411
|
-
logVerbose(`imessage: rate-limited conversation ${conversationKey} (echo loop detected)`);
|
|
2412
|
-
return;
|
|
2413
|
-
}
|
|
2414
|
-
if (decision.kind === "pairing") {
|
|
2415
|
-
const sender = (message.sender ?? "").trim();
|
|
2416
|
-
if (!sender) return;
|
|
2417
|
-
await createChannelPairingChallengeIssuer({
|
|
2418
|
-
channel: "imessage",
|
|
2419
|
-
upsertPairingRequest: async ({ id, meta }) => await upsertChannelPairingRequest({
|
|
2420
|
-
channel: "imessage",
|
|
2421
|
-
id,
|
|
2422
|
-
accountId: accountInfo.accountId,
|
|
2423
|
-
meta
|
|
2424
|
-
})
|
|
2425
|
-
})({
|
|
2426
|
-
senderId: decision.senderId,
|
|
2427
|
-
senderIdLine: `Your iMessage sender id: ${decision.senderId}`,
|
|
2428
|
-
meta: {
|
|
2429
|
-
sender: decision.senderId,
|
|
2430
|
-
chatId: chatId ? String(chatId) : void 0
|
|
2431
|
-
},
|
|
2432
|
-
onCreated: () => {
|
|
2433
|
-
logVerbose(`imessage pairing request sender=${decision.senderId}`);
|
|
2434
|
-
},
|
|
2435
|
-
sendPairingReply: async (text) => {
|
|
2436
|
-
await sendMessageIMessage(sender, text, {
|
|
2437
|
-
config: cfg,
|
|
2438
|
-
client: getActiveClient(),
|
|
2439
|
-
maxBytes: mediaMaxBytes,
|
|
2440
|
-
accountId: accountInfo.accountId,
|
|
2441
|
-
...chatId ? { chatId } : {}
|
|
2442
|
-
});
|
|
2443
|
-
},
|
|
2444
|
-
onReplyError: (err) => {
|
|
2445
|
-
runtime.error?.(`imessage pairing reply failed for ${decision.senderId}: ${String(err)}`);
|
|
2446
|
-
}
|
|
2447
|
-
});
|
|
2448
|
-
return;
|
|
2449
|
-
}
|
|
2450
|
-
if (decision.kind === "reaction") {
|
|
2451
|
-
enqueueIMessageReactionSystemEvent({
|
|
2452
|
-
decision,
|
|
2453
|
-
runtime,
|
|
2454
|
-
logVerbose
|
|
2455
|
-
});
|
|
2456
|
-
return;
|
|
2457
|
-
}
|
|
2458
|
-
const storePath = resolveStorePath(cfg.session?.store, { agentId: decision.route.agentId });
|
|
2459
|
-
const stagedAttachments = remoteHost ? [] : await stageIMessageAttachments(validAttachments, {
|
|
2460
|
-
maxBytes: mediaMaxBytes,
|
|
2461
|
-
allowedRoots: effectiveAttachmentRoots,
|
|
2462
|
-
deps: { logVerbose }
|
|
2463
|
-
});
|
|
2464
|
-
const mediaAttachments = remoteHost ? rawMediaAttachments : stagedAttachments;
|
|
2465
|
-
const firstAttachment = mediaAttachments[0];
|
|
2466
|
-
const mediaPath = firstAttachment?.path ?? void 0;
|
|
2467
|
-
const mediaType = firstAttachment?.contentType ?? void 0;
|
|
2468
|
-
const mediaPaths = mediaAttachments.map((a) => a.path).filter(Boolean);
|
|
2469
|
-
const mediaTypes = mediaAttachments.map((a) => a.contentType ?? void 0);
|
|
2470
|
-
const { ctxPayload, chatTarget } = buildIMessageInboundContext({
|
|
2471
|
-
cfg,
|
|
2472
|
-
decision,
|
|
2473
|
-
message,
|
|
2474
|
-
previousTimestamp: readSessionUpdatedAt({
|
|
2475
|
-
storePath,
|
|
2476
|
-
sessionKey: decision.route.sessionKey
|
|
2477
|
-
}),
|
|
2478
|
-
remoteHost,
|
|
2479
|
-
historyLimit,
|
|
2480
|
-
groupHistories,
|
|
2481
|
-
media: {
|
|
2482
|
-
path: mediaPath,
|
|
2483
|
-
type: mediaType,
|
|
2484
|
-
paths: mediaPaths,
|
|
2485
|
-
types: mediaTypes
|
|
2486
|
-
}
|
|
2487
|
-
});
|
|
2488
|
-
const updateTarget = chatTarget || decision.sender;
|
|
2489
|
-
const pinnedMainDmOwner = resolvePinnedMainDmOwnerFromAllowlist({
|
|
2490
|
-
dmScope: cfg.session?.dmScope,
|
|
2491
|
-
allowFrom,
|
|
2492
|
-
normalizeEntry: normalizeIMessageHandle
|
|
2493
|
-
});
|
|
2494
|
-
if (shouldLogVerbose()) {
|
|
2495
|
-
const preview = truncateUtf16Safe(ctxPayload.Body ?? "", 200).replace(/\n/g, "\\n");
|
|
2496
|
-
logVerbose(`imessage inbound: chatId=${chatId ?? "unknown"} from=${ctxPayload.From} len=${(ctxPayload.Body ?? "").length} preview="${preview}"`);
|
|
2497
|
-
}
|
|
2498
|
-
const privateApiStatus = getCachedIMessagePrivateApiStatus(cliPath);
|
|
2499
|
-
const supportsTyping = imessageRpcSupportsMethod(privateApiStatus, "typing");
|
|
2500
|
-
const supportsRead = imessageRpcSupportsMethod(privateApiStatus, "read");
|
|
2501
|
-
if (privateApiStatus?.available === true) {
|
|
2502
|
-
if (!supportsTyping || !supportsRead) warnIfImsgUpgradeNeeded.fireOnce(privateApiStatus.rpcMethods, runtime);
|
|
2503
|
-
}
|
|
2504
|
-
const sendReadReceipts = imessageCfg.sendReadReceipts !== false;
|
|
2505
|
-
const typingTarget = ctxPayload.To;
|
|
2506
|
-
if (supportsRead && sendReadReceipts && typingTarget) try {
|
|
2507
|
-
await markIMessageChatRead(typingTarget, {
|
|
2508
|
-
cfg,
|
|
2509
|
-
accountId: accountInfo.accountId,
|
|
2510
|
-
client: getActiveClient()
|
|
2511
|
-
});
|
|
2512
|
-
} catch (err) {
|
|
2513
|
-
runtime.error?.(`imessage: mark read failed: ${String(err)}`);
|
|
2514
|
-
}
|
|
2515
|
-
const { onModelSelected, ...replyPipeline } = createChannelReplyPipeline({
|
|
2516
|
-
cfg,
|
|
2517
|
-
agentId: decision.route.agentId,
|
|
2518
|
-
channel: "imessage",
|
|
2519
|
-
accountId: decision.route.accountId,
|
|
2520
|
-
typing: supportsTyping && typingTarget ? {
|
|
2521
|
-
start: async () => {
|
|
2522
|
-
await sendIMessageTyping(typingTarget, true, {
|
|
2523
|
-
cfg,
|
|
2524
|
-
accountId: accountInfo.accountId,
|
|
2525
|
-
client: getActiveClient()
|
|
2526
|
-
});
|
|
2527
|
-
},
|
|
2528
|
-
stop: async () => {
|
|
2529
|
-
await sendIMessageTyping(typingTarget, false, {
|
|
2530
|
-
cfg,
|
|
2531
|
-
accountId: accountInfo.accountId,
|
|
2532
|
-
client: getActiveClient()
|
|
2533
|
-
});
|
|
2534
|
-
},
|
|
2535
|
-
onStartError: (err) => {
|
|
2536
|
-
logTypingFailure({
|
|
2537
|
-
log: (msg) => logVerbose(msg),
|
|
2538
|
-
channel: "imessage",
|
|
2539
|
-
action: "start",
|
|
2540
|
-
target: typingTarget,
|
|
2541
|
-
error: err
|
|
2542
|
-
});
|
|
2543
|
-
},
|
|
2544
|
-
onStopError: (err) => {
|
|
2545
|
-
logTypingFailure({
|
|
2546
|
-
log: (msg) => logVerbose(msg),
|
|
2547
|
-
channel: "imessage",
|
|
2548
|
-
action: "stop",
|
|
2549
|
-
target: typingTarget,
|
|
2550
|
-
error: err
|
|
2551
|
-
});
|
|
2552
|
-
}
|
|
2553
|
-
} : void 0
|
|
2554
|
-
});
|
|
2555
|
-
const { dispatcher, replyOptions: typingReplyOptions, markDispatchIdle } = createReplyDispatcherWithTyping({
|
|
2556
|
-
...replyPipeline,
|
|
2557
|
-
humanDelay: resolveHumanDelayConfig(cfg, decision.route.agentId),
|
|
2558
|
-
deliver: async (payload, info) => {
|
|
2559
|
-
const target = ctxPayload.To;
|
|
2560
|
-
if (!target) {
|
|
2561
|
-
runtime.error?.(danger("imessage: missing delivery target"));
|
|
2562
|
-
return;
|
|
2563
|
-
}
|
|
2564
|
-
const durable = await deliverInboundReplyWithMessageSendContext({
|
|
2565
|
-
cfg,
|
|
2566
|
-
channel: "imessage",
|
|
2567
|
-
accountId: accountInfo.accountId,
|
|
2568
|
-
agentId: decision.route.agentId,
|
|
2569
|
-
ctxPayload,
|
|
2570
|
-
payload,
|
|
2571
|
-
info,
|
|
2572
|
-
to: target,
|
|
2573
|
-
deps: { imessage: createIMessageEchoCachingSend({
|
|
2574
|
-
client: getActiveClient(),
|
|
2575
|
-
accountId: accountInfo.accountId,
|
|
2576
|
-
sentMessageCache
|
|
2577
|
-
}) }
|
|
2578
|
-
});
|
|
2579
|
-
if (durable.status === "failed") throw durable.error;
|
|
2580
|
-
if (durable.status === "handled_visible" || durable.status === "handled_no_send") return;
|
|
2581
|
-
await deliverReplies({
|
|
2582
|
-
cfg,
|
|
2583
|
-
replies: [payload],
|
|
2584
|
-
target,
|
|
2585
|
-
client: getActiveClient(),
|
|
2586
|
-
accountId: accountInfo.accountId,
|
|
2587
|
-
runtime,
|
|
2588
|
-
maxBytes: mediaMaxBytes,
|
|
2589
|
-
textLimit,
|
|
2590
|
-
sentMessageCache
|
|
2591
|
-
});
|
|
2592
|
-
},
|
|
2593
|
-
onError: (err, info) => {
|
|
2594
|
-
runtime.error?.(danger(`imessage ${info.kind} reply failed: ${String(err)}`));
|
|
2595
|
-
}
|
|
2596
|
-
});
|
|
2597
|
-
const inboundLastRouteSessionKey = resolveInboundLastRouteSessionKey({
|
|
2598
|
-
route: decision.route,
|
|
2599
|
-
sessionKey: decision.route.sessionKey
|
|
2600
|
-
});
|
|
2601
|
-
await runInboundReplyTurn({
|
|
2602
|
-
channel: "imessage",
|
|
2603
|
-
accountId: decision.route.accountId,
|
|
2604
|
-
raw: decision,
|
|
2605
|
-
adapter: {
|
|
2606
|
-
ingest: () => ({
|
|
2607
|
-
id: ctxPayload.MessageSid ?? `${ctxPayload.From}:${Date.now()}`,
|
|
2608
|
-
timestamp: typeof ctxPayload.Timestamp === "number" ? ctxPayload.Timestamp : void 0,
|
|
2609
|
-
rawText: ctxPayload.RawBody ?? "",
|
|
2610
|
-
textForAgent: ctxPayload.BodyForAgent,
|
|
2611
|
-
textForCommands: ctxPayload.CommandBody,
|
|
2612
|
-
raw: decision
|
|
2613
|
-
}),
|
|
2614
|
-
resolveTurn: () => ({
|
|
2615
|
-
channel: "imessage",
|
|
2616
|
-
accountId: decision.route.accountId,
|
|
2617
|
-
routeSessionKey: decision.route.sessionKey,
|
|
2618
|
-
storePath,
|
|
2619
|
-
ctxPayload,
|
|
2620
|
-
recordInboundSession,
|
|
2621
|
-
record: {
|
|
2622
|
-
updateLastRoute: !decision.isGroup && updateTarget ? {
|
|
2623
|
-
sessionKey: inboundLastRouteSessionKey,
|
|
2624
|
-
channel: "imessage",
|
|
2625
|
-
to: updateTarget,
|
|
2626
|
-
accountId: decision.route.accountId,
|
|
2627
|
-
mainDmOwnerPin: inboundLastRouteSessionKey === decision.route.mainSessionKey && pinnedMainDmOwner && decision.senderNormalized ? {
|
|
2628
|
-
ownerRecipient: pinnedMainDmOwner,
|
|
2629
|
-
senderRecipient: decision.senderNormalized,
|
|
2630
|
-
onSkip: ({ ownerRecipient, senderRecipient }) => {
|
|
2631
|
-
logVerbose(`imessage: skip main-session last route for ${senderRecipient} (pinned owner ${ownerRecipient})`);
|
|
2632
|
-
}
|
|
2633
|
-
} : void 0
|
|
2634
|
-
} : void 0,
|
|
2635
|
-
onRecordError: (err) => {
|
|
2636
|
-
logVerbose(`imessage: failed updating session meta: ${String(err)}`);
|
|
2637
|
-
}
|
|
2638
|
-
},
|
|
2639
|
-
history: {
|
|
2640
|
-
isGroup: decision.isGroup,
|
|
2641
|
-
historyKey: decision.historyKey,
|
|
2642
|
-
historyMap: groupHistories,
|
|
2643
|
-
limit: historyLimit
|
|
2644
|
-
},
|
|
2645
|
-
onPreDispatchFailure: () => settleReplyDispatcher({
|
|
2646
|
-
dispatcher,
|
|
2647
|
-
onSettled: () => markDispatchIdle()
|
|
2648
|
-
}),
|
|
2649
|
-
runDispatch: async () => {
|
|
2650
|
-
try {
|
|
2651
|
-
return await dispatchInboundMessage({
|
|
2652
|
-
ctx: ctxPayload,
|
|
2653
|
-
cfg,
|
|
2654
|
-
dispatcher,
|
|
2655
|
-
replyOptions: {
|
|
2656
|
-
...typingReplyOptions,
|
|
2657
|
-
disableBlockStreaming: typeof accountInfo.config.blockStreaming === "boolean" ? !accountInfo.config.blockStreaming : void 0,
|
|
2658
|
-
onModelSelected
|
|
2659
|
-
}
|
|
2660
|
-
});
|
|
2661
|
-
} finally {
|
|
2662
|
-
markDispatchIdle();
|
|
2663
|
-
}
|
|
2664
|
-
}
|
|
2665
|
-
})
|
|
2666
|
-
}
|
|
2667
|
-
});
|
|
2668
|
-
}
|
|
2669
|
-
const handleMessage = async (raw) => {
|
|
2670
|
-
const message = parseIMessageNotification(raw);
|
|
2671
|
-
if (!message) {
|
|
2672
|
-
const shape = raw && typeof raw === "object" && !Array.isArray(raw) ? Object.keys(raw).toSorted().join(",") : typeof raw;
|
|
2673
|
-
runtime.error?.(`imessage: dropping malformed RPC message payload (keys=${shape})`);
|
|
2674
|
-
return;
|
|
2675
|
-
}
|
|
2676
|
-
await inboundDebouncer.enqueue({ message });
|
|
2677
|
-
};
|
|
2678
|
-
await waitForTransportReady({
|
|
2679
|
-
label: "imsg rpc",
|
|
2680
|
-
timeoutMs: 3e4,
|
|
2681
|
-
logAfterMs: 1e4,
|
|
2682
|
-
logIntervalMs: 1e4,
|
|
2683
|
-
pollIntervalMs: 500,
|
|
2684
|
-
abortSignal: opts.abortSignal,
|
|
2685
|
-
runtime,
|
|
2686
|
-
check: async () => {
|
|
2687
|
-
const probe = await probeIMessage(probeTimeoutMs, {
|
|
2688
|
-
cliPath,
|
|
2689
|
-
dbPath,
|
|
2690
|
-
runtime
|
|
2691
|
-
});
|
|
2692
|
-
if (probe.ok) return { ok: true };
|
|
2693
|
-
if (probe.fatal) throw new Error(probe.error ?? "imsg rpc unavailable");
|
|
2694
|
-
return {
|
|
2695
|
-
ok: false,
|
|
2696
|
-
error: probe.error ?? "unreachable"
|
|
2697
|
-
};
|
|
2698
|
-
}
|
|
2699
|
-
});
|
|
2700
|
-
if (opts.abortSignal?.aborted) return;
|
|
2701
|
-
const abort = opts.abortSignal;
|
|
2702
|
-
const createWatchClient = async () => await createIMessageRpcClient({
|
|
2703
|
-
cliPath,
|
|
2704
|
-
dbPath,
|
|
2705
|
-
runtime,
|
|
2706
|
-
onNotification: (msg) => {
|
|
2707
|
-
if (msg.method === "message") handleMessage(msg.params).catch((err) => {
|
|
2708
|
-
runtime.error?.(`imessage: handler failed: ${String(err)}`);
|
|
2709
|
-
});
|
|
2710
|
-
else if (msg.method === "error") runtime.error?.(`imessage: watch error ${JSON.stringify(sanitizeIMessageWatchErrorPayload(msg.params))}`);
|
|
2711
|
-
}
|
|
2712
|
-
});
|
|
2713
|
-
const requireWatchClient = (watchClient) => {
|
|
2714
|
-
if (!watchClient) throw new Error("imessage monitor client not initialized");
|
|
2715
|
-
return watchClient;
|
|
2716
|
-
};
|
|
2717
|
-
for (let attempt = 1; attempt <= WATCH_SUBSCRIBE_MAX_ATTEMPTS; attempt++) {
|
|
2718
|
-
if (abort?.aborted) return;
|
|
2719
|
-
let attemptClient;
|
|
2720
|
-
let attemptDetachAbortHandler = () => {};
|
|
2721
|
-
let keepAttemptClient = false;
|
|
2722
|
-
try {
|
|
2723
|
-
attemptClient = requireWatchClient(await createWatchClient());
|
|
2724
|
-
let attemptSubscriptionId = null;
|
|
2725
|
-
attemptDetachAbortHandler = attachIMessageMonitorAbortHandler({
|
|
2726
|
-
abortSignal: abort,
|
|
2727
|
-
client: attemptClient,
|
|
2728
|
-
getSubscriptionId: () => attemptSubscriptionId
|
|
2729
|
-
});
|
|
2730
|
-
attemptSubscriptionId = (await attemptClient.request("watch.subscribe", {
|
|
2731
|
-
attachments: includeAttachments,
|
|
2732
|
-
include_reactions: true
|
|
2733
|
-
}, { timeoutMs: probeTimeoutMs }))?.subscription ?? null;
|
|
2734
|
-
client = attemptClient;
|
|
2735
|
-
detachAbortHandler = attemptDetachAbortHandler;
|
|
2736
|
-
keepAttemptClient = true;
|
|
2737
|
-
break;
|
|
2738
|
-
} catch (err) {
|
|
2739
|
-
if (abort?.aborted) return;
|
|
2740
|
-
if (!(attempt < WATCH_SUBSCRIBE_MAX_ATTEMPTS && isRetriableWatchSubscribeStartupError(err))) {
|
|
2741
|
-
runtime.error?.(danger(`imessage: monitor failed: ${String(err)}`));
|
|
2742
|
-
throw err;
|
|
2743
|
-
}
|
|
2744
|
-
runtime.log?.(warn(`imessage: watch.subscribe startup failed (attempt ${attempt}/${WATCH_SUBSCRIBE_MAX_ATTEMPTS}): ${String(err)}; retrying`));
|
|
2745
|
-
attemptDetachAbortHandler();
|
|
2746
|
-
attemptDetachAbortHandler = () => {};
|
|
2747
|
-
await attemptClient?.stop();
|
|
2748
|
-
attemptClient = void 0;
|
|
2749
|
-
await waitForWatchSubscribeRetryDelay({
|
|
2750
|
-
ms: WATCH_SUBSCRIBE_RETRY_DELAY_MS,
|
|
2751
|
-
abortSignal: abort
|
|
2752
|
-
});
|
|
2753
|
-
if (abort?.aborted) return;
|
|
2754
|
-
} finally {
|
|
2755
|
-
if (!keepAttemptClient) {
|
|
2756
|
-
attemptDetachAbortHandler();
|
|
2757
|
-
await attemptClient?.stop();
|
|
2758
|
-
}
|
|
2759
|
-
}
|
|
2760
|
-
}
|
|
2761
|
-
const activeClient = client;
|
|
2762
|
-
if (!activeClient) return;
|
|
2763
|
-
const catchupCfg = resolveCatchupConfig(imessageCfg.catchup);
|
|
2764
|
-
if (catchupCfg.enabled && !abort?.aborted) try {
|
|
2765
|
-
await runIMessageCatchup({
|
|
2766
|
-
client: activeClient,
|
|
2767
|
-
accountId: accountInfo.accountId,
|
|
2768
|
-
config: catchupCfg,
|
|
2769
|
-
includeAttachments,
|
|
2770
|
-
dispatchPayload: (message) => handleMessageNow(message),
|
|
2771
|
-
runtime
|
|
2772
|
-
});
|
|
2773
|
-
} catch (err) {
|
|
2774
|
-
runtime.error?.(`imessage catchup: pass failed: ${String(err)}`);
|
|
2775
|
-
}
|
|
2776
|
-
try {
|
|
2777
|
-
await activeClient.waitForClose();
|
|
2778
|
-
} catch (err) {
|
|
2779
|
-
if (abort?.aborted) return;
|
|
2780
|
-
runtime.error?.(danger(`imessage: monitor failed: ${String(err)}`));
|
|
2781
|
-
throw err;
|
|
2782
|
-
} finally {
|
|
2783
|
-
detachAbortHandler();
|
|
2784
|
-
await activeClient.stop();
|
|
2785
|
-
}
|
|
2786
|
-
}
|
|
2787
|
-
//#endregion
|
|
2788
|
-
export { sendMessageIMessage as n, monitorIMessageProvider as t };
|