@poolzin/pool-bot 2026.2.24 → 2026.2.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/CHANGELOG.md +21 -0
- package/dist/acp/client.js +207 -18
- package/dist/acp/event-mapper.js +87 -22
- package/dist/acp/meta.js +12 -6
- package/dist/acp/secret-file.js +22 -0
- package/dist/agents/agent-paths.js +8 -9
- package/dist/agents/agent-scope.js +17 -5
- package/dist/agents/auth-profiles/oauth.js +148 -64
- package/dist/agents/auth-profiles/session-override.js +13 -7
- package/dist/agents/bash-process-registry.test-helpers.js +29 -0
- package/dist/agents/bash-tools.exec-approval-request.js +20 -0
- package/dist/agents/bash-tools.exec-host-gateway.js +240 -0
- package/dist/agents/bash-tools.exec-host-node.js +235 -0
- package/dist/agents/bash-tools.exec-runtime.js +2 -25
- package/dist/agents/bash-tools.exec-types.js +1 -0
- package/dist/agents/bash-tools.process.js +224 -218
- package/dist/agents/bedrock-discovery.js +3 -1
- package/dist/agents/byteplus-models.js +97 -0
- package/dist/agents/chutes-oauth.js +1 -0
- package/dist/agents/cli-runner/helpers.js +4 -0
- package/dist/agents/compaction.js +41 -14
- package/dist/agents/content-blocks.js +16 -0
- package/dist/agents/doubao-models.js +121 -0
- package/dist/agents/failover-error.js +2 -0
- package/dist/agents/huggingface-models.js +5 -3
- package/dist/agents/live-model-filter.js +5 -0
- package/dist/agents/minimax-vlm.js +10 -8
- package/dist/agents/model-auth.js +6 -0
- package/dist/agents/model-catalog.js +3 -1
- package/dist/agents/model-fallback.js +96 -101
- package/dist/agents/model-selection.js +7 -1
- package/dist/agents/models-config.providers.js +364 -165
- package/dist/agents/ollama-stream.js +117 -4
- package/dist/agents/opencode-zen-models.js +22 -11
- package/dist/agents/pi-embedded-helpers/errors.js +55 -33
- package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
- package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
- package/dist/agents/pi-embedded-helpers.js +1 -1
- package/dist/agents/pi-embedded-payloads.js +1 -0
- package/dist/agents/pi-embedded-runner/compact.js +29 -7
- package/dist/agents/pi-embedded-runner/extensions.js +28 -26
- package/dist/agents/pi-embedded-runner/google.js +20 -8
- package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
- package/dist/agents/pi-embedded-runner/run.js +71 -12
- package/dist/agents/pi-embedded-runner/run.overflow-compaction.fixture.js +34 -0
- package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
- package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
- package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
- package/dist/agents/pi-embedded-runner/thinking.js +42 -0
- package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
- package/dist/agents/pi-embedded-runner/utils.js +7 -10
- package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
- package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
- package/dist/agents/pi-embedded-subscribe.js +9 -4
- package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
- package/dist/agents/pi-embedded-utils.js +3 -0
- package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
- package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
- package/dist/agents/pi-settings.js +40 -0
- package/dist/agents/pi-tools.policy.js +2 -1
- package/dist/agents/provider/config-loader.js +1 -1
- package/dist/agents/sandbox/browser.js +170 -33
- package/dist/agents/sandbox/config-hash.js +14 -27
- package/dist/agents/sandbox/config.js +21 -2
- package/dist/agents/sandbox/constants.js +2 -0
- package/dist/agents/sandbox/docker.js +16 -2
- package/dist/agents/sandbox/novnc-auth.js +62 -0
- package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
- package/dist/agents/sandbox/shared.js +10 -6
- package/dist/agents/sandbox-paths.js +24 -11
- package/dist/agents/schema/clean-for-gemini.js +132 -85
- package/dist/agents/session-slug.js +10 -5
- package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
- package/dist/agents/session-tool-result-guard.js +3 -1
- package/dist/agents/session-transcript-repair.js +40 -6
- package/dist/agents/skills/bundled-dir.js +19 -5
- package/dist/agents/skills/env-overrides.js +124 -43
- package/dist/agents/skills/frontmatter.js +6 -6
- package/dist/agents/skills/plugin-skills.js +14 -7
- package/dist/agents/skills/workspace.js +1 -0
- package/dist/agents/skills.test-helpers.js +13 -0
- package/dist/agents/stable-stringify.js +12 -0
- package/dist/agents/subagent-announce.js +251 -49
- package/dist/agents/subagent-lifecycle-events.js +19 -0
- package/dist/agents/subagent-registry-cleanup.js +31 -0
- package/dist/agents/subagent-registry-completion.js +68 -0
- package/dist/agents/subagent-registry-queries.js +117 -0
- package/dist/agents/subagent-registry-state.js +46 -0
- package/dist/agents/subagent-registry.js +252 -221
- package/dist/agents/subagent-registry.mocks.shared.js +12 -0
- package/dist/agents/subagent-registry.store.js +1 -0
- package/dist/agents/subagent-registry.types.js +1 -0
- package/dist/agents/subagent-spawn.js +195 -7
- package/dist/agents/system-prompt.js +22 -6
- package/dist/agents/test-helpers/assistant-message-fixtures.js +29 -0
- package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
- package/dist/agents/test-helpers/fast-core-tools.js +1 -17
- package/dist/agents/test-helpers/pi-tools-sandbox-context.js +27 -0
- package/dist/agents/timeout.js +18 -6
- package/dist/agents/tool-call-id.js +1 -1
- package/dist/agents/tool-display-common.js +162 -29
- package/dist/agents/tool-images.js +82 -9
- package/dist/agents/tool-policy-shared.js +108 -0
- package/dist/agents/tool-policy.js +51 -26
- package/dist/agents/tools/browser-tool.js +160 -54
- package/dist/agents/tools/canvas-tool.js +27 -1
- package/dist/agents/tools/common.js +45 -0
- package/dist/agents/tools/cron-tool.test-helpers.js +12 -0
- package/dist/agents/tools/discord-actions-guild.js +4 -1
- package/dist/agents/tools/discord-actions-moderation-shared.js +27 -0
- package/dist/agents/tools/gateway-tool.js +3 -1
- package/dist/agents/tools/image-tool.js +214 -99
- package/dist/agents/tools/nodes-utils.js +1 -10
- package/dist/agents/tools/sessions-history-tool.js +140 -108
- package/dist/agents/tools/sessions-send-helpers.js +12 -6
- package/dist/agents/tools/sessions-spawn-tool.js +8 -2
- package/dist/agents/tools/subagents-tool.js +2 -1
- package/dist/agents/tools/whatsapp-actions.js +10 -2
- package/dist/agents/tools/whatsapp-target-auth.js +18 -0
- package/dist/agents/transcript-policy.js +22 -8
- package/dist/agents/venice-models.js +11 -3
- package/dist/agents/workspace.js +222 -46
- package/dist/auto-reply/commands-registry.data.js +51 -0
- package/dist/auto-reply/commands-registry.js +19 -21
- package/dist/auto-reply/fallback-state.js +114 -0
- package/dist/auto-reply/group-activation.js +10 -5
- package/dist/auto-reply/inbound-debounce.js +10 -5
- package/dist/auto-reply/model-runtime.js +68 -0
- package/dist/auto-reply/reply/abort.js +1 -1
- package/dist/auto-reply/reply/agent-runner-execution.js +40 -5
- package/dist/auto-reply/reply/agent-runner.js +165 -39
- package/dist/auto-reply/reply/bash-command.js +41 -39
- package/dist/auto-reply/reply/command-gates.js +25 -0
- package/dist/auto-reply/reply/commands-allowlist.js +111 -72
- package/dist/auto-reply/reply/commands-bash.js +6 -5
- package/dist/auto-reply/reply/commands-config.js +30 -28
- package/dist/auto-reply/reply/commands-core.js +2 -1
- package/dist/auto-reply/reply/commands-info.js +1 -0
- package/dist/auto-reply/reply/commands-models.js +65 -14
- package/dist/auto-reply/reply/commands-session.js +237 -82
- package/dist/auto-reply/reply/commands-setunset-standard.js +13 -0
- package/dist/auto-reply/reply/commands-setunset.js +45 -0
- package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
- package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
- package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
- package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
- package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
- package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
- package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
- package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
- package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
- package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
- package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
- package/dist/auto-reply/reply/commands-subagents.js +51 -587
- package/dist/auto-reply/reply/commands-tts.js +10 -5
- package/dist/auto-reply/reply/config-value.js +10 -5
- package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
- package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
- package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
- package/dist/auto-reply/reply/followup-runner.js +1 -0
- package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
- package/dist/auto-reply/reply/get-reply-directives.js +17 -28
- package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
- package/dist/auto-reply/reply/get-reply.js +71 -12
- package/dist/auto-reply/reply/model-selection.js +80 -39
- package/dist/auto-reply/reply/queue/enqueue.js +10 -5
- package/dist/auto-reply/reply/queue/state.js +13 -12
- package/dist/auto-reply/reply/reply-payloads.js +67 -36
- package/dist/auto-reply/reply/reply-reference.js +9 -8
- package/dist/auto-reply/reply/route-reply.js +15 -8
- package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
- package/dist/auto-reply/reply/session.js +22 -6
- package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
- package/dist/auto-reply/reply/subagents-utils.js +56 -30
- package/dist/auto-reply/reply/typing.js +46 -21
- package/dist/auto-reply/send-policy.js +14 -7
- package/dist/auto-reply/status.js +140 -16
- package/dist/auto-reply/templating.js +10 -5
- package/dist/auto-reply/thinking.js +7 -16
- package/dist/auto-reply/tokens.js +21 -5
- package/dist/browser/bridge-server.js +36 -20
- package/dist/browser/cdp.helpers.js +7 -14
- package/dist/browser/cdp.js +35 -15
- package/dist/browser/chrome.profile-decoration.js +7 -4
- package/dist/browser/config.js +30 -0
- package/dist/browser/extension-relay-auth.js +55 -0
- package/dist/browser/extension-relay.js +74 -29
- package/dist/browser/navigation-guard.js +39 -0
- package/dist/browser/paths.js +77 -0
- package/dist/browser/profiles.js +13 -8
- package/dist/browser/pw-ai-module.js +10 -5
- package/dist/browser/pw-session.js +76 -39
- package/dist/browser/pw-tools-core.interactions.js +14 -7
- package/dist/browser/pw-tools-core.state.js +12 -6
- package/dist/browser/routes/agent.act.js +431 -424
- package/dist/browser/routes/agent.shared.js +47 -3
- package/dist/browser/routes/agent.snapshot.js +122 -116
- package/dist/browser/routes/agent.storage.js +303 -297
- package/dist/browser/routes/tabs.js +154 -100
- package/dist/browser/server-context.js +7 -0
- package/dist/browser/server-lifecycle.js +37 -0
- package/dist/build-info.json +3 -3
- package/dist/channels/allow-from.js +26 -0
- package/dist/channels/allowlists/resolve-utils.js +43 -19
- package/dist/channels/channel-config.js +14 -7
- package/dist/channels/draft-stream-loop.js +7 -0
- package/dist/channels/model-overrides.js +82 -0
- package/dist/channels/plugins/account-action-gate.js +13 -0
- package/dist/channels/plugins/message-actions.js +10 -0
- package/dist/channels/plugins/normalize/imessage.js +14 -7
- package/dist/channels/plugins/normalize/slack.js +10 -5
- package/dist/channels/plugins/normalize/telegram.js +14 -7
- package/dist/channels/plugins/outbound/discord.js +80 -8
- package/dist/channels/plugins/outbound/signal.js +11 -11
- package/dist/channels/plugins/setup-helpers.js +10 -5
- package/dist/channels/sender-label.js +14 -7
- package/dist/channels/session.js +4 -2
- package/dist/channels/status-reactions.js +297 -0
- package/dist/channels/telegram/api.js +18 -0
- package/dist/cli/argv.js +84 -21
- package/dist/cli/banner.js +3 -2
- package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
- package/dist/cli/cli-name.js +11 -11
- package/dist/cli/cli-utils.js +13 -3
- package/dist/cli/command-format.js +1 -1
- package/dist/cli/config-cli.js +1 -1
- package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
- package/dist/cli/daemon-cli/lifecycle.js +64 -2
- package/dist/cli/daemon-cli/restart-health.js +126 -0
- package/dist/cli/daemon-cli/status.gather.js +9 -13
- package/dist/cli/daemon-cli/status.print.js +2 -10
- package/dist/cli/deps.js +27 -22
- package/dist/cli/exec-approvals-cli.js +92 -124
- package/dist/cli/gateway-cli/run-loop.js +23 -5
- package/dist/cli/memory-cli.js +158 -61
- package/dist/cli/node-cli/register.js +14 -5
- package/dist/cli/nodes-cli/register.push.js +63 -0
- package/dist/cli/nodes-media-utils.js +26 -0
- package/dist/cli/outbound-send-deps.js +2 -9
- package/dist/cli/outbound-send-mapping.js +11 -0
- package/dist/cli/pairing-cli.js +40 -14
- package/dist/cli/plugins-cli.js +250 -73
- package/dist/cli/ports.js +11 -10
- package/dist/cli/program/build-program.js +3 -1
- package/dist/cli/program/command-registry.js +214 -136
- package/dist/cli/program/command-tree.js +16 -0
- package/dist/cli/program/help.js +43 -12
- package/dist/cli/program/preaction.js +13 -9
- package/dist/cli/program/register.configure.js +3 -18
- package/dist/cli/program/register.maintenance.js +2 -2
- package/dist/cli/program/register.onboard.js +2 -0
- package/dist/cli/program/register.status-health-sessions.js +16 -17
- package/dist/cli/program/register.subclis.js +93 -52
- package/dist/cli/route.js +12 -8
- package/dist/cli/system-cli.js +36 -46
- package/dist/cli/test-runtime-capture.js +24 -0
- package/dist/cli/update-cli/shared.js +22 -9
- package/dist/cli/update-cli/update-command.js +89 -14
- package/dist/cli/update-cli/wizard.js +6 -12
- package/dist/commands/agent/run-context.js +18 -5
- package/dist/commands/agent/session-store.js +17 -4
- package/dist/commands/agent.js +185 -89
- package/dist/commands/agents.bindings.js +14 -7
- package/dist/commands/agents.commands.add.js +13 -9
- package/dist/commands/agents.commands.identity.js +12 -6
- package/dist/commands/agents.commands.list.js +11 -6
- package/dist/commands/agents.config.js +8 -10
- package/dist/commands/agents.providers.js +12 -6
- package/dist/commands/auth-choice-options.js +103 -75
- package/dist/commands/auth-choice.apply.byteplus.js +55 -0
- package/dist/commands/auth-choice.apply.js +4 -0
- package/dist/commands/auth-choice.apply.minimax.js +61 -13
- package/dist/commands/auth-choice.apply.openai.js +3 -1
- package/dist/commands/auth-choice.apply.volcengine.js +55 -0
- package/dist/commands/auth-choice.preferred-provider.js +2 -0
- package/dist/commands/channels/remove.js +13 -6
- package/dist/commands/channels/shared.js +4 -14
- package/dist/commands/channels.mock-harness.js +23 -0
- package/dist/commands/configure.commands.js +14 -0
- package/dist/commands/configure.gateway.js +2 -4
- package/dist/commands/configure.js +1 -1
- package/dist/commands/configure.shared.js +11 -0
- package/dist/commands/daemon-install-helpers.js +2 -2
- package/dist/commands/daemon-install-runtime-warning.js +11 -0
- package/dist/commands/dashboard.js +12 -10
- package/dist/commands/docs.js +14 -8
- package/dist/commands/doctor-config-flow.js +11 -9
- package/dist/commands/doctor-legacy-config.js +281 -0
- package/dist/commands/doctor-state-integrity.js +99 -23
- package/dist/commands/doctor-update.js +12 -9
- package/dist/commands/models/list.list-command.js +7 -5
- package/dist/commands/models/set-image.js +2 -21
- package/dist/commands/node-daemon-install-helpers.js +10 -8
- package/dist/commands/onboard-auth.config-minimax.js +54 -80
- package/dist/commands/onboard-auth.config-opencode.js +2 -18
- package/dist/commands/onboard-auth.credentials.js +90 -13
- package/dist/commands/onboard-auth.js +1 -1
- package/dist/commands/onboard-auth.models.js +6 -5
- package/dist/commands/onboard-hooks.js +1 -1
- package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
- package/dist/commands/onboard-provider-auth-flags.js +14 -0
- package/dist/commands/onboard-remote.js +14 -7
- package/dist/commands/onboard.js +11 -13
- package/dist/commands/sandbox-display.js +6 -5
- package/dist/commands/sessions.test-helpers.js +61 -0
- package/dist/commands/status-all/diagnosis.js +14 -10
- package/dist/commands/status-all/format.js +1 -0
- package/dist/commands/status.gateway-probe.js +1 -16
- package/dist/commands/systemd-linger.js +12 -6
- package/dist/config/agent-limits.js +2 -0
- package/dist/config/commands.js +32 -15
- package/dist/config/config-paths.js +9 -11
- package/dist/config/config.js +1 -1
- package/dist/config/defaults.js +22 -2
- package/dist/config/discord-preview-streaming.js +104 -0
- package/dist/config/env-substitution.js +62 -34
- package/dist/config/env-vars.js +45 -7
- package/dist/config/includes.js +4 -0
- package/dist/config/io.js +656 -171
- package/dist/config/legacy.migrations.part-1.js +189 -78
- package/dist/config/legacy.shared.js +3 -1
- package/dist/config/merge-patch.js +54 -4
- package/dist/config/prototype-keys.js +4 -0
- package/dist/config/redact-snapshot.js +404 -76
- package/dist/config/schema.help.js +44 -7
- package/dist/config/schema.js +58 -570
- package/dist/config/schema.labels.js +38 -6
- package/dist/config/sessions/delivery-info.js +10 -3
- package/dist/config/sessions/main-session.js +10 -5
- package/dist/config/sessions/session-file.js +33 -0
- package/dist/config/sessions/session-key.js +10 -5
- package/dist/config/sessions/store.js +1 -1
- package/dist/config/sessions.js +1 -0
- package/dist/config/validation.js +140 -85
- package/dist/config/zod-schema.agent-runtime.js +11 -0
- package/dist/config/zod-schema.hooks.js +40 -11
- package/dist/config/zod-schema.installs.js +20 -0
- package/dist/config/zod-schema.js +156 -20
- package/dist/config/zod-schema.providers-core.js +78 -4
- package/dist/config/zod-schema.providers.js +6 -1
- package/dist/config/zod-schema.session.js +41 -2
- package/dist/cron/run-log.js +3 -0
- package/dist/cron/schedule.js +21 -10
- package/dist/cron/service/ops.js +35 -21
- package/dist/cron/service/timer.js +116 -16
- package/dist/cron/stagger.js +3 -1
- package/dist/daemon/cmd-argv.js +21 -0
- package/dist/daemon/cmd-set.js +58 -0
- package/dist/daemon/service-types.js +1 -0
- package/dist/discord/api.js +12 -6
- package/dist/discord/draft-chunking.js +22 -0
- package/dist/discord/draft-stream.js +124 -0
- package/dist/discord/monitor/agent-components.js +1 -1
- package/dist/discord/monitor/commands.js +5 -0
- package/dist/discord/monitor/exec-approvals.js +357 -162
- package/dist/discord/monitor/gateway-plugin.js +2 -1
- package/dist/discord/monitor/listeners.js +37 -27
- package/dist/discord/monitor/message-handler.js +4 -1
- package/dist/discord/monitor/message-handler.preflight.js +65 -8
- package/dist/discord/monitor/message-handler.process.js +246 -217
- package/dist/discord/monitor/message-utils.js +143 -6
- package/dist/discord/monitor/model-picker-preferences.js +143 -0
- package/dist/discord/monitor/model-picker.js +651 -0
- package/dist/discord/monitor/native-command.js +573 -16
- package/dist/discord/monitor/provider.allowlist.js +223 -0
- package/dist/discord/monitor/provider.js +275 -347
- package/dist/discord/monitor/provider.lifecycle.js +100 -0
- package/dist/discord/monitor/reply-delivery.js +123 -16
- package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
- package/dist/discord/monitor/thread-bindings.js +4 -0
- package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
- package/dist/discord/monitor/thread-bindings.manager.js +423 -0
- package/dist/discord/monitor/thread-bindings.messages.js +55 -0
- package/dist/discord/monitor/thread-bindings.state.js +358 -0
- package/dist/discord/monitor/thread-bindings.types.js +6 -0
- package/dist/discord/resolve-users.js +33 -21
- package/dist/discord/send.channels.js +15 -0
- package/dist/discord/send.js +3 -2
- package/dist/discord/send.outbound.js +82 -26
- package/dist/discord/send.permissions.js +83 -30
- package/dist/discord/send.reactions.js +8 -4
- package/dist/discord/token.js +10 -5
- package/dist/discord/voice/command.js +263 -0
- package/dist/discord/voice/manager.js +531 -0
- package/dist/gateway/auth.js +72 -13
- package/dist/gateway/call.js +152 -83
- package/dist/gateway/canvas-capability.js +75 -0
- package/dist/gateway/client.js +28 -4
- package/dist/gateway/config-reload.js +3 -4
- package/dist/gateway/control-plane-audit.js +28 -0
- package/dist/gateway/control-plane-rate-limit.js +53 -0
- package/dist/gateway/control-ui.js +219 -96
- package/dist/gateway/events.js +1 -0
- package/dist/gateway/hooks-mapping.js +88 -38
- package/dist/gateway/hooks.js +109 -54
- package/dist/gateway/http-auth-helpers.js +3 -2
- package/dist/gateway/http-common.js +22 -0
- package/dist/gateway/http-endpoint-helpers.js +1 -0
- package/dist/gateway/method-scopes.js +169 -0
- package/dist/gateway/net.js +74 -9
- package/dist/gateway/node-invoke-system-run-approval.js +14 -35
- package/dist/gateway/node-registry.js +10 -5
- package/dist/gateway/openai-http.js +1 -0
- package/dist/gateway/openresponses-http.js +121 -110
- package/dist/gateway/origin-check.js +1 -18
- package/dist/gateway/probe-auth.js +2 -0
- package/dist/gateway/protocol/index.js +4 -2
- package/dist/gateway/protocol/schema/cron.js +1 -0
- package/dist/gateway/protocol/schema/devices.js +1 -0
- package/dist/gateway/protocol/schema/protocol-schemas.js +4 -1
- package/dist/gateway/protocol/schema/push.js +18 -0
- package/dist/gateway/protocol/schema/sessions.js +6 -0
- package/dist/gateway/protocol/schema.js +1 -0
- package/dist/gateway/role-policy.js +17 -0
- package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
- package/dist/gateway/server/ws-connection/message-handler.js +175 -148
- package/dist/gateway/server-chat.js +83 -25
- package/dist/gateway/server-constants.js +10 -9
- package/dist/gateway/server-cron.js +1 -0
- package/dist/gateway/server-http.js +247 -54
- package/dist/gateway/server-maintenance.js +20 -5
- package/dist/gateway/server-methods/agent.js +162 -24
- package/dist/gateway/server-methods/chat.js +465 -130
- package/dist/gateway/server-methods/config.js +193 -152
- package/dist/gateway/server-methods/devices.js +17 -3
- package/dist/gateway/server-methods/models.js +11 -1
- package/dist/gateway/server-methods/nodes.helpers.js +12 -0
- package/dist/gateway/server-methods/nodes.js +251 -69
- package/dist/gateway/server-methods/push.js +53 -0
- package/dist/gateway/server-methods/sessions.js +64 -8
- package/dist/gateway/server-methods/usage.js +162 -75
- package/dist/gateway/server-node-events.js +29 -0
- package/dist/gateway/server-reload-handlers.js +2 -3
- package/dist/gateway/server-runtime-config.js +39 -13
- package/dist/gateway/server-runtime-state.js +2 -0
- package/dist/gateway/server-startup-memory.js +17 -11
- package/dist/gateway/server-ws-runtime.js +1 -0
- package/dist/gateway/server.impl.js +296 -139
- package/dist/gateway/session-preview.test-helpers.js +11 -0
- package/dist/gateway/session-utils.fs.js +32 -34
- package/dist/gateway/sessions-resolve.js +17 -5
- package/dist/gateway/startup-auth.js +126 -0
- package/dist/gateway/test-helpers.agent-results.js +15 -0
- package/dist/gateway/test-helpers.mocks.js +37 -14
- package/dist/gateway/test-helpers.openai-mock.js +14 -7
- package/dist/gateway/test-helpers.server.js +161 -77
- package/dist/gateway/tools-invoke-http.js +21 -10
- package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
- package/dist/hooks/bundled/command-logger/handler.js +7 -2
- package/dist/hooks/bundled/session-memory/handler.js +170 -38
- package/dist/hooks/frontmatter.js +6 -6
- package/dist/hooks/gmail-watcher-lifecycle.js +23 -0
- package/dist/hooks/gmail-watcher.js +11 -6
- package/dist/hooks/internal-hooks.js +11 -1
- package/dist/hooks/llm-slug-generator.js +4 -1
- package/dist/hooks/workspace.js +47 -17
- package/dist/imessage/accounts.js +9 -20
- package/dist/imessage/monitor/inbound-processing.js +2 -1
- package/dist/infra/archive-path.js +49 -0
- package/dist/infra/archive.js +174 -73
- package/dist/infra/control-ui-assets.js +14 -6
- package/dist/infra/device-pairing.js +204 -144
- package/dist/infra/env.js +10 -5
- package/dist/infra/exec-approvals-allowlist.js +141 -70
- package/dist/infra/exec-approvals-analysis.js +78 -20
- package/dist/infra/exec-approvals.js +5 -17
- package/dist/infra/exec-safe-bin-policy.js +277 -0
- package/dist/infra/fixed-window-rate-limit.js +33 -0
- package/dist/infra/fs-safe.js +71 -39
- package/dist/infra/gateway-lock.js +6 -2
- package/dist/infra/git-root.js +61 -0
- package/dist/infra/heartbeat-active-hours.js +2 -2
- package/dist/infra/heartbeat-reason.js +40 -0
- package/dist/infra/heartbeat-runner.js +72 -32
- package/dist/infra/heartbeat-wake.js +6 -12
- package/dist/infra/host-env-security-policy.json +19 -0
- package/dist/infra/host-env-security.js +66 -0
- package/dist/infra/install-source-utils.js +91 -7
- package/dist/infra/net/ssrf.js +131 -38
- package/dist/infra/node-pairing.js +50 -105
- package/dist/infra/npm-integrity.js +45 -0
- package/dist/infra/npm-pack-install.js +40 -0
- package/dist/infra/outbound/bound-delivery-router.js +88 -0
- package/dist/infra/outbound/channel-adapters.js +20 -7
- package/dist/infra/outbound/channel-selection.js +12 -6
- package/dist/infra/outbound/envelope.js +1 -1
- package/dist/infra/outbound/format.js +12 -6
- package/dist/infra/outbound/message-action-runner.js +107 -327
- package/dist/infra/outbound/message.js +59 -36
- package/dist/infra/outbound/outbound-policy.js +52 -25
- package/dist/infra/outbound/outbound-send-service.js +58 -71
- package/dist/infra/outbound/payloads.js +14 -7
- package/dist/infra/outbound/session-binding-service.js +123 -0
- package/dist/infra/pairing-files.js +10 -0
- package/dist/infra/path-guards.js +25 -0
- package/dist/infra/plain-object.js +9 -0
- package/dist/infra/provider-usage.fetch.codex.js +7 -15
- package/dist/infra/provider-usage.fetch.gemini.js +14 -11
- package/dist/infra/provider-usage.fetch.shared.js +30 -1
- package/dist/infra/provider-usage.fetch.zai.js +10 -9
- package/dist/infra/push-apns.js +365 -0
- package/dist/infra/restart-sentinel.js +16 -1
- package/dist/infra/restart.js +229 -26
- package/dist/infra/retry-policy.js +4 -2
- package/dist/infra/retry.js +9 -5
- package/dist/infra/scp-host.js +54 -0
- package/dist/infra/session-cost-usage.js +107 -59
- package/dist/infra/session-maintenance-warning.js +3 -1
- package/dist/infra/shell-env.js +98 -34
- package/dist/infra/ssh-config.js +12 -6
- package/dist/infra/system-run-command.js +49 -4
- package/dist/infra/update-channels.js +10 -5
- package/dist/infra/update-startup.js +86 -9
- package/dist/line/accounts.js +5 -7
- package/dist/line/bot-access.js +8 -20
- package/dist/line/bot-handlers.js +3 -1
- package/dist/link-understanding/detect.js +15 -7
- package/dist/media/constants.js +15 -6
- package/dist/media/image-ops.js +7 -0
- package/dist/media/inbound-path-policy.js +114 -0
- package/dist/media/input-files.js +16 -0
- package/dist/media/local-roots.js +3 -2
- package/dist/media-understanding/apply.js +4 -1
- package/dist/media-understanding/concurrency.js +8 -20
- package/dist/memory/backend-config.js +45 -6
- package/dist/memory/embeddings.js +10 -4
- package/dist/memory/fs-utils.js +23 -0
- package/dist/memory/manager-search.js +12 -6
- package/dist/memory/manager-sync-ops.js +12 -2
- package/dist/memory/qmd-manager.js +466 -53
- package/dist/memory/query-expansion.js +167 -3
- package/dist/memory/status-format.js +10 -5
- package/dist/memory/sync-memory-files.js +1 -1
- package/dist/memory/test-manager.js +8 -0
- package/dist/node-host/invoke-system-run.js +281 -0
- package/dist/node-host/invoke.js +55 -337
- package/dist/pairing/pairing-store.js +22 -0
- package/dist/plugin-sdk/allow-from.js +1 -1
- package/dist/plugin-sdk/command-auth.js +3 -1
- package/dist/plugin-sdk/index.js +6 -3
- package/dist/plugin-sdk/temp-path.js +47 -0
- package/dist/plugin-sdk/webhook-targets.js +32 -0
- package/dist/plugins/bundled-dir.js +9 -6
- package/dist/plugins/discovery.js +217 -23
- package/dist/plugins/hook-runner-global.js +16 -0
- package/dist/plugins/hooks.js +50 -0
- package/dist/plugins/install.js +28 -16
- package/dist/plugins/loader.js +192 -26
- package/dist/plugins/logger.js +8 -0
- package/dist/plugins/manifest-registry.js +3 -0
- package/dist/plugins/path-safety.js +34 -0
- package/dist/plugins/registry.js +5 -2
- package/dist/plugins/runtime/index.js +271 -206
- package/dist/plugins/runtime.js +3 -17
- package/dist/plugins/update.js +78 -12
- package/dist/process/spawn-utils.js +14 -7
- package/dist/providers/github-copilot-models.js +4 -1
- package/dist/providers/github-copilot-token.js +11 -6
- package/dist/providers/qwen-portal-oauth.js +14 -6
- package/dist/routing/account-id.js +30 -0
- package/dist/routing/resolve-route.js +3 -7
- package/dist/routing/session-key.js +2 -16
- package/dist/security/audit-channel.js +100 -20
- package/dist/security/audit-extra.async.js +505 -179
- package/dist/security/audit-extra.js +12 -2
- package/dist/security/audit-extra.sync.js +421 -35
- package/dist/security/audit-fs.js +31 -13
- package/dist/security/audit.js +180 -370
- package/dist/security/dm-policy-shared.js +68 -0
- package/dist/security/external-content.js +46 -14
- package/dist/security/fix.js +49 -85
- package/dist/security/scan-paths.js +20 -0
- package/dist/security/secret-equal.js +3 -7
- package/dist/security/windows-acl.js +30 -15
- package/dist/shared/entry-status.js +6 -0
- package/dist/shared/frontmatter.js +5 -5
- package/dist/shared/node-list-parse.js +13 -0
- package/dist/shared/node-match.js +11 -4
- package/dist/shared/operator-scope-compat.js +42 -0
- package/dist/shared/text-chunking.js +29 -0
- package/dist/signal/accounts.js +7 -20
- package/dist/signal/monitor/event-handler.js +3 -1
- package/dist/slack/accounts.js +6 -19
- package/dist/slack/actions.js +11 -3
- package/dist/slack/blocks.test-helpers.js +31 -0
- package/dist/slack/monitor/auth.js +1 -1
- package/dist/slack/monitor/message-handler/dispatch.js +50 -29
- package/dist/slack/monitor/mrkdwn.js +8 -0
- package/dist/slack/monitor/replies.js +15 -7
- package/dist/slack/monitor/slash.js +22 -13
- package/dist/slack/resolve-channels.js +10 -5
- package/dist/slack/send.js +102 -12
- package/dist/slack/stream-mode.js +10 -0
- package/dist/slack/streaming.js +4 -2
- package/dist/telegram/accounts.js +19 -14
- package/dist/telegram/bot/helpers.js +3 -5
- package/dist/telegram/bot-access.js +35 -36
- package/dist/telegram/bot-handlers.js +120 -148
- package/dist/telegram/bot-message-context.js +68 -9
- package/dist/telegram/bot-message-dispatch.js +477 -210
- package/dist/telegram/bot-native-commands.js +16 -0
- package/dist/telegram/draft-stream.js +44 -8
- package/dist/telegram/inline-buttons.js +5 -15
- package/dist/telegram/monitor.js +11 -7
- package/dist/telegram/network-config.js +19 -7
- package/dist/telegram/reasoning-lane-coordinator.js +128 -0
- package/dist/telegram/send.js +3 -2
- package/dist/telegram/sent-message-cache.js +5 -6
- package/dist/telegram/status-reaction-variants.js +208 -0
- package/dist/telegram/sticker-cache.js +11 -9
- package/dist/terminal/prompt-select-styled.js +9 -0
- package/dist/terminal/theme.js +12 -12
- package/dist/test-utils/command-runner.js +6 -0
- package/dist/test-utils/internal-hook-event-payload.js +10 -0
- package/dist/test-utils/model-auth-mock.js +12 -0
- package/dist/test-utils/provider-usage-fetch.js +14 -0
- package/dist/test-utils/temp-home.js +33 -0
- package/dist/tts/tts.js +80 -567
- package/dist/tui/components/chat-log.js +50 -8
- package/dist/tui/theme/theme.js +10 -12
- package/dist/tui/tui-command-handlers.js +36 -27
- package/dist/tui/tui-event-handlers.js +122 -32
- package/dist/tui/tui-local-shell.js +16 -6
- package/dist/tui/tui.js +236 -48
- package/dist/utils/account-id.js +2 -4
- package/dist/utils/boolean.js +10 -5
- package/dist/utils/directive-tags.js +11 -0
- package/dist/utils/mask-api-key.js +10 -0
- package/dist/utils/queue-helpers.js +67 -12
- package/dist/utils/run-with-concurrency.js +39 -0
- package/dist/web/auto-reply/deliver-reply.js +8 -4
- package/dist/web/auto-reply/mentions.js +10 -5
- package/dist/web/auto-reply/monitor/group-members.js +14 -7
- package/dist/web/auto-reply/monitor/process-message.js +45 -24
- package/dist/web/inbound/access-control.js +5 -2
- package/dist/web/login-qr.js +12 -6
- package/dist/web/media.js +126 -15
- package/docs/tools/slash-commands.md +5 -1
- package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
- package/extensions/bluebubbles/src/monitor.ts +208 -1950
- package/extensions/feishu/src/external-keys.ts +19 -0
- package/extensions/lobster/src/windows-spawn.ts +193 -0
- package/extensions/matrix/src/matrix/actions/limits.ts +6 -0
- package/extensions/mattermost/src/mattermost/reactions.test-helpers.ts +83 -0
- package/package.json +1 -1
package/dist/cli/memory-cli.js
CHANGED
|
@@ -4,17 +4,18 @@ import os from "node:os";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { resolveDefaultAgentId } from "../agents/agent-scope.js";
|
|
6
6
|
import { loadConfig } from "../config/config.js";
|
|
7
|
+
import { resolveStateDir } from "../config/paths.js";
|
|
7
8
|
import { resolveSessionTranscriptsDirForAgent } from "../config/sessions/paths.js";
|
|
8
9
|
import { setVerbose } from "../globals.js";
|
|
9
|
-
import { withProgress, withProgressTotals } from "./progress.js";
|
|
10
|
-
import { formatErrorMessage, withManager } from "./cli-utils.js";
|
|
11
10
|
import { getMemorySearchManager } from "../memory/index.js";
|
|
12
|
-
import { listMemoryFiles } from "../memory/internal.js";
|
|
11
|
+
import { listMemoryFiles, normalizeExtraMemoryPaths } from "../memory/internal.js";
|
|
13
12
|
import { defaultRuntime } from "../runtime.js";
|
|
14
13
|
import { formatDocsLink } from "../terminal/links.js";
|
|
15
14
|
import { colorize, isRich, theme } from "../terminal/theme.js";
|
|
16
|
-
import { resolveStateDir } from "../config/paths.js";
|
|
17
15
|
import { shortenHomeInString, shortenHomePath } from "../utils.js";
|
|
16
|
+
import { formatErrorMessage, withManager } from "./cli-utils.js";
|
|
17
|
+
import { formatHelpExamples } from "./help-format.js";
|
|
18
|
+
import { withProgress, withProgressTotals } from "./progress.js";
|
|
18
19
|
function formatSourceLabel(source, workspaceDir, agentId) {
|
|
19
20
|
if (source === "memory") {
|
|
20
21
|
return shortenHomeInString(`memory (MEMORY.md + ${path.join(workspaceDir, "memory")}${path.sep}*.md)`);
|
|
@@ -27,20 +28,39 @@ function formatSourceLabel(source, workspaceDir, agentId) {
|
|
|
27
28
|
}
|
|
28
29
|
function resolveAgent(cfg, agent) {
|
|
29
30
|
const trimmed = agent?.trim();
|
|
30
|
-
if (trimmed)
|
|
31
|
+
if (trimmed) {
|
|
31
32
|
return trimmed;
|
|
33
|
+
}
|
|
32
34
|
return resolveDefaultAgentId(cfg);
|
|
33
35
|
}
|
|
34
36
|
function resolveAgentIds(cfg, agent) {
|
|
35
37
|
const trimmed = agent?.trim();
|
|
36
|
-
if (trimmed)
|
|
38
|
+
if (trimmed) {
|
|
37
39
|
return [trimmed];
|
|
40
|
+
}
|
|
38
41
|
const list = cfg.agents?.list ?? [];
|
|
39
42
|
if (list.length > 0) {
|
|
40
43
|
return list.map((entry) => entry.id).filter(Boolean);
|
|
41
44
|
}
|
|
42
45
|
return [resolveDefaultAgentId(cfg)];
|
|
43
46
|
}
|
|
47
|
+
function formatExtraPaths(workspaceDir, extraPaths) {
|
|
48
|
+
return normalizeExtraMemoryPaths(workspaceDir, extraPaths).map((entry) => shortenHomePath(entry));
|
|
49
|
+
}
|
|
50
|
+
async function withMemoryManagerForAgent(params) {
|
|
51
|
+
await withManager({
|
|
52
|
+
getManager: () => getMemorySearchManager({
|
|
53
|
+
cfg: params.cfg,
|
|
54
|
+
agentId: params.agentId,
|
|
55
|
+
}),
|
|
56
|
+
onMissing: (error) => defaultRuntime.log(error ?? "Memory search disabled."),
|
|
57
|
+
onCloseError: (err) => defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),
|
|
58
|
+
close: async (manager) => {
|
|
59
|
+
await manager.close?.();
|
|
60
|
+
},
|
|
61
|
+
run: params.run,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
44
64
|
async function checkReadableFile(pathname) {
|
|
45
65
|
try {
|
|
46
66
|
await fs.access(pathname, fsSync.constants.R_OK);
|
|
@@ -48,8 +68,9 @@ async function checkReadableFile(pathname) {
|
|
|
48
68
|
}
|
|
49
69
|
catch (err) {
|
|
50
70
|
const code = err.code;
|
|
51
|
-
if (code === "ENOENT")
|
|
71
|
+
if (code === "ENOENT") {
|
|
52
72
|
return { exists: false };
|
|
73
|
+
}
|
|
53
74
|
return {
|
|
54
75
|
exists: true,
|
|
55
76
|
issue: `${shortenHomePath(pathname)} not readable (${code ?? "error"})`,
|
|
@@ -74,17 +95,41 @@ async function scanSessionFiles(agentId) {
|
|
|
74
95
|
return { source: "sessions", totalFiles: null, issues };
|
|
75
96
|
}
|
|
76
97
|
}
|
|
77
|
-
async function scanMemoryFiles(workspaceDir) {
|
|
98
|
+
async function scanMemoryFiles(workspaceDir, extraPaths = []) {
|
|
78
99
|
const issues = [];
|
|
79
100
|
const memoryFile = path.join(workspaceDir, "MEMORY.md");
|
|
80
101
|
const altMemoryFile = path.join(workspaceDir, "memory.md");
|
|
81
102
|
const memoryDir = path.join(workspaceDir, "memory");
|
|
82
103
|
const primary = await checkReadableFile(memoryFile);
|
|
83
104
|
const alt = await checkReadableFile(altMemoryFile);
|
|
84
|
-
if (primary.issue)
|
|
105
|
+
if (primary.issue) {
|
|
85
106
|
issues.push(primary.issue);
|
|
86
|
-
|
|
107
|
+
}
|
|
108
|
+
if (alt.issue) {
|
|
87
109
|
issues.push(alt.issue);
|
|
110
|
+
}
|
|
111
|
+
const resolvedExtraPaths = normalizeExtraMemoryPaths(workspaceDir, extraPaths);
|
|
112
|
+
for (const extraPath of resolvedExtraPaths) {
|
|
113
|
+
try {
|
|
114
|
+
const stat = await fs.lstat(extraPath);
|
|
115
|
+
if (stat.isSymbolicLink()) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const extraCheck = await checkReadableFile(extraPath);
|
|
119
|
+
if (extraCheck.issue) {
|
|
120
|
+
issues.push(extraCheck.issue);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
const code = err.code;
|
|
125
|
+
if (code === "ENOENT") {
|
|
126
|
+
issues.push(`additional memory path missing (${shortenHomePath(extraPath)})`);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
issues.push(`additional memory path not accessible (${shortenHomePath(extraPath)}): ${code ?? "error"}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
88
133
|
let dirReadable = null;
|
|
89
134
|
try {
|
|
90
135
|
await fs.access(memoryDir, fsSync.constants.R_OK);
|
|
@@ -104,7 +149,7 @@ async function scanMemoryFiles(workspaceDir) {
|
|
|
104
149
|
let listed = [];
|
|
105
150
|
let listedOk = false;
|
|
106
151
|
try {
|
|
107
|
-
listed = await listMemoryFiles(workspaceDir);
|
|
152
|
+
listed = await listMemoryFiles(workspaceDir, resolvedExtraPaths);
|
|
108
153
|
listedOk = true;
|
|
109
154
|
}
|
|
110
155
|
catch (err) {
|
|
@@ -121,10 +166,12 @@ async function scanMemoryFiles(workspaceDir) {
|
|
|
121
166
|
else {
|
|
122
167
|
const files = new Set(listedOk ? listed : []);
|
|
123
168
|
if (!listedOk) {
|
|
124
|
-
if (primary.exists)
|
|
169
|
+
if (primary.exists) {
|
|
125
170
|
files.add(memoryFile);
|
|
126
|
-
|
|
171
|
+
}
|
|
172
|
+
if (alt.exists) {
|
|
127
173
|
files.add(altMemoryFile);
|
|
174
|
+
}
|
|
128
175
|
}
|
|
129
176
|
totalFiles = files.size;
|
|
130
177
|
}
|
|
@@ -133,11 +180,37 @@ async function scanMemoryFiles(workspaceDir) {
|
|
|
133
180
|
}
|
|
134
181
|
return { source: "memory", totalFiles, issues };
|
|
135
182
|
}
|
|
183
|
+
async function summarizeQmdIndexArtifact(manager) {
|
|
184
|
+
const status = manager.status?.();
|
|
185
|
+
if (!status || status.backend !== "qmd") {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
const dbPath = status.dbPath?.trim();
|
|
189
|
+
if (!dbPath) {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
let stat;
|
|
193
|
+
try {
|
|
194
|
+
stat = await fs.stat(dbPath);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
const code = err.code;
|
|
198
|
+
if (code === "ENOENT") {
|
|
199
|
+
throw new Error(`QMD index file not found: ${shortenHomePath(dbPath)}`, { cause: err });
|
|
200
|
+
}
|
|
201
|
+
throw new Error(`QMD index file check failed: ${shortenHomePath(dbPath)} (${code ?? "error"})`, { cause: err });
|
|
202
|
+
}
|
|
203
|
+
if (!stat.isFile() || stat.size <= 0) {
|
|
204
|
+
throw new Error(`QMD index file is empty: ${shortenHomePath(dbPath)}`);
|
|
205
|
+
}
|
|
206
|
+
return `QMD index: ${shortenHomePath(dbPath)} (${stat.size} bytes)`;
|
|
207
|
+
}
|
|
136
208
|
async function scanMemorySources(params) {
|
|
137
209
|
const scans = [];
|
|
210
|
+
const extraPaths = params.extraPaths ?? [];
|
|
138
211
|
for (const source of params.sources) {
|
|
139
212
|
if (source === "memory") {
|
|
140
|
-
scans.push(await scanMemoryFiles(params.workspaceDir));
|
|
213
|
+
scans.push(await scanMemoryFiles(params.workspaceDir, extraPaths));
|
|
141
214
|
}
|
|
142
215
|
if (source === "sessions") {
|
|
143
216
|
scans.push(await scanSessionFiles(params.agentId));
|
|
@@ -157,43 +230,42 @@ export async function runMemoryStatus(opts) {
|
|
|
157
230
|
const agentIds = resolveAgentIds(cfg, opts.agent);
|
|
158
231
|
const allResults = [];
|
|
159
232
|
for (const agentId of agentIds) {
|
|
160
|
-
await
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
onCloseError: (err) => defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),
|
|
164
|
-
close: async (manager) => {
|
|
165
|
-
await manager.close?.();
|
|
166
|
-
},
|
|
233
|
+
await withMemoryManagerForAgent({
|
|
234
|
+
cfg,
|
|
235
|
+
agentId,
|
|
167
236
|
run: async (manager) => {
|
|
168
237
|
const deep = Boolean(opts.deep || opts.index);
|
|
169
238
|
let embeddingProbe;
|
|
170
239
|
let indexError;
|
|
240
|
+
const syncFn = manager.sync ? manager.sync.bind(manager) : undefined;
|
|
171
241
|
if (deep) {
|
|
172
|
-
await withProgress({ label: "Checking memory
|
|
173
|
-
progress.setLabel("Probing vector
|
|
242
|
+
await withProgress({ label: "Checking memory\u2026", total: 2 }, async (progress) => {
|
|
243
|
+
progress.setLabel("Probing vector\u2026");
|
|
174
244
|
await manager.probeVectorAvailability();
|
|
175
245
|
progress.tick();
|
|
176
|
-
progress.setLabel("Probing embeddings
|
|
246
|
+
progress.setLabel("Probing embeddings\u2026");
|
|
177
247
|
embeddingProbe = await manager.probeEmbeddingAvailability();
|
|
178
248
|
progress.tick();
|
|
179
249
|
});
|
|
180
|
-
if (opts.index) {
|
|
250
|
+
if (opts.index && syncFn) {
|
|
181
251
|
await withProgressTotals({
|
|
182
|
-
label: "Indexing memory
|
|
252
|
+
label: "Indexing memory\u2026",
|
|
183
253
|
total: 0,
|
|
184
254
|
fallback: opts.verbose ? "line" : undefined,
|
|
185
255
|
}, async (update, progress) => {
|
|
186
256
|
try {
|
|
187
|
-
await
|
|
257
|
+
await syncFn({
|
|
188
258
|
reason: "cli",
|
|
259
|
+
force: Boolean(opts.force),
|
|
189
260
|
progress: (syncUpdate) => {
|
|
190
261
|
update({
|
|
191
262
|
completed: syncUpdate.completed,
|
|
192
263
|
total: syncUpdate.total,
|
|
193
264
|
label: syncUpdate.label,
|
|
194
265
|
});
|
|
195
|
-
if (syncUpdate.label)
|
|
266
|
+
if (syncUpdate.label) {
|
|
196
267
|
progress.setLabel(syncUpdate.label);
|
|
268
|
+
}
|
|
197
269
|
},
|
|
198
270
|
});
|
|
199
271
|
}
|
|
@@ -204,6 +276,9 @@ export async function runMemoryStatus(opts) {
|
|
|
204
276
|
}
|
|
205
277
|
});
|
|
206
278
|
}
|
|
279
|
+
else if (opts.index && !syncFn) {
|
|
280
|
+
defaultRuntime.log("Memory backend does not support manual reindex.");
|
|
281
|
+
}
|
|
207
282
|
}
|
|
208
283
|
else {
|
|
209
284
|
await manager.probeVectorAvailability();
|
|
@@ -216,6 +291,7 @@ export async function runMemoryStatus(opts) {
|
|
|
216
291
|
workspaceDir,
|
|
217
292
|
agentId,
|
|
218
293
|
sources,
|
|
294
|
+
extraPaths: status.extraPaths,
|
|
219
295
|
})
|
|
220
296
|
: undefined;
|
|
221
297
|
allResults.push({ agentId, status, embeddingProbe, indexError, scan });
|
|
@@ -240,8 +316,8 @@ export async function runMemoryStatus(opts) {
|
|
|
240
316
|
const chunksIndexed = status.chunks ?? 0;
|
|
241
317
|
const totalFiles = scan?.totalFiles ?? null;
|
|
242
318
|
const indexedLabel = totalFiles === null
|
|
243
|
-
? `${filesIndexed}/? files
|
|
244
|
-
: `${filesIndexed}/${totalFiles} files
|
|
319
|
+
? `${filesIndexed}/? files \u00b7 ${chunksIndexed} chunks`
|
|
320
|
+
: `${filesIndexed}/${totalFiles} files \u00b7 ${chunksIndexed} chunks`;
|
|
245
321
|
if (opts.index) {
|
|
246
322
|
const line = indexError ? `Memory index failed: ${indexError}` : "Memory index complete.";
|
|
247
323
|
defaultRuntime.log(line);
|
|
@@ -251,11 +327,15 @@ export async function runMemoryStatus(opts) {
|
|
|
251
327
|
const storePath = status.dbPath ? shortenHomePath(status.dbPath) : "<unknown>";
|
|
252
328
|
const workspacePath = status.workspaceDir ? shortenHomePath(status.workspaceDir) : "<unknown>";
|
|
253
329
|
const sourceList = status.sources?.length ? status.sources.join(", ") : null;
|
|
330
|
+
const extraPaths = status.workspaceDir
|
|
331
|
+
? formatExtraPaths(status.workspaceDir, status.extraPaths ?? [])
|
|
332
|
+
: [];
|
|
254
333
|
const lines = [
|
|
255
334
|
`${heading("Memory Search")} ${muted(`(${agentId})`)}`,
|
|
256
335
|
`${label("Provider")} ${info(status.provider)} ${muted(`(requested: ${requestedProvider})`)}`,
|
|
257
336
|
`${label("Model")} ${info(modelLabel)}`,
|
|
258
337
|
sourceList ? `${label("Sources")} ${info(sourceList)}` : null,
|
|
338
|
+
extraPaths.length ? `${label("Extra paths")} ${info(extraPaths.join(", "))}` : null,
|
|
259
339
|
`${label("Indexed")} ${success(indexedLabel)}`,
|
|
260
340
|
`${label("Dirty")} ${status.dirty ? warn("yes") : muted("no")}`,
|
|
261
341
|
`${label("Store")} ${info(storePath)}`,
|
|
@@ -272,11 +352,11 @@ export async function runMemoryStatus(opts) {
|
|
|
272
352
|
if (status.sourceCounts?.length) {
|
|
273
353
|
lines.push(label("By source"));
|
|
274
354
|
for (const entry of status.sourceCounts) {
|
|
275
|
-
const total = scan?.sources
|
|
355
|
+
const total = scan?.sources?.find((scanEntry) => scanEntry.source === entry.source)?.totalFiles;
|
|
276
356
|
const counts = total === null
|
|
277
|
-
? `${entry.files}/? files
|
|
278
|
-
: `${entry.files}/${total} files
|
|
279
|
-
lines.push(` ${accent(entry.source)} ${muted("
|
|
357
|
+
? `${entry.files}/? files \u00b7 ${entry.chunks} chunks`
|
|
358
|
+
: `${entry.files}/${total} files \u00b7 ${entry.chunks} chunks`;
|
|
359
|
+
lines.push(` ${accent(entry.source)} ${muted("\u00b7")} ${muted(counts)}`);
|
|
280
360
|
}
|
|
281
361
|
}
|
|
282
362
|
if (status.fallback) {
|
|
@@ -361,8 +441,13 @@ export async function runMemoryStatus(opts) {
|
|
|
361
441
|
export function registerMemoryCli(program) {
|
|
362
442
|
const memory = program
|
|
363
443
|
.command("memory")
|
|
364
|
-
.description("
|
|
365
|
-
.addHelpText("after", () => `\n${theme.
|
|
444
|
+
.description("Search, inspect, and reindex memory files")
|
|
445
|
+
.addHelpText("after", () => `\n${theme.heading("Examples:")}\n${formatHelpExamples([
|
|
446
|
+
["poolbot memory status", "Show index and provider status."],
|
|
447
|
+
["poolbot memory index --force", "Force a full reindex."],
|
|
448
|
+
['poolbot memory search --query "deployment notes"', "Search indexed memory entries."],
|
|
449
|
+
["poolbot memory status --json", "Output machine-readable JSON."],
|
|
450
|
+
])}\n\n${theme.muted("Docs:")} ${formatDocsLink("/cli/memory", "docs.molt.bot/cli/memory")}\n`);
|
|
366
451
|
memory
|
|
367
452
|
.command("status")
|
|
368
453
|
.description("Show memory search index status")
|
|
@@ -385,15 +470,12 @@ export function registerMemoryCli(program) {
|
|
|
385
470
|
const cfg = loadConfig();
|
|
386
471
|
const agentIds = resolveAgentIds(cfg, opts.agent);
|
|
387
472
|
for (const agentId of agentIds) {
|
|
388
|
-
await
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
onCloseError: (err) => defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),
|
|
392
|
-
close: async (manager) => {
|
|
393
|
-
await manager.close?.();
|
|
394
|
-
},
|
|
473
|
+
await withMemoryManagerForAgent({
|
|
474
|
+
cfg,
|
|
475
|
+
agentId,
|
|
395
476
|
run: async (manager) => {
|
|
396
477
|
try {
|
|
478
|
+
const syncFn = manager.sync ? manager.sync.bind(manager) : undefined;
|
|
397
479
|
if (opts.verbose) {
|
|
398
480
|
const status = manager.status();
|
|
399
481
|
const rich = isRich();
|
|
@@ -403,13 +485,21 @@ export function registerMemoryCli(program) {
|
|
|
403
485
|
const warn = (text) => colorize(rich, theme.warn, text);
|
|
404
486
|
const label = (text) => muted(`${text}:`);
|
|
405
487
|
const sourceLabels = (status.sources ?? []).map((source) => formatSourceLabel(source, status.workspaceDir ?? "", agentId));
|
|
488
|
+
const extraPaths = status.workspaceDir
|
|
489
|
+
? formatExtraPaths(status.workspaceDir, status.extraPaths ?? [])
|
|
490
|
+
: [];
|
|
491
|
+
const requestedProvider = status.requestedProvider ?? status.provider;
|
|
492
|
+
const modelLabel = status.model ?? status.provider;
|
|
406
493
|
const lines = [
|
|
407
494
|
`${heading("Memory Index")} ${muted(`(${agentId})`)}`,
|
|
408
|
-
`${label("Provider")} ${info(status.provider)} ${muted(`(requested: ${
|
|
409
|
-
`${label("Model")} ${info(
|
|
495
|
+
`${label("Provider")} ${info(status.provider)} ${muted(`(requested: ${requestedProvider})`)}`,
|
|
496
|
+
`${label("Model")} ${info(modelLabel)}`,
|
|
410
497
|
sourceLabels.length
|
|
411
498
|
? `${label("Sources")} ${info(sourceLabels.join(", "))}`
|
|
412
499
|
: null,
|
|
500
|
+
extraPaths.length
|
|
501
|
+
? `${label("Extra paths")} ${info(extraPaths.join(", "))}`
|
|
502
|
+
: null,
|
|
413
503
|
].filter(Boolean);
|
|
414
504
|
if (status.fallback) {
|
|
415
505
|
lines.push(`${label("Fallback")} ${warn(status.fallback.from)}`);
|
|
@@ -418,7 +508,7 @@ export function registerMemoryCli(program) {
|
|
|
418
508
|
defaultRuntime.log("");
|
|
419
509
|
}
|
|
420
510
|
const startedAt = Date.now();
|
|
421
|
-
let lastLabel = "Indexing memory
|
|
511
|
+
let lastLabel = "Indexing memory\u2026";
|
|
422
512
|
let lastCompleted = 0;
|
|
423
513
|
let lastTotal = 0;
|
|
424
514
|
const formatElapsed = () => {
|
|
@@ -429,12 +519,14 @@ export function registerMemoryCli(program) {
|
|
|
429
519
|
return `${minutes}:${String(remainingSeconds).padStart(2, "0")}`;
|
|
430
520
|
};
|
|
431
521
|
const formatEta = () => {
|
|
432
|
-
if (lastTotal <= 0 || lastCompleted <= 0)
|
|
522
|
+
if (lastTotal <= 0 || lastCompleted <= 0) {
|
|
433
523
|
return null;
|
|
524
|
+
}
|
|
434
525
|
const elapsedMs = Math.max(1, Date.now() - startedAt);
|
|
435
526
|
const rate = lastCompleted / elapsedMs;
|
|
436
|
-
if (!Number.isFinite(rate) || rate <= 0)
|
|
527
|
+
if (!Number.isFinite(rate) || rate <= 0) {
|
|
437
528
|
return null;
|
|
529
|
+
}
|
|
438
530
|
const remainingMs = Math.max(0, (lastTotal - lastCompleted) / rate);
|
|
439
531
|
const seconds = Math.floor(remainingMs / 1000);
|
|
440
532
|
const minutes = Math.floor(seconds / 60);
|
|
@@ -445,11 +537,15 @@ export function registerMemoryCli(program) {
|
|
|
445
537
|
const elapsed = formatElapsed();
|
|
446
538
|
const eta = formatEta();
|
|
447
539
|
return eta
|
|
448
|
-
? `${lastLabel}
|
|
449
|
-
: `${lastLabel}
|
|
540
|
+
? `${lastLabel} \u00b7 elapsed ${elapsed} \u00b7 eta ${eta}`
|
|
541
|
+
: `${lastLabel} \u00b7 elapsed ${elapsed}`;
|
|
450
542
|
};
|
|
543
|
+
if (!syncFn) {
|
|
544
|
+
defaultRuntime.log("Memory backend does not support manual reindex.");
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
451
547
|
await withProgressTotals({
|
|
452
|
-
label: "Indexing memory
|
|
548
|
+
label: "Indexing memory\u2026",
|
|
453
549
|
total: 0,
|
|
454
550
|
fallback: opts.verbose ? "line" : undefined,
|
|
455
551
|
}, async (update, progress) => {
|
|
@@ -457,12 +553,13 @@ export function registerMemoryCli(program) {
|
|
|
457
553
|
progress.setLabel(buildLabel());
|
|
458
554
|
}, 1000);
|
|
459
555
|
try {
|
|
460
|
-
await
|
|
556
|
+
await syncFn({
|
|
461
557
|
reason: "cli",
|
|
462
|
-
force: opts.force,
|
|
558
|
+
force: Boolean(opts.force),
|
|
463
559
|
progress: (syncUpdate) => {
|
|
464
|
-
if (syncUpdate.label)
|
|
560
|
+
if (syncUpdate.label) {
|
|
465
561
|
lastLabel = syncUpdate.label;
|
|
562
|
+
}
|
|
466
563
|
lastCompleted = syncUpdate.completed;
|
|
467
564
|
lastTotal = syncUpdate.total;
|
|
468
565
|
update({
|
|
@@ -478,6 +575,10 @@ export function registerMemoryCli(program) {
|
|
|
478
575
|
clearInterval(interval);
|
|
479
576
|
}
|
|
480
577
|
});
|
|
578
|
+
const qmdIndexSummary = await summarizeQmdIndexArtifact(manager);
|
|
579
|
+
if (qmdIndexSummary) {
|
|
580
|
+
defaultRuntime.log(qmdIndexSummary);
|
|
581
|
+
}
|
|
481
582
|
defaultRuntime.log(`Memory index updated (${agentId}).`);
|
|
482
583
|
}
|
|
483
584
|
catch (err) {
|
|
@@ -500,13 +601,9 @@ export function registerMemoryCli(program) {
|
|
|
500
601
|
.action(async (query, opts) => {
|
|
501
602
|
const cfg = loadConfig();
|
|
502
603
|
const agentId = resolveAgent(cfg, opts.agent);
|
|
503
|
-
await
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
onCloseError: (err) => defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),
|
|
507
|
-
close: async (manager) => {
|
|
508
|
-
await manager.close?.();
|
|
509
|
-
},
|
|
604
|
+
await withMemoryManagerForAgent({
|
|
605
|
+
cfg,
|
|
606
|
+
agentId,
|
|
510
607
|
run: async (manager) => {
|
|
511
608
|
let results;
|
|
512
609
|
try {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { formatDocsLink } from "../../terminal/links.js";
|
|
2
|
-
import { theme } from "../../terminal/theme.js";
|
|
3
1
|
import { loadNodeHostConfig } from "../../node-host/config.js";
|
|
4
2
|
import { runNodeHost } from "../../node-host/runner.js";
|
|
5
|
-
import {
|
|
3
|
+
import { formatDocsLink } from "../../terminal/links.js";
|
|
4
|
+
import { theme } from "../../terminal/theme.js";
|
|
6
5
|
import { parsePort } from "../daemon-cli/shared.js";
|
|
6
|
+
import { formatHelpExamples } from "../help-format.js";
|
|
7
|
+
import { runNodeDaemonInstall, runNodeDaemonRestart, runNodeDaemonStatus, runNodeDaemonStop, runNodeDaemonUninstall, } from "./daemon.js";
|
|
7
8
|
function parsePortWithFallback(value, fallback) {
|
|
8
9
|
const parsed = parsePort(value);
|
|
9
10
|
return parsed ?? fallback;
|
|
@@ -11,8 +12,16 @@ function parsePortWithFallback(value, fallback) {
|
|
|
11
12
|
export function registerNodeCli(program) {
|
|
12
13
|
const node = program
|
|
13
14
|
.command("node")
|
|
14
|
-
.description("Run
|
|
15
|
-
.addHelpText("after", () => `\n${theme.
|
|
15
|
+
.description("Run and manage the headless node host service")
|
|
16
|
+
.addHelpText("after", () => `\n${theme.heading("Examples:")}\n${formatHelpExamples([
|
|
17
|
+
[
|
|
18
|
+
"poolbot node run --host 127.0.0.1 --port 18789",
|
|
19
|
+
"Run the node host in the foreground.",
|
|
20
|
+
],
|
|
21
|
+
["poolbot node status", "Check node host service status."],
|
|
22
|
+
["poolbot node install", "Install the node host service."],
|
|
23
|
+
["poolbot node restart", "Restart the installed node host service."],
|
|
24
|
+
])}\n\n${theme.muted("Docs:")} ${formatDocsLink("/cli/node", "docs.molt.bot/cli/node")}\n`);
|
|
16
25
|
node
|
|
17
26
|
.command("run")
|
|
18
27
|
.description("Run the headless node host (foreground)")
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { defaultRuntime } from "../../runtime.js";
|
|
2
|
+
import { getNodesTheme, runNodesCommand } from "./cli-utils.js";
|
|
3
|
+
import { callGatewayCli, nodesCallOpts, resolveNodeId } from "./rpc.js";
|
|
4
|
+
function normalizeEnvironment(value) {
|
|
5
|
+
if (typeof value !== "string") {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const normalized = value.trim().toLowerCase();
|
|
9
|
+
if (normalized === "sandbox" || normalized === "production") {
|
|
10
|
+
return normalized;
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
export function registerNodesPushCommand(nodes) {
|
|
15
|
+
nodesCallOpts(nodes
|
|
16
|
+
.command("push")
|
|
17
|
+
.description("Send an APNs test push to an iOS node")
|
|
18
|
+
.requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP")
|
|
19
|
+
.option("--title <text>", "Push title", "Pool Bot")
|
|
20
|
+
.option("--body <text>", "Push body")
|
|
21
|
+
.option("--environment <sandbox|production>", "Override APNs environment")
|
|
22
|
+
.action(async (opts) => {
|
|
23
|
+
await runNodesCommand("push", async () => {
|
|
24
|
+
const nodeId = await resolveNodeId(opts, String(opts.node ?? ""));
|
|
25
|
+
const title = String(opts.title ?? "").trim() || "Pool Bot";
|
|
26
|
+
const body = String(opts.body ?? "").trim() || `Push test for node ${nodeId}`;
|
|
27
|
+
const environment = normalizeEnvironment(opts.environment);
|
|
28
|
+
if (opts.environment && !environment) {
|
|
29
|
+
throw new Error("invalid --environment (use sandbox|production)");
|
|
30
|
+
}
|
|
31
|
+
const params = {
|
|
32
|
+
nodeId,
|
|
33
|
+
title,
|
|
34
|
+
body,
|
|
35
|
+
};
|
|
36
|
+
if (environment) {
|
|
37
|
+
params.environment = environment;
|
|
38
|
+
}
|
|
39
|
+
const result = await callGatewayCli("push.test", opts, params);
|
|
40
|
+
if (opts.json) {
|
|
41
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const parsed = typeof result === "object" && result !== null
|
|
45
|
+
? result
|
|
46
|
+
: {};
|
|
47
|
+
const ok = parsed.ok === true;
|
|
48
|
+
const status = typeof parsed.status === "number" ? parsed.status : 0;
|
|
49
|
+
const reason = typeof parsed.reason === "string" && parsed.reason.trim().length > 0
|
|
50
|
+
? parsed.reason.trim()
|
|
51
|
+
: undefined;
|
|
52
|
+
const env = typeof parsed.environment === "string" && parsed.environment.trim().length > 0
|
|
53
|
+
? parsed.environment.trim()
|
|
54
|
+
: "unknown";
|
|
55
|
+
const { ok: okLabel, error: errorLabel } = getNodesTheme();
|
|
56
|
+
const label = ok ? okLabel : errorLabel;
|
|
57
|
+
defaultRuntime.log(label(`push.test status=${status} ok=${ok} env=${env}`));
|
|
58
|
+
if (reason) {
|
|
59
|
+
defaultRuntime.log(`reason: ${reason}`);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}), { timeoutMs: 25_000 });
|
|
63
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { resolvePreferredPoolbotTmpDir } from "../infra/tmp-poolbot-dir.js";
|
|
4
|
+
export function asRecord(value) {
|
|
5
|
+
return typeof value === "object" && value !== null ? value : {};
|
|
6
|
+
}
|
|
7
|
+
export function asString(value) {
|
|
8
|
+
return typeof value === "string" ? value : undefined;
|
|
9
|
+
}
|
|
10
|
+
export function asNumber(value) {
|
|
11
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
12
|
+
}
|
|
13
|
+
export function asBoolean(value) {
|
|
14
|
+
return typeof value === "boolean" ? value : undefined;
|
|
15
|
+
}
|
|
16
|
+
export function resolveTempPathParts(opts) {
|
|
17
|
+
const tmpDir = opts.tmpDir ?? resolvePreferredPoolbotTmpDir();
|
|
18
|
+
if (!opts.tmpDir) {
|
|
19
|
+
fs.mkdirSync(tmpDir, { recursive: true, mode: 0o700 });
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
tmpDir,
|
|
23
|
+
id: opts.id ?? randomUUID(),
|
|
24
|
+
ext: opts.ext.startsWith(".") ? opts.ext : `.${opts.ext}`,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { createOutboundSendDepsFromCliSource, } from "./outbound-send-mapping.js";
|
|
2
2
|
export function createOutboundSendDeps(deps) {
|
|
3
|
-
return
|
|
4
|
-
sendWhatsApp: deps.sendMessageWhatsApp,
|
|
5
|
-
sendTelegram: deps.sendMessageTelegram,
|
|
6
|
-
sendDiscord: deps.sendMessageDiscord,
|
|
7
|
-
sendSlack: deps.sendMessageSlack,
|
|
8
|
-
sendSignal: deps.sendMessageSignal,
|
|
9
|
-
sendIMessage: deps.sendMessageIMessage,
|
|
10
|
-
};
|
|
3
|
+
return createOutboundSendDepsFromCliSource(deps);
|
|
11
4
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Provider docking: extend this mapping when adding new outbound send deps.
|
|
2
|
+
export function createOutboundSendDepsFromCliSource(deps) {
|
|
3
|
+
return {
|
|
4
|
+
sendWhatsApp: deps.sendMessageWhatsApp,
|
|
5
|
+
sendTelegram: deps.sendMessageTelegram,
|
|
6
|
+
sendDiscord: deps.sendMessageDiscord,
|
|
7
|
+
sendSlack: deps.sendMessageSlack,
|
|
8
|
+
sendSignal: deps.sendMessageSignal,
|
|
9
|
+
sendIMessage: deps.sendMessageIMessage,
|
|
10
|
+
};
|
|
11
|
+
}
|