@sayknow-cli/coding-agent 0.3.12 → 0.3.13
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/package.json +116 -117
- package/scripts/g004-tmux-smoke.ts +196 -36
- package/scripts/generate-docs-index.ts +2 -0
- package/src/cli/daemon-cli.ts +19 -29
- package/src/cli/malloc-env-guard.test.ts +104 -0
- package/src/cli/malloc-env-guard.ts +149 -0
- package/src/cli/notify-cli.ts +78 -14
- package/src/cli/session-picker.ts +23 -40
- package/src/cli/update-cli.ts +56 -37
- package/src/cli.ts +50 -10
- package/src/commands/daemon.ts +19 -5
- package/src/commands/harness.ts +515 -47
- package/src/commands/launch.ts +11 -3
- package/src/commands/notify.ts +5 -1
- package/src/commands/session.ts +6 -1
- package/src/config/keybindings.ts +5 -0
- package/src/config/model-profile-activation.ts +1 -1
- package/src/config/model-profiles.ts +14 -14
- package/src/config/settings-schema.ts +41 -1
- package/src/coordinator-mcp/model-preset.ts +100 -0
- package/src/coordinator-mcp/server.ts +2735 -435
- package/src/daemon/control-types.ts +11 -0
- package/src/daemon/operator-contract.ts +121 -0
- package/src/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.ts +57 -17
- package/src/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.ts +15 -2
- package/src/defaults/skc/extensions/grok-cli-vendor/src/provider/register.ts +5 -1
- package/src/internal-urls/docs-index.generated.ts +7 -7
- package/src/internal-urls/local-protocol.ts +29 -10
- package/src/main.ts +298 -75
- package/src/modes/acp/acp-agent.ts +728 -98
- package/src/modes/acp/acp-mode.ts +29 -2
- package/src/modes/components/assistant-message.ts +32 -3
- package/src/modes/components/bash-execution.ts +43 -13
- package/src/modes/components/custom-editor.ts +5 -0
- package/src/modes/components/hook-selector.ts +12 -0
- package/src/modes/components/irc-sidebar.ts +206 -0
- package/src/modes/components/pet-selector.ts +55 -0
- package/src/modes/components/sayknow-pet-widget.ts +360 -0
- package/src/modes/components/session-selector.ts +222 -221
- package/src/modes/components/settings-selector.ts +10 -0
- package/src/modes/components/tool-execution.ts +47 -6
- package/src/modes/components/user-message.ts +26 -9
- package/src/modes/controllers/command-controller.ts +28 -2
- package/src/modes/controllers/event-controller.ts +159 -36
- package/src/modes/controllers/extension-ui-controller.ts +36 -17
- package/src/modes/controllers/input-controller.ts +8 -2
- package/src/modes/controllers/selector-controller.ts +62 -15
- package/src/modes/interactive-mode.ts +183 -7
- package/src/modes/irc-observation-ledger.ts +127 -0
- package/src/modes/shared/agent-wire/deep-interview-gate.ts +45 -2
- package/src/modes/shared/agent-wire/unattended-session.ts +288 -1
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +130 -20
- package/src/modes/types.ts +34 -2
- package/src/modes/utils/hotkeys-markdown.ts +1 -0
- package/src/modes/utils/irc-message.ts +138 -0
- package/src/modes/utils/ui-helpers.ts +216 -50
- package/src/notifications/config.ts +44 -0
- package/src/notifications/daemon-paths.ts +8 -0
- package/src/notifications/index.ts +535 -75
- package/src/notifications/lifecycle-control-runtime.ts +930 -77
- package/src/notifications/notification-service.ts +710 -0
- package/src/notifications/rate-limit-pool.ts +46 -12
- package/src/notifications/telegram-daemon-control.ts +27 -2
- package/src/notifications/telegram-daemon.ts +635 -94
- package/src/notifications/telegram-reference.ts +73 -13
- package/src/notifications/topic-registry.ts +86 -9
- package/src/prompts/system/irc-peer-roster.md +1 -0
- package/src/prompts/system/subagent-system-prompt.md +1 -0
- package/src/prompts/system/system-prompt.md +1 -0
- package/src/prompts/tools/irc.md +1 -1
- package/src/registry/agent-registry.ts +3 -0
- package/src/sdk.ts +52 -1
- package/src/secrets/obfuscator.ts +4 -2
- package/src/session/agent-session.ts +396 -145
- package/src/session/cache-economics.ts +275 -0
- package/src/session/provider-safety-stop.ts +9 -0
- package/src/session/session-dump-format.ts +6 -0
- package/src/session/session-manager.ts +809 -39
- package/src/session/session-storage.ts +582 -38
- package/src/skc-runtime/session-state-sidecar.ts +756 -135
- package/src/skc-runtime/tmux-common.ts +26 -7
- package/src/skc-runtime/tmux-gc.ts +52 -9
- package/src/skc-runtime/tmux-owner-isolation-cli.ts +185 -0
- package/src/skc-runtime/tmux-owner-isolation.ts +2060 -0
- package/src/skc-runtime/tmux-sessions.ts +871 -68
- package/src/slash-commands/builtin-registry.ts +143 -9
- package/src/task/executor.ts +12 -3
- package/src/task/index.ts +8 -0
- package/src/task/receipt.ts +7 -2
- package/src/task/types.ts +26 -0
- package/src/tools/ask-answer-registry.ts +25 -0
- package/src/tools/browser/tab-supervisor.ts +63 -6
- package/src/tools/browser.ts +8 -3
- package/src/tools/index.ts +81 -6
- package/src/tools/sqlite-reader.ts +8 -4
- package/src/tui/output-block.ts +18 -6
- package/src/utils/external-editor.ts +6 -1
- package/dist/types/append-only-mode.d.ts +0 -31
- package/dist/types/async/index.d.ts +0 -2
- package/dist/types/async/job-manager.d.ts +0 -328
- package/dist/types/async/support.d.ts +0 -2
- package/dist/types/autoresearch/dashboard.d.ts +0 -4
- package/dist/types/autoresearch/git.d.ts +0 -36
- package/dist/types/autoresearch/helpers.d.ts +0 -24
- package/dist/types/autoresearch/index.d.ts +0 -2
- package/dist/types/autoresearch/state.d.ts +0 -17
- package/dist/types/autoresearch/storage.d.ts +0 -142
- package/dist/types/autoresearch/tools/init-experiment.d.ts +0 -31
- package/dist/types/autoresearch/tools/log-experiment.d.ts +0 -23
- package/dist/types/autoresearch/tools/run-experiment.d.ts +0 -8
- package/dist/types/autoresearch/tools/update-notes.d.ts +0 -12
- package/dist/types/autoresearch/types.d.ts +0 -154
- package/dist/types/build-metadata.d.ts +0 -7
- package/dist/types/capability/context-file.d.ts +0 -17
- package/dist/types/capability/extension-module.d.ts +0 -15
- package/dist/types/capability/extension.d.ts +0 -28
- package/dist/types/capability/fs.d.ts +0 -20
- package/dist/types/capability/hook.d.ts +0 -19
- package/dist/types/capability/index.d.ts +0 -80
- package/dist/types/capability/instruction.d.ts +0 -17
- package/dist/types/capability/mcp.d.ts +0 -49
- package/dist/types/capability/prompt.d.ts +0 -15
- package/dist/types/capability/rule.d.ts +0 -69
- package/dist/types/capability/settings.d.ts +0 -15
- package/dist/types/capability/skill.d.ts +0 -36
- package/dist/types/capability/slash-command.d.ts +0 -17
- package/dist/types/capability/ssh.d.ts +0 -23
- package/dist/types/capability/system-prompt.d.ts +0 -15
- package/dist/types/capability/tool.d.ts +0 -19
- package/dist/types/capability/types.d.ts +0 -154
- package/dist/types/cli/agents-cli.d.ts +0 -12
- package/dist/types/cli/args.d.ts +0 -57
- package/dist/types/cli/auth-broker-cli.d.ts +0 -25
- package/dist/types/cli/auth-gateway-cli.d.ts +0 -18
- package/dist/types/cli/classify-install-target.d.ts +0 -18
- package/dist/types/cli/commands/init-xdg.d.ts +0 -1
- package/dist/types/cli/completion-cli.d.ts +0 -41
- package/dist/types/cli/config-cli.d.ts +0 -23
- package/dist/types/cli/daemon-cli.d.ts +0 -25
- package/dist/types/cli/fast-help.d.ts +0 -1
- package/dist/types/cli/file-processor.d.ts +0 -11
- package/dist/types/cli/fixture-report.d.ts +0 -20
- package/dist/types/cli/fixture-report.test.d.ts +0 -1
- package/dist/types/cli/grep-cli.d.ts +0 -17
- package/dist/types/cli/initial-message.d.ts +0 -17
- package/dist/types/cli/list-models.d.ts +0 -36
- package/dist/types/cli/local-provider-smoke.d.ts +0 -59
- package/dist/types/cli/mcp-cli.d.ts +0 -25
- package/dist/types/cli/migrate-cli.d.ts +0 -20
- package/dist/types/cli/nofile-limit.d.ts +0 -11
- package/dist/types/cli/notify-cli.d.ts +0 -37
- package/dist/types/cli/plugin-cli.d.ts +0 -34
- package/dist/types/cli/read-cli.d.ts +0 -4
- package/dist/types/cli/session-picker.d.ts +0 -3
- package/dist/types/cli/setup-cli.d.ts +0 -73
- package/dist/types/cli/shell-cli.d.ts +0 -8
- package/dist/types/cli/skills-cli.d.ts +0 -9
- package/dist/types/cli/ssh-cli.d.ts +0 -21
- package/dist/types/cli/stats-cli.d.ts +0 -17
- package/dist/types/cli/telegram-cli.d.ts +0 -13
- package/dist/types/cli/update-cli.d.ts +0 -89
- package/dist/types/cli/web-search-cli.d.ts +0 -32
- package/dist/types/cli/worktree-cli.d.ts +0 -26
- package/dist/types/cli.d.ts +0 -135
- package/dist/types/commands/acp.d.ts +0 -12
- package/dist/types/commands/agents.d.ts +0 -34
- package/dist/types/commands/auth-broker.d.ts +0 -54
- package/dist/types/commands/auth-gateway.d.ts +0 -32
- package/dist/types/commands/codex-native-hook.d.ts +0 -6
- package/dist/types/commands/commit.d.ts +0 -27
- package/dist/types/commands/completion.d.ts +0 -29
- package/dist/types/commands/config.d.ts +0 -33
- package/dist/types/commands/contribution-prep.d.ts +0 -18
- package/dist/types/commands/coordinator.d.ts +0 -19
- package/dist/types/commands/daemon.d.ts +0 -41
- package/dist/types/commands/deep-interview.d.ts +0 -54
- package/dist/types/commands/gc.d.ts +0 -26
- package/dist/types/commands/grep.d.ts +0 -42
- package/dist/types/commands/harness.d.ts +0 -43
- package/dist/types/commands/launch.d.ts +0 -130
- package/dist/types/commands/local-provider.d.ts +0 -34
- package/dist/types/commands/mcp-serve.d.ts +0 -24
- package/dist/types/commands/mcp.d.ts +0 -70
- package/dist/types/commands/migrate.d.ts +0 -33
- package/dist/types/commands/notify.d.ts +0 -41
- package/dist/types/commands/plugin.d.ts +0 -58
- package/dist/types/commands/ralplan.d.ts +0 -7
- package/dist/types/commands/read.d.ts +0 -15
- package/dist/types/commands/rlm.d.ts +0 -10
- package/dist/types/commands/session.d.ts +0 -30
- package/dist/types/commands/setup.d.ts +0 -105
- package/dist/types/commands/shell.d.ts +0 -21
- package/dist/types/commands/skills.d.ts +0 -26
- package/dist/types/commands/ssh.d.ts +0 -48
- package/dist/types/commands/state.d.ts +0 -7
- package/dist/types/commands/stats.d.ts +0 -25
- package/dist/types/commands/team.d.ts +0 -24
- package/dist/types/commands/telegram.d.ts +0 -22
- package/dist/types/commands/ultragoal.d.ts +0 -8
- package/dist/types/commands/update.d.ts +0 -20
- package/dist/types/commands/web-search.d.ts +0 -87
- package/dist/types/commands/worktree.d.ts +0 -34
- package/dist/types/commit/agentic/agent.d.ts +0 -31
- package/dist/types/commit/agentic/fallback.d.ts +0 -5
- package/dist/types/commit/agentic/index.d.ts +0 -2
- package/dist/types/commit/agentic/state.d.ts +0 -58
- package/dist/types/commit/agentic/tools/analyze-file.d.ts +0 -19
- package/dist/types/commit/agentic/tools/git-file-diff.d.ts +0 -10
- package/dist/types/commit/agentic/tools/git-hunk.d.ts +0 -9
- package/dist/types/commit/agentic/tools/git-overview.d.ts +0 -9
- package/dist/types/commit/agentic/tools/index.d.ts +0 -16
- package/dist/types/commit/agentic/tools/propose-changelog.d.ts +0 -28
- package/dist/types/commit/agentic/tools/propose-commit.d.ts +0 -36
- package/dist/types/commit/agentic/tools/recent-commits.d.ts +0 -7
- package/dist/types/commit/agentic/tools/schemas.d.ts +0 -27
- package/dist/types/commit/agentic/tools/split-commit.d.ts +0 -53
- package/dist/types/commit/agentic/topo-sort.d.ts +0 -4
- package/dist/types/commit/agentic/trivial.d.ts +0 -7
- package/dist/types/commit/agentic/validation.d.ts +0 -20
- package/dist/types/commit/analysis/conventional.d.ts +0 -22
- package/dist/types/commit/analysis/index.d.ts +0 -4
- package/dist/types/commit/analysis/scope.d.ts +0 -6
- package/dist/types/commit/analysis/summary.d.ts +0 -19
- package/dist/types/commit/analysis/validation.d.ts +0 -8
- package/dist/types/commit/changelog/detect.d.ts +0 -2
- package/dist/types/commit/changelog/generate.d.ts +0 -30
- package/dist/types/commit/changelog/index.d.ts +0 -30
- package/dist/types/commit/changelog/parse.d.ts +0 -2
- package/dist/types/commit/cli.d.ts +0 -3
- package/dist/types/commit/git/diff.d.ts +0 -5
- package/dist/types/commit/index.d.ts +0 -4
- package/dist/types/commit/map-reduce/index.d.ts +0 -28
- package/dist/types/commit/map-reduce/map-phase.d.ts +0 -17
- package/dist/types/commit/map-reduce/reduce-phase.d.ts +0 -13
- package/dist/types/commit/map-reduce/utils.d.ts +0 -2
- package/dist/types/commit/message.d.ts +0 -2
- package/dist/types/commit/model-selection.d.ts +0 -15
- package/dist/types/commit/pipeline.d.ts +0 -5
- package/dist/types/commit/shared-llm.d.ts +0 -54
- package/dist/types/commit/types.d.ts +0 -78
- package/dist/types/commit/utils/exclusions.d.ts +0 -4
- package/dist/types/commit/utils.d.ts +0 -20
- package/dist/types/config/config-file.d.ts +0 -58
- package/dist/types/config/file-lock-gc.d.ts +0 -5
- package/dist/types/config/file-lock.d.ts +0 -36
- package/dist/types/config/keybindings.d.ts +0 -359
- package/dist/types/config/model-equivalence.d.ts +0 -24
- package/dist/types/config/model-profile-activation.d.ts +0 -64
- package/dist/types/config/model-profiles.d.ts +0 -39
- package/dist/types/config/model-registry.d.ts +0 -473
- package/dist/types/config/model-resolver.d.ts +0 -217
- package/dist/types/config/models-config-schema.d.ts +0 -700
- package/dist/types/config/prompt-templates.d.ts +0 -32
- package/dist/types/config/resolve-config-value.d.ts +0 -17
- package/dist/types/config/settings-schema.d.ts +0 -4183
- package/dist/types/config/settings.d.ts +0 -156
- package/dist/types/config/skill-settings-defaults.d.ts +0 -14
- package/dist/types/config/telegram-autostart.d.ts +0 -14
- package/dist/types/config/telegram-env-bridge.d.ts +0 -18
- package/dist/types/config.d.ts +0 -66
- package/dist/types/coordinator/contract.d.ts +0 -4
- package/dist/types/coordinator-mcp/policy.d.ts +0 -24
- package/dist/types/coordinator-mcp/safety.d.ts +0 -26
- package/dist/types/coordinator-mcp/server.d.ts +0 -66
- package/dist/types/cursor.d.ts +0 -24
- package/dist/types/daemon/builtin.d.ts +0 -20
- package/dist/types/daemon/control-types.d.ts +0 -57
- package/dist/types/daemon/runtime.d.ts +0 -25
- package/dist/types/dap/client.d.ts +0 -39
- package/dist/types/dap/config.d.ts +0 -6
- package/dist/types/dap/index.d.ts +0 -4
- package/dist/types/dap/session.d.ts +0 -108
- package/dist/types/dap/types.d.ts +0 -524
- package/dist/types/debug/crash-diagnostics.d.ts +0 -45
- package/dist/types/debug/index.d.ts +0 -15
- package/dist/types/debug/log-formatting.d.ts +0 -4
- package/dist/types/debug/log-viewer.d.ts +0 -68
- package/dist/types/debug/profiler.d.ts +0 -24
- package/dist/types/debug/raw-sse-buffer.d.ts +0 -44
- package/dist/types/debug/raw-sse.d.ts +0 -16
- package/dist/types/debug/report-bundle.d.ts +0 -55
- package/dist/types/debug/runtime-gauges.d.ts +0 -6
- package/dist/types/debug/system-info.d.ts +0 -26
- package/dist/types/deep-interview/plaintext-gate-guard.d.ts +0 -11
- package/dist/types/deep-interview/render-middleware.d.ts +0 -6
- package/dist/types/defaults/skc/extensions/grok-build/index.d.ts +0 -1
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/index.d.ts +0 -1
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.d.ts +0 -25
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.d.ts +0 -27
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/billing.d.ts +0 -8
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/register.d.ts +0 -5
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/stream.d.ts +0 -10
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/usage.d.ts +0 -2
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/base-url.d.ts +0 -2
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/errors.d.ts +0 -38
- package/dist/types/defaults/skc-defaults.d.ts +0 -64
- package/dist/types/defaults/skc-grok-cli.d.ts +0 -5
- package/dist/types/discovery/agents-md.d.ts +0 -1
- package/dist/types/discovery/agents.d.ts +0 -12
- package/dist/types/discovery/builtin.d.ts +0 -1
- package/dist/types/discovery/claude-plugins.d.ts +0 -1
- package/dist/types/discovery/claude.d.ts +0 -1
- package/dist/types/discovery/cline.d.ts +0 -1
- package/dist/types/discovery/codex.d.ts +0 -1
- package/dist/types/discovery/cursor.d.ts +0 -19
- package/dist/types/discovery/gemini.d.ts +0 -1
- package/dist/types/discovery/github.d.ts +0 -1
- package/dist/types/discovery/helpers.d.ts +0 -271
- package/dist/types/discovery/index.d.ts +0 -48
- package/dist/types/discovery/mcp-json.d.ts +0 -1
- package/dist/types/discovery/opencode.d.ts +0 -1
- package/dist/types/discovery/plugin-dir-roots.d.ts +0 -15
- package/dist/types/discovery/ssh.d.ts +0 -1
- package/dist/types/discovery/substitute-plugin-root.d.ts +0 -5
- package/dist/types/discovery/vscode.d.ts +0 -1
- package/dist/types/discovery/windsurf.d.ts +0 -15
- package/dist/types/edit/apply-patch/index.d.ts +0 -35
- package/dist/types/edit/apply-patch/parser.d.ts +0 -34
- package/dist/types/edit/diff.d.ts +0 -75
- package/dist/types/edit/file-read-cache.d.ts +0 -25
- package/dist/types/edit/index.d.ts +0 -58
- package/dist/types/edit/modes/apply-patch.d.ts +0 -24
- package/dist/types/edit/modes/patch.d.ts +0 -99
- package/dist/types/edit/modes/replace.d.ts +0 -149
- package/dist/types/edit/normalize.d.ts +0 -43
- package/dist/types/edit/notebook.d.ts +0 -26
- package/dist/types/edit/read-file.d.ts +0 -8
- package/dist/types/edit/renderer.d.ts +0 -110
- package/dist/types/edit/streaming.d.ts +0 -66
- package/dist/types/eval/backend.d.ts +0 -40
- package/dist/types/eval/index.d.ts +0 -4
- package/dist/types/eval/js/context-manager.d.ts +0 -27
- package/dist/types/eval/js/executor.d.ts +0 -29
- package/dist/types/eval/js/index.d.ts +0 -10
- package/dist/types/eval/js/shared/helpers.d.ts +0 -38
- package/dist/types/eval/js/shared/indirect-eval.d.ts +0 -14
- package/dist/types/eval/js/shared/prelude.d.ts +0 -1
- package/dist/types/eval/js/shared/rewrite-imports.d.ts +0 -6
- package/dist/types/eval/js/shared/runtime.d.ts +0 -47
- package/dist/types/eval/js/shared/types.d.ts +0 -24
- package/dist/types/eval/js/tool-bridge.d.ts +0 -18
- package/dist/types/eval/js/worker-core.d.ts +0 -5
- package/dist/types/eval/js/worker-entry.d.ts +0 -1
- package/dist/types/eval/js/worker-protocol.d.ts +0 -77
- package/dist/types/eval/py/display.d.ts +0 -25
- package/dist/types/eval/py/executor.d.ts +0 -88
- package/dist/types/eval/py/index.d.ts +0 -10
- package/dist/types/eval/py/kernel.d.ts +0 -65
- package/dist/types/eval/py/prelude.d.ts +0 -1
- package/dist/types/eval/py/runtime.d.ts +0 -29
- package/dist/types/eval/py/tool-bridge.d.ts +0 -20
- package/dist/types/eval/types.d.ts +0 -52
- package/dist/types/exa/factory.d.ts +0 -13
- package/dist/types/exa/index.d.ts +0 -20
- package/dist/types/exa/mcp-client.d.ts +0 -45
- package/dist/types/exa/render.d.ts +0 -19
- package/dist/types/exa/researcher.d.ts +0 -9
- package/dist/types/exa/search.d.ts +0 -9
- package/dist/types/exa/types.d.ts +0 -155
- package/dist/types/exa/websets.d.ts +0 -9
- package/dist/types/exec/bash-executor.d.ts +0 -64
- package/dist/types/exec/exec.d.ts +0 -25
- package/dist/types/exec/idle-timeout-watchdog.d.ts +0 -18
- package/dist/types/exec/non-interactive-env.d.ts +0 -1
- package/dist/types/export/custom-share.d.ts +0 -20
- package/dist/types/export/html/index.d.ts +0 -10
- package/dist/types/export/html/template.generated.d.ts +0 -1
- package/dist/types/export/html/template.macro.d.ts +0 -5
- package/dist/types/export/ttsr.d.ts +0 -55
- package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +0 -9
- package/dist/types/extensibility/custom-commands/index.d.ts +0 -2
- package/dist/types/extensibility/custom-commands/loader.d.ts +0 -29
- package/dist/types/extensibility/custom-commands/types.d.ts +0 -106
- package/dist/types/extensibility/custom-tools/index.d.ts +0 -6
- package/dist/types/extensibility/custom-tools/loader.d.ts +0 -69
- package/dist/types/extensibility/custom-tools/types.d.ts +0 -229
- package/dist/types/extensibility/custom-tools/wrapper.d.ts +0 -24
- package/dist/types/extensibility/extensions/compact-handler.d.ts +0 -26
- package/dist/types/extensibility/extensions/get-commands-handler.d.ts +0 -29
- package/dist/types/extensibility/extensions/index.d.ts +0 -9
- package/dist/types/extensibility/extensions/loader.d.ts +0 -43
- package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +0 -35
- package/dist/types/extensibility/extensions/runner.d.ts +0 -135
- package/dist/types/extensibility/extensions/types.d.ts +0 -918
- package/dist/types/extensibility/extensions/wrapper.d.ts +0 -55
- package/dist/types/extensibility/hooks/index.d.ts +0 -5
- package/dist/types/extensibility/hooks/loader.d.ts +0 -89
- package/dist/types/extensibility/hooks/runner.d.ts +0 -126
- package/dist/types/extensibility/hooks/tool-wrapper.d.ts +0 -25
- package/dist/types/extensibility/hooks/types.d.ts +0 -431
- package/dist/types/extensibility/plugins/doctor.d.ts +0 -3
- package/dist/types/extensibility/plugins/git-url.d.ts +0 -34
- package/dist/types/extensibility/plugins/index.d.ts +0 -8
- package/dist/types/extensibility/plugins/installer.d.ts +0 -5
- package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +0 -2
- package/dist/types/extensibility/plugins/loader.d.ts +0 -31
- package/dist/types/extensibility/plugins/manager.d.ts +0 -65
- package/dist/types/extensibility/plugins/marketplace/cache.d.ts +0 -41
- package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +0 -48
- package/dist/types/extensibility/plugins/marketplace/index.d.ts +0 -6
- package/dist/types/extensibility/plugins/marketplace/manager.d.ts +0 -57
- package/dist/types/extensibility/plugins/marketplace/registry.d.ts +0 -34
- package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +0 -28
- package/dist/types/extensibility/plugins/marketplace/types.d.ts +0 -130
- package/dist/types/extensibility/plugins/parser.d.ts +0 -52
- package/dist/types/extensibility/plugins/security-scanner.d.ts +0 -31
- package/dist/types/extensibility/plugins/types.d.ts +0 -149
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +0 -20
- package/dist/types/extensibility/shared-events.d.ts +0 -281
- package/dist/types/extensibility/skc-plugins/activation.d.ts +0 -14
- package/dist/types/extensibility/skc-plugins/compiler.d.ts +0 -19
- package/dist/types/extensibility/skc-plugins/constrained-hooks.d.ts +0 -29
- package/dist/types/extensibility/skc-plugins/index.d.ts +0 -18
- package/dist/types/extensibility/skc-plugins/injection.d.ts +0 -40
- package/dist/types/extensibility/skc-plugins/installer.d.ts +0 -13
- package/dist/types/extensibility/skc-plugins/loader.d.ts +0 -3
- package/dist/types/extensibility/skc-plugins/mcp-policy.d.ts +0 -26
- package/dist/types/extensibility/skc-plugins/observability.d.ts +0 -27
- package/dist/types/extensibility/skc-plugins/paths.d.ts +0 -8
- package/dist/types/extensibility/skc-plugins/prompt-appendix.d.ts +0 -16
- package/dist/types/extensibility/skc-plugins/registry.d.ts +0 -32
- package/dist/types/extensibility/skc-plugins/runtime-adapters.d.ts +0 -64
- package/dist/types/extensibility/skc-plugins/schema.d.ts +0 -3
- package/dist/types/extensibility/skc-plugins/session-validation.d.ts +0 -42
- package/dist/types/extensibility/skc-plugins/state.d.ts +0 -9
- package/dist/types/extensibility/skc-plugins/tools.d.ts +0 -8
- package/dist/types/extensibility/skc-plugins/types.d.ts +0 -220
- package/dist/types/extensibility/skc-plugins/validation.d.ts +0 -11
- package/dist/types/extensibility/skills.d.ts +0 -82
- package/dist/types/extensibility/slash-commands.d.ts +0 -48
- package/dist/types/extensibility/tool-proxy.d.ts +0 -4
- package/dist/types/extensibility/typebox.d.ts +0 -155
- package/dist/types/extensibility/utils.d.ts +0 -12
- package/dist/types/goals/index.d.ts +0 -3
- package/dist/types/goals/runtime.d.ts +0 -63
- package/dist/types/goals/state.d.ts +0 -32
- package/dist/types/goals/tools/goal-tool.d.ts +0 -62
- package/dist/types/harness-control-plane/classifier.d.ts +0 -13
- package/dist/types/harness-control-plane/control-endpoint.d.ts +0 -31
- package/dist/types/harness-control-plane/finalize.d.ts +0 -60
- package/dist/types/harness-control-plane/gc-adapter.d.ts +0 -3
- package/dist/types/harness-control-plane/operate.d.ts +0 -35
- package/dist/types/harness-control-plane/owner.d.ts +0 -53
- package/dist/types/harness-control-plane/phase-rollup.d.ts +0 -23
- package/dist/types/harness-control-plane/preserve.d.ts +0 -19
- package/dist/types/harness-control-plane/receipt-ingest.d.ts +0 -19
- package/dist/types/harness-control-plane/receipt-spool.d.ts +0 -19
- package/dist/types/harness-control-plane/receipts.d.ts +0 -149
- package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
- package/dist/types/harness-control-plane/seams.d.ts +0 -21
- package/dist/types/harness-control-plane/session-lease.d.ts +0 -65
- package/dist/types/harness-control-plane/state-machine.d.ts +0 -24
- package/dist/types/harness-control-plane/storage.d.ts +0 -81
- package/dist/types/harness-control-plane/types.d.ts +0 -187
- package/dist/types/hashline/anchors.d.ts +0 -20
- package/dist/types/hashline/apply.d.ts +0 -14
- package/dist/types/hashline/constants.d.ts +0 -19
- package/dist/types/hashline/diff-preview.d.ts +0 -2
- package/dist/types/hashline/diff.d.ts +0 -17
- package/dist/types/hashline/execute.d.ts +0 -4
- package/dist/types/hashline/hash.d.ts +0 -123
- package/dist/types/hashline/index.d.ts +0 -13
- package/dist/types/hashline/input.d.ts +0 -11
- package/dist/types/hashline/parser.d.ts +0 -7
- package/dist/types/hashline/prefixes.d.ts +0 -7
- package/dist/types/hashline/recovery.d.ts +0 -27
- package/dist/types/hashline/stream.d.ts +0 -2
- package/dist/types/hashline/types.d.ts +0 -77
- package/dist/types/hindsight/backend.d.ts +0 -13
- package/dist/types/hindsight/bank.d.ts +0 -54
- package/dist/types/hindsight/client.d.ts +0 -224
- package/dist/types/hindsight/config.d.ts +0 -51
- package/dist/types/hindsight/content.d.ts +0 -70
- package/dist/types/hindsight/index.d.ts +0 -8
- package/dist/types/hindsight/mental-models.d.ts +0 -125
- package/dist/types/hindsight/state.d.ts +0 -99
- package/dist/types/hindsight/transcript.d.ts +0 -28
- package/dist/types/hooks/codex-native-hooks-config.d.ts +0 -29
- package/dist/types/hooks/native-skill-hook.d.ts +0 -28
- package/dist/types/hooks/skill-keywords.d.ts +0 -18
- package/dist/types/hooks/skill-state.d.ts +0 -93
- package/dist/types/i18n/index.d.ts +0 -38
- package/dist/types/i18n/messages/de.d.ts +0 -2
- package/dist/types/i18n/messages/de.messages.d.ts +0 -1
- package/dist/types/i18n/messages/de.settings.d.ts +0 -1
- package/dist/types/i18n/messages/en.d.ts +0 -81
- package/dist/types/i18n/messages/es.d.ts +0 -2
- package/dist/types/i18n/messages/es.messages.d.ts +0 -1
- package/dist/types/i18n/messages/es.settings.d.ts +0 -1
- package/dist/types/i18n/messages/fr.d.ts +0 -2
- package/dist/types/i18n/messages/fr.messages.d.ts +0 -1
- package/dist/types/i18n/messages/fr.settings.d.ts +0 -1
- package/dist/types/i18n/messages/ja.d.ts +0 -2
- package/dist/types/i18n/messages/ja.messages.d.ts +0 -1
- package/dist/types/i18n/messages/ja.settings.d.ts +0 -1
- package/dist/types/i18n/messages/ko.d.ts +0 -2
- package/dist/types/i18n/messages/ko.messages.d.ts +0 -1
- package/dist/types/i18n/messages/ko.settings.d.ts +0 -1
- package/dist/types/i18n/messages/zh.d.ts +0 -2
- package/dist/types/i18n/messages/zh.messages.d.ts +0 -1
- package/dist/types/i18n/messages/zh.settings.d.ts +0 -1
- package/dist/types/index.d.ts +0 -33
- package/dist/types/internal-urls/agent-protocol.d.ts +0 -12
- package/dist/types/internal-urls/artifact-protocol.d.ts +0 -6
- package/dist/types/internal-urls/docs-index.generated.d.ts +0 -2
- package/dist/types/internal-urls/index.d.ts +0 -20
- package/dist/types/internal-urls/issue-pr-protocol.d.ts +0 -17
- package/dist/types/internal-urls/json-query.d.ts +0 -30
- package/dist/types/internal-urls/local-protocol.d.ts +0 -39
- package/dist/types/internal-urls/mcp-protocol.d.ts +0 -12
- package/dist/types/internal-urls/memory-protocol.d.ts +0 -23
- package/dist/types/internal-urls/parse.d.ts +0 -19
- package/dist/types/internal-urls/registry-helpers.d.ts +0 -11
- package/dist/types/internal-urls/router.d.ts +0 -14
- package/dist/types/internal-urls/rule-protocol.d.ts +0 -6
- package/dist/types/internal-urls/skc-protocol.d.ts +0 -12
- package/dist/types/internal-urls/skill-protocol.d.ts +0 -13
- package/dist/types/internal-urls/types.d.ts +0 -109
- package/dist/types/lsp/client.d.ts +0 -66
- package/dist/types/lsp/clients/biome-client.d.ts +0 -16
- package/dist/types/lsp/clients/index.d.ts +0 -19
- package/dist/types/lsp/clients/lsp-linter-client.d.ts +0 -16
- package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -20
- package/dist/types/lsp/config.d.ts +0 -65
- package/dist/types/lsp/edits.d.ts +0 -23
- package/dist/types/lsp/index.d.ts +0 -130
- package/dist/types/lsp/lspmux.d.ts +0 -58
- package/dist/types/lsp/render.d.ts +0 -32
- package/dist/types/lsp/startup-events.d.ts +0 -12
- package/dist/types/lsp/types.d.ts +0 -306
- package/dist/types/lsp/utils.d.ts +0 -108
- package/dist/types/main.d.ts +0 -75
- package/dist/types/memories/index.d.ts +0 -28
- package/dist/types/memories/storage.d.ts +0 -110
- package/dist/types/memory-backend/index.d.ts +0 -4
- package/dist/types/memory-backend/local-backend.d.ts +0 -9
- package/dist/types/memory-backend/off-backend.d.ts +0 -7
- package/dist/types/memory-backend/resolve.d.ts +0 -15
- package/dist/types/memory-backend/types.d.ts +0 -61
- package/dist/types/migrate/action-planner.d.ts +0 -11
- package/dist/types/migrate/adapters/claude-code.d.ts +0 -2
- package/dist/types/migrate/adapters/codex.d.ts +0 -5
- package/dist/types/migrate/adapters/index.d.ts +0 -45
- package/dist/types/migrate/adapters/opencode.d.ts +0 -2
- package/dist/types/migrate/executor.d.ts +0 -2
- package/dist/types/migrate/mcp-mapper.d.ts +0 -20
- package/dist/types/migrate/report.d.ts +0 -18
- package/dist/types/migrate/skill-normalizer.d.ts +0 -27
- package/dist/types/migrate/types.d.ts +0 -126
- package/dist/types/modes/acp/acp-agent.d.ts +0 -61
- package/dist/types/modes/acp/acp-client-bridge.d.ts +0 -9
- package/dist/types/modes/acp/acp-event-mapper.d.ts +0 -36
- package/dist/types/modes/acp/acp-mode.d.ts +0 -5
- package/dist/types/modes/acp/index.d.ts +0 -2
- package/dist/types/modes/acp/terminal-auth.d.ts +0 -6
- package/dist/types/modes/bridge/auth.d.ts +0 -12
- package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
- package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
- package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
- package/dist/types/modes/bridge/event-stream.d.ts +0 -8
- package/dist/types/modes/components/agent-dashboard.d.ts +0 -21
- package/dist/types/modes/components/assistant-message.d.ts +0 -20
- package/dist/types/modes/components/bash-execution.d.ts +0 -29
- package/dist/types/modes/components/bordered-loader.d.ts +0 -11
- package/dist/types/modes/components/branch-summary-message.d.ts +0 -13
- package/dist/types/modes/components/btw-panel.d.ts +0 -16
- package/dist/types/modes/components/compaction-summary-message.d.ts +0 -13
- package/dist/types/modes/components/countdown-timer.d.ts +0 -14
- package/dist/types/modes/components/custom-editor.d.ts +0 -67
- package/dist/types/modes/components/custom-message.d.ts +0 -15
- package/dist/types/modes/components/custom-model-preset-wizard.d.ts +0 -12
- package/dist/types/modes/components/custom-provider-wizard.d.ts +0 -10
- package/dist/types/modes/components/diff.d.ts +0 -11
- package/dist/types/modes/components/dynamic-border.d.ts +0 -14
- package/dist/types/modes/components/eval-execution.d.ts +0 -23
- package/dist/types/modes/components/execution-shared.d.ts +0 -46
- package/dist/types/modes/components/extensions/extension-dashboard.d.ts +0 -26
- package/dist/types/modes/components/extensions/extension-list.d.ts +0 -39
- package/dist/types/modes/components/extensions/index.d.ts +0 -8
- package/dist/types/modes/components/extensions/inspector-panel.d.ts +0 -8
- package/dist/types/modes/components/extensions/state-manager.d.ts +0 -50
- package/dist/types/modes/components/extensions/types.d.ts +0 -151
- package/dist/types/modes/components/footer.d.ts +0 -30
- package/dist/types/modes/components/history-search.d.ts +0 -7
- package/dist/types/modes/components/hook-editor.d.ts +0 -18
- package/dist/types/modes/components/hook-input.d.ts +0 -15
- package/dist/types/modes/components/hook-message.d.ts +0 -15
- package/dist/types/modes/components/hook-selector.d.ts +0 -54
- package/dist/types/modes/components/index.d.ts +0 -35
- package/dist/types/modes/components/jobs-overlay-model.d.ts +0 -31
- package/dist/types/modes/components/jobs-overlay.d.ts +0 -30
- package/dist/types/modes/components/keybinding-hints.d.ts +0 -40
- package/dist/types/modes/components/login-dialog.d.ts +0 -32
- package/dist/types/modes/components/message-frame.d.ts +0 -42
- package/dist/types/modes/components/model-selector.d.ts +0 -60
- package/dist/types/modes/components/oauth-selector.d.ts +0 -17
- package/dist/types/modes/components/plugin-selector.d.ts +0 -26
- package/dist/types/modes/components/plugin-settings.d.ts +0 -66
- package/dist/types/modes/components/provider-onboarding-selector.d.ts +0 -7
- package/dist/types/modes/components/queue-mode-selector.d.ts +0 -9
- package/dist/types/modes/components/queued-message-selector.d.ts +0 -12
- package/dist/types/modes/components/read-tool-group.d.ts +0 -30
- package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +0 -26
- package/dist/types/modes/components/session-observer-overlay.d.ts +0 -11
- package/dist/types/modes/components/session-selector.d.ts +0 -30
- package/dist/types/modes/components/settings-defs.d.ts +0 -50
- package/dist/types/modes/components/settings-selector.d.ts +0 -62
- package/dist/types/modes/components/show-images-selector.d.ts +0 -9
- package/dist/types/modes/components/skill-hud/render.d.ts +0 -2
- package/dist/types/modes/components/skill-message.d.ts +0 -10
- package/dist/types/modes/components/status-line/context-thresholds.d.ts +0 -4
- package/dist/types/modes/components/status-line/git-utils.d.ts +0 -28
- package/dist/types/modes/components/status-line/index.d.ts +0 -4
- package/dist/types/modes/components/status-line/presets.d.ts +0 -3
- package/dist/types/modes/components/status-line/segments.d.ts +0 -5
- package/dist/types/modes/components/status-line/separators.d.ts +0 -3
- package/dist/types/modes/components/status-line/token-rate.d.ts +0 -10
- package/dist/types/modes/components/status-line/types.d.ts +0 -83
- package/dist/types/modes/components/status-line.d.ts +0 -104
- package/dist/types/modes/components/theme-selector.d.ts +0 -10
- package/dist/types/modes/components/thinking-selector.d.ts +0 -15
- package/dist/types/modes/components/todo-reminder.d.ts +0 -13
- package/dist/types/modes/components/tool-execution.d.ts +0 -54
- package/dist/types/modes/components/tree-selector.d.ts +0 -31
- package/dist/types/modes/components/ttsr-notification.d.ts +0 -13
- package/dist/types/modes/components/two-column-body.d.ts +0 -9
- package/dist/types/modes/components/user-message-selector.d.ts +0 -28
- package/dist/types/modes/components/user-message.d.ts +0 -7
- package/dist/types/modes/components/visual-truncate.d.ts +0 -19
- package/dist/types/modes/components/welcome.d.ts +0 -46
- package/dist/types/modes/controllers/btw-controller.d.ts +0 -10
- package/dist/types/modes/controllers/command-controller-shared.d.ts +0 -47
- package/dist/types/modes/controllers/command-controller.d.ts +0 -40
- package/dist/types/modes/controllers/event-controller.d.ts +0 -17
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +0 -80
- package/dist/types/modes/controllers/input-controller.d.ts +0 -42
- package/dist/types/modes/controllers/runtime-mcp-command-controller.d.ts +0 -10
- package/dist/types/modes/controllers/selector-controller.d.ts +0 -67
- package/dist/types/modes/controllers/ssh-command-controller.d.ts +0 -10
- package/dist/types/modes/controllers/todo-command-controller.d.ts +0 -7
- package/dist/types/modes/emoji-autocomplete.d.ts +0 -16
- package/dist/types/modes/index.d.ts +0 -10
- package/dist/types/modes/interactive-mode.d.ts +0 -275
- package/dist/types/modes/jobs-observer.d.ts +0 -57
- package/dist/types/modes/oauth-manual-input.d.ts +0 -8
- package/dist/types/modes/print-mode.d.ts +0 -45
- package/dist/types/modes/prompt-action-autocomplete.d.ts +0 -50
- package/dist/types/modes/rpc/host-tools.d.ts +0 -1
- package/dist/types/modes/rpc/host-uris.d.ts +0 -1
- package/dist/types/modes/rpc/rpc-client.d.ts +0 -293
- package/dist/types/modes/rpc/rpc-mode.d.ts +0 -85
- package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
- package/dist/types/modes/rpc/rpc-types.d.ts +0 -794
- package/dist/types/modes/runtime-init.d.ts +0 -21
- package/dist/types/modes/session-observer-registry.d.ts +0 -26
- package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +0 -57
- package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
- package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
- package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +0 -94
- package/dist/types/modes/shared/agent-wire/event-contract.d.ts +0 -103
- package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +0 -60
- package/dist/types/modes/shared/agent-wire/event-observation.d.ts +0 -37
- package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
- package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
- package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
- package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
- package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
- package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
- package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
- package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
- package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -161
- package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -82
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +0 -114
- package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +0 -39
- package/dist/types/modes/shared.d.ts +0 -15
- package/dist/types/modes/slash-command-visibility.d.ts +0 -1
- package/dist/types/modes/theme/defaults/index.d.ts +0 -652
- package/dist/types/modes/theme/mermaid-cache.d.ts +0 -9
- package/dist/types/modes/theme/shimmer.d.ts +0 -38
- package/dist/types/modes/theme/theme.d.ts +0 -275
- package/dist/types/modes/tmux-scroll.d.ts +0 -18
- package/dist/types/modes/types.d.ts +0 -292
- package/dist/types/modes/utils/abort-message.d.ts +0 -4
- package/dist/types/modes/utils/context-usage.d.ts +0 -51
- package/dist/types/modes/utils/hotkeys-markdown.d.ts +0 -5
- package/dist/types/modes/utils/injected-user-submission.d.ts +0 -52
- package/dist/types/modes/utils/keybinding-matchers.d.ts +0 -10
- package/dist/types/modes/utils/terminal-bell.d.ts +0 -3
- package/dist/types/modes/utils/tools-markdown.d.ts +0 -5
- package/dist/types/modes/utils/ui-helpers.d.ts +0 -66
- package/dist/types/notifications/attachment-registry.d.ts +0 -17
- package/dist/types/notifications/chat-adapters.d.ts +0 -9
- package/dist/types/notifications/config-commands.d.ts +0 -64
- package/dist/types/notifications/config.d.ts +0 -98
- package/dist/types/notifications/daemon-paths.d.ts +0 -10
- package/dist/types/notifications/engine.d.ts +0 -59
- package/dist/types/notifications/helpers.d.ts +0 -55
- package/dist/types/notifications/html-format.d.ts +0 -75
- package/dist/types/notifications/index.d.ts +0 -192
- package/dist/types/notifications/lifecycle-commands.d.ts +0 -69
- package/dist/types/notifications/lifecycle-control-runtime.d.ts +0 -99
- package/dist/types/notifications/lifecycle-orchestrator.d.ts +0 -144
- package/dist/types/notifications/managed-daemon.d.ts +0 -48
- package/dist/types/notifications/operator-runtime.d.ts +0 -52
- package/dist/types/notifications/rate-limit-pool.d.ts +0 -95
- package/dist/types/notifications/recent-activity.d.ts +0 -39
- package/dist/types/notifications/reply-sent-store.d.ts +0 -53
- package/dist/types/notifications/rich-draft.d.ts +0 -68
- package/dist/types/notifications/rich-render.d.ts +0 -90
- package/dist/types/notifications/telegram-cli.d.ts +0 -19
- package/dist/types/notifications/telegram-daemon-cli.d.ts +0 -28
- package/dist/types/notifications/telegram-daemon-control.d.ts +0 -64
- package/dist/types/notifications/telegram-daemon.d.ts +0 -431
- package/dist/types/notifications/telegram-reference.d.ts +0 -119
- package/dist/types/notifications/threaded-inbound.d.ts +0 -77
- package/dist/types/notifications/threaded-render.d.ts +0 -88
- package/dist/types/notifications/topic-registry.d.ts +0 -69
- package/dist/types/plan-mode/approved-plan.d.ts +0 -49
- package/dist/types/plan-mode/state.d.ts +0 -6
- package/dist/types/registry/agent-registry.d.ts +0 -62
- package/dist/types/reminders/star-reminder.d.ts +0 -115
- package/dist/types/research-plan/index.d.ts +0 -1
- package/dist/types/research-plan/ledger.d.ts +0 -33
- package/dist/types/rlm/artifacts.d.ts +0 -9
- package/dist/types/rlm/complete-research-tool.d.ts +0 -35
- package/dist/types/rlm/data-context.d.ts +0 -6
- package/dist/types/rlm/index.d.ts +0 -47
- package/dist/types/rlm/notebook.d.ts +0 -12
- package/dist/types/rlm/preset.d.ts +0 -23
- package/dist/types/rlm/python-tool.d.ts +0 -16
- package/dist/types/rlm/report.d.ts +0 -14
- package/dist/types/rlm/types.d.ts +0 -37
- package/dist/types/runtime/process-lifecycle.d.ts +0 -108
- package/dist/types/runtime-api-key.d.ts +0 -7
- package/dist/types/runtime-credential-selector.d.ts +0 -7
- package/dist/types/runtime-mcp/client.d.ts +0 -74
- package/dist/types/runtime-mcp/config-writer.d.ts +0 -89
- package/dist/types/runtime-mcp/config.d.ts +0 -77
- package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +0 -7
- package/dist/types/runtime-mcp/index.d.ts +0 -18
- package/dist/types/runtime-mcp/json-rpc.d.ts +0 -22
- package/dist/types/runtime-mcp/loader.d.ts +0 -45
- package/dist/types/runtime-mcp/manager.d.ts +0 -195
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +0 -40
- package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -59
- package/dist/types/runtime-mcp/render.d.ts +0 -25
- package/dist/types/runtime-mcp/smithery-auth.d.ts +0 -16
- package/dist/types/runtime-mcp/smithery-connect.d.ts +0 -38
- package/dist/types/runtime-mcp/smithery-registry.d.ts +0 -51
- package/dist/types/runtime-mcp/tool-bridge.d.ts +0 -86
- package/dist/types/runtime-mcp/tool-cache.d.ts +0 -8
- package/dist/types/runtime-mcp/transports/http.d.ts +0 -36
- package/dist/types/runtime-mcp/transports/index.d.ts +0 -5
- package/dist/types/runtime-mcp/transports/stdio.d.ts +0 -29
- package/dist/types/runtime-mcp/types.d.ts +0 -349
- package/dist/types/sdk.d.ts +0 -254
- package/dist/types/secrets/index.d.ts +0 -9
- package/dist/types/secrets/obfuscator.d.ts +0 -23
- package/dist/types/secrets/regex.d.ts +0 -2
- package/dist/types/session/agent-session.d.ts +0 -1201
- package/dist/types/session/agent-storage.d.ts +0 -101
- package/dist/types/session/artifacts.d.ts +0 -64
- package/dist/types/session/auth-broker-config.d.ts +0 -13
- package/dist/types/session/auth-storage.d.ts +0 -6
- package/dist/types/session/blob-store.d.ts +0 -160
- package/dist/types/session/client-bridge.d.ts +0 -88
- package/dist/types/session/contribution-prep.d.ts +0 -47
- package/dist/types/session/file-mention-pruning.d.ts +0 -8
- package/dist/types/session/history-storage.d.ts +0 -16
- package/dist/types/session/messages.d.ts +0 -169
- package/dist/types/session/session-dump-format.d.ts +0 -22
- package/dist/types/session/session-manager.d.ts +0 -661
- package/dist/types/session/session-storage.d.ts +0 -88
- package/dist/types/session/streaming-output.d.ts +0 -209
- package/dist/types/session/tool-choice-queue.d.ts +0 -84
- package/dist/types/session/yield-queue.d.ts +0 -24
- package/dist/types/setup/credential-auto-import.d.ts +0 -63
- package/dist/types/setup/credential-import.d.ts +0 -82
- package/dist/types/setup/hermes-setup.d.ts +0 -78
- package/dist/types/setup/host-plugin-setup.d.ts +0 -39
- package/dist/types/setup/model-onboarding-guidance.d.ts +0 -9
- package/dist/types/setup/provider-onboarding.d.ts +0 -52
- package/dist/types/skc-runtime/cli-write-receipt.d.ts +0 -24
- package/dist/types/skc-runtime/deep-interview-ambiguity.d.ts +0 -39
- package/dist/types/skc-runtime/deep-interview-recorder.d.ts +0 -114
- package/dist/types/skc-runtime/deep-interview-runtime.d.ts +0 -36
- package/dist/types/skc-runtime/deep-interview-state.d.ts +0 -127
- package/dist/types/skc-runtime/gc-render.d.ts +0 -6
- package/dist/types/skc-runtime/gc-runtime.d.ts +0 -134
- package/dist/types/skc-runtime/goal-mode-request.d.ts +0 -53
- package/dist/types/skc-runtime/launch-tmux.d.ts +0 -78
- package/dist/types/skc-runtime/launch-worktree.d.ts +0 -46
- package/dist/types/skc-runtime/ledger-event-renderer.d.ts +0 -68
- package/dist/types/skc-runtime/psmux-detect.d.ts +0 -78
- package/dist/types/skc-runtime/ralplan-runtime.d.ts +0 -26
- package/dist/types/skc-runtime/restricted-role-agent-bash.d.ts +0 -3
- package/dist/types/skc-runtime/session-layout.d.ts +0 -59
- package/dist/types/skc-runtime/session-resolution.d.ts +0 -47
- package/dist/types/skc-runtime/session-state-sidecar.d.ts +0 -39
- package/dist/types/skc-runtime/state-graph.d.ts +0 -4
- package/dist/types/skc-runtime/state-migrations.d.ts +0 -33
- package/dist/types/skc-runtime/state-renderer.d.ts +0 -70
- package/dist/types/skc-runtime/state-runtime.d.ts +0 -38
- package/dist/types/skc-runtime/state-schema.d.ts +0 -319
- package/dist/types/skc-runtime/state-validation.d.ts +0 -6
- package/dist/types/skc-runtime/state-writer.d.ts +0 -244
- package/dist/types/skc-runtime/team-gc.d.ts +0 -7
- package/dist/types/skc-runtime/team-runtime.d.ts +0 -355
- package/dist/types/skc-runtime/tmux-common.d.ts +0 -105
- package/dist/types/skc-runtime/tmux-gc.d.ts +0 -7
- package/dist/types/skc-runtime/tmux-sessions.d.ts +0 -62
- package/dist/types/skc-runtime/ultragoal-guard.d.ts +0 -93
- package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +0 -42
- package/dist/types/skc-runtime/ultragoal-runtime.d.ts +0 -410
- package/dist/types/skc-runtime/workflow-command-ref.d.ts +0 -43
- package/dist/types/skc-runtime/workflow-manifest.d.ts +0 -54
- package/dist/types/skill-state/active-state.d.ts +0 -126
- package/dist/types/skill-state/canonical-skills.d.ts +0 -3
- package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +0 -38
- package/dist/types/skill-state/initial-phase.d.ts +0 -12
- package/dist/types/skill-state/workflow-hud.d.ts +0 -83
- package/dist/types/skill-state/workflow-state-contract.d.ts +0 -57
- package/dist/types/skill-state/workflow-state-version.d.ts +0 -3
- package/dist/types/slash-commands/acp-builtins.d.ts +0 -18
- package/dist/types/slash-commands/builtin-registry.d.ts +0 -24
- package/dist/types/slash-commands/helpers/context-report.d.ts +0 -7
- package/dist/types/slash-commands/helpers/fast-status-report.d.ts +0 -82
- package/dist/types/slash-commands/helpers/format.d.ts +0 -10
- package/dist/types/slash-commands/helpers/mcp.d.ts +0 -3
- package/dist/types/slash-commands/helpers/parse.d.ts +0 -33
- package/dist/types/slash-commands/helpers/ssh.d.ts +0 -3
- package/dist/types/slash-commands/helpers/todo.d.ts +0 -3
- package/dist/types/slash-commands/helpers/usage-report.d.ts +0 -7
- package/dist/types/slash-commands/types.d.ts +0 -120
- package/dist/types/ssh/config-writer.d.ts +0 -49
- package/dist/types/ssh/connection-manager.d.ts +0 -33
- package/dist/types/ssh/ssh-executor.d.ts +0 -37
- package/dist/types/ssh/sshfs-mount.d.ts +0 -6
- package/dist/types/ssh/utils.d.ts +0 -2
- package/dist/types/stt/downloader.d.ts +0 -9
- package/dist/types/stt/index.d.ts +0 -3
- package/dist/types/stt/recorder.d.ts +0 -13
- package/dist/types/stt/setup.d.ts +0 -18
- package/dist/types/stt/stt-controller.d.ts +0 -16
- package/dist/types/stt/transcriber.d.ts +0 -16
- package/dist/types/system-prompt.d.ts +0 -118
- package/dist/types/task/agents.d.ts +0 -28
- package/dist/types/task/commands.d.ts +0 -35
- package/dist/types/task/discovery.d.ts +0 -19
- package/dist/types/task/executor.d.ts +0 -124
- package/dist/types/task/fork-context-advisory.d.ts +0 -13
- package/dist/types/task/fork-context-budget.d.ts +0 -7
- package/dist/types/task/id.d.ts +0 -7
- package/dist/types/task/index.d.ts +0 -43
- package/dist/types/task/name-generator.d.ts +0 -16
- package/dist/types/task/output-manager.d.ts +0 -36
- package/dist/types/task/parallel.d.ts +0 -34
- package/dist/types/task/receipt.d.ts +0 -87
- package/dist/types/task/render.d.ts +0 -28
- package/dist/types/task/roi-reconciliation.d.ts +0 -27
- package/dist/types/task/simple-mode.d.ts +0 -8
- package/dist/types/task/skc-command.d.ts +0 -7
- package/dist/types/task/spawn-gate.d.ts +0 -29
- package/dist/types/task/subprocess-tool-registry.d.ts +0 -72
- package/dist/types/task/token-log.d.ts +0 -30
- package/dist/types/task/token-log.test.d.ts +0 -1
- package/dist/types/task/types.d.ts +0 -508
- package/dist/types/task/worktree.d.ts +0 -94
- package/dist/types/thinking-metadata.d.ts +0 -16
- package/dist/types/thinking.d.ts +0 -22
- package/dist/types/tool-discovery/tool-index.d.ts +0 -112
- package/dist/types/tools/archive-reader.d.ts +0 -40
- package/dist/types/tools/ask-answer-registry.d.ts +0 -13
- package/dist/types/tools/ask.d.ts +0 -123
- package/dist/types/tools/ast-edit.d.ts +0 -77
- package/dist/types/tools/ast-grep.d.ts +0 -69
- package/dist/types/tools/auto-generated-guard.d.ts +0 -17
- package/dist/types/tools/bash-allowed-prefixes.d.ts +0 -10
- package/dist/types/tools/bash-command-fixup.d.ts +0 -11
- package/dist/types/tools/bash-interactive.d.ts +0 -16
- package/dist/types/tools/bash-interceptor.d.ts +0 -24
- package/dist/types/tools/bash-pty-selection.d.ts +0 -7
- package/dist/types/tools/bash-skill-urls.d.ts +0 -31
- package/dist/types/tools/bash.d.ts +0 -157
- package/dist/types/tools/bisect.d.ts +0 -81
- package/dist/types/tools/browser/actions.d.ts +0 -54
- package/dist/types/tools/browser/attach.d.ts +0 -50
- package/dist/types/tools/browser/launch.d.ts +0 -62
- package/dist/types/tools/browser/readable.d.ts +0 -17
- package/dist/types/tools/browser/registry.d.ts +0 -57
- package/dist/types/tools/browser/render.d.ts +0 -53
- package/dist/types/tools/browser/tab-protocol.d.ts +0 -144
- package/dist/types/tools/browser/tab-supervisor.d.ts +0 -103
- package/dist/types/tools/browser/tab-worker-entry.d.ts +0 -1
- package/dist/types/tools/browser/tab-worker.d.ts +0 -19
- package/dist/types/tools/browser.d.ts +0 -211
- package/dist/types/tools/calculator.d.ts +0 -76
- package/dist/types/tools/checkpoint.d.ts +0 -63
- package/dist/types/tools/composer-bash-policy.d.ts +0 -14
- package/dist/types/tools/computer/render.d.ts +0 -17
- package/dist/types/tools/computer-gc.d.ts +0 -23
- package/dist/types/tools/computer.d.ts +0 -465
- package/dist/types/tools/conflict-detect.d.ts +0 -205
- package/dist/types/tools/context.d.ts +0 -19
- package/dist/types/tools/cron.d.ts +0 -91
- package/dist/types/tools/debug.d.ts +0 -209
- package/dist/types/tools/eval.d.ts +0 -108
- package/dist/types/tools/fetch.d.ts +0 -84
- package/dist/types/tools/file-recorder.d.ts +0 -13
- package/dist/types/tools/find.d.ts +0 -95
- package/dist/types/tools/fs-cache-invalidation.d.ts +0 -15
- package/dist/types/tools/gh-format.d.ts +0 -6
- package/dist/types/tools/gh-renderer.d.ts +0 -25
- package/dist/types/tools/gh.d.ts +0 -356
- package/dist/types/tools/github-cache.d.ts +0 -103
- package/dist/types/tools/grouped-file-output.d.ts +0 -36
- package/dist/types/tools/hindsight-recall.d.ts +0 -21
- package/dist/types/tools/hindsight-reflect.d.ts +0 -23
- package/dist/types/tools/hindsight-retain.d.ts +0 -27
- package/dist/types/tools/image-gen.d.ts +0 -79
- package/dist/types/tools/index.d.ts +0 -319
- package/dist/types/tools/irc.d.ts +0 -79
- package/dist/types/tools/job.d.ts +0 -78
- package/dist/types/tools/json-tree.d.ts +0 -23
- package/dist/types/tools/jtd-to-json-schema.d.ts +0 -29
- package/dist/types/tools/jtd-to-typescript.d.ts +0 -26
- package/dist/types/tools/jtd-utils.d.ts +0 -42
- package/dist/types/tools/list-limit.d.ts +0 -12
- package/dist/types/tools/match-line-format.d.ts +0 -11
- package/dist/types/tools/monitor.d.ts +0 -54
- package/dist/types/tools/output-meta.d.ts +0 -204
- package/dist/types/tools/path-utils.d.ts +0 -147
- package/dist/types/tools/plan-mode-guard.d.ts +0 -18
- package/dist/types/tools/read.d.ts +0 -85
- package/dist/types/tools/recipe/index.d.ts +0 -45
- package/dist/types/tools/recipe/render.d.ts +0 -36
- package/dist/types/tools/recipe/runner.d.ts +0 -60
- package/dist/types/tools/recipe/runners/cargo.d.ts +0 -16
- package/dist/types/tools/recipe/runners/index.d.ts +0 -2
- package/dist/types/tools/recipe/runners/just.d.ts +0 -2
- package/dist/types/tools/recipe/runners/make.d.ts +0 -2
- package/dist/types/tools/recipe/runners/pkg.d.ts +0 -2
- package/dist/types/tools/recipe/runners/task.d.ts +0 -2
- package/dist/types/tools/render-mermaid.d.ts +0 -37
- package/dist/types/tools/render-utils.d.ts +0 -158
- package/dist/types/tools/renderers.d.ts +0 -26
- package/dist/types/tools/resolve.d.ts +0 -80
- package/dist/types/tools/resource-gc.d.ts +0 -54
- package/dist/types/tools/review.d.ts +0 -63
- package/dist/types/tools/search-tool-bm25.d.ts +0 -65
- package/dist/types/tools/search.d.ts +0 -93
- package/dist/types/tools/skill-discovery.d.ts +0 -40
- package/dist/types/tools/skill.d.ts +0 -48
- package/dist/types/tools/sqlite-reader.d.ts +0 -94
- package/dist/types/tools/ssh.d.ts +0 -67
- package/dist/types/tools/subagent-render.d.ts +0 -31
- package/dist/types/tools/subagent.d.ts +0 -117
- package/dist/types/tools/telegram-send.d.ts +0 -32
- package/dist/types/tools/todo-write.d.ts +0 -120
- package/dist/types/tools/tool-errors.d.ts +0 -33
- package/dist/types/tools/tool-result.d.ts +0 -30
- package/dist/types/tools/tool-timeouts.d.ts +0 -56
- package/dist/types/tools/ultragoal-ask-guard.d.ts +0 -12
- package/dist/types/tools/vim.d.ts +0 -58
- package/dist/types/tools/write.d.ts +0 -59
- package/dist/types/tools/yield.d.ts +0 -25
- package/dist/types/tui/code-cell.d.ts +0 -32
- package/dist/types/tui/file-list.d.ts +0 -22
- package/dist/types/tui/hyperlink.d.ts +0 -42
- package/dist/types/tui/index.d.ts +0 -11
- package/dist/types/tui/output-block.d.ts +0 -28
- package/dist/types/tui/status-line.d.ts +0 -18
- package/dist/types/tui/tree-list.d.ts +0 -19
- package/dist/types/tui/types.d.ts +0 -13
- package/dist/types/tui/utils.d.ts +0 -36
- package/dist/types/utils/changelog.d.ts +0 -37
- package/dist/types/utils/clipboard.d.ts +0 -22
- package/dist/types/utils/cmux-workspace.d.ts +0 -52
- package/dist/types/utils/command-args.d.ts +0 -9
- package/dist/types/utils/commit-message-generator.d.ts +0 -7
- package/dist/types/utils/edit-mode.d.ts +0 -13
- package/dist/types/utils/event-bus.d.ts +0 -6
- package/dist/types/utils/external-editor.d.ts +0 -17
- package/dist/types/utils/file-display-mode.d.ts +0 -27
- package/dist/types/utils/file-mentions.d.ts +0 -25
- package/dist/types/utils/git.d.ts +0 -393
- package/dist/types/utils/image-loading.d.ts +0 -26
- package/dist/types/utils/image-resize.d.ts +0 -39
- package/dist/types/utils/lang-from-path.d.ts +0 -8
- package/dist/types/utils/linkedom.d.ts +0 -4
- package/dist/types/utils/markit.d.ts +0 -7
- package/dist/types/utils/open.d.ts +0 -2
- package/dist/types/utils/pasted-image-path.d.ts +0 -32
- package/dist/types/utils/session-color.d.ts +0 -10
- package/dist/types/utils/shell-snapshot.d.ts +0 -5
- package/dist/types/utils/sixel.d.ts +0 -21
- package/dist/types/utils/title-generator.d.ts +0 -31
- package/dist/types/utils/tool-choice.d.ts +0 -20
- package/dist/types/utils/tools-manager.d.ts +0 -9
- package/dist/types/vim/buffer.d.ts +0 -41
- package/dist/types/vim/commands.d.ts +0 -6
- package/dist/types/vim/engine.d.ts +0 -47
- package/dist/types/vim/parser.d.ts +0 -3
- package/dist/types/vim/render.d.ts +0 -25
- package/dist/types/vim/types.d.ts +0 -182
- package/dist/types/web/insane/bridge.d.ts +0 -103
- package/dist/types/web/insane/url-guard.d.ts +0 -25
- package/dist/types/web/kagi.d.ts +0 -23
- package/dist/types/web/parallel.d.ts +0 -58
- package/dist/types/web/scrapers/artifacthub.d.ts +0 -6
- package/dist/types/web/scrapers/arxiv.d.ts +0 -5
- package/dist/types/web/scrapers/aur.d.ts +0 -5
- package/dist/types/web/scrapers/biorxiv.d.ts +0 -5
- package/dist/types/web/scrapers/bluesky.d.ts +0 -5
- package/dist/types/web/scrapers/brew.d.ts +0 -5
- package/dist/types/web/scrapers/cheatsh.d.ts +0 -8
- package/dist/types/web/scrapers/chocolatey.d.ts +0 -5
- package/dist/types/web/scrapers/choosealicense.d.ts +0 -2
- package/dist/types/web/scrapers/cisa-kev.d.ts +0 -5
- package/dist/types/web/scrapers/clojars.d.ts +0 -5
- package/dist/types/web/scrapers/coingecko.d.ts +0 -5
- package/dist/types/web/scrapers/crates-io.d.ts +0 -5
- package/dist/types/web/scrapers/crossref.d.ts +0 -2
- package/dist/types/web/scrapers/devto.d.ts +0 -5
- package/dist/types/web/scrapers/discogs.d.ts +0 -8
- package/dist/types/web/scrapers/discourse.d.ts +0 -5
- package/dist/types/web/scrapers/dockerhub.d.ts +0 -5
- package/dist/types/web/scrapers/docs-rs.d.ts +0 -2
- package/dist/types/web/scrapers/fdroid.d.ts +0 -5
- package/dist/types/web/scrapers/firefox-addons.d.ts +0 -2
- package/dist/types/web/scrapers/flathub.d.ts +0 -2
- package/dist/types/web/scrapers/github-gist.d.ts +0 -5
- package/dist/types/web/scrapers/github.d.ts +0 -12
- package/dist/types/web/scrapers/gitlab.d.ts +0 -5
- package/dist/types/web/scrapers/go-pkg.d.ts +0 -5
- package/dist/types/web/scrapers/hackage.d.ts +0 -5
- package/dist/types/web/scrapers/hackernews.d.ts +0 -2
- package/dist/types/web/scrapers/hex.d.ts +0 -5
- package/dist/types/web/scrapers/huggingface.d.ts +0 -2
- package/dist/types/web/scrapers/iacr.d.ts +0 -5
- package/dist/types/web/scrapers/index.d.ts +0 -84
- package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +0 -2
- package/dist/types/web/scrapers/lemmy.d.ts +0 -2
- package/dist/types/web/scrapers/lobsters.d.ts +0 -5
- package/dist/types/web/scrapers/mastodon.d.ts +0 -5
- package/dist/types/web/scrapers/maven.d.ts +0 -6
- package/dist/types/web/scrapers/mdn.d.ts +0 -2
- package/dist/types/web/scrapers/metacpan.d.ts +0 -5
- package/dist/types/web/scrapers/musicbrainz.d.ts +0 -5
- package/dist/types/web/scrapers/npm.d.ts +0 -5
- package/dist/types/web/scrapers/nuget.d.ts +0 -5
- package/dist/types/web/scrapers/nvd.d.ts +0 -5
- package/dist/types/web/scrapers/ollama.d.ts +0 -2
- package/dist/types/web/scrapers/open-vsx.d.ts +0 -5
- package/dist/types/web/scrapers/opencorporates.d.ts +0 -5
- package/dist/types/web/scrapers/openlibrary.d.ts +0 -5
- package/dist/types/web/scrapers/orcid.d.ts +0 -5
- package/dist/types/web/scrapers/osv.d.ts +0 -5
- package/dist/types/web/scrapers/packagist.d.ts +0 -5
- package/dist/types/web/scrapers/pub-dev.d.ts +0 -5
- package/dist/types/web/scrapers/pubmed.d.ts +0 -5
- package/dist/types/web/scrapers/pypi.d.ts +0 -5
- package/dist/types/web/scrapers/rawg.d.ts +0 -2
- package/dist/types/web/scrapers/readthedocs.d.ts +0 -2
- package/dist/types/web/scrapers/reddit.d.ts +0 -5
- package/dist/types/web/scrapers/repology.d.ts +0 -5
- package/dist/types/web/scrapers/rfc.d.ts +0 -5
- package/dist/types/web/scrapers/rubygems.d.ts +0 -5
- package/dist/types/web/scrapers/searchcode.d.ts +0 -2
- package/dist/types/web/scrapers/sec-edgar.d.ts +0 -5
- package/dist/types/web/scrapers/semantic-scholar.d.ts +0 -2
- package/dist/types/web/scrapers/snapcraft.d.ts +0 -2
- package/dist/types/web/scrapers/sourcegraph.d.ts +0 -2
- package/dist/types/web/scrapers/spdx.d.ts +0 -5
- package/dist/types/web/scrapers/spotify.d.ts +0 -8
- package/dist/types/web/scrapers/stackoverflow.d.ts +0 -6
- package/dist/types/web/scrapers/terraform.d.ts +0 -5
- package/dist/types/web/scrapers/tldr.d.ts +0 -7
- package/dist/types/web/scrapers/twitter.d.ts +0 -5
- package/dist/types/web/scrapers/types.d.ts +0 -83
- package/dist/types/web/scrapers/utils.d.ts +0 -32
- package/dist/types/web/scrapers/vimeo.d.ts +0 -5
- package/dist/types/web/scrapers/vscode-marketplace.d.ts +0 -5
- package/dist/types/web/scrapers/w3c.d.ts +0 -2
- package/dist/types/web/scrapers/wikidata.d.ts +0 -5
- package/dist/types/web/scrapers/wikipedia.d.ts +0 -5
- package/dist/types/web/scrapers/youtube.d.ts +0 -13
- package/dist/types/web/search/index.d.ts +0 -118
- package/dist/types/web/search/provider.d.ts +0 -55
- package/dist/types/web/search/providers/anthropic.d.ts +0 -32
- package/dist/types/web/search/providers/base.d.ts +0 -90
- package/dist/types/web/search/providers/brave.d.ts +0 -27
- package/dist/types/web/search/providers/codex.d.ts +0 -35
- package/dist/types/web/search/providers/duckduckgo.d.ts +0 -57
- package/dist/types/web/search/providers/exa.d.ts +0 -52
- package/dist/types/web/search/providers/gemini.d.ts +0 -57
- package/dist/types/web/search/providers/insane.d.ts +0 -53
- package/dist/types/web/search/providers/jina.d.ts +0 -26
- package/dist/types/web/search/providers/kagi.d.ts +0 -24
- package/dist/types/web/search/providers/kimi.d.ts +0 -27
- package/dist/types/web/search/providers/openai-compatible.d.ts +0 -9
- package/dist/types/web/search/providers/parallel.d.ts +0 -15
- package/dist/types/web/search/providers/perplexity.d.ts +0 -38
- package/dist/types/web/search/providers/searxng.d.ts +0 -44
- package/dist/types/web/search/providers/synthetic.d.ts +0 -21
- package/dist/types/web/search/providers/tavily.d.ts +0 -29
- package/dist/types/web/search/providers/text-citations.d.ts +0 -23
- package/dist/types/web/search/providers/utils.d.ts +0 -88
- package/dist/types/web/search/providers/xai.d.ts +0 -64
- package/dist/types/web/search/providers/zai.d.ts +0 -28
- package/dist/types/web/search/render.d.ts +0 -36
- package/dist/types/web/search/types.d.ts +0 -372
- package/dist/types/web/search/utils.d.ts +0 -4
- package/dist/types/workflow/workflow-intent-diff.d.ts +0 -25
- package/dist/types/workflow/workflow-intent-report-consumer.d.ts +0 -50
- package/dist/types/workflow/workflow-intent-report-schema.d.ts +0 -2
- package/dist/types/workflow/workflow-intent-report.d.ts +0 -48
- package/dist/types/workspace-tree.d.ts +0 -42
|
@@ -10,7 +10,7 @@ import type { DaemonRuntimeInfo } from "../daemon/control-types";
|
|
|
10
10
|
import { resolveSkcRuntimeSpawnInfo } from "../daemon/runtime";
|
|
11
11
|
import { getNotificationConfig, isTelegramConfigured, tokenFingerprint } from "./config";
|
|
12
12
|
import { parseInThreadConfigCommand, parseRichToggleCommand, parseTelegramControlCommand } from "./config-commands";
|
|
13
|
-
import { daemonPaths } from "./daemon-paths";
|
|
13
|
+
import { daemonPaths, HEARTBEAT_TTL_MS } from "./daemon-paths";
|
|
14
14
|
import {
|
|
15
15
|
buildCompactChoiceGrid,
|
|
16
16
|
code,
|
|
@@ -71,6 +71,14 @@ export interface DaemonState {
|
|
|
71
71
|
heartbeatAt: number;
|
|
72
72
|
roots: string[];
|
|
73
73
|
version: 1;
|
|
74
|
+
/**
|
|
75
|
+
* Operational daemon generation of the process that owns the lock, distinct
|
|
76
|
+
* from the persisted state-schema {@link DaemonState.version}. It records the
|
|
77
|
+
* wire generation ({@link DAEMON_GENERATION}) the owning daemon speaks so a
|
|
78
|
+
* freshly-upgraded host can detect — and reload — a still-live pre-upgrade
|
|
79
|
+
* daemon whose schema version is unchanged. Absent on pre-generation state.
|
|
80
|
+
*/
|
|
81
|
+
generation?: number;
|
|
74
82
|
stoppedAt?: number;
|
|
75
83
|
}
|
|
76
84
|
export interface TelegramDaemonFs {
|
|
@@ -100,15 +108,36 @@ export interface TelegramDaemonDeps {
|
|
|
100
108
|
) => SpawnResult;
|
|
101
109
|
execPath?: string;
|
|
102
110
|
randomId?: () => string;
|
|
111
|
+
/**
|
|
112
|
+
* Signal delivery + poll timing for the stale-generation reload handoff in
|
|
113
|
+
* {@link ensureTelegramDaemonRunning}. Defaults use real signals/timers; tests
|
|
114
|
+
* inject them to drive the handoff deterministically.
|
|
115
|
+
*/
|
|
116
|
+
sendSignal?: (pid: number, signal: NodeJS.Signals) => void;
|
|
117
|
+
sleep?: (ms: number) => Promise<void>;
|
|
118
|
+
waitStepMs?: number;
|
|
103
119
|
}
|
|
104
120
|
|
|
105
121
|
export const HEARTBEAT_INTERVAL_MS = 5_000;
|
|
106
|
-
export
|
|
122
|
+
export { HEARTBEAT_TTL_MS };
|
|
107
123
|
export const DAEMON_VERSION = 1;
|
|
108
124
|
/** Capability token advertised when the server supports app-level ping/pong. */
|
|
109
125
|
export const CLIENT_PING_PONG_CAPABILITY = "client_ping_pong";
|
|
110
126
|
/** Protocol version the daemon advertises in its ClientHello. */
|
|
111
|
-
export const NOTIFICATION_PROTOCOL_VERSION =
|
|
127
|
+
export const NOTIFICATION_PROTOCOL_VERSION = 3;
|
|
128
|
+
/** Capability required for typed controls and semantic Selected acknowledgement frames. */
|
|
129
|
+
export const ASK_SELECTED_ACK_CAPABILITY = "ask_selected_ack_v1";
|
|
130
|
+
export const ASK_CONTROLS_CAPABILITY = "ask_controls_v1";
|
|
131
|
+
/**
|
|
132
|
+
* Operational generation the current daemon build speaks, persisted into
|
|
133
|
+
* {@link DaemonState.generation} on ownership acquisition. It is tied to the
|
|
134
|
+
* wire {@link NOTIFICATION_PROTOCOL_VERSION} so any protocol bump (which is what
|
|
135
|
+
* gates capabilities like {@link ASK_SELECTED_ACK_CAPABILITY}) also bumps the
|
|
136
|
+
* generation, letting a freshly-upgraded host recognise an older, still-live
|
|
137
|
+
* daemon and reload it instead of silently attaching to it. Distinct from the
|
|
138
|
+
* persisted schema {@link DAEMON_VERSION}, which did not change across #1999.
|
|
139
|
+
*/
|
|
140
|
+
export const DAEMON_GENERATION = NOTIFICATION_PROTOCOL_VERSION;
|
|
112
141
|
|
|
113
142
|
const nodeFs: TelegramDaemonFs = fs.promises as unknown as TelegramDaemonFs;
|
|
114
143
|
|
|
@@ -167,6 +196,10 @@ function endpointGenerationKey(url: string, token: string): string {
|
|
|
167
196
|
return `${url}\0${token}`;
|
|
168
197
|
}
|
|
169
198
|
|
|
199
|
+
function topicRenameApplied(response: unknown): boolean {
|
|
200
|
+
return !!response && typeof response === "object" && (response as { ok?: unknown }).ok === true;
|
|
201
|
+
}
|
|
202
|
+
|
|
170
203
|
/**
|
|
171
204
|
* Whether `err` is a transient network failure worth retrying. Telegram API
|
|
172
205
|
* calls over HTTP/2 occasionally surface mid-stream `ECONNRESET` (and similar)
|
|
@@ -363,6 +396,7 @@ export async function acquireDaemonOwnership(input: {
|
|
|
363
396
|
attached?: boolean;
|
|
364
397
|
blocked?: boolean;
|
|
365
398
|
reason?: "identity_mismatch";
|
|
399
|
+
reloadRequired?: boolean;
|
|
366
400
|
}> {
|
|
367
401
|
const fsImpl = input.fs ?? nodeFs;
|
|
368
402
|
const now = input.now ?? Date.now;
|
|
@@ -372,6 +406,28 @@ export async function acquireDaemonOwnership(input: {
|
|
|
372
406
|
await ensureDir(fsImpl, paths.dir);
|
|
373
407
|
const ownerId = input.randomId?.() ?? `${pid}-${now().toString(36)}-${Math.random().toString(36).slice(2)}`;
|
|
374
408
|
const roots = input.roots ?? (await readJson<{ roots?: string[] }>(fsImpl, paths.roots))?.roots ?? [];
|
|
409
|
+
|
|
410
|
+
// A fresh, identity-matching live owner running an OLDER generation than this
|
|
411
|
+
// build cannot serve our newer wire frames; signal a reload instead of a
|
|
412
|
+
// silent attach. Newer/equal generations attach as before (no downgrade).
|
|
413
|
+
const attachDecision = (
|
|
414
|
+
state: DaemonState | undefined,
|
|
415
|
+
): { acquired: false; attached: boolean; reloadRequired?: boolean } | undefined => {
|
|
416
|
+
if (
|
|
417
|
+
!isFreshLiveOwner({
|
|
418
|
+
state,
|
|
419
|
+
now: now(),
|
|
420
|
+
tokenFingerprint: input.tokenFingerprint,
|
|
421
|
+
chatId: input.chatId,
|
|
422
|
+
pidAlive,
|
|
423
|
+
})
|
|
424
|
+
) {
|
|
425
|
+
return undefined;
|
|
426
|
+
}
|
|
427
|
+
return (state?.generation ?? 0) < DAEMON_GENERATION
|
|
428
|
+
? { acquired: false, attached: false, reloadRequired: true }
|
|
429
|
+
: { acquired: false, attached: true };
|
|
430
|
+
};
|
|
375
431
|
const existing = await readJson<DaemonState>(fsImpl, paths.state);
|
|
376
432
|
if (
|
|
377
433
|
liveOwnerUsesDifferentIdentity({
|
|
@@ -383,17 +439,8 @@ export async function acquireDaemonOwnership(input: {
|
|
|
383
439
|
) {
|
|
384
440
|
return { acquired: false, blocked: true, reason: "identity_mismatch" };
|
|
385
441
|
}
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
state: existing,
|
|
389
|
-
now: now(),
|
|
390
|
-
tokenFingerprint: input.tokenFingerprint,
|
|
391
|
-
chatId: input.chatId,
|
|
392
|
-
pidAlive,
|
|
393
|
-
})
|
|
394
|
-
) {
|
|
395
|
-
return { acquired: false, attached: true };
|
|
396
|
-
}
|
|
442
|
+
const existingDecision = attachDecision(existing);
|
|
443
|
+
if (existingDecision) return existingDecision;
|
|
397
444
|
if (await tryOpenWx(fsImpl, paths.lock)) {
|
|
398
445
|
await writeJsonAtomic(fsImpl, paths.state, {
|
|
399
446
|
pid,
|
|
@@ -404,6 +451,7 @@ export async function acquireDaemonOwnership(input: {
|
|
|
404
451
|
heartbeatAt: now(),
|
|
405
452
|
roots,
|
|
406
453
|
version: DAEMON_VERSION,
|
|
454
|
+
generation: DAEMON_GENERATION,
|
|
407
455
|
} satisfies DaemonState);
|
|
408
456
|
return { acquired: true, ownerId };
|
|
409
457
|
}
|
|
@@ -418,32 +466,14 @@ export async function acquireDaemonOwnership(input: {
|
|
|
418
466
|
) {
|
|
419
467
|
return { acquired: false, blocked: true, reason: "identity_mismatch" };
|
|
420
468
|
}
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
state: afterLock,
|
|
424
|
-
now: now(),
|
|
425
|
-
tokenFingerprint: input.tokenFingerprint,
|
|
426
|
-
chatId: input.chatId,
|
|
427
|
-
pidAlive,
|
|
428
|
-
})
|
|
429
|
-
) {
|
|
430
|
-
return { acquired: false, attached: true };
|
|
431
|
-
}
|
|
469
|
+
const afterLockDecision = attachDecision(afterLock);
|
|
470
|
+
if (afterLockDecision) return afterLockDecision;
|
|
432
471
|
if (!afterLock) return { acquired: false, attached: true };
|
|
433
472
|
if (!(await tryOpenWx(fsImpl, paths.steal))) return { acquired: false, attached: true };
|
|
434
473
|
try {
|
|
435
474
|
const rechecked = await readJson<DaemonState>(fsImpl, paths.state);
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
state: rechecked,
|
|
439
|
-
now: now(),
|
|
440
|
-
tokenFingerprint: input.tokenFingerprint,
|
|
441
|
-
chatId: input.chatId,
|
|
442
|
-
pidAlive,
|
|
443
|
-
})
|
|
444
|
-
) {
|
|
445
|
-
return { acquired: false, attached: true };
|
|
446
|
-
}
|
|
475
|
+
const recheckedDecision = attachDecision(rechecked);
|
|
476
|
+
if (recheckedDecision) return recheckedDecision;
|
|
447
477
|
if (
|
|
448
478
|
liveOwnerUsesDifferentIdentity({
|
|
449
479
|
state: rechecked,
|
|
@@ -468,6 +498,7 @@ export async function acquireDaemonOwnership(input: {
|
|
|
468
498
|
heartbeatAt: now(),
|
|
469
499
|
roots,
|
|
470
500
|
version: DAEMON_VERSION,
|
|
501
|
+
generation: DAEMON_GENERATION,
|
|
471
502
|
} satisfies DaemonState);
|
|
472
503
|
return { acquired: true, ownerId };
|
|
473
504
|
} finally {
|
|
@@ -571,6 +602,12 @@ export interface TelegramSpawnOwnerResult {
|
|
|
571
602
|
ownerId?: string;
|
|
572
603
|
runtime: DaemonRuntimeInfo;
|
|
573
604
|
warnings: string[];
|
|
605
|
+
/**
|
|
606
|
+
* Set when ownership was NOT acquired because a still-live owner is running an
|
|
607
|
+
* older daemon generation. The caller must hand off via a reload rather than
|
|
608
|
+
* attach; see {@link ensureTelegramDaemonRunning}.
|
|
609
|
+
*/
|
|
610
|
+
reloadRequired?: boolean;
|
|
574
611
|
}
|
|
575
612
|
|
|
576
613
|
/**
|
|
@@ -639,7 +676,7 @@ export async function spawnTelegramDaemonOwner(
|
|
|
639
676
|
warnings: ["live telegram daemon uses a different bot token or chat; refusing to attach"],
|
|
640
677
|
};
|
|
641
678
|
}
|
|
642
|
-
return { result: "attached", runtime, warnings: [] };
|
|
679
|
+
return { result: "attached", runtime, warnings: [], reloadRequired: ownership.reloadRequired };
|
|
643
680
|
}
|
|
644
681
|
const spawnImpl = deps.spawn ?? defaultDaemonSpawn;
|
|
645
682
|
const child = spawnImpl(command, args, {
|
|
@@ -667,12 +704,45 @@ export async function ensureTelegramDaemonRunning(
|
|
|
667
704
|
logger.warn(`notifications: failed to ensure Telegram daemon: ${spawned.warnings.join("; ")}`);
|
|
668
705
|
return spawned.result;
|
|
669
706
|
}
|
|
707
|
+
if (spawned.reloadRequired) {
|
|
708
|
+
// A still-live owner is running an OLDER daemon generation than this host
|
|
709
|
+
// (e.g. a pre-upgrade daemon reused in place across an in-place upgrade).
|
|
710
|
+
// Attaching would silently drop this host's newer ask-ack / control frames,
|
|
711
|
+
// so register this session's root first — so the replacement daemon serves
|
|
712
|
+
// it — then hand off through the tested SIGTERM/control reload path to bring
|
|
713
|
+
// up a fresh current-generation daemon.
|
|
714
|
+
await registerNotificationRoot({ ...input, fs: deps.fs });
|
|
715
|
+
await reloadStaleGenerationOwner(input.settings, deps);
|
|
716
|
+
return "owner_spawned";
|
|
717
|
+
}
|
|
670
718
|
await registerNotificationRoot({ ...input, fs: deps.fs });
|
|
671
719
|
return spawned.result;
|
|
672
720
|
}
|
|
673
721
|
|
|
722
|
+
/**
|
|
723
|
+
* Reload a still-live owner running an older daemon generation through the
|
|
724
|
+
* cooperative SIGTERM/control handoff. Lazily imports the controller to avoid a
|
|
725
|
+
* static import cycle (the controller module imports ownership helpers here).
|
|
726
|
+
*/
|
|
727
|
+
async function reloadStaleGenerationOwner(settings: Settings, deps: TelegramDaemonDeps): Promise<void> {
|
|
728
|
+
const { TelegramDaemonController } = await import("./telegram-daemon-control");
|
|
729
|
+
const controller = new TelegramDaemonController(settings, {
|
|
730
|
+
fs: deps.fs,
|
|
731
|
+
now: deps.now,
|
|
732
|
+
pidAlive: deps.pidAlive,
|
|
733
|
+
sendSignal: deps.sendSignal,
|
|
734
|
+
spawn: deps.spawn,
|
|
735
|
+
execPath: deps.execPath,
|
|
736
|
+
ownerPid: deps.pid,
|
|
737
|
+
randomId: deps.randomId,
|
|
738
|
+
sleep: deps.sleep,
|
|
739
|
+
waitStepMs: deps.waitStepMs,
|
|
740
|
+
});
|
|
741
|
+
await controller.reload();
|
|
742
|
+
}
|
|
743
|
+
|
|
674
744
|
export interface BotApi {
|
|
675
|
-
call(method: string, body: unknown, opts?: { signal?: AbortSignal }): Promise<unknown>;
|
|
745
|
+
call(method: string, body: unknown, opts?: { signal?: AbortSignal; noRetry?: boolean }): Promise<unknown>;
|
|
676
746
|
}
|
|
677
747
|
|
|
678
748
|
export interface TelegramTransportOptions {
|
|
@@ -690,7 +760,7 @@ export class TelegramBotTransport implements BotApi {
|
|
|
690
760
|
this.#opts = opts;
|
|
691
761
|
}
|
|
692
762
|
|
|
693
|
-
async call(method: string, body: unknown, opts?: { signal?: AbortSignal }): Promise<unknown> {
|
|
763
|
+
async call(method: string, body: unknown, opts?: { signal?: AbortSignal; noRetry?: boolean }): Promise<unknown> {
|
|
694
764
|
const apiBase = this.#opts.apiBase ?? "https://api.telegram.org";
|
|
695
765
|
const url = `${apiBase}/bot${this.#opts.botToken}/${method}`;
|
|
696
766
|
const fetchImpl = this.#opts.fetchImpl ?? fetch;
|
|
@@ -714,7 +784,13 @@ export class TelegramBotTransport implements BotApi {
|
|
|
714
784
|
if (b.caption) form.set("caption", b.caption);
|
|
715
785
|
if (b.parse_mode) form.set("parse_mode", String(b.parse_mode));
|
|
716
786
|
form.set("photo", new Blob([Buffer.from(b.photo, "base64")], { type: b.mime ?? "image/png" }), "image");
|
|
717
|
-
const res = await fetchWithRetry(
|
|
787
|
+
const res = await fetchWithRetry(
|
|
788
|
+
fetchImpl,
|
|
789
|
+
url,
|
|
790
|
+
{ method: "POST", body: form, signal: opts?.signal },
|
|
791
|
+
sleep,
|
|
792
|
+
opts?.noRetry ? 1 : undefined,
|
|
793
|
+
);
|
|
718
794
|
return res.json();
|
|
719
795
|
}
|
|
720
796
|
const docBody = body as { document?: unknown } | null;
|
|
@@ -738,7 +814,13 @@ export class TelegramBotTransport implements BotApi {
|
|
|
738
814
|
new Blob([Buffer.from(b.document, "base64")], { type: b.mime ?? "application/octet-stream" }),
|
|
739
815
|
b.fileName ?? "file",
|
|
740
816
|
);
|
|
741
|
-
const res = await fetchWithRetry(
|
|
817
|
+
const res = await fetchWithRetry(
|
|
818
|
+
fetchImpl,
|
|
819
|
+
url,
|
|
820
|
+
{ method: "POST", body: form, signal: opts?.signal },
|
|
821
|
+
sleep,
|
|
822
|
+
opts?.noRetry ? 1 : undefined,
|
|
823
|
+
);
|
|
742
824
|
return res.json();
|
|
743
825
|
}
|
|
744
826
|
const res = await fetchWithRetry(
|
|
@@ -751,16 +833,21 @@ export class TelegramBotTransport implements BotApi {
|
|
|
751
833
|
signal: opts?.signal,
|
|
752
834
|
},
|
|
753
835
|
sleep,
|
|
836
|
+
opts?.noRetry ? 1 : undefined,
|
|
754
837
|
);
|
|
755
838
|
return res.json();
|
|
756
839
|
}
|
|
757
840
|
}
|
|
758
841
|
|
|
842
|
+
type PairedChatPrivacy = "private" | "non-private" | "indeterminate";
|
|
843
|
+
|
|
844
|
+
export type TelegramUpdateOutcome = "consumed" | "retry";
|
|
845
|
+
|
|
759
846
|
export interface TelegramUpdatePollerOptions {
|
|
760
847
|
botApi: BotApi;
|
|
761
848
|
runtime: NotificationOperatorRuntime;
|
|
762
849
|
backoff: OperatorBackoffPolicy;
|
|
763
|
-
processUpdate: (update: unknown) => Promise<
|
|
850
|
+
processUpdate: (update: unknown) => Promise<TelegramUpdateOutcome>;
|
|
764
851
|
}
|
|
765
852
|
|
|
766
853
|
/** Owns getUpdates offset, conflict backoff, and per-update error isolation. */
|
|
@@ -805,11 +892,16 @@ export class TelegramUpdatePoller {
|
|
|
805
892
|
}
|
|
806
893
|
this.#opts.backoff.reset();
|
|
807
894
|
for (const update of body.result ?? []) {
|
|
808
|
-
this.#offset = update.update_id + 1;
|
|
809
895
|
try {
|
|
810
|
-
await this.#opts.processUpdate(update);
|
|
896
|
+
const outcome = await this.#opts.processUpdate(update);
|
|
897
|
+
if (outcome === "retry") {
|
|
898
|
+
await this.#opts.runtime.sleep(this.#opts.backoff.next(), signal);
|
|
899
|
+
break;
|
|
900
|
+
}
|
|
901
|
+
this.#offset = update.update_id + 1;
|
|
811
902
|
} catch (err) {
|
|
812
903
|
logger.error("notifications daemon: handleTelegramUpdate failed", { error: String(err) });
|
|
904
|
+
this.#offset = update.update_id + 1;
|
|
813
905
|
}
|
|
814
906
|
}
|
|
815
907
|
return body.result?.length ?? 0;
|
|
@@ -867,6 +959,12 @@ export interface TelegramDaemonOptions {
|
|
|
867
959
|
rich?: { enabled: boolean };
|
|
868
960
|
/** Opt-in rich-draft streaming of live turn previews (off by default; see rich-draft.ts). */
|
|
869
961
|
richDraft?: { enabled: boolean };
|
|
962
|
+
/**
|
|
963
|
+
* Per-session Telegram forum-topic naming. `nameTemplate` supports the
|
|
964
|
+
* `{repo}`, `{branch}`, and `{title}` placeholders; unset preserves the
|
|
965
|
+
* built-in `{repo}/{branch} - {title}` composition and its fallbacks.
|
|
966
|
+
*/
|
|
967
|
+
topics?: { nameTemplate?: string };
|
|
870
968
|
}
|
|
871
969
|
|
|
872
970
|
interface SessionSocket {
|
|
@@ -890,6 +988,29 @@ interface PendingThreadedFrame {
|
|
|
890
988
|
msg: Record<string, unknown>;
|
|
891
989
|
}
|
|
892
990
|
|
|
991
|
+
type SelectedAckOutcome =
|
|
992
|
+
| { status: "delivered"; messageId: number }
|
|
993
|
+
| { status: "failed"; reason: "route_missing" | "expired" | "cancelled" | "telegram_rejected" }
|
|
994
|
+
| { status: "unknown"; reason: "transport_ambiguous" | "shutdown" };
|
|
995
|
+
|
|
996
|
+
interface SelectedAckQueueItem {
|
|
997
|
+
pendingKey: string;
|
|
998
|
+
cacheKey: string;
|
|
999
|
+
itemId: string;
|
|
1000
|
+
requestId: string;
|
|
1001
|
+
commitKey: string;
|
|
1002
|
+
session: SessionSocket;
|
|
1003
|
+
state: "queued" | "dispatching" | "sending";
|
|
1004
|
+
controller?: AbortController;
|
|
1005
|
+
followers: Array<{ pendingKey: string; requestId: string; commitKey: string }>;
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
interface TelegramQueuePayload {
|
|
1009
|
+
send: ThreadedSend;
|
|
1010
|
+
topicId?: string;
|
|
1011
|
+
selectedAck?: SelectedAckQueueItem;
|
|
1012
|
+
}
|
|
1013
|
+
|
|
893
1014
|
export class TelegramNotificationDaemon {
|
|
894
1015
|
readonly aliasTable: AliasTable;
|
|
895
1016
|
readonly messageRoutes = new Map<string | number, CallbackRoute | Omit<CallbackRoute, "answer">>();
|
|
@@ -904,7 +1025,12 @@ export class TelegramNotificationDaemon {
|
|
|
904
1025
|
private readonly fsImpl: TelegramDaemonFs;
|
|
905
1026
|
private readonly botApi: BotApi;
|
|
906
1027
|
private readonly topics = new TopicRegistry();
|
|
907
|
-
|
|
1028
|
+
/** Serializes registry snapshots so an older atomic write cannot overwrite newer rename state. */
|
|
1029
|
+
private topicsPersistQueue: Promise<void> = Promise.resolve();
|
|
1030
|
+
/** Daemon edit attempts that can race an accepted user service message. */
|
|
1031
|
+
private readonly daemonRenameAttempts = new Map<string, number>();
|
|
1032
|
+
private readonly selectedAckPending = new Map<string, SelectedAckQueueItem>();
|
|
1033
|
+
private readonly pool: RateLimitPool<TelegramQueuePayload>;
|
|
908
1034
|
private readonly poller: TelegramUpdatePoller;
|
|
909
1035
|
private readonly dispatchState = new TelegramEventDispatchState();
|
|
910
1036
|
/** Original markdown of rich messages we sent (chat+message_id), for restoring reply context on inbound replies. */
|
|
@@ -952,6 +1078,33 @@ export class TelegramNotificationDaemon {
|
|
|
952
1078
|
>();
|
|
953
1079
|
/** Monotonic counter for unique lifecycle request ids. */
|
|
954
1080
|
private lifecycleSeq = 0;
|
|
1081
|
+
/** Attempt tombstones live for the daemon lifetime so a commit key can never send twice. */
|
|
1082
|
+
private readonly selectedAckCache = new Map<string, SelectedAckOutcome>();
|
|
1083
|
+
private cacheSelectedAck(cacheKey: string, outcome: SelectedAckOutcome): void {
|
|
1084
|
+
this.selectedAckCache.set(cacheKey, outcome);
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
private getCachedSelectedAck(cacheKey: string): SelectedAckOutcome | undefined {
|
|
1088
|
+
return this.selectedAckCache.get(cacheKey);
|
|
1089
|
+
}
|
|
1090
|
+
private finishSelectedAck(item: SelectedAckQueueItem, outcome: SelectedAckOutcome): void {
|
|
1091
|
+
if (this.selectedAckPending.get(item.pendingKey) !== item) return;
|
|
1092
|
+
this.selectedAckPending.delete(item.pendingKey);
|
|
1093
|
+
for (const follower of item.followers) this.selectedAckPending.delete(follower.pendingKey);
|
|
1094
|
+
this.cacheSelectedAck(item.cacheKey, outcome);
|
|
1095
|
+
if (item.session.ws.readyState === WebSocket.OPEN) {
|
|
1096
|
+
for (const result of [{ requestId: item.requestId, commitKey: item.commitKey }, ...item.followers]) {
|
|
1097
|
+
item.session.ws.send(
|
|
1098
|
+
JSON.stringify({
|
|
1099
|
+
type: "ask_selected_ack_result",
|
|
1100
|
+
requestId: result.requestId,
|
|
1101
|
+
commitKey: result.commitKey,
|
|
1102
|
+
outcome,
|
|
1103
|
+
}),
|
|
1104
|
+
);
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
955
1108
|
|
|
956
1109
|
/**
|
|
957
1110
|
* Cooperatively stop the daemon: set the stop flag and abort the in-flight
|
|
@@ -959,6 +1112,11 @@ export class TelegramNotificationDaemon {
|
|
|
959
1112
|
* ~25s getUpdates timeout. Safe to call from a signal handler.
|
|
960
1113
|
*/
|
|
961
1114
|
requestStop(_reason?: "reload" | "stop" | "signal"): void {
|
|
1115
|
+
for (const item of new Set(this.selectedAckPending.values())) {
|
|
1116
|
+
if (item.state === "queued") this.pool.removeById(item.itemId);
|
|
1117
|
+
else item.controller?.abort();
|
|
1118
|
+
this.finishSelectedAck(item, { status: "unknown", reason: "shutdown" });
|
|
1119
|
+
}
|
|
962
1120
|
this.runtime.requestStop();
|
|
963
1121
|
this.running = false;
|
|
964
1122
|
}
|
|
@@ -1294,7 +1452,7 @@ export class TelegramNotificationDaemon {
|
|
|
1294
1452
|
botApi: this.botApi,
|
|
1295
1453
|
runtime: this.runtime,
|
|
1296
1454
|
backoff: this.pollConflictBackoff,
|
|
1297
|
-
processUpdate: update => this.
|
|
1455
|
+
processUpdate: update => this.processTelegramUpdate(update),
|
|
1298
1456
|
});
|
|
1299
1457
|
}
|
|
1300
1458
|
|
|
@@ -1311,6 +1469,134 @@ export class TelegramNotificationDaemon {
|
|
|
1311
1469
|
}
|
|
1312
1470
|
},
|
|
1313
1471
|
})
|
|
1472
|
+
.add({
|
|
1473
|
+
name: "ask-selected-ack",
|
|
1474
|
+
matches: msg => msg.type === "ask_selected_ack_request",
|
|
1475
|
+
handle: async (session, msg) => {
|
|
1476
|
+
const requestId = typeof msg.requestId === "string" ? msg.requestId : undefined;
|
|
1477
|
+
const commitKey = typeof msg.commitKey === "string" ? msg.commitKey : undefined;
|
|
1478
|
+
const mode = msg.mode === "live" || msg.mode === "recovery" ? msg.mode : undefined;
|
|
1479
|
+
const deadlineAt = typeof msg.deadlineAt === "number" ? msg.deadlineAt : undefined;
|
|
1480
|
+
if (!requestId || !commitKey || !mode || !deadlineAt) return;
|
|
1481
|
+
const cacheKey = `${session.sessionId}\0${commitKey}`;
|
|
1482
|
+
const cached = this.getCachedSelectedAck(cacheKey);
|
|
1483
|
+
if (cached) {
|
|
1484
|
+
session.ws.send(
|
|
1485
|
+
JSON.stringify({ type: "ask_selected_ack_result", requestId, commitKey, outcome: cached }),
|
|
1486
|
+
);
|
|
1487
|
+
return;
|
|
1488
|
+
}
|
|
1489
|
+
const finishImmediately = (outcome: SelectedAckOutcome): void => {
|
|
1490
|
+
this.cacheSelectedAck(cacheKey, outcome);
|
|
1491
|
+
if (session.ws.readyState === WebSocket.OPEN) {
|
|
1492
|
+
session.ws.send(
|
|
1493
|
+
JSON.stringify({ type: "ask_selected_ack_result", requestId, commitKey, outcome }),
|
|
1494
|
+
);
|
|
1495
|
+
}
|
|
1496
|
+
};
|
|
1497
|
+
if (deadlineAt <= this.runtime.now()) {
|
|
1498
|
+
finishImmediately({ status: "failed", reason: "expired" });
|
|
1499
|
+
return;
|
|
1500
|
+
}
|
|
1501
|
+
if (mode === "live" && (typeof msg.actionId !== "string" || !session.pending.has(msg.actionId))) {
|
|
1502
|
+
finishImmediately({ status: "failed", reason: "route_missing" });
|
|
1503
|
+
return;
|
|
1504
|
+
}
|
|
1505
|
+
const topicId = this.topics.get(session.sessionId)?.topicId;
|
|
1506
|
+
if (mode === "recovery" && (!topicId || msg.sessionId !== session.sessionId)) {
|
|
1507
|
+
finishImmediately({ status: "failed", reason: "route_missing" });
|
|
1508
|
+
return;
|
|
1509
|
+
}
|
|
1510
|
+
const existing = [...new Set(this.selectedAckPending.values())].find(item => item.cacheKey === cacheKey);
|
|
1511
|
+
if (existing) {
|
|
1512
|
+
if (
|
|
1513
|
+
existing.requestId === requestId ||
|
|
1514
|
+
existing.followers.some(follower => follower.requestId === requestId)
|
|
1515
|
+
)
|
|
1516
|
+
return;
|
|
1517
|
+
const pendingKey = `${session.endpointKey}\0${requestId}`;
|
|
1518
|
+
existing.followers.push({ pendingKey, requestId, commitKey });
|
|
1519
|
+
this.selectedAckPending.set(pendingKey, existing);
|
|
1520
|
+
return;
|
|
1521
|
+
}
|
|
1522
|
+
const pendingKey = `${session.endpointKey}\0${requestId}`;
|
|
1523
|
+
if (this.selectedAckPending.has(pendingKey)) return;
|
|
1524
|
+
const item: SelectedAckQueueItem = {
|
|
1525
|
+
pendingKey,
|
|
1526
|
+
cacheKey,
|
|
1527
|
+
itemId: `selected-ack:${session.endpointKey}:${requestId}`,
|
|
1528
|
+
requestId,
|
|
1529
|
+
commitKey,
|
|
1530
|
+
session,
|
|
1531
|
+
state: "queued",
|
|
1532
|
+
followers: [],
|
|
1533
|
+
};
|
|
1534
|
+
this.selectedAckPending.set(pendingKey, item);
|
|
1535
|
+
this.pool.submit({
|
|
1536
|
+
sessionId: session.sessionId,
|
|
1537
|
+
lane: "ask",
|
|
1538
|
+
itemId: item.itemId,
|
|
1539
|
+
deadlineAt,
|
|
1540
|
+
payload: {
|
|
1541
|
+
send: { method: "sendMessage", lane: "ask", text: "Selected!" },
|
|
1542
|
+
topicId,
|
|
1543
|
+
selectedAck: item,
|
|
1544
|
+
},
|
|
1545
|
+
});
|
|
1546
|
+
await this.flushPool();
|
|
1547
|
+
},
|
|
1548
|
+
})
|
|
1549
|
+
.add({
|
|
1550
|
+
name: "ask-selected-ack-cancel",
|
|
1551
|
+
matches: msg => msg.type === "ask_selected_ack_cancel",
|
|
1552
|
+
handle: (session, msg) => {
|
|
1553
|
+
const requestId = typeof msg.requestId === "string" ? msg.requestId : undefined;
|
|
1554
|
+
const commitKey = typeof msg.commitKey === "string" ? msg.commitKey : undefined;
|
|
1555
|
+
if (!requestId || !commitKey) return;
|
|
1556
|
+
const item = this.selectedAckPending.get(`${session.endpointKey}\0${requestId}`);
|
|
1557
|
+
if (!item || item.commitKey !== commitKey) return;
|
|
1558
|
+
if (item.requestId !== requestId) {
|
|
1559
|
+
item.followers = item.followers.filter(follower => follower.requestId !== requestId);
|
|
1560
|
+
this.selectedAckPending.delete(`${session.endpointKey}\0${requestId}`);
|
|
1561
|
+
if (session.ws.readyState === WebSocket.OPEN) {
|
|
1562
|
+
session.ws.send(
|
|
1563
|
+
JSON.stringify({
|
|
1564
|
+
type: "ask_selected_ack_result",
|
|
1565
|
+
requestId,
|
|
1566
|
+
commitKey,
|
|
1567
|
+
outcome: { status: "failed", reason: "cancelled" },
|
|
1568
|
+
}),
|
|
1569
|
+
);
|
|
1570
|
+
}
|
|
1571
|
+
return;
|
|
1572
|
+
}
|
|
1573
|
+
if (item.followers.length > 0) {
|
|
1574
|
+
const promoted = item.followers.shift()!;
|
|
1575
|
+
this.selectedAckPending.delete(item.pendingKey);
|
|
1576
|
+
item.pendingKey = promoted.pendingKey;
|
|
1577
|
+
item.requestId = promoted.requestId;
|
|
1578
|
+
item.commitKey = promoted.commitKey;
|
|
1579
|
+
if (session.ws.readyState === WebSocket.OPEN) {
|
|
1580
|
+
session.ws.send(
|
|
1581
|
+
JSON.stringify({
|
|
1582
|
+
type: "ask_selected_ack_result",
|
|
1583
|
+
requestId,
|
|
1584
|
+
commitKey,
|
|
1585
|
+
outcome: { status: "failed", reason: "cancelled" },
|
|
1586
|
+
}),
|
|
1587
|
+
);
|
|
1588
|
+
}
|
|
1589
|
+
return;
|
|
1590
|
+
}
|
|
1591
|
+
if (item.state !== "sending") {
|
|
1592
|
+
this.pool.removeById(item.itemId);
|
|
1593
|
+
this.finishSelectedAck(item, { status: "failed", reason: "cancelled" });
|
|
1594
|
+
return;
|
|
1595
|
+
}
|
|
1596
|
+
item.controller?.abort();
|
|
1597
|
+
this.finishSelectedAck(item, { status: "unknown", reason: "transport_ambiguous" });
|
|
1598
|
+
},
|
|
1599
|
+
})
|
|
1314
1600
|
.add({
|
|
1315
1601
|
name: "pong",
|
|
1316
1602
|
matches: msg => msg.type === "pong",
|
|
@@ -1484,7 +1770,7 @@ export class TelegramNotificationDaemon {
|
|
|
1484
1770
|
JSON.stringify({
|
|
1485
1771
|
type: "hello",
|
|
1486
1772
|
protocolVersion: NOTIFICATION_PROTOCOL_VERSION,
|
|
1487
|
-
capabilities: [CLIENT_PING_PONG_CAPABILITY],
|
|
1773
|
+
capabilities: [CLIENT_PING_PONG_CAPABILITY, ASK_CONTROLS_CAPABILITY, ASK_SELECTED_ACK_CAPABILITY],
|
|
1488
1774
|
}),
|
|
1489
1775
|
);
|
|
1490
1776
|
} catch {}
|
|
@@ -1559,6 +1845,12 @@ export class TelegramNotificationDaemon {
|
|
|
1559
1845
|
if (isCurrentSession) {
|
|
1560
1846
|
this.sessions.delete(session.sessionId);
|
|
1561
1847
|
}
|
|
1848
|
+
for (const item of new Set(this.selectedAckPending.values())) {
|
|
1849
|
+
if (item.session !== session) continue;
|
|
1850
|
+
if (item.state === "queued") this.pool.removeById(item.itemId);
|
|
1851
|
+
else item.controller?.abort();
|
|
1852
|
+
this.finishSelectedAck(item, { status: "unknown", reason: "transport_ambiguous" });
|
|
1853
|
+
}
|
|
1562
1854
|
if (session.ws.readyState !== WebSocket.CLOSED) {
|
|
1563
1855
|
try {
|
|
1564
1856
|
session.ws.close();
|
|
@@ -1588,6 +1880,12 @@ export class TelegramNotificationDaemon {
|
|
|
1588
1880
|
const repo = typeof msg?.repo === "string" && msg.repo ? msg.repo : undefined;
|
|
1589
1881
|
const branch = typeof msg?.branch === "string" && msg.branch ? msg.branch : undefined;
|
|
1590
1882
|
const title = typeof msg?.title === "string" && msg.title ? msg.title : undefined;
|
|
1883
|
+
// A configured `nameTemplate` (e.g. "{title} · {repo}/{branch}") wins only
|
|
1884
|
+
// when every placeholder it references resolves for this session; otherwise
|
|
1885
|
+
// we fall through to the built-in composition so provisional/edge names
|
|
1886
|
+
// (missing title, repo, or branch) never render with dangling separators.
|
|
1887
|
+
const templated = this.renderTopicNameTemplate({ repo, branch, title });
|
|
1888
|
+
if (templated !== undefined) return templated;
|
|
1591
1889
|
// Name the topic "{repo}/{branch}" before a session title exists, then
|
|
1592
1890
|
// "{repo}/{branch} - {title}" once it does. Fall back to the session id
|
|
1593
1891
|
// only when no repo identity is available.
|
|
@@ -1597,6 +1895,32 @@ export class TelegramNotificationDaemon {
|
|
|
1597
1895
|
return `SKC ${sessionId.slice(-6)}`;
|
|
1598
1896
|
}
|
|
1599
1897
|
|
|
1898
|
+
/**
|
|
1899
|
+
* Render the operator-configured topic name template, or `undefined` when no
|
|
1900
|
+
* usable template applies so the caller uses the built-in composition. The
|
|
1901
|
+
* template is honored only if it is non-blank AND every placeholder it
|
|
1902
|
+
* references (`{repo}`, `{branch}`, `{title}`) has a value for this session,
|
|
1903
|
+
* which preserves the default title/repo/branch fallbacks and prevents
|
|
1904
|
+
* half-filled names with dangling separators. Unknown placeholders are left
|
|
1905
|
+
* verbatim.
|
|
1906
|
+
*/
|
|
1907
|
+
private renderTopicNameTemplate(values: { repo?: string; branch?: string; title?: string }): string | undefined {
|
|
1908
|
+
const template = this.opts.topics?.nameTemplate?.trim();
|
|
1909
|
+
if (!template) return undefined;
|
|
1910
|
+
let missing = false;
|
|
1911
|
+
const rendered = template.replace(/\{(repo|branch|title)\}/g, (_match, key: "repo" | "branch" | "title") => {
|
|
1912
|
+
const value = values[key];
|
|
1913
|
+
if (!value) {
|
|
1914
|
+
missing = true;
|
|
1915
|
+
return "";
|
|
1916
|
+
}
|
|
1917
|
+
return value;
|
|
1918
|
+
});
|
|
1919
|
+
if (missing) return undefined;
|
|
1920
|
+
const trimmed = rendered.trim();
|
|
1921
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
1922
|
+
}
|
|
1923
|
+
|
|
1600
1924
|
private topicIdentityKey(msg: { repo?: unknown; branch?: unknown }): string | undefined {
|
|
1601
1925
|
const repo = typeof msg?.repo === "string" && msg.repo.trim() ? msg.repo.trim() : undefined;
|
|
1602
1926
|
if (!repo) return undefined;
|
|
@@ -1615,11 +1939,13 @@ export class TelegramNotificationDaemon {
|
|
|
1615
1939
|
const identityKey = this.topicIdentityKey(msg);
|
|
1616
1940
|
const remembered = identityKey ? this.topicOwnerByIdentity.get(identityKey) : undefined;
|
|
1617
1941
|
if (remembered && this.topics.get(remembered)) return remembered;
|
|
1942
|
+
if (!identityKey) return undefined;
|
|
1618
1943
|
const base = this.topicIdentityBase(msg);
|
|
1619
|
-
if (!identityKey || !base) return undefined;
|
|
1620
1944
|
for (const sessionId of this.topics.sessionIds()) {
|
|
1621
|
-
const
|
|
1622
|
-
|
|
1945
|
+
const topic = this.topics.get(sessionId);
|
|
1946
|
+
const nameMatchesLegacyIdentity =
|
|
1947
|
+
base !== undefined && (topic?.name === base || topic?.name?.startsWith(`${base} - `));
|
|
1948
|
+
if (topic?.identityKey === identityKey || nameMatchesLegacyIdentity) {
|
|
1623
1949
|
this.topicOwnerByIdentity.set(identityKey, sessionId);
|
|
1624
1950
|
return sessionId;
|
|
1625
1951
|
}
|
|
@@ -1649,6 +1975,37 @@ export class TelegramNotificationDaemon {
|
|
|
1649
1975
|
return this.topics.get(sessionId)?.topicId;
|
|
1650
1976
|
}
|
|
1651
1977
|
|
|
1978
|
+
/** Best-effort re-assertion for a durable user-owned topic name. */
|
|
1979
|
+
private async reconcileUserTopicName(sessionId: string, topicId: string): Promise<void> {
|
|
1980
|
+
if ((this.daemonRenameAttempts.get(sessionId) ?? 0) > 0) return;
|
|
1981
|
+
let userName = this.topics.userNameToReconcile(sessionId);
|
|
1982
|
+
while (userName) {
|
|
1983
|
+
try {
|
|
1984
|
+
const response = await this.botApi.call("editForumTopic", {
|
|
1985
|
+
chat_id: this.opts.chatId,
|
|
1986
|
+
message_thread_id: Number(topicId),
|
|
1987
|
+
name: userName,
|
|
1988
|
+
});
|
|
1989
|
+
if (!topicRenameApplied(response)) return;
|
|
1990
|
+
const latestUserName = this.topics.userOwnedName(sessionId);
|
|
1991
|
+
if (latestUserName === userName) {
|
|
1992
|
+
if (this.topics.markUserNameReconciled(sessionId, userName)) {
|
|
1993
|
+
try {
|
|
1994
|
+
await this.persistTopics();
|
|
1995
|
+
} catch {
|
|
1996
|
+
this.topics.markUserNamePending(sessionId, userName);
|
|
1997
|
+
}
|
|
1998
|
+
}
|
|
1999
|
+
return;
|
|
2000
|
+
}
|
|
2001
|
+
userName = this.topics.userNameToReconcile(sessionId);
|
|
2002
|
+
} catch {
|
|
2003
|
+
// Keep the durable pending flag so the next identity frame retries.
|
|
2004
|
+
return;
|
|
2005
|
+
}
|
|
2006
|
+
}
|
|
2007
|
+
}
|
|
2008
|
+
|
|
1652
2009
|
private rememberPendingThreadedFrame(sessionId: string, send: ThreadedSend, msg: Record<string, unknown>): void {
|
|
1653
2010
|
const frames = this.pendingThreadedFrames.get(sessionId) ?? [];
|
|
1654
2011
|
frames.push({ send, msg });
|
|
@@ -1716,7 +2073,11 @@ export class TelegramNotificationDaemon {
|
|
|
1716
2073
|
try {
|
|
1717
2074
|
// Drop queued sends for this session before deleting the topic; otherwise
|
|
1718
2075
|
// rate-limited frames can flush later into a deleted topic or across resume.
|
|
1719
|
-
this.pool.removeWhere(item => item.sessionId === sessionId);
|
|
2076
|
+
const removed = this.pool.removeWhere(item => item.sessionId === sessionId);
|
|
2077
|
+
for (const item of removed) {
|
|
2078
|
+
if (item.payload.selectedAck)
|
|
2079
|
+
this.finishSelectedAck(item.payload.selectedAck, { status: "failed", reason: "cancelled" });
|
|
2080
|
+
}
|
|
1720
2081
|
await this.flushPool();
|
|
1721
2082
|
const res = (await this.botApi.call("deleteForumTopic", {
|
|
1722
2083
|
chat_id: this.opts.chatId,
|
|
@@ -1737,10 +2098,14 @@ export class TelegramNotificationDaemon {
|
|
|
1737
2098
|
}
|
|
1738
2099
|
}
|
|
1739
2100
|
|
|
1740
|
-
private
|
|
1741
|
-
const
|
|
1742
|
-
|
|
1743
|
-
|
|
2101
|
+
private persistTopics(): Promise<void> {
|
|
2102
|
+
const pending = this.topicsPersistQueue.then(async () => {
|
|
2103
|
+
const paths = daemonPaths(this.opts.settings.getAgentDir());
|
|
2104
|
+
await ensureDir(this.fsImpl, paths.dir);
|
|
2105
|
+
await writeJsonAtomic(this.fsImpl, path.join(paths.dir, "telegram-topics.json"), this.topics.serialize());
|
|
2106
|
+
});
|
|
2107
|
+
this.topicsPersistQueue = pending.catch(() => undefined);
|
|
2108
|
+
return pending;
|
|
1744
2109
|
}
|
|
1745
2110
|
|
|
1746
2111
|
async loadTopics(): Promise<void> {
|
|
@@ -1871,7 +2236,12 @@ export class TelegramNotificationDaemon {
|
|
|
1871
2236
|
|
|
1872
2237
|
/** Drain the shared rate-limit pool and deliver each granted send to its topic. */
|
|
1873
2238
|
private async flushPoolInner(): Promise<void> {
|
|
1874
|
-
const batch = this.pool.
|
|
2239
|
+
const { granted: batch, expired } = this.pool.drainWithExpired();
|
|
2240
|
+
for (const expiredItem of expired) {
|
|
2241
|
+
if (expiredItem.payload.selectedAck) {
|
|
2242
|
+
this.finishSelectedAck(expiredItem.payload.selectedAck, { status: "failed", reason: "expired" });
|
|
2243
|
+
}
|
|
2244
|
+
}
|
|
1875
2245
|
// Within a batch a finalized frame supersedes any still-queued live frame for
|
|
1876
2246
|
// the same streamed message (finalized outranks live), so drop the stale live
|
|
1877
2247
|
// edit — otherwise the authoritative final text could be overwritten by an
|
|
@@ -1894,6 +2264,51 @@ export class TelegramNotificationDaemon {
|
|
|
1894
2264
|
);
|
|
1895
2265
|
}
|
|
1896
2266
|
for (const item of batch) {
|
|
2267
|
+
const selectedAck = item.payload.selectedAck;
|
|
2268
|
+
if (selectedAck) {
|
|
2269
|
+
const { topicId } = item.payload;
|
|
2270
|
+
selectedAck.state = "dispatching";
|
|
2271
|
+
const controller = new AbortController();
|
|
2272
|
+
selectedAck.controller = controller;
|
|
2273
|
+
const routeAvailable = !topicId || (await this.pairedChatIsPrivate());
|
|
2274
|
+
if (this.selectedAckPending.get(selectedAck.pendingKey) !== selectedAck) continue;
|
|
2275
|
+
if (!routeAvailable) {
|
|
2276
|
+
this.finishSelectedAck(selectedAck, { status: "failed", reason: "route_missing" });
|
|
2277
|
+
continue;
|
|
2278
|
+
}
|
|
2279
|
+
if (item.deadlineAt !== undefined && item.deadlineAt <= this.runtime.now()) {
|
|
2280
|
+
this.finishSelectedAck(selectedAck, { status: "failed", reason: "expired" });
|
|
2281
|
+
continue;
|
|
2282
|
+
}
|
|
2283
|
+
selectedAck.state = "sending";
|
|
2284
|
+
const remaining = Math.max(0, (item.deadlineAt ?? this.runtime.now()) - this.runtime.now());
|
|
2285
|
+
const timer = (this.opts.setTimeoutImpl ?? setTimeout)(
|
|
2286
|
+
() => controller.abort(),
|
|
2287
|
+
Math.min(8_000, remaining),
|
|
2288
|
+
);
|
|
2289
|
+
try {
|
|
2290
|
+
const response = (await this.botApi.call(
|
|
2291
|
+
"sendMessage",
|
|
2292
|
+
{
|
|
2293
|
+
chat_id: this.opts.chatId,
|
|
2294
|
+
...(topicId ? { message_thread_id: Number(topicId) } : {}),
|
|
2295
|
+
text: "Selected!",
|
|
2296
|
+
},
|
|
2297
|
+
{ signal: controller.signal, noRetry: true },
|
|
2298
|
+
)) as { ok?: unknown; result?: { message_id?: unknown } };
|
|
2299
|
+
this.finishSelectedAck(
|
|
2300
|
+
selectedAck,
|
|
2301
|
+
response.ok === true && typeof response.result?.message_id === "number"
|
|
2302
|
+
? { status: "delivered", messageId: response.result.message_id }
|
|
2303
|
+
: { status: "failed", reason: "telegram_rejected" },
|
|
2304
|
+
);
|
|
2305
|
+
} catch {
|
|
2306
|
+
this.finishSelectedAck(selectedAck, { status: "unknown", reason: "transport_ambiguous" });
|
|
2307
|
+
} finally {
|
|
2308
|
+
(this.opts.clearTimeoutImpl ?? clearTimeout)(timer);
|
|
2309
|
+
}
|
|
2310
|
+
continue;
|
|
2311
|
+
}
|
|
1897
2312
|
const { send, topicId } = item.payload;
|
|
1898
2313
|
if (topicId && !(await this.pairedChatIsPrivate())) continue;
|
|
1899
2314
|
// Threaded topic when available; otherwise deliver flat to the paired chat.
|
|
@@ -2128,25 +2543,43 @@ export class TelegramNotificationDaemon {
|
|
|
2128
2543
|
}
|
|
2129
2544
|
|
|
2130
2545
|
/**
|
|
2131
|
-
* Resolve (and cache
|
|
2132
|
-
* private chat. Topic and flat delivery are only safe in a private DM;
|
|
2133
|
-
*
|
|
2134
|
-
*
|
|
2546
|
+
* Resolve (and cache definitive resolution of) whether the paired `chatId` is
|
|
2547
|
+
* a private chat. Topic and flat delivery are only safe in a private DM; an
|
|
2548
|
+
* indeterminate `getChat` result fails closed for this attempt and is retried
|
|
2549
|
+
* later.
|
|
2135
2550
|
*/
|
|
2136
|
-
private async
|
|
2137
|
-
if (this.pairedChatPrivate !== undefined) return this.pairedChatPrivate;
|
|
2551
|
+
private async resolvePairedChatPrivacy(): Promise<PairedChatPrivacy> {
|
|
2552
|
+
if (this.pairedChatPrivate !== undefined) return this.pairedChatPrivate ? "private" : "non-private";
|
|
2138
2553
|
try {
|
|
2139
2554
|
const res = (await this.botApi.call("getChat", { chat_id: this.opts.chatId })) as {
|
|
2140
|
-
|
|
2555
|
+
ok?: unknown;
|
|
2556
|
+
result?: { type?: unknown };
|
|
2141
2557
|
};
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2558
|
+
if (res?.ok !== true) {
|
|
2559
|
+
logger.warn("notifications: getChat privacy check indeterminate (non-success response)");
|
|
2560
|
+
return "indeterminate";
|
|
2561
|
+
}
|
|
2562
|
+
if (res.result?.type === "private") {
|
|
2563
|
+
this.pairedChatPrivate = true;
|
|
2564
|
+
return "private";
|
|
2565
|
+
}
|
|
2566
|
+
if (res.result?.type === "group" || res.result?.type === "supergroup" || res.result?.type === "channel") {
|
|
2567
|
+
this.pairedChatPrivate = false;
|
|
2568
|
+
return "non-private";
|
|
2569
|
+
}
|
|
2570
|
+
logger.warn("notifications: getChat privacy check indeterminate (missing or invalid chat type)");
|
|
2571
|
+
return "indeterminate";
|
|
2572
|
+
} catch {
|
|
2573
|
+
logger.warn("notifications: getChat privacy check indeterminate (request failed)");
|
|
2574
|
+
return "indeterminate";
|
|
2147
2575
|
}
|
|
2148
2576
|
}
|
|
2149
2577
|
|
|
2578
|
+
/** Keep existing outbound callers fail-closed for indeterminate privacy. */
|
|
2579
|
+
private async pairedChatIsPrivate(): Promise<boolean> {
|
|
2580
|
+
return (await this.resolvePairedChatPrivacy()) === "private";
|
|
2581
|
+
}
|
|
2582
|
+
|
|
2150
2583
|
/** Tell the user once (per daemon run) how to enable Threaded Mode. */
|
|
2151
2584
|
private async notifyThreadedFallback(): Promise<void> {
|
|
2152
2585
|
if (this.threadedFallbackNoticeSent || !(await this.pairedChatIsPrivate())) return;
|
|
@@ -2257,26 +2690,37 @@ export class TelegramNotificationDaemon {
|
|
|
2257
2690
|
}
|
|
2258
2691
|
if (send.identity) {
|
|
2259
2692
|
const identityKey = this.topicIdentityKey(msg);
|
|
2260
|
-
if (identityKey)
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
//
|
|
2265
|
-
//
|
|
2266
|
-
//
|
|
2267
|
-
|
|
2693
|
+
if (identityKey) {
|
|
2694
|
+
this.topicOwnerByIdentity.set(identityKey, session.sessionId);
|
|
2695
|
+
if (this.topics.markIdentityKey(session.sessionId, identityKey)) await this.persistTopics();
|
|
2696
|
+
}
|
|
2697
|
+
// Explicit Telegram-side user renames own the topic title. Pending user
|
|
2698
|
+
// reconciliation runs before daemon identity naming, so retries and daemon
|
|
2699
|
+
// restarts cannot silently replace the preserved name.
|
|
2700
|
+
await this.reconcileUserTopicName(session.sessionId, topicId);
|
|
2268
2701
|
const name = this.topicNameFor(session.sessionId, msg);
|
|
2269
2702
|
if (this.topics.needsRename(session.sessionId, name)) {
|
|
2703
|
+
this.daemonRenameAttempts.set(
|
|
2704
|
+
session.sessionId,
|
|
2705
|
+
(this.daemonRenameAttempts.get(session.sessionId) ?? 0) + 1,
|
|
2706
|
+
);
|
|
2270
2707
|
try {
|
|
2271
|
-
await this.botApi.call("editForumTopic", {
|
|
2708
|
+
const response = await this.botApi.call("editForumTopic", {
|
|
2272
2709
|
chat_id: this.opts.chatId,
|
|
2273
2710
|
message_thread_id: Number(topicId),
|
|
2274
2711
|
name,
|
|
2275
2712
|
});
|
|
2276
|
-
this.topics.markNameApplied(session.sessionId, name);
|
|
2713
|
+
if (topicRenameApplied(response)) this.topics.markNameApplied(session.sessionId, name);
|
|
2277
2714
|
} catch {
|
|
2278
|
-
// Best-effort rename;
|
|
2279
|
-
//
|
|
2715
|
+
// Best-effort rename; leave daemon-owned names unchanged so a
|
|
2716
|
+
// later identity frame retries.
|
|
2717
|
+
} finally {
|
|
2718
|
+
const remaining = (this.daemonRenameAttempts.get(session.sessionId) ?? 1) - 1;
|
|
2719
|
+
if (remaining > 0) this.daemonRenameAttempts.set(session.sessionId, remaining);
|
|
2720
|
+
else {
|
|
2721
|
+
this.daemonRenameAttempts.delete(session.sessionId);
|
|
2722
|
+
await this.reconcileUserTopicName(session.sessionId, topicId);
|
|
2723
|
+
}
|
|
2280
2724
|
}
|
|
2281
2725
|
}
|
|
2282
2726
|
// Send the full bulleted identity header EXACTLY ONCE per topic.
|
|
@@ -2300,19 +2744,54 @@ export class TelegramNotificationDaemon {
|
|
|
2300
2744
|
await this.notifyThreadedFallback();
|
|
2301
2745
|
}
|
|
2302
2746
|
const threadField = topicId ? { message_thread_id: Number(topicId) } : {};
|
|
2747
|
+
const controls: Array<{
|
|
2748
|
+
id: "navigation_forward";
|
|
2749
|
+
kind: "navigation";
|
|
2750
|
+
label: "Next" | "Done";
|
|
2751
|
+
enabled: boolean;
|
|
2752
|
+
}> = Array.isArray(msg.controls)
|
|
2753
|
+
? msg.controls.filter(
|
|
2754
|
+
(
|
|
2755
|
+
control: unknown,
|
|
2756
|
+
): control is {
|
|
2757
|
+
id: "navigation_forward";
|
|
2758
|
+
kind: "navigation";
|
|
2759
|
+
label: "Next" | "Done";
|
|
2760
|
+
enabled: boolean;
|
|
2761
|
+
} =>
|
|
2762
|
+
!!control &&
|
|
2763
|
+
typeof control === "object" &&
|
|
2764
|
+
(control as { id?: unknown }).id === "navigation_forward" &&
|
|
2765
|
+
(control as { kind?: unknown }).kind === "navigation" &&
|
|
2766
|
+
((control as { label?: unknown }).label === "Next" ||
|
|
2767
|
+
(control as { label?: unknown }).label === "Done") &&
|
|
2768
|
+
(control as { enabled?: unknown }).enabled === true,
|
|
2769
|
+
)
|
|
2770
|
+
: [];
|
|
2303
2771
|
const rendered = buildActionMessage({
|
|
2304
2772
|
kind: msg.kind ?? "ask",
|
|
2305
2773
|
id: msg.id,
|
|
2306
2774
|
question: msg.question,
|
|
2307
2775
|
options: msg.options,
|
|
2776
|
+
controls,
|
|
2308
2777
|
summary: msg.summary,
|
|
2309
2778
|
});
|
|
2310
2779
|
const options = Array.isArray(msg.options) ? msg.options : [];
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2780
|
+
const inline_keyboard = [
|
|
2781
|
+
...buildCompactChoiceGrid(options, (i: number) =>
|
|
2782
|
+
this.aliasTable.put({ sessionId: session.sessionId, actionId: msg.id, answer: i }),
|
|
2783
|
+
),
|
|
2784
|
+
...controls.map(control => [
|
|
2785
|
+
{
|
|
2786
|
+
text: control.label,
|
|
2787
|
+
callback_data: this.aliasTable.put({
|
|
2788
|
+
sessionId: session.sessionId,
|
|
2789
|
+
actionId: msg.id,
|
|
2790
|
+
answer: { controlId: control.id },
|
|
2791
|
+
}),
|
|
2792
|
+
},
|
|
2793
|
+
]),
|
|
2794
|
+
];
|
|
2316
2795
|
// HTML delivery: one sendMessage per chunk, keyboard on the last chunk;
|
|
2317
2796
|
// returns the last chunk's message_id (the reply-routable message).
|
|
2318
2797
|
const sendHtmlChunks = async (): Promise<number | undefined> => {
|
|
@@ -2395,7 +2874,78 @@ export class TelegramNotificationDaemon {
|
|
|
2395
2874
|
});
|
|
2396
2875
|
}
|
|
2397
2876
|
|
|
2877
|
+
/** Consume Telegram forum-topic rename service messages before text routing. */
|
|
2878
|
+
private async handleForumTopicEdited(update: unknown): Promise<"not-topic" | TelegramUpdateOutcome> {
|
|
2879
|
+
const parsed = update as {
|
|
2880
|
+
update_id?: unknown;
|
|
2881
|
+
message?: {
|
|
2882
|
+
chat?: { id?: unknown };
|
|
2883
|
+
from?: { id?: unknown; is_bot?: unknown };
|
|
2884
|
+
message_thread_id?: unknown;
|
|
2885
|
+
forum_topic_edited?: { name?: unknown };
|
|
2886
|
+
};
|
|
2887
|
+
};
|
|
2888
|
+
const message = parsed.message;
|
|
2889
|
+
if (!message?.forum_topic_edited) return "not-topic";
|
|
2890
|
+
const updateId = parsed.update_id;
|
|
2891
|
+
if (typeof updateId !== "number" || !Number.isSafeInteger(updateId) || updateId < 0) return "consumed";
|
|
2892
|
+
if (this.dispatchState.seenUpdateIds.has(updateId)) return "consumed";
|
|
2893
|
+
const configuredUserId = Number(this.opts.chatId);
|
|
2894
|
+
if (
|
|
2895
|
+
!Number.isSafeInteger(configuredUserId) ||
|
|
2896
|
+
typeof message.chat?.id !== "number" ||
|
|
2897
|
+
message.chat.id !== configuredUserId ||
|
|
2898
|
+
message.from?.id !== configuredUserId ||
|
|
2899
|
+
message.from?.is_bot !== false
|
|
2900
|
+
)
|
|
2901
|
+
return "consumed";
|
|
2902
|
+
const privacy = await this.resolvePairedChatPrivacy();
|
|
2903
|
+
if (privacy === "indeterminate") return "retry";
|
|
2904
|
+
if (privacy !== "private") return "consumed";
|
|
2905
|
+
const threadId = message.message_thread_id;
|
|
2906
|
+
if (typeof threadId !== "number" || !Number.isSafeInteger(threadId)) return "consumed";
|
|
2907
|
+
const sessionId = this.topics.sessionForTopic(String(threadId));
|
|
2908
|
+
if (!sessionId) return "consumed";
|
|
2909
|
+
const name = message.forum_topic_edited.name;
|
|
2910
|
+
if (typeof name !== "string" || name.trim().length === 0) return "consumed";
|
|
2911
|
+
const result = this.topics.markUserName(sessionId, name, updateId);
|
|
2912
|
+
if (result === "stale") {
|
|
2913
|
+
await this.rememberSeenUpdateId(updateId);
|
|
2914
|
+
return "consumed";
|
|
2915
|
+
}
|
|
2916
|
+
if (result === "duplicate") {
|
|
2917
|
+
try {
|
|
2918
|
+
await this.persistTopics();
|
|
2919
|
+
} catch {
|
|
2920
|
+
return "retry";
|
|
2921
|
+
}
|
|
2922
|
+
await this.reconcileUserTopicName(sessionId, String(threadId));
|
|
2923
|
+
await this.rememberSeenUpdateId(updateId);
|
|
2924
|
+
return "consumed";
|
|
2925
|
+
}
|
|
2926
|
+
try {
|
|
2927
|
+
await this.persistTopics();
|
|
2928
|
+
} catch {
|
|
2929
|
+
return "retry";
|
|
2930
|
+
}
|
|
2931
|
+
await this.reconcileUserTopicName(sessionId, String(threadId));
|
|
2932
|
+
await this.rememberSeenUpdateId(updateId);
|
|
2933
|
+
return "consumed";
|
|
2934
|
+
}
|
|
2935
|
+
|
|
2936
|
+
private async processTelegramUpdate(update: unknown): Promise<TelegramUpdateOutcome> {
|
|
2937
|
+
const topicOutcome = await this.handleForumTopicEdited(update);
|
|
2938
|
+
if (topicOutcome !== "not-topic") return topicOutcome;
|
|
2939
|
+
try {
|
|
2940
|
+
await this.handleTelegramUpdate(update);
|
|
2941
|
+
} catch (err) {
|
|
2942
|
+
logger.error("notifications daemon: handleTelegramUpdate failed", { error: String(err) });
|
|
2943
|
+
}
|
|
2944
|
+
return "consumed";
|
|
2945
|
+
}
|
|
2946
|
+
|
|
2398
2947
|
async handleTelegramUpdate(update: unknown): Promise<void> {
|
|
2948
|
+
if ((await this.handleForumTopicEdited(update)) !== "not-topic") return;
|
|
2399
2949
|
// Session-lifecycle command (/session_*): handled ONLY from the paired chat,
|
|
2400
2950
|
// gated before any arg parsing or side effect, and routed through the control
|
|
2401
2951
|
// endpoint. Must run before threaded-injection so commands are not treated as
|
|
@@ -2580,15 +3130,6 @@ export class TelegramNotificationDaemon {
|
|
|
2580
3130
|
}),
|
|
2581
3131
|
);
|
|
2582
3132
|
await this.rememberSeenUpdateId(inbound.updateId);
|
|
2583
|
-
await this.botApi
|
|
2584
|
-
.call("sendMessage", {
|
|
2585
|
-
chat_id: this.opts.chatId,
|
|
2586
|
-
message_thread_id: Number(inbound.threadId),
|
|
2587
|
-
text: "Received as an answer to the pending ask.",
|
|
2588
|
-
})
|
|
2589
|
-
.catch(error => {
|
|
2590
|
-
logger.warn(`telegram: failed to acknowledge pending ask reply: ${String(error)}`);
|
|
2591
|
-
});
|
|
2592
3133
|
if (inbound.messageId !== undefined) await this.setReaction(inbound.messageId, QUEUED_REACTION);
|
|
2593
3134
|
return;
|
|
2594
3135
|
}
|