@ashx-j/lunr 0.1.0 → 0.1.2
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/dist/builtin-extensions/ashxj-spinners.d.ts +1 -1
- package/dist/builtin-extensions/ashxj-spinners.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-spinners.js.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.d.ts +5 -5
- package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js +3 -3
- package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.d.ts +2 -2
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +2 -2
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-cron.js.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/index.d.ts +1 -1
- package/dist/builtin-extensions/lunr-local-providers/index.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.d.ts +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.js +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.js.map +1 -1
- package/dist/builtin-extensions/lunr-skill-creator/index.d.ts +1 -1
- package/dist/builtin-extensions/lunr-skill-creator/index.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-skill-creator/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-todos.d.ts +1 -1
- package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-todos.js +1 -1
- package/dist/builtin-extensions/lunr-todos.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts +2 -2
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.js +2 -2
- package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/compose.d.ts +2 -2
- package/dist/builtin-extensions/pi-intercom/ui/compose.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/compose.js +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/compose.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/inline-message.d.ts +2 -2
- package/dist/builtin-extensions/pi-intercom/ui/inline-message.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/inline-message.js +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/inline-message.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/session-list.d.ts +2 -2
- package/dist/builtin-extensions/pi-intercom/ui/session-list.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/session-list.js +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/session-list.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-search.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-search.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-search.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/elicitation-handler.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/elicitation-handler.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/elicitation-handler.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-panel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-panel.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-panel.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-setup-panel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-setup-panel.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-setup-panel.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/panel-keys.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/panel-keys.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/panel-keys.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.d.ts +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.d.ts +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/types.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/types.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/utils.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/utils.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.generated.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.generated.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.generated.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/thinking-levels.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/thinking-levels.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/thinking-levels.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/loop-utils.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/loop-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/loop-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/model-selection.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/model-selection.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/model-selection.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/notifications.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/notifications.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/notifications.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-execution.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.d.ts +3 -3
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/rpc.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/rpc.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/rpc.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/steering-notices.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/steering-notices.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/steering-notices.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/async-steering-action.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/async-steering-action.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/async-steering-action.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/single-output.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/single-output.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/single-output.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-transcript.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-transcript.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-transcript.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-bridge.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-bridge.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-bridge.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-live-state.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-live-state.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-live-state.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/model-selection.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/model-selection.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/model-selection.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-child.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-child.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-child.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/render.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/render.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.js.map +1 -1
- package/dist/builtin-extensions/pi-tps.d.ts +1 -1
- package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-tps.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/gemini-search.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.js +2 -2
- package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/openai-search.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/openai-search.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/openai-search.js +1 -1
- package/dist/builtin-extensions/pi-web-access/openai-search.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/summary-review.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/summary-review.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/summary-review.js +1 -1
- package/dist/builtin-extensions/pi-web-access/summary-review.js.map +1 -1
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +1 -1
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/register-bedrock.d.ts.map +1 -1
- package/dist/bun/register-bedrock.js +2 -2
- package/dist/bun/register-bedrock.js.map +1 -1
- package/dist/catalog/models.json +1 -1
- package/dist/catalog/providers/opencode-go.json +1 -1
- package/dist/catalog/providers/openrouter.json +1 -1
- package/dist/catalog/providers/qwen-token-plan-cn.json +1 -1
- package/dist/catalog/providers/qwen-token-plan.json +1 -1
- package/dist/catalog/publication.json +3 -3
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli/startup-ui.d.ts +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +2 -2
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +2 -2
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +1 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/cache-stats.d.ts +1 -1
- package/dist/core/cache-stats.d.ts.map +1 -1
- package/dist/core/cache-stats.js.map +1 -1
- package/dist/core/catalog-merge.d.ts +1 -1
- package/dist/core/catalog-merge.d.ts.map +1 -1
- package/dist/core/catalog-merge.js +7 -1
- package/dist/core/catalog-merge.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +2 -2
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +2 -2
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/context-breakdown.d.ts +1 -1
- package/dist/core/context-breakdown.d.ts.map +1 -1
- package/dist/core/context-breakdown.js.map +1 -1
- package/dist/core/defaults.d.ts +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/defaults.js.map +1 -1
- package/dist/core/export-html/index.d.ts +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +25 -25
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -3
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +5 -5
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/grok-cli-auth.d.ts +32 -0
- package/dist/core/grok-cli-auth.d.ts.map +1 -0
- package/dist/core/grok-cli-auth.js +218 -0
- package/dist/core/grok-cli-auth.js.map +1 -0
- package/dist/core/keybindings.d.ts +2 -2
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +1 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/live-catalog.d.ts +1 -1
- package/dist/core/live-catalog.d.ts.map +1 -1
- package/dist/core/live-catalog.js.map +1 -1
- package/dist/core/messages.d.ts +3 -3
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -2
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +10 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +24 -5
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/models-store.d.ts +1 -1
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/official-catalog.d.ts +1 -1
- package/dist/core/official-catalog.d.ts.map +1 -1
- package/dist/core/official-catalog.js.map +1 -1
- package/dist/core/provider-attribution.d.ts +1 -1
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/provider-composer.d.ts +1 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +2 -2
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +1 -1
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts +3 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +2 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +1 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +2 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/subscriptions.d.ts +1 -1
- package/dist/core/subscriptions.d.ts.map +1 -1
- package/dist/core/subscriptions.js.map +1 -1
- package/dist/core/tools/bash.d.ts +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +1 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +2 -2
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +1 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/write.d.ts +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +1 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
- package/dist/core/usage-adapters/openai-codex.js.map +1 -1
- package/dist/core/usage-adapters/xai.d.ts.map +1 -1
- package/dist/core/usage-adapters/xai.js +4 -0
- package/dist/core/usage-adapters/xai.js.map +1 -1
- package/dist/core/usage-history.d.ts.map +1 -1
- package/dist/core/usage-history.js.map +1 -1
- package/dist/core/usage-service.d.ts +11 -1
- package/dist/core/usage-service.d.ts.map +1 -1
- package/dist/core/usage-service.js +45 -9
- package/dist/core/usage-service.js.map +1 -1
- package/dist/core/user-models.d.ts +1 -1
- package/dist/core/user-models.d.ts.map +1 -1
- package/dist/core/user-models.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts +3 -3
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/commands.d.ts.map +1 -1
- package/dist/gateway/commands.js.map +1 -1
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +2 -2
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +1 -1
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +1 -1
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/boot-screen.d.ts +1 -1
- package/dist/modes/interactive/components/boot-screen.d.ts.map +1 -1
- package/dist/modes/interactive/components/boot-screen.js +1 -1
- package/dist/modes/interactive/components/boot-screen.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +1 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +1 -1
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +1 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +1 -1
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -1
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +1 -1
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +1 -1
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +1 -1
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.d.ts +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.js +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +2 -2
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +1 -1
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +2 -2
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +2 -2
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +2 -2
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +1 -1
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/processes-selector.d.ts +1 -1
- package/dist/modes/interactive/components/processes-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/processes-selector.js +1 -1
- package/dist/modes/interactive/components/processes-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +1 -1
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +1 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +1 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +1 -1
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +1 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +2 -2
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +1 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-summary.d.ts +1 -1
- package/dist/modes/interactive/components/thinking-summary.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-summary.js.map +1 -1
- package/dist/modes/interactive/components/thinking-tail.d.ts +1 -1
- package/dist/modes/interactive/components/thinking-tail.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-tail.js +1 -1
- package/dist/modes/interactive/components/thinking-tail.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +1 -1
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js +1 -1
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/usage-view.js +1 -1
- package/dist/modes/interactive/components/usage-view.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +1 -1
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +1 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +29 -4
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/smooth-streaming.d.ts +1 -1
- package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
- package/dist/modes/interactive/smooth-streaming.js.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +2 -2
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +2 -2
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +2 -2
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +2 -2
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/examples/extensions/auto-commit-on-exit.ts +1 -1
- package/examples/extensions/bash-spawn-hook.ts +2 -2
- package/examples/extensions/bookmark.ts +1 -1
- package/examples/extensions/border-status-editor.ts +3 -3
- package/examples/extensions/built-in-tool-renderer.ts +3 -3
- package/examples/extensions/claude-rules.ts +1 -1
- package/examples/extensions/commands.ts +1 -1
- package/examples/extensions/confirm-destructive.ts +1 -1
- package/examples/extensions/custom-compaction.ts +3 -3
- package/examples/extensions/custom-footer.ts +3 -3
- package/examples/extensions/custom-header.ts +2 -2
- package/examples/extensions/custom-provider-anthropic/index.ts +2 -2
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
- package/examples/extensions/dirty-repo-guard.ts +1 -1
- package/examples/extensions/doom-overlay/doom-component.ts +2 -2
- package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
- package/examples/extensions/doom-overlay/index.ts +1 -1
- package/examples/extensions/dynamic-resources/index.ts +1 -1
- package/examples/extensions/dynamic-tools.ts +1 -1
- package/examples/extensions/entry-renderer.ts +2 -2
- package/examples/extensions/event-bus.ts +1 -1
- package/examples/extensions/file-trigger.ts +1 -1
- package/examples/extensions/git-checkpoint.ts +1 -1
- package/examples/extensions/git-merge-and-resolve.ts +1 -1
- package/examples/extensions/github-issue-autocomplete.ts +2 -2
- package/examples/extensions/gondolin/index.ts +2 -2
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/handoff.ts +4 -4
- package/examples/extensions/hello.ts +2 -2
- package/examples/extensions/hidden-thinking-label.ts +1 -1
- package/examples/extensions/inline-bash.ts +1 -1
- package/examples/extensions/input-transform-streaming.ts +1 -1
- package/examples/extensions/input-transform.ts +1 -1
- package/examples/extensions/interactive-shell.ts +1 -1
- package/examples/extensions/kimi-deferred-tools.ts +1 -1
- package/examples/extensions/mac-system-theme.ts +1 -1
- package/examples/extensions/message-renderer.ts +2 -2
- package/examples/extensions/minimal-mode.ts +3 -3
- package/examples/extensions/modal-editor.ts +2 -2
- package/examples/extensions/model-status.ts +1 -1
- package/examples/extensions/notify.ts +1 -1
- package/examples/extensions/overlay-qa-tests.ts +3 -3
- package/examples/extensions/overlay-test.ts +2 -2
- package/examples/extensions/permission-gate.ts +1 -1
- package/examples/extensions/pirate.ts +1 -1
- package/examples/extensions/plan-mode/index.ts +4 -4
- package/examples/extensions/preset.ts +4 -4
- package/examples/extensions/project-trust.ts +1 -1
- package/examples/extensions/prompt-customizer.ts +1 -1
- package/examples/extensions/protected-paths.ts +1 -1
- package/examples/extensions/provider-payload.ts +1 -1
- package/examples/extensions/qna.ts +3 -3
- package/examples/extensions/question.ts +2 -2
- package/examples/extensions/questionnaire.ts +2 -2
- package/examples/extensions/rainbow-editor.ts +1 -1
- package/examples/extensions/reload-runtime.ts +1 -1
- package/examples/extensions/rpc-demo.ts +1 -1
- package/examples/extensions/sandbox/index.ts +2 -2
- package/examples/extensions/send-user-message.ts +1 -1
- package/examples/extensions/session-name.ts +1 -1
- package/examples/extensions/shutdown-command.ts +1 -1
- package/examples/extensions/snake.ts +2 -2
- package/examples/extensions/space-invaders.ts +2 -2
- package/examples/extensions/ssh.ts +2 -2
- package/examples/extensions/status-line.ts +1 -1
- package/examples/extensions/structured-output.ts +2 -2
- package/examples/extensions/subagent/agents.ts +1 -1
- package/examples/extensions/subagent/index.ts +5 -5
- package/examples/extensions/summarize.ts +4 -4
- package/examples/extensions/system-prompt-header.ts +1 -1
- package/examples/extensions/tic-tac-toe.ts +3 -3
- package/examples/extensions/timed-confirm.ts +1 -1
- package/examples/extensions/titlebar-spinner.ts +1 -1
- package/examples/extensions/todo.ts +3 -3
- package/examples/extensions/tool-override.ts +2 -2
- package/examples/extensions/tools.ts +3 -3
- package/examples/extensions/trigger-compact.ts +1 -1
- package/examples/extensions/truncated-tool.ts +3 -3
- package/examples/extensions/widget-placement.ts +1 -1
- package/examples/extensions/with-deps/index.ts +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/extensions/working-indicator.ts +1 -1
- package/examples/extensions/working-message-test.ts +1 -1
- package/examples/rpc-extension-ui.ts +1 -1
- package/examples/sdk/01-minimal.ts +1 -1
- package/examples/sdk/02-custom-model.ts +2 -2
- package/examples/sdk/03-custom-prompt.ts +1 -1
- package/examples/sdk/04-skills.ts +1 -1
- package/examples/sdk/05-tools.ts +1 -1
- package/examples/sdk/06-extensions.ts +2 -2
- package/examples/sdk/07-context-files.ts +1 -1
- package/examples/sdk/08-prompt-templates.ts +1 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +1 -1
- package/examples/sdk/10-settings.ts +1 -1
- package/examples/sdk/11-sessions.ts +1 -1
- package/examples/sdk/12-full-control.ts +2 -2
- package/examples/sdk/13-session-runtime.ts +1 -1
- package/package.json +4 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type AgentTool, type StreamFn, type ThinkingLevel } from "@
|
|
2
|
-
import { type ExtensionContext } from "@
|
|
3
|
-
import { type Model } from "@
|
|
1
|
+
import { type AgentTool, type StreamFn, type ThinkingLevel } from "@ashx-j/lunr-agent";
|
|
2
|
+
import { type ExtensionContext } from "@ashx-j/lunr";
|
|
3
|
+
import { type Model } from "@ashx-j/lunr-ai/compat";
|
|
4
4
|
import type { WatchdogReviewFunction } from "./runtime.ts";
|
|
5
5
|
import { type ResolvedWatchdogConfig } from "./types.ts";
|
|
6
6
|
type WatchdogContextProvider = ExtensionContext | (() => ExtensionContext | undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/watchdog/review.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACzG,OAAO,EAAqC,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC3G,OAAO,EAAgB,KAAK,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAIxE,OAAO,KAAK,EAAE,sBAAsB,EAAyB,MAAM,cAAc,CAAC;AAClF,OAAO,EAIN,KAAK,sBAAsB,EAK3B,MAAM,YAAY,CAAC;AAepB,KAAK,uBAAuB,GAAG,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC,CAAC;AAEvF,KAAK,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAEhC,UAAU,kBAAkB;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,4BAA4B;IAC5C,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;IACnD,gBAAgB,CAAC,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;CACnD;AAkED,wBAAsB,0BAA0B,CAC/C,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,sBAAsB,EAC9B,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,aAAa,CAAA;CAAO,GACpD,OAAO,CAAC,4BAA4B,CAAC,CAiCvC;AAwFD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,uBAAuB,EAAE,OAAO,GAAE,+BAAoC,GAAG,sBAAsB,CAgDjJ","sourcesContent":["// @ts-nocheck\nimport { Agent, type AgentTool, type StreamFn, type ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { createReadOnlyTools, convertToLlm, type ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { streamSimple, type Model } from \"@earendil-works/pi-ai/compat\";\nimport { Type, type Static } from \"typebox\";\nimport { resolveModelCandidate } from \"../runs/shared/model-fallback.ts\";\nimport { resolveEffectiveThinking, splitKnownThinkingSuffix, THINKING_LEVELS, toModelInfo } from \"../shared/model-info.ts\";\nimport type { WatchdogReviewFunction, WatchdogReviewRequest } from \"./runtime.ts\";\nimport {\n\tWATCHDOG_WARNING_CATEGORIES,\n\tWATCHDOG_WARNING_CONFIDENCES,\n\tWATCHDOG_WARNING_SEVERITIES,\n\ttype ResolvedWatchdogConfig,\n\ttype WatchdogCategory,\n\ttype WatchdogConfidence,\n\ttype WatchdogSeverity,\n\ttype WatchdogWarning,\n} from \"./types.ts\";\n\nconst WATCHDOG_ALLOWED_TOOL_NAMES = new Set([\"read\", \"grep\", \"find\", \"ls\", \"watchdog_warn\"]);\n\nconst WatchdogWarnParams = Type.Object({\n\tseverity: Type.String({ enum: WATCHDOG_WARNING_SEVERITIES, description: \"concern for actionable risk, blocker for a likely wrong or unsafe outcome\" }),\n\tsummary: Type.String({ description: \"One concise sentence naming the issue.\" }),\n\tevidence: Type.String({ description: \"Specific evidence from the turn delta or inspected files.\" }),\n\trecommendedAction: Type.String({ description: \"Specific action the parent should take before accepting or continuing.\" }),\n\tcategory: Type.Optional(Type.String({ enum: WATCHDOG_WARNING_CATEGORIES })),\n\tconfidence: Type.Optional(Type.String({ enum: WATCHDOG_WARNING_CONFIDENCES })),\n}, { additionalProperties: false });\n\ntype WatchdogWarnParams = Static<typeof WatchdogWarnParams>;\n\ntype WatchdogContextProvider = ExtensionContext | (() => ExtensionContext | undefined);\n\ntype RegistryModel = Model<any>;\n\ninterface WatchdogReviewAuth {\n\tapiKey?: string;\n\theaders?: Record<string, string>;\n\tenv?: Record<string, string>;\n}\n\nexport interface WatchdogReviewModelSelection {\n\tmodel: RegistryModel;\n\tthinkingLevel: ThinkingLevel;\n\tauth: WatchdogReviewAuth;\n\texplicit: boolean;\n}\n\nexport interface CreateMainWatchdogReviewOptions {\n\tstreamFn?: StreamFn;\n\tcreateReadOnlyTools?: (cwd: string) => AgentTool[];\n\tgetThinkingLevel?: () => ThinkingLevel | undefined;\n}\n\nfunction fullModelId(model: Pick<RegistryModel, \"provider\" | \"id\">): string {\n\treturn `${model.provider}/${model.id}`;\n}\n\nfunction splitProviderModel(value: string): { provider: string; id: string } | undefined {\n\tconst slashIndex = value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex === value.length - 1) return undefined;\n\treturn { provider: value.slice(0, slashIndex), id: value.slice(slashIndex + 1) };\n}\n\nfunction assertThinkingLevel(value: string, source: string): ThinkingLevel {\n\tif ((THINKING_LEVELS as readonly string[]).includes(value)) return value as ThinkingLevel;\n\tthrow new Error(`Unsupported watchdog thinking level '${value}' from ${source}; expected ${THINKING_LEVELS.join(\", \")} or false.`);\n}\n\nfunction contextThinkingLevel(ctx: ExtensionContext, currentThinkingLevel: ThinkingLevel | undefined): ThinkingLevel | undefined {\n\tif (currentThinkingLevel) return currentThinkingLevel;\n\tconst value = (ctx as { thinkingLevel?: unknown }).thinkingLevel;\n\treturn typeof value === \"string\" && (THINKING_LEVELS as readonly string[]).includes(value) ? value as ThinkingLevel : undefined;\n}\n\nfunction resolveReviewThinking(input: {\n\tmodelString: string;\n\tconfigThinking: string | false | undefined;\n\tctx: ExtensionContext;\n\tallowContextThinking: boolean;\n\tcurrentThinkingLevel?: ThinkingLevel;\n}): ThinkingLevel {\n\tconst fromModelOrConfig = resolveEffectiveThinking(input.modelString, input.configThinking);\n\tif (fromModelOrConfig) return assertThinkingLevel(fromModelOrConfig, \"watchdog model/config\");\n\tif (input.configThinking === false) return \"off\";\n\tif (input.configThinking !== undefined) return assertThinkingLevel(input.configThinking, \"watchdog config\");\n\tif (input.allowContextThinking) return contextThinkingLevel(input.ctx, input.currentThinkingLevel) ?? \"off\";\n\treturn \"off\";\n}\n\nfunction resolveConfiguredModel(ctx: ExtensionContext, rawModel: string): { model: RegistryModel; modelString: string } {\n\tconst availableModels = ctx.modelRegistry.getAvailable().map(toModelInfo);\n\tconst preferredProvider = typeof ctx.model?.provider === \"string\" ? ctx.model.provider : undefined;\n\tconst resolved = resolveModelCandidate(rawModel, availableModels, preferredProvider);\n\tconst { baseModel } = splitKnownThinkingSuffix(resolved);\n\tconst named = splitProviderModel(baseModel);\n\tif (!named) {\n\t\tthrow new Error(`Configured watchdog model '${rawModel}' did not match exactly one authenticated available model. Use provider/model or configure credentials for the intended provider.`);\n\t}\n\n\tconst model = ctx.modelRegistry.find(named.provider, named.id);\n\tif (!model) throw new Error(`Configured watchdog model '${rawModel}' was not found as '${baseModel}'.`);\n\tif (!ctx.modelRegistry.hasConfiguredAuth(model)) {\n\t\tthrow new Error(`Configured watchdog model '${baseModel}' is not authenticated. Configure credentials for provider '${named.provider}' or choose an authenticated model.`);\n\t}\n\treturn { model, modelString: resolved };\n}\n\nasync function resolveReviewAuth(ctx: ExtensionContext, model: RegistryModel): Promise<WatchdogReviewAuth> {\n\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\tif (!auth.ok) throw new Error(`Watchdog model auth failed for ${fullModelId(model)}: ${auth.error}`);\n\treturn {\n\t\t...(auth.apiKey ? { apiKey: auth.apiKey } : {}),\n\t\t...(auth.headers ? { headers: auth.headers } : {}),\n\t\t...(auth.env ? { env: auth.env } : {}),\n\t};\n}\n\nexport async function resolveWatchdogReviewModel(\n\tctx: ExtensionContext,\n\tconfig: ResolvedWatchdogConfig,\n\toptions: { currentThinkingLevel?: ThinkingLevel } = {},\n): Promise<WatchdogReviewModelSelection> {\n\tif (config.main.model) {\n\t\tconst resolved = resolveConfiguredModel(ctx, config.main.model);\n\t\treturn {\n\t\t\tmodel: resolved.model,\n\t\t\tthinkingLevel: resolveReviewThinking({\n\t\t\t\tmodelString: resolved.modelString,\n\t\t\t\tconfigThinking: config.main.thinking,\n\t\t\t\tctx,\n\t\t\t\tallowContextThinking: false,\n\t\t\t\tcurrentThinkingLevel: options.currentThinkingLevel,\n\t\t\t}),\n\t\t\tauth: await resolveReviewAuth(ctx, resolved.model),\n\t\t\texplicit: true,\n\t\t};\n\t}\n\n\tconst currentModel = ctx.model;\n\tif (!currentModel) {\n\t\tthrow new Error(\"Main watchdog review cannot run because the current Pi session model is unavailable and subagents.watchdog.main.model is not configured.\");\n\t}\n\treturn {\n\t\tmodel: currentModel,\n\t\tthinkingLevel: resolveReviewThinking({\n\t\t\tmodelString: fullModelId(currentModel),\n\t\t\tconfigThinking: config.main.thinking,\n\t\t\tctx,\n\t\t\tallowContextThinking: true,\n\t\t\tcurrentThinkingLevel: options.currentThinkingLevel,\n\t\t}),\n\t\tauth: await resolveReviewAuth(ctx, currentModel),\n\t\texplicit: false,\n\t};\n}\n\nfunction nonEmptyString(value: string, field: string): string {\n\tconst trimmed = value.trim();\n\tif (!trimmed) throw new Error(`watchdog_warn.${field} must be a non-empty string.`);\n\treturn trimmed;\n}\n\nfunction toWatchdogWarning(params: WatchdogWarnParams): WatchdogWarning {\n\treturn {\n\t\tseverity: params.severity as WatchdogSeverity,\n\t\tcategory: (params.category ?? \"other\") as WatchdogCategory,\n\t\tconfidence: (params.confidence ?? \"medium\") as WatchdogConfidence,\n\t\tsource: \"main\",\n\t\tsummary: nonEmptyString(params.summary, \"summary\"),\n\t\tevidence: nonEmptyString(params.evidence, \"evidence\"),\n\t\trecommendedAction: nonEmptyString(params.recommendedAction, \"recommendedAction\"),\n\t};\n}\n\nfunction createWatchdogWarnTool(request: WatchdogReviewRequest): AgentTool<typeof WatchdogWarnParams, { accepted: boolean }> {\n\treturn {\n\t\tname: \"watchdog_warn\",\n\t\tlabel: \"Watchdog warning\",\n\t\tdescription: [\n\t\t\t\"Emit one actionable main-session watchdog warning.\",\n\t\t\t\"Use only for medium/high confidence concerns or blockers that the parent should consider before accepting the work.\",\n\t\t\t\"Do not use for nits, praise, informational notes, or clean reviews.\",\n\t\t].join(\" \"),\n\t\tparameters: WatchdogWarnParams,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, params) {\n\t\t\tconst warning = toWatchdogWarning(params);\n\t\t\tconst accepted = request.emitWarning(warning);\n\t\t\treturn {\n\t\t\t\tcontent: [{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: accepted\n\t\t\t\t\t\t? \"Watchdog warning recorded.\"\n\t\t\t\t\t\t: \"Watchdog warning was ignored by the runtime guard because it was stale, duplicate, or over budget.\",\n\t\t\t\t}],\n\t\t\t\tdetails: { accepted },\n\t\t\t};\n\t\t},\n\t};\n}\n\nfunction buildWatchdogSystemPrompt(ctx: ExtensionContext): string {\n\treturn [\n\t\t\"You are the main-session subagent watchdog for Pi.\",\n\t\t`Working directory: ${ctx.cwd}`,\n\t\t\"Review only the supplied parent turn delta. Inspect repository files only when needed to verify a concrete concern.\",\n\t\t\"You are read-only. You may use read, grep, find, and ls. Do not edit files, run shell commands, spawn agents, or mutate state.\",\n\t\t\"Emit warnings only by calling watchdog_warn. Freeform assistant text is ignored and must not be used to report warnings.\",\n\t\t\"Emit only medium/high confidence actionable concerns or blockers: missed user constraints, correctness risks, test gaps that matter, unsafe changes, stale facts, loop risks, or scope drift.\",\n\t\t\"Do not emit nits, style preferences, low-confidence guesses, informational notes, praise, or summaries.\",\n\t\t\"If the turn is clean, call no tools and end normally.\",\n\t\t\"Use severity='blocker' only when the issue should stop acceptance until addressed; otherwise use severity='concern'.\",\n\t].join(\"\\n\");\n}\n\nfunction buildReviewPrompt(request: WatchdogReviewRequest, selection: WatchdogReviewModelSelection): string {\n\treturn [\n\t\t\"Review this parent-session turn delta for subagent-watchdog-worthy issues.\",\n\t\t`Review id: ${request.reviewId}; epoch: ${request.epoch}; review model: ${fullModelId(selection.model)}; thinking: ${selection.thinkingLevel}.`,\n\t\t\"Call watchdog_warn for each qualifying concern or blocker. Call no tools when clean.\",\n\t\t\"<turn_delta>\",\n\t\trequest.delta,\n\t\t\"</turn_delta>\",\n\t].join(\"\\n\\n\");\n}\n\nfunction finalStopReason(agent: Agent): \"stop\" | \"error\" | \"aborted\" | \"length\" {\n\tfor (let index = agent.state.messages.length - 1; index >= 0; index--) {\n\t\tconst message = agent.state.messages[index];\n\t\tif (message && typeof message === \"object\" && (message as { role?: unknown }).role === \"assistant\") {\n\t\t\tconst stopReason = (message as { stopReason?: unknown }).stopReason;\n\t\t\tif (stopReason === \"error\" || stopReason === \"aborted\" || stopReason === \"length\") return stopReason;\n\t\t\treturn \"stop\";\n\t\t}\n\t}\n\treturn \"stop\";\n}\n\nfunction resolveContext(provider: WatchdogContextProvider): ExtensionContext | undefined {\n\treturn typeof provider === \"function\" ? provider() : provider;\n}\n\nexport function createMainWatchdogReview(provider: WatchdogContextProvider, options: CreateMainWatchdogReviewOptions = {}): WatchdogReviewFunction {\n\treturn async (request) => {\n\t\tconst ctx = resolveContext(provider);\n\t\tif (!ctx) throw new Error(\"Main watchdog review cannot run without an active Pi extension context.\");\n\t\tif (ctx.signal?.aborted || request.signal?.aborted) return { stopReason: \"aborted\" };\n\t\tconst selection = await resolveWatchdogReviewModel(ctx, request.config, {\n\t\t\tcurrentThinkingLevel: options.getThinkingLevel?.(),\n\t\t});\n\t\tif (ctx.signal?.aborted || request.signal?.aborted) return { stopReason: \"aborted\" };\n\t\tconst auth = selection.auth;\n\t\tconst baseStreamFn = options.streamFn ?? streamSimple;\n\t\tconst streamFn: StreamFn = (model, context, streamOptions) => baseStreamFn(model, context, {\n\t\t\t...streamOptions,\n\t\t\t...(auth.apiKey ? { apiKey: auth.apiKey } : {}),\n\t\t\tenv: auth.env || streamOptions?.env ? { ...(auth.env ?? {}), ...(streamOptions?.env ?? {}) } : undefined,\n\t\t\theaders: { ...(streamOptions?.headers ?? {}), ...(auth.headers ?? {}) },\n\t\t});\n\t\tconst tools = [\n\t\t\t...(options.createReadOnlyTools ?? createReadOnlyTools)(ctx.cwd).filter((tool) => WATCHDOG_ALLOWED_TOOL_NAMES.has(tool.name) && tool.name !== \"watchdog_warn\"),\n\t\t\tcreateWatchdogWarnTool(request),\n\t\t];\n\t\tconst agent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: buildWatchdogSystemPrompt(ctx),\n\t\t\t\tmodel: selection.model,\n\t\t\t\tthinkingLevel: selection.thinkingLevel,\n\t\t\t\ttools,\n\t\t\t},\n\t\t\tconvertToLlm,\n\t\t\tstreamFn,\n\t\t\tgetApiKey: (providerName) => providerName === selection.model.provider ? auth.apiKey : undefined,\n\t\t\tbeforeToolCall: async ({ toolCall }) => WATCHDOG_ALLOWED_TOOL_NAMES.has(toolCall.name)\n\t\t\t\t? undefined\n\t\t\t\t: { block: true, reason: `Watchdog reviews are read-only; tool '${toolCall.name}' is not allowed.` },\n\t\t\ttoolExecution: \"sequential\",\n\t\t});\n\t\tconst abort = () => agent.abort();\n\t\tctx.signal?.addEventListener(\"abort\", abort, { once: true });\n\t\trequest.signal?.addEventListener(\"abort\", abort, { once: true });\n\t\ttry {\n\t\t\tif (ctx.signal?.aborted || request.signal?.aborted) return { stopReason: \"aborted\" };\n\t\t\tawait agent.prompt(buildReviewPrompt(request, selection));\n\t\t} finally {\n\t\t\tctx.signal?.removeEventListener(\"abort\", abort);\n\t\t\trequest.signal?.removeEventListener(\"abort\", abort);\n\t\t}\n\t\treturn { stopReason: finalStopReason(agent) };\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/watchdog/review.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACzG,OAAO,EAAqC,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC3G,OAAO,EAAgB,KAAK,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAIxE,OAAO,KAAK,EAAE,sBAAsB,EAAyB,MAAM,cAAc,CAAC;AAClF,OAAO,EAIN,KAAK,sBAAsB,EAK3B,MAAM,YAAY,CAAC;AAepB,KAAK,uBAAuB,GAAG,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC,CAAC;AAEvF,KAAK,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAEhC,UAAU,kBAAkB;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,4BAA4B;IAC5C,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;IACnD,gBAAgB,CAAC,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;CACnD;AAkED,wBAAsB,0BAA0B,CAC/C,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,sBAAsB,EAC9B,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,aAAa,CAAA;CAAO,GACpD,OAAO,CAAC,4BAA4B,CAAC,CAiCvC;AAwFD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,uBAAuB,EAAE,OAAO,GAAE,+BAAoC,GAAG,sBAAsB,CAgDjJ","sourcesContent":["// @ts-nocheck\nimport { Agent, type AgentTool, type StreamFn, type ThinkingLevel } from \"@ashx-j/lunr-agent\";\nimport { createReadOnlyTools, convertToLlm, type ExtensionContext } from \"@ashx-j/lunr\";\nimport { streamSimple, type Model } from \"@ashx-j/lunr-ai/compat\";\nimport { Type, type Static } from \"typebox\";\nimport { resolveModelCandidate } from \"../runs/shared/model-fallback.ts\";\nimport { resolveEffectiveThinking, splitKnownThinkingSuffix, THINKING_LEVELS, toModelInfo } from \"../shared/model-info.ts\";\nimport type { WatchdogReviewFunction, WatchdogReviewRequest } from \"./runtime.ts\";\nimport {\n\tWATCHDOG_WARNING_CATEGORIES,\n\tWATCHDOG_WARNING_CONFIDENCES,\n\tWATCHDOG_WARNING_SEVERITIES,\n\ttype ResolvedWatchdogConfig,\n\ttype WatchdogCategory,\n\ttype WatchdogConfidence,\n\ttype WatchdogSeverity,\n\ttype WatchdogWarning,\n} from \"./types.ts\";\n\nconst WATCHDOG_ALLOWED_TOOL_NAMES = new Set([\"read\", \"grep\", \"find\", \"ls\", \"watchdog_warn\"]);\n\nconst WatchdogWarnParams = Type.Object({\n\tseverity: Type.String({ enum: WATCHDOG_WARNING_SEVERITIES, description: \"concern for actionable risk, blocker for a likely wrong or unsafe outcome\" }),\n\tsummary: Type.String({ description: \"One concise sentence naming the issue.\" }),\n\tevidence: Type.String({ description: \"Specific evidence from the turn delta or inspected files.\" }),\n\trecommendedAction: Type.String({ description: \"Specific action the parent should take before accepting or continuing.\" }),\n\tcategory: Type.Optional(Type.String({ enum: WATCHDOG_WARNING_CATEGORIES })),\n\tconfidence: Type.Optional(Type.String({ enum: WATCHDOG_WARNING_CONFIDENCES })),\n}, { additionalProperties: false });\n\ntype WatchdogWarnParams = Static<typeof WatchdogWarnParams>;\n\ntype WatchdogContextProvider = ExtensionContext | (() => ExtensionContext | undefined);\n\ntype RegistryModel = Model<any>;\n\ninterface WatchdogReviewAuth {\n\tapiKey?: string;\n\theaders?: Record<string, string>;\n\tenv?: Record<string, string>;\n}\n\nexport interface WatchdogReviewModelSelection {\n\tmodel: RegistryModel;\n\tthinkingLevel: ThinkingLevel;\n\tauth: WatchdogReviewAuth;\n\texplicit: boolean;\n}\n\nexport interface CreateMainWatchdogReviewOptions {\n\tstreamFn?: StreamFn;\n\tcreateReadOnlyTools?: (cwd: string) => AgentTool[];\n\tgetThinkingLevel?: () => ThinkingLevel | undefined;\n}\n\nfunction fullModelId(model: Pick<RegistryModel, \"provider\" | \"id\">): string {\n\treturn `${model.provider}/${model.id}`;\n}\n\nfunction splitProviderModel(value: string): { provider: string; id: string } | undefined {\n\tconst slashIndex = value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex === value.length - 1) return undefined;\n\treturn { provider: value.slice(0, slashIndex), id: value.slice(slashIndex + 1) };\n}\n\nfunction assertThinkingLevel(value: string, source: string): ThinkingLevel {\n\tif ((THINKING_LEVELS as readonly string[]).includes(value)) return value as ThinkingLevel;\n\tthrow new Error(`Unsupported watchdog thinking level '${value}' from ${source}; expected ${THINKING_LEVELS.join(\", \")} or false.`);\n}\n\nfunction contextThinkingLevel(ctx: ExtensionContext, currentThinkingLevel: ThinkingLevel | undefined): ThinkingLevel | undefined {\n\tif (currentThinkingLevel) return currentThinkingLevel;\n\tconst value = (ctx as { thinkingLevel?: unknown }).thinkingLevel;\n\treturn typeof value === \"string\" && (THINKING_LEVELS as readonly string[]).includes(value) ? value as ThinkingLevel : undefined;\n}\n\nfunction resolveReviewThinking(input: {\n\tmodelString: string;\n\tconfigThinking: string | false | undefined;\n\tctx: ExtensionContext;\n\tallowContextThinking: boolean;\n\tcurrentThinkingLevel?: ThinkingLevel;\n}): ThinkingLevel {\n\tconst fromModelOrConfig = resolveEffectiveThinking(input.modelString, input.configThinking);\n\tif (fromModelOrConfig) return assertThinkingLevel(fromModelOrConfig, \"watchdog model/config\");\n\tif (input.configThinking === false) return \"off\";\n\tif (input.configThinking !== undefined) return assertThinkingLevel(input.configThinking, \"watchdog config\");\n\tif (input.allowContextThinking) return contextThinkingLevel(input.ctx, input.currentThinkingLevel) ?? \"off\";\n\treturn \"off\";\n}\n\nfunction resolveConfiguredModel(ctx: ExtensionContext, rawModel: string): { model: RegistryModel; modelString: string } {\n\tconst availableModels = ctx.modelRegistry.getAvailable().map(toModelInfo);\n\tconst preferredProvider = typeof ctx.model?.provider === \"string\" ? ctx.model.provider : undefined;\n\tconst resolved = resolveModelCandidate(rawModel, availableModels, preferredProvider);\n\tconst { baseModel } = splitKnownThinkingSuffix(resolved);\n\tconst named = splitProviderModel(baseModel);\n\tif (!named) {\n\t\tthrow new Error(`Configured watchdog model '${rawModel}' did not match exactly one authenticated available model. Use provider/model or configure credentials for the intended provider.`);\n\t}\n\n\tconst model = ctx.modelRegistry.find(named.provider, named.id);\n\tif (!model) throw new Error(`Configured watchdog model '${rawModel}' was not found as '${baseModel}'.`);\n\tif (!ctx.modelRegistry.hasConfiguredAuth(model)) {\n\t\tthrow new Error(`Configured watchdog model '${baseModel}' is not authenticated. Configure credentials for provider '${named.provider}' or choose an authenticated model.`);\n\t}\n\treturn { model, modelString: resolved };\n}\n\nasync function resolveReviewAuth(ctx: ExtensionContext, model: RegistryModel): Promise<WatchdogReviewAuth> {\n\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\tif (!auth.ok) throw new Error(`Watchdog model auth failed for ${fullModelId(model)}: ${auth.error}`);\n\treturn {\n\t\t...(auth.apiKey ? { apiKey: auth.apiKey } : {}),\n\t\t...(auth.headers ? { headers: auth.headers } : {}),\n\t\t...(auth.env ? { env: auth.env } : {}),\n\t};\n}\n\nexport async function resolveWatchdogReviewModel(\n\tctx: ExtensionContext,\n\tconfig: ResolvedWatchdogConfig,\n\toptions: { currentThinkingLevel?: ThinkingLevel } = {},\n): Promise<WatchdogReviewModelSelection> {\n\tif (config.main.model) {\n\t\tconst resolved = resolveConfiguredModel(ctx, config.main.model);\n\t\treturn {\n\t\t\tmodel: resolved.model,\n\t\t\tthinkingLevel: resolveReviewThinking({\n\t\t\t\tmodelString: resolved.modelString,\n\t\t\t\tconfigThinking: config.main.thinking,\n\t\t\t\tctx,\n\t\t\t\tallowContextThinking: false,\n\t\t\t\tcurrentThinkingLevel: options.currentThinkingLevel,\n\t\t\t}),\n\t\t\tauth: await resolveReviewAuth(ctx, resolved.model),\n\t\t\texplicit: true,\n\t\t};\n\t}\n\n\tconst currentModel = ctx.model;\n\tif (!currentModel) {\n\t\tthrow new Error(\"Main watchdog review cannot run because the current Pi session model is unavailable and subagents.watchdog.main.model is not configured.\");\n\t}\n\treturn {\n\t\tmodel: currentModel,\n\t\tthinkingLevel: resolveReviewThinking({\n\t\t\tmodelString: fullModelId(currentModel),\n\t\t\tconfigThinking: config.main.thinking,\n\t\t\tctx,\n\t\t\tallowContextThinking: true,\n\t\t\tcurrentThinkingLevel: options.currentThinkingLevel,\n\t\t}),\n\t\tauth: await resolveReviewAuth(ctx, currentModel),\n\t\texplicit: false,\n\t};\n}\n\nfunction nonEmptyString(value: string, field: string): string {\n\tconst trimmed = value.trim();\n\tif (!trimmed) throw new Error(`watchdog_warn.${field} must be a non-empty string.`);\n\treturn trimmed;\n}\n\nfunction toWatchdogWarning(params: WatchdogWarnParams): WatchdogWarning {\n\treturn {\n\t\tseverity: params.severity as WatchdogSeverity,\n\t\tcategory: (params.category ?? \"other\") as WatchdogCategory,\n\t\tconfidence: (params.confidence ?? \"medium\") as WatchdogConfidence,\n\t\tsource: \"main\",\n\t\tsummary: nonEmptyString(params.summary, \"summary\"),\n\t\tevidence: nonEmptyString(params.evidence, \"evidence\"),\n\t\trecommendedAction: nonEmptyString(params.recommendedAction, \"recommendedAction\"),\n\t};\n}\n\nfunction createWatchdogWarnTool(request: WatchdogReviewRequest): AgentTool<typeof WatchdogWarnParams, { accepted: boolean }> {\n\treturn {\n\t\tname: \"watchdog_warn\",\n\t\tlabel: \"Watchdog warning\",\n\t\tdescription: [\n\t\t\t\"Emit one actionable main-session watchdog warning.\",\n\t\t\t\"Use only for medium/high confidence concerns or blockers that the parent should consider before accepting the work.\",\n\t\t\t\"Do not use for nits, praise, informational notes, or clean reviews.\",\n\t\t].join(\" \"),\n\t\tparameters: WatchdogWarnParams,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, params) {\n\t\t\tconst warning = toWatchdogWarning(params);\n\t\t\tconst accepted = request.emitWarning(warning);\n\t\t\treturn {\n\t\t\t\tcontent: [{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: accepted\n\t\t\t\t\t\t? \"Watchdog warning recorded.\"\n\t\t\t\t\t\t: \"Watchdog warning was ignored by the runtime guard because it was stale, duplicate, or over budget.\",\n\t\t\t\t}],\n\t\t\t\tdetails: { accepted },\n\t\t\t};\n\t\t},\n\t};\n}\n\nfunction buildWatchdogSystemPrompt(ctx: ExtensionContext): string {\n\treturn [\n\t\t\"You are the main-session subagent watchdog for Pi.\",\n\t\t`Working directory: ${ctx.cwd}`,\n\t\t\"Review only the supplied parent turn delta. Inspect repository files only when needed to verify a concrete concern.\",\n\t\t\"You are read-only. You may use read, grep, find, and ls. Do not edit files, run shell commands, spawn agents, or mutate state.\",\n\t\t\"Emit warnings only by calling watchdog_warn. Freeform assistant text is ignored and must not be used to report warnings.\",\n\t\t\"Emit only medium/high confidence actionable concerns or blockers: missed user constraints, correctness risks, test gaps that matter, unsafe changes, stale facts, loop risks, or scope drift.\",\n\t\t\"Do not emit nits, style preferences, low-confidence guesses, informational notes, praise, or summaries.\",\n\t\t\"If the turn is clean, call no tools and end normally.\",\n\t\t\"Use severity='blocker' only when the issue should stop acceptance until addressed; otherwise use severity='concern'.\",\n\t].join(\"\\n\");\n}\n\nfunction buildReviewPrompt(request: WatchdogReviewRequest, selection: WatchdogReviewModelSelection): string {\n\treturn [\n\t\t\"Review this parent-session turn delta for subagent-watchdog-worthy issues.\",\n\t\t`Review id: ${request.reviewId}; epoch: ${request.epoch}; review model: ${fullModelId(selection.model)}; thinking: ${selection.thinkingLevel}.`,\n\t\t\"Call watchdog_warn for each qualifying concern or blocker. Call no tools when clean.\",\n\t\t\"<turn_delta>\",\n\t\trequest.delta,\n\t\t\"</turn_delta>\",\n\t].join(\"\\n\\n\");\n}\n\nfunction finalStopReason(agent: Agent): \"stop\" | \"error\" | \"aborted\" | \"length\" {\n\tfor (let index = agent.state.messages.length - 1; index >= 0; index--) {\n\t\tconst message = agent.state.messages[index];\n\t\tif (message && typeof message === \"object\" && (message as { role?: unknown }).role === \"assistant\") {\n\t\t\tconst stopReason = (message as { stopReason?: unknown }).stopReason;\n\t\t\tif (stopReason === \"error\" || stopReason === \"aborted\" || stopReason === \"length\") return stopReason;\n\t\t\treturn \"stop\";\n\t\t}\n\t}\n\treturn \"stop\";\n}\n\nfunction resolveContext(provider: WatchdogContextProvider): ExtensionContext | undefined {\n\treturn typeof provider === \"function\" ? provider() : provider;\n}\n\nexport function createMainWatchdogReview(provider: WatchdogContextProvider, options: CreateMainWatchdogReviewOptions = {}): WatchdogReviewFunction {\n\treturn async (request) => {\n\t\tconst ctx = resolveContext(provider);\n\t\tif (!ctx) throw new Error(\"Main watchdog review cannot run without an active Pi extension context.\");\n\t\tif (ctx.signal?.aborted || request.signal?.aborted) return { stopReason: \"aborted\" };\n\t\tconst selection = await resolveWatchdogReviewModel(ctx, request.config, {\n\t\t\tcurrentThinkingLevel: options.getThinkingLevel?.(),\n\t\t});\n\t\tif (ctx.signal?.aborted || request.signal?.aborted) return { stopReason: \"aborted\" };\n\t\tconst auth = selection.auth;\n\t\tconst baseStreamFn = options.streamFn ?? streamSimple;\n\t\tconst streamFn: StreamFn = (model, context, streamOptions) => baseStreamFn(model, context, {\n\t\t\t...streamOptions,\n\t\t\t...(auth.apiKey ? { apiKey: auth.apiKey } : {}),\n\t\t\tenv: auth.env || streamOptions?.env ? { ...(auth.env ?? {}), ...(streamOptions?.env ?? {}) } : undefined,\n\t\t\theaders: { ...(streamOptions?.headers ?? {}), ...(auth.headers ?? {}) },\n\t\t});\n\t\tconst tools = [\n\t\t\t...(options.createReadOnlyTools ?? createReadOnlyTools)(ctx.cwd).filter((tool) => WATCHDOG_ALLOWED_TOOL_NAMES.has(tool.name) && tool.name !== \"watchdog_warn\"),\n\t\t\tcreateWatchdogWarnTool(request),\n\t\t];\n\t\tconst agent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: buildWatchdogSystemPrompt(ctx),\n\t\t\t\tmodel: selection.model,\n\t\t\t\tthinkingLevel: selection.thinkingLevel,\n\t\t\t\ttools,\n\t\t\t},\n\t\t\tconvertToLlm,\n\t\t\tstreamFn,\n\t\t\tgetApiKey: (providerName) => providerName === selection.model.provider ? auth.apiKey : undefined,\n\t\t\tbeforeToolCall: async ({ toolCall }) => WATCHDOG_ALLOWED_TOOL_NAMES.has(toolCall.name)\n\t\t\t\t? undefined\n\t\t\t\t: { block: true, reason: `Watchdog reviews are read-only; tool '${toolCall.name}' is not allowed.` },\n\t\t\ttoolExecution: \"sequential\",\n\t\t});\n\t\tconst abort = () => agent.abort();\n\t\tctx.signal?.addEventListener(\"abort\", abort, { once: true });\n\t\trequest.signal?.addEventListener(\"abort\", abort, { once: true });\n\t\ttry {\n\t\t\tif (ctx.signal?.aborted || request.signal?.aborted) return { stopReason: \"aborted\" };\n\t\t\tawait agent.prompt(buildReviewPrompt(request, selection));\n\t\t} finally {\n\t\t\tctx.signal?.removeEventListener(\"abort\", abort);\n\t\t\trequest.signal?.removeEventListener(\"abort\", abort);\n\t\t}\n\t\treturn { stopReason: finalStopReason(agent) };\n\t};\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import { Agent } from "@
|
|
3
|
-
import { createReadOnlyTools, convertToLlm } from "@
|
|
4
|
-
import { streamSimple } from "@
|
|
2
|
+
import { Agent } from "@ashx-j/lunr-agent";
|
|
3
|
+
import { createReadOnlyTools, convertToLlm } from "@ashx-j/lunr";
|
|
4
|
+
import { streamSimple } from "@ashx-j/lunr-ai/compat";
|
|
5
5
|
import { Type } from "typebox";
|
|
6
6
|
import { resolveModelCandidate } from "../runs/shared/model-fallback.js";
|
|
7
7
|
import { resolveEffectiveThinking, splitKnownThinkingSuffix, THINKING_LEVELS, toModelInfo } from "../shared/model-info.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/watchdog/review.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,KAAK,EAAqD,MAAM,+BAA+B,CAAC;AACzG,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAyB,MAAM,iCAAiC,CAAC;AAC3G,OAAO,EAAE,YAAY,EAAc,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,IAAI,EAAe,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3H,OAAO,EACN,2BAA2B,EAC3B,4BAA4B,EAC5B,2BAA2B,GAM3B,MAAM,YAAY,CAAC;AAEpB,MAAM,2BAA2B,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;AAE7F,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;IACtC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,WAAW,EAAE,2EAA2E,EAAE,CAAC;IACtJ,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC;IAC/E,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2DAA2D,EAAE,CAAC;IACnG,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,wEAAwE,EAAE,CAAC;IACzH,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC,CAAC;IAC3E,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAC;CAC9E,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;AA2BpC,SAAS,WAAW,CAAC,KAA6C,EAAU;IAC3E,OAAO,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;AAAA,CACvC;AAED,SAAS,kBAAkB,CAAC,KAAa,EAAgD;IACxF,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACzE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;AAAA,CACjF;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,MAAc,EAAiB;IAC1E,IAAK,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAsB,CAAC;IAC1F,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,UAAU,MAAM,cAAc,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAAA,CACnI;AAED,SAAS,oBAAoB,CAAC,GAAqB,EAAE,oBAA+C,EAA6B;IAChI,IAAI,oBAAoB;QAAE,OAAO,oBAAoB,CAAC;IACtD,MAAM,KAAK,GAAI,GAAmC,CAAC,aAAa,CAAC;IACjE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAsB,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CAChI;AAED,SAAS,qBAAqB,CAAC,KAM9B,EAAiB;IACjB,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAC5F,IAAI,iBAAiB;QAAE,OAAO,mBAAmB,CAAC,iBAAiB,EAAE,uBAAuB,CAAC,CAAC;IAC9F,IAAI,KAAK,CAAC,cAAc,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS;QAAE,OAAO,mBAAmB,CAAC,KAAK,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAC5G,IAAI,KAAK,CAAC,oBAAoB;QAAE,OAAO,oBAAoB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,oBAAoB,CAAC,IAAI,KAAK,CAAC;IAC5G,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,sBAAsB,CAAC,GAAqB,EAAE,QAAgB,EAAiD;IACvH,MAAM,eAAe,GAAG,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1E,MAAM,iBAAiB,GAAG,OAAO,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACnG,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC;IACrF,MAAM,EAAE,SAAS,EAAE,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,mIAAmI,CAAC,CAAC;IAC5L,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,uBAAuB,SAAS,IAAI,CAAC,CAAC;IACxG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,+DAA+D,KAAK,CAAC,QAAQ,qCAAqC,CAAC,CAAC;IAC5K,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAAA,CACxC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAqB,EAAE,KAAoB,EAA+B;IAC1G,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAChE,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,WAAW,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACrG,OAAO;QACN,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtC,CAAC;AAAA,CACF;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC/C,GAAqB,EACrB,MAA8B,EAC9B,OAAO,GAA6C,EAAE,EACd;IACxC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,OAAO;YACN,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,aAAa,EAAE,qBAAqB,CAAC;gBACpC,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;gBACpC,GAAG;gBACH,oBAAoB,EAAE,KAAK;gBAC3B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;aAClD,CAAC;YACF,IAAI,EAAE,MAAM,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC;YAClD,QAAQ,EAAE,IAAI;SACd,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC;IAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,0IAA0I,CAAC,CAAC;IAC7J,CAAC;IACD,OAAO;QACN,KAAK,EAAE,YAAY;QACnB,aAAa,EAAE,qBAAqB,CAAC;YACpC,WAAW,EAAE,WAAW,CAAC,YAAY,CAAC;YACtC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;YACpC,GAAG;YACH,oBAAoB,EAAE,IAAI;YAC1B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;SAClD,CAAC;QACF,IAAI,EAAE,MAAM,iBAAiB,CAAC,GAAG,EAAE,YAAY,CAAC;QAChD,QAAQ,EAAE,KAAK;KACf,CAAC;AAAA,CACF;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa,EAAU;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,8BAA8B,CAAC,CAAC;IACpF,OAAO,OAAO,CAAC;AAAA,CACf;AAED,SAAS,iBAAiB,CAAC,MAA0B,EAAmB;IACvE,OAAO;QACN,QAAQ,EAAE,MAAM,CAAC,QAA4B;QAC7C,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAqB;QAC1D,UAAU,EAAE,CAAC,MAAM,CAAC,UAAU,IAAI,QAAQ,CAAuB;QACjE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC;QAClD,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC;QACrD,iBAAiB,EAAE,cAAc,CAAC,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;KAChF,CAAC;AAAA,CACF;AAED,SAAS,sBAAsB,CAAC,OAA8B,EAA+D;IAC5H,OAAO;QACN,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE;YACZ,oDAAoD;YACpD,qHAAqH;YACrH,qEAAqE;SACrE,CAAC,IAAI,CAAC,GAAG,CAAC;QACX,UAAU,EAAE,kBAAkB;QAC9B,aAAa,EAAE,YAAY;QAC3B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE;YAClC,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC9C,OAAO;gBACN,OAAO,EAAE,CAAC;wBACT,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,QAAQ;4BACb,CAAC,CAAC,4BAA4B;4BAC9B,CAAC,CAAC,oGAAoG;qBACvG,CAAC;gBACF,OAAO,EAAE,EAAE,QAAQ,EAAE;aACrB,CAAC;QAAA,CACF;KACD,CAAC;AAAA,CACF;AAED,SAAS,yBAAyB,CAAC,GAAqB,EAAU;IACjE,OAAO;QACN,oDAAoD;QACpD,sBAAsB,GAAG,CAAC,GAAG,EAAE;QAC/B,qHAAqH;QACrH,gIAAgI;QAChI,0HAA0H;QAC1H,+LAA+L;QAC/L,yGAAyG;QACzG,uDAAuD;QACvD,sHAAsH;KACtH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CACb;AAED,SAAS,iBAAiB,CAAC,OAA8B,EAAE,SAAuC,EAAU;IAC3G,OAAO;QACN,4EAA4E;QAC5E,cAAc,OAAO,CAAC,QAAQ,YAAY,OAAO,CAAC,KAAK,mBAAmB,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,SAAS,CAAC,aAAa,GAAG;QAC/I,sFAAsF;QACtF,cAAc;QACd,OAAO,CAAC,KAAK;QACb,eAAe;KACf,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAAA,CACf;AAED,SAAS,eAAe,CAAC,KAAY,EAA2C;IAC/E,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAK,OAA8B,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACpG,MAAM,UAAU,GAAI,OAAoC,CAAC,UAAU,CAAC;YACpE,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,QAAQ;gBAAE,OAAO,UAAU,CAAC;YACrG,OAAO,MAAM,CAAC;QACf,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd;AAED,SAAS,cAAc,CAAC,QAAiC,EAAgC;IACxF,OAAO,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AAAA,CAC9D;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAiC,EAAE,OAAO,GAAoC,EAAE,EAA0B;IAClJ,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;QACrG,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QACrF,MAAM,SAAS,GAAG,MAAM,0BAA0B,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE;YACvE,oBAAoB,EAAE,OAAO,CAAC,gBAAgB,EAAE,EAAE;SAClD,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QACrF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAC5B,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,IAAI,YAAY,CAAC;QACtD,MAAM,QAAQ,GAAa,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE;YAC1F,GAAG,aAAa;YAChB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YACxG,OAAO,EAAE,EAAE,GAAG,CAAC,aAAa,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE;SACvE,CAAC,CAAC;QACH,MAAM,KAAK,GAAG;YACb,GAAG,CAAC,OAAO,CAAC,mBAAmB,IAAI,mBAAmB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,2BAA2B,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC;YAC9J,sBAAsB,CAAC,OAAO,CAAC;SAC/B,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACvB,YAAY,EAAE;gBACb,YAAY,EAAE,yBAAyB,CAAC,GAAG,CAAC;gBAC5C,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,aAAa,EAAE,SAAS,CAAC,aAAa;gBACtC,KAAK;aACL;YACD,YAAY;YACZ,QAAQ;YACR,SAAS,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,KAAK,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAChG,cAAc,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,2BAA2B,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACrF,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,yCAAyC,QAAQ,CAAC,IAAI,mBAAmB,EAAE;YACrG,aAAa,EAAE,YAAY;SAC3B,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAClC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC;YACJ,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;gBAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;YACrF,MAAM,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAC3D,CAAC;gBAAS,CAAC;YACV,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAChD,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;IAAA,CAC9C,CAAC;AAAA,CACF","sourcesContent":["// @ts-nocheck\nimport { Agent, type AgentTool, type StreamFn, type ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { createReadOnlyTools, convertToLlm, type ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { streamSimple, type Model } from \"@earendil-works/pi-ai/compat\";\nimport { Type, type Static } from \"typebox\";\nimport { resolveModelCandidate } from \"../runs/shared/model-fallback.ts\";\nimport { resolveEffectiveThinking, splitKnownThinkingSuffix, THINKING_LEVELS, toModelInfo } from \"../shared/model-info.ts\";\nimport type { WatchdogReviewFunction, WatchdogReviewRequest } from \"./runtime.ts\";\nimport {\n\tWATCHDOG_WARNING_CATEGORIES,\n\tWATCHDOG_WARNING_CONFIDENCES,\n\tWATCHDOG_WARNING_SEVERITIES,\n\ttype ResolvedWatchdogConfig,\n\ttype WatchdogCategory,\n\ttype WatchdogConfidence,\n\ttype WatchdogSeverity,\n\ttype WatchdogWarning,\n} from \"./types.ts\";\n\nconst WATCHDOG_ALLOWED_TOOL_NAMES = new Set([\"read\", \"grep\", \"find\", \"ls\", \"watchdog_warn\"]);\n\nconst WatchdogWarnParams = Type.Object({\n\tseverity: Type.String({ enum: WATCHDOG_WARNING_SEVERITIES, description: \"concern for actionable risk, blocker for a likely wrong or unsafe outcome\" }),\n\tsummary: Type.String({ description: \"One concise sentence naming the issue.\" }),\n\tevidence: Type.String({ description: \"Specific evidence from the turn delta or inspected files.\" }),\n\trecommendedAction: Type.String({ description: \"Specific action the parent should take before accepting or continuing.\" }),\n\tcategory: Type.Optional(Type.String({ enum: WATCHDOG_WARNING_CATEGORIES })),\n\tconfidence: Type.Optional(Type.String({ enum: WATCHDOG_WARNING_CONFIDENCES })),\n}, { additionalProperties: false });\n\ntype WatchdogWarnParams = Static<typeof WatchdogWarnParams>;\n\ntype WatchdogContextProvider = ExtensionContext | (() => ExtensionContext | undefined);\n\ntype RegistryModel = Model<any>;\n\ninterface WatchdogReviewAuth {\n\tapiKey?: string;\n\theaders?: Record<string, string>;\n\tenv?: Record<string, string>;\n}\n\nexport interface WatchdogReviewModelSelection {\n\tmodel: RegistryModel;\n\tthinkingLevel: ThinkingLevel;\n\tauth: WatchdogReviewAuth;\n\texplicit: boolean;\n}\n\nexport interface CreateMainWatchdogReviewOptions {\n\tstreamFn?: StreamFn;\n\tcreateReadOnlyTools?: (cwd: string) => AgentTool[];\n\tgetThinkingLevel?: () => ThinkingLevel | undefined;\n}\n\nfunction fullModelId(model: Pick<RegistryModel, \"provider\" | \"id\">): string {\n\treturn `${model.provider}/${model.id}`;\n}\n\nfunction splitProviderModel(value: string): { provider: string; id: string } | undefined {\n\tconst slashIndex = value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex === value.length - 1) return undefined;\n\treturn { provider: value.slice(0, slashIndex), id: value.slice(slashIndex + 1) };\n}\n\nfunction assertThinkingLevel(value: string, source: string): ThinkingLevel {\n\tif ((THINKING_LEVELS as readonly string[]).includes(value)) return value as ThinkingLevel;\n\tthrow new Error(`Unsupported watchdog thinking level '${value}' from ${source}; expected ${THINKING_LEVELS.join(\", \")} or false.`);\n}\n\nfunction contextThinkingLevel(ctx: ExtensionContext, currentThinkingLevel: ThinkingLevel | undefined): ThinkingLevel | undefined {\n\tif (currentThinkingLevel) return currentThinkingLevel;\n\tconst value = (ctx as { thinkingLevel?: unknown }).thinkingLevel;\n\treturn typeof value === \"string\" && (THINKING_LEVELS as readonly string[]).includes(value) ? value as ThinkingLevel : undefined;\n}\n\nfunction resolveReviewThinking(input: {\n\tmodelString: string;\n\tconfigThinking: string | false | undefined;\n\tctx: ExtensionContext;\n\tallowContextThinking: boolean;\n\tcurrentThinkingLevel?: ThinkingLevel;\n}): ThinkingLevel {\n\tconst fromModelOrConfig = resolveEffectiveThinking(input.modelString, input.configThinking);\n\tif (fromModelOrConfig) return assertThinkingLevel(fromModelOrConfig, \"watchdog model/config\");\n\tif (input.configThinking === false) return \"off\";\n\tif (input.configThinking !== undefined) return assertThinkingLevel(input.configThinking, \"watchdog config\");\n\tif (input.allowContextThinking) return contextThinkingLevel(input.ctx, input.currentThinkingLevel) ?? \"off\";\n\treturn \"off\";\n}\n\nfunction resolveConfiguredModel(ctx: ExtensionContext, rawModel: string): { model: RegistryModel; modelString: string } {\n\tconst availableModels = ctx.modelRegistry.getAvailable().map(toModelInfo);\n\tconst preferredProvider = typeof ctx.model?.provider === \"string\" ? ctx.model.provider : undefined;\n\tconst resolved = resolveModelCandidate(rawModel, availableModels, preferredProvider);\n\tconst { baseModel } = splitKnownThinkingSuffix(resolved);\n\tconst named = splitProviderModel(baseModel);\n\tif (!named) {\n\t\tthrow new Error(`Configured watchdog model '${rawModel}' did not match exactly one authenticated available model. Use provider/model or configure credentials for the intended provider.`);\n\t}\n\n\tconst model = ctx.modelRegistry.find(named.provider, named.id);\n\tif (!model) throw new Error(`Configured watchdog model '${rawModel}' was not found as '${baseModel}'.`);\n\tif (!ctx.modelRegistry.hasConfiguredAuth(model)) {\n\t\tthrow new Error(`Configured watchdog model '${baseModel}' is not authenticated. Configure credentials for provider '${named.provider}' or choose an authenticated model.`);\n\t}\n\treturn { model, modelString: resolved };\n}\n\nasync function resolveReviewAuth(ctx: ExtensionContext, model: RegistryModel): Promise<WatchdogReviewAuth> {\n\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\tif (!auth.ok) throw new Error(`Watchdog model auth failed for ${fullModelId(model)}: ${auth.error}`);\n\treturn {\n\t\t...(auth.apiKey ? { apiKey: auth.apiKey } : {}),\n\t\t...(auth.headers ? { headers: auth.headers } : {}),\n\t\t...(auth.env ? { env: auth.env } : {}),\n\t};\n}\n\nexport async function resolveWatchdogReviewModel(\n\tctx: ExtensionContext,\n\tconfig: ResolvedWatchdogConfig,\n\toptions: { currentThinkingLevel?: ThinkingLevel } = {},\n): Promise<WatchdogReviewModelSelection> {\n\tif (config.main.model) {\n\t\tconst resolved = resolveConfiguredModel(ctx, config.main.model);\n\t\treturn {\n\t\t\tmodel: resolved.model,\n\t\t\tthinkingLevel: resolveReviewThinking({\n\t\t\t\tmodelString: resolved.modelString,\n\t\t\t\tconfigThinking: config.main.thinking,\n\t\t\t\tctx,\n\t\t\t\tallowContextThinking: false,\n\t\t\t\tcurrentThinkingLevel: options.currentThinkingLevel,\n\t\t\t}),\n\t\t\tauth: await resolveReviewAuth(ctx, resolved.model),\n\t\t\texplicit: true,\n\t\t};\n\t}\n\n\tconst currentModel = ctx.model;\n\tif (!currentModel) {\n\t\tthrow new Error(\"Main watchdog review cannot run because the current Pi session model is unavailable and subagents.watchdog.main.model is not configured.\");\n\t}\n\treturn {\n\t\tmodel: currentModel,\n\t\tthinkingLevel: resolveReviewThinking({\n\t\t\tmodelString: fullModelId(currentModel),\n\t\t\tconfigThinking: config.main.thinking,\n\t\t\tctx,\n\t\t\tallowContextThinking: true,\n\t\t\tcurrentThinkingLevel: options.currentThinkingLevel,\n\t\t}),\n\t\tauth: await resolveReviewAuth(ctx, currentModel),\n\t\texplicit: false,\n\t};\n}\n\nfunction nonEmptyString(value: string, field: string): string {\n\tconst trimmed = value.trim();\n\tif (!trimmed) throw new Error(`watchdog_warn.${field} must be a non-empty string.`);\n\treturn trimmed;\n}\n\nfunction toWatchdogWarning(params: WatchdogWarnParams): WatchdogWarning {\n\treturn {\n\t\tseverity: params.severity as WatchdogSeverity,\n\t\tcategory: (params.category ?? \"other\") as WatchdogCategory,\n\t\tconfidence: (params.confidence ?? \"medium\") as WatchdogConfidence,\n\t\tsource: \"main\",\n\t\tsummary: nonEmptyString(params.summary, \"summary\"),\n\t\tevidence: nonEmptyString(params.evidence, \"evidence\"),\n\t\trecommendedAction: nonEmptyString(params.recommendedAction, \"recommendedAction\"),\n\t};\n}\n\nfunction createWatchdogWarnTool(request: WatchdogReviewRequest): AgentTool<typeof WatchdogWarnParams, { accepted: boolean }> {\n\treturn {\n\t\tname: \"watchdog_warn\",\n\t\tlabel: \"Watchdog warning\",\n\t\tdescription: [\n\t\t\t\"Emit one actionable main-session watchdog warning.\",\n\t\t\t\"Use only for medium/high confidence concerns or blockers that the parent should consider before accepting the work.\",\n\t\t\t\"Do not use for nits, praise, informational notes, or clean reviews.\",\n\t\t].join(\" \"),\n\t\tparameters: WatchdogWarnParams,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, params) {\n\t\t\tconst warning = toWatchdogWarning(params);\n\t\t\tconst accepted = request.emitWarning(warning);\n\t\t\treturn {\n\t\t\t\tcontent: [{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: accepted\n\t\t\t\t\t\t? \"Watchdog warning recorded.\"\n\t\t\t\t\t\t: \"Watchdog warning was ignored by the runtime guard because it was stale, duplicate, or over budget.\",\n\t\t\t\t}],\n\t\t\t\tdetails: { accepted },\n\t\t\t};\n\t\t},\n\t};\n}\n\nfunction buildWatchdogSystemPrompt(ctx: ExtensionContext): string {\n\treturn [\n\t\t\"You are the main-session subagent watchdog for Pi.\",\n\t\t`Working directory: ${ctx.cwd}`,\n\t\t\"Review only the supplied parent turn delta. Inspect repository files only when needed to verify a concrete concern.\",\n\t\t\"You are read-only. You may use read, grep, find, and ls. Do not edit files, run shell commands, spawn agents, or mutate state.\",\n\t\t\"Emit warnings only by calling watchdog_warn. Freeform assistant text is ignored and must not be used to report warnings.\",\n\t\t\"Emit only medium/high confidence actionable concerns or blockers: missed user constraints, correctness risks, test gaps that matter, unsafe changes, stale facts, loop risks, or scope drift.\",\n\t\t\"Do not emit nits, style preferences, low-confidence guesses, informational notes, praise, or summaries.\",\n\t\t\"If the turn is clean, call no tools and end normally.\",\n\t\t\"Use severity='blocker' only when the issue should stop acceptance until addressed; otherwise use severity='concern'.\",\n\t].join(\"\\n\");\n}\n\nfunction buildReviewPrompt(request: WatchdogReviewRequest, selection: WatchdogReviewModelSelection): string {\n\treturn [\n\t\t\"Review this parent-session turn delta for subagent-watchdog-worthy issues.\",\n\t\t`Review id: ${request.reviewId}; epoch: ${request.epoch}; review model: ${fullModelId(selection.model)}; thinking: ${selection.thinkingLevel}.`,\n\t\t\"Call watchdog_warn for each qualifying concern or blocker. Call no tools when clean.\",\n\t\t\"<turn_delta>\",\n\t\trequest.delta,\n\t\t\"</turn_delta>\",\n\t].join(\"\\n\\n\");\n}\n\nfunction finalStopReason(agent: Agent): \"stop\" | \"error\" | \"aborted\" | \"length\" {\n\tfor (let index = agent.state.messages.length - 1; index >= 0; index--) {\n\t\tconst message = agent.state.messages[index];\n\t\tif (message && typeof message === \"object\" && (message as { role?: unknown }).role === \"assistant\") {\n\t\t\tconst stopReason = (message as { stopReason?: unknown }).stopReason;\n\t\t\tif (stopReason === \"error\" || stopReason === \"aborted\" || stopReason === \"length\") return stopReason;\n\t\t\treturn \"stop\";\n\t\t}\n\t}\n\treturn \"stop\";\n}\n\nfunction resolveContext(provider: WatchdogContextProvider): ExtensionContext | undefined {\n\treturn typeof provider === \"function\" ? provider() : provider;\n}\n\nexport function createMainWatchdogReview(provider: WatchdogContextProvider, options: CreateMainWatchdogReviewOptions = {}): WatchdogReviewFunction {\n\treturn async (request) => {\n\t\tconst ctx = resolveContext(provider);\n\t\tif (!ctx) throw new Error(\"Main watchdog review cannot run without an active Pi extension context.\");\n\t\tif (ctx.signal?.aborted || request.signal?.aborted) return { stopReason: \"aborted\" };\n\t\tconst selection = await resolveWatchdogReviewModel(ctx, request.config, {\n\t\t\tcurrentThinkingLevel: options.getThinkingLevel?.(),\n\t\t});\n\t\tif (ctx.signal?.aborted || request.signal?.aborted) return { stopReason: \"aborted\" };\n\t\tconst auth = selection.auth;\n\t\tconst baseStreamFn = options.streamFn ?? streamSimple;\n\t\tconst streamFn: StreamFn = (model, context, streamOptions) => baseStreamFn(model, context, {\n\t\t\t...streamOptions,\n\t\t\t...(auth.apiKey ? { apiKey: auth.apiKey } : {}),\n\t\t\tenv: auth.env || streamOptions?.env ? { ...(auth.env ?? {}), ...(streamOptions?.env ?? {}) } : undefined,\n\t\t\theaders: { ...(streamOptions?.headers ?? {}), ...(auth.headers ?? {}) },\n\t\t});\n\t\tconst tools = [\n\t\t\t...(options.createReadOnlyTools ?? createReadOnlyTools)(ctx.cwd).filter((tool) => WATCHDOG_ALLOWED_TOOL_NAMES.has(tool.name) && tool.name !== \"watchdog_warn\"),\n\t\t\tcreateWatchdogWarnTool(request),\n\t\t];\n\t\tconst agent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: buildWatchdogSystemPrompt(ctx),\n\t\t\t\tmodel: selection.model,\n\t\t\t\tthinkingLevel: selection.thinkingLevel,\n\t\t\t\ttools,\n\t\t\t},\n\t\t\tconvertToLlm,\n\t\t\tstreamFn,\n\t\t\tgetApiKey: (providerName) => providerName === selection.model.provider ? auth.apiKey : undefined,\n\t\t\tbeforeToolCall: async ({ toolCall }) => WATCHDOG_ALLOWED_TOOL_NAMES.has(toolCall.name)\n\t\t\t\t? undefined\n\t\t\t\t: { block: true, reason: `Watchdog reviews are read-only; tool '${toolCall.name}' is not allowed.` },\n\t\t\ttoolExecution: \"sequential\",\n\t\t});\n\t\tconst abort = () => agent.abort();\n\t\tctx.signal?.addEventListener(\"abort\", abort, { once: true });\n\t\trequest.signal?.addEventListener(\"abort\", abort, { once: true });\n\t\ttry {\n\t\t\tif (ctx.signal?.aborted || request.signal?.aborted) return { stopReason: \"aborted\" };\n\t\t\tawait agent.prompt(buildReviewPrompt(request, selection));\n\t\t} finally {\n\t\t\tctx.signal?.removeEventListener(\"abort\", abort);\n\t\t\trequest.signal?.removeEventListener(\"abort\", abort);\n\t\t}\n\t\treturn { stopReason: finalStopReason(agent) };\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/watchdog/review.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { Agent, type AgentTool, type StreamFn, type ThinkingLevel } from \"@ashx-j/lunr-agent\";\nimport { createReadOnlyTools, convertToLlm, type ExtensionContext } from \"@ashx-j/lunr\";\nimport { streamSimple, type Model } from \"@ashx-j/lunr-ai/compat\";\nimport { Type, type Static } from \"typebox\";\nimport { resolveModelCandidate } from \"../runs/shared/model-fallback.ts\";\nimport { resolveEffectiveThinking, splitKnownThinkingSuffix, THINKING_LEVELS, toModelInfo } from \"../shared/model-info.ts\";\nimport type { WatchdogReviewFunction, WatchdogReviewRequest } from \"./runtime.ts\";\nimport {\n\tWATCHDOG_WARNING_CATEGORIES,\n\tWATCHDOG_WARNING_CONFIDENCES,\n\tWATCHDOG_WARNING_SEVERITIES,\n\ttype ResolvedWatchdogConfig,\n\ttype WatchdogCategory,\n\ttype WatchdogConfidence,\n\ttype WatchdogSeverity,\n\ttype WatchdogWarning,\n} from \"./types.ts\";\n\nconst WATCHDOG_ALLOWED_TOOL_NAMES = new Set([\"read\", \"grep\", \"find\", \"ls\", \"watchdog_warn\"]);\n\nconst WatchdogWarnParams = Type.Object({\n\tseverity: Type.String({ enum: WATCHDOG_WARNING_SEVERITIES, description: \"concern for actionable risk, blocker for a likely wrong or unsafe outcome\" }),\n\tsummary: Type.String({ description: \"One concise sentence naming the issue.\" }),\n\tevidence: Type.String({ description: \"Specific evidence from the turn delta or inspected files.\" }),\n\trecommendedAction: Type.String({ description: \"Specific action the parent should take before accepting or continuing.\" }),\n\tcategory: Type.Optional(Type.String({ enum: WATCHDOG_WARNING_CATEGORIES })),\n\tconfidence: Type.Optional(Type.String({ enum: WATCHDOG_WARNING_CONFIDENCES })),\n}, { additionalProperties: false });\n\ntype WatchdogWarnParams = Static<typeof WatchdogWarnParams>;\n\ntype WatchdogContextProvider = ExtensionContext | (() => ExtensionContext | undefined);\n\ntype RegistryModel = Model<any>;\n\ninterface WatchdogReviewAuth {\n\tapiKey?: string;\n\theaders?: Record<string, string>;\n\tenv?: Record<string, string>;\n}\n\nexport interface WatchdogReviewModelSelection {\n\tmodel: RegistryModel;\n\tthinkingLevel: ThinkingLevel;\n\tauth: WatchdogReviewAuth;\n\texplicit: boolean;\n}\n\nexport interface CreateMainWatchdogReviewOptions {\n\tstreamFn?: StreamFn;\n\tcreateReadOnlyTools?: (cwd: string) => AgentTool[];\n\tgetThinkingLevel?: () => ThinkingLevel | undefined;\n}\n\nfunction fullModelId(model: Pick<RegistryModel, \"provider\" | \"id\">): string {\n\treturn `${model.provider}/${model.id}`;\n}\n\nfunction splitProviderModel(value: string): { provider: string; id: string } | undefined {\n\tconst slashIndex = value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex === value.length - 1) return undefined;\n\treturn { provider: value.slice(0, slashIndex), id: value.slice(slashIndex + 1) };\n}\n\nfunction assertThinkingLevel(value: string, source: string): ThinkingLevel {\n\tif ((THINKING_LEVELS as readonly string[]).includes(value)) return value as ThinkingLevel;\n\tthrow new Error(`Unsupported watchdog thinking level '${value}' from ${source}; expected ${THINKING_LEVELS.join(\", \")} or false.`);\n}\n\nfunction contextThinkingLevel(ctx: ExtensionContext, currentThinkingLevel: ThinkingLevel | undefined): ThinkingLevel | undefined {\n\tif (currentThinkingLevel) return currentThinkingLevel;\n\tconst value = (ctx as { thinkingLevel?: unknown }).thinkingLevel;\n\treturn typeof value === \"string\" && (THINKING_LEVELS as readonly string[]).includes(value) ? value as ThinkingLevel : undefined;\n}\n\nfunction resolveReviewThinking(input: {\n\tmodelString: string;\n\tconfigThinking: string | false | undefined;\n\tctx: ExtensionContext;\n\tallowContextThinking: boolean;\n\tcurrentThinkingLevel?: ThinkingLevel;\n}): ThinkingLevel {\n\tconst fromModelOrConfig = resolveEffectiveThinking(input.modelString, input.configThinking);\n\tif (fromModelOrConfig) return assertThinkingLevel(fromModelOrConfig, \"watchdog model/config\");\n\tif (input.configThinking === false) return \"off\";\n\tif (input.configThinking !== undefined) return assertThinkingLevel(input.configThinking, \"watchdog config\");\n\tif (input.allowContextThinking) return contextThinkingLevel(input.ctx, input.currentThinkingLevel) ?? \"off\";\n\treturn \"off\";\n}\n\nfunction resolveConfiguredModel(ctx: ExtensionContext, rawModel: string): { model: RegistryModel; modelString: string } {\n\tconst availableModels = ctx.modelRegistry.getAvailable().map(toModelInfo);\n\tconst preferredProvider = typeof ctx.model?.provider === \"string\" ? ctx.model.provider : undefined;\n\tconst resolved = resolveModelCandidate(rawModel, availableModels, preferredProvider);\n\tconst { baseModel } = splitKnownThinkingSuffix(resolved);\n\tconst named = splitProviderModel(baseModel);\n\tif (!named) {\n\t\tthrow new Error(`Configured watchdog model '${rawModel}' did not match exactly one authenticated available model. Use provider/model or configure credentials for the intended provider.`);\n\t}\n\n\tconst model = ctx.modelRegistry.find(named.provider, named.id);\n\tif (!model) throw new Error(`Configured watchdog model '${rawModel}' was not found as '${baseModel}'.`);\n\tif (!ctx.modelRegistry.hasConfiguredAuth(model)) {\n\t\tthrow new Error(`Configured watchdog model '${baseModel}' is not authenticated. Configure credentials for provider '${named.provider}' or choose an authenticated model.`);\n\t}\n\treturn { model, modelString: resolved };\n}\n\nasync function resolveReviewAuth(ctx: ExtensionContext, model: RegistryModel): Promise<WatchdogReviewAuth> {\n\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\tif (!auth.ok) throw new Error(`Watchdog model auth failed for ${fullModelId(model)}: ${auth.error}`);\n\treturn {\n\t\t...(auth.apiKey ? { apiKey: auth.apiKey } : {}),\n\t\t...(auth.headers ? { headers: auth.headers } : {}),\n\t\t...(auth.env ? { env: auth.env } : {}),\n\t};\n}\n\nexport async function resolveWatchdogReviewModel(\n\tctx: ExtensionContext,\n\tconfig: ResolvedWatchdogConfig,\n\toptions: { currentThinkingLevel?: ThinkingLevel } = {},\n): Promise<WatchdogReviewModelSelection> {\n\tif (config.main.model) {\n\t\tconst resolved = resolveConfiguredModel(ctx, config.main.model);\n\t\treturn {\n\t\t\tmodel: resolved.model,\n\t\t\tthinkingLevel: resolveReviewThinking({\n\t\t\t\tmodelString: resolved.modelString,\n\t\t\t\tconfigThinking: config.main.thinking,\n\t\t\t\tctx,\n\t\t\t\tallowContextThinking: false,\n\t\t\t\tcurrentThinkingLevel: options.currentThinkingLevel,\n\t\t\t}),\n\t\t\tauth: await resolveReviewAuth(ctx, resolved.model),\n\t\t\texplicit: true,\n\t\t};\n\t}\n\n\tconst currentModel = ctx.model;\n\tif (!currentModel) {\n\t\tthrow new Error(\"Main watchdog review cannot run because the current Pi session model is unavailable and subagents.watchdog.main.model is not configured.\");\n\t}\n\treturn {\n\t\tmodel: currentModel,\n\t\tthinkingLevel: resolveReviewThinking({\n\t\t\tmodelString: fullModelId(currentModel),\n\t\t\tconfigThinking: config.main.thinking,\n\t\t\tctx,\n\t\t\tallowContextThinking: true,\n\t\t\tcurrentThinkingLevel: options.currentThinkingLevel,\n\t\t}),\n\t\tauth: await resolveReviewAuth(ctx, currentModel),\n\t\texplicit: false,\n\t};\n}\n\nfunction nonEmptyString(value: string, field: string): string {\n\tconst trimmed = value.trim();\n\tif (!trimmed) throw new Error(`watchdog_warn.${field} must be a non-empty string.`);\n\treturn trimmed;\n}\n\nfunction toWatchdogWarning(params: WatchdogWarnParams): WatchdogWarning {\n\treturn {\n\t\tseverity: params.severity as WatchdogSeverity,\n\t\tcategory: (params.category ?? \"other\") as WatchdogCategory,\n\t\tconfidence: (params.confidence ?? \"medium\") as WatchdogConfidence,\n\t\tsource: \"main\",\n\t\tsummary: nonEmptyString(params.summary, \"summary\"),\n\t\tevidence: nonEmptyString(params.evidence, \"evidence\"),\n\t\trecommendedAction: nonEmptyString(params.recommendedAction, \"recommendedAction\"),\n\t};\n}\n\nfunction createWatchdogWarnTool(request: WatchdogReviewRequest): AgentTool<typeof WatchdogWarnParams, { accepted: boolean }> {\n\treturn {\n\t\tname: \"watchdog_warn\",\n\t\tlabel: \"Watchdog warning\",\n\t\tdescription: [\n\t\t\t\"Emit one actionable main-session watchdog warning.\",\n\t\t\t\"Use only for medium/high confidence concerns or blockers that the parent should consider before accepting the work.\",\n\t\t\t\"Do not use for nits, praise, informational notes, or clean reviews.\",\n\t\t].join(\" \"),\n\t\tparameters: WatchdogWarnParams,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, params) {\n\t\t\tconst warning = toWatchdogWarning(params);\n\t\t\tconst accepted = request.emitWarning(warning);\n\t\t\treturn {\n\t\t\t\tcontent: [{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: accepted\n\t\t\t\t\t\t? \"Watchdog warning recorded.\"\n\t\t\t\t\t\t: \"Watchdog warning was ignored by the runtime guard because it was stale, duplicate, or over budget.\",\n\t\t\t\t}],\n\t\t\t\tdetails: { accepted },\n\t\t\t};\n\t\t},\n\t};\n}\n\nfunction buildWatchdogSystemPrompt(ctx: ExtensionContext): string {\n\treturn [\n\t\t\"You are the main-session subagent watchdog for Pi.\",\n\t\t`Working directory: ${ctx.cwd}`,\n\t\t\"Review only the supplied parent turn delta. Inspect repository files only when needed to verify a concrete concern.\",\n\t\t\"You are read-only. You may use read, grep, find, and ls. Do not edit files, run shell commands, spawn agents, or mutate state.\",\n\t\t\"Emit warnings only by calling watchdog_warn. Freeform assistant text is ignored and must not be used to report warnings.\",\n\t\t\"Emit only medium/high confidence actionable concerns or blockers: missed user constraints, correctness risks, test gaps that matter, unsafe changes, stale facts, loop risks, or scope drift.\",\n\t\t\"Do not emit nits, style preferences, low-confidence guesses, informational notes, praise, or summaries.\",\n\t\t\"If the turn is clean, call no tools and end normally.\",\n\t\t\"Use severity='blocker' only when the issue should stop acceptance until addressed; otherwise use severity='concern'.\",\n\t].join(\"\\n\");\n}\n\nfunction buildReviewPrompt(request: WatchdogReviewRequest, selection: WatchdogReviewModelSelection): string {\n\treturn [\n\t\t\"Review this parent-session turn delta for subagent-watchdog-worthy issues.\",\n\t\t`Review id: ${request.reviewId}; epoch: ${request.epoch}; review model: ${fullModelId(selection.model)}; thinking: ${selection.thinkingLevel}.`,\n\t\t\"Call watchdog_warn for each qualifying concern or blocker. Call no tools when clean.\",\n\t\t\"<turn_delta>\",\n\t\trequest.delta,\n\t\t\"</turn_delta>\",\n\t].join(\"\\n\\n\");\n}\n\nfunction finalStopReason(agent: Agent): \"stop\" | \"error\" | \"aborted\" | \"length\" {\n\tfor (let index = agent.state.messages.length - 1; index >= 0; index--) {\n\t\tconst message = agent.state.messages[index];\n\t\tif (message && typeof message === \"object\" && (message as { role?: unknown }).role === \"assistant\") {\n\t\t\tconst stopReason = (message as { stopReason?: unknown }).stopReason;\n\t\t\tif (stopReason === \"error\" || stopReason === \"aborted\" || stopReason === \"length\") return stopReason;\n\t\t\treturn \"stop\";\n\t\t}\n\t}\n\treturn \"stop\";\n}\n\nfunction resolveContext(provider: WatchdogContextProvider): ExtensionContext | undefined {\n\treturn typeof provider === \"function\" ? provider() : provider;\n}\n\nexport function createMainWatchdogReview(provider: WatchdogContextProvider, options: CreateMainWatchdogReviewOptions = {}): WatchdogReviewFunction {\n\treturn async (request) => {\n\t\tconst ctx = resolveContext(provider);\n\t\tif (!ctx) throw new Error(\"Main watchdog review cannot run without an active Pi extension context.\");\n\t\tif (ctx.signal?.aborted || request.signal?.aborted) return { stopReason: \"aborted\" };\n\t\tconst selection = await resolveWatchdogReviewModel(ctx, request.config, {\n\t\t\tcurrentThinkingLevel: options.getThinkingLevel?.(),\n\t\t});\n\t\tif (ctx.signal?.aborted || request.signal?.aborted) return { stopReason: \"aborted\" };\n\t\tconst auth = selection.auth;\n\t\tconst baseStreamFn = options.streamFn ?? streamSimple;\n\t\tconst streamFn: StreamFn = (model, context, streamOptions) => baseStreamFn(model, context, {\n\t\t\t...streamOptions,\n\t\t\t...(auth.apiKey ? { apiKey: auth.apiKey } : {}),\n\t\t\tenv: auth.env || streamOptions?.env ? { ...(auth.env ?? {}), ...(streamOptions?.env ?? {}) } : undefined,\n\t\t\theaders: { ...(streamOptions?.headers ?? {}), ...(auth.headers ?? {}) },\n\t\t});\n\t\tconst tools = [\n\t\t\t...(options.createReadOnlyTools ?? createReadOnlyTools)(ctx.cwd).filter((tool) => WATCHDOG_ALLOWED_TOOL_NAMES.has(tool.name) && tool.name !== \"watchdog_warn\"),\n\t\t\tcreateWatchdogWarnTool(request),\n\t\t];\n\t\tconst agent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: buildWatchdogSystemPrompt(ctx),\n\t\t\t\tmodel: selection.model,\n\t\t\t\tthinkingLevel: selection.thinkingLevel,\n\t\t\t\ttools,\n\t\t\t},\n\t\t\tconvertToLlm,\n\t\t\tstreamFn,\n\t\t\tgetApiKey: (providerName) => providerName === selection.model.provider ? auth.apiKey : undefined,\n\t\t\tbeforeToolCall: async ({ toolCall }) => WATCHDOG_ALLOWED_TOOL_NAMES.has(toolCall.name)\n\t\t\t\t? undefined\n\t\t\t\t: { block: true, reason: `Watchdog reviews are read-only; tool '${toolCall.name}' is not allowed.` },\n\t\t\ttoolExecution: \"sequential\",\n\t\t});\n\t\tconst abort = () => agent.abort();\n\t\tctx.signal?.addEventListener(\"abort\", abort, { once: true });\n\t\trequest.signal?.addEventListener(\"abort\", abort, { once: true });\n\t\ttry {\n\t\t\tif (ctx.signal?.aborted || request.signal?.aborted) return { stopReason: \"aborted\" };\n\t\t\tawait agent.prompt(buildReviewPrompt(request, selection));\n\t\t} finally {\n\t\t\tctx.signal?.removeEventListener(\"abort\", abort);\n\t\t\trequest.signal?.removeEventListener(\"abort\", abort);\n\t\t}\n\t\treturn { stopReason: finalStopReason(agent) };\n\t};\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ExtensionContext } from "@
|
|
1
|
+
import type { ExtensionContext } from "@ashx-j/lunr";
|
|
2
2
|
import { type WatchdogLspDiagnosticsFunction } from "./lsp-diagnostics.ts";
|
|
3
3
|
import { type ResolvedWatchdogConfig, type WatchdogEndpointConfig, type WatchdogLspRuntimeSnapshot, type WatchdogRuntimeStatus, type WatchdogSettingsError, type WatchdogSettingsResult, type WatchdogSettingsSource, type WatchdogWarning, type WatchdogWarningDetails } from "./types.ts";
|
|
4
4
|
type ReviewStopReason = "stop" | "error" | "aborted" | "length";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/watchdog/runtime.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGxE,OAAO,EAKN,KAAK,8BAA8B,EACnC,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACN,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,MAAM,YAAY,CAAC;AAGpB,KAAK,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEhE,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;IAC/C,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,oBAAoB,GAAG,IAAI,CAAC;AAE5I,MAAM,WAAW,uBAAuB;IACvC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC;IACnF,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,KAAK,CAAC;IACxB,aAAa,EAAE,YAAY,GAAG,YAAY,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,GAAG,EAAE,0BAA0B,CAAC;CAChC;AAOD,UAAU,0BAA0B;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,sBAAsB,CAAC;IACzG,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAC3D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,8BAA8B,CAAC;CAChD;AAED,KAAK,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AAuBjD,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2F;IACzH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0D;IACzF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAChE,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,sBAAsB,CAAsB;IACpD,OAAO,CAAC,oBAAoB,CAA0E;IACtG,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,6BAA6B,CAA8B;IACnE,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,mBAAmB,CAAqC;IAChE,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,4BAA4B,CAAS;IAC7C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,WAAW,CAAqC;IACxD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,wBAAwB,CAA0C;IAC1E,OAAO,CAAC,2BAA2B,CAAqB;IACxD,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,wBAAwB,CAAS;IACzC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAAK;IAEzB,YAAY,OAAO,GAAE,0BAA+B,EAcnD;IAED,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAOlC;IAED,aAAa,CAAC,GAAG,SAAW,GAAG,sBAAsB,CAmBpD;IAED,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,SAAW,GAAG,uBAAuB,CAK3E;IAED,eAAe,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAC,UAAU,CAAC,GAAG,IAAI,CAAA;KAAE,EAAE,GAAG,SAAW,GAAG,uBAAuB,CAU/I;IAED,iBAAiB,CAAC,GAAG,SAAW,GAAG,uBAAuB,CAKzD;IAED,oBAAoB,CAAC,GAAG,SAAW,GAAG,uBAAuB,CAM5D;IAED,KAAK,CAAC,OAAO,SAAU,EAAE,OAAO,GAAE;QAAE,yBAAyB,CAAC,EAAE,OAAO,CAAC;QAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI,CAsB9I;IAED,OAAO,IAAI,IAAI,CAgBd;IAED,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAO7D;IAED,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAgBpD;IAED,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIhC;IAEK,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoErE;IAED,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,sBAAsB,CAIvE;IAED,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAyBjD;IAEK,WAAW,CAAC,SAAS,SAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAErD;IAED,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,sBAAsB;YAWhB,WAAW;IAsDzB,OAAO,CAAC,4BAA4B;IAWpC,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,uBAAuB;IAQ/B,OAAO,CAAC,4BAA4B;YActB,qBAAqB;IAqDnC,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,cAAc;CAStB","sourcesContent":["// @ts-nocheck\nimport { createHash } from \"node:crypto\";\nimport type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { computeWatchdogRepoChangeSignature, eventIndicatesRepoEdit, type WatchdogRepoChangeSignature } from \"./change-signature.ts\";\nimport { WatchdogEmissionGuard } from \"./emission-guard.ts\";\nimport {\n\tcollectWatchdogLspDiagnostics,\n\tformatWatchdogLspDiagnosticsBlock,\n\tWatchdogLspDiagnosticsLedger,\n\twatchdogWarningFromLspDiagnostics,\n\ttype WatchdogLspDiagnosticsFunction,\n} from \"./lsp-diagnostics.ts\";\nimport { resolveWatchdogConfig } from \"./settings.ts\";\nimport { formatWatchdogTurnDelta } from \"./turn-delta.ts\";\nimport {\n\ttype ResolvedWatchdogConfig,\n\ttype WatchdogEndpointConfig,\n\ttype WatchdogLspRuntimeSnapshot,\n\ttype WatchdogRuntimeStatus,\n\ttype WatchdogSettingsError,\n\ttype WatchdogSettingsResult,\n\ttype WatchdogSettingsSource,\n\ttype WatchdogWarning,\n\ttype WatchdogWarningDetails,\n} from \"./types.ts\";\nimport { normalizeWatchdogWarningDetails } from \"./warning-format.ts\";\n\ntype ReviewStopReason = \"stop\" | \"error\" | \"aborted\" | \"length\";\n\nexport interface WatchdogReviewResult {\n\twarnings?: WatchdogWarning[];\n\tstopReason?: ReviewStopReason;\n}\n\nexport interface WatchdogReviewRequest {\n\tdelta: string;\n\tepoch: number;\n\treviewId: number;\n\tconfig: ResolvedWatchdogConfig;\n\temitWarning(warning: WatchdogWarning): boolean;\n\tsignal?: AbortSignal;\n}\n\nexport type WatchdogReviewFunction = (request: WatchdogReviewRequest) => Promise<WatchdogReviewResult | void> | WatchdogReviewResult | void;\n\nexport interface WatchdogRuntimeSnapshot {\n\tstatus: WatchdogRuntimeStatus;\n\tenabled: boolean;\n\tconfig: ResolvedWatchdogConfig;\n\tconfigOk: boolean;\n\terrors: WatchdogSettingsError[];\n\tsources: WatchdogSettingsSource[];\n\tbufferedDeltas: number;\n\tepoch: number;\n\tactiveReviewId?: number;\n\tsessionOverride?: boolean;\n\tsessionModelOverride?: Partial<Pick<WatchdogEndpointConfig, \"model\" | \"thinking\">>;\n\tlastWarning?: WatchdogWarningDetails;\n\tlastError?: string;\n\tfailedReviews: number;\n\tstaleReviews: number;\n\treviewConnected: boolean;\n\treviewDescription: string;\n\tautoFollowQueued: false;\n\treviewTrigger: \"turn-delta\" | \"repo-edits\";\n\tchangedPaths?: string[];\n\tlsp: WatchdogLspRuntimeSnapshot;\n}\n\ninterface Waiter {\n\tresolve(settled: boolean): void;\n\ttimer: ReturnType<typeof setTimeout>;\n}\n\ninterface MainWatchdogRuntimeOptions {\n\tcwd?: string;\n\tresolveConfig?: (cwd: string, options?: { session?: Record<string, unknown> }) => WatchdogSettingsResult;\n\treview?: WatchdogReviewFunction;\n\treviewDescription?: string;\n\tdisplayWarning?: (warning: WatchdogWarningDetails) => void;\n\treviewChangesOnly?: boolean;\n\tlspDiagnostics?: WatchdogLspDiagnosticsFunction;\n}\n\ntype ContextLike = Pick<ExtensionContext, \"cwd\">;\ntype ReviewDeltaOutcome = \"completed\" | \"timeout\" | \"stale\";\n\nconst DEFAULT_REVIEW: WatchdogReviewFunction = () => ({ warnings: [] });\nconst MAX_REVIEW_INPUT_CHARS = 24_000;\nconst REVIEW_DELTA_SEPARATOR = \"\\n\\n---\\n\\n\";\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction promptFromBeforeAgentStart(event: unknown): string | undefined {\n\tif (!event || typeof event !== \"object\") return undefined;\n\tconst input = event as { prompt?: unknown; systemPrompt?: unknown };\n\tif (typeof input.prompt === \"string\") return input.prompt;\n\tif (typeof input.systemPrompt === \"string\") return input.systemPrompt;\n\treturn undefined;\n}\n\nfunction reviewInputSignature(input: string): string {\n\treturn createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nexport class MainWatchdogRuntime {\n\tprivate cwd: string;\n\tprivate readonly resolveConfig: (cwd: string, options?: { session?: Record<string, unknown> }) => WatchdogSettingsResult;\n\tprivate readonly review: WatchdogReviewFunction;\n\tprivate readonly reviewConnected: boolean;\n\tprivate readonly reviewDescription: string;\n\tprivate readonly displayWarning: ((warning: WatchdogWarningDetails) => void) | undefined;\n\tprivate readonly reviewChangesOnly: boolean;\n\tprivate readonly lspDiagnostics: WatchdogLspDiagnosticsFunction;\n\tprivate readonly lspLedger = new WatchdogLspDiagnosticsLedger();\n\tprivate configResult: WatchdogSettingsResult;\n\tprivate sessionOverrideEnabled: boolean | undefined;\n\tprivate sessionModelOverride: Partial<Pick<WatchdogEndpointConfig, \"model\" | \"thinking\">> | undefined;\n\tprivate status: WatchdogRuntimeStatus = \"idle\";\n\tprivate pendingDeltas: string[] = [];\n\tprivate pendingDeltaChars = 0;\n\tprivate guard = new WatchdogEmissionGuard();\n\tprivate guardMaxWarnings: number | null = null;\n\tprivate epoch = 0;\n\tprivate reviewIdCounter = 0;\n\tprivate agentEndIdCounter = 0;\n\tprivate activeAgentEndId: number | undefined;\n\tprivate activeAgentEndAbortController: AbortController | undefined;\n\tprivate activeReviewId: number | undefined;\n\tprivate activeReviewWarning: WatchdogWarningDetails | undefined;\n\tprivate reviewing = false;\n\tprivate waitingAtAgentEnd = false;\n\tprivate disposed = false;\n\tprivate includeUserPromptInNextDelta = false;\n\tprivate userPrompt: string | undefined;\n\tprivate waiters: Waiter[] = [];\n\tprivate lastWarning: WatchdogWarningDetails | undefined;\n\tprivate lastError: string | undefined;\n\tprivate lastReviewInputSignature: string | undefined;\n\tprivate turnStartChangeSignature: WatchdogRepoChangeSignature | undefined;\n\tprivate lastReviewedChangeSignature: string | undefined;\n\tprivate currentChangedPaths: string[] | undefined;\n\tprivate lastLspSnapshot: WatchdogLspRuntimeSnapshot | undefined;\n\tprivate observedRepoEditThisTurn = false;\n\tprivate failedReviews = 0;\n\tprivate staleReviews = 0;\n\n\tconstructor(options: MainWatchdogRuntimeOptions = {}) {\n\t\tthis.cwd = options.cwd ?? process.cwd();\n\t\tthis.resolveConfig = options.resolveConfig ?? resolveWatchdogConfig;\n\t\tthis.review = options.review ?? DEFAULT_REVIEW;\n\t\tthis.reviewConnected = Boolean(options.review);\n\t\tthis.reviewDescription = options.reviewDescription ?? (options.review ? \"injected seam\" : \"not wired\");\n\t\tthis.displayWarning = options.displayWarning;\n\t\tthis.reviewChangesOnly = options.reviewChangesOnly === true;\n\t\tthis.lspDiagnostics = options.lspDiagnostics ?? collectWatchdogLspDiagnostics;\n\t\tthis.configResult = this.resolveConfig(this.cwd);\n\t\tthis.guardMaxWarnings = this.configResult.config.maxWarnings;\n\t\tthis.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });\n\t\tthis.turnStartChangeSignature = this.currentRepoChangeSignature();\n\t\tthis.lastReviewedChangeSignature = this.turnStartChangeSignature?.key;\n\t}\n\n\tbindSession(ctx: ContextLike): void {\n\t\tthis.cwd = ctx.cwd;\n\t\tthis.sessionOverrideEnabled = undefined;\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session_start\", { clearReviewInputSignature: true, resetChangeSignature: true, clearLspLedger: true });\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tthis.resetRepoChangeBaseline();\n\t}\n\n\trefreshConfig(cwd = this.cwd): WatchdogSettingsResult {\n\t\tthis.cwd = cwd;\n\t\tconst wasEnabled = this.isEnabled();\n\t\tconst session = this.sessionOverrideEnabled === undefined && this.sessionModelOverride === undefined\n\t\t\t? undefined\n\t\t\t: {\n\t\t\t\t...(this.sessionOverrideEnabled === undefined ? {} : { enabled: this.sessionOverrideEnabled }),\n\t\t\t\tmain: {\n\t\t\t\t\t...(this.sessionOverrideEnabled === undefined ? {} : { enabled: this.sessionOverrideEnabled }),\n\t\t\t\t\t...(this.sessionModelOverride ?? {}),\n\t\t\t\t},\n\t\t\t};\n\t\tthis.configResult = this.resolveConfig(this.cwd, session === undefined ? undefined : { session });\n\t\tif (this.configResult.config.maxWarnings !== this.guardMaxWarnings) {\n\t\t\tthis.guardMaxWarnings = this.configResult.config.maxWarnings;\n\t\t\tthis.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });\n\t\t}\n\t\tif (wasEnabled && !this.isEnabled()) this.invalidateActiveReview(\"watchdog disabled\");\n\t\treturn this.configResult;\n\t}\n\n\tsetSessionEnabled(enabled: boolean, cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionOverrideEnabled = enabled;\n\t\tthis.reset(\"session override\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tsetSessionModel(patch: { model?: string | null; thinking?: WatchdogEndpointConfig[\"thinking\"] | null }, cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tconst next = { ...(this.sessionModelOverride ?? {}) };\n\t\tif (patch.model === null) delete next.model;\n\t\telse if (patch.model !== undefined) next.model = patch.model;\n\t\tif (patch.thinking === null) delete next.thinking;\n\t\telse if (patch.thinking !== undefined) next.thinking = patch.thinking;\n\t\tthis.sessionModelOverride = next.model === undefined && next.thinking === undefined ? undefined : next;\n\t\tthis.reset(\"session model override\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tclearSessionModel(cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session model override cleared\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tclearSessionOverride(cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionOverrideEnabled = undefined;\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session override cleared\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\treset(_reason = \"reset\", options: { clearReviewInputSignature?: boolean; resetChangeSignature?: boolean; clearLspLedger?: boolean } = {}): void {\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.includeUserPromptInNextDelta = false;\n\t\tthis.userPrompt = undefined;\n\t\tthis.lastError = undefined;\n\t\tthis.currentChangedPaths = undefined;\n\t\tthis.observedRepoEditThisTurn = false;\n\t\tif (options.clearLspLedger) {\n\t\t\tthis.lspLedger.reset();\n\t\t\tthis.lastLspSnapshot = undefined;\n\t\t}\n\t\tif (options.clearReviewInputSignature) this.lastReviewInputSignature = undefined;\n\t\tif (options.resetChangeSignature) this.resetRepoChangeBaseline({ reviewed: true });\n\t\tthis.guard.reset();\n\t\tthis.resolveWaiters(true);\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.lastReviewInputSignature = undefined;\n\t\tthis.currentChangedPaths = undefined;\n\t\tthis.lastLspSnapshot = undefined;\n\t\tthis.lspLedger.reset();\n\t\tthis.observedRepoEditThisTurn = false;\n\t\tthis.resolveWaiters(false);\n\t}\n\n\thandleBeforeAgentStart(event: unknown, ctx: ContextLike): void {\n\t\tif (this.disposed) return;\n\t\tthis.reset(\"before_agent_start\");\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tthis.userPrompt = promptFromBeforeAgentStart(event);\n\t\tthis.includeUserPromptInNextDelta = Boolean(this.userPrompt?.trim());\n\t\tthis.resetRepoChangeBaseline();\n\t}\n\n\thandleTurnEnd(event: unknown, ctx: ContextLike): void {\n\t\tif (this.disposed) return;\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tif (!this.isEnabled()) return;\n\t\ttry {\n\t\t\tthis.observedRepoEditThisTurn ||= eventIndicatesRepoEdit(event);\n\t\t\tconst delta = formatWatchdogTurnDelta({\n\t\t\t\tincludeUserPrompt: this.includeUserPromptInNextDelta,\n\t\t\t\tuserPrompt: this.userPrompt,\n\t\t\t\tevents: [event],\n\t\t\t});\n\t\t\tthis.includeUserPromptInNextDelta = false;\n\t\t\tthis.enqueueDelta(delta);\n\t\t} catch (error) {\n\t\t\tthis.fail(`Failed to format watchdog turn delta: ${errorMessage(error)}`);\n\t\t}\n\t}\n\n\tenqueueDelta(delta: string): void {\n\t\tif (this.disposed || !delta.trim() || !this.isEnabled()) return;\n\t\tthis.appendBoundedDelta(delta);\n\t\tif (!this.reviewing && !this.waitingAtAgentEnd) this.status = \"queued\";\n\t}\n\n\tasync handleAgentEnd(_event: unknown, ctx: ContextLike): Promise<void> {\n\t\tif (this.disposed) return;\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tif (!this.isEnabled()) return;\n\t\tconst changeSignature = this.resolveReviewChangeSignature(ctx.cwd);\n\t\tif (this.reviewChangesOnly && !changeSignature) {\n\t\t\tthis.clearPendingDeltas();\n\t\t\tif (this.status === \"queued\") this.status = \"idle\";\n\t\t\tthis.resolveWaiters(true);\n\t\t\treturn;\n\t\t}\n\t\tif (changeSignature && changeSignature.key === this.lastReviewedChangeSignature) {\n\t\t\tthis.clearPendingDeltas();\n\t\t\tthis.status = \"idle\";\n\t\t\tthis.resolveWaiters(true);\n\t\t\treturn;\n\t\t}\n\t\tthis.waitingAtAgentEnd = true;\n\t\tconst agentEndEpoch = this.epoch;\n\t\tconst agentEndId = ++this.agentEndIdCounter;\n\t\tconst lspAbortController = new AbortController();\n\t\tthis.activeAgentEndId = agentEndId;\n\t\tthis.activeAgentEndAbortController = lspAbortController;\n\t\ttry {\n\t\t\tthis.guard.startModelUpdate();\n\t\t\tconst lspBlock = await this.collectLspDiagnostics(changeSignature, {\n\t\t\t\tepoch: agentEndEpoch,\n\t\t\t\tagentEndId,\n\t\t\t\tsignal: lspAbortController.signal,\n\t\t\t});\n\t\t\tif (this.activeAgentEndAbortController === lspAbortController) this.activeAgentEndAbortController = undefined;\n\t\t\tif (!this.isAgentEndCurrent(agentEndEpoch, agentEndId)) return;\n\t\t\tconst delta = this.buildReviewInput(changeSignature, lspBlock);\n\t\t\tthis.clearPendingDeltas();\n\t\t\tif (!delta.trim()) {\n\t\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\t\tif (this.status === \"queued\") this.status = \"idle\";\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst signature = reviewInputSignature(delta);\n\t\t\tif (!this.reviewChangesOnly && signature === this.lastReviewInputSignature) {\n\t\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\t\tthis.status = \"idle\";\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst outcome = await this.reviewDelta(delta, this.configResult.config.agentEndTimeoutMs);\n\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\tif (outcome === \"timeout\") {\n\t\t\t\tthis.staleReviews++;\n\t\t\t\tthis.invalidateActiveReview(\"agent-end timeout\");\n\t\t\t\tthis.status = \"stale\";\n\t\t\t\tthis.markLastWarningStale();\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (outcome === \"completed\" && this.status !== \"failed\" && this.status !== \"stale\") {\n\t\t\t\tthis.lastReviewInputSignature = signature;\n\t\t\t\tif (changeSignature) this.lastReviewedChangeSignature = changeSignature.key;\n\t\t\t\tthis.currentChangedPaths = changeSignature?.changedPaths;\n\t\t\t\tthis.status = \"idle\";\n\t\t\t}\n\t\t\tthis.resolveWaiters(true);\n\t\t} finally {\n\t\t\tif (this.activeAgentEndAbortController === lspAbortController) this.activeAgentEndAbortController = undefined;\n\t\t\tif (this.activeAgentEndId === agentEndId) this.activeAgentEndId = undefined;\n\t\t}\n\t}\n\n\trecordDisplayedWarning(warning: WatchdogWarning): WatchdogWarningDetails {\n\t\tconst details = normalizeWatchdogWarningDetails(warning, { state: \"displayed\", source: warning.source ?? \"main\" });\n\t\tthis.lastWarning = details;\n\t\treturn details;\n\t}\n\n\tgetSnapshot(cwd?: string): WatchdogRuntimeSnapshot {\n\t\tif (cwd) this.refreshConfig(cwd);\n\t\treturn {\n\t\t\tstatus: this.status,\n\t\t\tenabled: this.isEnabled(),\n\t\t\tconfig: this.configResult.config,\n\t\t\tconfigOk: this.configResult.ok,\n\t\t\terrors: [...this.configResult.errors],\n\t\t\tsources: [...this.configResult.sources],\n\t\t\tbufferedDeltas: this.pendingDeltas.length,\n\t\t\tepoch: this.epoch,\n\t\t\t...(this.activeReviewId !== undefined ? { activeReviewId: this.activeReviewId } : {}),\n\t\t\t...(this.sessionOverrideEnabled !== undefined ? { sessionOverride: this.sessionOverrideEnabled } : {}),\n\t\t\t...(this.sessionModelOverride !== undefined ? { sessionModelOverride: { ...this.sessionModelOverride } } : {}),\n\t\t\t...(this.lastWarning ? { lastWarning: this.lastWarning } : {}),\n\t\t\t...(this.lastError ? { lastError: this.lastError } : {}),\n\t\t\tfailedReviews: this.failedReviews,\n\t\t\tstaleReviews: this.staleReviews,\n\t\t\treviewConnected: this.reviewConnected,\n\t\t\treviewDescription: this.reviewDescription,\n\t\t\tautoFollowQueued: false,\n\t\t\treviewTrigger: this.reviewChangesOnly ? \"repo-edits\" : \"turn-delta\",\n\t\t\t...(this.currentChangedPaths?.length ? { changedPaths: [...this.currentChangedPaths] } : {}),\n\t\t\tlsp: this.lspSnapshot(),\n\t\t};\n\t}\n\n\tasync waitForIdle(timeoutMs = 1_000): Promise<boolean> {\n\t\treturn this.waitForSettled(timeoutMs);\n\t}\n\n\tprivate isEnabled(): boolean {\n\t\treturn this.configResult.ok && this.configResult.config.main.enabled;\n\t}\n\n\tprivate abortActiveAgentEnd(): void {\n\t\tthis.activeAgentEndAbortController?.abort();\n\t\tthis.activeAgentEndAbortController = undefined;\n\t\tthis.activeAgentEndId = undefined;\n\t}\n\n\tprivate isAgentEndCurrent(epoch: number, agentEndId: number): boolean {\n\t\treturn !this.disposed && this.epoch === epoch && this.activeAgentEndId === agentEndId && this.waitingAtAgentEnd && this.isEnabled();\n\t}\n\n\tprivate isCurrent(epoch: number, reviewId: number): boolean {\n\t\treturn !this.disposed && this.epoch === epoch && this.activeReviewId === reviewId;\n\t}\n\n\tprivate acceptWarning(epoch: number, reviewId: number, warning: WatchdogWarning): boolean {\n\t\tif (!this.isCurrent(epoch, reviewId) || !this.isEnabled()) return false;\n\t\tconst decision = this.guard.evaluate(warning);\n\t\tif (!decision.accepted) return false;\n\t\tconst details = normalizeWatchdogWarningDetails(warning, {\n\t\t\tstate: \"candidate\",\n\t\t\tsource: warning.source ?? \"main\",\n\t\t\tidentity: decision.identity,\n\t\t});\n\t\tthis.lastWarning = details;\n\t\tthis.activeReviewWarning = details;\n\t\treturn true;\n\t}\n\n\tprivate displayBoundaryWarning(warning: WatchdogWarning): boolean {\n\t\tif (!this.isEnabled()) return false;\n\t\tconst decision = this.guard.evaluate(warning);\n\t\tif (!decision.accepted) return false;\n\t\tconst details = normalizeWatchdogWarningDetails(warning, {\n\t\t\tstate: \"displayed\",\n\t\t\tsource: warning.source ?? \"main\",\n\t\t\tidentity: decision.identity,\n\t\t\tdisplayedAt: new Date().toISOString(),\n\t\t});\n\t\tthis.lastWarning = details;\n\t\tthis.displayWarning?.(details);\n\t\treturn true;\n\t}\n\n\tprivate invalidateActiveReview(_reason: string): void {\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t}\n\n\tprivate async reviewDelta(delta: string, timeoutMs: number): Promise<ReviewDeltaOutcome> {\n\t\tif (this.reviewing || this.disposed) return \"stale\";\n\t\tthis.reviewing = true;\n\t\tconst reviewEpoch = this.epoch;\n\t\tconst reviewId = ++this.reviewIdCounter;\n\t\tthis.activeReviewId = reviewId;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.status = \"reviewing\";\n\t\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\t\tconst abortController = new AbortController();\n\t\tconst reviewPromise = Promise.resolve().then(() => this.review({\n\t\t\tdelta,\n\t\t\tepoch: reviewEpoch,\n\t\t\treviewId,\n\t\t\tconfig: this.configResult.config,\n\t\t\tsignal: abortController.signal,\n\t\t\temitWarning: (warning) => this.acceptWarning(reviewEpoch, reviewId, warning),\n\t\t}));\n\t\ttry {\n\t\t\tconst result = await Promise.race([\n\t\t\t\treviewPromise,\n\t\t\t\tnew Promise<\"timeout\">((resolve) => {\n\t\t\t\t\ttimeout = setTimeout(() => resolve(\"timeout\"), timeoutMs);\n\t\t\t\t}),\n\t\t\t]);\n\t\t\tif (result === \"timeout\") {\n\t\t\t\tabortController.abort();\n\t\t\t\treturn \"timeout\";\n\t\t\t}\n\t\t\tif (!this.isCurrent(reviewEpoch, reviewId)) return \"stale\";\n\t\t\tfor (const warning of result?.warnings ?? []) this.acceptWarning(reviewEpoch, reviewId, warning);\n\t\t\tif (result?.stopReason && result.stopReason !== \"stop\") {\n\t\t\t\tthis.fail(`Watchdog review ended with stop reason '${result.stopReason}'.`);\n\t\t\t\treturn \"completed\";\n\t\t\t}\n\t\t\tthis.displayAcceptedReviewWarning();\n\t\t\treturn \"completed\";\n\t\t} catch (error) {\n\t\t\tif (this.isCurrent(reviewEpoch, reviewId)) {\n\t\t\t\tthis.fail(`Watchdog review failed: ${errorMessage(error)}`);\n\t\t\t\treturn \"completed\";\n\t\t\t}\n\t\t\treturn \"stale\";\n\t\t} finally {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t\tif (this.epoch === reviewEpoch && this.activeReviewId === reviewId) {\n\t\t\t\tthis.reviewing = false;\n\t\t\t\tthis.activeReviewId = undefined;\n\t\t\t\tthis.activeReviewWarning = undefined;\n\t\t\t}\n\t\t\tthis.resolveWaiters(this.isSettled());\n\t\t}\n\t}\n\n\tprivate displayAcceptedReviewWarning(): void {\n\t\tif (!this.activeReviewWarning) return;\n\t\tconst details: WatchdogWarningDetails = {\n\t\t\t...this.activeReviewWarning,\n\t\t\tstate: \"displayed\",\n\t\t\tdisplayedAt: new Date().toISOString(),\n\t\t};\n\t\tthis.lastWarning = details;\n\t\tthis.displayWarning?.(details);\n\t}\n\n\tprivate currentRepoChangeSignature(cwd = this.cwd): WatchdogRepoChangeSignature | undefined {\n\t\treturn this.reviewChangesOnly ? computeWatchdogRepoChangeSignature(cwd) : undefined;\n\t}\n\n\tprivate resetRepoChangeBaseline(options: { cwd?: string; reviewed?: boolean } = {}): void {\n\t\tthis.turnStartChangeSignature = this.currentRepoChangeSignature(options.cwd ?? this.cwd);\n\t\tif (options.reviewed) this.lastReviewedChangeSignature = this.turnStartChangeSignature?.key;\n\t\telse this.lastReviewedChangeSignature ??= this.turnStartChangeSignature?.key;\n\t\tthis.currentChangedPaths = this.turnStartChangeSignature?.changedPaths;\n\t\tthis.observedRepoEditThisTurn = false;\n\t}\n\n\tprivate resolveReviewChangeSignature(cwd = this.cwd): WatchdogRepoChangeSignature | undefined {\n\t\tif (!this.reviewChangesOnly) return undefined;\n\t\tconst current = this.currentRepoChangeSignature(cwd);\n\t\tif (current) {\n\t\t\tthis.currentChangedPaths = current.changedPaths;\n\t\t\tif (current.key === this.turnStartChangeSignature?.key) return undefined;\n\t\t\tif (current.changedPaths.length === 0) return undefined;\n\t\t\treturn current;\n\t\t}\n\t\treturn this.observedRepoEditThisTurn\n\t\t\t? { root: cwd, key: `observed-edit:${this.epoch}:${this.reviewIdCounter}:${this.pendingDeltaChars}`, changedPaths: [] }\n\t\t\t: undefined;\n\t}\n\n\tprivate async collectLspDiagnostics(changeSignature: WatchdogRepoChangeSignature | undefined, current: { epoch: number; agentEndId: number; signal: AbortSignal }): Promise<string> {\n\t\tconst config = this.configResult.config.lsp;\n\t\tif (!config.enabled || !changeSignature?.changedPaths.length) {\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\tenabled: config.enabled,\n\t\t\t\tstatus: config.enabled ? \"skipped\" : \"disabled\",\n\t\t\t\tcheckedPaths: [],\n\t\t\t\tskippedPaths: [],\n\t\t\t\tdiagnostics: [],\n\t\t\t\tdiagnosticCount: 0,\n\t\t\t\tfreshDiagnosticCount: 0,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\treturn \"\";\n\t\t}\n\t\ttry {\n\t\t\tconst raw = await this.lspDiagnostics({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\troot: changeSignature.root,\n\t\t\t\tchangedPaths: changeSignature.changedPaths,\n\t\t\t\tconfig,\n\t\t\t\tsignal: current.signal,\n\t\t\t});\n\t\t\tif (!this.isAgentEndCurrent(current.epoch, current.agentEndId)) return \"\";\n\t\t\tconst diagnosticCount = raw.diagnostics.length;\n\t\t\tconst fresh = this.lspLedger.reduce(raw);\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\t...fresh,\n\t\t\t\tenabled: true,\n\t\t\t\tdiagnosticCount,\n\t\t\t\tfreshDiagnosticCount: fresh.diagnostics.length,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\tconst warning = watchdogWarningFromLspDiagnostics(fresh);\n\t\t\tif (warning) this.displayBoundaryWarning(warning);\n\t\t\treturn formatWatchdogLspDiagnosticsBlock(fresh);\n\t\t} catch (error) {\n\t\t\tif (!this.isAgentEndCurrent(current.epoch, current.agentEndId)) return \"\";\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\tenabled: true,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tcheckedPaths: [],\n\t\t\t\tskippedPaths: changeSignature.changedPaths,\n\t\t\t\tdiagnostics: [],\n\t\t\t\tdiagnosticCount: 0,\n\t\t\t\tfreshDiagnosticCount: 0,\n\t\t\t\tmessage: `LSP diagnostics failed: ${errorMessage(error)}`,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\tprivate lspSnapshot(): WatchdogLspRuntimeSnapshot {\n\t\tif (this.lastLspSnapshot) return {\n\t\t\t...this.lastLspSnapshot,\n\t\t\tcheckedPaths: [...this.lastLspSnapshot.checkedPaths],\n\t\t\tskippedPaths: [...this.lastLspSnapshot.skippedPaths],\n\t\t\tdiagnostics: [...this.lastLspSnapshot.diagnostics],\n\t\t};\n\t\tconst enabled = this.isEnabled() && this.configResult.config.lsp.enabled;\n\t\treturn {\n\t\t\tenabled,\n\t\t\tstatus: enabled ? \"skipped\" : \"disabled\",\n\t\t\tcheckedPaths: [],\n\t\t\tskippedPaths: [],\n\t\t\tdiagnostics: [],\n\t\t\tdiagnosticCount: 0,\n\t\t\tfreshDiagnosticCount: 0,\n\t\t};\n\t}\n\n\tprivate appendBoundedDelta(delta: string): void {\n\t\tlet entry = delta.trim();\n\t\tif (!entry) return;\n\t\tif (entry.length > MAX_REVIEW_INPUT_CHARS) entry = entry.slice(-MAX_REVIEW_INPUT_CHARS);\n\t\tthis.pendingDeltas.push(entry);\n\t\tthis.pendingDeltaChars += entry.length;\n\t\twhile (this.pendingDeltas.length > 1 && this.pendingDeltaChars + (this.pendingDeltas.length - 1) * REVIEW_DELTA_SEPARATOR.length > MAX_REVIEW_INPUT_CHARS) {\n\t\t\tconst removed = this.pendingDeltas.shift();\n\t\t\tif (removed) this.pendingDeltaChars -= removed.length;\n\t\t}\n\t}\n\n\tprivate buildReviewInput(changeSignature?: WatchdogRepoChangeSignature, lspBlock = \"\"): string {\n\t\tconst input = this.pendingDeltas.join(REVIEW_DELTA_SEPARATOR);\n\t\tconst changes = changeSignature?.changedPaths.length\n\t\t\t? [\"Changed repo paths:\", ...changeSignature.changedPaths.slice(0, 200).map((file) => `- ${file}`)].join(\"\\n\")\n\t\t\t: \"\";\n\t\tconst contextPieces = [changes, lspBlock].filter(Boolean);\n\t\tif (!contextPieces.length) return input.length > MAX_REVIEW_INPUT_CHARS ? input.slice(-MAX_REVIEW_INPUT_CHARS) : input;\n\n\t\tconst maxContextLength = Math.floor(MAX_REVIEW_INPUT_CHARS / 2);\n\t\tconst maxPieceLength = Math.max(1_000, Math.floor(maxContextLength / contextPieces.length));\n\t\tconst boundedContext = contextPieces.map((piece) => piece.length > maxPieceLength\n\t\t\t? `${piece.slice(0, maxPieceLength - 6)}\\n- ...`\n\t\t\t: piece).join(REVIEW_DELTA_SEPARATOR);\n\t\tconst separatorLength = input ? REVIEW_DELTA_SEPARATOR.length : 0;\n\t\tconst inputBudget = MAX_REVIEW_INPUT_CHARS - boundedContext.length - separatorLength;\n\t\tconst boundedInput = inputBudget <= 0\n\t\t\t? \"\"\n\t\t\t: input.length > inputBudget\n\t\t\t\t? input.slice(-inputBudget)\n\t\t\t\t: input;\n\t\treturn [boundedContext, boundedInput].filter(Boolean).join(REVIEW_DELTA_SEPARATOR);\n\t}\n\n\tprivate clearPendingDeltas(): void {\n\t\tthis.pendingDeltas = [];\n\t\tthis.pendingDeltaChars = 0;\n\t}\n\n\tprivate fail(message: string): void {\n\t\tthis.failedReviews++;\n\t\tthis.lastError = message;\n\t\tthis.status = \"failed\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.resolveWaiters(true);\n\t}\n\n\tprivate markLastWarningStale(): void {\n\t\tif (!this.lastWarning || this.lastWarning.state === \"displayed\") return;\n\t\tthis.lastWarning = { ...this.lastWarning, stale: true, state: \"stale\" };\n\t}\n\n\tprivate isSettled(): boolean {\n\t\treturn !this.reviewing && this.pendingDeltas.length === 0;\n\t}\n\n\tprivate waitForSettled(timeoutMs: number): Promise<boolean> {\n\t\tif (this.isSettled()) return Promise.resolve(true);\n\t\treturn new Promise((resolve) => {\n\t\t\tconst waiter: Waiter = {\n\t\t\t\tresolve,\n\t\t\t\ttimer: setTimeout(() => {\n\t\t\t\t\tthis.waiters = this.waiters.filter((entry) => entry !== waiter);\n\t\t\t\t\tresolve(false);\n\t\t\t\t}, timeoutMs),\n\t\t\t};\n\t\t\tthis.waiters.push(waiter);\n\t\t});\n\t}\n\n\tprivate resolveWaiters(settled: boolean): void {\n\t\tif (!settled && !this.disposed) return;\n\t\tconst waiters = this.waiters;\n\t\tthis.waiters = [];\n\t\tfor (const waiter of waiters) {\n\t\t\tclearTimeout(waiter.timer);\n\t\t\twaiter.resolve(settled);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/watchdog/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { createHash } from \"node:crypto\";\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { computeWatchdogRepoChangeSignature, eventIndicatesRepoEdit, type WatchdogRepoChangeSignature } from \"./change-signature.ts\";\nimport { WatchdogEmissionGuard } from \"./emission-guard.ts\";\nimport {\n\tcollectWatchdogLspDiagnostics,\n\tformatWatchdogLspDiagnosticsBlock,\n\tWatchdogLspDiagnosticsLedger,\n\twatchdogWarningFromLspDiagnostics,\n\ttype WatchdogLspDiagnosticsFunction,\n} from \"./lsp-diagnostics.ts\";\nimport { resolveWatchdogConfig } from \"./settings.ts\";\nimport { formatWatchdogTurnDelta } from \"./turn-delta.ts\";\nimport {\n\ttype ResolvedWatchdogConfig,\n\ttype WatchdogEndpointConfig,\n\ttype WatchdogLspRuntimeSnapshot,\n\ttype WatchdogRuntimeStatus,\n\ttype WatchdogSettingsError,\n\ttype WatchdogSettingsResult,\n\ttype WatchdogSettingsSource,\n\ttype WatchdogWarning,\n\ttype WatchdogWarningDetails,\n} from \"./types.ts\";\nimport { normalizeWatchdogWarningDetails } from \"./warning-format.ts\";\n\ntype ReviewStopReason = \"stop\" | \"error\" | \"aborted\" | \"length\";\n\nexport interface WatchdogReviewResult {\n\twarnings?: WatchdogWarning[];\n\tstopReason?: ReviewStopReason;\n}\n\nexport interface WatchdogReviewRequest {\n\tdelta: string;\n\tepoch: number;\n\treviewId: number;\n\tconfig: ResolvedWatchdogConfig;\n\temitWarning(warning: WatchdogWarning): boolean;\n\tsignal?: AbortSignal;\n}\n\nexport type WatchdogReviewFunction = (request: WatchdogReviewRequest) => Promise<WatchdogReviewResult | void> | WatchdogReviewResult | void;\n\nexport interface WatchdogRuntimeSnapshot {\n\tstatus: WatchdogRuntimeStatus;\n\tenabled: boolean;\n\tconfig: ResolvedWatchdogConfig;\n\tconfigOk: boolean;\n\terrors: WatchdogSettingsError[];\n\tsources: WatchdogSettingsSource[];\n\tbufferedDeltas: number;\n\tepoch: number;\n\tactiveReviewId?: number;\n\tsessionOverride?: boolean;\n\tsessionModelOverride?: Partial<Pick<WatchdogEndpointConfig, \"model\" | \"thinking\">>;\n\tlastWarning?: WatchdogWarningDetails;\n\tlastError?: string;\n\tfailedReviews: number;\n\tstaleReviews: number;\n\treviewConnected: boolean;\n\treviewDescription: string;\n\tautoFollowQueued: false;\n\treviewTrigger: \"turn-delta\" | \"repo-edits\";\n\tchangedPaths?: string[];\n\tlsp: WatchdogLspRuntimeSnapshot;\n}\n\ninterface Waiter {\n\tresolve(settled: boolean): void;\n\ttimer: ReturnType<typeof setTimeout>;\n}\n\ninterface MainWatchdogRuntimeOptions {\n\tcwd?: string;\n\tresolveConfig?: (cwd: string, options?: { session?: Record<string, unknown> }) => WatchdogSettingsResult;\n\treview?: WatchdogReviewFunction;\n\treviewDescription?: string;\n\tdisplayWarning?: (warning: WatchdogWarningDetails) => void;\n\treviewChangesOnly?: boolean;\n\tlspDiagnostics?: WatchdogLspDiagnosticsFunction;\n}\n\ntype ContextLike = Pick<ExtensionContext, \"cwd\">;\ntype ReviewDeltaOutcome = \"completed\" | \"timeout\" | \"stale\";\n\nconst DEFAULT_REVIEW: WatchdogReviewFunction = () => ({ warnings: [] });\nconst MAX_REVIEW_INPUT_CHARS = 24_000;\nconst REVIEW_DELTA_SEPARATOR = \"\\n\\n---\\n\\n\";\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction promptFromBeforeAgentStart(event: unknown): string | undefined {\n\tif (!event || typeof event !== \"object\") return undefined;\n\tconst input = event as { prompt?: unknown; systemPrompt?: unknown };\n\tif (typeof input.prompt === \"string\") return input.prompt;\n\tif (typeof input.systemPrompt === \"string\") return input.systemPrompt;\n\treturn undefined;\n}\n\nfunction reviewInputSignature(input: string): string {\n\treturn createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nexport class MainWatchdogRuntime {\n\tprivate cwd: string;\n\tprivate readonly resolveConfig: (cwd: string, options?: { session?: Record<string, unknown> }) => WatchdogSettingsResult;\n\tprivate readonly review: WatchdogReviewFunction;\n\tprivate readonly reviewConnected: boolean;\n\tprivate readonly reviewDescription: string;\n\tprivate readonly displayWarning: ((warning: WatchdogWarningDetails) => void) | undefined;\n\tprivate readonly reviewChangesOnly: boolean;\n\tprivate readonly lspDiagnostics: WatchdogLspDiagnosticsFunction;\n\tprivate readonly lspLedger = new WatchdogLspDiagnosticsLedger();\n\tprivate configResult: WatchdogSettingsResult;\n\tprivate sessionOverrideEnabled: boolean | undefined;\n\tprivate sessionModelOverride: Partial<Pick<WatchdogEndpointConfig, \"model\" | \"thinking\">> | undefined;\n\tprivate status: WatchdogRuntimeStatus = \"idle\";\n\tprivate pendingDeltas: string[] = [];\n\tprivate pendingDeltaChars = 0;\n\tprivate guard = new WatchdogEmissionGuard();\n\tprivate guardMaxWarnings: number | null = null;\n\tprivate epoch = 0;\n\tprivate reviewIdCounter = 0;\n\tprivate agentEndIdCounter = 0;\n\tprivate activeAgentEndId: number | undefined;\n\tprivate activeAgentEndAbortController: AbortController | undefined;\n\tprivate activeReviewId: number | undefined;\n\tprivate activeReviewWarning: WatchdogWarningDetails | undefined;\n\tprivate reviewing = false;\n\tprivate waitingAtAgentEnd = false;\n\tprivate disposed = false;\n\tprivate includeUserPromptInNextDelta = false;\n\tprivate userPrompt: string | undefined;\n\tprivate waiters: Waiter[] = [];\n\tprivate lastWarning: WatchdogWarningDetails | undefined;\n\tprivate lastError: string | undefined;\n\tprivate lastReviewInputSignature: string | undefined;\n\tprivate turnStartChangeSignature: WatchdogRepoChangeSignature | undefined;\n\tprivate lastReviewedChangeSignature: string | undefined;\n\tprivate currentChangedPaths: string[] | undefined;\n\tprivate lastLspSnapshot: WatchdogLspRuntimeSnapshot | undefined;\n\tprivate observedRepoEditThisTurn = false;\n\tprivate failedReviews = 0;\n\tprivate staleReviews = 0;\n\n\tconstructor(options: MainWatchdogRuntimeOptions = {}) {\n\t\tthis.cwd = options.cwd ?? process.cwd();\n\t\tthis.resolveConfig = options.resolveConfig ?? resolveWatchdogConfig;\n\t\tthis.review = options.review ?? DEFAULT_REVIEW;\n\t\tthis.reviewConnected = Boolean(options.review);\n\t\tthis.reviewDescription = options.reviewDescription ?? (options.review ? \"injected seam\" : \"not wired\");\n\t\tthis.displayWarning = options.displayWarning;\n\t\tthis.reviewChangesOnly = options.reviewChangesOnly === true;\n\t\tthis.lspDiagnostics = options.lspDiagnostics ?? collectWatchdogLspDiagnostics;\n\t\tthis.configResult = this.resolveConfig(this.cwd);\n\t\tthis.guardMaxWarnings = this.configResult.config.maxWarnings;\n\t\tthis.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });\n\t\tthis.turnStartChangeSignature = this.currentRepoChangeSignature();\n\t\tthis.lastReviewedChangeSignature = this.turnStartChangeSignature?.key;\n\t}\n\n\tbindSession(ctx: ContextLike): void {\n\t\tthis.cwd = ctx.cwd;\n\t\tthis.sessionOverrideEnabled = undefined;\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session_start\", { clearReviewInputSignature: true, resetChangeSignature: true, clearLspLedger: true });\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tthis.resetRepoChangeBaseline();\n\t}\n\n\trefreshConfig(cwd = this.cwd): WatchdogSettingsResult {\n\t\tthis.cwd = cwd;\n\t\tconst wasEnabled = this.isEnabled();\n\t\tconst session = this.sessionOverrideEnabled === undefined && this.sessionModelOverride === undefined\n\t\t\t? undefined\n\t\t\t: {\n\t\t\t\t...(this.sessionOverrideEnabled === undefined ? {} : { enabled: this.sessionOverrideEnabled }),\n\t\t\t\tmain: {\n\t\t\t\t\t...(this.sessionOverrideEnabled === undefined ? {} : { enabled: this.sessionOverrideEnabled }),\n\t\t\t\t\t...(this.sessionModelOverride ?? {}),\n\t\t\t\t},\n\t\t\t};\n\t\tthis.configResult = this.resolveConfig(this.cwd, session === undefined ? undefined : { session });\n\t\tif (this.configResult.config.maxWarnings !== this.guardMaxWarnings) {\n\t\t\tthis.guardMaxWarnings = this.configResult.config.maxWarnings;\n\t\t\tthis.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });\n\t\t}\n\t\tif (wasEnabled && !this.isEnabled()) this.invalidateActiveReview(\"watchdog disabled\");\n\t\treturn this.configResult;\n\t}\n\n\tsetSessionEnabled(enabled: boolean, cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionOverrideEnabled = enabled;\n\t\tthis.reset(\"session override\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tsetSessionModel(patch: { model?: string | null; thinking?: WatchdogEndpointConfig[\"thinking\"] | null }, cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tconst next = { ...(this.sessionModelOverride ?? {}) };\n\t\tif (patch.model === null) delete next.model;\n\t\telse if (patch.model !== undefined) next.model = patch.model;\n\t\tif (patch.thinking === null) delete next.thinking;\n\t\telse if (patch.thinking !== undefined) next.thinking = patch.thinking;\n\t\tthis.sessionModelOverride = next.model === undefined && next.thinking === undefined ? undefined : next;\n\t\tthis.reset(\"session model override\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tclearSessionModel(cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session model override cleared\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tclearSessionOverride(cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionOverrideEnabled = undefined;\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session override cleared\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\treset(_reason = \"reset\", options: { clearReviewInputSignature?: boolean; resetChangeSignature?: boolean; clearLspLedger?: boolean } = {}): void {\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.includeUserPromptInNextDelta = false;\n\t\tthis.userPrompt = undefined;\n\t\tthis.lastError = undefined;\n\t\tthis.currentChangedPaths = undefined;\n\t\tthis.observedRepoEditThisTurn = false;\n\t\tif (options.clearLspLedger) {\n\t\t\tthis.lspLedger.reset();\n\t\t\tthis.lastLspSnapshot = undefined;\n\t\t}\n\t\tif (options.clearReviewInputSignature) this.lastReviewInputSignature = undefined;\n\t\tif (options.resetChangeSignature) this.resetRepoChangeBaseline({ reviewed: true });\n\t\tthis.guard.reset();\n\t\tthis.resolveWaiters(true);\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.lastReviewInputSignature = undefined;\n\t\tthis.currentChangedPaths = undefined;\n\t\tthis.lastLspSnapshot = undefined;\n\t\tthis.lspLedger.reset();\n\t\tthis.observedRepoEditThisTurn = false;\n\t\tthis.resolveWaiters(false);\n\t}\n\n\thandleBeforeAgentStart(event: unknown, ctx: ContextLike): void {\n\t\tif (this.disposed) return;\n\t\tthis.reset(\"before_agent_start\");\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tthis.userPrompt = promptFromBeforeAgentStart(event);\n\t\tthis.includeUserPromptInNextDelta = Boolean(this.userPrompt?.trim());\n\t\tthis.resetRepoChangeBaseline();\n\t}\n\n\thandleTurnEnd(event: unknown, ctx: ContextLike): void {\n\t\tif (this.disposed) return;\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tif (!this.isEnabled()) return;\n\t\ttry {\n\t\t\tthis.observedRepoEditThisTurn ||= eventIndicatesRepoEdit(event);\n\t\t\tconst delta = formatWatchdogTurnDelta({\n\t\t\t\tincludeUserPrompt: this.includeUserPromptInNextDelta,\n\t\t\t\tuserPrompt: this.userPrompt,\n\t\t\t\tevents: [event],\n\t\t\t});\n\t\t\tthis.includeUserPromptInNextDelta = false;\n\t\t\tthis.enqueueDelta(delta);\n\t\t} catch (error) {\n\t\t\tthis.fail(`Failed to format watchdog turn delta: ${errorMessage(error)}`);\n\t\t}\n\t}\n\n\tenqueueDelta(delta: string): void {\n\t\tif (this.disposed || !delta.trim() || !this.isEnabled()) return;\n\t\tthis.appendBoundedDelta(delta);\n\t\tif (!this.reviewing && !this.waitingAtAgentEnd) this.status = \"queued\";\n\t}\n\n\tasync handleAgentEnd(_event: unknown, ctx: ContextLike): Promise<void> {\n\t\tif (this.disposed) return;\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tif (!this.isEnabled()) return;\n\t\tconst changeSignature = this.resolveReviewChangeSignature(ctx.cwd);\n\t\tif (this.reviewChangesOnly && !changeSignature) {\n\t\t\tthis.clearPendingDeltas();\n\t\t\tif (this.status === \"queued\") this.status = \"idle\";\n\t\t\tthis.resolveWaiters(true);\n\t\t\treturn;\n\t\t}\n\t\tif (changeSignature && changeSignature.key === this.lastReviewedChangeSignature) {\n\t\t\tthis.clearPendingDeltas();\n\t\t\tthis.status = \"idle\";\n\t\t\tthis.resolveWaiters(true);\n\t\t\treturn;\n\t\t}\n\t\tthis.waitingAtAgentEnd = true;\n\t\tconst agentEndEpoch = this.epoch;\n\t\tconst agentEndId = ++this.agentEndIdCounter;\n\t\tconst lspAbortController = new AbortController();\n\t\tthis.activeAgentEndId = agentEndId;\n\t\tthis.activeAgentEndAbortController = lspAbortController;\n\t\ttry {\n\t\t\tthis.guard.startModelUpdate();\n\t\t\tconst lspBlock = await this.collectLspDiagnostics(changeSignature, {\n\t\t\t\tepoch: agentEndEpoch,\n\t\t\t\tagentEndId,\n\t\t\t\tsignal: lspAbortController.signal,\n\t\t\t});\n\t\t\tif (this.activeAgentEndAbortController === lspAbortController) this.activeAgentEndAbortController = undefined;\n\t\t\tif (!this.isAgentEndCurrent(agentEndEpoch, agentEndId)) return;\n\t\t\tconst delta = this.buildReviewInput(changeSignature, lspBlock);\n\t\t\tthis.clearPendingDeltas();\n\t\t\tif (!delta.trim()) {\n\t\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\t\tif (this.status === \"queued\") this.status = \"idle\";\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst signature = reviewInputSignature(delta);\n\t\t\tif (!this.reviewChangesOnly && signature === this.lastReviewInputSignature) {\n\t\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\t\tthis.status = \"idle\";\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst outcome = await this.reviewDelta(delta, this.configResult.config.agentEndTimeoutMs);\n\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\tif (outcome === \"timeout\") {\n\t\t\t\tthis.staleReviews++;\n\t\t\t\tthis.invalidateActiveReview(\"agent-end timeout\");\n\t\t\t\tthis.status = \"stale\";\n\t\t\t\tthis.markLastWarningStale();\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (outcome === \"completed\" && this.status !== \"failed\" && this.status !== \"stale\") {\n\t\t\t\tthis.lastReviewInputSignature = signature;\n\t\t\t\tif (changeSignature) this.lastReviewedChangeSignature = changeSignature.key;\n\t\t\t\tthis.currentChangedPaths = changeSignature?.changedPaths;\n\t\t\t\tthis.status = \"idle\";\n\t\t\t}\n\t\t\tthis.resolveWaiters(true);\n\t\t} finally {\n\t\t\tif (this.activeAgentEndAbortController === lspAbortController) this.activeAgentEndAbortController = undefined;\n\t\t\tif (this.activeAgentEndId === agentEndId) this.activeAgentEndId = undefined;\n\t\t}\n\t}\n\n\trecordDisplayedWarning(warning: WatchdogWarning): WatchdogWarningDetails {\n\t\tconst details = normalizeWatchdogWarningDetails(warning, { state: \"displayed\", source: warning.source ?? \"main\" });\n\t\tthis.lastWarning = details;\n\t\treturn details;\n\t}\n\n\tgetSnapshot(cwd?: string): WatchdogRuntimeSnapshot {\n\t\tif (cwd) this.refreshConfig(cwd);\n\t\treturn {\n\t\t\tstatus: this.status,\n\t\t\tenabled: this.isEnabled(),\n\t\t\tconfig: this.configResult.config,\n\t\t\tconfigOk: this.configResult.ok,\n\t\t\terrors: [...this.configResult.errors],\n\t\t\tsources: [...this.configResult.sources],\n\t\t\tbufferedDeltas: this.pendingDeltas.length,\n\t\t\tepoch: this.epoch,\n\t\t\t...(this.activeReviewId !== undefined ? { activeReviewId: this.activeReviewId } : {}),\n\t\t\t...(this.sessionOverrideEnabled !== undefined ? { sessionOverride: this.sessionOverrideEnabled } : {}),\n\t\t\t...(this.sessionModelOverride !== undefined ? { sessionModelOverride: { ...this.sessionModelOverride } } : {}),\n\t\t\t...(this.lastWarning ? { lastWarning: this.lastWarning } : {}),\n\t\t\t...(this.lastError ? { lastError: this.lastError } : {}),\n\t\t\tfailedReviews: this.failedReviews,\n\t\t\tstaleReviews: this.staleReviews,\n\t\t\treviewConnected: this.reviewConnected,\n\t\t\treviewDescription: this.reviewDescription,\n\t\t\tautoFollowQueued: false,\n\t\t\treviewTrigger: this.reviewChangesOnly ? \"repo-edits\" : \"turn-delta\",\n\t\t\t...(this.currentChangedPaths?.length ? { changedPaths: [...this.currentChangedPaths] } : {}),\n\t\t\tlsp: this.lspSnapshot(),\n\t\t};\n\t}\n\n\tasync waitForIdle(timeoutMs = 1_000): Promise<boolean> {\n\t\treturn this.waitForSettled(timeoutMs);\n\t}\n\n\tprivate isEnabled(): boolean {\n\t\treturn this.configResult.ok && this.configResult.config.main.enabled;\n\t}\n\n\tprivate abortActiveAgentEnd(): void {\n\t\tthis.activeAgentEndAbortController?.abort();\n\t\tthis.activeAgentEndAbortController = undefined;\n\t\tthis.activeAgentEndId = undefined;\n\t}\n\n\tprivate isAgentEndCurrent(epoch: number, agentEndId: number): boolean {\n\t\treturn !this.disposed && this.epoch === epoch && this.activeAgentEndId === agentEndId && this.waitingAtAgentEnd && this.isEnabled();\n\t}\n\n\tprivate isCurrent(epoch: number, reviewId: number): boolean {\n\t\treturn !this.disposed && this.epoch === epoch && this.activeReviewId === reviewId;\n\t}\n\n\tprivate acceptWarning(epoch: number, reviewId: number, warning: WatchdogWarning): boolean {\n\t\tif (!this.isCurrent(epoch, reviewId) || !this.isEnabled()) return false;\n\t\tconst decision = this.guard.evaluate(warning);\n\t\tif (!decision.accepted) return false;\n\t\tconst details = normalizeWatchdogWarningDetails(warning, {\n\t\t\tstate: \"candidate\",\n\t\t\tsource: warning.source ?? \"main\",\n\t\t\tidentity: decision.identity,\n\t\t});\n\t\tthis.lastWarning = details;\n\t\tthis.activeReviewWarning = details;\n\t\treturn true;\n\t}\n\n\tprivate displayBoundaryWarning(warning: WatchdogWarning): boolean {\n\t\tif (!this.isEnabled()) return false;\n\t\tconst decision = this.guard.evaluate(warning);\n\t\tif (!decision.accepted) return false;\n\t\tconst details = normalizeWatchdogWarningDetails(warning, {\n\t\t\tstate: \"displayed\",\n\t\t\tsource: warning.source ?? \"main\",\n\t\t\tidentity: decision.identity,\n\t\t\tdisplayedAt: new Date().toISOString(),\n\t\t});\n\t\tthis.lastWarning = details;\n\t\tthis.displayWarning?.(details);\n\t\treturn true;\n\t}\n\n\tprivate invalidateActiveReview(_reason: string): void {\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t}\n\n\tprivate async reviewDelta(delta: string, timeoutMs: number): Promise<ReviewDeltaOutcome> {\n\t\tif (this.reviewing || this.disposed) return \"stale\";\n\t\tthis.reviewing = true;\n\t\tconst reviewEpoch = this.epoch;\n\t\tconst reviewId = ++this.reviewIdCounter;\n\t\tthis.activeReviewId = reviewId;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.status = \"reviewing\";\n\t\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\t\tconst abortController = new AbortController();\n\t\tconst reviewPromise = Promise.resolve().then(() => this.review({\n\t\t\tdelta,\n\t\t\tepoch: reviewEpoch,\n\t\t\treviewId,\n\t\t\tconfig: this.configResult.config,\n\t\t\tsignal: abortController.signal,\n\t\t\temitWarning: (warning) => this.acceptWarning(reviewEpoch, reviewId, warning),\n\t\t}));\n\t\ttry {\n\t\t\tconst result = await Promise.race([\n\t\t\t\treviewPromise,\n\t\t\t\tnew Promise<\"timeout\">((resolve) => {\n\t\t\t\t\ttimeout = setTimeout(() => resolve(\"timeout\"), timeoutMs);\n\t\t\t\t}),\n\t\t\t]);\n\t\t\tif (result === \"timeout\") {\n\t\t\t\tabortController.abort();\n\t\t\t\treturn \"timeout\";\n\t\t\t}\n\t\t\tif (!this.isCurrent(reviewEpoch, reviewId)) return \"stale\";\n\t\t\tfor (const warning of result?.warnings ?? []) this.acceptWarning(reviewEpoch, reviewId, warning);\n\t\t\tif (result?.stopReason && result.stopReason !== \"stop\") {\n\t\t\t\tthis.fail(`Watchdog review ended with stop reason '${result.stopReason}'.`);\n\t\t\t\treturn \"completed\";\n\t\t\t}\n\t\t\tthis.displayAcceptedReviewWarning();\n\t\t\treturn \"completed\";\n\t\t} catch (error) {\n\t\t\tif (this.isCurrent(reviewEpoch, reviewId)) {\n\t\t\t\tthis.fail(`Watchdog review failed: ${errorMessage(error)}`);\n\t\t\t\treturn \"completed\";\n\t\t\t}\n\t\t\treturn \"stale\";\n\t\t} finally {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t\tif (this.epoch === reviewEpoch && this.activeReviewId === reviewId) {\n\t\t\t\tthis.reviewing = false;\n\t\t\t\tthis.activeReviewId = undefined;\n\t\t\t\tthis.activeReviewWarning = undefined;\n\t\t\t}\n\t\t\tthis.resolveWaiters(this.isSettled());\n\t\t}\n\t}\n\n\tprivate displayAcceptedReviewWarning(): void {\n\t\tif (!this.activeReviewWarning) return;\n\t\tconst details: WatchdogWarningDetails = {\n\t\t\t...this.activeReviewWarning,\n\t\t\tstate: \"displayed\",\n\t\t\tdisplayedAt: new Date().toISOString(),\n\t\t};\n\t\tthis.lastWarning = details;\n\t\tthis.displayWarning?.(details);\n\t}\n\n\tprivate currentRepoChangeSignature(cwd = this.cwd): WatchdogRepoChangeSignature | undefined {\n\t\treturn this.reviewChangesOnly ? computeWatchdogRepoChangeSignature(cwd) : undefined;\n\t}\n\n\tprivate resetRepoChangeBaseline(options: { cwd?: string; reviewed?: boolean } = {}): void {\n\t\tthis.turnStartChangeSignature = this.currentRepoChangeSignature(options.cwd ?? this.cwd);\n\t\tif (options.reviewed) this.lastReviewedChangeSignature = this.turnStartChangeSignature?.key;\n\t\telse this.lastReviewedChangeSignature ??= this.turnStartChangeSignature?.key;\n\t\tthis.currentChangedPaths = this.turnStartChangeSignature?.changedPaths;\n\t\tthis.observedRepoEditThisTurn = false;\n\t}\n\n\tprivate resolveReviewChangeSignature(cwd = this.cwd): WatchdogRepoChangeSignature | undefined {\n\t\tif (!this.reviewChangesOnly) return undefined;\n\t\tconst current = this.currentRepoChangeSignature(cwd);\n\t\tif (current) {\n\t\t\tthis.currentChangedPaths = current.changedPaths;\n\t\t\tif (current.key === this.turnStartChangeSignature?.key) return undefined;\n\t\t\tif (current.changedPaths.length === 0) return undefined;\n\t\t\treturn current;\n\t\t}\n\t\treturn this.observedRepoEditThisTurn\n\t\t\t? { root: cwd, key: `observed-edit:${this.epoch}:${this.reviewIdCounter}:${this.pendingDeltaChars}`, changedPaths: [] }\n\t\t\t: undefined;\n\t}\n\n\tprivate async collectLspDiagnostics(changeSignature: WatchdogRepoChangeSignature | undefined, current: { epoch: number; agentEndId: number; signal: AbortSignal }): Promise<string> {\n\t\tconst config = this.configResult.config.lsp;\n\t\tif (!config.enabled || !changeSignature?.changedPaths.length) {\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\tenabled: config.enabled,\n\t\t\t\tstatus: config.enabled ? \"skipped\" : \"disabled\",\n\t\t\t\tcheckedPaths: [],\n\t\t\t\tskippedPaths: [],\n\t\t\t\tdiagnostics: [],\n\t\t\t\tdiagnosticCount: 0,\n\t\t\t\tfreshDiagnosticCount: 0,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\treturn \"\";\n\t\t}\n\t\ttry {\n\t\t\tconst raw = await this.lspDiagnostics({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\troot: changeSignature.root,\n\t\t\t\tchangedPaths: changeSignature.changedPaths,\n\t\t\t\tconfig,\n\t\t\t\tsignal: current.signal,\n\t\t\t});\n\t\t\tif (!this.isAgentEndCurrent(current.epoch, current.agentEndId)) return \"\";\n\t\t\tconst diagnosticCount = raw.diagnostics.length;\n\t\t\tconst fresh = this.lspLedger.reduce(raw);\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\t...fresh,\n\t\t\t\tenabled: true,\n\t\t\t\tdiagnosticCount,\n\t\t\t\tfreshDiagnosticCount: fresh.diagnostics.length,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\tconst warning = watchdogWarningFromLspDiagnostics(fresh);\n\t\t\tif (warning) this.displayBoundaryWarning(warning);\n\t\t\treturn formatWatchdogLspDiagnosticsBlock(fresh);\n\t\t} catch (error) {\n\t\t\tif (!this.isAgentEndCurrent(current.epoch, current.agentEndId)) return \"\";\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\tenabled: true,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tcheckedPaths: [],\n\t\t\t\tskippedPaths: changeSignature.changedPaths,\n\t\t\t\tdiagnostics: [],\n\t\t\t\tdiagnosticCount: 0,\n\t\t\t\tfreshDiagnosticCount: 0,\n\t\t\t\tmessage: `LSP diagnostics failed: ${errorMessage(error)}`,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\tprivate lspSnapshot(): WatchdogLspRuntimeSnapshot {\n\t\tif (this.lastLspSnapshot) return {\n\t\t\t...this.lastLspSnapshot,\n\t\t\tcheckedPaths: [...this.lastLspSnapshot.checkedPaths],\n\t\t\tskippedPaths: [...this.lastLspSnapshot.skippedPaths],\n\t\t\tdiagnostics: [...this.lastLspSnapshot.diagnostics],\n\t\t};\n\t\tconst enabled = this.isEnabled() && this.configResult.config.lsp.enabled;\n\t\treturn {\n\t\t\tenabled,\n\t\t\tstatus: enabled ? \"skipped\" : \"disabled\",\n\t\t\tcheckedPaths: [],\n\t\t\tskippedPaths: [],\n\t\t\tdiagnostics: [],\n\t\t\tdiagnosticCount: 0,\n\t\t\tfreshDiagnosticCount: 0,\n\t\t};\n\t}\n\n\tprivate appendBoundedDelta(delta: string): void {\n\t\tlet entry = delta.trim();\n\t\tif (!entry) return;\n\t\tif (entry.length > MAX_REVIEW_INPUT_CHARS) entry = entry.slice(-MAX_REVIEW_INPUT_CHARS);\n\t\tthis.pendingDeltas.push(entry);\n\t\tthis.pendingDeltaChars += entry.length;\n\t\twhile (this.pendingDeltas.length > 1 && this.pendingDeltaChars + (this.pendingDeltas.length - 1) * REVIEW_DELTA_SEPARATOR.length > MAX_REVIEW_INPUT_CHARS) {\n\t\t\tconst removed = this.pendingDeltas.shift();\n\t\t\tif (removed) this.pendingDeltaChars -= removed.length;\n\t\t}\n\t}\n\n\tprivate buildReviewInput(changeSignature?: WatchdogRepoChangeSignature, lspBlock = \"\"): string {\n\t\tconst input = this.pendingDeltas.join(REVIEW_DELTA_SEPARATOR);\n\t\tconst changes = changeSignature?.changedPaths.length\n\t\t\t? [\"Changed repo paths:\", ...changeSignature.changedPaths.slice(0, 200).map((file) => `- ${file}`)].join(\"\\n\")\n\t\t\t: \"\";\n\t\tconst contextPieces = [changes, lspBlock].filter(Boolean);\n\t\tif (!contextPieces.length) return input.length > MAX_REVIEW_INPUT_CHARS ? input.slice(-MAX_REVIEW_INPUT_CHARS) : input;\n\n\t\tconst maxContextLength = Math.floor(MAX_REVIEW_INPUT_CHARS / 2);\n\t\tconst maxPieceLength = Math.max(1_000, Math.floor(maxContextLength / contextPieces.length));\n\t\tconst boundedContext = contextPieces.map((piece) => piece.length > maxPieceLength\n\t\t\t? `${piece.slice(0, maxPieceLength - 6)}\\n- ...`\n\t\t\t: piece).join(REVIEW_DELTA_SEPARATOR);\n\t\tconst separatorLength = input ? REVIEW_DELTA_SEPARATOR.length : 0;\n\t\tconst inputBudget = MAX_REVIEW_INPUT_CHARS - boundedContext.length - separatorLength;\n\t\tconst boundedInput = inputBudget <= 0\n\t\t\t? \"\"\n\t\t\t: input.length > inputBudget\n\t\t\t\t? input.slice(-inputBudget)\n\t\t\t\t: input;\n\t\treturn [boundedContext, boundedInput].filter(Boolean).join(REVIEW_DELTA_SEPARATOR);\n\t}\n\n\tprivate clearPendingDeltas(): void {\n\t\tthis.pendingDeltas = [];\n\t\tthis.pendingDeltaChars = 0;\n\t}\n\n\tprivate fail(message: string): void {\n\t\tthis.failedReviews++;\n\t\tthis.lastError = message;\n\t\tthis.status = \"failed\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.resolveWaiters(true);\n\t}\n\n\tprivate markLastWarningStale(): void {\n\t\tif (!this.lastWarning || this.lastWarning.state === \"displayed\") return;\n\t\tthis.lastWarning = { ...this.lastWarning, stale: true, state: \"stale\" };\n\t}\n\n\tprivate isSettled(): boolean {\n\t\treturn !this.reviewing && this.pendingDeltas.length === 0;\n\t}\n\n\tprivate waitForSettled(timeoutMs: number): Promise<boolean> {\n\t\tif (this.isSettled()) return Promise.resolve(true);\n\t\treturn new Promise((resolve) => {\n\t\t\tconst waiter: Waiter = {\n\t\t\t\tresolve,\n\t\t\t\ttimer: setTimeout(() => {\n\t\t\t\t\tthis.waiters = this.waiters.filter((entry) => entry !== waiter);\n\t\t\t\t\tresolve(false);\n\t\t\t\t}, timeoutMs),\n\t\t\t};\n\t\t\tthis.waiters.push(waiter);\n\t\t});\n\t}\n\n\tprivate resolveWaiters(settled: boolean): void {\n\t\tif (!settled && !this.disposed) return;\n\t\tconst waiters = this.waiters;\n\t\tthis.waiters = [];\n\t\tfor (const waiter of waiters) {\n\t\t\tclearTimeout(waiter.timer);\n\t\t\twaiter.resolve(settled);\n\t\t}\n\t}\n}\n"]}
|