@ashx-j/lunr 0.2.26 → 0.2.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -1
- package/LICENSE +22 -0
- package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -1
- package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.d.ts +11 -1
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +6 -10
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
- package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-cron.js +94 -108
- package/dist/builtin-extensions/lunr-cron.js.map +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 +3 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
- package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +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 +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.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.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-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 +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.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -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 +14 -7
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
- package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
- package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
- package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +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 +4 -4
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
- 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-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 +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
- package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +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 +5 -3
- package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -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 +21 -12
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +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 +7 -24
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +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 +39 -77
- package/dist/builtin-extensions/pi-subagents/src/extension/index.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 +15 -31
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.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 +10 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- 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 +8 -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 +106 -24
- 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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +25 -5
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.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 +15 -5
- 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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +17 -8
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- 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-tps.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-tps.js +20 -17
- package/dist/builtin-extensions/pi-tps.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
- package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
- package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
- package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
- package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
- package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
- package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
- package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
- package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
- package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
- package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
- package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.js +48 -73
- package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
- package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
- package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
- package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
- package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
- package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.js +1 -1
- package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
- package/dist/cli/install-cli.d.ts.map +1 -1
- package/dist/cli/install-cli.js +38 -30
- package/dist/cli/install-cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +13 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +75 -11
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -0
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +40 -6
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +309 -76
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/browser/runtime.d.ts +2 -0
- package/dist/core/browser/runtime.d.ts.map +1 -1
- package/dist/core/browser/runtime.js +80 -45
- package/dist/core/browser/runtime.js.map +1 -1
- package/dist/core/browser/setup.d.ts.map +1 -1
- package/dist/core/browser/setup.js +12 -1
- package/dist/core/browser/setup.js.map +1 -1
- package/dist/core/computer-use/adapter.d.ts.map +1 -1
- package/dist/core/computer-use/adapter.js +7 -2
- package/dist/core/computer-use/adapter.js.map +1 -1
- package/dist/core/computer-use/image.d.ts.map +1 -1
- package/dist/core/computer-use/image.js +17 -5
- package/dist/core/computer-use/image.js.map +1 -1
- package/dist/core/computer-use/schemas.d.ts.map +1 -1
- package/dist/core/computer-use/schemas.js +23 -6
- package/dist/core/computer-use/schemas.js.map +1 -1
- package/dist/core/computer-use/workflow.d.ts.map +1 -1
- package/dist/core/computer-use/workflow.js +459 -119
- package/dist/core/computer-use/workflow.js.map +1 -1
- package/dist/core/cron/jobs.d.ts +26 -8
- package/dist/core/cron/jobs.d.ts.map +1 -1
- package/dist/core/cron/jobs.js +357 -232
- package/dist/core/cron/jobs.js.map +1 -1
- package/dist/core/cron/origin-context.d.ts +1 -0
- package/dist/core/cron/origin-context.d.ts.map +1 -1
- package/dist/core/cron/origin-context.js.map +1 -1
- package/dist/core/cron/scheduler.d.ts +22 -17
- package/dist/core/cron/scheduler.d.ts.map +1 -1
- package/dist/core/cron/scheduler.js +153 -73
- package/dist/core/cron/scheduler.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +8 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +8 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +4 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +22 -1
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/large-subagent-launch.d.ts +1 -1
- package/dist/core/large-subagent-launch.d.ts.map +1 -1
- package/dist/core/large-subagent-launch.js +7 -7
- package/dist/core/large-subagent-launch.js.map +1 -1
- package/dist/core/model-registry.d.ts +2 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +5 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-runtime.d.ts +4 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +40 -4
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/permissions.d.ts +3 -3
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +11 -35
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts +5 -13
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +126 -116
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js +1 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/prompt-resource-bridge.d.ts +12 -0
- package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
- package/dist/core/prompt-resource-bridge.js +9 -0
- package/dist/core/prompt-resource-bridge.js.map +1 -0
- package/dist/core/protected-targets.d.ts +6 -0
- package/dist/core/protected-targets.d.ts.map +1 -0
- package/dist/core/protected-targets.js +45 -0
- package/dist/core/protected-targets.js.map +1 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +7 -0
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/rollback.d.ts +19 -3
- package/dist/core/rollback.d.ts.map +1 -1
- package/dist/core/rollback.js +172 -56
- package/dist/core/rollback.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +3 -0
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js +14 -1
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts +3 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +6 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +95 -32
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-ownership.d.ts.map +1 -1
- package/dist/core/session-ownership.js +8 -3
- package/dist/core/session-ownership.js.map +1 -1
- package/dist/core/session-retention.d.ts.map +1 -1
- package/dist/core/session-retention.js +18 -7
- package/dist/core/session-retention.js.map +1 -1
- package/dist/core/session-startup-settings.d.ts +10 -0
- package/dist/core/session-startup-settings.d.ts.map +1 -0
- package/dist/core/session-startup-settings.js +70 -0
- package/dist/core/session-startup-settings.js.map +1 -0
- package/dist/core/subscriptions.d.ts +16 -7
- package/dist/core/subscriptions.d.ts.map +1 -1
- package/dist/core/subscriptions.js +96 -55
- package/dist/core/subscriptions.js.map +1 -1
- package/dist/core/trust-manager.d.ts +2 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +6 -1
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/update-check.d.ts.map +1 -1
- package/dist/core/update-check.js.map +1 -1
- package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
- package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
- package/dist/core/usage-adapters/kimi-coding.js +2 -2
- package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
- package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
- package/dist/core/usage-adapters/openai-codex.js +3 -3
- package/dist/core/usage-adapters/openai-codex.js.map +1 -1
- package/dist/core/usage-adapters/xai.d.ts +2 -2
- package/dist/core/usage-adapters/xai.d.ts.map +1 -1
- package/dist/core/usage-adapters/xai.js +3 -3
- package/dist/core/usage-adapters/xai.js.map +1 -1
- package/dist/core/usage-adapters/zai.d.ts +2 -2
- package/dist/core/usage-adapters/zai.d.ts.map +1 -1
- package/dist/core/usage-adapters/zai.js +2 -2
- package/dist/core/usage-adapters/zai.js.map +1 -1
- package/dist/core/usage-service.d.ts +9 -2
- package/dist/core/usage-service.d.ts.map +1 -1
- package/dist/core/usage-service.js +95 -50
- package/dist/core/usage-service.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts +9 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +91 -37
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/buttons.d.ts +8 -1
- package/dist/gateway/buttons.d.ts.map +1 -1
- package/dist/gateway/buttons.js +76 -18
- package/dist/gateway/buttons.js.map +1 -1
- package/dist/gateway/commands.d.ts +1 -0
- package/dist/gateway/commands.d.ts.map +1 -1
- package/dist/gateway/commands.js +10 -4
- package/dist/gateway/commands.js.map +1 -1
- package/dist/gateway/cron.d.ts +12 -11
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +65 -56
- package/dist/gateway/cron.js.map +1 -1
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +2 -1
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/mobile-commands.d.ts +1 -0
- package/dist/gateway/mobile-commands.d.ts.map +1 -1
- package/dist/gateway/mobile-commands.js +56 -14
- package/dist/gateway/mobile-commands.js.map +1 -1
- package/dist/gateway/presenter.d.ts +12 -2
- package/dist/gateway/presenter.d.ts.map +1 -1
- package/dist/gateway/presenter.js +73 -38
- package/dist/gateway/presenter.js.map +1 -1
- package/dist/gateway/router.d.ts +2 -2
- package/dist/gateway/router.d.ts.map +1 -1
- package/dist/gateway/router.js +17 -2
- package/dist/gateway/router.js.map +1 -1
- package/dist/gateway/service.d.ts +2 -0
- package/dist/gateway/service.d.ts.map +1 -1
- package/dist/gateway/service.js +153 -0
- package/dist/gateway/service.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +86 -33
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +6 -4
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
- package/dist/modes/interactive/components/copyable-text.js +3 -2
- package/dist/modes/interactive/components/copyable-text.js.map +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/interactive-mode.d.ts +2 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +96 -109
- package/dist/modes/interactive/interactive-mode.js.map +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/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +2 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/node-runtime/{adapter-VFG7WNPX.js → adapter-247RTYLS.js} +4 -5
- package/dist/node-runtime/agent-session-services-KDMSPQDY.js +53 -0
- package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
- package/dist/node-runtime/{builtin-extensions-I2HIFEMY.js → builtin-extensions-OX6KELNX.js} +8 -7
- package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
- package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
- package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
- package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
- package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
- package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
- package/dist/node-runtime/{chunk-SPVDBUOS.js → chunk-6O3IW3IA.js} +2 -2
- package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
- package/dist/node-runtime/chunk-A2WO6WIN.js +1197 -0
- package/dist/node-runtime/{chunk-WIF24I7G.js → chunk-APVM5NEU.js} +149 -144
- package/dist/node-runtime/{chunk-RCR3XAQY.js → chunk-AYHH7YSD.js} +177 -144
- package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
- package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
- package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
- package/dist/node-runtime/{chunk-UVWCDQYF.js → chunk-C3P6Q3B2.js} +455 -278
- package/dist/node-runtime/{chunk-SN2KSMPQ.js → chunk-DQSCFU7R.js} +13 -7
- package/dist/node-runtime/{chunk-4SBQAI4T.js → chunk-EBLAZVSA.js} +2058 -73
- package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-EPR2F3GU.js} +68 -20
- package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
- package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
- package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
- package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
- package/dist/node-runtime/{chunk-IKU6Y7DL.js → chunk-FE3WZI7F.js} +9 -6
- package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-FIRA54AC.js} +2 -5
- package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
- package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
- package/dist/node-runtime/{chunk-RGQAEOM5.js → chunk-FYIFPFXE.js} +23 -6
- package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
- package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
- package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
- package/dist/node-runtime/{chunk-I74LN5JG.js → chunk-HUD2RFJW.js} +2 -2
- package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-I2H5QMWW.js} +3 -3
- package/dist/node-runtime/{chunk-XHIRAZ26.js → chunk-IAZSK7KK.js} +1 -1
- package/dist/node-runtime/{chunk-X3PGBLQ7.js → chunk-IHHTWSXN.js} +9 -9
- package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
- package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
- package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
- package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-JQYNHAKX.js} +1 -1
- package/dist/node-runtime/{chunk-L24TPBS4.js → chunk-JWEVT363.js} +37 -29
- package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
- package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
- package/dist/node-runtime/{chunk-T4DA4XE7.js → chunk-MQPKUHRN.js} +162 -82
- package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
- package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
- package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
- package/dist/node-runtime/{chunk-P7XBVXGT.js → chunk-QNVMKNNN.js} +18 -14
- package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
- package/dist/node-runtime/{chunk-DVQSHCVP.js → chunk-R4WSB2MQ.js} +5 -5
- package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
- package/dist/node-runtime/{chunk-2CFDTH5B.js → chunk-RLGY2QIL.js} +45 -59
- package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
- package/dist/node-runtime/{chunk-5Q4A37RB.js → chunk-TCT6PCUR.js} +32 -11
- package/dist/node-runtime/{chunk-D5UCKPBQ.js → chunk-UBWW2PID.js} +1 -1
- package/dist/node-runtime/{chunk-E75WFZ33.js → chunk-UNUZICC4.js} +3 -3
- package/dist/node-runtime/{chunk-RAK2QA2B.js → chunk-UYRKUKFE.js} +4 -4
- package/dist/node-runtime/{chunk-LWJXTA6Z.js → chunk-VSUEAI7O.js} +1377 -45
- package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
- package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
- package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
- package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
- package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
- package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
- package/dist/node-runtime/{chunk-LJTIVM7I.js → chunk-ZDJUR45D.js} +427 -126
- package/dist/node-runtime/{chunk-YWOJIGFY.js → chunk-ZEVFBFNF.js} +95 -142
- package/dist/node-runtime/{chunk-5B6VKFEV.js → chunk-ZIQUS5QO.js} +1 -1
- package/dist/node-runtime/cli-runtime.js +4 -4
- package/dist/node-runtime/{command-FSBU2EVZ.js → command-3HMSY6W2.js} +5 -5
- package/dist/node-runtime/{commands-EMBQQVVT.js → commands-D6A6H4TS.js} +11 -18
- package/dist/node-runtime/{commands-NAAL7KNT.js → commands-OCSSEEWJ.js} +16 -16
- package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
- package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
- package/dist/node-runtime/{direct-tool-executor-4D7UXYU4.js → direct-tool-executor-2QJXVQD2.js} +6 -11
- package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
- package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-BRWF5AHI.js} +4 -4
- package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
- package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
- package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
- package/dist/node-runtime/{gateway-DQM333YV.js → gateway-6623C2U3.js} +51 -42
- package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
- package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
- package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
- package/dist/node-runtime/{goal-NJEE5CTU.js → goal-AIHEDUYA.js} +5 -5
- package/dist/node-runtime/index.js +50 -48
- package/dist/node-runtime/{init-P5AUV77I.js → init-JBQJIPYI.js} +3 -6
- package/dist/node-runtime/{install-cli-NN4YAU44.js → install-cli-INGHIVBY.js} +30 -25
- package/dist/node-runtime/interactive-mode-FM5DNUSW.js +74 -0
- package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
- package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
- package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
- package/dist/node-runtime/{lunr-computer-use-Y23CCDIJ.js → lunr-computer-use-VDP2QNRQ.js} +9 -9
- package/dist/node-runtime/{lunr-cron-USHC4LXH.js → lunr-cron-LKVA5CZZ.js} +93 -80
- package/dist/node-runtime/main.js +42 -41
- package/dist/node-runtime/{mobile-commands-O5LCHL32.js → mobile-commands-XT3NQXLD.js} +12 -12
- package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
- package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
- package/dist/node-runtime/{package-manager-cli-Q7BL6KZO.js → package-manager-cli-CYM262SI.js} +20 -20
- package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
- package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
- package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
- package/dist/node-runtime/{pi-mcp-adapter-3PHF4KZ4.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
- package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
- package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
- package/dist/node-runtime/{pi-subagents-7IBSSGEW.js → pi-subagents-LT3CTO4E.js} +98 -106
- package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
- package/dist/node-runtime/{print-mode-XQ76CYMT.js → print-mode-2XHN5SUA.js} +3 -3
- package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
- package/dist/node-runtime/{proxy-modes-5FAPSZEZ.js → proxy-modes-VEGC6QG5.js} +8 -15
- package/dist/node-runtime/rpc-entry.js +42 -41
- package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
- package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
- package/dist/node-runtime/{runtime-EFPPD2UW.js → runtime-UGXM4NPQ.js} +2 -2
- package/dist/node-runtime/{runtime-bridges-7WVCLI76.js → runtime-bridges-DNKMNJCF.js} +7 -7
- package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
- package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LNSPDTKY.js} +4 -4
- package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-YIFIAVGC.js} +3 -3
- package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
- package/dist/node-runtime/{settings-manager-DJDM5AHM.js → settings-manager-P2TKGYTR.js} +5 -5
- package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
- package/dist/node-runtime/{setup-PFBWRNUI.js → setup-OLQ4GXWS.js} +17 -17
- package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
- package/dist/node-runtime/{subagent-executor-LPZ4BHWE.js → subagent-executor-Q5F7DBVM.js} +119 -58
- package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
- package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
- package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
- package/dist/node-runtime/{update-cli-HNMOTNGX.js → update-cli-F3XXJANQ.js} +6 -6
- package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
- package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
- package/dist/node-runtime/{workflow-OHPBEFO4.js → workflow-ICDI4N3J.js} +208 -78
- package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js +25 -10
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js +2 -0
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/paths.d.ts +4 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +33 -2
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/sanitize-terminal-text.d.ts +7 -0
- package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
- package/dist/utils/sanitize-terminal-text.js +67 -0
- package/dist/utils/sanitize-terminal-text.js.map +1 -0
- package/docs/browser.md +1 -1
- package/docs/custom-provider.md +3 -3
- package/docs/extensions.md +8 -4
- package/docs/features.md +15 -7
- package/docs/keybindings.md +1 -1
- package/docs/models.md +5 -5
- package/docs/packages.md +1 -1
- package/docs/providers.md +2 -2
- package/docs/rpc.md +7 -7
- package/docs/security.md +10 -5
- package/docs/sessions.md +2 -2
- package/docs/skills.md +1 -1
- package/docs/terminal-setup.md +7 -7
- package/docs/themes.md +1 -1
- package/docs/usage.md +1 -1
- package/examples/extensions/auto-commit-on-exit.ts +1 -1
- package/examples/extensions/bash-spawn-hook.ts +1 -1
- package/examples/extensions/built-in-tool-renderer.ts +1 -1
- package/examples/extensions/claude-rules.ts +1 -1
- package/examples/extensions/commands.ts +1 -1
- package/examples/extensions/custom-compaction.ts +1 -1
- package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
- 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 +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/doom-overlay/index.ts +1 -1
- package/examples/extensions/git-merge-and-resolve.ts +2 -2
- package/examples/extensions/gondolin/index.ts +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/hidden-thinking-label.ts +1 -1
- package/examples/extensions/inline-bash.ts +2 -2
- package/examples/extensions/input-transform-streaming.ts +2 -2
- package/examples/extensions/input-transform.ts +2 -2
- 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/minimal-mode.ts +1 -1
- package/examples/extensions/modal-editor.ts +1 -1
- package/examples/extensions/model-status.ts +1 -1
- package/examples/extensions/notify.ts +3 -3
- package/examples/extensions/overlay-qa-tests.ts +1 -1
- package/examples/extensions/overlay-test.ts +1 -1
- package/examples/extensions/pirate.ts +1 -1
- package/examples/extensions/preset.ts +3 -3
- package/examples/extensions/project-trust.ts +4 -4
- package/examples/extensions/prompt-customizer.ts +1 -1
- package/examples/extensions/rainbow-editor.ts +1 -1
- package/examples/extensions/rpc-demo.ts +1 -1
- package/examples/extensions/sandbox/index.ts +7 -7
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/shutdown-command.ts +5 -5
- package/examples/extensions/ssh.ts +2 -2
- package/examples/extensions/subagent/README.md +3 -3
- package/examples/extensions/subagent/index.ts +2 -2
- package/examples/extensions/titlebar-spinner.ts +1 -1
- package/examples/extensions/tool-override.ts +1 -1
- package/examples/extensions/tools.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/sdk/01-minimal.ts +1 -1
- package/examples/sdk/03-custom-prompt.ts +1 -1
- package/examples/sdk/04-skills.ts +1 -1
- package/examples/sdk/06-extensions.ts +2 -2
- package/examples/sdk/08-prompt-templates.ts +1 -1
- package/install-lock/package-lock.json +24 -24
- package/install-lock/package.json +2 -2
- package/npm-shrinkwrap.json +60 -24
- package/package.json +9 -9
- package/dist/modes/interactive/components/exit-card.d.ts +0 -22
- package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
- package/dist/modes/interactive/components/exit-card.js +0 -69
- package/dist/modes/interactive/components/exit-card.js.map +0 -1
- package/dist/node-runtime/agent-session-services-5YXS2PLF.js +0 -51
- package/dist/node-runtime/chunk-2IDTZAG5.js +0 -1415
- package/dist/node-runtime/chunk-3MISGG4S.js +0 -769
- package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
- package/dist/node-runtime/chunk-5B5QN3ZQ.js +0 -356
- package/dist/node-runtime/chunk-7IQGBKBJ.js +0 -2033
- package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
- package/dist/node-runtime/chunk-PTFBPO3C.js +0 -50
- package/dist/node-runtime/interactive-mode-YOHZVMKX.js +0 -74
- package/dist/node-runtime/mcp-auth-flow-QVLFVLEO.js +0 -33
|
@@ -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,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGxE,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 type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { createReadOnlyTools } from \"../../../../core/tools/index.ts\";\nimport { convertToLlm } from \"../../../../core/messages.ts\";\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
|
+
{"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,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGxE,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 type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { createReadOnlyTools } from \"../../../../core/tools/index.ts\";\nimport { convertToLlm } from \"../../../../core/messages.ts\";\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 lunR 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 lunR.\",\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 lunR 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"]}
|
|
@@ -93,7 +93,7 @@ export async function resolveWatchdogReviewModel(ctx, config, options = {}) {
|
|
|
93
93
|
}
|
|
94
94
|
const currentModel = ctx.model;
|
|
95
95
|
if (!currentModel) {
|
|
96
|
-
throw new Error("Main watchdog review cannot run because the current
|
|
96
|
+
throw new Error("Main watchdog review cannot run because the current lunR session model is unavailable and subagents.watchdog.main.model is not configured.");
|
|
97
97
|
}
|
|
98
98
|
return {
|
|
99
99
|
model: currentModel,
|
|
@@ -153,7 +153,7 @@ function createWatchdogWarnTool(request) {
|
|
|
153
153
|
}
|
|
154
154
|
function buildWatchdogSystemPrompt(ctx) {
|
|
155
155
|
return [
|
|
156
|
-
"You are the main-session subagent watchdog for
|
|
156
|
+
"You are the main-session subagent watchdog for lunR.",
|
|
157
157
|
`Working directory: ${ctx.cwd}`,
|
|
158
158
|
"Review only the supplied parent turn delta. Inspect repository files only when needed to verify a concrete concern.",
|
|
159
159
|
"You are read-only. You may use read, grep, find, and ls. Do not edit files, run shell commands, spawn agents, or mutate state.",
|
|
@@ -193,7 +193,7 @@ export function createMainWatchdogReview(provider, options = {}) {
|
|
|
193
193
|
return async (request) => {
|
|
194
194
|
const ctx = resolveContext(provider);
|
|
195
195
|
if (!ctx)
|
|
196
|
-
throw new Error("Main watchdog review cannot run without an active
|
|
196
|
+
throw new Error("Main watchdog review cannot run without an active lunR extension context.");
|
|
197
197
|
if (ctx.signal?.aborted || request.signal?.aborted)
|
|
198
198
|
return { stopReason: "aborted" };
|
|
199
199
|
const selection = await resolveWatchdogReviewModel(ctx, request.config, {
|
|
@@ -1 +1 @@
|
|
|
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 type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { createReadOnlyTools } from \"../../../../core/tools/index.ts\";\nimport { convertToLlm } from \"../../../../core/messages.ts\";\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
|
+
{"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 type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { createReadOnlyTools } from \"../../../../core/tools/index.ts\";\nimport { convertToLlm } from \"../../../../core/messages.ts\";\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 lunR 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 lunR.\",\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 lunR 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi-tps.d.ts","sourceRoot":"","sources":["../../src/builtin-extensions/pi-tps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"pi-tps.d.ts","sourceRoot":"","sources":["../../src/builtin-extensions/pi-tps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAuBpE,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QA+ExC","sourcesContent":["import type { ExtensionAPI } from \"@ashx-j/lunr\";\n\n// ── Spinner frames for streaming animation ──\nconst spinner = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\n// ── ANSI color helpers ──\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst RED = \"\\x1b[31m\";\nconst RESET = \"\\x1b[0m\";\n\nfunction colorForTps(tps: number): string {\n\tif (tps >= 100) return GREEN;\n\tif (tps >= 30) return YELLOW;\n\treturn RED;\n}\n\n// ── Compact token formatting ──\nfunction formatTokens(n: number): string {\n\tif (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n\treturn String(n);\n}\n\nexport default function (pi: ExtensionAPI) {\n\tlet messageStartTime = 0;\n\tlet lastAvgTps = 0;\n\tlet lastOutputTokens = 0;\n\tlet spinnerIdx = 0;\n\tlet spinnerInterval: ReturnType<typeof setInterval> | undefined;\n\n\tfunction stopAnimation(): void {\n\t\tif (spinnerInterval !== undefined) {\n\t\t\tclearInterval(spinnerInterval);\n\t\t\tspinnerInterval = undefined;\n\t\t}\n\t}\n\n\tpi.on(\"session_start\", stopAnimation);\n\tpi.on(\"session_shutdown\", stopAnimation);\n\tpi.on(\"agent_end\", stopAnimation);\n\n\tpi.on(\"agent_start\", async (_event, ctx) => {\n\t\tstopAnimation();\n\t\tlastAvgTps = 0;\n\t\tlastOutputTokens = 0;\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.setStatus(\"tps\", \"\");\n\t\t}\n\t});\n\n\tpi.on(\"message_start\", (event, ctx) => {\n\t\tif (event.message.role === \"assistant\") {\n\t\t\tmessageStartTime = Date.now();\n\t\t\tstopAnimation();\n\t\t\tif (!ctx.hasUI) return;\n\t\t\tspinnerIdx = 0;\n\t\t\t// Start spinner animation\n\t\t\tspinnerInterval = setInterval(() => {\n\t\t\t\tspinnerIdx = (spinnerIdx + 1) % spinner.length;\n\t\t\t}, 80);\n\t\t\tspinnerInterval.unref();\n\t\t}\n\t});\n\n\tpi.on(\"message_update\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst usage = (event.message as { usage?: { output: number } }).usage;\n\t\tif (!usage) return;\n\n\t\tconst outputTokens = usage.output;\n\t\tif (outputTokens === 0) return;\n\n\t\tconst elapsed = (Date.now() - messageStartTime) / 1000;\n\t\tconst tps = outputTokens / elapsed;\n\t\tconst color = colorForTps(tps);\n\t\tconst frame = spinner[spinnerIdx % spinner.length];\n\n\t\tctx.ui.setStatus(\"tps\", `${color}${frame} ${tps.toFixed(1)} t/s${RESET} ↓ ${formatTokens(outputTokens)} tokens`);\n\t});\n\n\tpi.on(\"message_end\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tstopAnimation();\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst elapsed = (Date.now() - messageStartTime) / 1000;\n\t\tconst usage = (event.message as { usage?: { output: number } }).usage;\n\t\tconst outputTokens = usage?.output ?? 0;\n\n\t\tif (elapsed > 0 && outputTokens > 0) {\n\t\t\tlastAvgTps = outputTokens / elapsed;\n\t\t\tlastOutputTokens = outputTokens;\n\t\t}\n\n\t\tconst color = colorForTps(lastAvgTps);\n\t\tctx.ui.setStatus(\n\t\t\t\"tps\",\n\t\t\t`${color}✓ ${lastAvgTps.toFixed(1)} t/s · ${formatTokens(lastOutputTokens)} tokens in ${elapsed.toFixed(1)}s${RESET}`,\n\t\t);\n\t});\n}\n"]}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
// ── Spinner frames for streaming animation ──
|
|
2
2
|
const spinner = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
3
|
-
let spinnerIdx = 0;
|
|
4
|
-
let spinnerInterval = null;
|
|
5
3
|
// ── ANSI color helpers ──
|
|
6
4
|
const GREEN = "\x1b[32m";
|
|
7
5
|
const YELLOW = "\x1b[33m";
|
|
@@ -24,25 +22,37 @@ export default function (pi) {
|
|
|
24
22
|
let messageStartTime = 0;
|
|
25
23
|
let lastAvgTps = 0;
|
|
26
24
|
let lastOutputTokens = 0;
|
|
27
|
-
let
|
|
25
|
+
let spinnerIdx = 0;
|
|
26
|
+
let spinnerInterval;
|
|
27
|
+
function stopAnimation() {
|
|
28
|
+
if (spinnerInterval !== undefined) {
|
|
29
|
+
clearInterval(spinnerInterval);
|
|
30
|
+
spinnerInterval = undefined;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
pi.on("session_start", stopAnimation);
|
|
34
|
+
pi.on("session_shutdown", stopAnimation);
|
|
35
|
+
pi.on("agent_end", stopAnimation);
|
|
28
36
|
pi.on("agent_start", async (_event, ctx) => {
|
|
37
|
+
stopAnimation();
|
|
29
38
|
lastAvgTps = 0;
|
|
30
39
|
lastOutputTokens = 0;
|
|
31
40
|
if (ctx.hasUI) {
|
|
32
41
|
ctx.ui.setStatus("tps", "");
|
|
33
42
|
}
|
|
34
43
|
});
|
|
35
|
-
pi.on("message_start", (event) => {
|
|
44
|
+
pi.on("message_start", (event, ctx) => {
|
|
36
45
|
if (event.message.role === "assistant") {
|
|
37
46
|
messageStartTime = Date.now();
|
|
38
|
-
|
|
47
|
+
stopAnimation();
|
|
48
|
+
if (!ctx.hasUI)
|
|
49
|
+
return;
|
|
39
50
|
spinnerIdx = 0;
|
|
40
51
|
// Start spinner animation
|
|
41
|
-
if (spinnerInterval)
|
|
42
|
-
clearInterval(spinnerInterval);
|
|
43
52
|
spinnerInterval = setInterval(() => {
|
|
44
53
|
spinnerIdx = (spinnerIdx + 1) % spinner.length;
|
|
45
54
|
}, 80);
|
|
55
|
+
spinnerInterval.unref();
|
|
46
56
|
}
|
|
47
57
|
});
|
|
48
58
|
pi.on("message_update", (event, ctx) => {
|
|
@@ -65,6 +75,7 @@ export default function (pi) {
|
|
|
65
75
|
pi.on("message_end", (event, ctx) => {
|
|
66
76
|
if (event.message.role !== "assistant")
|
|
67
77
|
return;
|
|
78
|
+
stopAnimation();
|
|
68
79
|
if (!ctx.hasUI)
|
|
69
80
|
return;
|
|
70
81
|
const elapsed = (Date.now() - messageStartTime) / 1000;
|
|
@@ -74,16 +85,8 @@ export default function (pi) {
|
|
|
74
85
|
lastAvgTps = outputTokens / elapsed;
|
|
75
86
|
lastOutputTokens = outputTokens;
|
|
76
87
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (spinnerInterval) {
|
|
80
|
-
clearInterval(spinnerInterval);
|
|
81
|
-
spinnerInterval = null;
|
|
82
|
-
}
|
|
83
|
-
setImmediate(() => {
|
|
84
|
-
const color = colorForTps(lastAvgTps);
|
|
85
|
-
ctx.ui.setStatus("tps", `${color}✓ ${lastAvgTps.toFixed(1)} t/s · ${formatTokens(lastOutputTokens)} tokens in ${elapsed.toFixed(1)}s${RESET}`);
|
|
86
|
-
});
|
|
88
|
+
const color = colorForTps(lastAvgTps);
|
|
89
|
+
ctx.ui.setStatus("tps", `${color}✓ ${lastAvgTps.toFixed(1)} t/s · ${formatTokens(lastOutputTokens)} tokens in ${elapsed.toFixed(1)}s${RESET}`);
|
|
87
90
|
});
|
|
88
91
|
}
|
|
89
92
|
//# sourceMappingURL=pi-tps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi-tps.js","sourceRoot":"","sources":["../../src/builtin-extensions/pi-tps.ts"],"names":[],"mappings":"AAEA,uDAA+C;AAC/C,MAAM,OAAO,GAAG,CAAC,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"pi-tps.js","sourceRoot":"","sources":["../../src/builtin-extensions/pi-tps.ts"],"names":[],"mappings":"AAEA,uDAA+C;AAC/C,MAAM,OAAO,GAAG,CAAC,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,CAAC,CAAC;AAEnE,mCAA2B;AAC3B,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,KAAK,GAAG,SAAS,CAAC;AAExB,SAAS,WAAW,CAAC,GAAW,EAAU;IACzC,IAAI,GAAG,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC7B,OAAO,GAAG,CAAC;AAAA,CACX;AAED,yCAAiC;AACjC,SAAS,YAAY,CAAC,CAAS,EAAU;IACxC,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAClD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AAAA,CACjB;AAED,MAAM,CAAC,OAAO,WAAW,EAAgB,EAAE;IAC1C,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,eAA2D,CAAC;IAEhE,SAAS,aAAa,GAAS;QAC9B,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YACnC,aAAa,CAAC,eAAe,CAAC,CAAC;YAC/B,eAAe,GAAG,SAAS,CAAC;QAC7B,CAAC;IAAA,CACD;IAED,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IACtC,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;IACzC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAElC,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAC3C,aAAa,EAAE,CAAC;QAChB,UAAU,GAAG,CAAC,CAAC;QACf,gBAAgB,GAAG,CAAC,CAAC;QACrB,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7B,CAAC;IAAA,CACD,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACxC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC9B,aAAa,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,KAAK;gBAAE,OAAO;YACvB,UAAU,GAAG,CAAC,CAAC;YACf,0BAA0B;YAC1B,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBACnC,UAAU,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YAAA,CAC/C,EAAE,EAAE,CAAC,CAAC;YACP,eAAe,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;IAAA,CACD,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO;QAC/C,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO;QAEvB,MAAM,KAAK,GAAI,KAAK,CAAC,OAA0C,CAAC,KAAK,CAAC;QACtE,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;QAClC,IAAI,YAAY,KAAK,CAAC;YAAE,OAAO;QAE/B,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC,GAAG,IAAI,CAAC;QACvD,MAAM,GAAG,GAAG,YAAY,GAAG,OAAO,CAAC;QACnC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAEnD,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,QAAM,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAAA,CACjH,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO;QAC/C,aAAa,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO;QAEvB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC,GAAG,IAAI,CAAC;QACvD,MAAM,KAAK,GAAI,KAAK,CAAC,OAA0C,CAAC,KAAK,CAAC;QACtE,MAAM,YAAY,GAAG,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;QAExC,IAAI,OAAO,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrC,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;YACpC,gBAAgB,GAAG,YAAY,CAAC;QACjC,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACtC,GAAG,CAAC,EAAE,CAAC,SAAS,CACf,KAAK,EACL,GAAG,KAAK,OAAK,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,WAAU,YAAY,CAAC,gBAAgB,CAAC,cAAc,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CACrH,CAAC;IAAA,CACF,CAAC,CAAC;AAAA,CACH","sourcesContent":["import type { ExtensionAPI } from \"@ashx-j/lunr\";\n\n// ── Spinner frames for streaming animation ──\nconst spinner = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\n// ── ANSI color helpers ──\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst RED = \"\\x1b[31m\";\nconst RESET = \"\\x1b[0m\";\n\nfunction colorForTps(tps: number): string {\n\tif (tps >= 100) return GREEN;\n\tif (tps >= 30) return YELLOW;\n\treturn RED;\n}\n\n// ── Compact token formatting ──\nfunction formatTokens(n: number): string {\n\tif (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n\treturn String(n);\n}\n\nexport default function (pi: ExtensionAPI) {\n\tlet messageStartTime = 0;\n\tlet lastAvgTps = 0;\n\tlet lastOutputTokens = 0;\n\tlet spinnerIdx = 0;\n\tlet spinnerInterval: ReturnType<typeof setInterval> | undefined;\n\n\tfunction stopAnimation(): void {\n\t\tif (spinnerInterval !== undefined) {\n\t\t\tclearInterval(spinnerInterval);\n\t\t\tspinnerInterval = undefined;\n\t\t}\n\t}\n\n\tpi.on(\"session_start\", stopAnimation);\n\tpi.on(\"session_shutdown\", stopAnimation);\n\tpi.on(\"agent_end\", stopAnimation);\n\n\tpi.on(\"agent_start\", async (_event, ctx) => {\n\t\tstopAnimation();\n\t\tlastAvgTps = 0;\n\t\tlastOutputTokens = 0;\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.setStatus(\"tps\", \"\");\n\t\t}\n\t});\n\n\tpi.on(\"message_start\", (event, ctx) => {\n\t\tif (event.message.role === \"assistant\") {\n\t\t\tmessageStartTime = Date.now();\n\t\t\tstopAnimation();\n\t\t\tif (!ctx.hasUI) return;\n\t\t\tspinnerIdx = 0;\n\t\t\t// Start spinner animation\n\t\t\tspinnerInterval = setInterval(() => {\n\t\t\t\tspinnerIdx = (spinnerIdx + 1) % spinner.length;\n\t\t\t}, 80);\n\t\t\tspinnerInterval.unref();\n\t\t}\n\t});\n\n\tpi.on(\"message_update\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst usage = (event.message as { usage?: { output: number } }).usage;\n\t\tif (!usage) return;\n\n\t\tconst outputTokens = usage.output;\n\t\tif (outputTokens === 0) return;\n\n\t\tconst elapsed = (Date.now() - messageStartTime) / 1000;\n\t\tconst tps = outputTokens / elapsed;\n\t\tconst color = colorForTps(tps);\n\t\tconst frame = spinner[spinnerIdx % spinner.length];\n\n\t\tctx.ui.setStatus(\"tps\", `${color}${frame} ${tps.toFixed(1)} t/s${RESET} ↓ ${formatTokens(outputTokens)} tokens`);\n\t});\n\n\tpi.on(\"message_end\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tstopAnimation();\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst elapsed = (Date.now() - messageStartTime) / 1000;\n\t\tconst usage = (event.message as { usage?: { output: number } }).usage;\n\t\tconst outputTokens = usage?.output ?? 0;\n\n\t\tif (elapsed > 0 && outputTokens > 0) {\n\t\t\tlastAvgTps = outputTokens / elapsed;\n\t\t\tlastOutputTokens = outputTokens;\n\t\t}\n\n\t\tconst color = colorForTps(lastAvgTps);\n\t\tctx.ui.setStatus(\n\t\t\t\"tps\",\n\t\t\t`${color}✓ ${lastAvgTps.toFixed(1)} t/s · ${formatTokens(lastOutputTokens)} tokens in ${elapsed.toFixed(1)}s${RESET}`,\n\t\t);\n\t});\n}\n"]}
|
|
@@ -30,5 +30,6 @@ export declare class ActivityMonitor {
|
|
|
30
30
|
clear(): void;
|
|
31
31
|
private notify;
|
|
32
32
|
}
|
|
33
|
+
export declare function runWithActivity<T>(monitor: ActivityMonitor, fn: () => T): T;
|
|
33
34
|
export declare const activityMonitor: ActivityMonitor;
|
|
34
35
|
//# sourceMappingURL=activity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/activity.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,GAAG,CAAC,EAAE,MAAM,CAAC;IAGb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAe;IAC3B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;IACjC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/activity.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,GAAG,CAAC,EAAE,MAAM,CAAC;IAGb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAe;IAC3B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;IACjC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,aAAa,CAKnB;IACF,OAAO,CAAC,MAAM,CAAK;IAEnB,QAAQ,CACP,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,QAAQ,CAAC,GACzD,MAAM,CAcR;IAED,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAO5C;IAED,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOxC;IAED,UAAU,IAAI,SAAS,aAAa,EAAE,CAErC;IAED,gBAAgB,IAAI,aAAa,CAEhC;IAED,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAGzC;IAED,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAGzC;IAED,KAAK,IAAI,IAAI,CASZ;IAED,OAAO,CAAC,MAAM;CAOd;AAKD,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE3E;AAGD,eAAO,MAAM,eAAe,iBAM1B,CAAC","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n// Types\nexport interface ActivityEntry {\n\tid: string;\n\ttype: \"api\" | \"fetch\";\n\tstartTime: number;\n\tendTime?: number;\n\n\t// For API calls\n\tquery?: string;\n\n\t// For URL fetches\n\turl?: string;\n\n\t// Result - status is number (HTTP code) or null (pending/network error)\n\tstatus: number | null;\n\terror?: string;\n}\n\nexport interface RateLimitInfo {\n\tused: number;\n\tmax: number;\n\toldestTimestamp: number | null;\n\twindowMs: number;\n}\n\nexport class ActivityMonitor {\n\tprivate entries: ActivityEntry[] = [];\n\tprivate readonly maxEntries = 10;\n\tprivate listeners = new Set<() => void>();\n\tprivate rateLimitInfo: RateLimitInfo = {\n\t\tused: 0,\n\t\tmax: 10,\n\t\toldestTimestamp: null,\n\t\twindowMs: 60000,\n\t};\n\tprivate nextId = 1;\n\n\tlogStart(\n\t\tpartial: Omit<ActivityEntry, \"id\" | \"startTime\" | \"status\">,\n\t): string {\n\t\tconst id = `act-${this.nextId++}`;\n\t\tconst entry: ActivityEntry = {\n\t\t\t...partial,\n\t\t\tid,\n\t\t\tstartTime: Date.now(),\n\t\t\tstatus: null,\n\t\t};\n\t\tthis.entries.push(entry);\n\t\tif (this.entries.length > this.maxEntries) {\n\t\t\tthis.entries.shift();\n\t\t}\n\t\tthis.notify();\n\t\treturn id;\n\t}\n\n\tlogComplete(id: string, status: number): void {\n\t\tconst entry = this.entries.find((e) => e.id === id);\n\t\tif (entry) {\n\t\t\tentry.endTime = Date.now();\n\t\t\tentry.status = status;\n\t\t\tthis.notify();\n\t\t}\n\t}\n\n\tlogError(id: string, error: string): void {\n\t\tconst entry = this.entries.find((e) => e.id === id);\n\t\tif (entry) {\n\t\t\tentry.endTime = Date.now();\n\t\t\tentry.error = error;\n\t\t\tthis.notify();\n\t\t}\n\t}\n\n\tgetEntries(): readonly ActivityEntry[] {\n\t\treturn this.entries;\n\t}\n\n\tgetRateLimitInfo(): RateLimitInfo {\n\t\treturn this.rateLimitInfo;\n\t}\n\n\tupdateRateLimit(info: RateLimitInfo): void {\n\t\tthis.rateLimitInfo = info;\n\t\tthis.notify();\n\t}\n\n\tonUpdate(callback: () => void): () => void {\n\t\tthis.listeners.add(callback);\n\t\treturn () => this.listeners.delete(callback);\n\t}\n\n\tclear(): void {\n\t\tthis.entries = [];\n\t\tthis.rateLimitInfo = {\n\t\t\tused: 0,\n\t\t\tmax: 10,\n\t\t\toldestTimestamp: null,\n\t\t\twindowMs: 60000,\n\t\t};\n\t\tthis.notify();\n\t}\n\n\tprivate notify(): void {\n\t\tfor (const cb of this.listeners) {\n\t\t\ttry {\n\t\t\t\tcb();\n\t\t\t} catch {}\n\t\t}\n\t}\n}\n\nconst activityScope = new AsyncLocalStorage<ActivityMonitor>();\nconst standaloneActivity = new ActivityMonitor();\n\nexport function runWithActivity<T>(monitor: ActivityMonitor, fn: () => T): T {\n\treturn activityScope.run(monitor, fn);\n}\n\n// Existing providers log through this facade without changing their request APIs.\nexport const activityMonitor = new Proxy(standaloneActivity, {\n\tget(_target, key: keyof ActivityMonitor) {\n\t\tconst monitor = activityScope.getStore() ?? standaloneActivity;\n\t\tconst value = monitor[key];\n\t\treturn typeof value === \"function\" ? value.bind(monitor) : value;\n\t},\n});\n"]}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
1
2
|
export class ActivityMonitor {
|
|
2
3
|
entries = [];
|
|
3
4
|
maxEntries = 10;
|
|
4
5
|
listeners = new Set();
|
|
5
|
-
rateLimitInfo = {
|
|
6
|
+
rateLimitInfo = {
|
|
7
|
+
used: 0,
|
|
8
|
+
max: 10,
|
|
9
|
+
oldestTimestamp: null,
|
|
10
|
+
windowMs: 60000,
|
|
11
|
+
};
|
|
6
12
|
nextId = 1;
|
|
7
13
|
logStart(partial) {
|
|
8
14
|
const id = `act-${this.nextId++}`;
|
|
@@ -51,7 +57,12 @@ export class ActivityMonitor {
|
|
|
51
57
|
}
|
|
52
58
|
clear() {
|
|
53
59
|
this.entries = [];
|
|
54
|
-
this.rateLimitInfo = {
|
|
60
|
+
this.rateLimitInfo = {
|
|
61
|
+
used: 0,
|
|
62
|
+
max: 10,
|
|
63
|
+
oldestTimestamp: null,
|
|
64
|
+
windowMs: 60000,
|
|
65
|
+
};
|
|
55
66
|
this.notify();
|
|
56
67
|
}
|
|
57
68
|
notify() {
|
|
@@ -59,10 +70,21 @@ export class ActivityMonitor {
|
|
|
59
70
|
try {
|
|
60
71
|
cb();
|
|
61
72
|
}
|
|
62
|
-
catch {
|
|
63
|
-
}
|
|
73
|
+
catch { }
|
|
64
74
|
}
|
|
65
75
|
}
|
|
66
76
|
}
|
|
67
|
-
|
|
77
|
+
const activityScope = new AsyncLocalStorage();
|
|
78
|
+
const standaloneActivity = new ActivityMonitor();
|
|
79
|
+
export function runWithActivity(monitor, fn) {
|
|
80
|
+
return activityScope.run(monitor, fn);
|
|
81
|
+
}
|
|
82
|
+
// Existing providers log through this facade without changing their request APIs.
|
|
83
|
+
export const activityMonitor = new Proxy(standaloneActivity, {
|
|
84
|
+
get(_target, key) {
|
|
85
|
+
const monitor = activityScope.getStore() ?? standaloneActivity;
|
|
86
|
+
const value = monitor[key];
|
|
87
|
+
return typeof value === "function" ? value.bind(monitor) : value;
|
|
88
|
+
},
|
|
89
|
+
});
|
|
68
90
|
//# sourceMappingURL=activity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/activity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/activity.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n// Types\nexport interface ActivityEntry {\n\tid: string;\n\ttype: \"api\" | \"fetch\";\n\tstartTime: number;\n\tendTime?: number;\n\n\t// For API calls\n\tquery?: string;\n\n\t// For URL fetches\n\turl?: string;\n\n\t// Result - status is number (HTTP code) or null (pending/network error)\n\tstatus: number | null;\n\terror?: string;\n}\n\nexport interface RateLimitInfo {\n\tused: number;\n\tmax: number;\n\toldestTimestamp: number | null;\n\twindowMs: number;\n}\n\nexport class ActivityMonitor {\n\tprivate entries: ActivityEntry[] = [];\n\tprivate readonly maxEntries = 10;\n\tprivate listeners = new Set<() => void>();\n\tprivate rateLimitInfo: RateLimitInfo = {\n\t\tused: 0,\n\t\tmax: 10,\n\t\toldestTimestamp: null,\n\t\twindowMs: 60000,\n\t};\n\tprivate nextId = 1;\n\n\tlogStart(\n\t\tpartial: Omit<ActivityEntry, \"id\" | \"startTime\" | \"status\">,\n\t): string {\n\t\tconst id = `act-${this.nextId++}`;\n\t\tconst entry: ActivityEntry = {\n\t\t\t...partial,\n\t\t\tid,\n\t\t\tstartTime: Date.now(),\n\t\t\tstatus: null,\n\t\t};\n\t\tthis.entries.push(entry);\n\t\tif (this.entries.length > this.maxEntries) {\n\t\t\tthis.entries.shift();\n\t\t}\n\t\tthis.notify();\n\t\treturn id;\n\t}\n\n\tlogComplete(id: string, status: number): void {\n\t\tconst entry = this.entries.find((e) => e.id === id);\n\t\tif (entry) {\n\t\t\tentry.endTime = Date.now();\n\t\t\tentry.status = status;\n\t\t\tthis.notify();\n\t\t}\n\t}\n\n\tlogError(id: string, error: string): void {\n\t\tconst entry = this.entries.find((e) => e.id === id);\n\t\tif (entry) {\n\t\t\tentry.endTime = Date.now();\n\t\t\tentry.error = error;\n\t\t\tthis.notify();\n\t\t}\n\t}\n\n\tgetEntries(): readonly ActivityEntry[] {\n\t\treturn this.entries;\n\t}\n\n\tgetRateLimitInfo(): RateLimitInfo {\n\t\treturn this.rateLimitInfo;\n\t}\n\n\tupdateRateLimit(info: RateLimitInfo): void {\n\t\tthis.rateLimitInfo = info;\n\t\tthis.notify();\n\t}\n\n\tonUpdate(callback: () => void): () => void {\n\t\tthis.listeners.add(callback);\n\t\treturn () => this.listeners.delete(callback);\n\t}\n\n\tclear(): void {\n\t\tthis.entries = [];\n\t\tthis.rateLimitInfo = {\n\t\t\tused: 0,\n\t\t\tmax: 10,\n\t\t\toldestTimestamp: null,\n\t\t\twindowMs: 60000,\n\t\t};\n\t\tthis.notify();\n\t}\n\n\tprivate notify(): void {\n\t\tfor (const cb of this.listeners) {\n\t\t\ttry {\n\t\t\t\tcb();\n\t\t\t} catch {}\n\t\t}\n\t}\n}\n\nconst activityScope = new AsyncLocalStorage<ActivityMonitor>();\nconst standaloneActivity = new ActivityMonitor();\n\nexport function runWithActivity<T>(monitor: ActivityMonitor, fn: () => T): T {\n\treturn activityScope.run(monitor, fn);\n}\n\n// Existing providers log through this facade without changing their request APIs.\nexport const activityMonitor = new Proxy(standaloneActivity, {\n\tget(_target, key: keyof ActivityMonitor) {\n\t\tconst monitor = activityScope.getStore() ?? standaloneActivity;\n\t\tconst value = monitor[key];\n\t\treturn typeof value === \"function\" ? value.bind(monitor) : value;\n\t},\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-body.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/bounded-body.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,wBAAsB,eAAe,CACpC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,CAAC,CAuCrB","sourcesContent":["/** Fetch exposes decoded bytes. Check each chunk before retaining it or invoking a parser. */\nexport async function readBoundedBody(\n\tresponse: Response,\n\tmaxBytes: number,\n\tsignal?: AbortSignal,\n): Promise<Uint8Array> {\n\tsignal?.throwIfAborted();\n\tif (!response.body) return new Uint8Array();\n\tconst reader = response.body.getReader();\n\tconst chunks: Uint8Array[] = [];\n\tlet size = 0;\n\tlet finished = false;\n\tconst onAbort = () => {\n\t\tvoid reader.cancel(signal?.reason).catch(() => {});\n\t};\n\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\ttry {\n\t\twhile (true) {\n\t\t\tsignal?.throwIfAborted();\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tsignal?.throwIfAborted();\n\t\t\tif (done) {\n\t\t\t\tfinished = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tsize += value.byteLength;\n\t\t\tif (size > maxBytes)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Response too large (limit ${maxBytes / 1024 / 1024}MiB)`,\n\t\t\t\t);\n\t\t\tchunks.push(value);\n\t\t}\n\t\tconst body = new Uint8Array(size);\n\t\tlet offset = 0;\n\t\tfor (const chunk of chunks) {\n\t\t\tbody.set(chunk, offset);\n\t\t\toffset += chunk.byteLength;\n\t\t}\n\t\treturn body;\n\t} finally {\n\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\tif (!finished) await reader.cancel().catch(() => {});\n\t\treader.releaseLock();\n\t}\n}\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Fetch exposes decoded bytes. Check each chunk before retaining it or invoking a parser. */
|
|
2
|
+
export async function readBoundedBody(response, maxBytes, signal) {
|
|
3
|
+
signal?.throwIfAborted();
|
|
4
|
+
if (!response.body)
|
|
5
|
+
return new Uint8Array();
|
|
6
|
+
const reader = response.body.getReader();
|
|
7
|
+
const chunks = [];
|
|
8
|
+
let size = 0;
|
|
9
|
+
let finished = false;
|
|
10
|
+
const onAbort = () => {
|
|
11
|
+
void reader.cancel(signal?.reason).catch(() => { });
|
|
12
|
+
};
|
|
13
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
14
|
+
try {
|
|
15
|
+
while (true) {
|
|
16
|
+
signal?.throwIfAborted();
|
|
17
|
+
const { done, value } = await reader.read();
|
|
18
|
+
signal?.throwIfAborted();
|
|
19
|
+
if (done) {
|
|
20
|
+
finished = true;
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
size += value.byteLength;
|
|
24
|
+
if (size > maxBytes)
|
|
25
|
+
throw new Error(`Response too large (limit ${maxBytes / 1024 / 1024}MiB)`);
|
|
26
|
+
chunks.push(value);
|
|
27
|
+
}
|
|
28
|
+
const body = new Uint8Array(size);
|
|
29
|
+
let offset = 0;
|
|
30
|
+
for (const chunk of chunks) {
|
|
31
|
+
body.set(chunk, offset);
|
|
32
|
+
offset += chunk.byteLength;
|
|
33
|
+
}
|
|
34
|
+
return body;
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
signal?.removeEventListener("abort", onAbort);
|
|
38
|
+
if (!finished)
|
|
39
|
+
await reader.cancel().catch(() => { });
|
|
40
|
+
reader.releaseLock();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=bounded-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-body.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/bounded-body.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,QAAkB,EAClB,QAAgB,EAChB,MAAoB,EACE;IACtB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,OAAO,IAAI,UAAU,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;IAAA,CACnD,CAAC;IACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC;QACJ,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,IAAI,IAAI,EAAE,CAAC;gBACV,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM;YACP,CAAC;YACD,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC;YACzB,IAAI,IAAI,GAAG,QAAQ;gBAClB,MAAM,IAAI,KAAK,CACd,6BAA6B,QAAQ,GAAG,IAAI,GAAG,IAAI,MAAM,CACzD,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;YAAS,CAAC;QACV,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ;YAAE,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,WAAW,EAAE,CAAC;IACtB,CAAC;AAAA,CACD","sourcesContent":["/** Fetch exposes decoded bytes. Check each chunk before retaining it or invoking a parser. */\nexport async function readBoundedBody(\n\tresponse: Response,\n\tmaxBytes: number,\n\tsignal?: AbortSignal,\n): Promise<Uint8Array> {\n\tsignal?.throwIfAborted();\n\tif (!response.body) return new Uint8Array();\n\tconst reader = response.body.getReader();\n\tconst chunks: Uint8Array[] = [];\n\tlet size = 0;\n\tlet finished = false;\n\tconst onAbort = () => {\n\t\tvoid reader.cancel(signal?.reason).catch(() => {});\n\t};\n\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\ttry {\n\t\twhile (true) {\n\t\t\tsignal?.throwIfAborted();\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tsignal?.throwIfAborted();\n\t\t\tif (done) {\n\t\t\t\tfinished = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tsize += value.byteLength;\n\t\t\tif (size > maxBytes)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Response too large (limit ${maxBytes / 1024 / 1024}MiB)`,\n\t\t\t\t);\n\t\t\tchunks.push(value);\n\t\t}\n\t\tconst body = new Uint8Array(size);\n\t\tlet offset = 0;\n\t\tfor (const chunk of chunks) {\n\t\t\tbody.set(chunk, offset);\n\t\t\toffset += chunk.byteLength;\n\t\t}\n\t\treturn body;\n\t} finally {\n\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\tif (!finished) await reader.cancel().catch(() => {});\n\t\treader.releaseLock();\n\t}\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Page every retrieval response, including lists and errors. Offset counts UTF-8 bytes. */
|
|
2
|
+
export declare function contentPage(text: string, offset?: number, details?: Record<string, unknown>): {
|
|
3
|
+
content: {
|
|
4
|
+
type: "text";
|
|
5
|
+
text: string;
|
|
6
|
+
}[];
|
|
7
|
+
details: {
|
|
8
|
+
error: string;
|
|
9
|
+
};
|
|
10
|
+
} | {
|
|
11
|
+
content: {
|
|
12
|
+
type: "text";
|
|
13
|
+
text: string;
|
|
14
|
+
}[];
|
|
15
|
+
details: {
|
|
16
|
+
error?: undefined;
|
|
17
|
+
offset: number;
|
|
18
|
+
nextOffset: number | null;
|
|
19
|
+
truncated: boolean;
|
|
20
|
+
totalBytes: number;
|
|
21
|
+
pageBytes: number;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=content-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-page.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/content-page.ts"],"names":[],"mappings":"AAYA,4FAA4F;AAC5F,wBAAgB,WAAW,CAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,SAAI,EACV,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;;;;;;;;;;EAqDrC","sourcesContent":["import {\n\tDEFAULT_MAX_BYTES,\n\tDEFAULT_MAX_LINES,\n\ttruncateHead,\n} from \"../../core/tools/truncate.ts\";\n\nfunction utf8Prefix(bytes: Buffer, limit: number): string {\n\tlet end = Math.min(limit, bytes.length);\n\twhile (end > 0 && end < bytes.length && (bytes[end] & 0xc0) === 0x80) end--;\n\treturn bytes.subarray(0, end).toString(\"utf8\");\n}\n\n/** Page every retrieval response, including lists and errors. Offset counts UTF-8 bytes. */\nexport function contentPage(\n\ttext: string,\n\toffset = 0,\n\tdetails: Record<string, unknown> = {},\n) {\n\tconst bytes = Buffer.from(text, \"utf8\");\n\tif (\n\t\t!Number.isSafeInteger(offset) ||\n\t\toffset < 0 ||\n\t\toffset > bytes.length ||\n\t\t(offset < bytes.length && (bytes[offset] & 0xc0) === 0x80)\n\t) {\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\ttext: \"Invalid offset. Use 0 or the nextOffset returned by the previous page.\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdetails: { error: \"Invalid offset\" },\n\t\t};\n\t}\n\n\t// Reserve space for the continuation notice within the same byte and line limits.\n\tconst remaining = bytes.subarray(offset).toString(\"utf8\");\n\tconst page = truncateHead(remaining, {\n\t\tmaxBytes: DEFAULT_MAX_BYTES - 256,\n\t\tmaxLines: DEFAULT_MAX_LINES - 3,\n\t});\n\tconst body = page.firstLineExceedsLimit\n\t\t? utf8Prefix(bytes.subarray(offset), DEFAULT_MAX_BYTES - 256)\n\t\t: page.content;\n\tconst end = offset + Buffer.byteLength(body, \"utf8\");\n\tconst truncated = end < bytes.length;\n\tconst notice = truncated\n\t\t? `\\n\\n[Truncated. Continue with the same responseId and selectors, offset: ${end}.]`\n\t\t: \"\";\n\tconst metadata = Object.fromEntries(\n\t\tObject.entries(details).map(([key, value]) => [\n\t\t\tkey,\n\t\t\ttypeof value === \"string\"\n\t\t\t\t? utf8Prefix(Buffer.from(value, \"utf8\"), 512)\n\t\t\t\t: value,\n\t\t]),\n\t);\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text: body + notice }],\n\t\tdetails: {\n\t\t\t...metadata,\n\t\t\toffset,\n\t\t\tnextOffset: truncated ? end : null,\n\t\t\ttruncated,\n\t\t\ttotalBytes: bytes.length,\n\t\t\tpageBytes: end - offset,\n\t\t},\n\t};\n}\n"]}
|