@sayknow-cli/coding-agent 0.3.6 → 0.3.8
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/README.md +76 -0
- package/dist/types/append-only-mode.d.ts +31 -0
- package/dist/types/async/index.d.ts +2 -0
- package/dist/types/async/job-manager.d.ts +328 -0
- package/dist/types/async/support.d.ts +2 -0
- package/dist/types/autoresearch/dashboard.d.ts +4 -0
- package/dist/types/autoresearch/git.d.ts +36 -0
- package/dist/types/autoresearch/helpers.d.ts +24 -0
- package/dist/types/autoresearch/index.d.ts +2 -0
- package/dist/types/autoresearch/state.d.ts +17 -0
- package/dist/types/autoresearch/storage.d.ts +142 -0
- package/dist/types/autoresearch/tools/init-experiment.d.ts +31 -0
- package/dist/types/autoresearch/tools/log-experiment.d.ts +23 -0
- package/dist/types/autoresearch/tools/run-experiment.d.ts +8 -0
- package/dist/types/autoresearch/tools/update-notes.d.ts +12 -0
- package/dist/types/autoresearch/types.d.ts +154 -0
- package/dist/types/capability/context-file.d.ts +17 -0
- package/dist/types/capability/extension-module.d.ts +15 -0
- package/dist/types/capability/extension.d.ts +28 -0
- package/dist/types/capability/fs.d.ts +20 -0
- package/dist/types/capability/hook.d.ts +19 -0
- package/dist/types/capability/index.d.ts +80 -0
- package/dist/types/capability/instruction.d.ts +17 -0
- package/dist/types/capability/mcp.d.ts +47 -0
- package/dist/types/capability/prompt.d.ts +15 -0
- package/dist/types/capability/rule.d.ts +69 -0
- package/dist/types/capability/settings.d.ts +15 -0
- package/dist/types/capability/skill.d.ts +36 -0
- package/dist/types/capability/slash-command.d.ts +17 -0
- package/dist/types/capability/ssh.d.ts +23 -0
- package/dist/types/capability/system-prompt.d.ts +15 -0
- package/dist/types/capability/tool.d.ts +19 -0
- package/dist/types/capability/types.d.ts +154 -0
- package/dist/types/cli/agents-cli.d.ts +12 -0
- package/dist/types/cli/args.d.ts +56 -0
- package/dist/types/cli/auth-broker-cli.d.ts +25 -0
- package/dist/types/cli/auth-gateway-cli.d.ts +18 -0
- package/dist/types/cli/classify-install-target.d.ts +18 -0
- package/dist/types/cli/commands/init-xdg.d.ts +1 -0
- package/dist/types/cli/completion-cli.d.ts +41 -0
- package/dist/types/cli/config-cli.d.ts +23 -0
- package/dist/types/cli/daemon-cli.d.ts +25 -0
- package/dist/types/cli/fast-help.d.ts +1 -0
- package/dist/types/cli/file-processor.d.ts +11 -0
- package/dist/types/cli/fixture-report.d.ts +20 -0
- package/dist/types/cli/fixture-report.test.d.ts +1 -0
- package/dist/types/cli/grep-cli.d.ts +17 -0
- package/dist/types/cli/initial-message.d.ts +17 -0
- package/dist/types/cli/list-models.d.ts +36 -0
- package/dist/types/cli/local-provider-smoke.d.ts +59 -0
- package/dist/types/cli/mcp-cli.d.ts +25 -0
- package/dist/types/cli/migrate-cli.d.ts +20 -0
- package/dist/types/cli/nofile-limit.d.ts +11 -0
- package/dist/types/cli/notify-cli.d.ts +32 -0
- package/dist/types/cli/plugin-cli.d.ts +34 -0
- package/dist/types/cli/read-cli.d.ts +4 -0
- package/dist/types/cli/session-picker.d.ts +3 -0
- package/dist/types/cli/setup-cli.d.ts +73 -0
- package/dist/types/cli/shell-cli.d.ts +8 -0
- package/dist/types/cli/skills-cli.d.ts +9 -0
- package/dist/types/cli/ssh-cli.d.ts +21 -0
- package/dist/types/cli/stats-cli.d.ts +17 -0
- package/dist/types/cli/telegram-cli.d.ts +13 -0
- package/dist/types/cli/update-cli.d.ts +89 -0
- package/dist/types/cli/web-search-cli.d.ts +32 -0
- package/dist/types/cli/worktree-cli.d.ts +26 -0
- package/dist/types/cli.d.ts +132 -0
- package/dist/types/commands/acp.d.ts +12 -0
- package/dist/types/commands/agents.d.ts +34 -0
- package/dist/types/commands/auth-broker.d.ts +54 -0
- package/dist/types/commands/auth-gateway.d.ts +32 -0
- package/dist/types/commands/codex-native-hook.d.ts +6 -0
- package/dist/types/commands/commit.d.ts +27 -0
- package/dist/types/commands/completion.d.ts +29 -0
- package/dist/types/commands/config.d.ts +33 -0
- package/dist/types/commands/contribution-prep.d.ts +18 -0
- package/dist/types/commands/coordinator.d.ts +19 -0
- package/dist/types/commands/daemon.d.ts +41 -0
- package/dist/types/commands/deep-interview.d.ts +54 -0
- package/dist/types/commands/gc.d.ts +26 -0
- package/dist/types/commands/grep.d.ts +42 -0
- package/dist/types/commands/harness.d.ts +43 -0
- package/dist/types/commands/launch.d.ts +127 -0
- package/dist/types/commands/local-provider.d.ts +34 -0
- package/dist/types/commands/mcp-serve.d.ts +24 -0
- package/dist/types/commands/mcp.d.ts +70 -0
- package/dist/types/commands/migrate.d.ts +33 -0
- package/dist/types/commands/notify.d.ts +41 -0
- package/dist/types/commands/plugin.d.ts +58 -0
- package/dist/types/commands/ralplan.d.ts +7 -0
- package/dist/types/commands/read.d.ts +15 -0
- package/dist/types/commands/rlm.d.ts +10 -0
- package/dist/types/commands/session.d.ts +30 -0
- package/dist/types/commands/setup.d.ts +105 -0
- package/dist/types/commands/shell.d.ts +21 -0
- package/dist/types/commands/skills.d.ts +26 -0
- package/dist/types/commands/ssh.d.ts +48 -0
- package/dist/types/commands/state.d.ts +7 -0
- package/dist/types/commands/stats.d.ts +25 -0
- package/dist/types/commands/team.d.ts +24 -0
- package/dist/types/commands/telegram.d.ts +22 -0
- package/dist/types/commands/ultragoal.d.ts +8 -0
- package/dist/types/commands/update.d.ts +20 -0
- package/dist/types/commands/web-search.d.ts +87 -0
- package/dist/types/commands/worktree.d.ts +34 -0
- package/dist/types/commit/agentic/agent.d.ts +31 -0
- package/dist/types/commit/agentic/fallback.d.ts +5 -0
- package/dist/types/commit/agentic/index.d.ts +2 -0
- package/dist/types/commit/agentic/state.d.ts +58 -0
- package/dist/types/commit/agentic/tools/analyze-file.d.ts +19 -0
- package/dist/types/commit/agentic/tools/git-file-diff.d.ts +10 -0
- package/dist/types/commit/agentic/tools/git-hunk.d.ts +9 -0
- package/dist/types/commit/agentic/tools/git-overview.d.ts +9 -0
- package/dist/types/commit/agentic/tools/index.d.ts +16 -0
- package/dist/types/commit/agentic/tools/propose-changelog.d.ts +28 -0
- package/dist/types/commit/agentic/tools/propose-commit.d.ts +36 -0
- package/dist/types/commit/agentic/tools/recent-commits.d.ts +7 -0
- package/dist/types/commit/agentic/tools/schemas.d.ts +27 -0
- package/dist/types/commit/agentic/tools/split-commit.d.ts +53 -0
- package/dist/types/commit/agentic/topo-sort.d.ts +4 -0
- package/dist/types/commit/agentic/trivial.d.ts +7 -0
- package/dist/types/commit/agentic/validation.d.ts +20 -0
- package/dist/types/commit/analysis/conventional.d.ts +22 -0
- package/dist/types/commit/analysis/index.d.ts +4 -0
- package/dist/types/commit/analysis/scope.d.ts +6 -0
- package/dist/types/commit/analysis/summary.d.ts +19 -0
- package/dist/types/commit/analysis/validation.d.ts +8 -0
- package/dist/types/commit/changelog/detect.d.ts +2 -0
- package/dist/types/commit/changelog/generate.d.ts +30 -0
- package/dist/types/commit/changelog/index.d.ts +30 -0
- package/dist/types/commit/changelog/parse.d.ts +2 -0
- package/dist/types/commit/cli.d.ts +3 -0
- package/dist/types/commit/git/diff.d.ts +5 -0
- package/dist/types/commit/index.d.ts +4 -0
- package/dist/types/commit/map-reduce/index.d.ts +28 -0
- package/dist/types/commit/map-reduce/map-phase.d.ts +17 -0
- package/dist/types/commit/map-reduce/reduce-phase.d.ts +13 -0
- package/dist/types/commit/map-reduce/utils.d.ts +2 -0
- package/dist/types/commit/message.d.ts +2 -0
- package/dist/types/commit/model-selection.d.ts +15 -0
- package/dist/types/commit/pipeline.d.ts +5 -0
- package/dist/types/commit/shared-llm.d.ts +54 -0
- package/dist/types/commit/types.d.ts +78 -0
- package/dist/types/commit/utils/exclusions.d.ts +4 -0
- package/dist/types/commit/utils.d.ts +20 -0
- package/dist/types/config/config-file.d.ts +58 -0
- package/dist/types/config/file-lock-gc.d.ts +5 -0
- package/dist/types/config/file-lock.d.ts +36 -0
- package/dist/types/config/keybindings.d.ts +359 -0
- package/dist/types/config/model-equivalence.d.ts +24 -0
- package/dist/types/config/model-profile-activation.d.ts +64 -0
- package/dist/types/config/model-profiles.d.ts +39 -0
- package/dist/types/config/model-registry.d.ts +465 -0
- package/dist/types/config/model-resolver.d.ts +217 -0
- package/dist/types/config/models-config-schema.d.ts +700 -0
- package/dist/types/config/prompt-templates.d.ts +32 -0
- package/dist/types/config/resolve-config-value.d.ts +17 -0
- package/dist/types/config/settings-schema.d.ts +4169 -0
- package/dist/types/config/settings.d.ts +149 -0
- package/dist/types/config/skill-settings-defaults.d.ts +14 -0
- package/dist/types/config/telegram-autostart.d.ts +14 -0
- package/dist/types/config/telegram-env-bridge.d.ts +18 -0
- package/dist/types/config.d.ts +66 -0
- package/dist/types/coordinator/contract.d.ts +4 -0
- package/dist/types/coordinator-mcp/policy.d.ts +24 -0
- package/dist/types/coordinator-mcp/safety.d.ts +26 -0
- package/dist/types/coordinator-mcp/server.d.ts +66 -0
- package/dist/types/cursor.d.ts +24 -0
- package/dist/types/daemon/builtin.d.ts +20 -0
- package/dist/types/daemon/control-types.d.ts +57 -0
- package/dist/types/daemon/runtime.d.ts +25 -0
- package/dist/types/dap/client.d.ts +39 -0
- package/dist/types/dap/config.d.ts +6 -0
- package/dist/types/dap/index.d.ts +4 -0
- package/dist/types/dap/session.d.ts +108 -0
- package/dist/types/dap/types.d.ts +524 -0
- package/dist/types/debug/crash-diagnostics.d.ts +45 -0
- package/dist/types/debug/index.d.ts +15 -0
- package/dist/types/debug/log-formatting.d.ts +4 -0
- package/dist/types/debug/log-viewer.d.ts +68 -0
- package/dist/types/debug/profiler.d.ts +24 -0
- package/dist/types/debug/raw-sse-buffer.d.ts +44 -0
- package/dist/types/debug/raw-sse.d.ts +16 -0
- package/dist/types/debug/report-bundle.d.ts +55 -0
- package/dist/types/debug/runtime-gauges.d.ts +6 -0
- package/dist/types/debug/system-info.d.ts +26 -0
- package/dist/types/deep-interview/plaintext-gate-guard.d.ts +11 -0
- package/dist/types/deep-interview/render-middleware.d.ts +6 -0
- package/dist/types/defaults/skc/extensions/grok-build/index.d.ts +1 -0
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/index.d.ts +1 -0
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.d.ts +25 -0
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.d.ts +27 -0
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/billing.d.ts +8 -0
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/register.d.ts +5 -0
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/stream.d.ts +10 -0
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/usage.d.ts +2 -0
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/base-url.d.ts +2 -0
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/errors.d.ts +38 -0
- package/dist/types/defaults/skc-defaults.d.ts +64 -0
- package/dist/types/defaults/skc-grok-cli.d.ts +5 -0
- package/dist/types/discovery/agents-md.d.ts +1 -0
- package/dist/types/discovery/agents.d.ts +12 -0
- package/dist/types/discovery/builtin.d.ts +1 -0
- package/dist/types/discovery/claude-plugins.d.ts +1 -0
- package/dist/types/discovery/claude.d.ts +1 -0
- package/dist/types/discovery/cline.d.ts +1 -0
- package/dist/types/discovery/codex.d.ts +1 -0
- package/dist/types/discovery/cursor.d.ts +19 -0
- package/dist/types/discovery/gemini.d.ts +1 -0
- package/dist/types/discovery/github.d.ts +1 -0
- package/dist/types/discovery/helpers.d.ts +271 -0
- package/dist/types/discovery/index.d.ts +48 -0
- package/dist/types/discovery/mcp-json.d.ts +1 -0
- package/dist/types/discovery/opencode.d.ts +1 -0
- package/dist/types/discovery/plugin-dir-roots.d.ts +15 -0
- package/dist/types/discovery/ssh.d.ts +1 -0
- package/dist/types/discovery/substitute-plugin-root.d.ts +5 -0
- package/dist/types/discovery/vscode.d.ts +1 -0
- package/dist/types/discovery/windsurf.d.ts +15 -0
- package/dist/types/edit/apply-patch/index.d.ts +35 -0
- package/dist/types/edit/apply-patch/parser.d.ts +34 -0
- package/dist/types/edit/diff.d.ts +75 -0
- package/dist/types/edit/file-read-cache.d.ts +25 -0
- package/dist/types/edit/index.d.ts +58 -0
- package/dist/types/edit/modes/apply-patch.d.ts +24 -0
- package/dist/types/edit/modes/patch.d.ts +99 -0
- package/dist/types/edit/modes/replace.d.ts +149 -0
- package/dist/types/edit/normalize.d.ts +43 -0
- package/dist/types/edit/notebook.d.ts +26 -0
- package/dist/types/edit/read-file.d.ts +8 -0
- package/dist/types/edit/renderer.d.ts +110 -0
- package/dist/types/edit/streaming.d.ts +66 -0
- package/dist/types/eval/backend.d.ts +40 -0
- package/dist/types/eval/index.d.ts +4 -0
- package/dist/types/eval/js/context-manager.d.ts +27 -0
- package/dist/types/eval/js/executor.d.ts +29 -0
- package/dist/types/eval/js/index.d.ts +10 -0
- package/dist/types/eval/js/shared/helpers.d.ts +38 -0
- package/dist/types/eval/js/shared/indirect-eval.d.ts +14 -0
- package/dist/types/eval/js/shared/prelude.d.ts +1 -0
- package/dist/types/eval/js/shared/rewrite-imports.d.ts +6 -0
- package/dist/types/eval/js/shared/runtime.d.ts +47 -0
- package/dist/types/eval/js/shared/types.d.ts +24 -0
- package/dist/types/eval/js/tool-bridge.d.ts +18 -0
- package/dist/types/eval/js/worker-core.d.ts +5 -0
- package/dist/types/eval/js/worker-entry.d.ts +1 -0
- package/dist/types/eval/js/worker-protocol.d.ts +77 -0
- package/dist/types/eval/py/display.d.ts +25 -0
- package/dist/types/eval/py/executor.d.ts +88 -0
- package/dist/types/eval/py/index.d.ts +10 -0
- package/dist/types/eval/py/kernel.d.ts +65 -0
- package/dist/types/eval/py/prelude.d.ts +1 -0
- package/dist/types/eval/py/runtime.d.ts +29 -0
- package/dist/types/eval/py/tool-bridge.d.ts +20 -0
- package/dist/types/eval/types.d.ts +52 -0
- package/dist/types/exa/factory.d.ts +13 -0
- package/dist/types/exa/index.d.ts +20 -0
- package/dist/types/exa/mcp-client.d.ts +45 -0
- package/dist/types/exa/render.d.ts +19 -0
- package/dist/types/exa/researcher.d.ts +9 -0
- package/dist/types/exa/search.d.ts +9 -0
- package/dist/types/exa/types.d.ts +155 -0
- package/dist/types/exa/websets.d.ts +9 -0
- package/dist/types/exec/bash-executor.d.ts +64 -0
- package/dist/types/exec/exec.d.ts +25 -0
- package/dist/types/exec/idle-timeout-watchdog.d.ts +18 -0
- package/dist/types/exec/non-interactive-env.d.ts +1 -0
- package/dist/types/export/custom-share.d.ts +20 -0
- package/dist/types/export/html/index.d.ts +10 -0
- package/dist/types/export/html/template.generated.d.ts +1 -0
- package/dist/types/export/html/template.macro.d.ts +5 -0
- package/dist/types/export/ttsr.d.ts +55 -0
- package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +9 -0
- package/dist/types/extensibility/custom-commands/index.d.ts +2 -0
- package/dist/types/extensibility/custom-commands/loader.d.ts +29 -0
- package/dist/types/extensibility/custom-commands/types.d.ts +106 -0
- package/dist/types/extensibility/custom-tools/index.d.ts +6 -0
- package/dist/types/extensibility/custom-tools/loader.d.ts +69 -0
- package/dist/types/extensibility/custom-tools/types.d.ts +229 -0
- package/dist/types/extensibility/custom-tools/wrapper.d.ts +24 -0
- package/dist/types/extensibility/extensions/compact-handler.d.ts +26 -0
- package/dist/types/extensibility/extensions/get-commands-handler.d.ts +29 -0
- package/dist/types/extensibility/extensions/index.d.ts +9 -0
- package/dist/types/extensibility/extensions/loader.d.ts +43 -0
- package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +35 -0
- package/dist/types/extensibility/extensions/runner.d.ts +135 -0
- package/dist/types/extensibility/extensions/types.d.ts +918 -0
- package/dist/types/extensibility/extensions/wrapper.d.ts +55 -0
- package/dist/types/extensibility/hooks/index.d.ts +5 -0
- package/dist/types/extensibility/hooks/loader.d.ts +89 -0
- package/dist/types/extensibility/hooks/runner.d.ts +126 -0
- package/dist/types/extensibility/hooks/tool-wrapper.d.ts +25 -0
- package/dist/types/extensibility/hooks/types.d.ts +431 -0
- package/dist/types/extensibility/plugins/doctor.d.ts +3 -0
- package/dist/types/extensibility/plugins/git-url.d.ts +34 -0
- package/dist/types/extensibility/plugins/index.d.ts +8 -0
- package/dist/types/extensibility/plugins/installer.d.ts +5 -0
- package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +2 -0
- package/dist/types/extensibility/plugins/loader.d.ts +31 -0
- package/dist/types/extensibility/plugins/manager.d.ts +65 -0
- package/dist/types/extensibility/plugins/marketplace/cache.d.ts +41 -0
- package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +48 -0
- package/dist/types/extensibility/plugins/marketplace/index.d.ts +6 -0
- package/dist/types/extensibility/plugins/marketplace/manager.d.ts +57 -0
- package/dist/types/extensibility/plugins/marketplace/registry.d.ts +34 -0
- package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +28 -0
- package/dist/types/extensibility/plugins/marketplace/types.d.ts +130 -0
- package/dist/types/extensibility/plugins/parser.d.ts +52 -0
- package/dist/types/extensibility/plugins/security-scanner.d.ts +31 -0
- package/dist/types/extensibility/plugins/types.d.ts +149 -0
- package/dist/types/extensibility/shared-events.d.ts +281 -0
- package/dist/types/extensibility/skc-plugins/activation.d.ts +14 -0
- package/dist/types/extensibility/skc-plugins/compiler.d.ts +19 -0
- package/dist/types/extensibility/skc-plugins/constrained-hooks.d.ts +29 -0
- package/dist/types/extensibility/skc-plugins/index.d.ts +18 -0
- package/dist/types/extensibility/skc-plugins/injection.d.ts +40 -0
- package/dist/types/extensibility/skc-plugins/installer.d.ts +13 -0
- package/dist/types/extensibility/skc-plugins/loader.d.ts +3 -0
- package/dist/types/extensibility/skc-plugins/mcp-policy.d.ts +26 -0
- package/dist/types/extensibility/skc-plugins/observability.d.ts +27 -0
- package/dist/types/extensibility/skc-plugins/paths.d.ts +8 -0
- package/dist/types/extensibility/skc-plugins/prompt-appendix.d.ts +16 -0
- package/dist/types/extensibility/skc-plugins/registry.d.ts +32 -0
- package/dist/types/extensibility/skc-plugins/runtime-adapters.d.ts +64 -0
- package/dist/types/extensibility/skc-plugins/schema.d.ts +3 -0
- package/dist/types/extensibility/skc-plugins/session-validation.d.ts +42 -0
- package/dist/types/extensibility/skc-plugins/state.d.ts +9 -0
- package/dist/types/extensibility/skc-plugins/tools.d.ts +8 -0
- package/dist/types/extensibility/skc-plugins/types.d.ts +220 -0
- package/dist/types/extensibility/skc-plugins/validation.d.ts +11 -0
- package/dist/types/extensibility/skills.d.ts +82 -0
- package/dist/types/extensibility/slash-commands.d.ts +48 -0
- package/dist/types/extensibility/tool-proxy.d.ts +4 -0
- package/dist/types/extensibility/typebox.d.ts +155 -0
- package/dist/types/extensibility/utils.d.ts +12 -0
- package/dist/types/goals/index.d.ts +3 -0
- package/dist/types/goals/runtime.d.ts +63 -0
- package/dist/types/goals/state.d.ts +32 -0
- package/dist/types/goals/tools/goal-tool.d.ts +62 -0
- package/dist/types/harness-control-plane/classifier.d.ts +13 -0
- package/dist/types/harness-control-plane/control-endpoint.d.ts +31 -0
- package/dist/types/harness-control-plane/finalize.d.ts +60 -0
- package/dist/types/harness-control-plane/gc-adapter.d.ts +3 -0
- package/dist/types/harness-control-plane/operate.d.ts +35 -0
- package/dist/types/harness-control-plane/owner.d.ts +53 -0
- package/dist/types/harness-control-plane/phase-rollup.d.ts +23 -0
- package/dist/types/harness-control-plane/preserve.d.ts +19 -0
- package/dist/types/harness-control-plane/receipt-ingest.d.ts +19 -0
- package/dist/types/harness-control-plane/receipt-spool.d.ts +19 -0
- package/dist/types/harness-control-plane/receipts.d.ts +149 -0
- package/dist/types/harness-control-plane/rpc-adapter.d.ts +69 -0
- package/dist/types/harness-control-plane/seams.d.ts +21 -0
- package/dist/types/harness-control-plane/session-lease.d.ts +65 -0
- package/dist/types/harness-control-plane/state-machine.d.ts +24 -0
- package/dist/types/harness-control-plane/storage.d.ts +81 -0
- package/dist/types/harness-control-plane/types.d.ts +187 -0
- package/dist/types/hashline/anchors.d.ts +20 -0
- package/dist/types/hashline/apply.d.ts +14 -0
- package/dist/types/hashline/constants.d.ts +19 -0
- package/dist/types/hashline/diff-preview.d.ts +2 -0
- package/dist/types/hashline/diff.d.ts +17 -0
- package/dist/types/hashline/execute.d.ts +4 -0
- package/dist/types/hashline/hash.d.ts +123 -0
- package/dist/types/hashline/index.d.ts +13 -0
- package/dist/types/hashline/input.d.ts +11 -0
- package/dist/types/hashline/parser.d.ts +7 -0
- package/dist/types/hashline/prefixes.d.ts +7 -0
- package/dist/types/hashline/recovery.d.ts +27 -0
- package/dist/types/hashline/stream.d.ts +2 -0
- package/dist/types/hashline/types.d.ts +77 -0
- package/dist/types/hindsight/backend.d.ts +13 -0
- package/dist/types/hindsight/bank.d.ts +54 -0
- package/dist/types/hindsight/client.d.ts +224 -0
- package/dist/types/hindsight/config.d.ts +51 -0
- package/dist/types/hindsight/content.d.ts +70 -0
- package/dist/types/hindsight/index.d.ts +8 -0
- package/dist/types/hindsight/mental-models.d.ts +125 -0
- package/dist/types/hindsight/state.d.ts +99 -0
- package/dist/types/hindsight/transcript.d.ts +28 -0
- package/dist/types/hooks/codex-native-hooks-config.d.ts +29 -0
- package/dist/types/hooks/native-skill-hook.d.ts +28 -0
- package/dist/types/hooks/skill-keywords.d.ts +18 -0
- package/dist/types/hooks/skill-state.d.ts +93 -0
- package/dist/types/i18n/index.d.ts +38 -0
- package/dist/types/i18n/messages/de.d.ts +2 -0
- package/dist/types/i18n/messages/de.messages.d.ts +1 -0
- package/dist/types/i18n/messages/de.settings.d.ts +1 -0
- package/dist/types/i18n/messages/en.d.ts +81 -0
- package/dist/types/i18n/messages/es.d.ts +2 -0
- package/dist/types/i18n/messages/es.messages.d.ts +1 -0
- package/dist/types/i18n/messages/es.settings.d.ts +1 -0
- package/dist/types/i18n/messages/fr.d.ts +2 -0
- package/dist/types/i18n/messages/fr.messages.d.ts +1 -0
- package/dist/types/i18n/messages/fr.settings.d.ts +1 -0
- package/dist/types/i18n/messages/ja.d.ts +2 -0
- package/dist/types/i18n/messages/ja.messages.d.ts +1 -0
- package/dist/types/i18n/messages/ja.settings.d.ts +1 -0
- package/dist/types/i18n/messages/ko.d.ts +2 -0
- package/dist/types/i18n/messages/ko.messages.d.ts +1 -0
- package/dist/types/i18n/messages/ko.settings.d.ts +1 -0
- package/dist/types/i18n/messages/zh.d.ts +2 -0
- package/dist/types/i18n/messages/zh.messages.d.ts +1 -0
- package/dist/types/i18n/messages/zh.settings.d.ts +1 -0
- package/dist/types/index.d.ts +33 -0
- package/dist/types/internal-urls/agent-protocol.d.ts +12 -0
- package/dist/types/internal-urls/artifact-protocol.d.ts +6 -0
- package/dist/types/internal-urls/docs-index.generated.d.ts +2 -0
- package/dist/types/internal-urls/index.d.ts +20 -0
- package/dist/types/internal-urls/issue-pr-protocol.d.ts +17 -0
- package/dist/types/internal-urls/json-query.d.ts +30 -0
- package/dist/types/internal-urls/local-protocol.d.ts +39 -0
- package/dist/types/internal-urls/mcp-protocol.d.ts +12 -0
- package/dist/types/internal-urls/memory-protocol.d.ts +23 -0
- package/dist/types/internal-urls/parse.d.ts +19 -0
- package/dist/types/internal-urls/registry-helpers.d.ts +11 -0
- package/dist/types/internal-urls/router.d.ts +14 -0
- package/dist/types/internal-urls/rule-protocol.d.ts +6 -0
- package/dist/types/internal-urls/skc-protocol.d.ts +12 -0
- package/dist/types/internal-urls/skill-protocol.d.ts +13 -0
- package/dist/types/internal-urls/types.d.ts +109 -0
- package/dist/types/lsp/client.d.ts +66 -0
- package/dist/types/lsp/clients/biome-client.d.ts +16 -0
- package/dist/types/lsp/clients/index.d.ts +19 -0
- package/dist/types/lsp/clients/lsp-linter-client.d.ts +16 -0
- package/dist/types/lsp/clients/swiftlint-client.d.ts +20 -0
- package/dist/types/lsp/config.d.ts +65 -0
- package/dist/types/lsp/edits.d.ts +23 -0
- package/dist/types/lsp/index.d.ts +130 -0
- package/dist/types/lsp/lspmux.d.ts +58 -0
- package/dist/types/lsp/render.d.ts +32 -0
- package/dist/types/lsp/startup-events.d.ts +12 -0
- package/dist/types/lsp/types.d.ts +306 -0
- package/dist/types/lsp/utils.d.ts +108 -0
- package/dist/types/main.d.ts +75 -0
- package/dist/types/memories/index.d.ts +28 -0
- package/dist/types/memories/storage.d.ts +110 -0
- package/dist/types/memory-backend/index.d.ts +4 -0
- package/dist/types/memory-backend/local-backend.d.ts +9 -0
- package/dist/types/memory-backend/off-backend.d.ts +7 -0
- package/dist/types/memory-backend/resolve.d.ts +15 -0
- package/dist/types/memory-backend/types.d.ts +61 -0
- package/dist/types/migrate/action-planner.d.ts +11 -0
- package/dist/types/migrate/adapters/claude-code.d.ts +2 -0
- package/dist/types/migrate/adapters/codex.d.ts +5 -0
- package/dist/types/migrate/adapters/index.d.ts +45 -0
- package/dist/types/migrate/adapters/opencode.d.ts +2 -0
- package/dist/types/migrate/executor.d.ts +2 -0
- package/dist/types/migrate/mcp-mapper.d.ts +20 -0
- package/dist/types/migrate/report.d.ts +18 -0
- package/dist/types/migrate/skill-normalizer.d.ts +27 -0
- package/dist/types/migrate/types.d.ts +126 -0
- package/dist/types/modes/acp/acp-agent.d.ts +61 -0
- package/dist/types/modes/acp/acp-client-bridge.d.ts +9 -0
- package/dist/types/modes/acp/acp-event-mapper.d.ts +34 -0
- package/dist/types/modes/acp/acp-mode.d.ts +5 -0
- package/dist/types/modes/acp/index.d.ts +2 -0
- package/dist/types/modes/acp/terminal-auth.d.ts +6 -0
- package/dist/types/modes/bridge/auth.d.ts +12 -0
- package/dist/types/modes/bridge/bridge-client-bridge.d.ts +9 -0
- package/dist/types/modes/bridge/bridge-mode.d.ts +47 -0
- package/dist/types/modes/bridge/bridge-ui-context.d.ts +88 -0
- package/dist/types/modes/bridge/event-stream.d.ts +8 -0
- package/dist/types/modes/components/agent-dashboard.d.ts +21 -0
- package/dist/types/modes/components/assistant-message.d.ts +20 -0
- package/dist/types/modes/components/bash-execution.d.ts +29 -0
- package/dist/types/modes/components/bordered-loader.d.ts +11 -0
- package/dist/types/modes/components/branch-summary-message.d.ts +13 -0
- package/dist/types/modes/components/btw-panel.d.ts +16 -0
- package/dist/types/modes/components/compaction-summary-message.d.ts +13 -0
- package/dist/types/modes/components/countdown-timer.d.ts +14 -0
- package/dist/types/modes/components/custom-editor.d.ts +67 -0
- package/dist/types/modes/components/custom-message.d.ts +15 -0
- package/dist/types/modes/components/custom-model-preset-wizard.d.ts +12 -0
- package/dist/types/modes/components/custom-provider-wizard.d.ts +10 -0
- package/dist/types/modes/components/diff.d.ts +11 -0
- package/dist/types/modes/components/dynamic-border.d.ts +14 -0
- package/dist/types/modes/components/eval-execution.d.ts +23 -0
- package/dist/types/modes/components/execution-shared.d.ts +46 -0
- package/dist/types/modes/components/extensions/extension-dashboard.d.ts +26 -0
- package/dist/types/modes/components/extensions/extension-list.d.ts +39 -0
- package/dist/types/modes/components/extensions/index.d.ts +8 -0
- package/dist/types/modes/components/extensions/inspector-panel.d.ts +8 -0
- package/dist/types/modes/components/extensions/state-manager.d.ts +50 -0
- package/dist/types/modes/components/extensions/types.d.ts +151 -0
- package/dist/types/modes/components/footer.d.ts +30 -0
- package/dist/types/modes/components/history-search.d.ts +7 -0
- package/dist/types/modes/components/hook-editor.d.ts +18 -0
- package/dist/types/modes/components/hook-input.d.ts +15 -0
- package/dist/types/modes/components/hook-message.d.ts +15 -0
- package/dist/types/modes/components/hook-selector.d.ts +53 -0
- package/dist/types/modes/components/index.d.ts +35 -0
- package/dist/types/modes/components/jobs-overlay-model.d.ts +31 -0
- package/dist/types/modes/components/jobs-overlay.d.ts +30 -0
- package/dist/types/modes/components/keybinding-hints.d.ts +40 -0
- package/dist/types/modes/components/login-dialog.d.ts +32 -0
- package/dist/types/modes/components/message-frame.d.ts +42 -0
- package/dist/types/modes/components/model-selector.d.ts +60 -0
- package/dist/types/modes/components/oauth-selector.d.ts +17 -0
- package/dist/types/modes/components/plugin-selector.d.ts +26 -0
- package/dist/types/modes/components/plugin-settings.d.ts +66 -0
- package/dist/types/modes/components/provider-onboarding-selector.d.ts +7 -0
- package/dist/types/modes/components/queue-mode-selector.d.ts +9 -0
- package/dist/types/modes/components/queued-message-selector.d.ts +12 -0
- package/dist/types/modes/components/read-tool-group.d.ts +30 -0
- package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +26 -0
- package/dist/types/modes/components/session-observer-overlay.d.ts +11 -0
- package/dist/types/modes/components/session-selector.d.ts +30 -0
- package/dist/types/modes/components/settings-defs.d.ts +50 -0
- package/dist/types/modes/components/settings-selector.d.ts +62 -0
- package/dist/types/modes/components/show-images-selector.d.ts +9 -0
- package/dist/types/modes/components/skill-hud/render.d.ts +2 -0
- package/dist/types/modes/components/skill-message.d.ts +10 -0
- package/dist/types/modes/components/status-line/context-thresholds.d.ts +4 -0
- package/dist/types/modes/components/status-line/git-utils.d.ts +28 -0
- package/dist/types/modes/components/status-line/index.d.ts +4 -0
- package/dist/types/modes/components/status-line/presets.d.ts +3 -0
- package/dist/types/modes/components/status-line/segments.d.ts +5 -0
- package/dist/types/modes/components/status-line/separators.d.ts +3 -0
- package/dist/types/modes/components/status-line/token-rate.d.ts +10 -0
- package/dist/types/modes/components/status-line/types.d.ts +77 -0
- package/dist/types/modes/components/status-line.d.ts +103 -0
- package/dist/types/modes/components/theme-selector.d.ts +10 -0
- package/dist/types/modes/components/thinking-selector.d.ts +10 -0
- package/dist/types/modes/components/todo-reminder.d.ts +13 -0
- package/dist/types/modes/components/tool-execution.d.ts +54 -0
- package/dist/types/modes/components/tree-selector.d.ts +31 -0
- package/dist/types/modes/components/ttsr-notification.d.ts +13 -0
- package/dist/types/modes/components/two-column-body.d.ts +9 -0
- package/dist/types/modes/components/user-message-selector.d.ts +28 -0
- package/dist/types/modes/components/user-message.d.ts +7 -0
- package/dist/types/modes/components/visual-truncate.d.ts +19 -0
- package/dist/types/modes/components/welcome.d.ts +45 -0
- package/dist/types/modes/controllers/btw-controller.d.ts +10 -0
- package/dist/types/modes/controllers/command-controller-shared.d.ts +47 -0
- package/dist/types/modes/controllers/command-controller.d.ts +40 -0
- package/dist/types/modes/controllers/event-controller.d.ts +17 -0
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +80 -0
- package/dist/types/modes/controllers/input-controller.d.ts +42 -0
- package/dist/types/modes/controllers/runtime-mcp-command-controller.d.ts +10 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +66 -0
- package/dist/types/modes/controllers/ssh-command-controller.d.ts +10 -0
- package/dist/types/modes/controllers/todo-command-controller.d.ts +7 -0
- package/dist/types/modes/emoji-autocomplete.d.ts +16 -0
- package/dist/types/modes/index.d.ts +10 -0
- package/dist/types/modes/interactive-mode.d.ts +273 -0
- package/dist/types/modes/jobs-observer.d.ts +57 -0
- package/dist/types/modes/oauth-manual-input.d.ts +8 -0
- package/dist/types/modes/print-mode.d.ts +45 -0
- package/dist/types/modes/prompt-action-autocomplete.d.ts +50 -0
- package/dist/types/modes/rpc/host-tools.d.ts +1 -0
- package/dist/types/modes/rpc/host-uris.d.ts +1 -0
- package/dist/types/modes/rpc/rpc-client.d.ts +288 -0
- package/dist/types/modes/rpc/rpc-mode.d.ts +87 -0
- package/dist/types/modes/rpc/rpc-socket-security.d.ts +7 -0
- package/dist/types/modes/rpc/rpc-types.d.ts +794 -0
- package/dist/types/modes/runtime-init.d.ts +21 -0
- package/dist/types/modes/session-observer-registry.d.ts +26 -0
- package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +57 -0
- package/dist/types/modes/shared/agent-wire/command-contract.d.ts +18 -0
- package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +37 -0
- package/dist/types/modes/shared/agent-wire/command-validation.d.ts +2 -0
- package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +94 -0
- package/dist/types/modes/shared/agent-wire/event-contract.d.ts +103 -0
- package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +60 -0
- package/dist/types/modes/shared/agent-wire/event-observation.d.ts +37 -0
- package/dist/types/modes/shared/agent-wire/handshake.d.ts +56 -0
- package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +16 -0
- package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +17 -0
- package/dist/types/modes/shared/agent-wire/protocol.d.ts +25 -0
- package/dist/types/modes/shared/agent-wire/responses.d.ts +4 -0
- package/dist/types/modes/shared/agent-wire/scopes.d.ts +18 -0
- package/dist/types/modes/shared/agent-wire/session-registry.d.ts +25 -0
- package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +42 -0
- package/dist/types/modes/shared/agent-wire/ui-result.d.ts +27 -0
- package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +29 -0
- package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +68 -0
- package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +161 -0
- package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +82 -0
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +114 -0
- package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +39 -0
- package/dist/types/modes/shared.d.ts +15 -0
- package/dist/types/modes/slash-command-visibility.d.ts +1 -0
- package/dist/types/modes/theme/defaults/index.d.ts +652 -0
- package/dist/types/modes/theme/mermaid-cache.d.ts +9 -0
- package/dist/types/modes/theme/shimmer.d.ts +38 -0
- package/dist/types/modes/theme/theme.d.ts +275 -0
- package/dist/types/modes/tmux-scroll.d.ts +18 -0
- package/dist/types/modes/types.d.ts +289 -0
- package/dist/types/modes/utils/abort-message.d.ts +4 -0
- package/dist/types/modes/utils/context-usage.d.ts +51 -0
- package/dist/types/modes/utils/hotkeys-markdown.d.ts +5 -0
- package/dist/types/modes/utils/keybinding-matchers.d.ts +10 -0
- package/dist/types/modes/utils/terminal-bell.d.ts +3 -0
- package/dist/types/modes/utils/tools-markdown.d.ts +5 -0
- package/dist/types/modes/utils/ui-helpers.d.ts +54 -0
- package/dist/types/notifications/attachment-registry.d.ts +17 -0
- package/dist/types/notifications/chat-adapters.d.ts +9 -0
- package/dist/types/notifications/config-commands.d.ts +26 -0
- package/dist/types/notifications/config.d.ts +82 -0
- package/dist/types/notifications/daemon-paths.d.ts +10 -0
- package/dist/types/notifications/engine.d.ts +59 -0
- package/dist/types/notifications/helpers.d.ts +55 -0
- package/dist/types/notifications/html-format.d.ts +75 -0
- package/dist/types/notifications/index.d.ts +179 -0
- package/dist/types/notifications/lifecycle-commands.d.ts +68 -0
- package/dist/types/notifications/lifecycle-control-runtime.d.ts +98 -0
- package/dist/types/notifications/lifecycle-orchestrator.d.ts +144 -0
- package/dist/types/notifications/managed-daemon.d.ts +48 -0
- package/dist/types/notifications/operator-runtime.d.ts +52 -0
- package/dist/types/notifications/rate-limit-pool.d.ts +95 -0
- package/dist/types/notifications/recent-activity.d.ts +39 -0
- package/dist/types/notifications/telegram-cli.d.ts +19 -0
- package/dist/types/notifications/telegram-daemon-cli.d.ts +28 -0
- package/dist/types/notifications/telegram-daemon-control.d.ts +64 -0
- package/dist/types/notifications/telegram-daemon.d.ts +407 -0
- package/dist/types/notifications/telegram-reference.d.ts +112 -0
- package/dist/types/notifications/threaded-inbound.d.ts +77 -0
- package/dist/types/notifications/threaded-render.d.ts +78 -0
- package/dist/types/notifications/topic-registry.d.ts +70 -0
- package/dist/types/plan-mode/approved-plan.d.ts +49 -0
- package/dist/types/plan-mode/state.d.ts +6 -0
- package/dist/types/registry/agent-registry.d.ts +62 -0
- package/dist/types/reminders/star-reminder.d.ts +115 -0
- package/dist/types/research-plan/index.d.ts +1 -0
- package/dist/types/research-plan/ledger.d.ts +33 -0
- package/dist/types/rlm/artifacts.d.ts +9 -0
- package/dist/types/rlm/complete-research-tool.d.ts +35 -0
- package/dist/types/rlm/data-context.d.ts +6 -0
- package/dist/types/rlm/index.d.ts +47 -0
- package/dist/types/rlm/notebook.d.ts +12 -0
- package/dist/types/rlm/preset.d.ts +23 -0
- package/dist/types/rlm/python-tool.d.ts +16 -0
- package/dist/types/rlm/report.d.ts +14 -0
- package/dist/types/rlm/types.d.ts +37 -0
- package/dist/types/runtime/process-lifecycle.d.ts +108 -0
- package/dist/types/runtime-api-key.d.ts +7 -0
- package/dist/types/runtime-mcp/client.d.ts +74 -0
- package/dist/types/runtime-mcp/config-writer.d.ts +88 -0
- package/dist/types/runtime-mcp/config.d.ts +77 -0
- package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +7 -0
- package/dist/types/runtime-mcp/index.d.ts +18 -0
- package/dist/types/runtime-mcp/json-rpc.d.ts +22 -0
- package/dist/types/runtime-mcp/loader.d.ts +45 -0
- package/dist/types/runtime-mcp/manager.d.ts +195 -0
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +40 -0
- package/dist/types/runtime-mcp/oauth-flow.d.ts +59 -0
- package/dist/types/runtime-mcp/render.d.ts +25 -0
- package/dist/types/runtime-mcp/smithery-auth.d.ts +16 -0
- package/dist/types/runtime-mcp/smithery-connect.d.ts +38 -0
- package/dist/types/runtime-mcp/smithery-registry.d.ts +51 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +86 -0
- package/dist/types/runtime-mcp/tool-cache.d.ts +8 -0
- package/dist/types/runtime-mcp/transports/http.d.ts +36 -0
- package/dist/types/runtime-mcp/transports/index.d.ts +5 -0
- package/dist/types/runtime-mcp/transports/stdio.d.ts +29 -0
- package/dist/types/runtime-mcp/types.d.ts +348 -0
- package/dist/types/sdk.d.ts +248 -0
- package/dist/types/secrets/index.d.ts +9 -0
- package/dist/types/secrets/obfuscator.d.ts +23 -0
- package/dist/types/secrets/regex.d.ts +2 -0
- package/dist/types/session/agent-session.d.ts +1182 -0
- package/dist/types/session/agent-storage.d.ts +101 -0
- package/dist/types/session/artifacts.d.ts +64 -0
- package/dist/types/session/auth-broker-config.d.ts +13 -0
- package/dist/types/session/auth-storage.d.ts +6 -0
- package/dist/types/session/blob-store.d.ts +160 -0
- package/dist/types/session/client-bridge.d.ts +88 -0
- package/dist/types/session/contribution-prep.d.ts +47 -0
- package/dist/types/session/file-mention-pruning.d.ts +8 -0
- package/dist/types/session/history-storage.d.ts +16 -0
- package/dist/types/session/messages.d.ts +169 -0
- package/dist/types/session/session-dump-format.d.ts +22 -0
- package/dist/types/session/session-manager.d.ts +660 -0
- package/dist/types/session/session-storage.d.ts +88 -0
- package/dist/types/session/streaming-output.d.ts +209 -0
- package/dist/types/session/tool-choice-queue.d.ts +84 -0
- package/dist/types/session/yield-queue.d.ts +24 -0
- package/dist/types/setup/credential-auto-import.d.ts +63 -0
- package/dist/types/setup/credential-import.d.ts +82 -0
- package/dist/types/setup/hermes-setup.d.ts +78 -0
- package/dist/types/setup/host-plugin-setup.d.ts +39 -0
- package/dist/types/setup/model-onboarding-guidance.d.ts +9 -0
- package/dist/types/setup/provider-onboarding.d.ts +52 -0
- package/dist/types/skc-runtime/cli-write-receipt.d.ts +24 -0
- package/dist/types/skc-runtime/deep-interview-ambiguity.d.ts +39 -0
- package/dist/types/skc-runtime/deep-interview-recorder.d.ts +114 -0
- package/dist/types/skc-runtime/deep-interview-runtime.d.ts +36 -0
- package/dist/types/skc-runtime/deep-interview-state.d.ts +127 -0
- package/dist/types/skc-runtime/gc-render.d.ts +6 -0
- package/dist/types/skc-runtime/gc-runtime.d.ts +134 -0
- package/dist/types/skc-runtime/goal-mode-request.d.ts +53 -0
- package/dist/types/skc-runtime/launch-tmux.d.ts +78 -0
- package/dist/types/skc-runtime/launch-worktree.d.ts +46 -0
- package/dist/types/skc-runtime/ledger-event-renderer.d.ts +68 -0
- package/dist/types/skc-runtime/psmux-detect.d.ts +78 -0
- package/dist/types/skc-runtime/ralplan-runtime.d.ts +26 -0
- package/dist/types/skc-runtime/restricted-role-agent-bash.d.ts +3 -0
- package/dist/types/skc-runtime/session-layout.d.ts +59 -0
- package/dist/types/skc-runtime/session-resolution.d.ts +47 -0
- package/dist/types/skc-runtime/session-state-sidecar.d.ts +39 -0
- package/dist/types/skc-runtime/state-graph.d.ts +4 -0
- package/dist/types/skc-runtime/state-migrations.d.ts +33 -0
- package/dist/types/skc-runtime/state-renderer.d.ts +70 -0
- package/dist/types/skc-runtime/state-runtime.d.ts +38 -0
- package/dist/types/skc-runtime/state-schema.d.ts +319 -0
- package/dist/types/skc-runtime/state-validation.d.ts +6 -0
- package/dist/types/skc-runtime/state-writer.d.ts +244 -0
- package/dist/types/skc-runtime/team-gc.d.ts +7 -0
- package/dist/types/skc-runtime/team-runtime.d.ts +355 -0
- package/dist/types/skc-runtime/tmux-common.d.ts +104 -0
- package/dist/types/skc-runtime/tmux-gc.d.ts +7 -0
- package/dist/types/skc-runtime/tmux-sessions.d.ts +62 -0
- package/dist/types/skc-runtime/ultragoal-guard.d.ts +93 -0
- package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +42 -0
- package/dist/types/skc-runtime/ultragoal-runtime.d.ts +410 -0
- package/dist/types/skc-runtime/workflow-command-ref.d.ts +43 -0
- package/dist/types/skc-runtime/workflow-manifest.d.ts +54 -0
- package/dist/types/skill-state/active-state.d.ts +126 -0
- package/dist/types/skill-state/canonical-skills.d.ts +3 -0
- package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +38 -0
- package/dist/types/skill-state/initial-phase.d.ts +12 -0
- package/dist/types/skill-state/workflow-hud.d.ts +83 -0
- package/dist/types/skill-state/workflow-state-contract.d.ts +57 -0
- package/dist/types/skill-state/workflow-state-version.d.ts +3 -0
- package/dist/types/slash-commands/acp-builtins.d.ts +18 -0
- package/dist/types/slash-commands/builtin-registry.d.ts +24 -0
- package/dist/types/slash-commands/helpers/context-report.d.ts +7 -0
- package/dist/types/slash-commands/helpers/fast-status-report.d.ts +82 -0
- package/dist/types/slash-commands/helpers/format.d.ts +10 -0
- package/dist/types/slash-commands/helpers/mcp.d.ts +3 -0
- package/dist/types/slash-commands/helpers/parse.d.ts +33 -0
- package/dist/types/slash-commands/helpers/ssh.d.ts +3 -0
- package/dist/types/slash-commands/helpers/todo.d.ts +3 -0
- package/dist/types/slash-commands/helpers/usage-report.d.ts +7 -0
- package/dist/types/slash-commands/types.d.ts +120 -0
- package/dist/types/ssh/config-writer.d.ts +49 -0
- package/dist/types/ssh/connection-manager.d.ts +33 -0
- package/dist/types/ssh/ssh-executor.d.ts +37 -0
- package/dist/types/ssh/sshfs-mount.d.ts +6 -0
- package/dist/types/ssh/utils.d.ts +2 -0
- package/dist/types/stt/downloader.d.ts +9 -0
- package/dist/types/stt/index.d.ts +3 -0
- package/dist/types/stt/recorder.d.ts +13 -0
- package/dist/types/stt/setup.d.ts +18 -0
- package/dist/types/stt/stt-controller.d.ts +16 -0
- package/dist/types/stt/transcriber.d.ts +16 -0
- package/dist/types/system-prompt.d.ts +118 -0
- package/dist/types/task/agents.d.ts +28 -0
- package/dist/types/task/commands.d.ts +35 -0
- package/dist/types/task/discovery.d.ts +19 -0
- package/dist/types/task/executor.d.ts +124 -0
- package/dist/types/task/fork-context-advisory.d.ts +13 -0
- package/dist/types/task/fork-context-budget.d.ts +7 -0
- package/dist/types/task/id.d.ts +7 -0
- package/dist/types/task/index.d.ts +43 -0
- package/dist/types/task/name-generator.d.ts +16 -0
- package/dist/types/task/output-manager.d.ts +36 -0
- package/dist/types/task/parallel.d.ts +34 -0
- package/dist/types/task/receipt.d.ts +87 -0
- package/dist/types/task/render.d.ts +28 -0
- package/dist/types/task/roi-reconciliation.d.ts +27 -0
- package/dist/types/task/simple-mode.d.ts +8 -0
- package/dist/types/task/skc-command.d.ts +7 -0
- package/dist/types/task/spawn-gate.d.ts +29 -0
- package/dist/types/task/subprocess-tool-registry.d.ts +72 -0
- package/dist/types/task/token-log.d.ts +30 -0
- package/dist/types/task/token-log.test.d.ts +1 -0
- package/dist/types/task/types.d.ts +508 -0
- package/dist/types/task/worktree.d.ts +94 -0
- package/dist/types/thinking-metadata.d.ts +16 -0
- package/dist/types/thinking.d.ts +22 -0
- package/dist/types/tool-discovery/tool-index.d.ts +112 -0
- package/dist/types/tools/archive-reader.d.ts +40 -0
- package/dist/types/tools/ask-answer-registry.d.ts +13 -0
- package/dist/types/tools/ask.d.ts +123 -0
- package/dist/types/tools/ast-edit.d.ts +77 -0
- package/dist/types/tools/ast-grep.d.ts +69 -0
- package/dist/types/tools/auto-generated-guard.d.ts +17 -0
- package/dist/types/tools/bash-allowed-prefixes.d.ts +10 -0
- package/dist/types/tools/bash-command-fixup.d.ts +11 -0
- package/dist/types/tools/bash-interactive.d.ts +16 -0
- package/dist/types/tools/bash-interceptor.d.ts +24 -0
- package/dist/types/tools/bash-pty-selection.d.ts +7 -0
- package/dist/types/tools/bash-skill-urls.d.ts +31 -0
- package/dist/types/tools/bash.d.ts +157 -0
- package/dist/types/tools/bisect.d.ts +81 -0
- package/dist/types/tools/browser/actions.d.ts +54 -0
- package/dist/types/tools/browser/attach.d.ts +50 -0
- package/dist/types/tools/browser/launch.d.ts +62 -0
- package/dist/types/tools/browser/readable.d.ts +17 -0
- package/dist/types/tools/browser/registry.d.ts +57 -0
- package/dist/types/tools/browser/render.d.ts +53 -0
- package/dist/types/tools/browser/tab-protocol.d.ts +144 -0
- package/dist/types/tools/browser/tab-supervisor.d.ts +103 -0
- package/dist/types/tools/browser/tab-worker-entry.d.ts +1 -0
- package/dist/types/tools/browser/tab-worker.d.ts +19 -0
- package/dist/types/tools/browser.d.ts +211 -0
- package/dist/types/tools/calculator.d.ts +76 -0
- package/dist/types/tools/checkpoint.d.ts +63 -0
- package/dist/types/tools/composer-bash-policy.d.ts +14 -0
- package/dist/types/tools/computer/render.d.ts +17 -0
- package/dist/types/tools/computer-gc.d.ts +23 -0
- package/dist/types/tools/computer.d.ts +465 -0
- package/dist/types/tools/conflict-detect.d.ts +205 -0
- package/dist/types/tools/context.d.ts +19 -0
- package/dist/types/tools/cron.d.ts +91 -0
- package/dist/types/tools/debug.d.ts +209 -0
- package/dist/types/tools/eval.d.ts +108 -0
- package/dist/types/tools/fetch.d.ts +84 -0
- package/dist/types/tools/file-recorder.d.ts +13 -0
- package/dist/types/tools/find.d.ts +95 -0
- package/dist/types/tools/fs-cache-invalidation.d.ts +15 -0
- package/dist/types/tools/gh-format.d.ts +6 -0
- package/dist/types/tools/gh-renderer.d.ts +25 -0
- package/dist/types/tools/gh.d.ts +356 -0
- package/dist/types/tools/github-cache.d.ts +103 -0
- package/dist/types/tools/grouped-file-output.d.ts +36 -0
- package/dist/types/tools/hindsight-recall.d.ts +21 -0
- package/dist/types/tools/hindsight-reflect.d.ts +23 -0
- package/dist/types/tools/hindsight-retain.d.ts +27 -0
- package/dist/types/tools/image-gen.d.ts +79 -0
- package/dist/types/tools/index.d.ts +318 -0
- package/dist/types/tools/irc.d.ts +79 -0
- package/dist/types/tools/job.d.ts +78 -0
- package/dist/types/tools/json-tree.d.ts +23 -0
- package/dist/types/tools/jtd-to-json-schema.d.ts +29 -0
- package/dist/types/tools/jtd-to-typescript.d.ts +26 -0
- package/dist/types/tools/jtd-utils.d.ts +42 -0
- package/dist/types/tools/list-limit.d.ts +12 -0
- package/dist/types/tools/match-line-format.d.ts +11 -0
- package/dist/types/tools/monitor.d.ts +54 -0
- package/dist/types/tools/output-meta.d.ts +204 -0
- package/dist/types/tools/path-utils.d.ts +147 -0
- package/dist/types/tools/plan-mode-guard.d.ts +18 -0
- package/dist/types/tools/read.d.ts +85 -0
- package/dist/types/tools/recipe/index.d.ts +45 -0
- package/dist/types/tools/recipe/render.d.ts +36 -0
- package/dist/types/tools/recipe/runner.d.ts +60 -0
- package/dist/types/tools/recipe/runners/cargo.d.ts +16 -0
- package/dist/types/tools/recipe/runners/index.d.ts +2 -0
- package/dist/types/tools/recipe/runners/just.d.ts +2 -0
- package/dist/types/tools/recipe/runners/make.d.ts +2 -0
- package/dist/types/tools/recipe/runners/pkg.d.ts +2 -0
- package/dist/types/tools/recipe/runners/task.d.ts +2 -0
- package/dist/types/tools/render-mermaid.d.ts +37 -0
- package/dist/types/tools/render-utils.d.ts +158 -0
- package/dist/types/tools/renderers.d.ts +26 -0
- package/dist/types/tools/resolve.d.ts +80 -0
- package/dist/types/tools/resource-gc.d.ts +54 -0
- package/dist/types/tools/review.d.ts +63 -0
- package/dist/types/tools/search-tool-bm25.d.ts +65 -0
- package/dist/types/tools/search.d.ts +93 -0
- package/dist/types/tools/skill.d.ts +47 -0
- package/dist/types/tools/sqlite-reader.d.ts +94 -0
- package/dist/types/tools/ssh.d.ts +67 -0
- package/dist/types/tools/subagent-render.d.ts +31 -0
- package/dist/types/tools/subagent.d.ts +117 -0
- package/dist/types/tools/telegram-send.d.ts +32 -0
- package/dist/types/tools/todo-write.d.ts +120 -0
- package/dist/types/tools/tool-errors.d.ts +33 -0
- package/dist/types/tools/tool-result.d.ts +30 -0
- package/dist/types/tools/tool-timeouts.d.ts +56 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +12 -0
- package/dist/types/tools/vim.d.ts +58 -0
- package/dist/types/tools/write.d.ts +59 -0
- package/dist/types/tools/yield.d.ts +25 -0
- package/dist/types/tui/code-cell.d.ts +32 -0
- package/dist/types/tui/file-list.d.ts +22 -0
- package/dist/types/tui/hyperlink.d.ts +42 -0
- package/dist/types/tui/index.d.ts +11 -0
- package/dist/types/tui/output-block.d.ts +28 -0
- package/dist/types/tui/status-line.d.ts +18 -0
- package/dist/types/tui/tree-list.d.ts +19 -0
- package/dist/types/tui/types.d.ts +13 -0
- package/dist/types/tui/utils.d.ts +36 -0
- package/dist/types/utils/changelog.d.ts +37 -0
- package/dist/types/utils/clipboard.d.ts +22 -0
- package/dist/types/utils/cmux-workspace.d.ts +52 -0
- package/dist/types/utils/command-args.d.ts +9 -0
- package/dist/types/utils/commit-message-generator.d.ts +7 -0
- package/dist/types/utils/edit-mode.d.ts +13 -0
- package/dist/types/utils/event-bus.d.ts +6 -0
- package/dist/types/utils/external-editor.d.ts +17 -0
- package/dist/types/utils/file-display-mode.d.ts +27 -0
- package/dist/types/utils/file-mentions.d.ts +25 -0
- package/dist/types/utils/git.d.ts +393 -0
- package/dist/types/utils/image-loading.d.ts +26 -0
- package/dist/types/utils/image-resize.d.ts +39 -0
- package/dist/types/utils/lang-from-path.d.ts +8 -0
- package/dist/types/utils/markit.d.ts +7 -0
- package/dist/types/utils/open.d.ts +2 -0
- package/dist/types/utils/session-color.d.ts +10 -0
- package/dist/types/utils/shell-snapshot.d.ts +5 -0
- package/dist/types/utils/sixel.d.ts +21 -0
- package/dist/types/utils/title-generator.d.ts +31 -0
- package/dist/types/utils/tool-choice.d.ts +20 -0
- package/dist/types/utils/tools-manager.d.ts +9 -0
- package/dist/types/vim/buffer.d.ts +41 -0
- package/dist/types/vim/commands.d.ts +6 -0
- package/dist/types/vim/engine.d.ts +47 -0
- package/dist/types/vim/parser.d.ts +3 -0
- package/dist/types/vim/render.d.ts +25 -0
- package/dist/types/vim/types.d.ts +182 -0
- package/dist/types/web/insane/bridge.d.ts +103 -0
- package/dist/types/web/insane/url-guard.d.ts +25 -0
- package/dist/types/web/kagi.d.ts +23 -0
- package/dist/types/web/parallel.d.ts +58 -0
- package/dist/types/web/scrapers/artifacthub.d.ts +6 -0
- package/dist/types/web/scrapers/arxiv.d.ts +5 -0
- package/dist/types/web/scrapers/aur.d.ts +5 -0
- package/dist/types/web/scrapers/biorxiv.d.ts +5 -0
- package/dist/types/web/scrapers/bluesky.d.ts +5 -0
- package/dist/types/web/scrapers/brew.d.ts +5 -0
- package/dist/types/web/scrapers/cheatsh.d.ts +8 -0
- package/dist/types/web/scrapers/chocolatey.d.ts +5 -0
- package/dist/types/web/scrapers/choosealicense.d.ts +2 -0
- package/dist/types/web/scrapers/cisa-kev.d.ts +5 -0
- package/dist/types/web/scrapers/clojars.d.ts +5 -0
- package/dist/types/web/scrapers/coingecko.d.ts +5 -0
- package/dist/types/web/scrapers/crates-io.d.ts +5 -0
- package/dist/types/web/scrapers/crossref.d.ts +2 -0
- package/dist/types/web/scrapers/devto.d.ts +5 -0
- package/dist/types/web/scrapers/discogs.d.ts +8 -0
- package/dist/types/web/scrapers/discourse.d.ts +5 -0
- package/dist/types/web/scrapers/dockerhub.d.ts +5 -0
- package/dist/types/web/scrapers/docs-rs.d.ts +2 -0
- package/dist/types/web/scrapers/fdroid.d.ts +5 -0
- package/dist/types/web/scrapers/firefox-addons.d.ts +2 -0
- package/dist/types/web/scrapers/flathub.d.ts +2 -0
- package/dist/types/web/scrapers/github-gist.d.ts +5 -0
- package/dist/types/web/scrapers/github.d.ts +12 -0
- package/dist/types/web/scrapers/gitlab.d.ts +5 -0
- package/dist/types/web/scrapers/go-pkg.d.ts +5 -0
- package/dist/types/web/scrapers/hackage.d.ts +5 -0
- package/dist/types/web/scrapers/hackernews.d.ts +2 -0
- package/dist/types/web/scrapers/hex.d.ts +5 -0
- package/dist/types/web/scrapers/huggingface.d.ts +2 -0
- package/dist/types/web/scrapers/iacr.d.ts +5 -0
- package/dist/types/web/scrapers/index.d.ts +84 -0
- package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +2 -0
- package/dist/types/web/scrapers/lemmy.d.ts +2 -0
- package/dist/types/web/scrapers/lobsters.d.ts +5 -0
- package/dist/types/web/scrapers/mastodon.d.ts +5 -0
- package/dist/types/web/scrapers/maven.d.ts +6 -0
- package/dist/types/web/scrapers/mdn.d.ts +2 -0
- package/dist/types/web/scrapers/metacpan.d.ts +5 -0
- package/dist/types/web/scrapers/musicbrainz.d.ts +5 -0
- package/dist/types/web/scrapers/npm.d.ts +5 -0
- package/dist/types/web/scrapers/nuget.d.ts +5 -0
- package/dist/types/web/scrapers/nvd.d.ts +5 -0
- package/dist/types/web/scrapers/ollama.d.ts +2 -0
- package/dist/types/web/scrapers/open-vsx.d.ts +5 -0
- package/dist/types/web/scrapers/opencorporates.d.ts +5 -0
- package/dist/types/web/scrapers/openlibrary.d.ts +5 -0
- package/dist/types/web/scrapers/orcid.d.ts +5 -0
- package/dist/types/web/scrapers/osv.d.ts +5 -0
- package/dist/types/web/scrapers/packagist.d.ts +5 -0
- package/dist/types/web/scrapers/pub-dev.d.ts +5 -0
- package/dist/types/web/scrapers/pubmed.d.ts +5 -0
- package/dist/types/web/scrapers/pypi.d.ts +5 -0
- package/dist/types/web/scrapers/rawg.d.ts +2 -0
- package/dist/types/web/scrapers/readthedocs.d.ts +2 -0
- package/dist/types/web/scrapers/reddit.d.ts +5 -0
- package/dist/types/web/scrapers/repology.d.ts +5 -0
- package/dist/types/web/scrapers/rfc.d.ts +5 -0
- package/dist/types/web/scrapers/rubygems.d.ts +5 -0
- package/dist/types/web/scrapers/searchcode.d.ts +2 -0
- package/dist/types/web/scrapers/sec-edgar.d.ts +5 -0
- package/dist/types/web/scrapers/semantic-scholar.d.ts +2 -0
- package/dist/types/web/scrapers/snapcraft.d.ts +2 -0
- package/dist/types/web/scrapers/sourcegraph.d.ts +2 -0
- package/dist/types/web/scrapers/spdx.d.ts +5 -0
- package/dist/types/web/scrapers/spotify.d.ts +8 -0
- package/dist/types/web/scrapers/stackoverflow.d.ts +6 -0
- package/dist/types/web/scrapers/terraform.d.ts +5 -0
- package/dist/types/web/scrapers/tldr.d.ts +7 -0
- package/dist/types/web/scrapers/twitter.d.ts +5 -0
- package/dist/types/web/scrapers/types.d.ts +83 -0
- package/dist/types/web/scrapers/utils.d.ts +32 -0
- package/dist/types/web/scrapers/vimeo.d.ts +5 -0
- package/dist/types/web/scrapers/vscode-marketplace.d.ts +5 -0
- package/dist/types/web/scrapers/w3c.d.ts +2 -0
- package/dist/types/web/scrapers/wikidata.d.ts +5 -0
- package/dist/types/web/scrapers/wikipedia.d.ts +5 -0
- package/dist/types/web/scrapers/youtube.d.ts +13 -0
- package/dist/types/web/search/index.d.ts +118 -0
- package/dist/types/web/search/provider.d.ts +55 -0
- package/dist/types/web/search/providers/anthropic.d.ts +32 -0
- package/dist/types/web/search/providers/base.d.ts +90 -0
- package/dist/types/web/search/providers/brave.d.ts +27 -0
- package/dist/types/web/search/providers/codex.d.ts +35 -0
- package/dist/types/web/search/providers/duckduckgo.d.ts +57 -0
- package/dist/types/web/search/providers/exa.d.ts +52 -0
- package/dist/types/web/search/providers/gemini.d.ts +57 -0
- package/dist/types/web/search/providers/insane.d.ts +53 -0
- package/dist/types/web/search/providers/jina.d.ts +26 -0
- package/dist/types/web/search/providers/kagi.d.ts +24 -0
- package/dist/types/web/search/providers/kimi.d.ts +27 -0
- package/dist/types/web/search/providers/openai-compatible.d.ts +9 -0
- package/dist/types/web/search/providers/parallel.d.ts +15 -0
- package/dist/types/web/search/providers/perplexity.d.ts +38 -0
- package/dist/types/web/search/providers/searxng.d.ts +44 -0
- package/dist/types/web/search/providers/synthetic.d.ts +21 -0
- package/dist/types/web/search/providers/tavily.d.ts +29 -0
- package/dist/types/web/search/providers/text-citations.d.ts +23 -0
- package/dist/types/web/search/providers/utils.d.ts +88 -0
- package/dist/types/web/search/providers/xai.d.ts +64 -0
- package/dist/types/web/search/providers/zai.d.ts +28 -0
- package/dist/types/web/search/render.d.ts +36 -0
- package/dist/types/web/search/types.d.ts +372 -0
- package/dist/types/web/search/utils.d.ts +4 -0
- package/dist/types/workflow/workflow-intent-diff.d.ts +25 -0
- package/dist/types/workflow/workflow-intent-report-consumer.d.ts +50 -0
- package/dist/types/workflow/workflow-intent-report-schema.d.ts +2 -0
- package/dist/types/workflow/workflow-intent-report.d.ts +48 -0
- package/dist/types/workspace-tree.d.ts +42 -0
- package/package.json +118 -117
- package/scripts/build-binary.ts +3 -0
- package/src/append-only-mode.ts +58 -0
- package/src/autoresearch/prompt.md +1 -1
- package/src/autoresearch/tools/log-experiment.ts +1 -1
- package/src/capability/mcp.ts +2 -0
- package/src/capability/rule.ts +9 -0
- package/src/cli/completion-cli.ts +234 -0
- package/src/cli/config-cli.ts +61 -9
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/fixture-report.test.ts +230 -0
- package/src/cli/fixture-report.ts +171 -0
- package/src/cli/nofile-limit.ts +48 -0
- package/src/cli/notify-cli.ts +92 -8
- package/src/cli/telegram-cli.ts +156 -0
- package/src/cli/update-cli.ts +109 -9
- package/src/cli/web-search-cli.ts +5 -7
- package/src/cli.ts +31 -2
- package/src/commands/completion.ts +84 -0
- package/src/commands/config.ts +2 -0
- package/src/commands/contribution-prep.ts +1 -1
- package/src/commands/deep-interview.ts +2 -1
- package/src/commands/launch.ts +1 -1
- package/src/commands/ralplan.ts +1 -0
- package/src/commands/telegram.ts +47 -0
- package/src/config/file-lock.ts +73 -34
- package/src/config/keybindings.ts +17 -8
- package/src/config/mcp-schema.json +4 -0
- package/src/config/model-profile-activation.ts +65 -0
- package/src/config/model-profiles.ts +31 -2
- package/src/config/settings-schema.ts +279 -7
- package/src/config/settings.ts +22 -0
- package/src/config/telegram-autostart.ts +107 -0
- package/src/config/telegram-env-bridge.ts +92 -0
- package/src/defaults/skc/skills/ralplan/SKILL.md +29 -20
- package/src/defaults/skc/skills/team/SKILL.md +17 -14
- package/src/defaults/skc/skills/ultragoal/SKILL.md +95 -115
- package/src/defaults/skc/skills/ultragoal/pipeline-validation-contracts.md +30 -0
- package/src/defaults/skc-defaults.ts +25 -0
- package/src/discovery/builtin.ts +12 -0
- package/src/discovery/cursor.ts +5 -84
- package/src/discovery/gemini.ts +3 -89
- package/src/discovery/helpers.ts +10 -0
- package/src/discovery/index.ts +5 -1
- package/src/discovery/mcp-json.ts +11 -0
- package/src/discovery/opencode.ts +5 -122
- package/src/discovery/windsurf.ts +4 -82
- package/src/edit/read-file.ts +9 -1
- package/src/export/html/template.generated.ts +1 -1
- package/src/export/html/template.js +60 -2
- package/src/export/ttsr.ts +96 -18
- package/src/extensibility/extensions/runner.ts +185 -220
- package/src/extensibility/extensions/types.ts +20 -0
- package/src/extensibility/skc-plugins/runtime-adapters.ts +156 -44
- package/src/extensibility/skills.ts +30 -2
- package/src/goals/runtime.ts +10 -2
- package/src/hindsight/backend.ts +1 -3
- package/src/hooks/native-skill-hook.ts +124 -4
- package/src/hooks/skill-state.ts +33 -73
- package/src/i18n/messages/de.ts +1 -0
- package/src/i18n/messages/en.ts +1 -0
- package/src/i18n/messages/es.ts +1 -0
- package/src/i18n/messages/fr.ts +1 -0
- package/src/i18n/messages/ja.settings.ts +28 -0
- package/src/i18n/messages/ja.ts +1 -0
- package/src/i18n/messages/ko.settings.ts +28 -0
- package/src/i18n/messages/ko.ts +1 -0
- package/src/i18n/messages/zh.settings.ts +28 -0
- package/src/i18n/messages/zh.ts +1 -0
- package/src/internal-urls/docs-index.generated.ts +21 -8
- package/src/main.ts +100 -45
- package/src/memories/index.ts +12 -1
- package/src/migrate/executor.ts +23 -6
- package/src/modes/acp/acp-agent.ts +7 -6
- package/src/modes/components/agent-dashboard.ts +1 -34
- package/src/modes/components/assistant-message.ts +241 -82
- package/src/modes/components/custom-editor.ts +27 -0
- package/src/modes/components/extensions/extension-dashboard.ts +2 -48
- package/src/modes/components/hook-selector.ts +21 -3
- package/src/modes/components/model-selector.ts +118 -15
- package/src/modes/components/queued-message-selector.ts +92 -0
- package/src/modes/components/session-selector.ts +19 -9
- package/src/modes/components/settings-selector.ts +64 -5
- package/src/modes/components/skill-message.ts +18 -10
- package/src/modes/components/status-line/presets.ts +11 -0
- package/src/modes/components/status-line/segments.ts +10 -2
- package/src/modes/components/status-line.ts +341 -99
- package/src/modes/components/tool-execution.ts +44 -19
- package/src/modes/components/tree-selector.ts +28 -8
- package/src/modes/components/two-column-body.ts +36 -0
- package/src/modes/components/welcome.ts +335 -63
- package/src/modes/controllers/command-controller.ts +66 -6
- package/src/modes/controllers/event-controller.ts +70 -47
- package/src/modes/controllers/extension-ui-controller.ts +22 -12
- package/src/modes/controllers/input-controller.ts +367 -53
- package/src/modes/controllers/selector-controller.ts +152 -52
- package/src/modes/interactive-mode.ts +80 -39
- package/src/modes/print-mode.ts +43 -4
- package/src/modes/prompt-action-autocomplete.ts +47 -14
- package/src/modes/rpc/rpc-mode.ts +29 -3
- package/src/modes/rpc/rpc-types.ts +10 -0
- package/src/modes/shared/agent-wire/command-validation.ts +4 -0
- package/src/modes/shared/agent-wire/deep-interview-gate.ts +72 -15
- package/src/modes/shared/agent-wire/event-contract.ts +22 -0
- package/src/modes/shared/agent-wire/event-envelope.ts +82 -0
- package/src/modes/shared/agent-wire/scopes.ts +1 -0
- package/src/modes/shared/agent-wire/workflow-gate-schema.ts +20 -0
- package/src/modes/slash-command-visibility.ts +9 -0
- package/src/modes/theme/theme.ts +5 -1
- package/src/modes/types.ts +9 -1
- package/src/modes/utils/hotkeys-markdown.ts +6 -2
- package/src/modes/utils/ui-helpers.ts +95 -9
- package/src/notifications/config.ts +25 -5
- package/src/notifications/daemon-paths.ts +2 -0
- package/src/notifications/html-format.ts +75 -1
- package/src/notifications/index.ts +149 -16
- package/src/notifications/lifecycle-commands.ts +37 -7
- package/src/notifications/lifecycle-control-runtime.ts +12 -3
- package/src/notifications/lifecycle-orchestrator.ts +19 -6
- package/src/notifications/recent-activity.ts +32 -8
- package/src/notifications/telegram-daemon-cli.ts +13 -4
- package/src/notifications/telegram-daemon-control.ts +14 -3
- package/src/notifications/telegram-daemon.ts +382 -93
- package/src/notifications/telegram-reference.ts +36 -30
- package/src/notifications/threaded-render.ts +31 -7
- package/src/prompts/agents/architect.md +24 -12
- package/src/prompts/agents/critic.md +27 -20
- package/src/prompts/agents/executor.md +14 -11
- package/src/prompts/agents/planner.md +24 -14
- package/src/prompts/ci-green-request.md +3 -8
- package/src/prompts/goals/goal-continuation.md +0 -5
- package/src/prompts/goals/goal-mode-active.md +0 -5
- package/src/prompts/system/agent-creation-architect.md +2 -2
- package/src/prompts/system/plan-mode-active.md +1 -1
- package/src/prompts/system/plan-mode-subagent.md +3 -3
- package/src/prompts/system/project-prompt.md +0 -13
- package/src/prompts/system/subagent-system-prompt.md +3 -2
- package/src/prompts/system/system-prompt.md +42 -12
- package/src/prompts/system/volatile-project-context.md +10 -0
- package/src/prompts/system/web-search.md +4 -7
- package/src/prompts/tools/apply-patch.md +6 -0
- package/src/prompts/tools/ast-edit.md +1 -0
- package/src/prompts/tools/bash.md +2 -2
- package/src/prompts/tools/bisect.md +22 -0
- package/src/prompts/tools/browser.md +1 -1
- package/src/prompts/tools/computer.md +2 -2
- package/src/prompts/tools/cron.md +0 -2
- package/src/prompts/tools/eval.md +2 -2
- package/src/prompts/tools/find.md +1 -1
- package/src/prompts/tools/github.md +6 -6
- package/src/prompts/tools/goal.md +1 -3
- package/src/prompts/tools/image-gen.md +12 -5
- package/src/prompts/tools/irc.md +5 -4
- package/src/prompts/tools/job.md +2 -2
- package/src/prompts/tools/lsp.md +1 -1
- package/src/prompts/tools/monitor.md +2 -2
- package/src/prompts/tools/patch.md +2 -2
- package/src/prompts/tools/replace.md +2 -21
- package/src/prompts/tools/rewind.md +1 -1
- package/src/prompts/tools/search-tool-bm25.md +1 -11
- package/src/prompts/tools/search.md +1 -1
- package/src/prompts/tools/skill.md +3 -2
- package/src/prompts/tools/ssh.md +2 -1
- package/src/prompts/tools/subagent.md +2 -2
- package/src/prompts/tools/task.md +4 -5
- package/src/prompts/tools/todo-write.md +1 -1
- package/src/prompts/tools/vim.md +1 -0
- package/src/prompts/tools/web-search.md +2 -0
- package/src/prompts/tools/write.md +8 -2
- package/src/runtime-api-key.ts +16 -0
- package/src/runtime-mcp/config-writer.ts +28 -0
- package/src/runtime-mcp/config.ts +7 -0
- package/src/runtime-mcp/loader.ts +3 -0
- package/src/runtime-mcp/manager.ts +3 -0
- package/src/runtime-mcp/types.ts +6 -0
- package/src/sdk.ts +62 -39
- package/src/session/agent-session.ts +1041 -150
- package/src/session/agent-storage.ts +4 -0
- package/src/session/file-mention-pruning.ts +64 -0
- package/src/session/messages.ts +4 -0
- package/src/session/session-manager.ts +161 -22
- package/src/skc-runtime/deep-interview-ambiguity.ts +206 -0
- package/src/skc-runtime/deep-interview-recorder.ts +62 -8
- package/src/skc-runtime/deep-interview-state.ts +44 -2
- package/src/skc-runtime/ralplan-runtime.ts +22 -6
- package/src/skc-runtime/restricted-role-agent-bash.ts +1 -0
- package/src/skc-runtime/session-state-sidecar.ts +413 -27
- package/src/skc-runtime/state-runtime.ts +20 -7
- package/src/skc-runtime/state-writer.ts +20 -5
- package/src/skc-runtime/ultragoal-guard.ts +205 -90
- package/src/skc-runtime/ultragoal-receipt-freshness.ts +315 -0
- package/src/skc-runtime/ultragoal-runtime.ts +1671 -275
- package/src/skc-runtime/workflow-manifest.generated.json +108 -5
- package/src/skc-runtime/workflow-manifest.ts +74 -2
- package/src/skill-state/active-state.ts +141 -5
- package/src/skill-state/deep-interview-mutation-guard.ts +67 -3
- package/src/slash-commands/builtin-registry.ts +248 -81
- package/src/slash-commands/types.ts +2 -0
- package/src/system-prompt.ts +64 -15
- package/src/task/executor.ts +137 -24
- package/src/task/fork-context-advisory.ts +2 -7
- package/src/task/fork-context-budget.ts +9 -0
- package/src/task/index.ts +13 -6
- package/src/task/output-manager.ts +20 -8
- package/src/task/receipt.ts +26 -7
- package/src/task/token-log.test.ts +188 -0
- package/src/task/token-log.ts +179 -0
- package/src/tools/ast-grep.ts +10 -7
- package/src/tools/bash.ts +39 -14
- package/src/tools/bisect.ts +367 -0
- package/src/tools/computer.ts +246 -43
- package/src/tools/index.ts +11 -1
- package/src/tools/output-meta.ts +116 -4
- package/src/tools/search.ts +8 -2
- package/src/tools/skill.ts +16 -1
- package/src/tools/telegram-send.ts +6 -0
- package/src/tools/ultragoal-ask-guard.ts +39 -5
- package/src/utils/cmux-workspace.ts +233 -0
- package/src/utils/file-mentions.ts +39 -7
- package/src/utils/git.ts +73 -0
- package/src/utils/title-generator.ts +2 -0
- package/src/web/kagi.ts +1 -1
- package/src/web/parallel.ts +2 -2
- package/src/web/scrapers/youtube.ts +24 -12
- package/src/web/search/index.ts +137 -52
- package/src/web/search/provider.ts +80 -0
- package/src/web/search/providers/anthropic.ts +1 -1
- package/src/web/search/providers/brave.ts +1 -1
- package/src/web/search/providers/codex.ts +1 -1
- package/src/web/search/providers/duckduckgo.ts +1 -1
- package/src/web/search/providers/exa.ts +1 -1
- package/src/web/search/providers/gemini.ts +7 -3
- package/src/web/search/providers/jina.ts +1 -1
- package/src/web/search/providers/kimi.ts +6 -1
- package/src/web/search/providers/openai-compatible.ts +1 -1
- package/src/web/search/providers/parallel.ts +1 -1
- package/src/web/search/providers/perplexity.ts +2 -2
- package/src/web/search/providers/searxng.ts +1 -1
- package/src/web/search/providers/synthetic.ts +1 -1
- package/src/web/search/providers/tavily.ts +1 -1
- package/src/web/search/providers/utils.ts +67 -17
- package/src/web/search/providers/xai.ts +1 -1
- package/src/web/search/providers/zai.ts +1 -1
- package/src/web/search/render.ts +3 -0
- package/src/workflow/workflow-intent-diff.ts +222 -0
- package/src/workflow/workflow-intent-report-consumer.ts +221 -0
- package/src/workflow/workflow-intent-report-schema.ts +129 -0
- package/src/workflow/workflow-intent-report.ts +135 -0
|
@@ -8,9 +8,16 @@ import { withFileLock } from "../config/file-lock";
|
|
|
8
8
|
import type { Settings } from "../config/settings";
|
|
9
9
|
import type { DaemonRuntimeInfo } from "../daemon/control-types";
|
|
10
10
|
import { resolveSkcRuntimeSpawnInfo } from "../daemon/runtime";
|
|
11
|
-
import { getNotificationConfig,
|
|
11
|
+
import { getNotificationConfig, isTelegramConfigured, tokenFingerprint } from "./config";
|
|
12
12
|
import { parseInThreadConfigCommand } from "./config-commands";
|
|
13
|
-
import {
|
|
13
|
+
import { daemonPaths } from "./daemon-paths";
|
|
14
|
+
import {
|
|
15
|
+
buildCompactChoiceGrid,
|
|
16
|
+
code,
|
|
17
|
+
splitTelegramHtml,
|
|
18
|
+
TELEGRAM_MESSAGE_LIMIT,
|
|
19
|
+
TELEGRAM_PARSE_MODE,
|
|
20
|
+
} from "./html-format";
|
|
14
21
|
import type {
|
|
15
22
|
SessionCloseTarget,
|
|
16
23
|
SessionCreateTarget,
|
|
@@ -20,6 +27,7 @@ import type {
|
|
|
20
27
|
} from "./index";
|
|
21
28
|
import {
|
|
22
29
|
formatLifecycleOutcome,
|
|
30
|
+
isLifecycleCommandLikeText,
|
|
23
31
|
isLifecycleCommandText,
|
|
24
32
|
lifecycleUsage,
|
|
25
33
|
parseLifecycleCommand,
|
|
@@ -41,7 +49,6 @@ import {
|
|
|
41
49
|
buildActionMessage,
|
|
42
50
|
type CallbackRoute,
|
|
43
51
|
createAliasTable,
|
|
44
|
-
type PendingAsk,
|
|
45
52
|
readEndpoint,
|
|
46
53
|
routeInboundUpdate,
|
|
47
54
|
} from "./telegram-reference";
|
|
@@ -49,7 +56,7 @@ import { decideThreadedInbound, type InboundAttachment } from "./threaded-inboun
|
|
|
49
56
|
import { renderThreadedFrame, type ThreadedSend } from "./threaded-render";
|
|
50
57
|
import { TopicRegistry, type TopicRegistryState } from "./topic-registry";
|
|
51
58
|
|
|
52
|
-
export type EnsureDaemonResult = "owner_spawned" | "attached" | "disabled";
|
|
59
|
+
export type EnsureDaemonResult = "owner_spawned" | "attached" | "disabled" | "blocked";
|
|
53
60
|
|
|
54
61
|
export interface DaemonState {
|
|
55
62
|
pid: number;
|
|
@@ -62,16 +69,6 @@ export interface DaemonState {
|
|
|
62
69
|
version: 1;
|
|
63
70
|
stoppedAt?: number;
|
|
64
71
|
}
|
|
65
|
-
|
|
66
|
-
export interface DaemonPaths {
|
|
67
|
-
dir: string;
|
|
68
|
-
lock: string;
|
|
69
|
-
state: string;
|
|
70
|
-
roots: string;
|
|
71
|
-
steal: string;
|
|
72
|
-
aliases: string;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
72
|
export interface TelegramDaemonFs {
|
|
76
73
|
mkdir(path: string, opts?: fs.MakeDirectoryOptions): Promise<void>;
|
|
77
74
|
readFile(path: string, encoding: BufferEncoding): Promise<string>;
|
|
@@ -129,8 +126,27 @@ const TYPING_REFRESH_INTERVAL_MS = 4_000;
|
|
|
129
126
|
// messages: queued on receipt, consumed once a turn picks the message up.
|
|
130
127
|
const QUEUED_REACTION = "👀";
|
|
131
128
|
const PENDING_TOPIC_FRAME_LIMIT = 20;
|
|
129
|
+
const SEEN_UPDATE_ID_LIMIT = 1_000;
|
|
132
130
|
const CONSUMED_REACTION = "✅";
|
|
133
131
|
|
|
132
|
+
function splitTelegramPlainText(text: string, max = TELEGRAM_MESSAGE_LIMIT): string[] {
|
|
133
|
+
if (text.length <= max) return [text];
|
|
134
|
+
const chunks: string[] = [];
|
|
135
|
+
let out = "";
|
|
136
|
+
for (const ch of text) {
|
|
137
|
+
if (out.length + ch.length > max) {
|
|
138
|
+
chunks.push(out);
|
|
139
|
+
out = "";
|
|
140
|
+
}
|
|
141
|
+
out += ch;
|
|
142
|
+
}
|
|
143
|
+
if (out) chunks.push(out);
|
|
144
|
+
return chunks;
|
|
145
|
+
}
|
|
146
|
+
function endpointGenerationKey(url: string, token: string): string {
|
|
147
|
+
return `${url}\0${token}`;
|
|
148
|
+
}
|
|
149
|
+
|
|
134
150
|
/**
|
|
135
151
|
* Whether `err` is a transient network failure worth retrying. Telegram API
|
|
136
152
|
* calls over HTTP/2 occasionally surface mid-stream `ECONNRESET` (and similar)
|
|
@@ -184,17 +200,7 @@ async function fetchWithRetry(
|
|
|
184
200
|
throw lastErr;
|
|
185
201
|
}
|
|
186
202
|
|
|
187
|
-
export
|
|
188
|
-
const dir = path.join(agentDir, "notifications");
|
|
189
|
-
return {
|
|
190
|
-
dir,
|
|
191
|
-
lock: path.join(dir, "telegram-daemon.lock"),
|
|
192
|
-
state: path.join(dir, "telegram-daemon.state.json"),
|
|
193
|
-
roots: path.join(dir, "telegram-daemon.roots.json"),
|
|
194
|
-
steal: path.join(dir, "telegram-daemon.steal"),
|
|
195
|
-
aliases: path.join(dir, "telegram-callback-aliases.json"),
|
|
196
|
-
};
|
|
197
|
-
}
|
|
203
|
+
export { type DaemonPaths, daemonPaths } from "./daemon-paths";
|
|
198
204
|
|
|
199
205
|
/**
|
|
200
206
|
* Attach session-lifecycle control (create/close/resume) to the running daemon.
|
|
@@ -262,7 +268,7 @@ export async function registerNotificationRoot(input: {
|
|
|
262
268
|
const fsImpl = input.fs ?? nodeFs;
|
|
263
269
|
const paths = daemonPaths(input.settings.getAgentDir());
|
|
264
270
|
await ensureDir(fsImpl, paths.dir);
|
|
265
|
-
const root =
|
|
271
|
+
const root = notificationRootForCwd(input.cwd);
|
|
266
272
|
await withFileLock(
|
|
267
273
|
paths.roots,
|
|
268
274
|
async () => {
|
|
@@ -281,6 +287,29 @@ export async function registerNotificationRoot(input: {
|
|
|
281
287
|
return root;
|
|
282
288
|
}
|
|
283
289
|
|
|
290
|
+
function notificationRootForCwd(cwd: string): string {
|
|
291
|
+
return path.join(cwd, ".skc", "state");
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function ownerIdentityMatches(state: DaemonState, tokenFingerprint: string, chatId: string): boolean {
|
|
295
|
+
return state.tokenFingerprint === tokenFingerprint && state.chatId === chatId;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function liveOwnerUsesDifferentIdentity(input: {
|
|
299
|
+
state: DaemonState | undefined;
|
|
300
|
+
tokenFingerprint: string;
|
|
301
|
+
chatId: string;
|
|
302
|
+
pidAlive: (pid: number) => boolean;
|
|
303
|
+
}): boolean {
|
|
304
|
+
const { state } = input;
|
|
305
|
+
return Boolean(
|
|
306
|
+
state &&
|
|
307
|
+
state.version === DAEMON_VERSION &&
|
|
308
|
+
!ownerIdentityMatches(state, input.tokenFingerprint, input.chatId) &&
|
|
309
|
+
input.pidAlive(state.pid),
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
|
|
284
313
|
export function isFreshLiveOwner(input: {
|
|
285
314
|
state: DaemonState | undefined;
|
|
286
315
|
now: number;
|
|
@@ -292,8 +321,7 @@ export function isFreshLiveOwner(input: {
|
|
|
292
321
|
return Boolean(
|
|
293
322
|
state &&
|
|
294
323
|
state.version === DAEMON_VERSION &&
|
|
295
|
-
state.tokenFingerprint
|
|
296
|
-
state.chatId === input.chatId &&
|
|
324
|
+
ownerIdentityMatches(state, input.tokenFingerprint, input.chatId) &&
|
|
297
325
|
input.now - state.heartbeatAt <= HEARTBEAT_TTL_MS &&
|
|
298
326
|
input.pidAlive(state.pid),
|
|
299
327
|
);
|
|
@@ -309,7 +337,13 @@ export async function acquireDaemonOwnership(input: {
|
|
|
309
337
|
pid?: number;
|
|
310
338
|
pidAlive?: (pid: number) => boolean;
|
|
311
339
|
randomId?: () => string;
|
|
312
|
-
}): Promise<{
|
|
340
|
+
}): Promise<{
|
|
341
|
+
acquired: boolean;
|
|
342
|
+
ownerId?: string;
|
|
343
|
+
attached?: boolean;
|
|
344
|
+
blocked?: boolean;
|
|
345
|
+
reason?: "identity_mismatch";
|
|
346
|
+
}> {
|
|
313
347
|
const fsImpl = input.fs ?? nodeFs;
|
|
314
348
|
const now = input.now ?? Date.now;
|
|
315
349
|
const pid = input.pid ?? process.pid;
|
|
@@ -319,6 +353,16 @@ export async function acquireDaemonOwnership(input: {
|
|
|
319
353
|
const ownerId = input.randomId?.() ?? `${pid}-${now().toString(36)}-${Math.random().toString(36).slice(2)}`;
|
|
320
354
|
const roots = input.roots ?? (await readJson<{ roots?: string[] }>(fsImpl, paths.roots))?.roots ?? [];
|
|
321
355
|
const existing = await readJson<DaemonState>(fsImpl, paths.state);
|
|
356
|
+
if (
|
|
357
|
+
liveOwnerUsesDifferentIdentity({
|
|
358
|
+
state: existing,
|
|
359
|
+
tokenFingerprint: input.tokenFingerprint,
|
|
360
|
+
chatId: input.chatId,
|
|
361
|
+
pidAlive,
|
|
362
|
+
})
|
|
363
|
+
) {
|
|
364
|
+
return { acquired: false, blocked: true, reason: "identity_mismatch" };
|
|
365
|
+
}
|
|
322
366
|
if (
|
|
323
367
|
isFreshLiveOwner({
|
|
324
368
|
state: existing,
|
|
@@ -344,6 +388,16 @@ export async function acquireDaemonOwnership(input: {
|
|
|
344
388
|
return { acquired: true, ownerId };
|
|
345
389
|
}
|
|
346
390
|
const afterLock = await readJson<DaemonState>(fsImpl, paths.state);
|
|
391
|
+
if (
|
|
392
|
+
liveOwnerUsesDifferentIdentity({
|
|
393
|
+
state: afterLock,
|
|
394
|
+
tokenFingerprint: input.tokenFingerprint,
|
|
395
|
+
chatId: input.chatId,
|
|
396
|
+
pidAlive,
|
|
397
|
+
})
|
|
398
|
+
) {
|
|
399
|
+
return { acquired: false, blocked: true, reason: "identity_mismatch" };
|
|
400
|
+
}
|
|
347
401
|
if (
|
|
348
402
|
isFreshLiveOwner({
|
|
349
403
|
state: afterLock,
|
|
@@ -370,6 +424,16 @@ export async function acquireDaemonOwnership(input: {
|
|
|
370
424
|
) {
|
|
371
425
|
return { acquired: false, attached: true };
|
|
372
426
|
}
|
|
427
|
+
if (
|
|
428
|
+
liveOwnerUsesDifferentIdentity({
|
|
429
|
+
state: rechecked,
|
|
430
|
+
tokenFingerprint: input.tokenFingerprint,
|
|
431
|
+
chatId: input.chatId,
|
|
432
|
+
pidAlive,
|
|
433
|
+
})
|
|
434
|
+
) {
|
|
435
|
+
return { acquired: false, blocked: true, reason: "identity_mismatch" };
|
|
436
|
+
}
|
|
373
437
|
if (rechecked && pidAlive(rechecked.pid)) {
|
|
374
438
|
return { acquired: false, attached: true };
|
|
375
439
|
}
|
|
@@ -547,7 +611,16 @@ export async function spawnTelegramDaemonOwner(
|
|
|
547
611
|
ownerId: ownership.ownerId ?? "",
|
|
548
612
|
agentDir,
|
|
549
613
|
});
|
|
550
|
-
if (!ownership.acquired)
|
|
614
|
+
if (!ownership.acquired) {
|
|
615
|
+
if (ownership.blocked) {
|
|
616
|
+
return {
|
|
617
|
+
result: "blocked",
|
|
618
|
+
runtime,
|
|
619
|
+
warnings: ["live telegram daemon uses a different bot token or chat; refusing to attach"],
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
return { result: "attached", runtime, warnings: [] };
|
|
623
|
+
}
|
|
551
624
|
const spawnImpl = deps.spawn ?? defaultDaemonSpawn;
|
|
552
625
|
const child = spawnImpl(command, args, {
|
|
553
626
|
detached: true,
|
|
@@ -563,13 +636,18 @@ export async function ensureTelegramDaemonRunning(
|
|
|
563
636
|
deps: TelegramDaemonDeps = {},
|
|
564
637
|
): Promise<EnsureDaemonResult> {
|
|
565
638
|
const cfg = getNotificationConfig(input.settings);
|
|
566
|
-
if (!
|
|
567
|
-
const root =
|
|
639
|
+
if (!isTelegramConfigured(cfg)) return "disabled";
|
|
640
|
+
const root = notificationRootForCwd(input.cwd);
|
|
568
641
|
const fp = tokenFingerprint(cfg.botToken);
|
|
569
642
|
const spawned = await spawnTelegramDaemonOwner(
|
|
570
643
|
{ settings: input.settings, roots: [root], tokenFingerprint: fp, chatId: cfg.chatId },
|
|
571
644
|
deps,
|
|
572
645
|
);
|
|
646
|
+
if (spawned.result === "blocked") {
|
|
647
|
+
logger.warn(`notifications: failed to ensure Telegram daemon: ${spawned.warnings.join("; ")}`);
|
|
648
|
+
return spawned.result;
|
|
649
|
+
}
|
|
650
|
+
await registerNotificationRoot({ ...input, fs: deps.fs });
|
|
573
651
|
return spawned.result;
|
|
574
652
|
}
|
|
575
653
|
|
|
@@ -770,6 +848,7 @@ export interface TelegramDaemonOptions {
|
|
|
770
848
|
interface SessionSocket {
|
|
771
849
|
sessionId: string;
|
|
772
850
|
token: string;
|
|
851
|
+
endpointKey: string;
|
|
773
852
|
ws: WebSocket;
|
|
774
853
|
pending: Map<string, { sessionId: string; actionId: string }>;
|
|
775
854
|
/** True once the server advertised the `client_ping_pong` capability. */
|
|
@@ -790,6 +869,8 @@ interface PendingThreadedFrame {
|
|
|
790
869
|
export class TelegramNotificationDaemon {
|
|
791
870
|
readonly aliasTable: AliasTable;
|
|
792
871
|
readonly messageRoutes = new Map<string | number, CallbackRoute | Omit<CallbackRoute, "answer">>();
|
|
872
|
+
/** Telegram message id backing each streamed `${sessionId}:${coalesceKey}`, for in-place edits. */
|
|
873
|
+
private readonly liveMessages = new Map<string, number>();
|
|
793
874
|
readonly sessions = new Map<string, SessionSocket>();
|
|
794
875
|
private readonly runtime: NotificationOperatorRuntime;
|
|
795
876
|
private readonly sessionRouter: OperatorEventRouter<SessionSocket>;
|
|
@@ -806,12 +887,16 @@ export class TelegramNotificationDaemon {
|
|
|
806
887
|
private readonly topicOwnerByIdentity = new Map<string, string>();
|
|
807
888
|
/** Non-identity frames held until identity creates the correct thread. */
|
|
808
889
|
private readonly pendingThreadedFrames = new Map<string, PendingThreadedFrame[]>();
|
|
890
|
+
/** Endpoint generation tombstones for sessions that already sent session_closed. */
|
|
891
|
+
private readonly closedEndpointKeys = new Map<string, string>();
|
|
809
892
|
/** True once the daemon has nudged the user to enable Threaded Mode. */
|
|
810
893
|
private threadedFallbackNoticeSent = false;
|
|
811
894
|
/** Sessions whose identity header was already sent flat (Threaded Mode off). */
|
|
812
895
|
private readonly flatIdentitySent = new Set<string>();
|
|
813
896
|
/** Cached result of whether the paired chat is a private chat (flat-fallback gate). */
|
|
814
897
|
private pairedChatPrivate: boolean | undefined;
|
|
898
|
+
/** Bot username from getMe, cached once at owner startup for group/forum command targeting. */
|
|
899
|
+
private botUsername: string | undefined;
|
|
815
900
|
/** Sessions whose agent loop is currently busy (drives the typing indicator). */
|
|
816
901
|
private get busy(): Set<string> {
|
|
817
902
|
return this.dispatchState.busy;
|
|
@@ -1070,26 +1155,43 @@ export class TelegramNotificationDaemon {
|
|
|
1070
1155
|
text: string | undefined,
|
|
1071
1156
|
updateId: number | undefined,
|
|
1072
1157
|
threadId: number | undefined,
|
|
1158
|
+
commandCtx: { chatType?: string; botUsername?: string },
|
|
1073
1159
|
): Promise<boolean> {
|
|
1074
|
-
if (!isLifecycleCommandText(text)) return false;
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1160
|
+
if (!isLifecycleCommandText(text, commandCtx)) return false;
|
|
1161
|
+
if (!(await this.pairedChatIsPrivate())) return true;
|
|
1162
|
+
const reply = async (body: string): Promise<void> => {
|
|
1163
|
+
for (const text of splitTelegramPlainText(body)) {
|
|
1164
|
+
await this.botApi
|
|
1165
|
+
.call("sendMessage", {
|
|
1166
|
+
chat_id: this.opts.chatId,
|
|
1167
|
+
...(threadId !== undefined ? { message_thread_id: threadId } : {}),
|
|
1168
|
+
text,
|
|
1169
|
+
})
|
|
1170
|
+
.catch(() => undefined);
|
|
1171
|
+
}
|
|
1172
|
+
};
|
|
1173
|
+
const replyHtml = async (body: string): Promise<void> => {
|
|
1174
|
+
for (const text of splitTelegramHtml(body)) {
|
|
1175
|
+
await this.botApi
|
|
1176
|
+
.call("sendMessage", {
|
|
1177
|
+
chat_id: this.opts.chatId,
|
|
1178
|
+
...(threadId !== undefined ? { message_thread_id: threadId } : {}),
|
|
1179
|
+
text,
|
|
1180
|
+
parse_mode: TELEGRAM_PARSE_MODE,
|
|
1181
|
+
})
|
|
1182
|
+
.catch(() => undefined);
|
|
1183
|
+
}
|
|
1184
|
+
};
|
|
1083
1185
|
|
|
1186
|
+
const parsed = parseLifecycleCommand(text, commandCtx);
|
|
1187
|
+
if (parsed.kind === "none") return false;
|
|
1084
1188
|
if (!this.lifecycleControlActive) {
|
|
1085
1189
|
await reply("Session lifecycle control is not available right now.");
|
|
1086
1190
|
return true;
|
|
1087
1191
|
}
|
|
1088
1192
|
if (updateId !== undefined && this.dispatchState.seenUpdateIds.has(updateId)) return true;
|
|
1089
|
-
if (updateId !== undefined) this.
|
|
1193
|
+
if (updateId !== undefined) await this.rememberSeenUpdateId(updateId);
|
|
1090
1194
|
|
|
1091
|
-
const parsed = parseLifecycleCommand(text);
|
|
1092
|
-
if (parsed.kind === "none") return false;
|
|
1093
1195
|
if (parsed.kind === "usage" || parsed.kind === "reject") {
|
|
1094
1196
|
await reply(parsed.message);
|
|
1095
1197
|
return true;
|
|
@@ -1098,11 +1200,12 @@ export class TelegramNotificationDaemon {
|
|
|
1098
1200
|
const recent = listRecentSessions({
|
|
1099
1201
|
sessionsRoot: path.join(this.opts.settings.getAgentDir(), "sessions"),
|
|
1100
1202
|
limit: 10,
|
|
1203
|
+
includeInternal: false,
|
|
1101
1204
|
});
|
|
1102
|
-
const
|
|
1103
|
-
? recent.map(e =>
|
|
1205
|
+
const body = recent.length
|
|
1206
|
+
? recent.map(e => `• ${code(e.sessionId)}${e.path ? ` (${code(e.path)})` : ""}`).join("\n")
|
|
1104
1207
|
: "No recent sessions.";
|
|
1105
|
-
await
|
|
1208
|
+
await replyHtml(body);
|
|
1106
1209
|
return true;
|
|
1107
1210
|
}
|
|
1108
1211
|
|
|
@@ -1121,6 +1224,17 @@ export class TelegramNotificationDaemon {
|
|
|
1121
1224
|
return true;
|
|
1122
1225
|
}
|
|
1123
1226
|
|
|
1227
|
+
private async refreshBotIdentity(): Promise<void> {
|
|
1228
|
+
try {
|
|
1229
|
+
const response = (await this.botApi.call("getMe", {})) as { result?: { username?: unknown } };
|
|
1230
|
+
const username = response.result?.username;
|
|
1231
|
+
this.botUsername =
|
|
1232
|
+
typeof username === "string" && username.trim() ? username.trim().replace(/^@/, "") : undefined;
|
|
1233
|
+
} catch {
|
|
1234
|
+
this.botUsername = undefined;
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1124
1238
|
/** Map a lifecycle response/error to a user-facing message (G010 surfacing). */
|
|
1125
1239
|
private formatLifecycleResponse(r: SessionLifecycleResponse): string {
|
|
1126
1240
|
return formatLifecycleOutcome(r);
|
|
@@ -1205,7 +1319,9 @@ export class TelegramNotificationDaemon {
|
|
|
1205
1319
|
matches: msg => msg.type === "session_closed",
|
|
1206
1320
|
handle: async session => {
|
|
1207
1321
|
this.busy.delete(session.sessionId);
|
|
1322
|
+
this.closedEndpointKeys.set(session.sessionId, session.endpointKey);
|
|
1208
1323
|
await this.deleteTopic(session.sessionId);
|
|
1324
|
+
this.dropSession(session, "session_closed");
|
|
1209
1325
|
},
|
|
1210
1326
|
});
|
|
1211
1327
|
}
|
|
@@ -1221,6 +1337,51 @@ export class TelegramNotificationDaemon {
|
|
|
1221
1337
|
await writeJsonAtomic(this.fsImpl, paths.aliases, this.aliasTable.serialize());
|
|
1222
1338
|
}
|
|
1223
1339
|
|
|
1340
|
+
async loadSeenUpdateIds(): Promise<void> {
|
|
1341
|
+
const raw = await readJson<{ updateIds?: unknown }>(
|
|
1342
|
+
this.fsImpl,
|
|
1343
|
+
daemonPaths(this.opts.settings.getAgentDir()).seenUpdates,
|
|
1344
|
+
);
|
|
1345
|
+
this.dispatchState.seenUpdateIds.clear();
|
|
1346
|
+
const updateIds = Array.isArray(raw?.updateIds) ? raw.updateIds : [];
|
|
1347
|
+
for (const updateId of updateIds) {
|
|
1348
|
+
if (Number.isSafeInteger(updateId) && Number(updateId) >= 0) {
|
|
1349
|
+
this.dispatchState.seenUpdateIds.add(Number(updateId));
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
this.pruneSeenUpdateIds();
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
async persistSeenUpdateIds(): Promise<void> {
|
|
1356
|
+
const paths = daemonPaths(this.opts.settings.getAgentDir());
|
|
1357
|
+
await ensureDir(this.fsImpl, paths.dir);
|
|
1358
|
+
await writeJsonAtomic(this.fsImpl, paths.seenUpdates, {
|
|
1359
|
+
version: 1,
|
|
1360
|
+
updateIds: [...this.dispatchState.seenUpdateIds].slice(-SEEN_UPDATE_ID_LIMIT),
|
|
1361
|
+
});
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
private pruneSeenUpdateIds(): void {
|
|
1365
|
+
let extra = this.dispatchState.seenUpdateIds.size - SEEN_UPDATE_ID_LIMIT;
|
|
1366
|
+
if (extra <= 0) return;
|
|
1367
|
+
for (const updateId of this.dispatchState.seenUpdateIds) {
|
|
1368
|
+
this.dispatchState.seenUpdateIds.delete(updateId);
|
|
1369
|
+
extra -= 1;
|
|
1370
|
+
if (extra <= 0) break;
|
|
1371
|
+
}
|
|
1372
|
+
}
|
|
1373
|
+
|
|
1374
|
+
private async rememberSeenUpdateId(updateId: number): Promise<void> {
|
|
1375
|
+
if (!Number.isSafeInteger(updateId) || updateId < 0) return;
|
|
1376
|
+
this.dispatchState.seenUpdateIds.add(updateId);
|
|
1377
|
+
this.pruneSeenUpdateIds();
|
|
1378
|
+
try {
|
|
1379
|
+
await this.persistSeenUpdateIds();
|
|
1380
|
+
} catch (err) {
|
|
1381
|
+
logger.warn(`notifications: failed to persist Telegram update id ${updateId}: ${String(err)}`);
|
|
1382
|
+
}
|
|
1383
|
+
}
|
|
1384
|
+
|
|
1224
1385
|
async scanRoots(): Promise<void> {
|
|
1225
1386
|
const paths = daemonPaths(this.opts.settings.getAgentDir());
|
|
1226
1387
|
const rootState = await readJson<{ roots?: string[] }>(this.fsImpl, paths.roots);
|
|
@@ -1242,6 +1403,9 @@ export class TelegramNotificationDaemon {
|
|
|
1242
1403
|
// would chase a dead, token-bearing record forever.
|
|
1243
1404
|
const pidAlive = this.opts.pidAlive ?? defaultPidAlive;
|
|
1244
1405
|
if (endpoint.stale || (endpoint.pid !== undefined && !pidAlive(endpoint.pid))) continue;
|
|
1406
|
+
const endpointKey = endpointGenerationKey(endpoint.url, endpoint.token);
|
|
1407
|
+
if (this.closedEndpointKeys.get(sessionId) === endpointKey) continue;
|
|
1408
|
+
this.closedEndpointKeys.delete(sessionId);
|
|
1245
1409
|
this.connectSession(sessionId, endpoint.url, endpoint.token);
|
|
1246
1410
|
} catch {}
|
|
1247
1411
|
}
|
|
@@ -1251,9 +1415,12 @@ export class TelegramNotificationDaemon {
|
|
|
1251
1415
|
connectSession(sessionId: string, url: string, token: string): void {
|
|
1252
1416
|
const WS = this.opts.WebSocketImpl ?? WebSocket;
|
|
1253
1417
|
const ws = new WS(`${url}/?token=${encodeURIComponent(token)}`);
|
|
1418
|
+
const endpointKey = endpointGenerationKey(url, token);
|
|
1419
|
+
this.closedEndpointKeys.delete(sessionId);
|
|
1254
1420
|
const session: SessionSocket = {
|
|
1255
1421
|
sessionId,
|
|
1256
1422
|
token,
|
|
1423
|
+
endpointKey,
|
|
1257
1424
|
ws,
|
|
1258
1425
|
pending: new Map(),
|
|
1259
1426
|
capable: false,
|
|
@@ -1334,13 +1501,17 @@ export class TelegramNotificationDaemon {
|
|
|
1334
1501
|
* (so a delayed old close cannot delete a replacement), and best-effort closes
|
|
1335
1502
|
* the socket. `scanRoots()` then reconnects the session.
|
|
1336
1503
|
*/
|
|
1337
|
-
private dropSession(session: SessionSocket,
|
|
1504
|
+
private dropSession(session: SessionSocket, reason: string): void {
|
|
1338
1505
|
const clearIntervalImpl = this.opts.clearIntervalImpl ?? clearInterval;
|
|
1339
1506
|
if (session.pingTimer) {
|
|
1340
1507
|
clearIntervalImpl(session.pingTimer);
|
|
1341
1508
|
session.pingTimer = undefined;
|
|
1342
1509
|
}
|
|
1343
|
-
|
|
1510
|
+
const isCurrentSession = this.sessions.get(session.sessionId) === session;
|
|
1511
|
+
if (isCurrentSession || reason === "session_closed") {
|
|
1512
|
+
this.deleteMessageRoutes(session.sessionId);
|
|
1513
|
+
}
|
|
1514
|
+
if (isCurrentSession) {
|
|
1344
1515
|
this.sessions.delete(session.sessionId);
|
|
1345
1516
|
}
|
|
1346
1517
|
if (session.ws.readyState !== WebSocket.CLOSED) {
|
|
@@ -1350,6 +1521,14 @@ export class TelegramNotificationDaemon {
|
|
|
1350
1521
|
}
|
|
1351
1522
|
}
|
|
1352
1523
|
|
|
1524
|
+
private deleteMessageRoutes(sessionId: string, actionId?: string): void {
|
|
1525
|
+
for (const [messageId, route] of this.messageRoutes.entries()) {
|
|
1526
|
+
if (route.sessionId === sessionId && (actionId === undefined || route.actionId === actionId)) {
|
|
1527
|
+
this.messageRoutes.delete(messageId);
|
|
1528
|
+
}
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1353
1532
|
private static readonly THREADED_FRAMES = new Set([
|
|
1354
1533
|
"identity_header",
|
|
1355
1534
|
"context_update",
|
|
@@ -1402,6 +1581,13 @@ export class TelegramNotificationDaemon {
|
|
|
1402
1581
|
return undefined;
|
|
1403
1582
|
}
|
|
1404
1583
|
|
|
1584
|
+
private sessionCanClaimIdentity(session: SessionSocket, msg: { repo?: unknown; branch?: unknown }): boolean {
|
|
1585
|
+
const current = this.sessions.get(session.sessionId);
|
|
1586
|
+
if (current) return current === session;
|
|
1587
|
+
const ownerId = this.topicOwnerForIdentity(msg);
|
|
1588
|
+
return !ownerId || ownerId === session.sessionId;
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1405
1591
|
private async submitThreadedFrame(sessionId: string, send: ThreadedSend, topicId: string): Promise<void> {
|
|
1406
1592
|
this.pool.submit({
|
|
1407
1593
|
sessionId,
|
|
@@ -1412,6 +1598,11 @@ export class TelegramNotificationDaemon {
|
|
|
1412
1598
|
await this.flushPool();
|
|
1413
1599
|
}
|
|
1414
1600
|
|
|
1601
|
+
private async existingTopicForPrivateChat(sessionId: string): Promise<string | undefined> {
|
|
1602
|
+
if (!(await this.pairedChatIsPrivate())) return undefined;
|
|
1603
|
+
return this.topics.get(sessionId)?.topicId;
|
|
1604
|
+
}
|
|
1605
|
+
|
|
1415
1606
|
private rememberPendingThreadedFrame(sessionId: string, send: ThreadedSend, msg: Record<string, unknown>): void {
|
|
1416
1607
|
const frames = this.pendingThreadedFrames.get(sessionId) ?? [];
|
|
1417
1608
|
frames.push({ send, msg });
|
|
@@ -1433,6 +1624,7 @@ export class TelegramNotificationDaemon {
|
|
|
1433
1624
|
* one-time nudge) or drop fail-closed for a non-private chat.
|
|
1434
1625
|
*/
|
|
1435
1626
|
private async ensureTopic(sessionId: string, name: string): Promise<string | undefined> {
|
|
1627
|
+
if (!(await this.pairedChatIsPrivate())) return undefined;
|
|
1436
1628
|
const existing = this.topics.get(sessionId);
|
|
1437
1629
|
if (existing) return existing.topicId;
|
|
1438
1630
|
try {
|
|
@@ -1476,6 +1668,9 @@ export class TelegramNotificationDaemon {
|
|
|
1476
1668
|
})) as { ok?: boolean };
|
|
1477
1669
|
if (res?.ok === false) return;
|
|
1478
1670
|
this.topics.delete(sessionId);
|
|
1671
|
+
for (const k of [...this.liveMessages.keys()]) {
|
|
1672
|
+
if (k.startsWith(`${sessionId}:`)) this.liveMessages.delete(k);
|
|
1673
|
+
}
|
|
1479
1674
|
this.topicOwnerByIdentity.forEach((ownerSessionId, identityKey) => {
|
|
1480
1675
|
if (ownerSessionId === sessionId) this.topicOwnerByIdentity.delete(identityKey);
|
|
1481
1676
|
});
|
|
@@ -1605,10 +1800,25 @@ export class TelegramNotificationDaemon {
|
|
|
1605
1800
|
|
|
1606
1801
|
/** Drain the shared rate-limit pool and deliver each granted send to its topic. */
|
|
1607
1802
|
private async flushPool(): Promise<void> {
|
|
1608
|
-
|
|
1803
|
+
const batch = this.pool.drain();
|
|
1804
|
+
// Within a batch a finalized frame supersedes any still-queued live frame for
|
|
1805
|
+
// the same streamed message (finalized outranks live), so drop the stale live
|
|
1806
|
+
// edit — otherwise the authoritative final text could be overwritten by an
|
|
1807
|
+
// older partial delivered right after it.
|
|
1808
|
+
const finalizedKeys = new Set<string>();
|
|
1809
|
+
for (const item of batch) {
|
|
1810
|
+
if (item.lane === "finalized" && item.coalesceKey !== undefined) {
|
|
1811
|
+
finalizedKeys.add(`${item.sessionId}:${item.coalesceKey}`);
|
|
1812
|
+
}
|
|
1813
|
+
}
|
|
1814
|
+
for (const item of batch) {
|
|
1609
1815
|
const { send, topicId } = item.payload;
|
|
1816
|
+
if (topicId && !(await this.pairedChatIsPrivate())) continue;
|
|
1610
1817
|
// Threaded topic when available; otherwise deliver flat to the paired chat.
|
|
1611
1818
|
const threadField = topicId ? { message_thread_id: Number(topicId) } : {};
|
|
1819
|
+
const ckey = send.editable ? item.coalesceKey : undefined;
|
|
1820
|
+
const editKey = ckey !== undefined ? `${item.sessionId}:${ckey}` : undefined;
|
|
1821
|
+
if (item.lane === "live" && editKey && finalizedKeys.has(editKey)) continue;
|
|
1612
1822
|
try {
|
|
1613
1823
|
if (send.method === "sendPhoto" && send.photoBase64) {
|
|
1614
1824
|
// Real photo upload (the default botApi multiparts base64 -> file).
|
|
@@ -1631,19 +1841,79 @@ export class TelegramNotificationDaemon {
|
|
|
1631
1841
|
parse_mode: TELEGRAM_PARSE_MODE,
|
|
1632
1842
|
});
|
|
1633
1843
|
} else if (send.text) {
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1844
|
+
const chunks = splitTelegramHtml(send.text);
|
|
1845
|
+
const existingId = editKey ? this.liveMessages.get(editKey) : undefined;
|
|
1846
|
+
if (editKey && existingId !== undefined && chunks.length === 1) {
|
|
1847
|
+
// In-place edit of the streamed message. An unchanged edit is
|
|
1848
|
+
// rejected by Telegram ("message is not modified") and swallowed.
|
|
1849
|
+
await this.botApi.call("editMessageText", {
|
|
1850
|
+
chat_id: this.opts.chatId,
|
|
1851
|
+
message_id: existingId,
|
|
1852
|
+
text: chunks[0],
|
|
1853
|
+
parse_mode: TELEGRAM_PARSE_MODE,
|
|
1854
|
+
});
|
|
1855
|
+
} else {
|
|
1856
|
+
// A single granted slot MUST map to a single Telegram send. When the
|
|
1857
|
+
// rendered text splits into multiple chunks (e.g. a long finalized
|
|
1858
|
+
// turn raised via SKC_NOTIFICATIONS_TURN_MAX), deliver the first
|
|
1859
|
+
// chunk on this token and re-submit the remaining chunks as their
|
|
1860
|
+
// own pool items so each consumes a token on a later drain.
|
|
1861
|
+
// Otherwise one frame would fan out into many sends against a single
|
|
1862
|
+
// slot, bypassing the per-chat rate-limit / fairness invariant.
|
|
1863
|
+
const res = (await this.botApi.call("sendMessage", {
|
|
1864
|
+
chat_id: this.opts.chatId,
|
|
1865
|
+
...threadField,
|
|
1866
|
+
text: chunks[0]!,
|
|
1867
|
+
parse_mode: TELEGRAM_PARSE_MODE,
|
|
1868
|
+
})) as { result?: { message_id?: number } };
|
|
1869
|
+
for (let i = 1; i < chunks.length; i++) {
|
|
1870
|
+
// Continuation chunks are fresh, non-editable text sends: no
|
|
1871
|
+
// coalesce key (they neither replace nor are replaced by other
|
|
1872
|
+
// frames) and no media payload.
|
|
1873
|
+
this.pool.submit({
|
|
1874
|
+
sessionId: item.sessionId,
|
|
1875
|
+
lane: item.lane,
|
|
1876
|
+
payload: {
|
|
1877
|
+
send: {
|
|
1878
|
+
...send,
|
|
1879
|
+
method: "sendMessage",
|
|
1880
|
+
text: chunks[i]!,
|
|
1881
|
+
editable: false,
|
|
1882
|
+
coalesceKey: undefined,
|
|
1883
|
+
photoBase64: undefined,
|
|
1884
|
+
documentBase64: undefined,
|
|
1885
|
+
},
|
|
1886
|
+
topicId,
|
|
1887
|
+
},
|
|
1888
|
+
});
|
|
1889
|
+
}
|
|
1890
|
+
const firstMessageId = res?.result?.message_id;
|
|
1891
|
+
if (editKey && ckey !== undefined && firstMessageId !== undefined) {
|
|
1892
|
+
this.recordLiveMessage(item.sessionId, ckey, firstMessageId);
|
|
1893
|
+
}
|
|
1894
|
+
}
|
|
1640
1895
|
}
|
|
1641
1896
|
} catch {
|
|
1642
|
-
// Best-effort: a failed send must never stop the daemon.
|
|
1897
|
+
// Best-effort: a failed send/edit must never stop the daemon.
|
|
1643
1898
|
}
|
|
1644
1899
|
}
|
|
1645
1900
|
}
|
|
1646
1901
|
|
|
1902
|
+
/**
|
|
1903
|
+
* Track the Telegram message id backing a streamed `(sessionId, coalesceKey)`
|
|
1904
|
+
* so later live/finalized frames edit it in place. Evicts this session's stale
|
|
1905
|
+
* same-category entries (e.g. prior turns) so the map stays bounded.
|
|
1906
|
+
*/
|
|
1907
|
+
private recordLiveMessage(sessionId: string, coalesceKey: string, messageId: number): void {
|
|
1908
|
+
const mapKey = `${sessionId}:${coalesceKey}`;
|
|
1909
|
+
const category = coalesceKey.split(":")[0] ?? "";
|
|
1910
|
+
const prefix = `${sessionId}:${category}:`;
|
|
1911
|
+
for (const k of [...this.liveMessages.keys()]) {
|
|
1912
|
+
if (k !== mapKey && k.startsWith(prefix)) this.liveMessages.delete(k);
|
|
1913
|
+
}
|
|
1914
|
+
this.liveMessages.set(mapKey, messageId);
|
|
1915
|
+
}
|
|
1916
|
+
|
|
1647
1917
|
/**
|
|
1648
1918
|
* Threaded Mode is unavailable (the bot owner has not enabled forum topics in
|
|
1649
1919
|
* @BotFather, so `createForumTopic` fails). Deliver the rendered frame flat to
|
|
@@ -1663,9 +1933,10 @@ export class TelegramNotificationDaemon {
|
|
|
1663
1933
|
}
|
|
1664
1934
|
|
|
1665
1935
|
/**
|
|
1666
|
-
* Resolve
|
|
1667
|
-
*
|
|
1668
|
-
*
|
|
1936
|
+
* Resolve (and cache successful resolution of) whether the paired `chatId` is a
|
|
1937
|
+
* private chat. Topic and flat delivery are only safe in a private DM; any
|
|
1938
|
+
* non-private chat fails closed, while a transient `getChat` failure fails closed
|
|
1939
|
+
* for the current attempt and is retried later.
|
|
1669
1940
|
*/
|
|
1670
1941
|
private async pairedChatIsPrivate(): Promise<boolean> {
|
|
1671
1942
|
if (this.pairedChatPrivate !== undefined) return this.pairedChatPrivate;
|
|
@@ -1674,15 +1945,16 @@ export class TelegramNotificationDaemon {
|
|
|
1674
1945
|
result?: { type?: string };
|
|
1675
1946
|
};
|
|
1676
1947
|
this.pairedChatPrivate = res.result?.type === "private";
|
|
1677
|
-
|
|
1678
|
-
|
|
1948
|
+
return this.pairedChatPrivate;
|
|
1949
|
+
} catch (e) {
|
|
1950
|
+
logger.warn(`notifications: getChat failed while checking Telegram chat privacy: ${String(e)}`);
|
|
1951
|
+
return false;
|
|
1679
1952
|
}
|
|
1680
|
-
return this.pairedChatPrivate;
|
|
1681
1953
|
}
|
|
1682
1954
|
|
|
1683
1955
|
/** Tell the user once (per daemon run) how to enable Threaded Mode. */
|
|
1684
1956
|
private async notifyThreadedFallback(): Promise<void> {
|
|
1685
|
-
if (this.threadedFallbackNoticeSent) return;
|
|
1957
|
+
if (this.threadedFallbackNoticeSent || !(await this.pairedChatIsPrivate())) return;
|
|
1686
1958
|
this.threadedFallbackNoticeSent = true;
|
|
1687
1959
|
try {
|
|
1688
1960
|
await this.botApi.call("sendMessage", {
|
|
@@ -1727,7 +1999,7 @@ export class TelegramNotificationDaemon {
|
|
|
1727
1999
|
/** Send a single `typing` chat action into a busy session's topic (best-effort). */
|
|
1728
2000
|
private async sendTyping(sessionId: string): Promise<void> {
|
|
1729
2001
|
const topicId = this.topics.get(sessionId)?.topicId;
|
|
1730
|
-
if (!topicId) return;
|
|
2002
|
+
if (!topicId || !(await this.pairedChatIsPrivate())) return;
|
|
1731
2003
|
try {
|
|
1732
2004
|
await this.botApi.call("sendChatAction", {
|
|
1733
2005
|
chat_id: this.opts.chatId,
|
|
@@ -1741,6 +2013,7 @@ export class TelegramNotificationDaemon {
|
|
|
1741
2013
|
|
|
1742
2014
|
/** Set a native reaction on an inbound thread message (best-effort). */
|
|
1743
2015
|
private async setReaction(messageId: number, emoji: string): Promise<void> {
|
|
2016
|
+
if (!(await this.pairedChatIsPrivate())) return;
|
|
1744
2017
|
try {
|
|
1745
2018
|
await this.botApi.call("setMessageReaction", {
|
|
1746
2019
|
chat_id: this.opts.chatId,
|
|
@@ -1768,12 +2041,12 @@ export class TelegramNotificationDaemon {
|
|
|
1768
2041
|
if (typeof msg?.type === "string" && TelegramNotificationDaemon.THREADED_FRAMES.has(msg.type)) {
|
|
1769
2042
|
const send = renderThreadedFrame(msg);
|
|
1770
2043
|
if (!send) return;
|
|
1771
|
-
const existingTopic = this.
|
|
2044
|
+
const existingTopic = await this.existingTopicForPrivateChat(session.sessionId);
|
|
1772
2045
|
if (!send.identity && !existingTopic && !this.flatIdentitySent.has(session.sessionId)) {
|
|
1773
2046
|
this.rememberPendingThreadedFrame(session.sessionId, send, msg as Record<string, unknown>);
|
|
1774
2047
|
return;
|
|
1775
2048
|
}
|
|
1776
|
-
if (send.identity) {
|
|
2049
|
+
if (send.identity && !this.sessionCanClaimIdentity(session, msg)) {
|
|
1777
2050
|
const ownerId = this.topicOwnerForIdentity(msg);
|
|
1778
2051
|
const ownerTopic = ownerId ? this.topics.get(ownerId) : undefined;
|
|
1779
2052
|
if (ownerId && ownerId !== session.sessionId && ownerTopic) {
|
|
@@ -1839,19 +2112,24 @@ export class TelegramNotificationDaemon {
|
|
|
1839
2112
|
const inline_keyboard = buildCompactChoiceGrid(options, (i: number) =>
|
|
1840
2113
|
this.aliasTable.put({ sessionId: session.sessionId, actionId: msg.id, answer: i }),
|
|
1841
2114
|
);
|
|
1842
|
-
const
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
2115
|
+
const chunks = splitTelegramHtml(rendered.text);
|
|
2116
|
+
let result: { result?: { message_id?: number } } = {};
|
|
2117
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
2118
|
+
result = (await this.botApi.call("sendMessage", {
|
|
2119
|
+
chat_id: this.opts.chatId,
|
|
2120
|
+
...threadField,
|
|
2121
|
+
text: chunks[i]!,
|
|
2122
|
+
parse_mode: TELEGRAM_PARSE_MODE,
|
|
2123
|
+
...(i === chunks.length - 1 && inline_keyboard.length ? { reply_markup: { inline_keyboard } } : {}),
|
|
2124
|
+
})) as { result?: { message_id?: number } };
|
|
2125
|
+
}
|
|
1849
2126
|
const messageId = result.result?.message_id;
|
|
1850
2127
|
if (messageId !== undefined)
|
|
1851
2128
|
this.messageRoutes.set(String(messageId), { sessionId: session.sessionId, actionId: msg.id });
|
|
1852
2129
|
await this.persistAliases();
|
|
1853
2130
|
} else if (msg.type === "action_resolved" && msg.id) {
|
|
1854
2131
|
session.pending.delete(msg.id);
|
|
2132
|
+
this.deleteMessageRoutes(session.sessionId, msg.id);
|
|
1855
2133
|
for (const [alias, route] of this.aliasTable.entries()) {
|
|
1856
2134
|
if (route.sessionId === session.sessionId && route.actionId === msg.id) this.aliasTable.delete(alias);
|
|
1857
2135
|
}
|
|
@@ -1859,19 +2137,22 @@ export class TelegramNotificationDaemon {
|
|
|
1859
2137
|
}
|
|
1860
2138
|
}
|
|
1861
2139
|
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
2140
|
+
private async answerCallbackQueryBestEffort(callbackId: unknown, text?: string): Promise<void> {
|
|
2141
|
+
if (typeof callbackId !== "string") return;
|
|
2142
|
+
try {
|
|
2143
|
+
await this.botApi.call("answerCallbackQuery", {
|
|
2144
|
+
callback_query_id: callbackId,
|
|
2145
|
+
...(text === undefined ? {} : { text }),
|
|
2146
|
+
});
|
|
2147
|
+
} catch {
|
|
2148
|
+
// Telegram callback acknowledgements only dismiss the client-side spinner;
|
|
2149
|
+
// they must never block the already-validated local reply path.
|
|
1867
2150
|
}
|
|
1868
|
-
|
|
1869
|
-
};
|
|
2151
|
+
}
|
|
1870
2152
|
|
|
1871
2153
|
private async sendStaleGuidance(callbackId: unknown): Promise<void> {
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
}
|
|
2154
|
+
await this.answerCallbackQueryBestEffort(callbackId, "Button is stale");
|
|
2155
|
+
if (!(await this.pairedChatIsPrivate())) return;
|
|
1875
2156
|
await this.botApi.call("sendMessage", {
|
|
1876
2157
|
chat_id: this.opts.chatId,
|
|
1877
2158
|
text: "This button is stale after notification daemon restart. Please answer locally in the SKC session or wait for a fresh notification.",
|
|
@@ -1886,12 +2167,18 @@ export class TelegramNotificationDaemon {
|
|
|
1886
2167
|
// session input.
|
|
1887
2168
|
{
|
|
1888
2169
|
const m = (update as { update_id?: number; message?: Record<string, unknown> }).message;
|
|
1889
|
-
const
|
|
2170
|
+
const chat = m?.chat as { id?: unknown; type?: unknown } | undefined;
|
|
2171
|
+
const chatId = chat?.id;
|
|
2172
|
+
const chatType = typeof chat?.type === "string" ? chat.type : undefined;
|
|
1890
2173
|
const cmdText = typeof m?.text === "string" ? m.text : undefined;
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
if (
|
|
2174
|
+
const commandCtx = { chatType, botUsername: this.botUsername };
|
|
2175
|
+
if (m !== undefined && String(chatId) === String(this.opts.chatId)) {
|
|
2176
|
+
if (chatType !== undefined && chatType !== "private" && isLifecycleCommandLikeText(cmdText)) return;
|
|
2177
|
+
if (isLifecycleCommandText(cmdText, commandCtx)) {
|
|
2178
|
+
const updateId = (update as { update_id?: number }).update_id;
|
|
2179
|
+
const threadId = typeof m.message_thread_id === "number" ? (m.message_thread_id as number) : undefined;
|
|
2180
|
+
if (await this.handleLifecycleCommand(cmdText, updateId, threadId, commandCtx)) return;
|
|
2181
|
+
}
|
|
1895
2182
|
}
|
|
1896
2183
|
}
|
|
1897
2184
|
// Threaded injection: a free-text message in a known topic (not a button
|
|
@@ -1916,7 +2203,6 @@ export class TelegramNotificationDaemon {
|
|
|
1916
2203
|
});
|
|
1917
2204
|
if (inbound.kind === "duplicate") return;
|
|
1918
2205
|
if (inbound.kind === "inject") {
|
|
1919
|
-
this.dispatchState.seenUpdateIds.add(inbound.updateId);
|
|
1920
2206
|
const session = this.sessions.get(inbound.sessionId);
|
|
1921
2207
|
if (session?.ws.readyState === WebSocket.OPEN) {
|
|
1922
2208
|
const attachmentResult = inbound.attachment
|
|
@@ -1941,6 +2227,7 @@ export class TelegramNotificationDaemon {
|
|
|
1941
2227
|
token: session.token,
|
|
1942
2228
|
}),
|
|
1943
2229
|
);
|
|
2230
|
+
await this.rememberSeenUpdateId(inbound.updateId);
|
|
1944
2231
|
if (inbound.messageId !== undefined) await this.setReaction(inbound.messageId, QUEUED_REACTION);
|
|
1945
2232
|
return;
|
|
1946
2233
|
}
|
|
@@ -1959,6 +2246,7 @@ export class TelegramNotificationDaemon {
|
|
|
1959
2246
|
},
|
|
1960
2247
|
),
|
|
1961
2248
|
);
|
|
2249
|
+
await this.rememberSeenUpdateId(inbound.updateId);
|
|
1962
2250
|
// User turns get a native delivery double-check: queued on receipt,
|
|
1963
2251
|
// flipped to consumed when the session acks the turn that picks it
|
|
1964
2252
|
// up. Config commands are not user turns and get no reaction.
|
|
@@ -1974,7 +2262,6 @@ export class TelegramNotificationDaemon {
|
|
|
1974
2262
|
const decision = routeInboundUpdate(update, {
|
|
1975
2263
|
aliasTable: this.aliasTable,
|
|
1976
2264
|
messageRoutes: this.messageRoutes,
|
|
1977
|
-
pendingBySession: this.pendingBySession,
|
|
1978
2265
|
pairedChatId: this.opts.chatId,
|
|
1979
2266
|
});
|
|
1980
2267
|
if (decision.kind === "reply") {
|
|
@@ -1983,11 +2270,10 @@ export class TelegramNotificationDaemon {
|
|
|
1983
2270
|
await this.sendStaleGuidance(callbackId);
|
|
1984
2271
|
return;
|
|
1985
2272
|
}
|
|
1986
|
-
if (typeof callbackId === "string")
|
|
1987
|
-
await this.botApi.call("answerCallbackQuery", { callback_query_id: callbackId });
|
|
1988
2273
|
session.ws.send(
|
|
1989
2274
|
JSON.stringify({ type: "reply", id: decision.actionId, answer: decision.answer, token: session.token }),
|
|
1990
2275
|
);
|
|
2276
|
+
await this.answerCallbackQueryBestEffort(callbackId);
|
|
1991
2277
|
} else if (decision.kind === "stale") {
|
|
1992
2278
|
await this.sendStaleGuidance(callbackId);
|
|
1993
2279
|
}
|
|
@@ -2030,9 +2316,11 @@ export class TelegramNotificationDaemon {
|
|
|
2030
2316
|
this.startScanTimer();
|
|
2031
2317
|
this.startTypingTimer();
|
|
2032
2318
|
try {
|
|
2319
|
+
await this.refreshBotIdentity();
|
|
2033
2320
|
await this.registerBotCommands();
|
|
2034
2321
|
await this.loadAliases();
|
|
2035
2322
|
await this.loadTopics();
|
|
2323
|
+
await this.loadSeenUpdateIds();
|
|
2036
2324
|
await this.runScan();
|
|
2037
2325
|
// Owner-only: start the session-lifecycle control server now that
|
|
2038
2326
|
// ownership is confirmed (singleton-safe). Best-effort; degrades.
|
|
@@ -2093,6 +2381,7 @@ export class TelegramNotificationDaemon {
|
|
|
2093
2381
|
// (e.g. after reload) reloads aliases/topics seamlessly.
|
|
2094
2382
|
await this.persistAliases().catch(() => undefined);
|
|
2095
2383
|
await this.persistTopics().catch(() => undefined);
|
|
2384
|
+
await this.persistSeenUpdateIds().catch(() => undefined);
|
|
2096
2385
|
await this.opts.control?.clear?.(this.opts.ownerId).catch(() => undefined);
|
|
2097
2386
|
await releaseDaemonOwnership({
|
|
2098
2387
|
settings: this.opts.settings,
|