@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
|
@@ -9,10 +9,12 @@ export function createLocalShellRunner(deps) {
|
|
|
9
9
|
const env = deps.env ?? process.env;
|
|
10
10
|
const maxChars = deps.maxOutputChars ?? 40_000;
|
|
11
11
|
const ensureLocalExecAllowed = async () => {
|
|
12
|
-
if (localExecAllowed)
|
|
12
|
+
if (localExecAllowed) {
|
|
13
13
|
return true;
|
|
14
|
-
|
|
14
|
+
}
|
|
15
|
+
if (localExecAsked) {
|
|
15
16
|
return false;
|
|
17
|
+
}
|
|
16
18
|
localExecAsked = true;
|
|
17
19
|
return await new Promise((resolve) => {
|
|
18
20
|
deps.chatLog.addSystem("Allow local shell commands for this session?");
|
|
@@ -49,20 +51,28 @@ export function createLocalShellRunner(deps) {
|
|
|
49
51
|
const cmd = line.slice(1);
|
|
50
52
|
// NOTE: A lone '!' is handled by the submit handler as a normal message.
|
|
51
53
|
// Keep this guard anyway in case this is called directly.
|
|
52
|
-
if (cmd === "")
|
|
54
|
+
if (cmd === "") {
|
|
53
55
|
return;
|
|
56
|
+
}
|
|
54
57
|
if (localExecAsked && !localExecAllowed) {
|
|
55
58
|
deps.chatLog.addSystem("local shell: not enabled for this session");
|
|
56
59
|
deps.tui.requestRender();
|
|
57
60
|
return;
|
|
58
61
|
}
|
|
59
62
|
const allowed = await ensureLocalExecAllowed();
|
|
60
|
-
if (!allowed)
|
|
63
|
+
if (!allowed) {
|
|
61
64
|
return;
|
|
65
|
+
}
|
|
62
66
|
deps.chatLog.addSystem(`[local] $ ${cmd}`);
|
|
63
67
|
deps.tui.requestRender();
|
|
68
|
+
const appendWithCap = (text, chunk) => {
|
|
69
|
+
const combined = text + chunk;
|
|
70
|
+
return combined.length > maxChars ? combined.slice(-maxChars) : combined;
|
|
71
|
+
};
|
|
64
72
|
await new Promise((resolve) => {
|
|
65
73
|
const child = spawnCommand(cmd, {
|
|
74
|
+
// Intentionally a shell: this is an operator-only local TUI feature (prefixed with `!`)
|
|
75
|
+
// and is gated behind an explicit in-session approval prompt.
|
|
66
76
|
shell: true,
|
|
67
77
|
cwd: getCwd(),
|
|
68
78
|
env,
|
|
@@ -70,10 +80,10 @@ export function createLocalShellRunner(deps) {
|
|
|
70
80
|
let stdout = "";
|
|
71
81
|
let stderr = "";
|
|
72
82
|
child.stdout.on("data", (buf) => {
|
|
73
|
-
stdout
|
|
83
|
+
stdout = appendWithCap(stdout, buf.toString("utf8"));
|
|
74
84
|
});
|
|
75
85
|
child.stderr.on("data", (buf) => {
|
|
76
|
-
stderr
|
|
86
|
+
stderr = appendWithCap(stderr, buf.toString("utf8"));
|
|
77
87
|
});
|
|
78
88
|
child.on("close", (code, signal) => {
|
|
79
89
|
const combined = (stdout + (stderr ? (stdout ? "\n" : "") + stderr : ""))
|
package/dist/tui/tui.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CombinedAutocompleteProvider, Container, Loader, ProcessTerminal, Text, TUI,
|
|
1
|
+
import { CombinedAutocompleteProvider, Container, Key, Loader, matchesKey, ProcessTerminal, Text, TUI, } from "@mariozechner/pi-tui";
|
|
2
2
|
import { resolveDefaultAgentId } from "../agents/agent-scope.js";
|
|
3
3
|
import { loadConfig } from "../config/config.js";
|
|
4
4
|
import { buildAgentMainSessionKey, normalizeAgentId, normalizeMainKey, parseAgentSessionKey, } from "../routing/session-key.js";
|
|
@@ -11,9 +11,9 @@ import { createCommandHandlers } from "./tui-command-handlers.js";
|
|
|
11
11
|
import { createEventHandlers } from "./tui-event-handlers.js";
|
|
12
12
|
import { formatTokens } from "./tui-formatters.js";
|
|
13
13
|
import { createLocalShellRunner } from "./tui-local-shell.js";
|
|
14
|
-
import { buildWaitingStatusMessage, defaultWaitingPhrases } from "./tui-waiting.js";
|
|
15
14
|
import { createOverlayHandlers } from "./tui-overlays.js";
|
|
16
15
|
import { createSessionActions } from "./tui-session-actions.js";
|
|
16
|
+
import { buildWaitingStatusMessage, defaultWaitingPhrases } from "./tui-waiting.js";
|
|
17
17
|
export { resolveFinalAssistantText } from "./tui-formatters.js";
|
|
18
18
|
export function createEditorSubmitHandler(params) {
|
|
19
19
|
return (text) => {
|
|
@@ -21,8 +21,9 @@ export function createEditorSubmitHandler(params) {
|
|
|
21
21
|
const value = raw.trim();
|
|
22
22
|
params.editor.setText("");
|
|
23
23
|
// Keep previous behavior: ignore empty/whitespace-only submissions.
|
|
24
|
-
if (!value)
|
|
24
|
+
if (!value) {
|
|
25
25
|
return;
|
|
26
|
+
}
|
|
26
27
|
// Bash mode: only if the very first character is '!' and it's not just '!'.
|
|
27
28
|
// IMPORTANT: use the raw (untrimmed) text so leading spaces do NOT trigger.
|
|
28
29
|
// Per requirement: a lone '!' should be treated as a normal message.
|
|
@@ -40,6 +41,140 @@ export function createEditorSubmitHandler(params) {
|
|
|
40
41
|
void params.sendMessage(value);
|
|
41
42
|
};
|
|
42
43
|
}
|
|
44
|
+
export function shouldEnableWindowsGitBashPasteFallback(params) {
|
|
45
|
+
const platform = params?.platform ?? process.platform;
|
|
46
|
+
const env = params?.env ?? process.env;
|
|
47
|
+
const termProgram = (env.TERM_PROGRAM ?? "").toLowerCase();
|
|
48
|
+
// Some macOS terminals emit multiline paste as rapid single-line submits.
|
|
49
|
+
// Enable burst coalescing so pasted blocks stay as one user message.
|
|
50
|
+
if (platform === "darwin") {
|
|
51
|
+
if (termProgram.includes("iterm") || termProgram.includes("apple_terminal")) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
if (platform !== "win32") {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
const msystem = (env.MSYSTEM ?? "").toUpperCase();
|
|
60
|
+
const shell = env.SHELL ?? "";
|
|
61
|
+
if (msystem.startsWith("MINGW") || msystem.startsWith("MSYS")) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
if (shell.toLowerCase().includes("bash")) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
return termProgram.includes("mintty");
|
|
68
|
+
}
|
|
69
|
+
export function createSubmitBurstCoalescer(params) {
|
|
70
|
+
const windowMs = Math.max(1, params.burstWindowMs ?? 50);
|
|
71
|
+
const now = params.now ?? (() => Date.now());
|
|
72
|
+
const setTimer = params.setTimer ?? setTimeout;
|
|
73
|
+
const clearTimer = params.clearTimer ?? clearTimeout;
|
|
74
|
+
let pending = null;
|
|
75
|
+
let pendingAt = 0;
|
|
76
|
+
let flushTimer = null;
|
|
77
|
+
const clearFlushTimer = () => {
|
|
78
|
+
if (!flushTimer) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
clearTimer(flushTimer);
|
|
82
|
+
flushTimer = null;
|
|
83
|
+
};
|
|
84
|
+
const flushPending = () => {
|
|
85
|
+
if (pending === null) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const value = pending;
|
|
89
|
+
pending = null;
|
|
90
|
+
pendingAt = 0;
|
|
91
|
+
clearFlushTimer();
|
|
92
|
+
params.submit(value);
|
|
93
|
+
};
|
|
94
|
+
const scheduleFlush = () => {
|
|
95
|
+
clearFlushTimer();
|
|
96
|
+
flushTimer = setTimer(() => {
|
|
97
|
+
flushPending();
|
|
98
|
+
}, windowMs);
|
|
99
|
+
};
|
|
100
|
+
return (value) => {
|
|
101
|
+
if (!params.enabled) {
|
|
102
|
+
params.submit(value);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (value.includes("\n")) {
|
|
106
|
+
flushPending();
|
|
107
|
+
params.submit(value);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const ts = now();
|
|
111
|
+
if (pending === null) {
|
|
112
|
+
pending = value;
|
|
113
|
+
pendingAt = ts;
|
|
114
|
+
scheduleFlush();
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (ts - pendingAt <= windowMs) {
|
|
118
|
+
pending = `${pending}\n${value}`;
|
|
119
|
+
pendingAt = ts;
|
|
120
|
+
scheduleFlush();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
flushPending();
|
|
124
|
+
pending = value;
|
|
125
|
+
pendingAt = ts;
|
|
126
|
+
scheduleFlush();
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export function resolveTuiSessionKey(params) {
|
|
130
|
+
const trimmed = (params.raw ?? "").trim();
|
|
131
|
+
if (!trimmed) {
|
|
132
|
+
if (params.sessionScope === "global") {
|
|
133
|
+
return "global";
|
|
134
|
+
}
|
|
135
|
+
return buildAgentMainSessionKey({
|
|
136
|
+
agentId: params.currentAgentId,
|
|
137
|
+
mainKey: params.sessionMainKey,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
if (trimmed === "global" || trimmed === "unknown") {
|
|
141
|
+
return trimmed;
|
|
142
|
+
}
|
|
143
|
+
if (trimmed.startsWith("agent:")) {
|
|
144
|
+
return trimmed;
|
|
145
|
+
}
|
|
146
|
+
return `agent:${params.currentAgentId}:${trimmed}`;
|
|
147
|
+
}
|
|
148
|
+
export function resolveGatewayDisconnectState(reason) {
|
|
149
|
+
const reasonLabel = reason?.trim() ? reason.trim() : "closed";
|
|
150
|
+
if (/pairing required/i.test(reasonLabel)) {
|
|
151
|
+
return {
|
|
152
|
+
connectionStatus: `gateway disconnected: ${reasonLabel}`,
|
|
153
|
+
activityStatus: "pairing required: run poolbot devices list",
|
|
154
|
+
pairingHint: "Pairing required. Run `poolbot devices list`, approve your request ID, then reconnect.",
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
connectionStatus: `gateway disconnected: ${reasonLabel}`,
|
|
159
|
+
activityStatus: "idle",
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
export function createBackspaceDeduper(params) {
|
|
163
|
+
const dedupeWindowMs = Math.max(0, Math.floor(params?.dedupeWindowMs ?? 8));
|
|
164
|
+
const now = params?.now ?? (() => Date.now());
|
|
165
|
+
let lastBackspaceAt = -1;
|
|
166
|
+
return (data) => {
|
|
167
|
+
if (!matchesKey(data, Key.backspace)) {
|
|
168
|
+
return data;
|
|
169
|
+
}
|
|
170
|
+
const ts = now();
|
|
171
|
+
if (lastBackspaceAt >= 0 && ts - lastBackspaceAt <= dedupeWindowMs) {
|
|
172
|
+
return "";
|
|
173
|
+
}
|
|
174
|
+
lastBackspaceAt = ts;
|
|
175
|
+
return data;
|
|
176
|
+
};
|
|
177
|
+
}
|
|
43
178
|
export async function runTui(opts) {
|
|
44
179
|
const config = loadConfig();
|
|
45
180
|
const initialSessionInput = (opts.session ?? "").trim();
|
|
@@ -58,6 +193,8 @@ export async function runTui(opts) {
|
|
|
58
193
|
let wasDisconnected = false;
|
|
59
194
|
let toolsExpanded = false;
|
|
60
195
|
let showThinking = false;
|
|
196
|
+
let pairingHintShown = false;
|
|
197
|
+
const localRunIds = new Set();
|
|
61
198
|
const deliverDefault = opts.deliver ?? false;
|
|
62
199
|
const autoMessage = opts.message?.trim();
|
|
63
200
|
let autoMessageSent = false;
|
|
@@ -185,12 +322,39 @@ export async function runTui(opts) {
|
|
|
185
322
|
lastCtrlCAt = value;
|
|
186
323
|
},
|
|
187
324
|
};
|
|
325
|
+
const noteLocalRunId = (runId) => {
|
|
326
|
+
if (!runId) {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
localRunIds.add(runId);
|
|
330
|
+
if (localRunIds.size > 200) {
|
|
331
|
+
const [first] = localRunIds;
|
|
332
|
+
if (first) {
|
|
333
|
+
localRunIds.delete(first);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
const forgetLocalRunId = (runId) => {
|
|
338
|
+
localRunIds.delete(runId);
|
|
339
|
+
};
|
|
340
|
+
const isLocalRunId = (runId) => localRunIds.has(runId);
|
|
341
|
+
const clearLocalRunIds = () => {
|
|
342
|
+
localRunIds.clear();
|
|
343
|
+
};
|
|
188
344
|
const client = new GatewayChatClient({
|
|
189
345
|
url: opts.url,
|
|
190
346
|
token: opts.token,
|
|
191
347
|
password: opts.password,
|
|
192
348
|
});
|
|
193
349
|
const tui = new TUI(new ProcessTerminal());
|
|
350
|
+
const dedupeBackspace = createBackspaceDeduper();
|
|
351
|
+
tui.addInputListener((data) => {
|
|
352
|
+
const next = dedupeBackspace(data);
|
|
353
|
+
if (next.length === 0) {
|
|
354
|
+
return { consume: true };
|
|
355
|
+
}
|
|
356
|
+
return { data: next };
|
|
357
|
+
});
|
|
194
358
|
const header = new Text("", 1, 0);
|
|
195
359
|
const statusContainer = new Container();
|
|
196
360
|
const footer = new Text("", 1, 0);
|
|
@@ -212,8 +376,9 @@ export async function runTui(opts) {
|
|
|
212
376
|
tui.addChild(root);
|
|
213
377
|
tui.setFocus(editor);
|
|
214
378
|
const formatSessionKey = (key) => {
|
|
215
|
-
if (key === "global" || key === "unknown")
|
|
379
|
+
if (key === "global" || key === "unknown") {
|
|
216
380
|
return key;
|
|
381
|
+
}
|
|
217
382
|
const parsed = parseAgentSessionKey(key);
|
|
218
383
|
return parsed?.rest ?? key;
|
|
219
384
|
};
|
|
@@ -222,43 +387,35 @@ export async function runTui(opts) {
|
|
|
222
387
|
return name ? `${id} (${name})` : id;
|
|
223
388
|
};
|
|
224
389
|
const resolveSessionKey = (raw) => {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
mainKey: sessionMainKey,
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
if (trimmed === "global" || trimmed === "unknown")
|
|
235
|
-
return trimmed;
|
|
236
|
-
if (trimmed.startsWith("agent:"))
|
|
237
|
-
return trimmed;
|
|
238
|
-
return `agent:${currentAgentId}:${trimmed}`;
|
|
390
|
+
return resolveTuiSessionKey({
|
|
391
|
+
raw,
|
|
392
|
+
sessionScope,
|
|
393
|
+
currentAgentId,
|
|
394
|
+
sessionMainKey,
|
|
395
|
+
});
|
|
239
396
|
};
|
|
240
397
|
currentSessionKey = resolveSessionKey(initialSessionInput);
|
|
241
|
-
const getContentWidth = () => Math.max(20, (tui.terminal.columns ?? 80) - 2); // paddingX=1 each side
|
|
242
398
|
const updateHeader = () => {
|
|
243
399
|
const sessionLabel = formatSessionKey(currentSessionKey);
|
|
244
400
|
const agentLabel = formatAgentLabel(currentAgentId);
|
|
245
|
-
|
|
246
|
-
header.setText(theme.header(truncateToWidth(raw, getContentWidth())));
|
|
401
|
+
header.setText(theme.header(`poolbot tui - ${client.connection.url} - agent ${agentLabel} - session ${sessionLabel}`));
|
|
247
402
|
};
|
|
248
403
|
const busyStates = new Set(["sending", "waiting", "streaming", "running"]);
|
|
249
404
|
let statusText = null;
|
|
250
405
|
let statusLoader = null;
|
|
251
406
|
const formatElapsed = (startMs) => {
|
|
252
407
|
const totalSeconds = Math.max(0, Math.floor((Date.now() - startMs) / 1000));
|
|
253
|
-
if (totalSeconds < 60)
|
|
408
|
+
if (totalSeconds < 60) {
|
|
254
409
|
return `${totalSeconds}s`;
|
|
410
|
+
}
|
|
255
411
|
const minutes = Math.floor(totalSeconds / 60);
|
|
256
412
|
const seconds = totalSeconds % 60;
|
|
257
413
|
return `${minutes}m ${seconds}s`;
|
|
258
414
|
};
|
|
259
415
|
const ensureStatusText = () => {
|
|
260
|
-
if (statusText)
|
|
416
|
+
if (statusText) {
|
|
261
417
|
return;
|
|
418
|
+
}
|
|
262
419
|
statusContainer.clear();
|
|
263
420
|
statusLoader?.stop();
|
|
264
421
|
statusLoader = null;
|
|
@@ -266,8 +423,9 @@ export async function runTui(opts) {
|
|
|
266
423
|
statusContainer.addChild(statusText);
|
|
267
424
|
};
|
|
268
425
|
const ensureStatusLoader = () => {
|
|
269
|
-
if (statusLoader)
|
|
426
|
+
if (statusLoader) {
|
|
270
427
|
return;
|
|
428
|
+
}
|
|
271
429
|
statusContainer.clear();
|
|
272
430
|
statusText = null;
|
|
273
431
|
statusLoader = new Loader(tui, (spinner) => theme.accent(spinner), (text) => theme.bold(theme.accentSoft(text)), "");
|
|
@@ -277,44 +435,45 @@ export async function runTui(opts) {
|
|
|
277
435
|
let waitingTimer = null;
|
|
278
436
|
let waitingPhrase = null;
|
|
279
437
|
const updateBusyStatusMessage = () => {
|
|
280
|
-
if (!statusLoader || !statusStartedAt)
|
|
438
|
+
if (!statusLoader || !statusStartedAt) {
|
|
281
439
|
return;
|
|
440
|
+
}
|
|
282
441
|
const elapsed = formatElapsed(statusStartedAt);
|
|
283
|
-
// Truncate status messages to terminal width to prevent TUI crash
|
|
284
|
-
// (Loader adds spinner + space = 2 visible chars before the message)
|
|
285
|
-
const maxMsgWidth = Math.max(10, getContentWidth() - 4);
|
|
286
442
|
if (activityStatus === "waiting") {
|
|
287
443
|
waitingTick++;
|
|
288
|
-
|
|
444
|
+
statusLoader.setMessage(buildWaitingStatusMessage({
|
|
289
445
|
theme,
|
|
290
446
|
tick: waitingTick,
|
|
291
447
|
elapsed,
|
|
292
448
|
connectionStatus,
|
|
293
449
|
phrases: waitingPhrase ? [waitingPhrase] : undefined,
|
|
294
|
-
});
|
|
295
|
-
statusLoader.setMessage(truncateToWidth(msg, maxMsgWidth));
|
|
450
|
+
}));
|
|
296
451
|
return;
|
|
297
452
|
}
|
|
298
|
-
statusLoader.setMessage(
|
|
453
|
+
statusLoader.setMessage(`${activityStatus} • ${elapsed} | ${connectionStatus}`);
|
|
299
454
|
};
|
|
300
455
|
const startStatusTimer = () => {
|
|
301
|
-
if (statusTimer)
|
|
456
|
+
if (statusTimer) {
|
|
302
457
|
return;
|
|
458
|
+
}
|
|
303
459
|
statusTimer = setInterval(() => {
|
|
304
|
-
if (!busyStates.has(activityStatus))
|
|
460
|
+
if (!busyStates.has(activityStatus)) {
|
|
305
461
|
return;
|
|
462
|
+
}
|
|
306
463
|
updateBusyStatusMessage();
|
|
307
464
|
}, 1000);
|
|
308
465
|
};
|
|
309
466
|
const stopStatusTimer = () => {
|
|
310
|
-
if (!statusTimer)
|
|
467
|
+
if (!statusTimer) {
|
|
311
468
|
return;
|
|
469
|
+
}
|
|
312
470
|
clearInterval(statusTimer);
|
|
313
471
|
statusTimer = null;
|
|
314
472
|
};
|
|
315
473
|
const startWaitingTimer = () => {
|
|
316
|
-
if (waitingTimer)
|
|
474
|
+
if (waitingTimer) {
|
|
317
475
|
return;
|
|
476
|
+
}
|
|
318
477
|
// Pick a phrase once per waiting session.
|
|
319
478
|
if (!waitingPhrase) {
|
|
320
479
|
const idx = Math.floor(Math.random() * defaultWaitingPhrases.length);
|
|
@@ -322,14 +481,16 @@ export async function runTui(opts) {
|
|
|
322
481
|
}
|
|
323
482
|
waitingTick = 0;
|
|
324
483
|
waitingTimer = setInterval(() => {
|
|
325
|
-
if (activityStatus !== "waiting")
|
|
484
|
+
if (activityStatus !== "waiting") {
|
|
326
485
|
return;
|
|
486
|
+
}
|
|
327
487
|
updateBusyStatusMessage();
|
|
328
488
|
}, 120);
|
|
329
489
|
};
|
|
330
490
|
const stopWaitingTimer = () => {
|
|
331
|
-
if (!waitingTimer)
|
|
491
|
+
if (!waitingTimer) {
|
|
332
492
|
return;
|
|
493
|
+
}
|
|
333
494
|
clearInterval(waitingTimer);
|
|
334
495
|
waitingTimer = null;
|
|
335
496
|
waitingPhrase = null;
|
|
@@ -366,8 +527,9 @@ export async function runTui(opts) {
|
|
|
366
527
|
const setConnectionStatus = (text, ttlMs) => {
|
|
367
528
|
connectionStatus = text;
|
|
368
529
|
renderStatus();
|
|
369
|
-
if (statusTimeout)
|
|
530
|
+
if (statusTimeout) {
|
|
370
531
|
clearTimeout(statusTimeout);
|
|
532
|
+
}
|
|
371
533
|
if (ttlMs && ttlMs > 0) {
|
|
372
534
|
statusTimeout = setTimeout(() => {
|
|
373
535
|
connectionStatus = isConnected ? "connected" : "disconnected";
|
|
@@ -404,12 +566,13 @@ export async function runTui(opts) {
|
|
|
404
566
|
reasoningLabel,
|
|
405
567
|
tokens,
|
|
406
568
|
].filter(Boolean);
|
|
407
|
-
footer.setText(theme.dim(
|
|
569
|
+
footer.setText(theme.dim(footerParts.join(" | ")));
|
|
408
570
|
};
|
|
409
571
|
const { openOverlay, closeOverlay } = createOverlayHandlers(tui, editor);
|
|
410
572
|
const initialSessionAgentId = (() => {
|
|
411
|
-
if (!initialSessionInput)
|
|
573
|
+
if (!initialSessionInput) {
|
|
412
574
|
return null;
|
|
575
|
+
}
|
|
413
576
|
const parsed = parseAgentSessionKey(initialSessionInput);
|
|
414
577
|
return parsed ? normalizeAgentId(parsed.agentId) : null;
|
|
415
578
|
})();
|
|
@@ -427,14 +590,19 @@ export async function runTui(opts) {
|
|
|
427
590
|
updateFooter,
|
|
428
591
|
updateAutocompleteProvider,
|
|
429
592
|
setActivityStatus,
|
|
593
|
+
clearLocalRunIds,
|
|
430
594
|
});
|
|
431
|
-
const { refreshAgents, refreshSessionInfo, loadHistory, setSession, abortActive } = sessionActions;
|
|
595
|
+
const { refreshAgents, refreshSessionInfo, applySessionInfoFromPatch, loadHistory, setSession, abortActive, } = sessionActions;
|
|
432
596
|
const { handleChatEvent, handleAgentEvent } = createEventHandlers({
|
|
433
597
|
chatLog,
|
|
434
598
|
tui,
|
|
435
599
|
state,
|
|
436
600
|
setActivityStatus,
|
|
437
601
|
refreshSessionInfo,
|
|
602
|
+
loadHistory,
|
|
603
|
+
isLocalRunId,
|
|
604
|
+
forgetLocalRunId,
|
|
605
|
+
clearLocalRunIds,
|
|
438
606
|
});
|
|
439
607
|
const { handleCommand, sendMessage, openModelSelector, openAgentSelector, openSessionSelector } = createCommandHandlers({
|
|
440
608
|
client,
|
|
@@ -446,12 +614,15 @@ export async function runTui(opts) {
|
|
|
446
614
|
openOverlay,
|
|
447
615
|
closeOverlay,
|
|
448
616
|
refreshSessionInfo,
|
|
617
|
+
applySessionInfoFromPatch,
|
|
449
618
|
loadHistory,
|
|
450
619
|
setSession,
|
|
451
620
|
refreshAgents,
|
|
452
621
|
abortActive,
|
|
453
622
|
setActivityStatus,
|
|
454
623
|
formatSessionKey,
|
|
624
|
+
noteLocalRunId,
|
|
625
|
+
forgetLocalRunId,
|
|
455
626
|
});
|
|
456
627
|
const { runLocalShellLine } = createLocalShellRunner({
|
|
457
628
|
chatLog,
|
|
@@ -460,12 +631,16 @@ export async function runTui(opts) {
|
|
|
460
631
|
closeOverlay,
|
|
461
632
|
});
|
|
462
633
|
updateAutocompleteProvider();
|
|
463
|
-
|
|
634
|
+
const submitHandler = createEditorSubmitHandler({
|
|
464
635
|
editor,
|
|
465
636
|
handleCommand,
|
|
466
637
|
sendMessage,
|
|
467
638
|
handleBangLine: runLocalShellLine,
|
|
468
639
|
});
|
|
640
|
+
editor.onSubmit = createSubmitBurstCoalescer({
|
|
641
|
+
submit: submitHandler,
|
|
642
|
+
enabled: shouldEnableWindowsGitBashPasteFallback(),
|
|
643
|
+
});
|
|
469
644
|
editor.onEscape = () => {
|
|
470
645
|
void abortActive();
|
|
471
646
|
};
|
|
@@ -511,13 +686,16 @@ export async function runTui(opts) {
|
|
|
511
686
|
void loadHistory();
|
|
512
687
|
};
|
|
513
688
|
client.onEvent = (evt) => {
|
|
514
|
-
if (evt.event === "chat")
|
|
689
|
+
if (evt.event === "chat") {
|
|
515
690
|
handleChatEvent(evt.payload);
|
|
516
|
-
|
|
691
|
+
}
|
|
692
|
+
if (evt.event === "agent") {
|
|
517
693
|
handleAgentEvent(evt.payload);
|
|
694
|
+
}
|
|
518
695
|
};
|
|
519
696
|
client.onConnected = () => {
|
|
520
697
|
isConnected = true;
|
|
698
|
+
pairingHintShown = false;
|
|
521
699
|
const reconnected = wasDisconnected;
|
|
522
700
|
wasDisconnected = false;
|
|
523
701
|
setConnectionStatus("connected");
|
|
@@ -539,9 +717,13 @@ export async function runTui(opts) {
|
|
|
539
717
|
isConnected = false;
|
|
540
718
|
wasDisconnected = true;
|
|
541
719
|
historyLoaded = false;
|
|
542
|
-
const
|
|
543
|
-
setConnectionStatus(
|
|
544
|
-
setActivityStatus(
|
|
720
|
+
const disconnectState = resolveGatewayDisconnectState(reason);
|
|
721
|
+
setConnectionStatus(disconnectState.connectionStatus, 5000);
|
|
722
|
+
setActivityStatus(disconnectState.activityStatus);
|
|
723
|
+
if (disconnectState.pairingHint && !pairingHintShown) {
|
|
724
|
+
pairingHintShown = true;
|
|
725
|
+
chatLog.addSystem(disconnectState.pairingHint);
|
|
726
|
+
}
|
|
545
727
|
updateFooter();
|
|
546
728
|
tui.requestRender();
|
|
547
729
|
};
|
|
@@ -554,4 +736,10 @@ export async function runTui(opts) {
|
|
|
554
736
|
updateFooter();
|
|
555
737
|
tui.start();
|
|
556
738
|
client.start();
|
|
739
|
+
await new Promise((resolve) => {
|
|
740
|
+
const finish = () => resolve();
|
|
741
|
+
process.once("exit", finish);
|
|
742
|
+
process.once("SIGINT", finish);
|
|
743
|
+
process.once("SIGTERM", finish);
|
|
744
|
+
});
|
|
557
745
|
}
|
package/dist/utils/account-id.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
+
import { normalizeOptionalAccountId } from "../routing/account-id.js";
|
|
1
2
|
export function normalizeAccountId(value) {
|
|
2
|
-
|
|
3
|
-
return undefined;
|
|
4
|
-
const trimmed = value.trim();
|
|
5
|
-
return trimmed || undefined;
|
|
3
|
+
return normalizeOptionalAccountId(value);
|
|
6
4
|
}
|
package/dist/utils/boolean.js
CHANGED
|
@@ -3,20 +3,25 @@ const DEFAULT_FALSY = ["false", "0", "no", "off"];
|
|
|
3
3
|
const DEFAULT_TRUTHY_SET = new Set(DEFAULT_TRUTHY);
|
|
4
4
|
const DEFAULT_FALSY_SET = new Set(DEFAULT_FALSY);
|
|
5
5
|
export function parseBooleanValue(value, options = {}) {
|
|
6
|
-
if (typeof value === "boolean")
|
|
6
|
+
if (typeof value === "boolean") {
|
|
7
7
|
return value;
|
|
8
|
-
|
|
8
|
+
}
|
|
9
|
+
if (typeof value !== "string") {
|
|
9
10
|
return undefined;
|
|
11
|
+
}
|
|
10
12
|
const normalized = value.trim().toLowerCase();
|
|
11
|
-
if (!normalized)
|
|
13
|
+
if (!normalized) {
|
|
12
14
|
return undefined;
|
|
15
|
+
}
|
|
13
16
|
const truthy = options.truthy ?? DEFAULT_TRUTHY;
|
|
14
17
|
const falsy = options.falsy ?? DEFAULT_FALSY;
|
|
15
18
|
const truthySet = truthy === DEFAULT_TRUTHY ? DEFAULT_TRUTHY_SET : new Set(truthy);
|
|
16
19
|
const falsySet = falsy === DEFAULT_FALSY ? DEFAULT_FALSY_SET : new Set(falsy);
|
|
17
|
-
if (truthySet.has(normalized))
|
|
20
|
+
if (truthySet.has(normalized)) {
|
|
18
21
|
return true;
|
|
19
|
-
|
|
22
|
+
}
|
|
23
|
+
if (falsySet.has(normalized)) {
|
|
20
24
|
return false;
|
|
25
|
+
}
|
|
21
26
|
return undefined;
|
|
22
27
|
}
|
|
@@ -6,6 +6,17 @@ function normalizeDirectiveWhitespace(text) {
|
|
|
6
6
|
.replace(/[ \t]*\n[ \t]*/g, "\n")
|
|
7
7
|
.trim();
|
|
8
8
|
}
|
|
9
|
+
export function stripInlineDirectiveTagsForDisplay(text) {
|
|
10
|
+
if (!text) {
|
|
11
|
+
return { text, changed: false };
|
|
12
|
+
}
|
|
13
|
+
const withoutAudio = text.replace(AUDIO_TAG_RE, "");
|
|
14
|
+
const stripped = withoutAudio.replace(REPLY_TAG_RE, "");
|
|
15
|
+
return {
|
|
16
|
+
text: stripped,
|
|
17
|
+
changed: stripped !== text,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
9
20
|
export function parseInlineDirectives(text, options = {}) {
|
|
10
21
|
const { currentMessageId, stripAudioTag = true, stripReplyTags = true } = options;
|
|
11
22
|
if (!text) {
|