@sayknow-cli/coding-agent 0.3.11 → 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/CHANGELOG.md +0 -21
- package/package.json +116 -117
- package/scripts/build-binary.ts +2 -43
- package/scripts/compile-args.ts +106 -0
- package/scripts/g004-tmux-smoke.ts +196 -36
- package/scripts/generate-docs-index.ts +3 -0
- package/src/build-metadata.ts +104 -0
- package/src/capability/mcp.ts +3 -1
- 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/mcp-cli.ts +108 -26
- 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 +71 -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/mcp.ts +8 -8
- package/src/commands/notify.ts +5 -1
- package/src/commands/session.ts +6 -1
- package/src/commands/stats.ts +6 -2
- package/src/config/keybindings.ts +7 -2
- package/src/config/mcp-schema.json +21 -17
- package/src/config/model-profile-activation.ts +1 -1
- package/src/config/model-profiles.ts +23 -23
- 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/discovery/builtin.ts +14 -0
- package/src/discovery/mcp-json.ts +14 -0
- package/src/eval/js/executor.ts +7 -1
- package/src/internal-urls/docs-index.generated.ts +10 -9
- package/src/internal-urls/local-protocol.ts +29 -10
- package/src/internal-urls/skc-protocol.ts +14 -1
- package/src/main.ts +298 -75
- package/src/modes/acp/acp-agent.ts +800 -114
- package/src/modes/acp/acp-client-bridge.ts +27 -5
- package/src/modes/acp/acp-event-mapper.ts +39 -1
- package/src/modes/acp/acp-mode.ts +29 -2
- package/src/modes/components/assistant-message.ts +33 -4
- 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 +16 -0
- package/src/modes/components/irc-sidebar.ts +206 -0
- package/src/modes/components/model-selector.ts +17 -6
- 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 +223 -222
- package/src/modes/components/settings-selector.ts +10 -0
- package/src/modes/components/status-line/presets.ts +5 -19
- package/src/modes/components/status-line/segments.ts +14 -0
- package/src/modes/components/status-line/types.ts +6 -0
- package/src/modes/components/status-line.ts +13 -6
- package/src/modes/components/tool-execution.ts +48 -7
- package/src/modes/components/user-message.ts +26 -9
- package/src/modes/components/welcome.ts +4 -1
- package/src/modes/controllers/command-controller.ts +29 -3
- package/src/modes/controllers/event-controller.ts +168 -45
- package/src/modes/controllers/extension-ui-controller.ts +36 -17
- package/src/modes/controllers/input-controller.ts +16 -4
- package/src/modes/controllers/selector-controller.ts +69 -18
- package/src/modes/interactive-mode.ts +194 -10
- package/src/modes/irc-observation-ledger.ts +127 -0
- package/src/modes/rpc/rpc-client.ts +30 -6
- 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 +368 -80
- 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 +663 -96
- 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/prompts/tools/skill.md +2 -2
- package/src/registry/agent-registry.ts +3 -0
- package/src/runtime-mcp/config-writer.ts +4 -3
- package/src/runtime-mcp/config.ts +1 -0
- package/src/runtime-mcp/types.ts +4 -3
- package/src/sdk.ts +52 -1
- package/src/secrets/obfuscator.ts +4 -2
- package/src/session/agent-session.ts +513 -148
- 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 +877 -79
- package/src/session/session-storage.ts +582 -38
- package/src/skc-runtime/session-state-sidecar.ts +756 -135
- package/src/skc-runtime/state-runtime.ts +105 -12
- 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/skc-runtime/workflow-manifest.generated.json +4 -28
- package/src/skc-runtime/workflow-manifest.ts +1 -7
- package/src/slash-commands/builtin-registry.ts +152 -13
- 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/bash-interactive.ts +9 -4
- package/src/tools/browser/readable.ts +2 -2
- package/src/tools/browser/tab-supervisor.ts +63 -6
- package/src/tools/browser.ts +8 -3
- package/src/tools/fetch.ts +5 -5
- package/src/tools/index.ts +81 -6
- package/src/tools/skill.ts +14 -11
- 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/src/utils/linkedom.ts +14 -0
- package/src/utils/pasted-image-path.ts +23 -9
- package/src/web/scrapers/arxiv.ts +2 -2
- package/src/web/scrapers/go-pkg.ts +2 -2
- package/src/web/scrapers/iacr.ts +2 -2
- package/src/web/scrapers/readthedocs.ts +2 -2
- package/src/web/scrapers/twitter.ts +3 -2
- package/src/web/scrapers/wikipedia.ts +2 -2
- 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/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 -47
- 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 -34
- 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 -53
- 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 -77
- package/dist/types/modes/components/status-line.d.ts +0 -103
- 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 -45
- 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 -288
- 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 -54
- 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 -429
- 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 -88
- 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 -348
- 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 -1185
- 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 -660
- 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 -47
- 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/markit.d.ts +0 -7
- package/dist/types/utils/open.d.ts +0 -2
- package/dist/types/utils/pasted-image-path.d.ts +0 -30
- 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
|
|
|
@@ -146,6 +175,7 @@ const TYPING_REFRESH_INTERVAL_MS = 4_000;
|
|
|
146
175
|
const QUEUED_REACTION = "👀";
|
|
147
176
|
const PENDING_TOPIC_FRAME_LIMIT = 20;
|
|
148
177
|
const SEEN_UPDATE_ID_LIMIT = 1_000;
|
|
178
|
+
const ORPHAN_TOPIC_GRACE_MS = 60_000;
|
|
149
179
|
const CONSUMED_REACTION = "✅";
|
|
150
180
|
|
|
151
181
|
function splitTelegramPlainText(text: string, max = TELEGRAM_MESSAGE_LIMIT): string[] {
|
|
@@ -166,6 +196,10 @@ function endpointGenerationKey(url: string, token: string): string {
|
|
|
166
196
|
return `${url}\0${token}`;
|
|
167
197
|
}
|
|
168
198
|
|
|
199
|
+
function topicRenameApplied(response: unknown): boolean {
|
|
200
|
+
return !!response && typeof response === "object" && (response as { ok?: unknown }).ok === true;
|
|
201
|
+
}
|
|
202
|
+
|
|
169
203
|
/**
|
|
170
204
|
* Whether `err` is a transient network failure worth retrying. Telegram API
|
|
171
205
|
* calls over HTTP/2 occasionally surface mid-stream `ECONNRESET` (and similar)
|
|
@@ -362,6 +396,7 @@ export async function acquireDaemonOwnership(input: {
|
|
|
362
396
|
attached?: boolean;
|
|
363
397
|
blocked?: boolean;
|
|
364
398
|
reason?: "identity_mismatch";
|
|
399
|
+
reloadRequired?: boolean;
|
|
365
400
|
}> {
|
|
366
401
|
const fsImpl = input.fs ?? nodeFs;
|
|
367
402
|
const now = input.now ?? Date.now;
|
|
@@ -371,6 +406,28 @@ export async function acquireDaemonOwnership(input: {
|
|
|
371
406
|
await ensureDir(fsImpl, paths.dir);
|
|
372
407
|
const ownerId = input.randomId?.() ?? `${pid}-${now().toString(36)}-${Math.random().toString(36).slice(2)}`;
|
|
373
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
|
+
};
|
|
374
431
|
const existing = await readJson<DaemonState>(fsImpl, paths.state);
|
|
375
432
|
if (
|
|
376
433
|
liveOwnerUsesDifferentIdentity({
|
|
@@ -382,17 +439,8 @@ export async function acquireDaemonOwnership(input: {
|
|
|
382
439
|
) {
|
|
383
440
|
return { acquired: false, blocked: true, reason: "identity_mismatch" };
|
|
384
441
|
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
state: existing,
|
|
388
|
-
now: now(),
|
|
389
|
-
tokenFingerprint: input.tokenFingerprint,
|
|
390
|
-
chatId: input.chatId,
|
|
391
|
-
pidAlive,
|
|
392
|
-
})
|
|
393
|
-
) {
|
|
394
|
-
return { acquired: false, attached: true };
|
|
395
|
-
}
|
|
442
|
+
const existingDecision = attachDecision(existing);
|
|
443
|
+
if (existingDecision) return existingDecision;
|
|
396
444
|
if (await tryOpenWx(fsImpl, paths.lock)) {
|
|
397
445
|
await writeJsonAtomic(fsImpl, paths.state, {
|
|
398
446
|
pid,
|
|
@@ -403,6 +451,7 @@ export async function acquireDaemonOwnership(input: {
|
|
|
403
451
|
heartbeatAt: now(),
|
|
404
452
|
roots,
|
|
405
453
|
version: DAEMON_VERSION,
|
|
454
|
+
generation: DAEMON_GENERATION,
|
|
406
455
|
} satisfies DaemonState);
|
|
407
456
|
return { acquired: true, ownerId };
|
|
408
457
|
}
|
|
@@ -417,32 +466,14 @@ export async function acquireDaemonOwnership(input: {
|
|
|
417
466
|
) {
|
|
418
467
|
return { acquired: false, blocked: true, reason: "identity_mismatch" };
|
|
419
468
|
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
state: afterLock,
|
|
423
|
-
now: now(),
|
|
424
|
-
tokenFingerprint: input.tokenFingerprint,
|
|
425
|
-
chatId: input.chatId,
|
|
426
|
-
pidAlive,
|
|
427
|
-
})
|
|
428
|
-
) {
|
|
429
|
-
return { acquired: false, attached: true };
|
|
430
|
-
}
|
|
469
|
+
const afterLockDecision = attachDecision(afterLock);
|
|
470
|
+
if (afterLockDecision) return afterLockDecision;
|
|
431
471
|
if (!afterLock) return { acquired: false, attached: true };
|
|
432
472
|
if (!(await tryOpenWx(fsImpl, paths.steal))) return { acquired: false, attached: true };
|
|
433
473
|
try {
|
|
434
474
|
const rechecked = await readJson<DaemonState>(fsImpl, paths.state);
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
state: rechecked,
|
|
438
|
-
now: now(),
|
|
439
|
-
tokenFingerprint: input.tokenFingerprint,
|
|
440
|
-
chatId: input.chatId,
|
|
441
|
-
pidAlive,
|
|
442
|
-
})
|
|
443
|
-
) {
|
|
444
|
-
return { acquired: false, attached: true };
|
|
445
|
-
}
|
|
475
|
+
const recheckedDecision = attachDecision(rechecked);
|
|
476
|
+
if (recheckedDecision) return recheckedDecision;
|
|
446
477
|
if (
|
|
447
478
|
liveOwnerUsesDifferentIdentity({
|
|
448
479
|
state: rechecked,
|
|
@@ -467,6 +498,7 @@ export async function acquireDaemonOwnership(input: {
|
|
|
467
498
|
heartbeatAt: now(),
|
|
468
499
|
roots,
|
|
469
500
|
version: DAEMON_VERSION,
|
|
501
|
+
generation: DAEMON_GENERATION,
|
|
470
502
|
} satisfies DaemonState);
|
|
471
503
|
return { acquired: true, ownerId };
|
|
472
504
|
} finally {
|
|
@@ -570,6 +602,12 @@ export interface TelegramSpawnOwnerResult {
|
|
|
570
602
|
ownerId?: string;
|
|
571
603
|
runtime: DaemonRuntimeInfo;
|
|
572
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;
|
|
573
611
|
}
|
|
574
612
|
|
|
575
613
|
/**
|
|
@@ -638,7 +676,7 @@ export async function spawnTelegramDaemonOwner(
|
|
|
638
676
|
warnings: ["live telegram daemon uses a different bot token or chat; refusing to attach"],
|
|
639
677
|
};
|
|
640
678
|
}
|
|
641
|
-
return { result: "attached", runtime, warnings: [] };
|
|
679
|
+
return { result: "attached", runtime, warnings: [], reloadRequired: ownership.reloadRequired };
|
|
642
680
|
}
|
|
643
681
|
const spawnImpl = deps.spawn ?? defaultDaemonSpawn;
|
|
644
682
|
const child = spawnImpl(command, args, {
|
|
@@ -666,12 +704,45 @@ export async function ensureTelegramDaemonRunning(
|
|
|
666
704
|
logger.warn(`notifications: failed to ensure Telegram daemon: ${spawned.warnings.join("; ")}`);
|
|
667
705
|
return spawned.result;
|
|
668
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
|
+
}
|
|
669
718
|
await registerNotificationRoot({ ...input, fs: deps.fs });
|
|
670
719
|
return spawned.result;
|
|
671
720
|
}
|
|
672
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
|
+
|
|
673
744
|
export interface BotApi {
|
|
674
|
-
call(method: string, body: unknown, opts?: { signal?: AbortSignal }): Promise<unknown>;
|
|
745
|
+
call(method: string, body: unknown, opts?: { signal?: AbortSignal; noRetry?: boolean }): Promise<unknown>;
|
|
675
746
|
}
|
|
676
747
|
|
|
677
748
|
export interface TelegramTransportOptions {
|
|
@@ -689,7 +760,7 @@ export class TelegramBotTransport implements BotApi {
|
|
|
689
760
|
this.#opts = opts;
|
|
690
761
|
}
|
|
691
762
|
|
|
692
|
-
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> {
|
|
693
764
|
const apiBase = this.#opts.apiBase ?? "https://api.telegram.org";
|
|
694
765
|
const url = `${apiBase}/bot${this.#opts.botToken}/${method}`;
|
|
695
766
|
const fetchImpl = this.#opts.fetchImpl ?? fetch;
|
|
@@ -713,7 +784,13 @@ export class TelegramBotTransport implements BotApi {
|
|
|
713
784
|
if (b.caption) form.set("caption", b.caption);
|
|
714
785
|
if (b.parse_mode) form.set("parse_mode", String(b.parse_mode));
|
|
715
786
|
form.set("photo", new Blob([Buffer.from(b.photo, "base64")], { type: b.mime ?? "image/png" }), "image");
|
|
716
|
-
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
|
+
);
|
|
717
794
|
return res.json();
|
|
718
795
|
}
|
|
719
796
|
const docBody = body as { document?: unknown } | null;
|
|
@@ -737,7 +814,13 @@ export class TelegramBotTransport implements BotApi {
|
|
|
737
814
|
new Blob([Buffer.from(b.document, "base64")], { type: b.mime ?? "application/octet-stream" }),
|
|
738
815
|
b.fileName ?? "file",
|
|
739
816
|
);
|
|
740
|
-
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
|
+
);
|
|
741
824
|
return res.json();
|
|
742
825
|
}
|
|
743
826
|
const res = await fetchWithRetry(
|
|
@@ -750,16 +833,21 @@ export class TelegramBotTransport implements BotApi {
|
|
|
750
833
|
signal: opts?.signal,
|
|
751
834
|
},
|
|
752
835
|
sleep,
|
|
836
|
+
opts?.noRetry ? 1 : undefined,
|
|
753
837
|
);
|
|
754
838
|
return res.json();
|
|
755
839
|
}
|
|
756
840
|
}
|
|
757
841
|
|
|
842
|
+
type PairedChatPrivacy = "private" | "non-private" | "indeterminate";
|
|
843
|
+
|
|
844
|
+
export type TelegramUpdateOutcome = "consumed" | "retry";
|
|
845
|
+
|
|
758
846
|
export interface TelegramUpdatePollerOptions {
|
|
759
847
|
botApi: BotApi;
|
|
760
848
|
runtime: NotificationOperatorRuntime;
|
|
761
849
|
backoff: OperatorBackoffPolicy;
|
|
762
|
-
processUpdate: (update: unknown) => Promise<
|
|
850
|
+
processUpdate: (update: unknown) => Promise<TelegramUpdateOutcome>;
|
|
763
851
|
}
|
|
764
852
|
|
|
765
853
|
/** Owns getUpdates offset, conflict backoff, and per-update error isolation. */
|
|
@@ -804,11 +892,16 @@ export class TelegramUpdatePoller {
|
|
|
804
892
|
}
|
|
805
893
|
this.#opts.backoff.reset();
|
|
806
894
|
for (const update of body.result ?? []) {
|
|
807
|
-
this.#offset = update.update_id + 1;
|
|
808
895
|
try {
|
|
809
|
-
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;
|
|
810
902
|
} catch (err) {
|
|
811
903
|
logger.error("notifications daemon: handleTelegramUpdate failed", { error: String(err) });
|
|
904
|
+
this.#offset = update.update_id + 1;
|
|
812
905
|
}
|
|
813
906
|
}
|
|
814
907
|
return body.result?.length ?? 0;
|
|
@@ -866,6 +959,12 @@ export interface TelegramDaemonOptions {
|
|
|
866
959
|
rich?: { enabled: boolean };
|
|
867
960
|
/** Opt-in rich-draft streaming of live turn previews (off by default; see rich-draft.ts). */
|
|
868
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 };
|
|
869
968
|
}
|
|
870
969
|
|
|
871
970
|
interface SessionSocket {
|
|
@@ -889,6 +988,29 @@ interface PendingThreadedFrame {
|
|
|
889
988
|
msg: Record<string, unknown>;
|
|
890
989
|
}
|
|
891
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
|
+
|
|
892
1014
|
export class TelegramNotificationDaemon {
|
|
893
1015
|
readonly aliasTable: AliasTable;
|
|
894
1016
|
readonly messageRoutes = new Map<string | number, CallbackRoute | Omit<CallbackRoute, "answer">>();
|
|
@@ -903,7 +1025,12 @@ export class TelegramNotificationDaemon {
|
|
|
903
1025
|
private readonly fsImpl: TelegramDaemonFs;
|
|
904
1026
|
private readonly botApi: BotApi;
|
|
905
1027
|
private readonly topics = new TopicRegistry();
|
|
906
|
-
|
|
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>;
|
|
907
1034
|
private readonly poller: TelegramUpdatePoller;
|
|
908
1035
|
private readonly dispatchState = new TelegramEventDispatchState();
|
|
909
1036
|
/** Original markdown of rich messages we sent (chat+message_id), for restoring reply context on inbound replies. */
|
|
@@ -951,6 +1078,33 @@ export class TelegramNotificationDaemon {
|
|
|
951
1078
|
>();
|
|
952
1079
|
/** Monotonic counter for unique lifecycle request ids. */
|
|
953
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
|
+
}
|
|
954
1108
|
|
|
955
1109
|
/**
|
|
956
1110
|
* Cooperatively stop the daemon: set the stop flag and abort the in-flight
|
|
@@ -958,6 +1112,11 @@ export class TelegramNotificationDaemon {
|
|
|
958
1112
|
* ~25s getUpdates timeout. Safe to call from a signal handler.
|
|
959
1113
|
*/
|
|
960
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
|
+
}
|
|
961
1120
|
this.runtime.requestStop();
|
|
962
1121
|
this.running = false;
|
|
963
1122
|
}
|
|
@@ -1293,7 +1452,7 @@ export class TelegramNotificationDaemon {
|
|
|
1293
1452
|
botApi: this.botApi,
|
|
1294
1453
|
runtime: this.runtime,
|
|
1295
1454
|
backoff: this.pollConflictBackoff,
|
|
1296
|
-
processUpdate: update => this.
|
|
1455
|
+
processUpdate: update => this.processTelegramUpdate(update),
|
|
1297
1456
|
});
|
|
1298
1457
|
}
|
|
1299
1458
|
|
|
@@ -1310,6 +1469,134 @@ export class TelegramNotificationDaemon {
|
|
|
1310
1469
|
}
|
|
1311
1470
|
},
|
|
1312
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
|
+
})
|
|
1313
1600
|
.add({
|
|
1314
1601
|
name: "pong",
|
|
1315
1602
|
matches: msg => msg.type === "pong",
|
|
@@ -1414,24 +1701,33 @@ export class TelegramNotificationDaemon {
|
|
|
1414
1701
|
async scanRoots(): Promise<void> {
|
|
1415
1702
|
const paths = daemonPaths(this.opts.settings.getAgentDir());
|
|
1416
1703
|
const rootState = await readJson<{ roots?: string[] }>(this.fsImpl, paths.roots);
|
|
1704
|
+
const endpointSessionIds = new Set<string>();
|
|
1705
|
+
let allRootsReadable = true;
|
|
1417
1706
|
for (const root of rootState?.roots ?? []) {
|
|
1418
1707
|
const dir = path.join(root, "notifications");
|
|
1419
1708
|
let files: string[];
|
|
1420
1709
|
try {
|
|
1421
1710
|
files = await this.fsImpl.readdir(dir);
|
|
1422
1711
|
} catch {
|
|
1712
|
+
allRootsReadable = false;
|
|
1423
1713
|
continue;
|
|
1424
1714
|
}
|
|
1425
1715
|
for (const file of files.filter(item => item.endsWith(".json"))) {
|
|
1426
1716
|
const sessionId = path.basename(file, ".json");
|
|
1717
|
+
endpointSessionIds.add(sessionId);
|
|
1427
1718
|
if (this.sessions.has(sessionId)) continue;
|
|
1428
1719
|
try {
|
|
1429
1720
|
const endpoint = readEndpoint(path.join(dir, file));
|
|
1430
1721
|
// Skip endpoint files whose owning process is gone or that are
|
|
1431
1722
|
// explicitly stale (e.g. a hard-closed session): reconnecting
|
|
1432
|
-
// would chase a dead, token-bearing record forever.
|
|
1723
|
+
// would chase a dead, token-bearing record forever. Once the
|
|
1724
|
+
// associated topic is past the grace window, reap it through the
|
|
1725
|
+
// same best-effort delete path as graceful session shutdown.
|
|
1433
1726
|
const pidAlive = this.opts.pidAlive ?? defaultPidAlive;
|
|
1434
|
-
if (endpoint.stale || (endpoint.pid !== undefined && !pidAlive(endpoint.pid)))
|
|
1727
|
+
if (endpoint.stale || (endpoint.pid !== undefined && !pidAlive(endpoint.pid))) {
|
|
1728
|
+
await this.deleteOrphanedTopic(sessionId);
|
|
1729
|
+
continue;
|
|
1730
|
+
}
|
|
1435
1731
|
const endpointKey = endpointGenerationKey(endpoint.url, endpoint.token);
|
|
1436
1732
|
if (this.closedEndpointKeys.get(sessionId) === endpointKey) continue;
|
|
1437
1733
|
this.closedEndpointKeys.delete(sessionId);
|
|
@@ -1439,6 +1735,12 @@ export class TelegramNotificationDaemon {
|
|
|
1439
1735
|
} catch {}
|
|
1440
1736
|
}
|
|
1441
1737
|
}
|
|
1738
|
+
if (allRootsReadable) {
|
|
1739
|
+
for (const sessionId of this.topics.sessionIds()) {
|
|
1740
|
+
if (!this.sessions.has(sessionId) && !endpointSessionIds.has(sessionId))
|
|
1741
|
+
await this.deleteOrphanedTopic(sessionId);
|
|
1742
|
+
}
|
|
1743
|
+
}
|
|
1442
1744
|
}
|
|
1443
1745
|
|
|
1444
1746
|
connectSession(sessionId: string, url: string, token: string): void {
|
|
@@ -1468,7 +1770,7 @@ export class TelegramNotificationDaemon {
|
|
|
1468
1770
|
JSON.stringify({
|
|
1469
1771
|
type: "hello",
|
|
1470
1772
|
protocolVersion: NOTIFICATION_PROTOCOL_VERSION,
|
|
1471
|
-
capabilities: [CLIENT_PING_PONG_CAPABILITY],
|
|
1773
|
+
capabilities: [CLIENT_PING_PONG_CAPABILITY, ASK_CONTROLS_CAPABILITY, ASK_SELECTED_ACK_CAPABILITY],
|
|
1472
1774
|
}),
|
|
1473
1775
|
);
|
|
1474
1776
|
} catch {}
|
|
@@ -1543,6 +1845,12 @@ export class TelegramNotificationDaemon {
|
|
|
1543
1845
|
if (isCurrentSession) {
|
|
1544
1846
|
this.sessions.delete(session.sessionId);
|
|
1545
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
|
+
}
|
|
1546
1854
|
if (session.ws.readyState !== WebSocket.CLOSED) {
|
|
1547
1855
|
try {
|
|
1548
1856
|
session.ws.close();
|
|
@@ -1572,6 +1880,12 @@ export class TelegramNotificationDaemon {
|
|
|
1572
1880
|
const repo = typeof msg?.repo === "string" && msg.repo ? msg.repo : undefined;
|
|
1573
1881
|
const branch = typeof msg?.branch === "string" && msg.branch ? msg.branch : undefined;
|
|
1574
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;
|
|
1575
1889
|
// Name the topic "{repo}/{branch}" before a session title exists, then
|
|
1576
1890
|
// "{repo}/{branch} - {title}" once it does. Fall back to the session id
|
|
1577
1891
|
// only when no repo identity is available.
|
|
@@ -1581,6 +1895,32 @@ export class TelegramNotificationDaemon {
|
|
|
1581
1895
|
return `SKC ${sessionId.slice(-6)}`;
|
|
1582
1896
|
}
|
|
1583
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
|
+
|
|
1584
1924
|
private topicIdentityKey(msg: { repo?: unknown; branch?: unknown }): string | undefined {
|
|
1585
1925
|
const repo = typeof msg?.repo === "string" && msg.repo.trim() ? msg.repo.trim() : undefined;
|
|
1586
1926
|
if (!repo) return undefined;
|
|
@@ -1599,11 +1939,13 @@ export class TelegramNotificationDaemon {
|
|
|
1599
1939
|
const identityKey = this.topicIdentityKey(msg);
|
|
1600
1940
|
const remembered = identityKey ? this.topicOwnerByIdentity.get(identityKey) : undefined;
|
|
1601
1941
|
if (remembered && this.topics.get(remembered)) return remembered;
|
|
1942
|
+
if (!identityKey) return undefined;
|
|
1602
1943
|
const base = this.topicIdentityBase(msg);
|
|
1603
|
-
if (!identityKey || !base) return undefined;
|
|
1604
1944
|
for (const sessionId of this.topics.sessionIds()) {
|
|
1605
|
-
const
|
|
1606
|
-
|
|
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) {
|
|
1607
1949
|
this.topicOwnerByIdentity.set(identityKey, sessionId);
|
|
1608
1950
|
return sessionId;
|
|
1609
1951
|
}
|
|
@@ -1633,6 +1975,37 @@ export class TelegramNotificationDaemon {
|
|
|
1633
1975
|
return this.topics.get(sessionId)?.topicId;
|
|
1634
1976
|
}
|
|
1635
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
|
+
|
|
1636
2009
|
private rememberPendingThreadedFrame(sessionId: string, send: ThreadedSend, msg: Record<string, unknown>): void {
|
|
1637
2010
|
const frames = this.pendingThreadedFrames.get(sessionId) ?? [];
|
|
1638
2011
|
frames.push({ send, msg });
|
|
@@ -1683,6 +2056,16 @@ export class TelegramNotificationDaemon {
|
|
|
1683
2056
|
}
|
|
1684
2057
|
}
|
|
1685
2058
|
|
|
2059
|
+
private topicPastOrphanGrace(sessionId: string): boolean {
|
|
2060
|
+
const record = this.topics.get(sessionId);
|
|
2061
|
+
return record !== undefined && this.runtime.now() - record.createdAt >= ORPHAN_TOPIC_GRACE_MS;
|
|
2062
|
+
}
|
|
2063
|
+
|
|
2064
|
+
private async deleteOrphanedTopic(sessionId: string): Promise<void> {
|
|
2065
|
+
if (!this.topicPastOrphanGrace(sessionId)) return;
|
|
2066
|
+
await this.deleteTopic(sessionId);
|
|
2067
|
+
}
|
|
2068
|
+
|
|
1686
2069
|
/** Best-effort delete of a session topic once its local notification endpoint shuts down. */
|
|
1687
2070
|
private async deleteTopic(sessionId: string): Promise<void> {
|
|
1688
2071
|
const record = this.topics.get(sessionId);
|
|
@@ -1690,7 +2073,11 @@ export class TelegramNotificationDaemon {
|
|
|
1690
2073
|
try {
|
|
1691
2074
|
// Drop queued sends for this session before deleting the topic; otherwise
|
|
1692
2075
|
// rate-limited frames can flush later into a deleted topic or across resume.
|
|
1693
|
-
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
|
+
}
|
|
1694
2081
|
await this.flushPool();
|
|
1695
2082
|
const res = (await this.botApi.call("deleteForumTopic", {
|
|
1696
2083
|
chat_id: this.opts.chatId,
|
|
@@ -1711,10 +2098,14 @@ export class TelegramNotificationDaemon {
|
|
|
1711
2098
|
}
|
|
1712
2099
|
}
|
|
1713
2100
|
|
|
1714
|
-
private
|
|
1715
|
-
const
|
|
1716
|
-
|
|
1717
|
-
|
|
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;
|
|
1718
2109
|
}
|
|
1719
2110
|
|
|
1720
2111
|
async loadTopics(): Promise<void> {
|
|
@@ -1845,7 +2236,12 @@ export class TelegramNotificationDaemon {
|
|
|
1845
2236
|
|
|
1846
2237
|
/** Drain the shared rate-limit pool and deliver each granted send to its topic. */
|
|
1847
2238
|
private async flushPoolInner(): Promise<void> {
|
|
1848
|
-
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
|
+
}
|
|
1849
2245
|
// Within a batch a finalized frame supersedes any still-queued live frame for
|
|
1850
2246
|
// the same streamed message (finalized outranks live), so drop the stale live
|
|
1851
2247
|
// edit — otherwise the authoritative final text could be overwritten by an
|
|
@@ -1868,6 +2264,51 @@ export class TelegramNotificationDaemon {
|
|
|
1868
2264
|
);
|
|
1869
2265
|
}
|
|
1870
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
|
+
}
|
|
1871
2312
|
const { send, topicId } = item.payload;
|
|
1872
2313
|
if (topicId && !(await this.pairedChatIsPrivate())) continue;
|
|
1873
2314
|
// Threaded topic when available; otherwise deliver flat to the paired chat.
|
|
@@ -2102,25 +2543,43 @@ export class TelegramNotificationDaemon {
|
|
|
2102
2543
|
}
|
|
2103
2544
|
|
|
2104
2545
|
/**
|
|
2105
|
-
* Resolve (and cache
|
|
2106
|
-
* private chat. Topic and flat delivery are only safe in a private DM;
|
|
2107
|
-
*
|
|
2108
|
-
*
|
|
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.
|
|
2109
2550
|
*/
|
|
2110
|
-
private async
|
|
2111
|
-
if (this.pairedChatPrivate !== undefined) return this.pairedChatPrivate;
|
|
2551
|
+
private async resolvePairedChatPrivacy(): Promise<PairedChatPrivacy> {
|
|
2552
|
+
if (this.pairedChatPrivate !== undefined) return this.pairedChatPrivate ? "private" : "non-private";
|
|
2112
2553
|
try {
|
|
2113
2554
|
const res = (await this.botApi.call("getChat", { chat_id: this.opts.chatId })) as {
|
|
2114
|
-
|
|
2555
|
+
ok?: unknown;
|
|
2556
|
+
result?: { type?: unknown };
|
|
2115
2557
|
};
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
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";
|
|
2121
2575
|
}
|
|
2122
2576
|
}
|
|
2123
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
|
+
|
|
2124
2583
|
/** Tell the user once (per daemon run) how to enable Threaded Mode. */
|
|
2125
2584
|
private async notifyThreadedFallback(): Promise<void> {
|
|
2126
2585
|
if (this.threadedFallbackNoticeSent || !(await this.pairedChatIsPrivate())) return;
|
|
@@ -2231,26 +2690,37 @@ export class TelegramNotificationDaemon {
|
|
|
2231
2690
|
}
|
|
2232
2691
|
if (send.identity) {
|
|
2233
2692
|
const identityKey = this.topicIdentityKey(msg);
|
|
2234
|
-
if (identityKey)
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
//
|
|
2239
|
-
//
|
|
2240
|
-
//
|
|
2241
|
-
|
|
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);
|
|
2242
2701
|
const name = this.topicNameFor(session.sessionId, msg);
|
|
2243
2702
|
if (this.topics.needsRename(session.sessionId, name)) {
|
|
2703
|
+
this.daemonRenameAttempts.set(
|
|
2704
|
+
session.sessionId,
|
|
2705
|
+
(this.daemonRenameAttempts.get(session.sessionId) ?? 0) + 1,
|
|
2706
|
+
);
|
|
2244
2707
|
try {
|
|
2245
|
-
await this.botApi.call("editForumTopic", {
|
|
2708
|
+
const response = await this.botApi.call("editForumTopic", {
|
|
2246
2709
|
chat_id: this.opts.chatId,
|
|
2247
2710
|
message_thread_id: Number(topicId),
|
|
2248
2711
|
name,
|
|
2249
2712
|
});
|
|
2250
|
-
this.topics.markNameApplied(session.sessionId, name);
|
|
2713
|
+
if (topicRenameApplied(response)) this.topics.markNameApplied(session.sessionId, name);
|
|
2251
2714
|
} catch {
|
|
2252
|
-
// Best-effort rename;
|
|
2253
|
-
//
|
|
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
|
+
}
|
|
2254
2724
|
}
|
|
2255
2725
|
}
|
|
2256
2726
|
// Send the full bulleted identity header EXACTLY ONCE per topic.
|
|
@@ -2274,19 +2744,54 @@ export class TelegramNotificationDaemon {
|
|
|
2274
2744
|
await this.notifyThreadedFallback();
|
|
2275
2745
|
}
|
|
2276
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
|
+
: [];
|
|
2277
2771
|
const rendered = buildActionMessage({
|
|
2278
2772
|
kind: msg.kind ?? "ask",
|
|
2279
2773
|
id: msg.id,
|
|
2280
2774
|
question: msg.question,
|
|
2281
2775
|
options: msg.options,
|
|
2776
|
+
controls,
|
|
2282
2777
|
summary: msg.summary,
|
|
2283
2778
|
});
|
|
2284
2779
|
const options = Array.isArray(msg.options) ? msg.options : [];
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
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
|
+
];
|
|
2290
2795
|
// HTML delivery: one sendMessage per chunk, keyboard on the last chunk;
|
|
2291
2796
|
// returns the last chunk's message_id (the reply-routable message).
|
|
2292
2797
|
const sendHtmlChunks = async (): Promise<number | undefined> => {
|
|
@@ -2369,7 +2874,78 @@ export class TelegramNotificationDaemon {
|
|
|
2369
2874
|
});
|
|
2370
2875
|
}
|
|
2371
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
|
+
|
|
2372
2947
|
async handleTelegramUpdate(update: unknown): Promise<void> {
|
|
2948
|
+
if ((await this.handleForumTopicEdited(update)) !== "not-topic") return;
|
|
2373
2949
|
// Session-lifecycle command (/session_*): handled ONLY from the paired chat,
|
|
2374
2950
|
// gated before any arg parsing or side effect, and routed through the control
|
|
2375
2951
|
// endpoint. Must run before threaded-injection so commands are not treated as
|
|
@@ -2554,15 +3130,6 @@ export class TelegramNotificationDaemon {
|
|
|
2554
3130
|
}),
|
|
2555
3131
|
);
|
|
2556
3132
|
await this.rememberSeenUpdateId(inbound.updateId);
|
|
2557
|
-
await this.botApi
|
|
2558
|
-
.call("sendMessage", {
|
|
2559
|
-
chat_id: this.opts.chatId,
|
|
2560
|
-
message_thread_id: Number(inbound.threadId),
|
|
2561
|
-
text: "Received as an answer to the pending ask.",
|
|
2562
|
-
})
|
|
2563
|
-
.catch(error => {
|
|
2564
|
-
logger.warn(`telegram: failed to acknowledge pending ask reply: ${String(error)}`);
|
|
2565
|
-
});
|
|
2566
3133
|
if (inbound.messageId !== undefined) await this.setReaction(inbound.messageId, QUEUED_REACTION);
|
|
2567
3134
|
return;
|
|
2568
3135
|
}
|