@ashx-j/lunr 0.2.26 → 0.2.28
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 +25 -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/accounting.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js +5 -2
- package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.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/chain-root-attachment.d.ts +4 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +6 -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 +17 -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 +5 -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 +78 -42
- 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 +0 -3
- 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 +134 -28
- 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 +26 -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/session-tokens.d.ts +7 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js +70 -38
- package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +9 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +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/slash/slash-commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +13 -62
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.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 +18 -9
- 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 +28 -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/catalog/models.json +1 -1
- package/dist/catalog/providers/google-vertex.json +1 -1
- package/dist/catalog/providers/google.json +1 -1
- package/dist/catalog/publication.json +3 -3
- 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 +46 -21
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +344 -126
- 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/cache-stats.d.ts +1 -1
- package/dist/core/cache-stats.d.ts.map +1 -1
- package/dist/core/cache-stats.js +1 -1
- package/dist/core/cache-stats.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +2 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +1 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +5 -11
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +38 -92
- package/dist/core/compaction/compaction.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/context-breakdown.d.ts +2 -2
- package/dist/core/context-breakdown.d.ts.map +1 -1
- package/dist/core/context-breakdown.js +22 -20
- package/dist/core/context-breakdown.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 +11 -1
- 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 +11 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +111 -33
- 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-accounting.d.ts +47 -0
- package/dist/core/usage-accounting.d.ts.map +1 -0
- package/dist/core/usage-accounting.js +205 -0
- package/dist/core/usage-accounting.js.map +1 -0
- 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-history.d.ts +1 -18
- package/dist/core/usage-history.d.ts.map +1 -1
- package/dist/core/usage-history.js +46 -114
- package/dist/core/usage-history.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 +69 -15
- 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/context-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/context-view.js +2 -2
- package/dist/modes/interactive/components/context-view.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/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +8 -12
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts +5 -0
- package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/usage-view.js +21 -6
- package/dist/modes/interactive/components/usage-view.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -7
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +151 -131
- 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-RTUGP3XR.js +54 -0
- package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
- package/dist/node-runtime/{builtin-extensions-I2HIFEMY.js → builtin-extensions-N4EUD6SB.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-4QRUZ64T.js +1203 -0
- 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-WIF24I7G.js → chunk-APVM5NEU.js} +149 -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-LJTIVM7I.js → chunk-BMRXLQWQ.js} +464 -160
- package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
- package/dist/node-runtime/{chunk-T4DA4XE7.js → chunk-DFMPRAQQ.js} +162 -82
- package/dist/node-runtime/{chunk-SN2KSMPQ.js → chunk-DQSCFU7R.js} +13 -7
- package/dist/node-runtime/{chunk-UVWCDQYF.js → chunk-E5DQGNJI.js} +455 -278
- package/dist/node-runtime/{chunk-4SBQAI4T.js → chunk-EBLAZVSA.js} +2058 -73
- 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-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-XHIRAZ26.js → chunk-IAZSK7KK.js} +1 -1
- package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-ICKGAKWX.js} +23 -59
- 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-L24TPBS4.js → chunk-JEK35V2M.js} +45 -31
- package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
- 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-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
- package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
- package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-PWHTSQC4.js} +83 -21
- package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
- package/dist/node-runtime/{chunk-RCR3XAQY.js → chunk-QT3F6UEV.js} +233 -169
- 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-CDVHZOOK.js → chunk-RY3FJ6WI.js} +29 -27
- package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
- package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-STMX7W5I.js} +3 -3
- package/dist/node-runtime/chunk-SWWHZ2RI.js +158 -0
- package/dist/node-runtime/{chunk-5Q4A37RB.js → chunk-TCT6PCUR.js} +32 -11
- package/dist/node-runtime/{chunk-P7XBVXGT.js → chunk-U3YVZ6UC.js} +18 -14
- 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-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-YRT7I2BW.js} +5 -5
- package/dist/node-runtime/{commands-NAAL7KNT.js → commands-2ETOWWRA.js} +16 -16
- package/dist/node-runtime/{commands-EMBQQVVT.js → commands-D6A6H4TS.js} +11 -18
- 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-DBQRRMAY.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-V6K2CDWN.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-J7TYMOBK.js} +14 -8
- package/dist/node-runtime/index.js +51 -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-ASZ7APYP.js +75 -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-WD3YH4CR.js} +93 -80
- package/dist/node-runtime/main.js +43 -41
- package/dist/node-runtime/{mobile-commands-O5LCHL32.js → mobile-commands-ICUXFW5V.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-QPU3OXE4.js} +114 -167
- 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 +43 -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-LYH53ESV.js} +4 -4
- package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-ZJ3N5Q74.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-UI6SHG3X.js} +412 -288
- 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 +25 -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
|
@@ -87,6 +87,7 @@ function sendCompletion(pi, details) {
|
|
|
87
87
|
customType: "subagent-notify",
|
|
88
88
|
content,
|
|
89
89
|
display: true,
|
|
90
|
+
details: { children: details.flatMap((detail) => detail.children ?? []) },
|
|
90
91
|
}, { triggerTurn: details.some((detail) => detail.status !== "stopped") });
|
|
91
92
|
}
|
|
92
93
|
function completionBatchKey(result) {
|
|
@@ -116,6 +117,7 @@ export function buildCompletionDetails(result) {
|
|
|
116
117
|
return {
|
|
117
118
|
agent,
|
|
118
119
|
status,
|
|
120
|
+
children: result.results?.map((child, index) => ({ ...child, childId: child.childId ?? `${result.id}:${index}` })),
|
|
119
121
|
...(result.source ? { source: result.source } : {}),
|
|
120
122
|
...(taskInfo ? { taskInfo } : {}),
|
|
121
123
|
resultPreview: [
|
|
@@ -145,45 +147,20 @@ export function buildCompletionDetails(result) {
|
|
|
145
147
|
};
|
|
146
148
|
}
|
|
147
149
|
export default function registerSubagentNotify(pi, state, options = {}) {
|
|
148
|
-
|
|
149
|
-
const batcherStoreKey = "__pi_subagents_notify_batcher__";
|
|
150
|
-
const globalStore = globalThis;
|
|
151
|
-
const previousUnsubscribe = globalStore[unsubscribeStoreKey];
|
|
152
|
-
if (typeof previousUnsubscribe === "function") {
|
|
153
|
-
try {
|
|
154
|
-
previousUnsubscribe();
|
|
155
|
-
}
|
|
156
|
-
catch {
|
|
157
|
-
// Best effort cleanup for stale handlers from an older reload.
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
const previousBatcher = globalStore[batcherStoreKey];
|
|
161
|
-
if (previousBatcher && typeof previousBatcher.dispose === "function") {
|
|
162
|
-
try {
|
|
163
|
-
previousBatcher.dispose();
|
|
164
|
-
}
|
|
165
|
-
catch {
|
|
166
|
-
// Best effort cleanup for a stale batcher from an older reload.
|
|
167
|
-
}
|
|
168
|
-
}
|
|
150
|
+
let disposed = false;
|
|
169
151
|
const seen = getGlobalSeenMap("__pi_subagents_notify_seen__");
|
|
170
152
|
const ttlMs = 10 * 60 * 1000;
|
|
171
153
|
const nowFn = options.now ?? Date.now;
|
|
172
154
|
const batchConfig = resolveCompletionBatchConfig(options.batchConfig);
|
|
173
155
|
const batchers = new Map();
|
|
174
|
-
globalStore[batcherStoreKey] = {
|
|
175
|
-
dispose() {
|
|
176
|
-
for (const batcher of batchers.values())
|
|
177
|
-
batcher.dispose();
|
|
178
|
-
batchers.clear();
|
|
179
|
-
},
|
|
180
|
-
};
|
|
181
156
|
const handleComplete = (data) => {
|
|
157
|
+
if (disposed)
|
|
158
|
+
return;
|
|
182
159
|
const result = data;
|
|
183
160
|
if (typeof result.sessionId !== "string" || result.sessionId !== state.currentSessionId)
|
|
184
161
|
return;
|
|
185
162
|
const now = nowFn();
|
|
186
|
-
const key = buildCompletionKey(result, "notify")
|
|
163
|
+
const key = `${result.sessionId}:${buildCompletionKey(result, "notify")}`;
|
|
187
164
|
if (markSeenWithTtl(seen, key, now, ttlMs))
|
|
188
165
|
return;
|
|
189
166
|
const details = buildCompletionDetails(result);
|
|
@@ -196,7 +173,10 @@ export default function registerSubagentNotify(pi, state, options = {}) {
|
|
|
196
173
|
if (!batcher) {
|
|
197
174
|
batcher = createCompletionBatcher({
|
|
198
175
|
config: batchConfig,
|
|
199
|
-
emit: (items) =>
|
|
176
|
+
emit: (items) => {
|
|
177
|
+
if (!disposed && result.sessionId === state.currentSessionId)
|
|
178
|
+
sendCompletion(pi, items);
|
|
179
|
+
},
|
|
200
180
|
...(options.timers ? { timers: options.timers } : {}),
|
|
201
181
|
now: nowFn,
|
|
202
182
|
});
|
|
@@ -216,7 +196,13 @@ export default function registerSubagentNotify(pi, state, options = {}) {
|
|
|
216
196
|
pi.events.on(SUBAGENT_ASYNC_COMPLETE_EVENT, handleComplete),
|
|
217
197
|
pi.events.on(SUBAGENT_FOREGROUND_COMPLETE_EVENT, handleComplete),
|
|
218
198
|
].filter((unsubscribe) => typeof unsubscribe === "function");
|
|
219
|
-
|
|
199
|
+
return () => {
|
|
200
|
+
if (disposed)
|
|
201
|
+
return;
|
|
202
|
+
disposed = true;
|
|
203
|
+
for (const batcher of batchers.values())
|
|
204
|
+
batcher.dispose();
|
|
205
|
+
batchers.clear();
|
|
220
206
|
for (const unsubscribe of unsubscribers)
|
|
221
207
|
unsubscribe();
|
|
222
208
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/notify.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Subagent completion notifications.\n *\n * Successful (completed) async results are held briefly and emitted as a\n * single grouped message when sibling jobs finish within a short window (see\n * `completion-batcher.ts`). Failed and paused results bypass grouping and fire\n * immediately, flushing any held successes first, so failure and attention\n * signals are never delayed.\n */\n\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport { buildCompletionKey, getGlobalSeenMap, markSeenWithTtl } from \"./completion-dedupe.ts\";\nimport {\n\ttype CompletionBatchConfig,\n\ttype CompletionBatcher,\n\tcreateCompletionBatcher,\n\tresolveCompletionBatchConfig,\n} from \"./completion-batcher.ts\";\nimport { formatNestedResultLines, resolveSubagentResultStatus } from \"../../intercom/result-intercom.ts\";\nimport { SUBAGENT_ASYNC_COMPLETE_EVENT, SUBAGENT_FOREGROUND_COMPLETE_EVENT, type AcceptanceLedger, type SubagentResultIntercomChild, type SubagentState } from \"../../shared/types.ts\";\n\ninterface ChainStepResult extends Partial<SubagentResultIntercomChild> {\n\tagent: string;\n\toutput: string;\n\tsummary?: string;\n\terror?: string;\n\tacceptance?: AcceptanceLedger;\n\tsuccess: boolean;\n}\n\nexport interface SubagentNotifyDetails {\n\tagent: string;\n\tstatus: \"completed\" | \"failed\" | \"paused\" | \"stopped\";\n\tsource?: \"async\" | \"foreground\";\n\ttaskInfo?: string;\n\tresultPreview: string;\n\tdurationMs?: number;\n\tsessionLabel?: string;\n\tsessionValue?: string;\n}\n\ninterface SubagentResult {\n\tid: string | null;\n\tsource?: \"async\" | \"foreground\";\n\tagent: string | null;\n\tsuccess: boolean;\n\tsummary: string;\n\texitCode?: number;\n\tstate?: string;\n\ttimestamp: number;\n\tdurationMs?: number;\n\tcwd?: string;\n\tasyncDir?: string;\n\tsessionFile?: string;\n\tshareUrl?: string;\n\tgistUrl?: string;\n\tshareError?: string;\n\tresults?: ChainStepResult[];\n\ttaskIndex?: number;\n\ttotalTasks?: number;\n\tsessionId?: string | null;\n}\n\ninterface NotifyTimerApi {\n\tsetTimeout(handler: () => void, delayMs: number): unknown;\n\tclearTimeout(handle: unknown): void;\n}\n\nexport interface RegisterSubagentNotifyOptions {\n\tbatchConfig?: CompletionBatchConfig;\n\ttimers?: NotifyTimerApi;\n\tnow?: () => number;\n}\n\nfunction formatSessionLine(details: SubagentNotifyDetails): string | undefined {\n\tif (!details.sessionValue) return undefined;\n\treturn details.sessionLabel ? `${details.sessionLabel}: ${details.sessionValue}` : details.sessionValue;\n}\n\nexport function formatSingleCompletion(details: SubagentNotifyDetails): string {\n\tconst sessionLine = formatSessionLine(details);\n\tconst taskKind = details.source === \"foreground\" ? \"Detached foreground task\" : \"Background task\";\n\treturn [\n\t\t`${taskKind} ${details.status}: **${details.agent}**${details.taskInfo ?? \"\"}`,\n\t\t\"\",\n\t\tdetails.resultPreview.trim() ? details.resultPreview : \"(no output)\",\n\t\tsessionLine ? \"\" : undefined,\n\t\tsessionLine,\n\t]\n\t\t.filter((line) => line !== undefined)\n\t\t.join(\"\\n\");\n}\n\nexport function parseSubagentNotifyContent(content: string): SubagentNotifyDetails | undefined {\n\tconst lines = content.split(\"\\n\");\n\tconst match = (lines[0] ?? \"\").match(/^(Background task|Detached foreground task) (completed|failed|paused|stopped): \\*\\*(.+?)\\*\\*(?:\\s+(\\([^)]*\\)))?$/);\n\tif (!match) return undefined;\n\tconst body = lines.slice(2);\n\tlet sessionIndex = -1;\n\tfor (let i = body.length - 1; i >= 1; i--) {\n\t\tif (body[i - 1]?.trim() === \"\" && /^(Session|Session file|Session share error):\\s+/.test(body[i]!)) {\n\t\t\tsessionIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst sessionLine = sessionIndex >= 0 ? body[sessionIndex] : undefined;\n\tconst resultPreview = (sessionIndex >= 0 ? body.slice(0, sessionIndex) : body).join(\"\\n\").trim() || \"(no output)\";\n\tlet sessionLabel: string | undefined;\n\tlet sessionValue: string | undefined;\n\tif (sessionLine) {\n\t\tconst separator = sessionLine.indexOf(\":\");\n\t\tsessionLabel = sessionLine.slice(0, separator).toLowerCase();\n\t\tsessionValue = sessionLine.slice(separator + 1).trim();\n\t}\n\treturn {\n\t\tagent: match[3]!,\n\t\tstatus: match[2] as SubagentNotifyDetails[\"status\"],\n\t\t...(match[1] === \"Detached foreground task\" ? { source: \"foreground\" as const } : {}),\n\t\t...(match[4] ? { taskInfo: match[4] } : {}),\n\t\tresultPreview,\n\t\t...(sessionLabel && sessionValue ? { sessionLabel, sessionValue } : {}),\n\t};\n}\n\nexport function formatGroupedCompletion(details: SubagentNotifyDetails[]): string {\n\tconst header = `Background tasks completed (${details.length}): ${details.map((d) => `**${d.agent}**${d.taskInfo ?? \"\"}`).join(\", \")}`;\n\tconst blocks: string[] = [header, \"\"];\n\tfor (let index = 0; index < details.length; index++) {\n\t\tconst detail = details[index];\n\t\tif (!detail) continue;\n\t\tconst sessionLine = formatSessionLine(detail);\n\t\tblocks.push(`${index + 1}. ${detail.agent}${detail.taskInfo ?? \"\"}`);\n\t\tblocks.push(detail.resultPreview.trim() ? detail.resultPreview : \"(no output)\");\n\t\tif (sessionLine) blocks.push(sessionLine);\n\t\tblocks.push(\"\");\n\t}\n\treturn blocks.join(\"\\n\").trimEnd();\n}\n\nfunction sendCompletion(pi: Pick<ExtensionAPI, \"sendMessage\">, details: SubagentNotifyDetails[]): void {\n\tif (details.length === 0) return;\n\tconst content = details.length === 1\n\t\t? formatSingleCompletion(details[0]!)\n\t\t: formatGroupedCompletion(details);\n\tpi.sendMessage(\n\t\t{\n\t\t\tcustomType: \"subagent-notify\",\n\t\t\tcontent,\n\t\t\tdisplay: true,\n\t\t},\n\t\t{ triggerTurn: details.some((detail) => detail.status !== \"stopped\") },\n\t);\n}\n\nfunction completionBatchKey(result: SubagentResult): string {\n\tconst sessionId = typeof result.sessionId === \"string\" ? result.sessionId.trim() : \"\";\n\tif (sessionId) return `session:${sessionId}`;\n\tconst cwd = typeof result.cwd === \"string\" ? result.cwd.trim() : \"\";\n\treturn cwd ? `cwd:${cwd}` : \"unknown\";\n}\n\nexport function buildCompletionDetails(result: SubagentResult): SubagentNotifyDetails {\n\tconst agent = result.agent ?? \"unknown\";\n\tconst summary = typeof result.summary === \"string\" ? result.summary : \"\";\n\tconst paused = !result.success && (\n\t\tresult.exitCode === 0\n\t\t|| result.state === \"paused\"\n\t\t|| summary.startsWith(\"Paused after interrupt.\")\n\t);\n\tconst status = result.state === \"stopped\" ? \"stopped\" : paused ? \"paused\" : result.success ? \"completed\" : \"failed\";\n\n\tconst taskInfo =\n\t\tresult.taskIndex !== undefined && result.totalTasks !== undefined\n\t\t\t? ` (${result.taskIndex + 1}/${result.totalTasks})`\n\t\t\t: undefined;\n\n\tconst session =\n\t\tresult.shareUrl\n\t\t\t? { label: \"Session\", value: result.shareUrl }\n\t\t\t: result.shareError\n\t\t\t\t? { label: \"Session share error\", value: result.shareError }\n\t\t\t\t: result.sessionFile\n\t\t\t\t\t? { label: \"Session file\", value: result.sessionFile }\n\t\t\t\t\t: undefined;\n\n\treturn {\n\t\tagent,\n\t\tstatus,\n\t\t...(result.source ? { source: result.source } : {}),\n\t\t...(taskInfo ? { taskInfo } : {}),\n\t\tresultPreview: [\n\t\t\tresult.id ? `Run: ${result.id}` : undefined,\n\t\t\tresult.asyncDir ? `Async dir: ${result.asyncDir}` : undefined,\n\t\t\tresult.results?.length\n\t\t\t\t? result.results.map((child, index) => {\n\t\t\t\t\tconst output = child.summary ?? (child.error ? `${child.error}\\n\\nOutput:\\n${child.output}` : child.output);\n\t\t\t\t\tconst report = child.acceptance?.childReport;\n\t\t\t\t\tconst childIndex = child.index ?? index;\n\t\t\t\t\treturn [\n\t\t\t\t\t\t`${childIndex + 1}. ${child.agent} [${child.status ?? resolveSubagentResultStatus({ success: child.success, state: result.state })}]`,\n\t\t\t\t\t\tchild.artifactPath ? `Output artifact: ${child.artifactPath}` : undefined,\n\t\t\t\t\t\tchild.sessionPath ? `Session: ${child.sessionPath}` : undefined,\n\t\t\t\t\t\tchild.sessionPath && result.id && result.source !== \"foreground\"\n\t\t\t\t\t\t\t? `Revive: subagent({ action: \"resume\", id: ${JSON.stringify(result.id)}, index: ${childIndex}, message: \"...\" })`\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t...formatNestedResultLines(child.children),\n\t\t\t\t\t\toutput,\n\t\t\t\t\t\treport ? `\\`\\`\\`acceptance-report\\n${JSON.stringify(report, null, 2)}\\n\\`\\`\\`` : undefined,\n\t\t\t\t\t].filter((line) => line !== undefined).join(\"\\n\");\n\t\t\t\t}).join(\"\\n\\n\")\n\t\t\t\t: summary,\n\t\t].filter((line) => line !== undefined).join(\"\\n\\n\"),\n\t\t...(typeof result.durationMs === \"number\" ? { durationMs: result.durationMs } : {}),\n\t\t...(session ? { sessionLabel: session.label, sessionValue: session.value } : {}),\n\t};\n}\n\nexport default function registerSubagentNotify(\n\tpi: ExtensionAPI,\n\tstate: Pick<SubagentState, \"currentSessionId\">,\n\toptions: RegisterSubagentNotifyOptions = {},\n): void {\n\tconst unsubscribeStoreKey = \"__pi_subagents_notify_unsubscribe__\";\n\tconst batcherStoreKey = \"__pi_subagents_notify_batcher__\";\n\tconst globalStore = globalThis as Record<string, unknown>;\n\tconst previousUnsubscribe = globalStore[unsubscribeStoreKey];\n\tif (typeof previousUnsubscribe === \"function\") {\n\t\ttry {\n\t\t\tpreviousUnsubscribe();\n\t\t} catch {\n\t\t\t// Best effort cleanup for stale handlers from an older reload.\n\t\t}\n\t}\n\tconst previousBatcher = globalStore[batcherStoreKey];\n\tif (previousBatcher && typeof (previousBatcher as { dispose?: () => void }).dispose === \"function\") {\n\t\ttry {\n\t\t\t(previousBatcher as { dispose: () => void }).dispose();\n\t\t} catch {\n\t\t\t// Best effort cleanup for a stale batcher from an older reload.\n\t\t}\n\t}\n\n\tconst seen = getGlobalSeenMap(\"__pi_subagents_notify_seen__\");\n\tconst ttlMs = 10 * 60 * 1000;\n\tconst nowFn = options.now ?? Date.now;\n\tconst batchConfig = resolveCompletionBatchConfig(options.batchConfig);\n\tconst batchers = new Map<string, CompletionBatcher<SubagentNotifyDetails>>();\n\tglobalStore[batcherStoreKey] = {\n\t\tdispose() {\n\t\t\tfor (const batcher of batchers.values()) batcher.dispose();\n\t\t\tbatchers.clear();\n\t\t},\n\t};\n\n\tconst handleComplete = (data: unknown) => {\n\t\tconst result = data as SubagentResult;\n\t\tif (typeof result.sessionId !== \"string\" || result.sessionId !== state.currentSessionId) return;\n\t\tconst now = nowFn();\n\t\tconst key = buildCompletionKey(result, \"notify\");\n\t\tif (markSeenWithTtl(seen, key, now, ttlMs)) return;\n\n\t\tconst details = buildCompletionDetails(result);\n\t\tif (result.source === \"foreground\") {\n\t\t\tsendCompletion(pi, [details]);\n\t\t\treturn;\n\t\t}\n\t\tconst batchKey = completionBatchKey(result);\n\t\tlet batcher = batchers.get(batchKey);\n\t\tif (!batcher) {\n\t\t\tbatcher = createCompletionBatcher<SubagentNotifyDetails>({\n\t\t\t\tconfig: batchConfig,\n\t\t\t\temit: (items) => sendCompletion(pi, items),\n\t\t\t\t...(options.timers ? { timers: options.timers } : {}),\n\t\t\t\tnow: nowFn,\n\t\t\t});\n\t\t\tbatchers.set(batchKey, batcher);\n\t\t}\n\t\tif (details.status !== \"completed\") {\n\t\t\t// Failures and paused runs bypass grouping. Flush any held\n\t\t\t// successes for the same owner first so they are not stranded\n\t\t\t// behind this signal, then emit the non-completion result immediately.\n\t\t\tbatcher.flush();\n\t\t\tsendCompletion(pi, [details]);\n\t\t\treturn;\n\t\t}\n\t\tbatcher.push(details);\n\t};\n\n\tconst unsubscribers = [\n\t\tpi.events.on(SUBAGENT_ASYNC_COMPLETE_EVENT, handleComplete),\n\t\tpi.events.on(SUBAGENT_FOREGROUND_COMPLETE_EVENT, handleComplete),\n\t].filter((unsubscribe): unsubscribe is () => void => typeof unsubscribe === \"function\");\n\tglobalStore[unsubscribeStoreKey] = () => {\n\t\tfor (const unsubscribe of unsubscribers) unsubscribe();\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/notify.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Subagent completion notifications.\n *\n * Successful (completed) async results are held briefly and emitted as a\n * single grouped message when sibling jobs finish within a short window (see\n * `completion-batcher.ts`). Failed and paused results bypass grouping and fire\n * immediately, flushing any held successes first, so failure and attention\n * signals are never delayed.\n */\n\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport { buildCompletionKey, getGlobalSeenMap, markSeenWithTtl } from \"./completion-dedupe.ts\";\nimport {\n\ttype CompletionBatchConfig,\n\ttype CompletionBatcher,\n\tcreateCompletionBatcher,\n\tresolveCompletionBatchConfig,\n} from \"./completion-batcher.ts\";\nimport { formatNestedResultLines, resolveSubagentResultStatus } from \"../../intercom/result-intercom.ts\";\nimport { SUBAGENT_ASYNC_COMPLETE_EVENT, SUBAGENT_FOREGROUND_COMPLETE_EVENT, type AcceptanceLedger, type SubagentResultIntercomChild, type SubagentState } from \"../../shared/types.ts\";\n\ninterface ChainStepResult extends Partial<SubagentResultIntercomChild> {\n\tagent: string;\n\tchildId?: string;\n\tsessionFile?: string;\n\tusage?: import(\"../../shared/types.ts\").Usage;\n\tusageRequests?: import(\"../../../../../core/usage-accounting.ts\").AccountedRequest[];\n\toutput: string;\n\tsummary?: string;\n\terror?: string;\n\tacceptance?: AcceptanceLedger;\n\tsuccess: boolean;\n}\n\nexport interface SubagentNotifyDetails {\n\tagent: string;\n\tchildren?: ChainStepResult[];\n\tstatus: \"completed\" | \"failed\" | \"paused\" | \"stopped\";\n\tsource?: \"async\" | \"foreground\";\n\ttaskInfo?: string;\n\tresultPreview: string;\n\tdurationMs?: number;\n\tsessionLabel?: string;\n\tsessionValue?: string;\n}\n\ninterface SubagentResult {\n\tid: string | null;\n\tsource?: \"async\" | \"foreground\";\n\tagent: string | null;\n\tsuccess: boolean;\n\tsummary: string;\n\texitCode?: number;\n\tstate?: string;\n\ttimestamp: number;\n\tdurationMs?: number;\n\tcwd?: string;\n\tasyncDir?: string;\n\tsessionFile?: string;\n\tshareUrl?: string;\n\tgistUrl?: string;\n\tshareError?: string;\n\tresults?: ChainStepResult[];\n\ttaskIndex?: number;\n\ttotalTasks?: number;\n\tsessionId?: string | null;\n}\n\ninterface NotifyTimerApi {\n\tsetTimeout(handler: () => void, delayMs: number): unknown;\n\tclearTimeout(handle: unknown): void;\n}\n\nexport interface RegisterSubagentNotifyOptions {\n\tbatchConfig?: CompletionBatchConfig;\n\ttimers?: NotifyTimerApi;\n\tnow?: () => number;\n}\n\nfunction formatSessionLine(details: SubagentNotifyDetails): string | undefined {\n\tif (!details.sessionValue) return undefined;\n\treturn details.sessionLabel ? `${details.sessionLabel}: ${details.sessionValue}` : details.sessionValue;\n}\n\nexport function formatSingleCompletion(details: SubagentNotifyDetails): string {\n\tconst sessionLine = formatSessionLine(details);\n\tconst taskKind = details.source === \"foreground\" ? \"Detached foreground task\" : \"Background task\";\n\treturn [\n\t\t`${taskKind} ${details.status}: **${details.agent}**${details.taskInfo ?? \"\"}`,\n\t\t\"\",\n\t\tdetails.resultPreview.trim() ? details.resultPreview : \"(no output)\",\n\t\tsessionLine ? \"\" : undefined,\n\t\tsessionLine,\n\t]\n\t\t.filter((line) => line !== undefined)\n\t\t.join(\"\\n\");\n}\n\nexport function parseSubagentNotifyContent(content: string): SubagentNotifyDetails | undefined {\n\tconst lines = content.split(\"\\n\");\n\tconst match = (lines[0] ?? \"\").match(/^(Background task|Detached foreground task) (completed|failed|paused|stopped): \\*\\*(.+?)\\*\\*(?:\\s+(\\([^)]*\\)))?$/);\n\tif (!match) return undefined;\n\tconst body = lines.slice(2);\n\tlet sessionIndex = -1;\n\tfor (let i = body.length - 1; i >= 1; i--) {\n\t\tif (body[i - 1]?.trim() === \"\" && /^(Session|Session file|Session share error):\\s+/.test(body[i]!)) {\n\t\t\tsessionIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst sessionLine = sessionIndex >= 0 ? body[sessionIndex] : undefined;\n\tconst resultPreview = (sessionIndex >= 0 ? body.slice(0, sessionIndex) : body).join(\"\\n\").trim() || \"(no output)\";\n\tlet sessionLabel: string | undefined;\n\tlet sessionValue: string | undefined;\n\tif (sessionLine) {\n\t\tconst separator = sessionLine.indexOf(\":\");\n\t\tsessionLabel = sessionLine.slice(0, separator).toLowerCase();\n\t\tsessionValue = sessionLine.slice(separator + 1).trim();\n\t}\n\treturn {\n\t\tagent: match[3]!,\n\t\tstatus: match[2] as SubagentNotifyDetails[\"status\"],\n\t\t...(match[1] === \"Detached foreground task\" ? { source: \"foreground\" as const } : {}),\n\t\t...(match[4] ? { taskInfo: match[4] } : {}),\n\t\tresultPreview,\n\t\t...(sessionLabel && sessionValue ? { sessionLabel, sessionValue } : {}),\n\t};\n}\n\nexport function formatGroupedCompletion(details: SubagentNotifyDetails[]): string {\n\tconst header = `Background tasks completed (${details.length}): ${details.map((d) => `**${d.agent}**${d.taskInfo ?? \"\"}`).join(\", \")}`;\n\tconst blocks: string[] = [header, \"\"];\n\tfor (let index = 0; index < details.length; index++) {\n\t\tconst detail = details[index];\n\t\tif (!detail) continue;\n\t\tconst sessionLine = formatSessionLine(detail);\n\t\tblocks.push(`${index + 1}. ${detail.agent}${detail.taskInfo ?? \"\"}`);\n\t\tblocks.push(detail.resultPreview.trim() ? detail.resultPreview : \"(no output)\");\n\t\tif (sessionLine) blocks.push(sessionLine);\n\t\tblocks.push(\"\");\n\t}\n\treturn blocks.join(\"\\n\").trimEnd();\n}\n\nfunction sendCompletion(pi: Pick<ExtensionAPI, \"sendMessage\">, details: SubagentNotifyDetails[]): void {\n\tif (details.length === 0) return;\n\tconst content = details.length === 1\n\t\t? formatSingleCompletion(details[0]!)\n\t\t: formatGroupedCompletion(details);\n\tpi.sendMessage(\n\t\t{\n\t\t\tcustomType: \"subagent-notify\",\n\t\t\tcontent,\n\t\t\tdisplay: true,\n\t\t\tdetails: { children: details.flatMap((detail) => detail.children ?? []) },\n\t\t},\n\t\t{ triggerTurn: details.some((detail) => detail.status !== \"stopped\") },\n\t);\n}\n\nfunction completionBatchKey(result: SubagentResult): string {\n\tconst sessionId = typeof result.sessionId === \"string\" ? result.sessionId.trim() : \"\";\n\tif (sessionId) return `session:${sessionId}`;\n\tconst cwd = typeof result.cwd === \"string\" ? result.cwd.trim() : \"\";\n\treturn cwd ? `cwd:${cwd}` : \"unknown\";\n}\n\nexport function buildCompletionDetails(result: SubagentResult): SubagentNotifyDetails {\n\tconst agent = result.agent ?? \"unknown\";\n\tconst summary = typeof result.summary === \"string\" ? result.summary : \"\";\n\tconst paused = !result.success && (\n\t\tresult.exitCode === 0\n\t\t|| result.state === \"paused\"\n\t\t|| summary.startsWith(\"Paused after interrupt.\")\n\t);\n\tconst status = result.state === \"stopped\" ? \"stopped\" : paused ? \"paused\" : result.success ? \"completed\" : \"failed\";\n\n\tconst taskInfo =\n\t\tresult.taskIndex !== undefined && result.totalTasks !== undefined\n\t\t\t? ` (${result.taskIndex + 1}/${result.totalTasks})`\n\t\t\t: undefined;\n\n\tconst session =\n\t\tresult.shareUrl\n\t\t\t? { label: \"Session\", value: result.shareUrl }\n\t\t\t: result.shareError\n\t\t\t\t? { label: \"Session share error\", value: result.shareError }\n\t\t\t\t: result.sessionFile\n\t\t\t\t\t? { label: \"Session file\", value: result.sessionFile }\n\t\t\t\t\t: undefined;\n\n\treturn {\n\t\tagent,\n\t\tstatus,\n\t\tchildren: result.results?.map((child, index) => ({ ...child, childId: child.childId ?? `${result.id}:${index}` })),\n\t\t...(result.source ? { source: result.source } : {}),\n\t\t...(taskInfo ? { taskInfo } : {}),\n\t\tresultPreview: [\n\t\t\tresult.id ? `Run: ${result.id}` : undefined,\n\t\t\tresult.asyncDir ? `Async dir: ${result.asyncDir}` : undefined,\n\t\t\tresult.results?.length\n\t\t\t\t? result.results.map((child, index) => {\n\t\t\t\t\tconst output = child.summary ?? (child.error ? `${child.error}\\n\\nOutput:\\n${child.output}` : child.output);\n\t\t\t\t\tconst report = child.acceptance?.childReport;\n\t\t\t\t\tconst childIndex = child.index ?? index;\n\t\t\t\t\treturn [\n\t\t\t\t\t\t`${childIndex + 1}. ${child.agent} [${child.status ?? resolveSubagentResultStatus({ success: child.success, state: result.state })}]`,\n\t\t\t\t\t\tchild.artifactPath ? `Output artifact: ${child.artifactPath}` : undefined,\n\t\t\t\t\t\tchild.sessionPath ? `Session: ${child.sessionPath}` : undefined,\n\t\t\t\t\t\tchild.sessionPath && result.id && result.source !== \"foreground\"\n\t\t\t\t\t\t\t? `Revive: subagent({ action: \"resume\", id: ${JSON.stringify(result.id)}, index: ${childIndex}, message: \"...\" })`\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t...formatNestedResultLines(child.children),\n\t\t\t\t\t\toutput,\n\t\t\t\t\t\treport ? `\\`\\`\\`acceptance-report\\n${JSON.stringify(report, null, 2)}\\n\\`\\`\\`` : undefined,\n\t\t\t\t\t].filter((line) => line !== undefined).join(\"\\n\");\n\t\t\t\t}).join(\"\\n\\n\")\n\t\t\t\t: summary,\n\t\t].filter((line) => line !== undefined).join(\"\\n\\n\"),\n\t\t...(typeof result.durationMs === \"number\" ? { durationMs: result.durationMs } : {}),\n\t\t...(session ? { sessionLabel: session.label, sessionValue: session.value } : {}),\n\t};\n}\n\nexport default function registerSubagentNotify(\n\tpi: ExtensionAPI,\n\tstate: Pick<SubagentState, \"currentSessionId\">,\n\toptions: RegisterSubagentNotifyOptions = {},\n): () => void {\n\tlet disposed = false;\n\tconst seen = getGlobalSeenMap(\"__pi_subagents_notify_seen__\");\n\tconst ttlMs = 10 * 60 * 1000;\n\tconst nowFn = options.now ?? Date.now;\n\tconst batchConfig = resolveCompletionBatchConfig(options.batchConfig);\n\tconst batchers = new Map<string, CompletionBatcher<SubagentNotifyDetails>>();\n\tconst handleComplete = (data: unknown) => {\n\t\tif (disposed) return;\n\t\tconst result = data as SubagentResult;\n\t\tif (typeof result.sessionId !== \"string\" || result.sessionId !== state.currentSessionId) return;\n\t\tconst now = nowFn();\n\t\tconst key = `${result.sessionId}:${buildCompletionKey(result, \"notify\")}`;\n\t\tif (markSeenWithTtl(seen, key, now, ttlMs)) return;\n\n\t\tconst details = buildCompletionDetails(result);\n\t\tif (result.source === \"foreground\") {\n\t\t\tsendCompletion(pi, [details]);\n\t\t\treturn;\n\t\t}\n\t\tconst batchKey = completionBatchKey(result);\n\t\tlet batcher = batchers.get(batchKey);\n\t\tif (!batcher) {\n\t\t\tbatcher = createCompletionBatcher<SubagentNotifyDetails>({\n\t\t\t\tconfig: batchConfig,\n\t\t\t\temit: (items) => {\n\t\t\t\t\tif (!disposed && result.sessionId === state.currentSessionId) sendCompletion(pi, items);\n\t\t\t\t},\n\t\t\t\t...(options.timers ? { timers: options.timers } : {}),\n\t\t\t\tnow: nowFn,\n\t\t\t});\n\t\t\tbatchers.set(batchKey, batcher);\n\t\t}\n\t\tif (details.status !== \"completed\") {\n\t\t\t// Failures and paused runs bypass grouping. Flush any held\n\t\t\t// successes for the same owner first so they are not stranded\n\t\t\t// behind this signal, then emit the non-completion result immediately.\n\t\t\tbatcher.flush();\n\t\t\tsendCompletion(pi, [details]);\n\t\t\treturn;\n\t\t}\n\t\tbatcher.push(details);\n\t};\n\n\tconst unsubscribers = [\n\t\tpi.events.on(SUBAGENT_ASYNC_COMPLETE_EVENT, handleComplete),\n\t\tpi.events.on(SUBAGENT_FOREGROUND_COMPLETE_EVENT, handleComplete),\n\t].filter((unsubscribe): unsubscribe is () => void => typeof unsubscribe === \"function\");\n\treturn () => {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\t\tfor (const batcher of batchers.values()) batcher.dispose();\n\t\tbatchers.clear();\n\t\tfor (const unsubscribe of unsubscribers) unsubscribe();\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-watcher.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/result-watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAI9B,OAAO,EAEN,KAAK,gBAAgB,EAGrB,KAAK,aAAa,EAClB,MAAM,uBAAuB,CAAC;AAc/B,KAAK,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc,GAAG,OAAO,CAAC,CAAC;AAE9I,KAAK,mBAAmB,GAAG;IAC1B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,aAAa,EAAE,OAAO,aAAa,CAAC;CACpC,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACxB,EAAE,CAAC,EAAE,eAAe,CAAC;IACrB,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AA6DF,wBAAgB,mBAAmB,CAClC,EAAE,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,EACrF,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,IAAI,GAAE,iBAAsB,GAC1B;IACF,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC9B,CA6NA","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { buildCompletionKey, markSeenWithTtl } from \"./completion-dedupe.ts\";\nimport { createFileCoalescer } from \"../../shared/file-coalescer.ts\";\nimport {\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\ttype IntercomEventBus,\n\ttype NestedRunSummary,\n\ttype SubagentResultIntercomChild,\n\ttype SubagentState,\n} from \"../../shared/types.ts\";\nimport {\n\tattachNestedChildrenToResultChildren,\n\tbuildSubagentResultIntercomPayload,\n\tcompactNestedResultChildren,\n\tdeliverSubagentResultIntercomEvent,\n\tresolveSubagentResultStatus,\n} from \"../../intercom/result-intercom.ts\";\nimport { projectNestedRegistryForRoot, sanitizeSummary } from \"../shared/nested-events.ts\";\nimport { resolveWatchPath } from \"../../shared/utils.ts\";\n\nconst WATCHER_RESTART_DELAY_MS = 3000;\nconst POLL_INTERVAL_MS = 3000;\n\ntype ResultWatcherFs = Pick<typeof fs, \"existsSync\" | \"readFileSync\" | \"unlinkSync\" | \"readdirSync\" | \"mkdirSync\" | \"realpathSync\" | \"watch\">;\n\ntype ResultWatcherTimers = {\n\tsetTimeout: typeof setTimeout;\n\tclearTimeout: typeof clearTimeout;\n\tsetInterval: typeof setInterval;\n\tclearInterval: typeof clearInterval;\n};\n\ntype ResultWatcherDeps = {\n\tfs?: ResultWatcherFs;\n\ttimers?: ResultWatcherTimers;\n};\n\ntype ResultFileChild = {\n\tagent?: string;\n\toutput?: string;\n\terror?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tstopped?: boolean;\n\tsessionFile?: string;\n\tartifactPaths?: { outputPath?: string };\n\tintercomTarget?: string;\n\tchildren?: unknown;\n};\n\ntype ResultFileData = {\n\tid?: string;\n\trunId?: string;\n\tagent?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tmode?: string;\n\tsummary?: string;\n\tresults?: ResultFileChild[];\n\tnestedChildren?: unknown;\n\tsessionId?: string;\n\tcwd?: string;\n\tsessionFile?: string;\n\tasyncDir?: string;\n\tintercomTarget?: string;\n};\n\nfunction sanitizeNestedResultChildren(value: unknown, resultPath: string, label: string, report: (message: string) => void): NestedRunSummary[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\treport(`Ignoring invalid nested children in subagent result file '${resultPath}' at ${label}: expected an array.`);\n\t\treturn undefined;\n\t}\n\tconst children = value.map((child) => sanitizeSummary(child)).filter((child): child is NestedRunSummary => Boolean(child));\n\tif (children.length !== value.length) {\n\t\treport(`Ignoring ${value.length - children.length} invalid nested child record(s) in subagent result file '${resultPath}' at ${label}.`);\n\t}\n\treturn children.length ? children : undefined;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n\treturn typeof error === \"object\" && error !== null && \"code\" in error\n\t\t? (error as NodeJS.ErrnoException).code\n\t\t: undefined;\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn getErrorCode(error) === \"ENOENT\";\n}\n\nfunction shouldFallBackToPolling(error: unknown): boolean {\n\tconst code = getErrorCode(error);\n\treturn code === \"EMFILE\" || code === \"ENOSPC\";\n}\n\n\nexport function createResultWatcher(\n\tpi: { events: IntercomEventBus; appendEntry?: (type: string, data: unknown) => void },\n\tstate: SubagentState,\n\tresultsDir: string,\n\tcompletionTtlMs: number,\n\tdeps: ResultWatcherDeps = {},\n): {\n\tstartResultWatcher: () => void;\n\tprimeExistingResults: () => void;\n\tstopResultWatcher: () => void;\n} {\n\tconst fsApi = deps.fs ?? fs;\n\tconst timers = deps.timers ?? { setTimeout, clearTimeout, setInterval, clearInterval };\n\n\tlet generation = 0;\n\tconst inFlight = new Set<string>();\n\tconst attempts = new Map<string, number>();\n\tconst report = (message: string, error?: unknown) => {\n\t\tpi.appendEntry?.(\"subagent_result_delivery\", { message, error: error instanceof Error ? error.message : error });\n\t};\n\n\tconst handleResult = async (file: string) => {\n\t\tif (inFlight.has(file) || (attempts.get(file) ?? 0) >= 3) return;\n\t\tconst currentGeneration = generation;\n\t\tconst sessionId = state.currentSessionId;\n\t\tconst isCurrent = () => generation === currentGeneration && state.currentSessionId === sessionId;\n\t\tconst resultPath = path.join(resultsDir, file);\n\t\tif (!fsApi.existsSync(resultPath)) return;\n\t\tinFlight.add(file);\n\t\ttry {\n\t\t\tconst data = JSON.parse(fsApi.readFileSync(resultPath, \"utf-8\")) as ResultFileData;\n\t\t\tif (typeof data.sessionId !== \"string\" || data.sessionId !== state.currentSessionId) return;\n\n\t\t\tconst runId = data.runId ?? data.id ?? file.replace(/\\.json$/i, \"\");\n\t\t\tconst hasExplicitNestedChildren = data.nestedChildren !== undefined;\n\t\t\tlet nestedChildren = compactNestedResultChildren(sanitizeNestedResultChildren(data.nestedChildren, resultPath, \"nestedChildren\", report));\n\t\t\tif (!nestedChildren?.length && !hasExplicitNestedChildren) {\n\t\t\t\ttry {\n\t\t\t\t\tnestedChildren = compactNestedResultChildren(projectNestedRegistryForRoot(runId)?.children);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treport(`Failed to enrich subagent result file '${resultPath}' with nested registry children; will retry later:`, error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst now = Date.now();\n\t\t\tconst completionKey = buildCompletionKey(data, `result:${file}`);\n\n\t\t\tconst hasResultChildren = Array.isArray(data.results) && data.results.length > 0;\n\t\t\tconst resultChildren = hasResultChildren\n\t\t\t\t? data.results!\n\t\t\t\t: [{\n\t\t\t\t\tagent: data.agent,\n\t\t\t\t\toutput: data.summary,\n\t\t\t\t\tsuccess: data.success,\n\t\t\t\t}];\n\t\t\tconst normalizedChildren = attachNestedChildrenToResultChildren(runId, resultChildren.map((result = {}, index): SubagentResultIntercomChild => {\n\t\t\t\tconst baseOutput = result.output ?? data.summary;\n\t\t\t\tconst hasRealOutput = typeof baseOutput === \"string\" && baseOutput.trim().length > 0;\n\t\t\t\tconst output = hasRealOutput ? baseOutput : \"(no output)\";\n\t\t\t\tconst summary = result.success === false && result.error\n\t\t\t\t\t? `${result.error}${hasRealOutput ? `\\n\\nOutput:\\n${baseOutput}` : \"\"}`\n\t\t\t\t\t: output;\n\t\t\t\tconst sessionPath = result.sessionFile ?? (resultChildren.length === 1 ? data.sessionFile : undefined);\n\t\t\t\tconst childNestedChildren = sanitizeNestedResultChildren(result.children, resultPath, `results[${index}].children`, report);\n\t\t\t\tconst childState = result.state === \"paused\" || result.state === \"stopped\"\n\t\t\t\t\t? result.state\n\t\t\t\t\t: result.stopped === true\n\t\t\t\t\t\t? \"stopped\"\n\t\t\t\t\t\t: data.state === \"paused\" || (!hasResultChildren && (data.state === \"stopped\" || typeof result.success !== \"boolean\"))\n\t\t\t\t\t\t\t? data.state\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\treturn {\n\t\t\t\t\tagent: result.agent ?? data.agent ?? `step-${index + 1}`,\n\t\t\t\t\tstatus: resolveSubagentResultStatus({\n\t\t\t\t\t\tsuccess: result.success,\n\t\t\t\t\t\tstate: childState,\n\t\t\t\t\t}),\n\t\t\t\t\tsummary,\n\t\t\t\t\tindex,\n\t\t\t\t\tartifactPath: result.artifactPaths?.outputPath,\n\t\t\t\t\t...(typeof sessionPath === \"string\" && fsApi.existsSync(sessionPath) ? { sessionPath } : {}),\n\t\t\t\t\t...(result.intercomTarget ? { intercomTarget: result.intercomTarget } : {}),\n\t\t\t\t\t...(childNestedChildren ? { children: childNestedChildren } : {}),\n\t\t\t\t};\n\t\t\t}), nestedChildren);\n\n\t\t\tif (!markSeenWithTtl(state.completionSeen, completionKey, now, completionTtlMs)) {\n\t\t\t\tpi.events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {\n\t\t\t\t\t...data,\n\t\t\t\t\trunId,\n\t\t\t\t\t...(nestedChildren?.length ? { nestedChildren } : {}),\n\t\t\t\t\t...(Array.isArray(data.results) ? { results: hasResultChildren ? normalizedChildren.map((child, index) => ({\n\t\t\t\t\t\t...data.results![index], agent: child.agent, status: child.status, summary: child.summary,\n\t\t\t\t\t\tindex: child.index, artifactPath: child.artifactPath, sessionPath: child.sessionPath, children: child.children,\n\t\t\t\t\t})) : [] } : {}),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!isCurrent()) return;\n\t\t\tconst intercomTarget = data.state === \"stopped\" ? undefined : data.intercomTarget?.trim();\n\t\t\tif (intercomTarget) {\n\t\t\t\tconst mode = data.mode === \"single\" || data.mode === \"parallel\" || data.mode === \"chain\"\n\t\t\t\t\t? data.mode\n\t\t\t\t\t: resultChildren.length > 1 ? \"chain\" : \"single\";\n\t\t\t\tconst payload = buildSubagentResultIntercomPayload({\n\t\t\t\t\tto: intercomTarget,\n\t\t\t\t\trunId,\n\t\t\t\t\tmode,\n\t\t\t\t\tsource: \"async\",\n\t\t\t\t\tchildren: normalizedChildren,\n\t\t\t\t\tasyncId: data.id,\n\t\t\t\t\tasyncDir: data.asyncDir,\n\t\t\t\t});\n\t\t\t\tpayload.requestId = `async-result:${sessionId}:${completionKey}`;\n\t\t\t\tpayload.ownerNotificationSessionId = sessionId;\n\t\t\t\tattempts.set(file, (attempts.get(file) ?? 0) + 1);\n\t\t\t\tconst delivered = await deliverSubagentResultIntercomEvent(pi.events, payload);\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t\tif (!delivered) {\n\t\t\t\t\treport(`Async result delivery pending for '${runId}'; output retained.`, resultPath);\n\t\t\t\t\tif (attempts.get(file)! < 3) state.resultFileCoalescer.schedule(file, 1000);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isCurrent()) fsApi.unlinkSync(resultPath);\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to process subagent result file '${resultPath}'.`, error);\n\t\t} finally {\n\t\t\tinFlight.delete(file);\n\t\t}\n\t};\n\n\tstate.resultFileCoalescer = createFileCoalescer((file) => {\n\t\tvoid handleResult(file);\n\t}, 50);\n\n\tconst primeExistingResults = () => {\n\t\ttry {\n\t\t\tfsApi.readdirSync(resultsDir)\n\t\t\t\t.filter((f) => f.endsWith(\".json\"))\n\t\t\t\t.forEach((file) => state.resultFileCoalescer.schedule(file, 0));\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to scan subagent result directory '${resultsDir}':`, error);\n\t\t}\n\t};\n\n\tconst startPollingFallback = (reason: unknown) => {\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) return;\n\n\t\treport(\n\t\t\t`Subagent result watcher for '${resultsDir}' fell back to polling because native fs.watch is unavailable (${getErrorCode(reason) ?? \"unknown error\"}).`,\n\t\t);\n\t\tprimeExistingResults();\n\t\tstate.watcherRestartTimer = timers.setInterval(primeExistingResults, POLL_INTERVAL_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst scheduleRestart = () => {\n\t\tif (state.watcherRestartTimer) return;\n\t\tstate.watcherRestartTimer = timers.setTimeout(() => {\n\t\t\tstate.watcherRestartTimer = null;\n\t\t\ttry {\n\t\t\t\tfsApi.mkdirSync(resultsDir, { recursive: true });\n\t\t\t\tstartResultWatcher();\n\t\t\t} catch (error) {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Failed to restart subagent result watcher for '${resultsDir}':`, error);\n\t\t\t\tscheduleRestart();\n\t\t\t}\n\t\t}, WATCHER_RESTART_DELAY_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst startResultWatcher = () => {\n\t\tif (state.watcher) return;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t\tstate.watcherRestartTimer = null;\n\t\t}\n\t\ttry {\n\t\t\tconst watchDir = resolveWatchPath(resultsDir, fsApi.realpathSync.native);\n\t\t\tstate.watcher = fsApi.watch(watchDir, (ev, file) => {\n\t\t\t\tif (ev !== \"rename\" || !file) return;\n\t\t\t\tconst fileName = file.toString();\n\t\t\t\tif (!fileName.endsWith(\".json\")) return;\n\t\t\t\tstate.resultFileCoalescer.schedule(fileName);\n\t\t\t});\n\t\t\tstate.watcher.on(\"error\", (error) => {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Subagent result watcher failed for '${resultsDir}':`, error);\n\t\t\t\tstate.watcher?.close();\n\t\t\t\tstate.watcher = null;\n\t\t\t\tscheduleRestart();\n\t\t\t});\n\t\t\tstate.watcher.unref?.();\n\t\t} catch (error) {\n\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\tstartPollingFallback(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treport(`Failed to start subagent result watcher for '${resultsDir}':`, error);\n\t\t\tstate.watcher = null;\n\t\t\tscheduleRestart();\n\t\t}\n\t};\n\n\tconst stopResultWatcher = () => {\n\t\tgeneration++;\n\t\tattempts.clear();\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t}\n\t\tstate.watcherRestartTimer = null;\n\t\tstate.resultFileCoalescer.clear();\n\t};\n\n\treturn { startResultWatcher, primeExistingResults, stopResultWatcher };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"result-watcher.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/result-watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAI9B,OAAO,EAEN,KAAK,gBAAgB,EAGrB,KAAK,aAAa,EAClB,MAAM,uBAAuB,CAAC;AAc/B,KAAK,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc,GAAG,OAAO,CAAC,CAAC;AAE9I,KAAK,mBAAmB,GAAG;IAC1B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,aAAa,EAAE,OAAO,aAAa,CAAC;CACpC,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACxB,EAAE,CAAC,EAAE,eAAe,CAAC;IACrB,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AA6DF,wBAAgB,mBAAmB,CAClC,EAAE,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,EACrF,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,IAAI,GAAE,iBAAsB,GAC1B;IACF,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC9B,CAgOA","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { buildCompletionKey, markSeenWithTtl } from \"./completion-dedupe.ts\";\nimport { createFileCoalescer } from \"../../shared/file-coalescer.ts\";\nimport {\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\ttype IntercomEventBus,\n\ttype NestedRunSummary,\n\ttype SubagentResultIntercomChild,\n\ttype SubagentState,\n} from \"../../shared/types.ts\";\nimport {\n\tattachNestedChildrenToResultChildren,\n\tbuildSubagentResultIntercomPayload,\n\tcompactNestedResultChildren,\n\tdeliverSubagentResultIntercomEvent,\n\tresolveSubagentResultStatus,\n} from \"../../intercom/result-intercom.ts\";\nimport { projectNestedRegistryForRoot, sanitizeSummary } from \"../shared/nested-events.ts\";\nimport { resolveWatchPath } from \"../../shared/utils.ts\";\n\nconst WATCHER_RESTART_DELAY_MS = 3000;\nconst POLL_INTERVAL_MS = 3000;\n\ntype ResultWatcherFs = Pick<typeof fs, \"existsSync\" | \"readFileSync\" | \"unlinkSync\" | \"readdirSync\" | \"mkdirSync\" | \"realpathSync\" | \"watch\">;\n\ntype ResultWatcherTimers = {\n\tsetTimeout: typeof setTimeout;\n\tclearTimeout: typeof clearTimeout;\n\tsetInterval: typeof setInterval;\n\tclearInterval: typeof clearInterval;\n};\n\ntype ResultWatcherDeps = {\n\tfs?: ResultWatcherFs;\n\ttimers?: ResultWatcherTimers;\n};\n\ntype ResultFileChild = {\n\tagent?: string;\n\toutput?: string;\n\terror?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tstopped?: boolean;\n\tsessionFile?: string;\n\tartifactPaths?: { outputPath?: string };\n\tintercomTarget?: string;\n\tchildren?: unknown;\n};\n\ntype ResultFileData = {\n\tid?: string;\n\trunId?: string;\n\tagent?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tmode?: string;\n\tsummary?: string;\n\tresults?: ResultFileChild[];\n\tnestedChildren?: unknown;\n\tsessionId?: string;\n\tcwd?: string;\n\tsessionFile?: string;\n\tasyncDir?: string;\n\tintercomTarget?: string;\n};\n\nfunction sanitizeNestedResultChildren(value: unknown, resultPath: string, label: string, report: (message: string) => void): NestedRunSummary[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\treport(`Ignoring invalid nested children in subagent result file '${resultPath}' at ${label}: expected an array.`);\n\t\treturn undefined;\n\t}\n\tconst children = value.map((child) => sanitizeSummary(child)).filter((child): child is NestedRunSummary => Boolean(child));\n\tif (children.length !== value.length) {\n\t\treport(`Ignoring ${value.length - children.length} invalid nested child record(s) in subagent result file '${resultPath}' at ${label}.`);\n\t}\n\treturn children.length ? children : undefined;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n\treturn typeof error === \"object\" && error !== null && \"code\" in error\n\t\t? (error as NodeJS.ErrnoException).code\n\t\t: undefined;\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn getErrorCode(error) === \"ENOENT\";\n}\n\nfunction shouldFallBackToPolling(error: unknown): boolean {\n\tconst code = getErrorCode(error);\n\treturn code === \"EMFILE\" || code === \"ENOSPC\";\n}\n\n\nexport function createResultWatcher(\n\tpi: { events: IntercomEventBus; appendEntry?: (type: string, data: unknown) => void },\n\tstate: SubagentState,\n\tresultsDir: string,\n\tcompletionTtlMs: number,\n\tdeps: ResultWatcherDeps = {},\n): {\n\tstartResultWatcher: () => void;\n\tprimeExistingResults: () => void;\n\tstopResultWatcher: () => void;\n} {\n\tconst fsApi = deps.fs ?? fs;\n\tconst timers = deps.timers ?? { setTimeout, clearTimeout, setInterval, clearInterval };\n\n\tlet generation = 0;\n\tconst inFlight = new Set<string>();\n\tconst attempts = new Map<string, number>();\n\tconst report = (message: string, error?: unknown) => {\n\t\tpi.appendEntry?.(\"subagent_result_delivery\", { message, error: error instanceof Error ? error.message : error });\n\t};\n\n\tconst handleResult = async (file: string) => {\n\t\tif (inFlight.has(file) || (attempts.get(file) ?? 0) >= 3) return;\n\t\tconst currentGeneration = generation;\n\t\tconst sessionId = state.currentSessionId;\n\t\tconst isCurrent = () => generation === currentGeneration && state.currentSessionId === sessionId;\n\t\tconst resultPath = path.join(resultsDir, file);\n\t\tif (!fsApi.existsSync(resultPath)) return;\n\t\tinFlight.add(file);\n\t\ttry {\n\t\t\tconst data = JSON.parse(fsApi.readFileSync(resultPath, \"utf-8\")) as ResultFileData;\n\t\t\tif (typeof data.sessionId !== \"string\" || data.sessionId !== state.currentSessionId) return;\n\n\t\t\tconst runId = data.runId ?? data.id ?? file.replace(/\\.json$/i, \"\");\n\t\t\tconst hasExplicitNestedChildren = data.nestedChildren !== undefined;\n\t\t\tlet nestedChildren = compactNestedResultChildren(sanitizeNestedResultChildren(data.nestedChildren, resultPath, \"nestedChildren\", report));\n\t\t\tif (!nestedChildren?.length && !hasExplicitNestedChildren) {\n\t\t\t\ttry {\n\t\t\t\t\tnestedChildren = compactNestedResultChildren(projectNestedRegistryForRoot(runId)?.children);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treport(`Failed to enrich subagent result file '${resultPath}' with nested registry children; will retry later:`, error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst now = Date.now();\n\t\t\tconst completionKey = buildCompletionKey(data, `result:${file}`);\n\n\t\t\tconst hasResultChildren = Array.isArray(data.results) && data.results.length > 0;\n\t\t\tconst resultChildren = hasResultChildren\n\t\t\t\t? data.results!\n\t\t\t\t: [{\n\t\t\t\t\tagent: data.agent,\n\t\t\t\t\toutput: data.summary,\n\t\t\t\t\tsuccess: data.success,\n\t\t\t\t}];\n\t\t\tconst normalizedChildren = attachNestedChildrenToResultChildren(runId, resultChildren.map((result = {}, index): SubagentResultIntercomChild => {\n\t\t\t\tconst baseOutput = result.output ?? data.summary;\n\t\t\t\tconst hasRealOutput = typeof baseOutput === \"string\" && baseOutput.trim().length > 0;\n\t\t\t\tconst output = hasRealOutput ? baseOutput : \"(no output)\";\n\t\t\t\tconst summary = result.success === false && result.error\n\t\t\t\t\t? `${result.error}${hasRealOutput ? `\\n\\nOutput:\\n${baseOutput}` : \"\"}`\n\t\t\t\t\t: output;\n\t\t\t\tconst sessionPath = result.sessionFile ?? (resultChildren.length === 1 ? data.sessionFile : undefined);\n\t\t\t\tconst childNestedChildren = sanitizeNestedResultChildren(result.children, resultPath, `results[${index}].children`, report);\n\t\t\t\tconst childState = result.state === \"paused\" || result.state === \"stopped\"\n\t\t\t\t\t? result.state\n\t\t\t\t\t: result.stopped === true\n\t\t\t\t\t\t? \"stopped\"\n\t\t\t\t\t\t: data.state === \"paused\" || (!hasResultChildren && (data.state === \"stopped\" || typeof result.success !== \"boolean\"))\n\t\t\t\t\t\t\t? data.state\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\treturn {\n\t\t\t\t\tagent: result.agent ?? data.agent ?? `step-${index + 1}`,\n\t\t\t\t\tstatus: resolveSubagentResultStatus({\n\t\t\t\t\t\tsuccess: result.success,\n\t\t\t\t\t\tstate: childState,\n\t\t\t\t\t}),\n\t\t\t\t\tsummary,\n\t\t\t\t\tindex,\n\t\t\t\t\tartifactPath: result.artifactPaths?.outputPath,\n\t\t\t\t\t...(typeof sessionPath === \"string\" && fsApi.existsSync(sessionPath) ? { sessionPath } : {}),\n\t\t\t\t\t...(result.intercomTarget ? { intercomTarget: result.intercomTarget } : {}),\n\t\t\t\t\t...(childNestedChildren ? { children: childNestedChildren } : {}),\n\t\t\t\t};\n\t\t\t}), nestedChildren);\n\n\t\t\tif (!markSeenWithTtl(state.completionSeen, completionKey, now, completionTtlMs)) {\n\t\t\t\tpi.events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {\n\t\t\t\t\t...data,\n\t\t\t\t\trunId,\n\t\t\t\t\t...(nestedChildren?.length ? { nestedChildren } : {}),\n\t\t\t\t\t...(Array.isArray(data.results) ? { results: hasResultChildren ? normalizedChildren.map((child, index) => ({\n\t\t\t\t\t\t...data.results![index], agent: child.agent, status: child.status, summary: child.summary,\n\t\t\t\t\t\tindex: child.index, artifactPath: child.artifactPath, sessionPath: child.sessionPath, children: child.children,\n\t\t\t\t\t})) : [] } : {}),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!isCurrent()) return;\n\t\t\tconst intercomTarget = data.state === \"stopped\" ? undefined : data.intercomTarget?.trim();\n\t\t\tif (intercomTarget) {\n\t\t\t\tconst mode = data.mode === \"single\" || data.mode === \"parallel\" || data.mode === \"chain\"\n\t\t\t\t\t? data.mode\n\t\t\t\t\t: resultChildren.length > 1 ? \"chain\" : \"single\";\n\t\t\t\tconst payload = buildSubagentResultIntercomPayload({\n\t\t\t\t\tto: intercomTarget,\n\t\t\t\t\trunId,\n\t\t\t\t\tmode,\n\t\t\t\t\tsource: \"async\",\n\t\t\t\t\tchildren: normalizedChildren,\n\t\t\t\t\tasyncId: data.id,\n\t\t\t\t\tasyncDir: data.asyncDir,\n\t\t\t\t});\n\t\t\t\tpayload.requestId = `async-result:${sessionId}:${completionKey}`;\n\t\t\t\tpayload.ownerNotificationSessionId = sessionId;\n\t\t\t\tattempts.set(file, (attempts.get(file) ?? 0) + 1);\n\t\t\t\tconst delivered = await deliverSubagentResultIntercomEvent(pi.events, payload);\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t\tif (!delivered) {\n\t\t\t\t\treport(`Async result delivery pending for '${runId}'; output retained.`, resultPath);\n\t\t\t\t\tif (attempts.get(file)! < 3) state.resultFileCoalescer.schedule(file, 1000);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isCurrent()) fsApi.unlinkSync(resultPath);\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to process subagent result file '${resultPath}'.`, error);\n\t\t} finally {\n\t\t\tinFlight.delete(file);\n\t\t}\n\t};\n\n\tstate.resultFileCoalescer = createFileCoalescer((file) => {\n\t\tvoid handleResult(file);\n\t}, 50);\n\n\tconst primeExistingResults = () => {\n\t\ttry {\n\t\t\tfsApi.readdirSync(resultsDir)\n\t\t\t\t.filter((f) => f.endsWith(\".json\"))\n\t\t\t\t.forEach((file) => state.resultFileCoalescer.schedule(file, 0));\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to scan subagent result directory '${resultsDir}':`, error);\n\t\t}\n\t};\n\n\tconst startPollingFallback = (reason: unknown) => {\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) return;\n\n\t\treport(\n\t\t\t`Subagent result watcher for '${resultsDir}' fell back to polling because native fs.watch is unavailable (${getErrorCode(reason) ?? \"unknown error\"}).`,\n\t\t);\n\t\tprimeExistingResults();\n\t\tstate.watcherRestartTimer = timers.setInterval(primeExistingResults, POLL_INTERVAL_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst scheduleRestart = () => {\n\t\tif (state.watcherRestartTimer) return;\n\t\tstate.watcherRestartTimer = timers.setTimeout(() => {\n\t\t\tstate.watcherRestartTimer = null;\n\t\t\ttry {\n\t\t\t\tfsApi.mkdirSync(resultsDir, { recursive: true });\n\t\t\t\tstartResultWatcher();\n\t\t\t} catch (error) {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Failed to restart subagent result watcher for '${resultsDir}':`, error);\n\t\t\t\tscheduleRestart();\n\t\t\t}\n\t\t}, WATCHER_RESTART_DELAY_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst startResultWatcher = () => {\n\t\tif (state.watcher) return;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t\tstate.watcherRestartTimer = null;\n\t\t}\n\t\ttry {\n\t\t\tconst watchDir = resolveWatchPath(resultsDir, fsApi.realpathSync.native);\n\t\t\tconst watcher = fsApi.watch(watchDir, (ev, file) => {\n\t\t\t\tif (state.watcher !== watcher) return;\n\t\t\t\tif (ev !== \"rename\" || !file) return;\n\t\t\t\tconst fileName = file.toString();\n\t\t\t\tif (!fileName.endsWith(\".json\")) return;\n\t\t\t\tstate.resultFileCoalescer.schedule(fileName);\n\t\t\t});\n\t\t\tstate.watcher = watcher;\n\t\t\twatcher.on(\"error\", (error) => {\n\t\t\t\tif (state.watcher !== watcher) return;\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Subagent result watcher failed for '${resultsDir}':`, error);\n\t\t\t\tstate.watcher?.close();\n\t\t\t\tstate.watcher = null;\n\t\t\t\tscheduleRestart();\n\t\t\t});\n\t\t\tstate.watcher.unref?.();\n\t\t} catch (error) {\n\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\tstartPollingFallback(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treport(`Failed to start subagent result watcher for '${resultsDir}':`, error);\n\t\t\tstate.watcher = null;\n\t\t\tscheduleRestart();\n\t\t}\n\t};\n\n\tconst stopResultWatcher = () => {\n\t\tgeneration++;\n\t\tattempts.clear();\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t}\n\t\tstate.watcherRestartTimer = null;\n\t\tstate.resultFileCoalescer.clear();\n\t};\n\n\treturn { startResultWatcher, primeExistingResults, stopResultWatcher };\n}\n"]}
|
|
@@ -217,7 +217,9 @@ export function createResultWatcher(pi, state, resultsDir, completionTtlMs, deps
|
|
|
217
217
|
}
|
|
218
218
|
try {
|
|
219
219
|
const watchDir = resolveWatchPath(resultsDir, fsApi.realpathSync.native);
|
|
220
|
-
|
|
220
|
+
const watcher = fsApi.watch(watchDir, (ev, file) => {
|
|
221
|
+
if (state.watcher !== watcher)
|
|
222
|
+
return;
|
|
221
223
|
if (ev !== "rename" || !file)
|
|
222
224
|
return;
|
|
223
225
|
const fileName = file.toString();
|
|
@@ -225,7 +227,10 @@ export function createResultWatcher(pi, state, resultsDir, completionTtlMs, deps
|
|
|
225
227
|
return;
|
|
226
228
|
state.resultFileCoalescer.schedule(fileName);
|
|
227
229
|
});
|
|
228
|
-
state.watcher
|
|
230
|
+
state.watcher = watcher;
|
|
231
|
+
watcher.on("error", (error) => {
|
|
232
|
+
if (state.watcher !== watcher)
|
|
233
|
+
return;
|
|
229
234
|
if (shouldFallBackToPolling(error)) {
|
|
230
235
|
startPollingFallback(error);
|
|
231
236
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-watcher.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/result-watcher.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { buildCompletionKey, markSeenWithTtl } from \"./completion-dedupe.ts\";\nimport { createFileCoalescer } from \"../../shared/file-coalescer.ts\";\nimport {\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\ttype IntercomEventBus,\n\ttype NestedRunSummary,\n\ttype SubagentResultIntercomChild,\n\ttype SubagentState,\n} from \"../../shared/types.ts\";\nimport {\n\tattachNestedChildrenToResultChildren,\n\tbuildSubagentResultIntercomPayload,\n\tcompactNestedResultChildren,\n\tdeliverSubagentResultIntercomEvent,\n\tresolveSubagentResultStatus,\n} from \"../../intercom/result-intercom.ts\";\nimport { projectNestedRegistryForRoot, sanitizeSummary } from \"../shared/nested-events.ts\";\nimport { resolveWatchPath } from \"../../shared/utils.ts\";\n\nconst WATCHER_RESTART_DELAY_MS = 3000;\nconst POLL_INTERVAL_MS = 3000;\n\ntype ResultWatcherFs = Pick<typeof fs, \"existsSync\" | \"readFileSync\" | \"unlinkSync\" | \"readdirSync\" | \"mkdirSync\" | \"realpathSync\" | \"watch\">;\n\ntype ResultWatcherTimers = {\n\tsetTimeout: typeof setTimeout;\n\tclearTimeout: typeof clearTimeout;\n\tsetInterval: typeof setInterval;\n\tclearInterval: typeof clearInterval;\n};\n\ntype ResultWatcherDeps = {\n\tfs?: ResultWatcherFs;\n\ttimers?: ResultWatcherTimers;\n};\n\ntype ResultFileChild = {\n\tagent?: string;\n\toutput?: string;\n\terror?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tstopped?: boolean;\n\tsessionFile?: string;\n\tartifactPaths?: { outputPath?: string };\n\tintercomTarget?: string;\n\tchildren?: unknown;\n};\n\ntype ResultFileData = {\n\tid?: string;\n\trunId?: string;\n\tagent?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tmode?: string;\n\tsummary?: string;\n\tresults?: ResultFileChild[];\n\tnestedChildren?: unknown;\n\tsessionId?: string;\n\tcwd?: string;\n\tsessionFile?: string;\n\tasyncDir?: string;\n\tintercomTarget?: string;\n};\n\nfunction sanitizeNestedResultChildren(value: unknown, resultPath: string, label: string, report: (message: string) => void): NestedRunSummary[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\treport(`Ignoring invalid nested children in subagent result file '${resultPath}' at ${label}: expected an array.`);\n\t\treturn undefined;\n\t}\n\tconst children = value.map((child) => sanitizeSummary(child)).filter((child): child is NestedRunSummary => Boolean(child));\n\tif (children.length !== value.length) {\n\t\treport(`Ignoring ${value.length - children.length} invalid nested child record(s) in subagent result file '${resultPath}' at ${label}.`);\n\t}\n\treturn children.length ? children : undefined;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n\treturn typeof error === \"object\" && error !== null && \"code\" in error\n\t\t? (error as NodeJS.ErrnoException).code\n\t\t: undefined;\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn getErrorCode(error) === \"ENOENT\";\n}\n\nfunction shouldFallBackToPolling(error: unknown): boolean {\n\tconst code = getErrorCode(error);\n\treturn code === \"EMFILE\" || code === \"ENOSPC\";\n}\n\n\nexport function createResultWatcher(\n\tpi: { events: IntercomEventBus; appendEntry?: (type: string, data: unknown) => void },\n\tstate: SubagentState,\n\tresultsDir: string,\n\tcompletionTtlMs: number,\n\tdeps: ResultWatcherDeps = {},\n): {\n\tstartResultWatcher: () => void;\n\tprimeExistingResults: () => void;\n\tstopResultWatcher: () => void;\n} {\n\tconst fsApi = deps.fs ?? fs;\n\tconst timers = deps.timers ?? { setTimeout, clearTimeout, setInterval, clearInterval };\n\n\tlet generation = 0;\n\tconst inFlight = new Set<string>();\n\tconst attempts = new Map<string, number>();\n\tconst report = (message: string, error?: unknown) => {\n\t\tpi.appendEntry?.(\"subagent_result_delivery\", { message, error: error instanceof Error ? error.message : error });\n\t};\n\n\tconst handleResult = async (file: string) => {\n\t\tif (inFlight.has(file) || (attempts.get(file) ?? 0) >= 3) return;\n\t\tconst currentGeneration = generation;\n\t\tconst sessionId = state.currentSessionId;\n\t\tconst isCurrent = () => generation === currentGeneration && state.currentSessionId === sessionId;\n\t\tconst resultPath = path.join(resultsDir, file);\n\t\tif (!fsApi.existsSync(resultPath)) return;\n\t\tinFlight.add(file);\n\t\ttry {\n\t\t\tconst data = JSON.parse(fsApi.readFileSync(resultPath, \"utf-8\")) as ResultFileData;\n\t\t\tif (typeof data.sessionId !== \"string\" || data.sessionId !== state.currentSessionId) return;\n\n\t\t\tconst runId = data.runId ?? data.id ?? file.replace(/\\.json$/i, \"\");\n\t\t\tconst hasExplicitNestedChildren = data.nestedChildren !== undefined;\n\t\t\tlet nestedChildren = compactNestedResultChildren(sanitizeNestedResultChildren(data.nestedChildren, resultPath, \"nestedChildren\", report));\n\t\t\tif (!nestedChildren?.length && !hasExplicitNestedChildren) {\n\t\t\t\ttry {\n\t\t\t\t\tnestedChildren = compactNestedResultChildren(projectNestedRegistryForRoot(runId)?.children);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treport(`Failed to enrich subagent result file '${resultPath}' with nested registry children; will retry later:`, error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst now = Date.now();\n\t\t\tconst completionKey = buildCompletionKey(data, `result:${file}`);\n\n\t\t\tconst hasResultChildren = Array.isArray(data.results) && data.results.length > 0;\n\t\t\tconst resultChildren = hasResultChildren\n\t\t\t\t? data.results!\n\t\t\t\t: [{\n\t\t\t\t\tagent: data.agent,\n\t\t\t\t\toutput: data.summary,\n\t\t\t\t\tsuccess: data.success,\n\t\t\t\t}];\n\t\t\tconst normalizedChildren = attachNestedChildrenToResultChildren(runId, resultChildren.map((result = {}, index): SubagentResultIntercomChild => {\n\t\t\t\tconst baseOutput = result.output ?? data.summary;\n\t\t\t\tconst hasRealOutput = typeof baseOutput === \"string\" && baseOutput.trim().length > 0;\n\t\t\t\tconst output = hasRealOutput ? baseOutput : \"(no output)\";\n\t\t\t\tconst summary = result.success === false && result.error\n\t\t\t\t\t? `${result.error}${hasRealOutput ? `\\n\\nOutput:\\n${baseOutput}` : \"\"}`\n\t\t\t\t\t: output;\n\t\t\t\tconst sessionPath = result.sessionFile ?? (resultChildren.length === 1 ? data.sessionFile : undefined);\n\t\t\t\tconst childNestedChildren = sanitizeNestedResultChildren(result.children, resultPath, `results[${index}].children`, report);\n\t\t\t\tconst childState = result.state === \"paused\" || result.state === \"stopped\"\n\t\t\t\t\t? result.state\n\t\t\t\t\t: result.stopped === true\n\t\t\t\t\t\t? \"stopped\"\n\t\t\t\t\t\t: data.state === \"paused\" || (!hasResultChildren && (data.state === \"stopped\" || typeof result.success !== \"boolean\"))\n\t\t\t\t\t\t\t? data.state\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\treturn {\n\t\t\t\t\tagent: result.agent ?? data.agent ?? `step-${index + 1}`,\n\t\t\t\t\tstatus: resolveSubagentResultStatus({\n\t\t\t\t\t\tsuccess: result.success,\n\t\t\t\t\t\tstate: childState,\n\t\t\t\t\t}),\n\t\t\t\t\tsummary,\n\t\t\t\t\tindex,\n\t\t\t\t\tartifactPath: result.artifactPaths?.outputPath,\n\t\t\t\t\t...(typeof sessionPath === \"string\" && fsApi.existsSync(sessionPath) ? { sessionPath } : {}),\n\t\t\t\t\t...(result.intercomTarget ? { intercomTarget: result.intercomTarget } : {}),\n\t\t\t\t\t...(childNestedChildren ? { children: childNestedChildren } : {}),\n\t\t\t\t};\n\t\t\t}), nestedChildren);\n\n\t\t\tif (!markSeenWithTtl(state.completionSeen, completionKey, now, completionTtlMs)) {\n\t\t\t\tpi.events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {\n\t\t\t\t\t...data,\n\t\t\t\t\trunId,\n\t\t\t\t\t...(nestedChildren?.length ? { nestedChildren } : {}),\n\t\t\t\t\t...(Array.isArray(data.results) ? { results: hasResultChildren ? normalizedChildren.map((child, index) => ({\n\t\t\t\t\t\t...data.results![index], agent: child.agent, status: child.status, summary: child.summary,\n\t\t\t\t\t\tindex: child.index, artifactPath: child.artifactPath, sessionPath: child.sessionPath, children: child.children,\n\t\t\t\t\t})) : [] } : {}),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!isCurrent()) return;\n\t\t\tconst intercomTarget = data.state === \"stopped\" ? undefined : data.intercomTarget?.trim();\n\t\t\tif (intercomTarget) {\n\t\t\t\tconst mode = data.mode === \"single\" || data.mode === \"parallel\" || data.mode === \"chain\"\n\t\t\t\t\t? data.mode\n\t\t\t\t\t: resultChildren.length > 1 ? \"chain\" : \"single\";\n\t\t\t\tconst payload = buildSubagentResultIntercomPayload({\n\t\t\t\t\tto: intercomTarget,\n\t\t\t\t\trunId,\n\t\t\t\t\tmode,\n\t\t\t\t\tsource: \"async\",\n\t\t\t\t\tchildren: normalizedChildren,\n\t\t\t\t\tasyncId: data.id,\n\t\t\t\t\tasyncDir: data.asyncDir,\n\t\t\t\t});\n\t\t\t\tpayload.requestId = `async-result:${sessionId}:${completionKey}`;\n\t\t\t\tpayload.ownerNotificationSessionId = sessionId;\n\t\t\t\tattempts.set(file, (attempts.get(file) ?? 0) + 1);\n\t\t\t\tconst delivered = await deliverSubagentResultIntercomEvent(pi.events, payload);\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t\tif (!delivered) {\n\t\t\t\t\treport(`Async result delivery pending for '${runId}'; output retained.`, resultPath);\n\t\t\t\t\tif (attempts.get(file)! < 3) state.resultFileCoalescer.schedule(file, 1000);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isCurrent()) fsApi.unlinkSync(resultPath);\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to process subagent result file '${resultPath}'.`, error);\n\t\t} finally {\n\t\t\tinFlight.delete(file);\n\t\t}\n\t};\n\n\tstate.resultFileCoalescer = createFileCoalescer((file) => {\n\t\tvoid handleResult(file);\n\t}, 50);\n\n\tconst primeExistingResults = () => {\n\t\ttry {\n\t\t\tfsApi.readdirSync(resultsDir)\n\t\t\t\t.filter((f) => f.endsWith(\".json\"))\n\t\t\t\t.forEach((file) => state.resultFileCoalescer.schedule(file, 0));\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to scan subagent result directory '${resultsDir}':`, error);\n\t\t}\n\t};\n\n\tconst startPollingFallback = (reason: unknown) => {\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) return;\n\n\t\treport(\n\t\t\t`Subagent result watcher for '${resultsDir}' fell back to polling because native fs.watch is unavailable (${getErrorCode(reason) ?? \"unknown error\"}).`,\n\t\t);\n\t\tprimeExistingResults();\n\t\tstate.watcherRestartTimer = timers.setInterval(primeExistingResults, POLL_INTERVAL_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst scheduleRestart = () => {\n\t\tif (state.watcherRestartTimer) return;\n\t\tstate.watcherRestartTimer = timers.setTimeout(() => {\n\t\t\tstate.watcherRestartTimer = null;\n\t\t\ttry {\n\t\t\t\tfsApi.mkdirSync(resultsDir, { recursive: true });\n\t\t\t\tstartResultWatcher();\n\t\t\t} catch (error) {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Failed to restart subagent result watcher for '${resultsDir}':`, error);\n\t\t\t\tscheduleRestart();\n\t\t\t}\n\t\t}, WATCHER_RESTART_DELAY_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst startResultWatcher = () => {\n\t\tif (state.watcher) return;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t\tstate.watcherRestartTimer = null;\n\t\t}\n\t\ttry {\n\t\t\tconst watchDir = resolveWatchPath(resultsDir, fsApi.realpathSync.native);\n\t\t\tstate.watcher = fsApi.watch(watchDir, (ev, file) => {\n\t\t\t\tif (ev !== \"rename\" || !file) return;\n\t\t\t\tconst fileName = file.toString();\n\t\t\t\tif (!fileName.endsWith(\".json\")) return;\n\t\t\t\tstate.resultFileCoalescer.schedule(fileName);\n\t\t\t});\n\t\t\tstate.watcher.on(\"error\", (error) => {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Subagent result watcher failed for '${resultsDir}':`, error);\n\t\t\t\tstate.watcher?.close();\n\t\t\t\tstate.watcher = null;\n\t\t\t\tscheduleRestart();\n\t\t\t});\n\t\t\tstate.watcher.unref?.();\n\t\t} catch (error) {\n\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\tstartPollingFallback(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treport(`Failed to start subagent result watcher for '${resultsDir}':`, error);\n\t\t\tstate.watcher = null;\n\t\t\tscheduleRestart();\n\t\t}\n\t};\n\n\tconst stopResultWatcher = () => {\n\t\tgeneration++;\n\t\tattempts.clear();\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t}\n\t\tstate.watcherRestartTimer = null;\n\t\tstate.resultFileCoalescer.clear();\n\t};\n\n\treturn { startResultWatcher, primeExistingResults, stopResultWatcher };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"result-watcher.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/result-watcher.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { buildCompletionKey, markSeenWithTtl } from \"./completion-dedupe.ts\";\nimport { createFileCoalescer } from \"../../shared/file-coalescer.ts\";\nimport {\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\ttype IntercomEventBus,\n\ttype NestedRunSummary,\n\ttype SubagentResultIntercomChild,\n\ttype SubagentState,\n} from \"../../shared/types.ts\";\nimport {\n\tattachNestedChildrenToResultChildren,\n\tbuildSubagentResultIntercomPayload,\n\tcompactNestedResultChildren,\n\tdeliverSubagentResultIntercomEvent,\n\tresolveSubagentResultStatus,\n} from \"../../intercom/result-intercom.ts\";\nimport { projectNestedRegistryForRoot, sanitizeSummary } from \"../shared/nested-events.ts\";\nimport { resolveWatchPath } from \"../../shared/utils.ts\";\n\nconst WATCHER_RESTART_DELAY_MS = 3000;\nconst POLL_INTERVAL_MS = 3000;\n\ntype ResultWatcherFs = Pick<typeof fs, \"existsSync\" | \"readFileSync\" | \"unlinkSync\" | \"readdirSync\" | \"mkdirSync\" | \"realpathSync\" | \"watch\">;\n\ntype ResultWatcherTimers = {\n\tsetTimeout: typeof setTimeout;\n\tclearTimeout: typeof clearTimeout;\n\tsetInterval: typeof setInterval;\n\tclearInterval: typeof clearInterval;\n};\n\ntype ResultWatcherDeps = {\n\tfs?: ResultWatcherFs;\n\ttimers?: ResultWatcherTimers;\n};\n\ntype ResultFileChild = {\n\tagent?: string;\n\toutput?: string;\n\terror?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tstopped?: boolean;\n\tsessionFile?: string;\n\tartifactPaths?: { outputPath?: string };\n\tintercomTarget?: string;\n\tchildren?: unknown;\n};\n\ntype ResultFileData = {\n\tid?: string;\n\trunId?: string;\n\tagent?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tmode?: string;\n\tsummary?: string;\n\tresults?: ResultFileChild[];\n\tnestedChildren?: unknown;\n\tsessionId?: string;\n\tcwd?: string;\n\tsessionFile?: string;\n\tasyncDir?: string;\n\tintercomTarget?: string;\n};\n\nfunction sanitizeNestedResultChildren(value: unknown, resultPath: string, label: string, report: (message: string) => void): NestedRunSummary[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\treport(`Ignoring invalid nested children in subagent result file '${resultPath}' at ${label}: expected an array.`);\n\t\treturn undefined;\n\t}\n\tconst children = value.map((child) => sanitizeSummary(child)).filter((child): child is NestedRunSummary => Boolean(child));\n\tif (children.length !== value.length) {\n\t\treport(`Ignoring ${value.length - children.length} invalid nested child record(s) in subagent result file '${resultPath}' at ${label}.`);\n\t}\n\treturn children.length ? children : undefined;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n\treturn typeof error === \"object\" && error !== null && \"code\" in error\n\t\t? (error as NodeJS.ErrnoException).code\n\t\t: undefined;\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn getErrorCode(error) === \"ENOENT\";\n}\n\nfunction shouldFallBackToPolling(error: unknown): boolean {\n\tconst code = getErrorCode(error);\n\treturn code === \"EMFILE\" || code === \"ENOSPC\";\n}\n\n\nexport function createResultWatcher(\n\tpi: { events: IntercomEventBus; appendEntry?: (type: string, data: unknown) => void },\n\tstate: SubagentState,\n\tresultsDir: string,\n\tcompletionTtlMs: number,\n\tdeps: ResultWatcherDeps = {},\n): {\n\tstartResultWatcher: () => void;\n\tprimeExistingResults: () => void;\n\tstopResultWatcher: () => void;\n} {\n\tconst fsApi = deps.fs ?? fs;\n\tconst timers = deps.timers ?? { setTimeout, clearTimeout, setInterval, clearInterval };\n\n\tlet generation = 0;\n\tconst inFlight = new Set<string>();\n\tconst attempts = new Map<string, number>();\n\tconst report = (message: string, error?: unknown) => {\n\t\tpi.appendEntry?.(\"subagent_result_delivery\", { message, error: error instanceof Error ? error.message : error });\n\t};\n\n\tconst handleResult = async (file: string) => {\n\t\tif (inFlight.has(file) || (attempts.get(file) ?? 0) >= 3) return;\n\t\tconst currentGeneration = generation;\n\t\tconst sessionId = state.currentSessionId;\n\t\tconst isCurrent = () => generation === currentGeneration && state.currentSessionId === sessionId;\n\t\tconst resultPath = path.join(resultsDir, file);\n\t\tif (!fsApi.existsSync(resultPath)) return;\n\t\tinFlight.add(file);\n\t\ttry {\n\t\t\tconst data = JSON.parse(fsApi.readFileSync(resultPath, \"utf-8\")) as ResultFileData;\n\t\t\tif (typeof data.sessionId !== \"string\" || data.sessionId !== state.currentSessionId) return;\n\n\t\t\tconst runId = data.runId ?? data.id ?? file.replace(/\\.json$/i, \"\");\n\t\t\tconst hasExplicitNestedChildren = data.nestedChildren !== undefined;\n\t\t\tlet nestedChildren = compactNestedResultChildren(sanitizeNestedResultChildren(data.nestedChildren, resultPath, \"nestedChildren\", report));\n\t\t\tif (!nestedChildren?.length && !hasExplicitNestedChildren) {\n\t\t\t\ttry {\n\t\t\t\t\tnestedChildren = compactNestedResultChildren(projectNestedRegistryForRoot(runId)?.children);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treport(`Failed to enrich subagent result file '${resultPath}' with nested registry children; will retry later:`, error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst now = Date.now();\n\t\t\tconst completionKey = buildCompletionKey(data, `result:${file}`);\n\n\t\t\tconst hasResultChildren = Array.isArray(data.results) && data.results.length > 0;\n\t\t\tconst resultChildren = hasResultChildren\n\t\t\t\t? data.results!\n\t\t\t\t: [{\n\t\t\t\t\tagent: data.agent,\n\t\t\t\t\toutput: data.summary,\n\t\t\t\t\tsuccess: data.success,\n\t\t\t\t}];\n\t\t\tconst normalizedChildren = attachNestedChildrenToResultChildren(runId, resultChildren.map((result = {}, index): SubagentResultIntercomChild => {\n\t\t\t\tconst baseOutput = result.output ?? data.summary;\n\t\t\t\tconst hasRealOutput = typeof baseOutput === \"string\" && baseOutput.trim().length > 0;\n\t\t\t\tconst output = hasRealOutput ? baseOutput : \"(no output)\";\n\t\t\t\tconst summary = result.success === false && result.error\n\t\t\t\t\t? `${result.error}${hasRealOutput ? `\\n\\nOutput:\\n${baseOutput}` : \"\"}`\n\t\t\t\t\t: output;\n\t\t\t\tconst sessionPath = result.sessionFile ?? (resultChildren.length === 1 ? data.sessionFile : undefined);\n\t\t\t\tconst childNestedChildren = sanitizeNestedResultChildren(result.children, resultPath, `results[${index}].children`, report);\n\t\t\t\tconst childState = result.state === \"paused\" || result.state === \"stopped\"\n\t\t\t\t\t? result.state\n\t\t\t\t\t: result.stopped === true\n\t\t\t\t\t\t? \"stopped\"\n\t\t\t\t\t\t: data.state === \"paused\" || (!hasResultChildren && (data.state === \"stopped\" || typeof result.success !== \"boolean\"))\n\t\t\t\t\t\t\t? data.state\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\treturn {\n\t\t\t\t\tagent: result.agent ?? data.agent ?? `step-${index + 1}`,\n\t\t\t\t\tstatus: resolveSubagentResultStatus({\n\t\t\t\t\t\tsuccess: result.success,\n\t\t\t\t\t\tstate: childState,\n\t\t\t\t\t}),\n\t\t\t\t\tsummary,\n\t\t\t\t\tindex,\n\t\t\t\t\tartifactPath: result.artifactPaths?.outputPath,\n\t\t\t\t\t...(typeof sessionPath === \"string\" && fsApi.existsSync(sessionPath) ? { sessionPath } : {}),\n\t\t\t\t\t...(result.intercomTarget ? { intercomTarget: result.intercomTarget } : {}),\n\t\t\t\t\t...(childNestedChildren ? { children: childNestedChildren } : {}),\n\t\t\t\t};\n\t\t\t}), nestedChildren);\n\n\t\t\tif (!markSeenWithTtl(state.completionSeen, completionKey, now, completionTtlMs)) {\n\t\t\t\tpi.events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {\n\t\t\t\t\t...data,\n\t\t\t\t\trunId,\n\t\t\t\t\t...(nestedChildren?.length ? { nestedChildren } : {}),\n\t\t\t\t\t...(Array.isArray(data.results) ? { results: hasResultChildren ? normalizedChildren.map((child, index) => ({\n\t\t\t\t\t\t...data.results![index], agent: child.agent, status: child.status, summary: child.summary,\n\t\t\t\t\t\tindex: child.index, artifactPath: child.artifactPath, sessionPath: child.sessionPath, children: child.children,\n\t\t\t\t\t})) : [] } : {}),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!isCurrent()) return;\n\t\t\tconst intercomTarget = data.state === \"stopped\" ? undefined : data.intercomTarget?.trim();\n\t\t\tif (intercomTarget) {\n\t\t\t\tconst mode = data.mode === \"single\" || data.mode === \"parallel\" || data.mode === \"chain\"\n\t\t\t\t\t? data.mode\n\t\t\t\t\t: resultChildren.length > 1 ? \"chain\" : \"single\";\n\t\t\t\tconst payload = buildSubagentResultIntercomPayload({\n\t\t\t\t\tto: intercomTarget,\n\t\t\t\t\trunId,\n\t\t\t\t\tmode,\n\t\t\t\t\tsource: \"async\",\n\t\t\t\t\tchildren: normalizedChildren,\n\t\t\t\t\tasyncId: data.id,\n\t\t\t\t\tasyncDir: data.asyncDir,\n\t\t\t\t});\n\t\t\t\tpayload.requestId = `async-result:${sessionId}:${completionKey}`;\n\t\t\t\tpayload.ownerNotificationSessionId = sessionId;\n\t\t\t\tattempts.set(file, (attempts.get(file) ?? 0) + 1);\n\t\t\t\tconst delivered = await deliverSubagentResultIntercomEvent(pi.events, payload);\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t\tif (!delivered) {\n\t\t\t\t\treport(`Async result delivery pending for '${runId}'; output retained.`, resultPath);\n\t\t\t\t\tif (attempts.get(file)! < 3) state.resultFileCoalescer.schedule(file, 1000);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isCurrent()) fsApi.unlinkSync(resultPath);\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to process subagent result file '${resultPath}'.`, error);\n\t\t} finally {\n\t\t\tinFlight.delete(file);\n\t\t}\n\t};\n\n\tstate.resultFileCoalescer = createFileCoalescer((file) => {\n\t\tvoid handleResult(file);\n\t}, 50);\n\n\tconst primeExistingResults = () => {\n\t\ttry {\n\t\t\tfsApi.readdirSync(resultsDir)\n\t\t\t\t.filter((f) => f.endsWith(\".json\"))\n\t\t\t\t.forEach((file) => state.resultFileCoalescer.schedule(file, 0));\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to scan subagent result directory '${resultsDir}':`, error);\n\t\t}\n\t};\n\n\tconst startPollingFallback = (reason: unknown) => {\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) return;\n\n\t\treport(\n\t\t\t`Subagent result watcher for '${resultsDir}' fell back to polling because native fs.watch is unavailable (${getErrorCode(reason) ?? \"unknown error\"}).`,\n\t\t);\n\t\tprimeExistingResults();\n\t\tstate.watcherRestartTimer = timers.setInterval(primeExistingResults, POLL_INTERVAL_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst scheduleRestart = () => {\n\t\tif (state.watcherRestartTimer) return;\n\t\tstate.watcherRestartTimer = timers.setTimeout(() => {\n\t\t\tstate.watcherRestartTimer = null;\n\t\t\ttry {\n\t\t\t\tfsApi.mkdirSync(resultsDir, { recursive: true });\n\t\t\t\tstartResultWatcher();\n\t\t\t} catch (error) {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Failed to restart subagent result watcher for '${resultsDir}':`, error);\n\t\t\t\tscheduleRestart();\n\t\t\t}\n\t\t}, WATCHER_RESTART_DELAY_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst startResultWatcher = () => {\n\t\tif (state.watcher) return;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t\tstate.watcherRestartTimer = null;\n\t\t}\n\t\ttry {\n\t\t\tconst watchDir = resolveWatchPath(resultsDir, fsApi.realpathSync.native);\n\t\t\tconst watcher = fsApi.watch(watchDir, (ev, file) => {\n\t\t\t\tif (state.watcher !== watcher) return;\n\t\t\t\tif (ev !== \"rename\" || !file) return;\n\t\t\t\tconst fileName = file.toString();\n\t\t\t\tif (!fileName.endsWith(\".json\")) return;\n\t\t\t\tstate.resultFileCoalescer.schedule(fileName);\n\t\t\t});\n\t\t\tstate.watcher = watcher;\n\t\t\twatcher.on(\"error\", (error) => {\n\t\t\t\tif (state.watcher !== watcher) return;\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Subagent result watcher failed for '${resultsDir}':`, error);\n\t\t\t\tstate.watcher?.close();\n\t\t\t\tstate.watcher = null;\n\t\t\t\tscheduleRestart();\n\t\t\t});\n\t\t\tstate.watcher.unref?.();\n\t\t} catch (error) {\n\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\tstartPollingFallback(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treport(`Failed to start subagent result watcher for '${resultsDir}':`, error);\n\t\t\tstate.watcher = null;\n\t\t\tscheduleRestart();\n\t\t}\n\t};\n\n\tconst stopResultWatcher = () => {\n\t\tgeneration++;\n\t\tattempts.clear();\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t}\n\t\tstate.watcherRestartTimer = null;\n\t\tstate.resultFileCoalescer.clear();\n\t};\n\n\treturn { startResultWatcher, primeExistingResults, stopResultWatcher };\n}\n"]}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { Message } from "@ashx-j/lunr-ai";
|
|
2
|
-
import { type ArtifactConfig, type ArtifactPaths, type ChainOutputMap, type ModelAttempt, type NestedRouteInfo, type ResolvedTurnBudget, type ToolBudgetState, type TurnBudgetState } from "../../shared/types.ts";
|
|
2
|
+
import { type ArtifactConfig, type ArtifactPaths, type ChainOutputMap, type ModelAttempt, type NestedRouteInfo, type ResolvedTurnBudget, type ToolBudgetState, type TurnBudgetState, type Usage } from "../../shared/types.ts";
|
|
3
3
|
import { type RunnerSubagentStep as SubagentStep } from "../shared/parallel-utils.ts";
|
|
4
4
|
interface ChildUsage {
|
|
5
|
+
measurement?: "reported" | "partial" | "estimated" | "unknown";
|
|
6
|
+
costSource?: "reported" | "estimated" | "unknown";
|
|
5
7
|
input?: number;
|
|
6
8
|
inputTokens?: number;
|
|
7
9
|
output?: number;
|
|
@@ -92,6 +94,8 @@ export declare function runSingleStep(step: SubagentStep, ctx: SingleStepContext
|
|
|
92
94
|
toolBudget?: ToolBudgetState;
|
|
93
95
|
toolBudgetBlocked?: boolean;
|
|
94
96
|
sessionFile?: string;
|
|
97
|
+
receiptUsage?: Usage;
|
|
98
|
+
usageRequests?: import("../../../../../core/usage-accounting.ts").AccountedRequest[];
|
|
95
99
|
intercomTarget?: string;
|
|
96
100
|
completionGuardTriggered?: boolean;
|
|
97
101
|
structuredOutput?: unknown;
|