@greppleai/grip 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/README.md +1 -1
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/embedded-assets.d.ts.map +1 -1
- package/dist/bun/embedded-assets.js.map +1 -1
- package/dist/bun/register-bedrock.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.js.map +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +27 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +117 -152
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts +4 -0
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -10
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +19 -23
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -1
- package/dist/core/compaction/compression-detection-ledger.js.map +1 -1
- package/dist/core/compaction/compression-detector.d.ts +1 -0
- package/dist/core/compaction/compression-detector.d.ts.map +1 -1
- package/dist/core/compaction/compression-detector.js +10 -21
- package/dist/core/compaction/compression-detector.js.map +1 -1
- package/dist/core/compaction/compression-economics.d.ts.map +1 -1
- package/dist/core/compaction/compression-economics.js.map +1 -1
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.js.map +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +18 -30
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +15 -16
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/grip-agent.d.ts.map +1 -1
- package/dist/core/grip-agent.js +7 -21
- package/dist/core/grip-agent.js.map +1 -1
- package/dist/core/grip-manifest.d.ts.map +1 -1
- package/dist/core/grip-manifest.js.map +1 -1
- package/dist/core/hooks/aggregate.d.ts.map +1 -1
- package/dist/core/hooks/aggregate.js.map +1 -1
- package/dist/core/hooks/config.d.ts.map +1 -1
- package/dist/core/hooks/config.js.map +1 -1
- package/dist/core/hooks/executor.d.ts.map +1 -1
- package/dist/core/hooks/executor.js.map +1 -1
- package/dist/core/hooks/index.d.ts.map +1 -1
- package/dist/core/hooks/index.js.map +1 -1
- package/dist/core/hooks/matcher.d.ts.map +1 -1
- package/dist/core/hooks/matcher.js.map +1 -1
- package/dist/core/hooks/trust-store.d.ts.map +1 -1
- package/dist/core/hooks/trust-store.js +0 -3
- package/dist/core/hooks/trust-store.js.map +1 -1
- package/dist/core/hooks/types.d.ts.map +1 -1
- package/dist/core/hooks/types.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/instruction-resource-loader.d.ts.map +1 -1
- package/dist/core/instruction-resource-loader.js +0 -3
- package/dist/core/instruction-resource-loader.js.map +1 -1
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +0 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/lsp/abort.d.ts.map +1 -1
- package/dist/core/lsp/abort.js.map +1 -1
- package/dist/core/lsp/client.d.ts.map +1 -1
- package/dist/core/lsp/client.js +8 -22
- package/dist/core/lsp/client.js.map +1 -1
- package/dist/core/lsp/config-loader.d.ts.map +1 -1
- package/dist/core/lsp/config-loader.js.map +1 -1
- package/dist/core/lsp/config.d.ts.map +1 -1
- package/dist/core/lsp/config.js.map +1 -1
- package/dist/core/lsp/diagnostics.d.ts.map +1 -1
- package/dist/core/lsp/diagnostics.js.map +1 -1
- package/dist/core/lsp/file-sync.d.ts.map +1 -1
- package/dist/core/lsp/file-sync.js +7 -9
- package/dist/core/lsp/file-sync.js.map +1 -1
- package/dist/core/lsp/integration.d.ts.map +1 -1
- package/dist/core/lsp/integration.js.map +1 -1
- package/dist/core/lsp/language-map.d.ts.map +1 -1
- package/dist/core/lsp/language-map.js +2 -7
- package/dist/core/lsp/language-map.js.map +1 -1
- package/dist/core/lsp/manager.d.ts.map +1 -1
- package/dist/core/lsp/manager.js +18 -29
- package/dist/core/lsp/manager.js.map +1 -1
- package/dist/core/lsp/navigation.d.ts.map +1 -1
- package/dist/core/lsp/navigation.js.map +1 -1
- package/dist/core/lsp/portable-path.d.ts.map +1 -1
- package/dist/core/lsp/portable-path.js.map +1 -1
- package/dist/core/lsp/refactor.d.ts.map +1 -1
- package/dist/core/lsp/refactor.js.map +1 -1
- package/dist/core/lsp/transport.d.ts.map +1 -1
- package/dist/core/lsp/transport.js.map +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +5 -7
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/output-guard.d.ts.map +1 -1
- package/dist/core/output-guard.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +0 -6
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/contract.js +4 -2
- package/dist/core/remote-workspace-protocol/contract.js.map +1 -1
- package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/guest-shared-client.js +1 -5
- package/dist/core/remote-workspace-protocol/guest-shared-client.js.map +1 -1
- package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js +5 -10
- package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js.map +1 -1
- package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/guest-shared-uplink.js +2 -9
- package/dist/core/remote-workspace-protocol/guest-shared-uplink.js.map +1 -1
- package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/lima-owner-directory.js.map +1 -1
- package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/lima-owner-lock.js.map +1 -1
- package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/session.js +27 -65
- package/dist/core/remote-workspace-protocol/session.js.map +1 -1
- package/dist/core/remote-workspace-protocol/shared-transport.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/shared-transport.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +0 -48
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/rules.d.ts.map +1 -1
- package/dist/core/rules.js.map +1 -1
- package/dist/core/sandbox/command.d.ts.map +1 -1
- package/dist/core/sandbox/command.js.map +1 -1
- package/dist/core/sandbox/config.d.ts.map +1 -1
- package/dist/core/sandbox/config.js.map +1 -1
- package/dist/core/sandbox/lima-guest-binary.d.ts.map +1 -1
- package/dist/core/sandbox/lima-guest-binary.js.map +1 -1
- package/dist/core/sandbox/lima.d.ts +2 -0
- package/dist/core/sandbox/lima.d.ts.map +1 -1
- package/dist/core/sandbox/lima.js +3 -9
- package/dist/core/sandbox/lima.js.map +1 -1
- package/dist/core/sandbox/shared-lima-roots.d.ts.map +1 -1
- package/dist/core/sandbox/shared-lima-roots.js.map +1 -1
- package/dist/core/sandbox/update-shared-guest-binary.d.ts.map +1 -1
- package/dist/core/sandbox/update-shared-guest-binary.js.map +1 -1
- package/dist/core/session/constants.d.ts.map +1 -1
- package/dist/core/session/context-metadata.d.ts.map +1 -1
- package/dist/core/session/context-metadata.js.map +1 -1
- package/dist/core/session/context.d.ts.map +1 -1
- package/dist/core/session/context.js.map +1 -1
- package/dist/core/session/ids.d.ts.map +1 -1
- package/dist/core/session/ids.js.map +1 -1
- package/dist/core/session/in-memory-session-manager.d.ts.map +1 -1
- package/dist/core/session/in-memory-session-manager.js +0 -1
- package/dist/core/session/in-memory-session-manager.js.map +1 -1
- package/dist/core/session/in-memory-session.d.ts.map +1 -1
- package/dist/core/session/in-memory-session.js.map +1 -1
- package/dist/core/session/jsonl-errors.d.ts.map +1 -1
- package/dist/core/session/jsonl-errors.js +0 -11
- package/dist/core/session/jsonl-errors.js.map +1 -1
- package/dist/core/session/jsonl-helpers.d.ts.map +1 -1
- package/dist/core/session/jsonl-helpers.js.map +1 -1
- package/dist/core/session/local-session-manager.d.ts.map +1 -1
- package/dist/core/session/local-session-manager.js +4 -6
- package/dist/core/session/local-session-manager.js.map +1 -1
- package/dist/core/session/local-session.d.ts.map +1 -1
- package/dist/core/session/local-session.js.map +1 -1
- package/dist/core/session/migrations.d.ts.map +1 -1
- package/dist/core/session/migrations.js.map +1 -1
- package/dist/core/session/remote-session-client.d.ts.map +1 -1
- package/dist/core/session/remote-session-client.js +0 -6
- package/dist/core/session/remote-session-client.js.map +1 -1
- package/dist/core/session/remote-session-manager.d.ts.map +1 -1
- package/dist/core/session/remote-session-manager.js +0 -3
- package/dist/core/session/remote-session-manager.js.map +1 -1
- package/dist/core/session/remote-session.d.ts.map +1 -1
- package/dist/core/session/remote-session.js +0 -1
- package/dist/core/session/remote-session.js.map +1 -1
- package/dist/core/session/session-manager.d.ts.map +1 -1
- package/dist/core/session/session.d.ts.map +1 -1
- package/dist/core/session/session.js +1 -5
- package/dist/core/session/session.js.map +1 -1
- package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -1
- package/dist/core/session/stores/in-memory-session-store.js +7 -6
- package/dist/core/session/stores/in-memory-session-store.js.map +1 -1
- package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -1
- package/dist/core/session/stores/jsonl-session-store.js +6 -14
- package/dist/core/session/stores/jsonl-session-store.js.map +1 -1
- package/dist/core/session/stores/remote-session-store.d.ts.map +1 -1
- package/dist/core/session/stores/remote-session-store.js +3 -8
- package/dist/core/session/stores/remote-session-store.js.map +1 -1
- package/dist/core/session/stores/session-store.d.ts.map +1 -1
- package/dist/core/session/types.d.ts.map +1 -1
- package/dist/core/session/usage-ledger.d.ts.map +1 -1
- package/dist/core/session/usage-ledger.js.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-cwd.js +0 -1
- package/dist/core/session-cwd.js.map +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +9 -17
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +8 -5
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/compress-context.d.ts.map +1 -1
- package/dist/core/tools/compress-context.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/hash-store.d.ts.map +1 -1
- package/dist/core/tools/hash-store.js.map +1 -1
- package/dist/core/tools/hashline/apply.d.ts.map +1 -1
- package/dist/core/tools/hashline/apply.js.map +1 -1
- package/dist/core/tools/hashline/hash.d.ts.map +1 -1
- package/dist/core/tools/hashline/hash.js.map +1 -1
- package/dist/core/tools/hashline/parse.d.ts.map +1 -1
- package/dist/core/tools/hashline/parse.js.map +1 -1
- package/dist/core/tools/hashline/resolve.d.ts.map +1 -1
- package/dist/core/tools/hashline/resolve.js.map +1 -1
- package/dist/core/tools/hashline-utils.d.ts.map +1 -1
- package/dist/core/tools/hashline-utils.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/operations.d.ts +5 -0
- package/dist/core/tools/operations.d.ts.map +1 -1
- package/dist/core/tools/operations.js +26 -24
- package/dist/core/tools/operations.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +12 -18
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/replace-diff.d.ts.map +1 -1
- package/dist/core/tools/replace-diff.js.map +1 -1
- package/dist/core/tools/replace-normalize.d.ts.map +1 -1
- package/dist/core/tools/replace-normalize.js.map +1 -1
- package/dist/core/tools/replace-render.d.ts +1 -1
- package/dist/core/tools/replace-render.d.ts.map +1 -1
- package/dist/core/tools/replace-render.js.map +1 -1
- package/dist/core/tools/runtime.d.ts.map +1 -1
- package/dist/core/tools/runtime.js.map +1 -1
- package/dist/core/tools/session-history.d.ts.map +1 -1
- package/dist/core/tools/session-history.js.map +1 -1
- package/dist/core/tools/subagent-agents.d.ts.map +1 -1
- package/dist/core/tools/subagent-agents.js.map +1 -1
- package/dist/core/tools/subagent.d.ts.map +1 -1
- package/dist/core/tools/subagent.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/truncate.d.ts.map +1 -1
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/tools/websearch.d.ts.map +1 -1
- package/dist/core/tools/websearch.js.map +1 -1
- package/dist/core/tools/workspace-tool-host.d.ts +1 -0
- package/dist/core/tools/workspace-tool-host.d.ts.map +1 -1
- package/dist/core/tools/workspace-tool-host.js +36 -22
- package/dist/core/tools/workspace-tool-host.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +0 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/workspace-identity.d.ts.map +1 -1
- package/dist/daemon/activity-budget.d.ts.map +1 -1
- package/dist/daemon/activity-budget.js +2 -3
- package/dist/daemon/activity-budget.js.map +1 -1
- package/dist/daemon/command.d.ts.map +1 -1
- package/dist/daemon/command.js.map +1 -1
- package/dist/daemon/config.d.ts +2 -0
- package/dist/daemon/config.d.ts.map +1 -1
- package/dist/daemon/config.js +4 -0
- package/dist/daemon/config.js.map +1 -1
- package/dist/daemon/help.d.ts.map +1 -1
- package/dist/daemon/help.js +4 -3
- package/dist/daemon/help.js.map +1 -1
- package/dist/daemon/lsp-config.d.ts.map +1 -1
- package/dist/daemon/lsp-config.js.map +1 -1
- package/dist/daemon/outbound-budget.d.ts.map +1 -1
- package/dist/daemon/outbound-budget.js +2 -4
- package/dist/daemon/outbound-budget.js.map +1 -1
- package/dist/daemon/security.d.ts.map +1 -1
- package/dist/daemon/security.js.map +1 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/shared-connection.d.ts.map +1 -1
- package/dist/daemon/shared-connection.js +10 -15
- package/dist/daemon/shared-connection.js.map +1 -1
- package/dist/daemon/shared-revision.d.ts.map +1 -1
- package/dist/daemon/shared-revision.js +2 -1
- package/dist/daemon/shared-revision.js.map +1 -1
- package/dist/daemon/shared-roots.d.ts.map +1 -1
- package/dist/daemon/shared-roots.js +0 -1
- package/dist/daemon/shared-roots.js.map +1 -1
- package/dist/daemon/workspace-runtime.d.ts +2 -0
- package/dist/daemon/workspace-runtime.d.ts.map +1 -1
- package/dist/daemon/workspace-runtime.js +43 -15
- package/dist/daemon/workspace-runtime.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +3 -10
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +4 -9
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +0 -3
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +1 -3
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +6 -16
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +0 -5
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +1 -8
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -6
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js +0 -1
- package/dist/modes/interactive/components/dynamic-border.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 -7
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +2 -8
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +1 -9
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -3
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/hook-execution.js +2 -5
- package/dist/modes/interactive/components/hook-execution.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +3 -9
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
- package/dist/modes/interactive/components/mermaid.js.map +1 -1
- package/dist/modes/interactive/components/message-card.d.ts.map +1 -1
- package/dist/modes/interactive/components/message-card.js +0 -1
- package/dist/modes/interactive/components/message-card.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +13 -28
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +3 -12
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +9 -13
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +33 -58
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +0 -4
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +0 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +0 -2
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +0 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +9 -24
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +18 -34
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +3 -6
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +0 -4
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +14 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +159 -135
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +0 -7
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +10 -11
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/child-process.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/deprecation.d.ts.map +1 -1
- package/dist/utils/deprecation.js.map +1 -1
- package/dist/utils/directory-completions.d.ts.map +1 -1
- package/dist/utils/directory-completions.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js.map +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/grip-user-agent.d.ts.map +1 -1
- package/dist/utils/grip-user-agent.js.map +1 -1
- package/dist/utils/html.d.ts.map +1 -1
- package/dist/utils/html.js.map +1 -1
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-process.d.ts.map +1 -1
- package/dist/utils/image-process.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/image-resize-worker.d.ts.map +1 -1
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/json.d.ts.map +1 -1
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/mime.d.ts.map +1 -1
- package/dist/utils/mime.js.map +1 -1
- package/dist/utils/open-browser.d.ts.map +1 -1
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.js +10 -5
- package/dist/utils/photon.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js.map +1 -1
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js +1 -1
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/dist/utils/windows-self-update.d.ts.map +1 -1
- package/dist/utils/windows-self-update.js.map +1 -1
- package/docs/sandbox.md +6 -0
- package/docs/sessions.md +1 -1
- package/docs/usage.md +2 -1
- package/examples/extensions/custom-provider-anthropic/package.json +2 -2
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +601 -833
- package/package.json +20 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-history.js","sourceRoot":"","sources":["../../../src/core/tools/session-history.ts"],"names":[],"mappings":"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","sourcesContent":["import { Worker } from \"node:worker_threads\";\nimport type { AgentTool } from \"@greppleai/grip-agent-core\";\nimport { StringEnum } from \"@greppleai/grip-ai\";\nimport type { Static } from \"typebox\";\nimport { Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE } from \"../messages.ts\";\nimport { getLatestCompactionEntry, projectSessionContextEntries } from \"../session/context.ts\";\nimport type { ReadonlySession } from \"../session/session.ts\";\nimport type { SessionEntry } from \"../session/types.ts\";\nimport { abortIf } from \"./runtime.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, truncateHead, truncateLine } from \"./truncate.ts\";\n\nconst DEFAULT_SEARCH_RESULTS = 20;\nconst MAX_SEARCH_RESULTS = 50;\nconst MAX_CONTEXT_LINES = 5;\nconst MAX_PATTERN_LENGTH = 1000;\nconst MAX_DISPLAY_LINE_LENGTH = 500;\nconst MAX_SEARCH_LINE_LENGTH = 10_000;\nconst MAX_SEARCH_BYTES = 5 * 1024 * 1024;\nconst MAX_SEARCH_LINES = 100_000;\nconst MAX_ENTRY_SERIALIZATION_BYTES = 5 * 1024 * 1024;\nconst REGEX_TIMEOUT_MS = 1000;\n\nconst REGEX_WORKER_SOURCE = `\nconst { parentPort, workerData } = require(\"node:worker_threads\");\ntry {\n const expression = new RegExp(workerData.pattern, workerData.ignoreCase ? \"iu\" : \"u\");\n const indexes = [];\n for (let index = 0; index < workerData.lines.length; index++) {\n if (expression.test(workerData.lines[index])) indexes.push(index);\n }\n parentPort.postMessage({ indexes });\n} catch (error) {\n parentPort.postMessage({ error: error instanceof Error ? error.message : String(error) });\n}\n`;\n\nconst sessionSearchSchema = Type.Object({\n\tpattern: Type.String({\n\t\tdescription:\n\t\t\t\"JavaScript regular expression to search for, without / delimiters; use fixedStrings for literal matching\",\n\t\tmaxLength: MAX_PATTERN_LENGTH,\n\t}),\n\tignoreCase: Type.Optional(Type.Boolean({ description: \"Perform case-insensitive matching, like grep -i\" })),\n\tfixedStrings: Type.Optional(\n\t\tType.Boolean({ description: \"Treat pattern as a literal string instead of a regular expression, like grep -F\" }),\n\t),\n\tbeforeContext: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: `Context lines before each match (default 0, max ${MAX_CONTEXT_LINES}), like grep -B`,\n\t\t\tminimum: 0,\n\t\t\tmaximum: MAX_CONTEXT_LINES,\n\t\t}),\n\t),\n\tafterContext: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: `Context lines after each match (default 0, max ${MAX_CONTEXT_LINES}), like grep -A`,\n\t\t\tminimum: 0,\n\t\t\tmaximum: MAX_CONTEXT_LINES,\n\t\t}),\n\t),\n\tmaxResults: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: `Maximum matching lines to return (default ${DEFAULT_SEARCH_RESULTS}, max ${MAX_SEARCH_RESULTS})`,\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SEARCH_RESULTS,\n\t\t}),\n\t),\n\tscope: Type.Optional(\n\t\tStringEnum([\"context\", \"branch\", \"all\"] as const, {\n\t\t\tdescription: \"Search entries in the current model context (default), current branch ancestry, or every branch\",\n\t\t}),\n\t),\n});\n\nconst sessionEntryGetSchema = Type.Object({\n\tentryId: Type.String({\n\t\tdescription: \"Exact session entry ID returned by session_search or another session API\",\n\t\tminLength: 1,\n\t}),\n});\n\nexport type SessionHistoryToolName = \"session_search\" | \"session_entry_get\";\nexport type SessionSearchToolInput = Static<typeof sessionSearchSchema>;\nexport type SessionEntryGetToolInput = Static<typeof sessionEntryGetSchema>;\nexport type SessionSearchScope = \"context\" | \"branch\" | \"all\";\n\nexport interface SessionSearchMatch {\n\tentryId: string;\n\tentryType: string;\n\trole?: string;\n\ttimestamp: string;\n\tlineNumber: number;\n\tline: string;\n}\n\nexport interface SessionSearchToolDetails {\n\tpattern: string;\n\tignoreCase: boolean;\n\tfixedStrings: boolean;\n\tscope: SessionSearchScope;\n\tmatchCount: number;\n\treturnedMatchCount: number;\n\tmatches: SessionSearchMatch[];\n\tscannedEntries: number;\n\tscannedLines: number;\n\tscannedBytes: number;\n\tscanTruncated: boolean;\n\toutputTruncated: boolean;\n}\n\nexport interface SessionEntryGetToolDetails {\n\tentryId: string;\n\tentryType: string;\n\tonCurrentBranch: boolean;\n\toutputTruncated: boolean;\n}\n\ninterface SearchDocument {\n\tentry: SessionEntry;\n\trole?: string;\n\tlines: string[];\n\tbytes: number;\n\ttruncated: boolean;\n\tlimitReached: boolean;\n}\n\ninterface SearchLine {\n\tdocument: SearchDocument;\n\tlineIndex: number;\n}\n\ninterface SearchCorpus {\n\tlines: SearchLine[];\n\tscannedEntries: number;\n\tscannedBytes: number;\n\ttruncated: boolean;\n}\n\ninterface SessionSearchContextLine {\n\tlineNumber: number;\n\tline: string;\n}\n\ninterface CollectedMatch extends SessionSearchMatch {\n\tcontextBefore: SessionSearchContextLine[];\n\tcontextAfter: SessionSearchContextLine[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction sanitizeImageData(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map((child) => sanitizeImageData(child));\n\tif (!isRecord(value)) return value;\n\tconst result: Record<string, unknown> = {};\n\tconst imageDataLength = value.type === \"image\" && typeof value.data === \"string\" ? value.data.length : undefined;\n\tfor (const key in value) {\n\t\tif (!Object.hasOwn(value, key)) continue;\n\t\tconst child = value[key];\n\t\tresult[key] =\n\t\t\timageDataLength !== undefined && key === \"data\"\n\t\t\t\t? `[base64 image data omitted: ${imageDataLength} chars]`\n\t\t\t\t: sanitizeImageData(child);\n\t}\n\treturn result;\n}\n\nfunction estimateSerializedArrayBytes(values: unknown[], limit: number, seen: Set<object>): number {\n\tlet total = 2;\n\tfor (const value of values) {\n\t\ttotal += estimateSerializedBytes(value, limit - total, seen) + 1;\n\t\tif (total > limit) return total;\n\t}\n\treturn total;\n}\n\nfunction estimateSerializedRecordBytes(value: Record<string, unknown>, limit: number, seen: Set<object>): number {\n\tlet total = 2;\n\tfor (const key in value) {\n\t\tif (!Object.hasOwn(value, key)) continue;\n\t\ttotal += Buffer.byteLength(key, \"utf8\") * 6 + estimateSerializedBytes(value[key], limit - total, seen) + 4;\n\t\tif (total > limit) return total;\n\t}\n\treturn total;\n}\n\nfunction estimateSerializedBytes(value: unknown, limit: number, seen = new Set<object>()): number {\n\tif (typeof value === \"string\") return Buffer.byteLength(value, \"utf8\") * 6 + 2;\n\tif (typeof value !== \"object\" || value === null) return Buffer.byteLength(String(value), \"utf8\");\n\tif (seen.has(value)) return 0;\n\tseen.add(value);\n\tif (Array.isArray(value)) return estimateSerializedArrayBytes(value, limit, seen);\n\tif (isRecord(value)) return estimateSerializedRecordBytes(value, limit, seen);\n\treturn 2;\n}\n\ninterface BoundedLineCollector {\n\tlines: string[];\n\tbytes: number;\n\tencounteredLines: number;\n\ttruncated: boolean;\n\tlimitReached: boolean;\n\tappendLine(line: string): boolean;\n\tomitOversizedLine(): boolean;\n\tappendText(text: string): boolean;\n}\ninterface SearchLineTextSegment {\n\tkind: \"line\";\n\tline: string;\n\tnextStart: number;\n}\n\ninterface OversizedSearchTextSegment {\n\tkind: \"oversized\";\n\tcomplete: boolean;\n}\n\ntype SearchTextSegment = SearchLineTextSegment | OversizedSearchTextSegment;\n\nfunction readSearchTextSegment(text: string, start: number): SearchTextSegment {\n\tconst windowEnd = Math.min(text.length, start + MAX_SEARCH_LINE_LENGTH + 1);\n\tconst window = text.slice(start, windowEnd);\n\tconst lineFeed = window.indexOf(\"\\n\");\n\tconst carriageReturn = window.indexOf(\"\\r\");\n\tlet separatorIndex = lineFeed;\n\tif (separatorIndex < 0 || (carriageReturn >= 0 && carriageReturn < separatorIndex)) {\n\t\tseparatorIndex = carriageReturn;\n\t}\n\tif (separatorIndex < 0) {\n\t\tif (window.length > MAX_SEARCH_LINE_LENGTH) {\n\t\t\treturn { kind: \"oversized\", complete: windowEnd === text.length };\n\t\t}\n\t\treturn { kind: \"line\", line: window, nextStart: text.length };\n\t}\n\n\tconst separatorPosition = start + separatorIndex;\n\tconst separatorLength = text[separatorPosition] === \"\\r\" && text[separatorPosition + 1] === \"\\n\" ? 2 : 1;\n\treturn {\n\t\tkind: \"line\",\n\t\tline: window.slice(0, separatorIndex),\n\t\tnextStart: separatorPosition + separatorLength,\n\t};\n}\nfunction appendOversizedSearchTextSegment(\n\tcollector: BoundedLineCollector,\n\tsegment: OversizedSearchTextSegment,\n): boolean {\n\tif (!collector.omitOversizedLine()) return false;\n\tif (!segment.complete) collector.limitReached = true;\n\treturn segment.complete;\n}\n\nfunction createBoundedLineCollector(maxLines: number, maxBytes: number): BoundedLineCollector {\n\tconst collector: BoundedLineCollector = {\n\t\tlines: [],\n\t\tbytes: 0,\n\t\tencounteredLines: 0,\n\t\ttruncated: false,\n\t\tlimitReached: false,\n\t\tappendLine(line) {\n\t\t\tif (line.length > MAX_SEARCH_LINE_LENGTH) return collector.omitOversizedLine();\n\t\t\tconst lineBytes = Buffer.byteLength(line, \"utf8\") + 1;\n\t\t\tif (collector.encounteredLines >= maxLines || collector.bytes + lineBytes > maxBytes) {\n\t\t\t\tcollector.truncated = true;\n\t\t\t\tcollector.limitReached = true;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcollector.lines.push(line);\n\t\t\tcollector.bytes += lineBytes;\n\t\t\tcollector.encounteredLines++;\n\t\t\treturn true;\n\t\t},\n\t\tomitOversizedLine() {\n\t\t\tconst budgetBytes = MAX_SEARCH_LINE_LENGTH * 4 + 1;\n\t\t\tif (collector.encounteredLines >= maxLines || collector.bytes + budgetBytes > maxBytes) {\n\t\t\t\tcollector.truncated = true;\n\t\t\t\tcollector.limitReached = true;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcollector.bytes += budgetBytes;\n\t\t\tcollector.encounteredLines++;\n\t\t\tcollector.truncated = true;\n\t\t\treturn true;\n\t\t},\n\t\tappendText(text) {\n\t\t\tif (text.length === 0) return collector.appendLine(\"\");\n\t\t\tlet start = 0;\n\t\t\twhile (start < text.length) {\n\t\t\t\tconst segment = readSearchTextSegment(text, start);\n\t\t\t\tif (segment.kind === \"oversized\") return appendOversizedSearchTextSegment(collector, segment);\n\t\t\t\tif (!collector.appendLine(segment.line)) return false;\n\t\t\t\tstart = segment.nextStart;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t};\n\treturn collector;\n}\n\nfunction appendSearchArrayValues(collector: BoundedLineCollector, values: unknown[], seen: Set<object>): boolean {\n\tfor (let index = 0; index < values.length; index++) {\n\t\tif (!appendSearchValue(collector, values[index], seen, `[${index}]`)) return false;\n\t}\n\treturn true;\n}\n\nfunction appendSearchRecordValue(\n\tcollector: BoundedLineCollector,\n\tvalue: Record<string, unknown>,\n\tseen: Set<object>,\n): boolean {\n\tif (value.type === \"image\" && typeof value.data === \"string\") {\n\t\treturn collector.appendLine(\n\t\t\t`[image ${typeof value.mimeType === \"string\" ? value.mimeType : \"unknown\"} data omitted: ${value.data.length} chars]`,\n\t\t);\n\t}\n\tfor (const key in value) {\n\t\tif (!Object.hasOwn(value, key)) continue;\n\t\tif (!appendSearchValue(collector, value[key], seen, key)) return false;\n\t}\n\treturn true;\n}\n\nfunction appendSearchValue(\n\tcollector: BoundedLineCollector,\n\tvalue: unknown,\n\tseen = new Set<object>(),\n\tlabel?: string,\n): boolean {\n\tif (label !== undefined && !collector.appendLine(`${label}:`)) return false;\n\tif (typeof value === \"string\") return collector.appendText(value);\n\tif (typeof value !== \"object\" || value === null) return collector.appendLine(String(value));\n\tif (seen.has(value)) return collector.appendLine(\"[circular value omitted]\");\n\tseen.add(value);\n\tif (Array.isArray(value)) return appendSearchArrayValues(collector, value, seen);\n\tif (!isRecord(value)) return collector.appendLine(String(value));\n\treturn appendSearchRecordValue(collector, value, seen);\n}\n\nfunction appendSearchContentBlock(collector: BoundedLineCollector, block: Record<string, unknown>): void {\n\tswitch (block.type) {\n\t\tcase \"text\":\n\t\t\tif (typeof block.text === \"string\") collector.appendText(block.text);\n\t\t\tbreak;\n\t\tcase \"thinking\":\n\t\t\tif (typeof block.thinking !== \"string\") break;\n\t\t\tcollector.appendLine(\"thinking:\");\n\t\t\tcollector.appendText(block.thinking);\n\t\t\tbreak;\n\t\tcase \"toolCall\":\n\t\t\tcollector.appendLine(`tool_call: ${typeof block.name === \"string\" ? block.name : \"unknown\"}`);\n\t\t\tif (block.arguments !== undefined) appendSearchValue(collector, block.arguments);\n\t\t\tbreak;\n\t\tcase \"image\":\n\t\t\tcollector.appendLine(`[image ${typeof block.mimeType === \"string\" ? block.mimeType : \"unknown\"} omitted]`);\n\t\t\tbreak;\n\t}\n}\n\nfunction appendContentLines(collector: BoundedLineCollector, content: unknown): void {\n\tif (typeof content === \"string\") {\n\t\tcollector.appendText(content);\n\t\treturn;\n\t}\n\tif (!Array.isArray(content)) return;\n\tfor (const block of content) {\n\t\tif (collector.limitReached) break;\n\t\tif (isRecord(block)) appendSearchContentBlock(collector, block);\n\t}\n}\n\nfunction finishSearchDocument(entry: SessionEntry, collector: BoundedLineCollector, role?: string): SearchDocument {\n\treturn {\n\t\tentry,\n\t\trole,\n\t\tlines: collector.lines,\n\t\tbytes: collector.bytes,\n\t\ttruncated: collector.truncated,\n\t\tlimitReached: collector.limitReached,\n\t};\n}\n\nfunction createMessageSearchDocument(entry: SessionEntry, collector: BoundedLineCollector): SearchDocument | undefined {\n\tif (entry.type !== \"message\") return undefined;\n\tconst message = entry.message;\n\tconst role = message.role;\n\tif (role === \"bashExecution\" && message.excludeFromContext) return undefined;\n\tif (role === \"custom\" && message.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE) return undefined;\n\tcollector.appendLine(`role: ${role}`);\n\tswitch (role) {\n\t\tcase \"user\":\n\t\tcase \"assistant\":\n\t\t\tappendContentLines(collector, message.content);\n\t\t\tbreak;\n\t\tcase \"toolResult\":\n\t\t\tcollector.appendLine(`tool_name: ${message.toolName}`);\n\t\t\tappendContentLines(collector, message.content);\n\t\t\tbreak;\n\t\tcase \"custom\":\n\t\t\tcollector.appendLine(`custom_type: ${message.customType}`);\n\t\t\tappendContentLines(collector, message.content);\n\t\t\tbreak;\n\t\tcase \"bashExecution\":\n\t\t\tcollector.appendLine(\"command:\");\n\t\t\tcollector.appendText(message.command);\n\t\t\tcollector.appendLine(\"output:\");\n\t\t\tcollector.appendText(message.output);\n\t\t\tbreak;\n\t\tcase \"branchSummary\":\n\t\tcase \"compactionSummary\":\n\t\t\tcollector.appendText(message.summary);\n\t\t\tbreak;\n\t}\n\treturn finishSearchDocument(entry, collector, role);\n}\n\nfunction createMetadataSearchDocument(\n\tentry: SessionEntry,\n\tcollector: BoundedLineCollector,\n): SearchDocument | undefined {\n\tif (entry.type === \"message\") return undefined;\n\tswitch (entry.type) {\n\t\tcase \"compaction\":\n\t\t\tcollector.appendLine(\"compaction summary:\");\n\t\t\tcollector.appendText(entry.summary);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"branch_summary\":\n\t\t\tcollector.appendLine(\"branch summary:\");\n\t\t\tcollector.appendText(entry.summary);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"custom_message\":\n\t\t\tif (entry.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE) return undefined;\n\t\t\tcollector.appendLine(`custom_type: ${entry.customType}`);\n\t\t\tappendContentLines(collector, entry.content);\n\t\t\treturn finishSearchDocument(entry, collector, \"custom\");\n\t\tcase \"thinking_level_change\":\n\t\t\tcollector.appendLine(`thinking_level: ${entry.thinkingLevel}`);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"model_change\":\n\t\t\tcollector.appendLine(`model: ${entry.provider}/${entry.modelId}`);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"label\":\n\t\t\tcollector.appendLine(`label target: ${entry.targetId}`);\n\t\t\tcollector.appendLine(`label: ${entry.label ?? \"(cleared)\"}`);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"session_info\":\n\t\t\tcollector.appendLine(`session_name: ${entry.name ?? \"\"}`);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"custom\":\n\t\t\treturn undefined;\n\t}\n}\n\nfunction createSearchDocument(entry: SessionEntry, maxLines: number, maxBytes: number): SearchDocument | undefined {\n\tconst collector = createBoundedLineCollector(maxLines, maxBytes);\n\treturn entry.type === \"message\"\n\t\t? createMessageSearchDocument(entry, collector)\n\t\t: createMetadataSearchDocument(entry, collector);\n}\n\nfunction containsToolCall(entry: SessionEntry, toolCallId: string): boolean {\n\treturn (\n\t\tentry.type === \"message\" &&\n\t\tentry.message.role === \"assistant\" &&\n\t\tentry.message.content.some((block) => block.type === \"toolCall\" && block.id === toolCallId)\n\t);\n}\n\nfunction buildSearchCorpus(entries: SessionEntry[], toolCallId: string, signal?: AbortSignal): SearchCorpus {\n\tconst searchLines: SearchLine[] = [];\n\tlet scannedEntries = 0;\n\tlet scannedBytes = 0;\n\tlet truncated = false;\n\tfor (const entry of entries) {\n\t\tabortIf(signal);\n\t\tif (containsToolCall(entry, toolCallId)) continue;\n\t\tconst document = createSearchDocument(\n\t\t\tentry,\n\t\t\tMAX_SEARCH_LINES - searchLines.length,\n\t\t\tMAX_SEARCH_BYTES - scannedBytes,\n\t\t);\n\t\tif (!document) continue;\n\t\tfor (let lineIndex = 0; lineIndex < document.lines.length; lineIndex++) {\n\t\t\tsearchLines.push({ document, lineIndex });\n\t\t}\n\t\tif (document.lines.length > 0) scannedEntries++;\n\t\tscannedBytes += document.bytes;\n\t\ttruncated ||= document.truncated;\n\t\tif (document.limitReached) break;\n\t}\n\treturn { lines: searchLines, scannedEntries, scannedBytes, truncated };\n}\n\nfunction validateRegex(pattern: string, ignoreCase: boolean): void {\n\ttry {\n\t\tnew RegExp(pattern, ignoreCase ? \"iu\" : \"u\");\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Invalid session_search regular expression: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n}\n\nfunction findFixedStringMatchIndexes(lines: string[], pattern: string, ignoreCase: boolean): number[] {\n\tconst expected = ignoreCase ? pattern.toLowerCase() : pattern;\n\tconst indexes: number[] = [];\n\tfor (let index = 0; index < lines.length; index++) {\n\t\tif ((ignoreCase ? lines[index].toLowerCase() : lines[index]).includes(expected)) indexes.push(index);\n\t}\n\treturn indexes;\n}\n\nfunction findRegexMatchIndexes(\n\tlines: string[],\n\tpattern: string,\n\tignoreCase: boolean,\n\tsignal?: AbortSignal,\n): Promise<number[]> {\n\tvalidateRegex(pattern, ignoreCase);\n\tabortIf(signal);\n\treturn new Promise((resolve, reject) => {\n\t\tconst worker = new Worker(REGEX_WORKER_SOURCE, {\n\t\t\teval: true,\n\t\t\tworkerData: { lines, pattern, ignoreCase },\n\t\t});\n\t\tlet settled = false;\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tvoid worker.terminate();\n\t\t};\n\t\tconst succeed = (indexes: number[]) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tresolve(indexes);\n\t\t};\n\t\tconst fail = (error: Error) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t};\n\t\tconst onAbort = () => fail(new Error(\"Operation aborted\"));\n\t\tconst timeout = setTimeout(\n\t\t\t() => fail(new Error(`session_search regular expression exceeded the ${REGEX_TIMEOUT_MS}ms safety limit`)),\n\t\t\tREGEX_TIMEOUT_MS,\n\t\t);\n\t\ttimeout.unref?.();\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tworker.once(\"message\", (message: unknown) => {\n\t\t\tif (!isRecord(message)) {\n\t\t\t\tfail(new Error(\"session_search regex worker returned an invalid response\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (typeof message.error === \"string\") {\n\t\t\t\tfail(new Error(`Invalid session_search regular expression: ${message.error}`));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!Array.isArray(message.indexes) || !message.indexes.every((index) => Number.isSafeInteger(index))) {\n\t\t\t\tfail(new Error(\"session_search regex worker returned invalid match indexes\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsucceed(message.indexes as number[]);\n\t\t});\n\t\tworker.once(\"error\", fail);\n\t\tworker.once(\"exit\", (code) => {\n\t\t\tif (!settled) fail(new Error(`session_search regex worker exited before returning matches (code ${code})`));\n\t\t});\n\t});\n}\n\nfunction collectMatches(\n\tcorpus: SearchCorpus,\n\tindexes: number[],\n\tbeforeContext: number,\n\tafterContext: number,\n): CollectedMatch[] {\n\treturn indexes.map((index) => {\n\t\tconst searchLine = corpus.lines[index];\n\t\tconst { document, lineIndex } = searchLine;\n\t\tconst entry = document.entry;\n\t\treturn {\n\t\t\tentryId: entry.id,\n\t\t\tentryType: entry.type,\n\t\t\trole: document.role,\n\t\t\ttimestamp: entry.timestamp,\n\t\t\tlineNumber: lineIndex + 1,\n\t\t\tline: document.lines[lineIndex],\n\t\t\tcontextBefore: document.lines\n\t\t\t\t.slice(Math.max(0, lineIndex - beforeContext), lineIndex)\n\t\t\t\t.map((line, contextIndex) => ({\n\t\t\t\t\tlineNumber: Math.max(0, lineIndex - beforeContext) + contextIndex + 1,\n\t\t\t\t\tline,\n\t\t\t\t})),\n\t\t\tcontextAfter: document.lines\n\t\t\t\t.slice(lineIndex + 1, lineIndex + 1 + afterContext)\n\t\t\t\t.map((line, contextIndex) => ({ lineNumber: lineIndex + contextIndex + 2, line })),\n\t\t};\n\t});\n}\n\nfunction entryHeader(match: CollectedMatch): string {\n\tconst role = match.role ? ` role=${match.role}` : \"\";\n\treturn `entry ${match.entryId} type=${match.entryType}${role} timestamp=${match.timestamp}`;\n}\n\nfunction displayLine(line: string): string {\n\treturn truncateLine(line, MAX_DISPLAY_LINE_LENGTH).text;\n}\n\nfunction formatMatches(\n\tmatches: CollectedMatch[],\n\ttotalMatches: number,\n\tmaxResults: number,\n\tscanTruncated: boolean,\n): string {\n\tconst blocks = matches.map((match) => {\n\t\tconst lines = [entryHeader(match)];\n\t\tfor (const context of match.contextBefore) lines.push(` ${context.lineNumber}-${displayLine(context.line)}`);\n\t\tlines.push(`> ${match.lineNumber}:${displayLine(match.line)}`);\n\t\tfor (const context of match.contextAfter) lines.push(` ${context.lineNumber}-${displayLine(context.line)}`);\n\t\treturn lines.join(\"\\n\");\n\t});\n\tif (blocks.length === 0) blocks.push(\"No matching session entries found.\");\n\tif (totalMatches > maxResults) {\n\t\tblocks.push(\n\t\t\t`[Showing ${matches.length} of ${totalMatches} matching lines. Refine the pattern or raise maxResults.]`,\n\t\t);\n\t}\n\tif (scanTruncated) {\n\t\tblocks.push(\n\t\t\t`[Session search input was bounded at ${MAX_SEARCH_LINES} lines, ${MAX_SEARCH_BYTES} bytes, and ${MAX_SEARCH_LINE_LENGTH} characters per line. Results may be incomplete.]`,\n\t\t);\n\t}\n\treturn blocks.join(\"\\n\\n\");\n}\n\ninterface TruncatedSessionToolOutput {\n\ttext: string;\n\ttruncated: boolean;\n}\n\nfunction truncateToolOutput(output: string): TruncatedSessionToolOutput {\n\tconst initial = truncateHead(output, { maxBytes: DEFAULT_MAX_BYTES, maxLines: DEFAULT_MAX_LINES });\n\tif (!initial.truncated) return { text: output, truncated: false };\n\tconst notice = \"\\n\\n[Session tool output truncated. Refine the request.]\";\n\tconst reserved = truncateHead(output, {\n\t\tmaxBytes: DEFAULT_MAX_BYTES - Buffer.byteLength(notice, \"utf8\"),\n\t\tmaxLines: DEFAULT_MAX_LINES - 2,\n\t});\n\treturn { text: `${reserved.content}${notice}`, truncated: true };\n}\n\nfunction projectEntryForModel(entry: SessionEntry): unknown | undefined {\n\tif (entry.type === \"custom\") return undefined;\n\tif (entry.type === \"custom_message\") {\n\t\tif (entry.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE) return undefined;\n\t\tconst { details: _details, ...visible } = entry;\n\t\treturn visible;\n\t}\n\tif (entry.type === \"compaction\" || entry.type === \"branch_summary\") {\n\t\tconst { details: _details, ...visible } = entry;\n\t\treturn visible;\n\t}\n\tif (entry.type !== \"message\") return entry;\n\tconst message = entry.message;\n\tif (message.role === \"bashExecution\") {\n\t\tif (message.excludeFromContext) return undefined;\n\t\tconst { fullOutputPath: _fullOutputPath, ...visibleMessage } = message;\n\t\treturn { ...entry, message: visibleMessage };\n\t}\n\tif (message.role === \"toolResult\") {\n\t\tconst { details: _details, ...visibleMessage } = message;\n\t\treturn { ...entry, message: visibleMessage };\n\t}\n\tif (message.role === \"custom\") {\n\t\tif (message.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE) return undefined;\n\t\tconst { details: _details, ...visibleMessage } = message;\n\t\treturn { ...entry, message: visibleMessage };\n\t}\n\treturn entry;\n}\n\nfunction getContextSearchEntries(path: SessionEntry[]): SessionEntry[] {\n\tconst compaction = getLatestCompactionEntry(path);\n\treturn projectSessionContextEntries(path).filter(\n\t\t(entry) =>\n\t\t\tentry.type === \"message\" ||\n\t\t\tentry.type === \"custom_message\" ||\n\t\t\tentry.type === \"branch_summary\" ||\n\t\t\t(entry.type === \"compaction\" && entry.id === compaction?.id && entry.summary.length > 0),\n\t);\n}\n\nexport function createSessionSearchToolDefinition(\n\tsession: ReadonlySession,\n): ToolDefinition<typeof sessionSearchSchema, SessionSearchToolDetails> {\n\treturn {\n\t\tname: \"session_search\",\n\t\tlabel: \"session_search\",\n\t\tdescription:\n\t\t\t\"Search finalized entries in the active session using a JavaScript regular expression by default, with grep-like case, fixed-string, context, result-limit, and scope options. Searches entries in the current model context by default; use scope: branch for older current-branch history or scope: all for archived branches. Hidden extension state and context-excluded bash output are not searched. Input and output are bounded.\",\n\t\tpromptSnippet: \"Search finalized entries in the active session history with a regular expression\",\n\t\tpromptGuidelines: [\n\t\t\t\"Default searches cover current model context. Use scope: branch or scope: all to recover history omitted by compaction; use session_entry_get with a returned entry ID when the exact model-visible entry is needed.\",\n\t\t],\n\t\tparameters: sessionSearchSchema,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(\n\t\t\ttoolCallId,\n\t\t\t{\n\t\t\t\tpattern,\n\t\t\t\tignoreCase = false,\n\t\t\t\tfixedStrings = false,\n\t\t\t\tbeforeContext = 0,\n\t\t\t\tafterContext = 0,\n\t\t\t\tmaxResults = DEFAULT_SEARCH_RESULTS,\n\t\t\t\tscope = \"context\",\n\t\t\t}: SessionSearchToolInput,\n\t\t\tsignal,\n\t\t) {\n\t\t\tabortIf(signal);\n\t\t\tconst entries =\n\t\t\t\tscope === \"all\"\n\t\t\t\t\t? session.getEntries()\n\t\t\t\t\t: scope === \"branch\"\n\t\t\t\t\t\t? session.getBranch()\n\t\t\t\t\t\t: getContextSearchEntries(session.getBranch());\n\t\t\tconst corpus = buildSearchCorpus(entries, toolCallId, signal);\n\t\t\tconst lines = corpus.lines.map(({ document, lineIndex }) => document.lines[lineIndex]);\n\t\t\tconst matchIndexes = fixedStrings\n\t\t\t\t? findFixedStringMatchIndexes(lines, pattern, ignoreCase)\n\t\t\t\t: await findRegexMatchIndexes(lines, pattern, ignoreCase, signal);\n\t\t\tabortIf(signal);\n\t\t\tconst matches = collectMatches(corpus, matchIndexes.slice(0, maxResults), beforeContext, afterContext);\n\t\t\tconst output = truncateToolOutput(formatMatches(matches, matchIndexes.length, maxResults, corpus.truncated));\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: output.text }],\n\t\t\t\tdetails: {\n\t\t\t\t\tpattern,\n\t\t\t\t\tignoreCase,\n\t\t\t\t\tfixedStrings,\n\t\t\t\t\tscope,\n\t\t\t\t\tmatchCount: matchIndexes.length,\n\t\t\t\t\treturnedMatchCount: matches.length,\n\t\t\t\t\tmatches: matches.map(({ contextBefore: _before, contextAfter: _after, ...match }) => ({\n\t\t\t\t\t\t...match,\n\t\t\t\t\t\tline: displayLine(match.line),\n\t\t\t\t\t})),\n\t\t\t\t\tscannedEntries: corpus.scannedEntries,\n\t\t\t\t\tscannedLines: corpus.lines.length,\n\t\t\t\t\tscannedBytes: corpus.scannedBytes,\n\t\t\t\t\tscanTruncated: corpus.truncated,\n\t\t\t\t\toutputTruncated: output.truncated,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSessionEntryGetToolDefinition(\n\tsession: ReadonlySession,\n): ToolDefinition<typeof sessionEntryGetSchema, SessionEntryGetToolDetails> {\n\treturn {\n\t\tname: \"session_entry_get\",\n\t\tlabel: \"session_entry_get\",\n\t\tdescription:\n\t\t\t\"Fetch one exact model-visible entry by ID from the active session, including entries outside the current branch. Extension-private metadata, hidden custom entries, context-excluded bash output, and base64 image payloads are not exposed. Returns the complete JSON projection unless safety or tool-output limits require truncation.\",\n\t\tpromptSnippet: \"Fetch an exact model-visible entry by ID from the active session\",\n\t\tparameters: sessionEntryGetSchema,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, { entryId }: SessionEntryGetToolInput, signal) {\n\t\t\tabortIf(signal);\n\t\t\tconst entry = session.getEntry(entryId);\n\t\t\tif (!entry) throw new Error(`Session entry not found: ${entryId}`);\n\t\t\tconst visibleEntry = projectEntryForModel(entry);\n\t\t\tif (!visibleEntry) throw new Error(`Session entry is private or context-excluded: ${entryId}`);\n\t\t\tconst sanitizedEntry = sanitizeImageData(visibleEntry);\n\t\t\tif (estimateSerializedBytes(sanitizedEntry, MAX_ENTRY_SERIALIZATION_BYTES) > MAX_ENTRY_SERIALIZATION_BYTES) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Session entry exceeds the ${MAX_ENTRY_SERIALIZATION_BYTES}-byte serialization safety limit: ${entryId}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst onCurrentBranch = session.getBranch().some((candidate) => candidate.id === entryId);\n\t\t\tconst output = truncateToolOutput(`Session entry ${entryId}:\\n${JSON.stringify(sanitizedEntry)}`);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: output.text }],\n\t\t\t\tdetails: {\n\t\t\t\t\tentryId,\n\t\t\t\t\tentryType: entry.type,\n\t\t\t\t\tonCurrentBranch,\n\t\t\t\t\toutputTruncated: output.truncated,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSessionSearchTool(session: ReadonlySession): AgentTool<typeof sessionSearchSchema> {\n\treturn wrapToolDefinition(createSessionSearchToolDefinition(session));\n}\n\nexport function createSessionEntryGetTool(session: ReadonlySession): AgentTool<typeof sessionEntryGetSchema> {\n\treturn wrapToolDefinition(createSessionEntryGetToolDefinition(session));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-history.js","sourceRoot":"","sources":["../../../src/core/tools/session-history.ts"],"names":[],"mappings":"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","sourcesContent":["import { Worker } from \"node:worker_threads\";\nimport type { AgentTool } from \"@greppleai/grip-agent-core\";\nimport { StringEnum } from \"@greppleai/grip-ai\";\nimport type { Static } from \"typebox\";\nimport { Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE } from \"../messages.ts\";\nimport { getLatestCompactionEntry, projectSessionContextEntries } from \"../session/context.ts\";\nimport type { ReadonlySession } from \"../session/session.ts\";\nimport type { SessionEntry } from \"../session/types.ts\";\nimport { abortIf } from \"./runtime.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, truncateHead, truncateLine } from \"./truncate.ts\";\n\nconst DEFAULT_SEARCH_RESULTS = 20;\nconst MAX_SEARCH_RESULTS = 50;\nconst MAX_CONTEXT_LINES = 5;\nconst MAX_PATTERN_LENGTH = 1000;\nconst MAX_DISPLAY_LINE_LENGTH = 500;\nconst MAX_SEARCH_LINE_LENGTH = 10_000;\nconst MAX_SEARCH_BYTES = 5 * 1024 * 1024;\nconst MAX_SEARCH_LINES = 100_000;\nconst MAX_ENTRY_SERIALIZATION_BYTES = 5 * 1024 * 1024;\nconst REGEX_TIMEOUT_MS = 1000;\n\nconst REGEX_WORKER_SOURCE = `\nconst { parentPort, workerData } = require(\"node:worker_threads\");\ntry {\n const expression = new RegExp(workerData.pattern, workerData.ignoreCase ? \"iu\" : \"u\");\n const indexes = [];\n for (let index = 0; index < workerData.lines.length; index++) {\n if (expression.test(workerData.lines[index])) indexes.push(index);\n }\n parentPort.postMessage({ indexes });\n} catch (error) {\n parentPort.postMessage({ error: error instanceof Error ? error.message : String(error) });\n}\n`;\n\nconst sessionSearchSchema = Type.Object({\n\tpattern: Type.String({\n\t\tdescription:\n\t\t\t\"JavaScript regular expression to search for, without / delimiters; use fixedStrings for literal matching\",\n\t\tmaxLength: MAX_PATTERN_LENGTH,\n\t}),\n\tignoreCase: Type.Optional(Type.Boolean({ description: \"Perform case-insensitive matching, like grep -i\" })),\n\tfixedStrings: Type.Optional(\n\t\tType.Boolean({ description: \"Treat pattern as a literal string instead of a regular expression, like grep -F\" }),\n\t),\n\tbeforeContext: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: `Context lines before each match (default 0, max ${MAX_CONTEXT_LINES}), like grep -B`,\n\t\t\tminimum: 0,\n\t\t\tmaximum: MAX_CONTEXT_LINES,\n\t\t}),\n\t),\n\tafterContext: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: `Context lines after each match (default 0, max ${MAX_CONTEXT_LINES}), like grep -A`,\n\t\t\tminimum: 0,\n\t\t\tmaximum: MAX_CONTEXT_LINES,\n\t\t}),\n\t),\n\tmaxResults: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: `Maximum matching lines to return (default ${DEFAULT_SEARCH_RESULTS}, max ${MAX_SEARCH_RESULTS})`,\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SEARCH_RESULTS,\n\t\t}),\n\t),\n\tscope: Type.Optional(\n\t\tStringEnum([\"context\", \"branch\", \"all\"] as const, {\n\t\t\tdescription: \"Search entries in the current model context (default), current branch ancestry, or every branch\",\n\t\t}),\n\t),\n});\n\nconst sessionEntryGetSchema = Type.Object({\n\tentryId: Type.String({\n\t\tdescription: \"Exact session entry ID returned by session_search or another session API\",\n\t\tminLength: 1,\n\t}),\n});\n\nexport type SessionHistoryToolName = \"session_search\" | \"session_entry_get\";\nexport type SessionSearchToolInput = Static<typeof sessionSearchSchema>;\nexport type SessionEntryGetToolInput = Static<typeof sessionEntryGetSchema>;\nexport type SessionSearchScope = \"context\" | \"branch\" | \"all\";\n\nexport interface SessionSearchMatch {\n\tentryId: string;\n\tentryType: string;\n\trole?: string;\n\ttimestamp: string;\n\tlineNumber: number;\n\tline: string;\n}\n\nexport interface SessionSearchToolDetails {\n\tpattern: string;\n\tignoreCase: boolean;\n\tfixedStrings: boolean;\n\tscope: SessionSearchScope;\n\tmatchCount: number;\n\treturnedMatchCount: number;\n\tmatches: SessionSearchMatch[];\n\tscannedEntries: number;\n\tscannedLines: number;\n\tscannedBytes: number;\n\tscanTruncated: boolean;\n\toutputTruncated: boolean;\n}\n\nexport interface SessionEntryGetToolDetails {\n\tentryId: string;\n\tentryType: string;\n\tonCurrentBranch: boolean;\n\toutputTruncated: boolean;\n}\n\ninterface SearchDocument {\n\tentry: SessionEntry;\n\trole?: string;\n\tlines: string[];\n\tbytes: number;\n\ttruncated: boolean;\n\tlimitReached: boolean;\n}\n\ninterface SearchLine {\n\tdocument: SearchDocument;\n\tlineIndex: number;\n}\n\ninterface SearchCorpus {\n\tlines: SearchLine[];\n\tscannedEntries: number;\n\tscannedBytes: number;\n\ttruncated: boolean;\n}\n\ninterface SessionSearchContextLine {\n\tlineNumber: number;\n\tline: string;\n}\n\ninterface CollectedMatch extends SessionSearchMatch {\n\tcontextBefore: SessionSearchContextLine[];\n\tcontextAfter: SessionSearchContextLine[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction sanitizeImageData(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map((child) => sanitizeImageData(child));\n\tif (!isRecord(value)) return value;\n\tconst result: Record<string, unknown> = {};\n\tconst imageDataLength = value.type === \"image\" && typeof value.data === \"string\" ? value.data.length : undefined;\n\tfor (const key in value) {\n\t\tif (!Object.hasOwn(value, key)) continue;\n\t\tconst child = value[key];\n\t\tresult[key] =\n\t\t\timageDataLength !== undefined && key === \"data\"\n\t\t\t\t? `[base64 image data omitted: ${imageDataLength} chars]`\n\t\t\t\t: sanitizeImageData(child);\n\t}\n\treturn result;\n}\n\nfunction estimateSerializedArrayBytes(values: unknown[], limit: number, seen: Set<object>): number {\n\tlet total = 2;\n\tfor (const value of values) {\n\t\ttotal += estimateSerializedBytes(value, limit - total, seen) + 1;\n\t\tif (total > limit) return total;\n\t}\n\treturn total;\n}\n\nfunction estimateSerializedRecordBytes(value: Record<string, unknown>, limit: number, seen: Set<object>): number {\n\tlet total = 2;\n\tfor (const key in value) {\n\t\tif (!Object.hasOwn(value, key)) continue;\n\t\ttotal += Buffer.byteLength(key, \"utf8\") * 6 + estimateSerializedBytes(value[key], limit - total, seen) + 4;\n\t\tif (total > limit) return total;\n\t}\n\treturn total;\n}\n\nfunction estimateSerializedBytes(value: unknown, limit: number, seen = new Set<object>()): number {\n\tif (typeof value === \"string\") return Buffer.byteLength(value, \"utf8\") * 6 + 2;\n\tif (typeof value !== \"object\" || value === null) return Buffer.byteLength(String(value), \"utf8\");\n\tif (seen.has(value)) return 0;\n\tseen.add(value);\n\tif (Array.isArray(value)) return estimateSerializedArrayBytes(value, limit, seen);\n\tif (isRecord(value)) return estimateSerializedRecordBytes(value, limit, seen);\n\treturn 2;\n}\n\ninterface BoundedLineCollector {\n\tlines: string[];\n\tbytes: number;\n\tencounteredLines: number;\n\ttruncated: boolean;\n\tlimitReached: boolean;\n\tappendLine(line: string): boolean;\n\tomitOversizedLine(): boolean;\n\tappendText(text: string): boolean;\n}\ninterface SearchLineTextSegment {\n\tkind: \"line\";\n\tline: string;\n\tnextStart: number;\n}\n\ninterface OversizedSearchTextSegment {\n\tkind: \"oversized\";\n\tcomplete: boolean;\n}\n\ntype SearchTextSegment = SearchLineTextSegment | OversizedSearchTextSegment;\n\nfunction readSearchTextSegment(text: string, start: number): SearchTextSegment {\n\tconst windowEnd = Math.min(text.length, start + MAX_SEARCH_LINE_LENGTH + 1);\n\tconst window = text.slice(start, windowEnd);\n\tconst lineFeed = window.indexOf(\"\\n\");\n\tconst carriageReturn = window.indexOf(\"\\r\");\n\tlet separatorIndex = lineFeed;\n\tif (separatorIndex < 0 || (carriageReturn >= 0 && carriageReturn < separatorIndex)) {\n\t\tseparatorIndex = carriageReturn;\n\t}\n\tif (separatorIndex < 0) {\n\t\tif (window.length > MAX_SEARCH_LINE_LENGTH) {\n\t\t\treturn { kind: \"oversized\", complete: windowEnd === text.length };\n\t\t}\n\t\treturn { kind: \"line\", line: window, nextStart: text.length };\n\t}\n\n\tconst separatorPosition = start + separatorIndex;\n\tconst separatorLength = text[separatorPosition] === \"\\r\" && text[separatorPosition + 1] === \"\\n\" ? 2 : 1;\n\treturn {\n\t\tkind: \"line\",\n\t\tline: window.slice(0, separatorIndex),\n\t\tnextStart: separatorPosition + separatorLength,\n\t};\n}\nfunction appendOversizedSearchTextSegment(\n\tcollector: BoundedLineCollector,\n\tsegment: OversizedSearchTextSegment,\n): boolean {\n\tif (!collector.omitOversizedLine()) return false;\n\tif (!segment.complete) collector.limitReached = true;\n\treturn segment.complete;\n}\n\nfunction createBoundedLineCollector(maxLines: number, maxBytes: number): BoundedLineCollector {\n\tconst collector: BoundedLineCollector = {\n\t\tlines: [],\n\t\tbytes: 0,\n\t\tencounteredLines: 0,\n\t\ttruncated: false,\n\t\tlimitReached: false,\n\t\tappendLine(line) {\n\t\t\tif (line.length > MAX_SEARCH_LINE_LENGTH) return collector.omitOversizedLine();\n\t\t\tconst lineBytes = Buffer.byteLength(line, \"utf8\") + 1;\n\t\t\tif (collector.encounteredLines >= maxLines || collector.bytes + lineBytes > maxBytes) {\n\t\t\t\tcollector.truncated = true;\n\t\t\t\tcollector.limitReached = true;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcollector.lines.push(line);\n\t\t\tcollector.bytes += lineBytes;\n\t\t\tcollector.encounteredLines++;\n\t\t\treturn true;\n\t\t},\n\t\tomitOversizedLine() {\n\t\t\tconst budgetBytes = MAX_SEARCH_LINE_LENGTH * 4 + 1;\n\t\t\tif (collector.encounteredLines >= maxLines || collector.bytes + budgetBytes > maxBytes) {\n\t\t\t\tcollector.truncated = true;\n\t\t\t\tcollector.limitReached = true;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcollector.bytes += budgetBytes;\n\t\t\tcollector.encounteredLines++;\n\t\t\tcollector.truncated = true;\n\t\t\treturn true;\n\t\t},\n\t\tappendText(text) {\n\t\t\tif (text.length === 0) return collector.appendLine(\"\");\n\t\t\tlet start = 0;\n\t\t\twhile (start < text.length) {\n\t\t\t\tconst segment = readSearchTextSegment(text, start);\n\t\t\t\tif (segment.kind === \"oversized\") return appendOversizedSearchTextSegment(collector, segment);\n\t\t\t\tif (!collector.appendLine(segment.line)) return false;\n\t\t\t\tstart = segment.nextStart;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t};\n\treturn collector;\n}\n\nfunction appendSearchArrayValues(collector: BoundedLineCollector, values: unknown[], seen: Set<object>): boolean {\n\tfor (let index = 0; index < values.length; index++) {\n\t\tif (!appendSearchValue(collector, values[index], seen, `[${index}]`)) return false;\n\t}\n\treturn true;\n}\n\nfunction appendSearchRecordValue(\n\tcollector: BoundedLineCollector,\n\tvalue: Record<string, unknown>,\n\tseen: Set<object>,\n): boolean {\n\tif (value.type === \"image\" && typeof value.data === \"string\") {\n\t\treturn collector.appendLine(\n\t\t\t`[image ${typeof value.mimeType === \"string\" ? value.mimeType : \"unknown\"} data omitted: ${value.data.length} chars]`,\n\t\t);\n\t}\n\tfor (const key in value) {\n\t\tif (!Object.hasOwn(value, key)) continue;\n\t\tif (!appendSearchValue(collector, value[key], seen, key)) return false;\n\t}\n\treturn true;\n}\n\nfunction appendSearchValue(\n\tcollector: BoundedLineCollector,\n\tvalue: unknown,\n\tseen = new Set<object>(),\n\tlabel?: string,\n): boolean {\n\tif (label !== undefined && !collector.appendLine(`${label}:`)) return false;\n\tif (typeof value === \"string\") return collector.appendText(value);\n\tif (typeof value !== \"object\" || value === null) return collector.appendLine(String(value));\n\tif (seen.has(value)) return collector.appendLine(\"[circular value omitted]\");\n\tseen.add(value);\n\tif (Array.isArray(value)) return appendSearchArrayValues(collector, value, seen);\n\tif (!isRecord(value)) return collector.appendLine(String(value));\n\treturn appendSearchRecordValue(collector, value, seen);\n}\n\nfunction appendSearchContentBlock(collector: BoundedLineCollector, block: Record<string, unknown>): void {\n\tswitch (block.type) {\n\t\tcase \"text\":\n\t\t\tif (typeof block.text === \"string\") collector.appendText(block.text);\n\t\t\tbreak;\n\t\tcase \"thinking\":\n\t\t\tif (typeof block.thinking !== \"string\") break;\n\t\t\tcollector.appendLine(\"thinking:\");\n\t\t\tcollector.appendText(block.thinking);\n\t\t\tbreak;\n\t\tcase \"toolCall\":\n\t\t\tcollector.appendLine(`tool_call: ${typeof block.name === \"string\" ? block.name : \"unknown\"}`);\n\t\t\tif (block.arguments !== undefined) appendSearchValue(collector, block.arguments);\n\t\t\tbreak;\n\t\tcase \"image\":\n\t\t\tcollector.appendLine(`[image ${typeof block.mimeType === \"string\" ? block.mimeType : \"unknown\"} omitted]`);\n\t\t\tbreak;\n\t}\n}\n\nfunction appendContentLines(collector: BoundedLineCollector, content: unknown): void {\n\tif (typeof content === \"string\") {\n\t\tcollector.appendText(content);\n\t\treturn;\n\t}\n\tif (!Array.isArray(content)) return;\n\tfor (const block of content) {\n\t\tif (collector.limitReached) break;\n\t\tif (isRecord(block)) appendSearchContentBlock(collector, block);\n\t}\n}\n\nfunction finishSearchDocument(entry: SessionEntry, collector: BoundedLineCollector, role?: string): SearchDocument {\n\treturn {\n\t\tentry,\n\t\trole,\n\t\tlines: collector.lines,\n\t\tbytes: collector.bytes,\n\t\ttruncated: collector.truncated,\n\t\tlimitReached: collector.limitReached,\n\t};\n}\n\nfunction createMessageSearchDocument(entry: SessionEntry, collector: BoundedLineCollector): SearchDocument | undefined {\n\tif (entry.type !== \"message\") return undefined;\n\tconst message = entry.message;\n\tconst role = message.role;\n\tif (role === \"bashExecution\" && message.excludeFromContext) return undefined;\n\tif (role === \"custom\" && message.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE) return undefined;\n\tcollector.appendLine(`role: ${role}`);\n\tswitch (role) {\n\t\tcase \"user\":\n\t\tcase \"assistant\":\n\t\t\tappendContentLines(collector, message.content);\n\t\t\tbreak;\n\t\tcase \"toolResult\":\n\t\t\tcollector.appendLine(`tool_name: ${message.toolName}`);\n\t\t\tappendContentLines(collector, message.content);\n\t\t\tbreak;\n\t\tcase \"custom\":\n\t\t\tcollector.appendLine(`custom_type: ${message.customType}`);\n\t\t\tappendContentLines(collector, message.content);\n\t\t\tbreak;\n\t\tcase \"bashExecution\":\n\t\t\tcollector.appendLine(\"command:\");\n\t\t\tcollector.appendText(message.command);\n\t\t\tcollector.appendLine(\"output:\");\n\t\t\tcollector.appendText(message.output);\n\t\t\tbreak;\n\t\tcase \"branchSummary\":\n\t\tcase \"compactionSummary\":\n\t\t\tcollector.appendText(message.summary);\n\t\t\tbreak;\n\t}\n\treturn finishSearchDocument(entry, collector, role);\n}\n\nfunction createMetadataSearchDocument(\n\tentry: SessionEntry,\n\tcollector: BoundedLineCollector,\n): SearchDocument | undefined {\n\tif (entry.type === \"message\") return undefined;\n\tswitch (entry.type) {\n\t\tcase \"compaction\":\n\t\t\tcollector.appendLine(\"compaction summary:\");\n\t\t\tcollector.appendText(entry.summary);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"branch_summary\":\n\t\t\tcollector.appendLine(\"branch summary:\");\n\t\t\tcollector.appendText(entry.summary);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"custom_message\":\n\t\t\tif (entry.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE) return undefined;\n\t\t\tcollector.appendLine(`custom_type: ${entry.customType}`);\n\t\t\tappendContentLines(collector, entry.content);\n\t\t\treturn finishSearchDocument(entry, collector, \"custom\");\n\t\tcase \"thinking_level_change\":\n\t\t\tcollector.appendLine(`thinking_level: ${entry.thinkingLevel}`);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"model_change\":\n\t\t\tcollector.appendLine(`model: ${entry.provider}/${entry.modelId}`);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"label\":\n\t\t\tcollector.appendLine(`label target: ${entry.targetId}`);\n\t\t\tcollector.appendLine(`label: ${entry.label ?? \"(cleared)\"}`);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"session_info\":\n\t\t\tcollector.appendLine(`session_name: ${entry.name ?? \"\"}`);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"custom\":\n\t\t\treturn undefined;\n\t}\n}\n\nfunction createSearchDocument(entry: SessionEntry, maxLines: number, maxBytes: number): SearchDocument | undefined {\n\tconst collector = createBoundedLineCollector(maxLines, maxBytes);\n\treturn entry.type === \"message\"\n\t\t? createMessageSearchDocument(entry, collector)\n\t\t: createMetadataSearchDocument(entry, collector);\n}\n\nfunction containsToolCall(entry: SessionEntry, toolCallId: string): boolean {\n\treturn (\n\t\tentry.type === \"message\" &&\n\t\tentry.message.role === \"assistant\" &&\n\t\tentry.message.content.some((block) => block.type === \"toolCall\" && block.id === toolCallId)\n\t);\n}\n\nfunction buildSearchCorpus(entries: SessionEntry[], toolCallId: string, signal?: AbortSignal): SearchCorpus {\n\tconst searchLines: SearchLine[] = [];\n\tlet scannedEntries = 0;\n\tlet scannedBytes = 0;\n\tlet truncated = false;\n\tfor (const entry of entries) {\n\t\tabortIf(signal);\n\t\tif (containsToolCall(entry, toolCallId)) continue;\n\t\tconst document = createSearchDocument(\n\t\t\tentry,\n\t\t\tMAX_SEARCH_LINES - searchLines.length,\n\t\t\tMAX_SEARCH_BYTES - scannedBytes,\n\t\t);\n\t\tif (!document) continue;\n\t\tfor (let lineIndex = 0; lineIndex < document.lines.length; lineIndex++) {\n\t\t\tsearchLines.push({ document, lineIndex });\n\t\t}\n\t\tif (document.lines.length > 0) scannedEntries++;\n\t\tscannedBytes += document.bytes;\n\t\ttruncated ||= document.truncated;\n\t\tif (document.limitReached) break;\n\t}\n\treturn { lines: searchLines, scannedEntries, scannedBytes, truncated };\n}\n\nfunction validateRegex(pattern: string, ignoreCase: boolean): void {\n\ttry {\n\t\tnew RegExp(pattern, ignoreCase ? \"iu\" : \"u\");\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Invalid session_search regular expression: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n}\n\nfunction findFixedStringMatchIndexes(lines: string[], pattern: string, ignoreCase: boolean): number[] {\n\tconst expected = ignoreCase ? pattern.toLowerCase() : pattern;\n\tconst indexes: number[] = [];\n\tfor (let index = 0; index < lines.length; index++) {\n\t\tif ((ignoreCase ? lines[index].toLowerCase() : lines[index]).includes(expected)) indexes.push(index);\n\t}\n\treturn indexes;\n}\n\nfunction findRegexMatchIndexes(\n\tlines: string[],\n\tpattern: string,\n\tignoreCase: boolean,\n\tsignal?: AbortSignal,\n): Promise<number[]> {\n\tvalidateRegex(pattern, ignoreCase);\n\tabortIf(signal);\n\treturn new Promise((resolve, reject) => {\n\t\tconst worker = new Worker(REGEX_WORKER_SOURCE, {\n\t\t\teval: true,\n\t\t\tworkerData: { lines, pattern, ignoreCase },\n\t\t});\n\t\tlet settled = false;\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tvoid worker.terminate();\n\t\t};\n\t\tconst succeed = (indexes: number[]) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tresolve(indexes);\n\t\t};\n\t\tconst fail = (error: Error) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t};\n\t\tconst onAbort = () => fail(new Error(\"Operation aborted\"));\n\t\tconst timeout = setTimeout(\n\t\t\t() => fail(new Error(`session_search regular expression exceeded the ${REGEX_TIMEOUT_MS}ms safety limit`)),\n\t\t\tREGEX_TIMEOUT_MS,\n\t\t);\n\t\ttimeout.unref?.();\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tworker.once(\"message\", (message: unknown) => {\n\t\t\tif (!isRecord(message)) {\n\t\t\t\tfail(new Error(\"session_search regex worker returned an invalid response\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (typeof message.error === \"string\") {\n\t\t\t\tfail(new Error(`Invalid session_search regular expression: ${message.error}`));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!Array.isArray(message.indexes) || !message.indexes.every((index) => Number.isSafeInteger(index))) {\n\t\t\t\tfail(new Error(\"session_search regex worker returned invalid match indexes\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsucceed(message.indexes as number[]);\n\t\t});\n\t\tworker.once(\"error\", fail);\n\t\tworker.once(\"exit\", (code) => {\n\t\t\tif (!settled) fail(new Error(`session_search regex worker exited before returning matches (code ${code})`));\n\t\t});\n\t});\n}\n\nfunction collectMatches(\n\tcorpus: SearchCorpus,\n\tindexes: number[],\n\tbeforeContext: number,\n\tafterContext: number,\n): CollectedMatch[] {\n\treturn indexes.map((index) => {\n\t\tconst searchLine = corpus.lines[index];\n\t\tconst { document, lineIndex } = searchLine;\n\t\tconst entry = document.entry;\n\t\treturn {\n\t\t\tentryId: entry.id,\n\t\t\tentryType: entry.type,\n\t\t\trole: document.role,\n\t\t\ttimestamp: entry.timestamp,\n\t\t\tlineNumber: lineIndex + 1,\n\t\t\tline: document.lines[lineIndex],\n\t\t\tcontextBefore: document.lines\n\t\t\t\t.slice(Math.max(0, lineIndex - beforeContext), lineIndex)\n\t\t\t\t.map((line, contextIndex) => ({\n\t\t\t\t\tlineNumber: Math.max(0, lineIndex - beforeContext) + contextIndex + 1,\n\t\t\t\t\tline,\n\t\t\t\t})),\n\t\t\tcontextAfter: document.lines\n\t\t\t\t.slice(lineIndex + 1, lineIndex + 1 + afterContext)\n\t\t\t\t.map((line, contextIndex) => ({ lineNumber: lineIndex + contextIndex + 2, line })),\n\t\t};\n\t});\n}\n\nfunction entryHeader(match: CollectedMatch): string {\n\tconst role = match.role ? ` role=${match.role}` : \"\";\n\treturn `entry ${match.entryId} type=${match.entryType}${role} timestamp=${match.timestamp}`;\n}\n\nfunction displayLine(line: string): string {\n\treturn truncateLine(line, MAX_DISPLAY_LINE_LENGTH).text;\n}\n\nfunction formatMatches(\n\tmatches: CollectedMatch[],\n\ttotalMatches: number,\n\tmaxResults: number,\n\tscanTruncated: boolean,\n): string {\n\tconst blocks = matches.map((match) => {\n\t\tconst lines = [entryHeader(match)];\n\t\tfor (const context of match.contextBefore) lines.push(` ${context.lineNumber}-${displayLine(context.line)}`);\n\t\tlines.push(`> ${match.lineNumber}:${displayLine(match.line)}`);\n\t\tfor (const context of match.contextAfter) lines.push(` ${context.lineNumber}-${displayLine(context.line)}`);\n\t\treturn lines.join(\"\\n\");\n\t});\n\tif (blocks.length === 0) blocks.push(\"No matching session entries found.\");\n\tif (totalMatches > maxResults) {\n\t\tblocks.push(\n\t\t\t`[Showing ${matches.length} of ${totalMatches} matching lines. Refine the pattern or raise maxResults.]`,\n\t\t);\n\t}\n\tif (scanTruncated) {\n\t\tblocks.push(\n\t\t\t`[Session search input was bounded at ${MAX_SEARCH_LINES} lines, ${MAX_SEARCH_BYTES} bytes, and ${MAX_SEARCH_LINE_LENGTH} characters per line. Results may be incomplete.]`,\n\t\t);\n\t}\n\treturn blocks.join(\"\\n\\n\");\n}\n\ninterface TruncatedSessionToolOutput {\n\ttext: string;\n\ttruncated: boolean;\n}\n\nfunction truncateToolOutput(output: string): TruncatedSessionToolOutput {\n\tconst initial = truncateHead(output, { maxBytes: DEFAULT_MAX_BYTES, maxLines: DEFAULT_MAX_LINES });\n\tif (!initial.truncated) return { text: output, truncated: false };\n\tconst notice = \"\\n\\n[Session tool output truncated. Refine the request.]\";\n\tconst reserved = truncateHead(output, {\n\t\tmaxBytes: DEFAULT_MAX_BYTES - Buffer.byteLength(notice, \"utf8\"),\n\t\tmaxLines: DEFAULT_MAX_LINES - 2,\n\t});\n\treturn { text: `${reserved.content}${notice}`, truncated: true };\n}\n\nfunction projectEntryForModel(entry: SessionEntry): unknown | undefined {\n\tif (entry.type === \"custom\") return undefined;\n\tif (entry.type === \"custom_message\") {\n\t\tif (entry.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE) return undefined;\n\t\tconst { details: _details, ...visible } = entry;\n\t\treturn visible;\n\t}\n\tif (entry.type === \"compaction\" || entry.type === \"branch_summary\") {\n\t\tconst { details: _details, ...visible } = entry;\n\t\treturn visible;\n\t}\n\tif (entry.type !== \"message\") return entry;\n\tconst message = entry.message;\n\tif (message.role === \"bashExecution\") {\n\t\tif (message.excludeFromContext) return undefined;\n\t\tconst { fullOutputPath: _fullOutputPath, ...visibleMessage } = message;\n\t\treturn { ...entry, message: visibleMessage };\n\t}\n\tif (message.role === \"toolResult\") {\n\t\tconst { details: _details, ...visibleMessage } = message;\n\t\treturn { ...entry, message: visibleMessage };\n\t}\n\tif (message.role === \"custom\") {\n\t\tif (message.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE) return undefined;\n\t\tconst { details: _details, ...visibleMessage } = message;\n\t\treturn { ...entry, message: visibleMessage };\n\t}\n\treturn entry;\n}\n\nfunction getContextSearchEntries(path: SessionEntry[]): SessionEntry[] {\n\tconst compaction = getLatestCompactionEntry(path);\n\treturn projectSessionContextEntries(path).filter(\n\t\t(entry) =>\n\t\t\tentry.type === \"message\" ||\n\t\t\tentry.type === \"custom_message\" ||\n\t\t\tentry.type === \"branch_summary\" ||\n\t\t\t(entry.type === \"compaction\" && entry.id === compaction?.id && entry.summary.length > 0),\n\t);\n}\n\nexport function createSessionSearchToolDefinition(\n\tsession: ReadonlySession,\n): ToolDefinition<typeof sessionSearchSchema, SessionSearchToolDetails> {\n\treturn {\n\t\tname: \"session_search\",\n\t\tlabel: \"session_search\",\n\t\tdescription:\n\t\t\t\"Search finalized entries in the active session using a JavaScript regular expression by default, with grep-like case, fixed-string, context, result-limit, and scope options. Searches entries in the current model context by default; use scope: branch for older current-branch history or scope: all for archived branches. Hidden extension state and context-excluded bash output are not searched. Input and output are bounded.\",\n\t\tpromptSnippet: \"Search finalized entries in the active session history with a regular expression\",\n\t\tpromptGuidelines: [\n\t\t\t\"Default searches cover current model context. Use scope: branch or scope: all to recover history omitted by compaction; use session_entry_get with a returned entry ID when the exact model-visible entry is needed.\",\n\t\t],\n\t\tparameters: sessionSearchSchema,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(\n\t\t\ttoolCallId,\n\t\t\t{\n\t\t\t\tpattern,\n\t\t\t\tignoreCase = false,\n\t\t\t\tfixedStrings = false,\n\t\t\t\tbeforeContext = 0,\n\t\t\t\tafterContext = 0,\n\t\t\t\tmaxResults = DEFAULT_SEARCH_RESULTS,\n\t\t\t\tscope = \"context\",\n\t\t\t}: SessionSearchToolInput,\n\t\t\tsignal,\n\t\t) {\n\t\t\tabortIf(signal);\n\t\t\tconst entries =\n\t\t\t\tscope === \"all\"\n\t\t\t\t\t? session.getEntries()\n\t\t\t\t\t: scope === \"branch\"\n\t\t\t\t\t\t? session.getBranch()\n\t\t\t\t\t\t: getContextSearchEntries(session.getBranch());\n\t\t\tconst corpus = buildSearchCorpus(entries, toolCallId, signal);\n\t\t\tconst lines = corpus.lines.map(({ document, lineIndex }) => document.lines[lineIndex]);\n\t\t\tconst matchIndexes = fixedStrings\n\t\t\t\t? findFixedStringMatchIndexes(lines, pattern, ignoreCase)\n\t\t\t\t: await findRegexMatchIndexes(lines, pattern, ignoreCase, signal);\n\t\t\tabortIf(signal);\n\t\t\tconst matches = collectMatches(corpus, matchIndexes.slice(0, maxResults), beforeContext, afterContext);\n\t\t\tconst output = truncateToolOutput(formatMatches(matches, matchIndexes.length, maxResults, corpus.truncated));\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: output.text }],\n\t\t\t\tdetails: {\n\t\t\t\t\tpattern,\n\t\t\t\t\tignoreCase,\n\t\t\t\t\tfixedStrings,\n\t\t\t\t\tscope,\n\t\t\t\t\tmatchCount: matchIndexes.length,\n\t\t\t\t\treturnedMatchCount: matches.length,\n\t\t\t\t\tmatches: matches.map(({ contextBefore: _before, contextAfter: _after, ...match }) => ({\n\t\t\t\t\t\t...match,\n\t\t\t\t\t\tline: displayLine(match.line),\n\t\t\t\t\t})),\n\t\t\t\t\tscannedEntries: corpus.scannedEntries,\n\t\t\t\t\tscannedLines: corpus.lines.length,\n\t\t\t\t\tscannedBytes: corpus.scannedBytes,\n\t\t\t\t\tscanTruncated: corpus.truncated,\n\t\t\t\t\toutputTruncated: output.truncated,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSessionEntryGetToolDefinition(\n\tsession: ReadonlySession,\n): ToolDefinition<typeof sessionEntryGetSchema, SessionEntryGetToolDetails> {\n\treturn {\n\t\tname: \"session_entry_get\",\n\t\tlabel: \"session_entry_get\",\n\t\tdescription:\n\t\t\t\"Fetch one exact model-visible entry by ID from the active session, including entries outside the current branch. Extension-private metadata, hidden custom entries, context-excluded bash output, and base64 image payloads are not exposed. Returns the complete JSON projection unless safety or tool-output limits require truncation.\",\n\t\tpromptSnippet: \"Fetch an exact model-visible entry by ID from the active session\",\n\t\tparameters: sessionEntryGetSchema,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, { entryId }: SessionEntryGetToolInput, signal) {\n\t\t\tabortIf(signal);\n\t\t\tconst entry = session.getEntry(entryId);\n\t\t\tif (!entry) throw new Error(`Session entry not found: ${entryId}`);\n\t\t\tconst visibleEntry = projectEntryForModel(entry);\n\t\t\tif (!visibleEntry) throw new Error(`Session entry is private or context-excluded: ${entryId}`);\n\t\t\tconst sanitizedEntry = sanitizeImageData(visibleEntry);\n\t\t\tif (estimateSerializedBytes(sanitizedEntry, MAX_ENTRY_SERIALIZATION_BYTES) > MAX_ENTRY_SERIALIZATION_BYTES) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Session entry exceeds the ${MAX_ENTRY_SERIALIZATION_BYTES}-byte serialization safety limit: ${entryId}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst onCurrentBranch = session.getBranch().some((candidate) => candidate.id === entryId);\n\t\t\tconst output = truncateToolOutput(`Session entry ${entryId}:\\n${JSON.stringify(sanitizedEntry)}`);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: output.text }],\n\t\t\t\tdetails: {\n\t\t\t\t\tentryId,\n\t\t\t\t\tentryType: entry.type,\n\t\t\t\t\tonCurrentBranch,\n\t\t\t\t\toutputTruncated: output.truncated,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSessionSearchTool(session: ReadonlySession): AgentTool<typeof sessionSearchSchema> {\n\treturn wrapToolDefinition(createSessionSearchToolDefinition(session));\n}\n\nexport function createSessionEntryGetTool(session: ReadonlySession): AgentTool<typeof sessionEntryGetSchema> {\n\treturn wrapToolDefinition(createSessionEntryGetToolDefinition(session));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-agents.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent-agents.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AACrD,KAAK,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAAC;AAC5C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAkHD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,oBAAoB,CAanF;AAoDD,wBAAsB,4BAA4B,CACjD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,UAAU,EACjB,UAAU,CAAC,EAAE,cAAc,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAuB/B;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAO9F","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../config.ts\";\nimport { parseFrontmatter } from \"../../utils/frontmatter.ts\";\nimport {\n\tdirnamePortablePath,\n\tjoinPortablePath,\n\ttype PortablePathFlavor,\n\tpathComparisonValue,\n} from \"../lsp/portable-path.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\n\nexport type AgentScope = \"user\" | \"project\" | \"both\";\ntype AgentConfigSource = \"user\" | \"project\";\nexport type AgentSource = \"bundled\" | AgentConfigSource | \"session\";\n\nexport interface AgentConfig {\n\tname: string;\n\tdescription: string;\n\ttools?: string[];\n\tmodel?: string;\n\tmodelHint?: string;\n\tskills?: string[];\n\tcwd?: string;\n\tsystemPrompt: string;\n\tsource: AgentSource;\n\tfilePath: string;\n}\n\nexport interface AgentDiscoveryResult {\n\tagents: AgentConfig[];\n\tprojectAgentsDir: string | null;\n}\n\nconst BUNDLED_AGENTS: AgentConfig[] = [\n\t{\n\t\tname: \"explore\",\n\t\tdescription: \"Fast codebase exploration that returns compressed context for handoff to other agents\",\n\t\ttools: [\"read\", \"grep\", \"find\", \"ls\", \"bash\"],\n\t\tsystemPrompt: `You are an explorer. Quickly investigate a codebase and return structured findings that another agent can use without re-reading everything.\n\nYour output will be passed to an agent who has NOT seen the files you explored.\n\nThoroughness (infer from task, default medium):\n- Quick: Targeted lookups, key files only\n- Medium: Follow imports, read critical sections\n- Thorough: Trace all dependencies, check tests/types\n\nStrategy:\n1. grep/find to locate relevant code\n2. Read key sections\n3. Identify types, interfaces, and key functions\n4. Note dependencies between files\n\nReturn files and exact line ranges, key code, architecture, and the best file to inspect first.`,\n\t\tsource: \"bundled\",\n\t\tfilePath: \"<builtin:subagent/explore>\",\n\t},\n\t{\n\t\tname: \"worker\",\n\t\tdescription: \"General-purpose subagent with full capabilities and isolated context\",\n\t\tsystemPrompt: `You are a worker agent with full capabilities. Work autonomously to complete the delegated task.\n\nWhen finished, report what was completed, files changed, and anything the parent agent should know.`,\n\t\tsource: \"bundled\",\n\t\tfilePath: \"<builtin:subagent/worker>\",\n\t},\n\t{\n\t\tname: \"reviewer\",\n\t\tdescription: \"Code review specialist for quality and security analysis\",\n\t\ttools: [\"read\", \"grep\", \"find\", \"ls\", \"bash\"],\n\t\tsystemPrompt: `You are a senior code reviewer. Analyze code for correctness, security, quality, and maintainability.\n\nUse bash only for read-only commands. Do not modify files or run builds.\n\nReport files reviewed, critical issues, warnings, suggestions, and a concise summary. Include exact file paths and line numbers.`,\n\t\tsource: \"bundled\",\n\t\tfilePath: \"<builtin:subagent/reviewer>\",\n\t},\n];\n\nfunction parseAgentConfig(content: string, filePath: string, source: AgentConfigSource): AgentConfig | undefined {\n\tconst { frontmatter, body } = parseFrontmatter<Record<string, string>>(content);\n\tif (!frontmatter.name || !frontmatter.description) return undefined;\n\tconst tools = frontmatter.tools\n\t\t?.split(\",\")\n\t\t.map((tool) => tool.trim())\n\t\t.filter(Boolean);\n\tconst skills = frontmatter.skills\n\t\t?.split(\",\")\n\t\t.map((skill) => skill.trim())\n\t\t.filter(Boolean);\n\treturn {\n\t\tname: frontmatter.name,\n\t\tdescription: frontmatter.description,\n\t\ttools: tools && tools.length > 0 ? tools : undefined,\n\t\tmodel: frontmatter.model,\n\t\tmodelHint: frontmatter.modelHint,\n\t\tskills: skills && skills.length > 0 ? skills : undefined,\n\t\tcwd: frontmatter.cwd,\n\t\tsystemPrompt: body,\n\t\tsource,\n\t\tfilePath,\n\t};\n}\n\nfunction loadAgentsFromDir(dir: string, source: AgentConfigSource): AgentConfig[] {\n\tconst agents: AgentConfig[] = [];\n\tif (!fs.existsSync(dir)) return agents;\n\n\tlet entries: fs.Dirent[];\n\ttry {\n\t\tentries = fs.readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn agents;\n\t}\n\n\tfor (const entry of entries) {\n\t\tif (!entry.name.endsWith(\".md\") || (!entry.isFile() && !entry.isSymbolicLink())) continue;\n\t\tconst filePath = path.join(dir, entry.name);\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = fs.readFileSync(filePath, \"utf-8\");\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst agent = parseAgentConfig(content, filePath, source);\n\t\tif (agent) agents.push(agent);\n\t}\n\treturn agents;\n}\n\nfunction findNearestProjectAgentsDir(cwd: string): string | null {\n\tlet currentDir = cwd;\n\twhile (true) {\n\t\tconst candidate = path.join(currentDir, CONFIG_DIR_NAME, \"agents\");\n\t\ttry {\n\t\t\tif (fs.statSync(candidate).isDirectory()) return candidate;\n\t\t} catch {}\n\t\tconst parentDir = path.dirname(currentDir);\n\t\tif (parentDir === currentDir) return null;\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport function discoverAgents(cwd: string, scope: AgentScope): AgentDiscoveryResult {\n\tconst userDir = path.join(getAgentDir(), \"agents\");\n\tconst projectAgentsDir = findNearestProjectAgentsDir(cwd);\n\tconst bundledAgents = scope === \"project\" ? [] : BUNDLED_AGENTS;\n\tconst userAgents = scope === \"project\" ? [] : loadAgentsFromDir(userDir, \"user\");\n\tconst projectAgents = scope === \"user\" || !projectAgentsDir ? [] : loadAgentsFromDir(projectAgentsDir, \"project\");\n\tconst agentMap = new Map<string, AgentConfig>();\n\n\tfor (const agent of bundledAgents) agentMap.set(agent.name, agent);\n\tfor (const agent of userAgents) agentMap.set(agent.name, agent);\n\tfor (const agent of projectAgents) agentMap.set(agent.name, agent);\n\n\treturn { agents: Array.from(agentMap.values()), projectAgentsDir };\n}\n\nasync function loadAgentsFromDirWithOperations(dir: string, operations: ToolOperations): Promise<AgentConfig[]> {\n\tconst agents: AgentConfig[] = [];\n\tlet entries: string[];\n\ttry {\n\t\tentries = await operations.readdir(dir);\n\t} catch {\n\t\treturn agents;\n\t}\n\tfor (const name of entries.sort()) {\n\t\tif (!name.endsWith(\".md\")) continue;\n\t\tconst filePath = joinPortablePath(dir, name);\n\t\ttry {\n\t\t\tconst stat = await operations.stat(filePath);\n\t\t\tif (!stat.isFile()) continue;\n\t\t\tconst agent = parseAgentConfig((await operations.readFile(filePath)).toString(\"utf8\"), filePath, \"project\");\n\t\t\tif (agent) agents.push(agent);\n\t\t} catch {}\n\t}\n\treturn agents;\n}\n\nasync function findNearestProjectAgentsDirWithOperations(\n\tcwd: string,\n\toperations: ToolOperations,\n\troot: string,\n\tpathFlavor: PortablePathFlavor,\n): Promise<string | null> {\n\tlet currentDir = cwd;\n\twhile (true) {\n\t\tconst candidate = joinPortablePath(currentDir, CONFIG_DIR_NAME, \"agents\");\n\t\ttry {\n\t\t\tif ((await operations.stat(candidate)).isDirectory()) return candidate;\n\t\t} catch {}\n\t\tif (pathComparisonValue(currentDir, pathFlavor) === pathComparisonValue(root, pathFlavor)) return null;\n\t\tconst parentDir = dirnamePortablePath(currentDir, pathFlavor);\n\t\tif (parentDir === currentDir) return null;\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nfunction discoverHostOwnedAgents(scope: AgentScope): AgentDiscoveryResult {\n\treturn {\n\t\tagents:\n\t\t\tscope === \"project\"\n\t\t\t\t? []\n\t\t\t\t: [...BUNDLED_AGENTS, ...loadAgentsFromDir(path.join(getAgentDir(), \"agents\"), \"user\")],\n\t\tprojectAgentsDir: null,\n\t};\n}\n\nexport async function discoverAgentsWithOperations(\n\tcwd: string,\n\tscope: AgentScope,\n\toperations?: ToolOperations,\n): Promise<AgentDiscoveryResult> {\n\tif (!operations) return discoverAgents(cwd, scope);\n\tconst backend = operations.getBackendInfo?.();\n\tif (backend?.type === \"local\") return discoverAgents(cwd, scope);\n\tif (!backend) return discoverHostOwnedAgents(scope);\n\tif (backend.type === \"remote\" && !backend.configured) {\n\t\treturn discoverHostOwnedAgents(scope);\n\t}\n\tconst remoteCwd = backend.workspace.root;\n\tconst pathFlavor = backend.workspace.pathFlavor;\n\tconst userDir = path.join(getAgentDir(), \"agents\");\n\tconst projectAgentsDir =\n\t\tscope === \"user\"\n\t\t\t? null\n\t\t\t: await findNearestProjectAgentsDirWithOperations(remoteCwd, operations, backend.workspace.root, pathFlavor);\n\tconst bundledAgents = scope === \"project\" ? [] : BUNDLED_AGENTS;\n\tconst userAgents = scope === \"project\" ? [] : loadAgentsFromDir(userDir, \"user\");\n\tconst projectAgents = projectAgentsDir ? await loadAgentsFromDirWithOperations(projectAgentsDir, operations) : [];\n\tconst agentMap = new Map<string, AgentConfig>();\n\tfor (const agent of bundledAgents) agentMap.set(agent.name, agent);\n\tfor (const agent of userAgents) agentMap.set(agent.name, agent);\n\tfor (const agent of projectAgents) agentMap.set(agent.name, agent);\n\treturn { agents: Array.from(agentMap.values()), projectAgentsDir };\n}\n\nexport interface AgentListFormatResult {\n\ttext: string;\n\tremaining: number;\n}\n\nexport function formatAgentList(agents: AgentConfig[], maxItems: number): AgentListFormatResult {\n\tif (agents.length === 0) return { text: \"none\", remaining: 0 };\n\tconst listed = agents.slice(0, maxItems);\n\treturn {\n\t\ttext: listed.map((agent) => `${agent.name} (${agent.source}): ${agent.description}`).join(\"; \"),\n\t\tremaining: agents.length - listed.length,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"subagent-agents.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent-agents.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AACrD,KAAK,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAAC;AAC5C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAkHD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,oBAAoB,CAanF;AAoDD,wBAAsB,4BAA4B,CACjD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,UAAU,EACjB,UAAU,CAAC,EAAE,cAAc,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAuB/B;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAO9F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-agents.js","sourceRoot":"","sources":["../../../src/core/tools/subagent-agents.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../config.ts\";\nimport { parseFrontmatter } from \"../../utils/frontmatter.ts\";\nimport {\n\tdirnamePortablePath,\n\tjoinPortablePath,\n\ttype PortablePathFlavor,\n\tpathComparisonValue,\n} from \"../lsp/portable-path.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\n\nexport type AgentScope = \"user\" | \"project\" | \"both\";\ntype AgentConfigSource = \"user\" | \"project\";\nexport type AgentSource = \"bundled\" | AgentConfigSource | \"session\";\n\nexport interface AgentConfig {\n\tname: string;\n\tdescription: string;\n\ttools?: string[];\n\tmodel?: string;\n\tmodelHint?: string;\n\tskills?: string[];\n\tcwd?: string;\n\tsystemPrompt: string;\n\tsource: AgentSource;\n\tfilePath: string;\n}\n\nexport interface AgentDiscoveryResult {\n\tagents: AgentConfig[];\n\tprojectAgentsDir: string | null;\n}\n\nconst BUNDLED_AGENTS: AgentConfig[] = [\n\t{\n\t\tname: \"explore\",\n\t\tdescription: \"Fast codebase exploration that returns compressed context for handoff to other agents\",\n\t\ttools: [\"read\", \"grep\", \"find\", \"ls\", \"bash\"],\n\t\tsystemPrompt: `You are an explorer. Quickly investigate a codebase and return structured findings that another agent can use without re-reading everything.\n\nYour output will be passed to an agent who has NOT seen the files you explored.\n\nThoroughness (infer from task, default medium):\n- Quick: Targeted lookups, key files only\n- Medium: Follow imports, read critical sections\n- Thorough: Trace all dependencies, check tests/types\n\nStrategy:\n1. grep/find to locate relevant code\n2. Read key sections\n3. Identify types, interfaces, and key functions\n4. Note dependencies between files\n\nReturn files and exact line ranges, key code, architecture, and the best file to inspect first.`,\n\t\tsource: \"bundled\",\n\t\tfilePath: \"<builtin:subagent/explore>\",\n\t},\n\t{\n\t\tname: \"worker\",\n\t\tdescription: \"General-purpose subagent with full capabilities and isolated context\",\n\t\tsystemPrompt: `You are a worker agent with full capabilities. Work autonomously to complete the delegated task.\n\nWhen finished, report what was completed, files changed, and anything the parent agent should know.`,\n\t\tsource: \"bundled\",\n\t\tfilePath: \"<builtin:subagent/worker>\",\n\t},\n\t{\n\t\tname: \"reviewer\",\n\t\tdescription: \"Code review specialist for quality and security analysis\",\n\t\ttools: [\"read\", \"grep\", \"find\", \"ls\", \"bash\"],\n\t\tsystemPrompt: `You are a senior code reviewer. Analyze code for correctness, security, quality, and maintainability.\n\nUse bash only for read-only commands. Do not modify files or run builds.\n\nReport files reviewed, critical issues, warnings, suggestions, and a concise summary. Include exact file paths and line numbers.`,\n\t\tsource: \"bundled\",\n\t\tfilePath: \"<builtin:subagent/reviewer>\",\n\t},\n];\n\nfunction parseAgentConfig(content: string, filePath: string, source: AgentConfigSource): AgentConfig | undefined {\n\tconst { frontmatter, body } = parseFrontmatter<Record<string, string>>(content);\n\tif (!frontmatter.name || !frontmatter.description) return undefined;\n\tconst tools = frontmatter.tools\n\t\t?.split(\",\")\n\t\t.map((tool) => tool.trim())\n\t\t.filter(Boolean);\n\tconst skills = frontmatter.skills\n\t\t?.split(\",\")\n\t\t.map((skill) => skill.trim())\n\t\t.filter(Boolean);\n\treturn {\n\t\tname: frontmatter.name,\n\t\tdescription: frontmatter.description,\n\t\ttools: tools && tools.length > 0 ? tools : undefined,\n\t\tmodel: frontmatter.model,\n\t\tmodelHint: frontmatter.modelHint,\n\t\tskills: skills && skills.length > 0 ? skills : undefined,\n\t\tcwd: frontmatter.cwd,\n\t\tsystemPrompt: body,\n\t\tsource,\n\t\tfilePath,\n\t};\n}\n\nfunction loadAgentsFromDir(dir: string, source: AgentConfigSource): AgentConfig[] {\n\tconst agents: AgentConfig[] = [];\n\tif (!fs.existsSync(dir)) return agents;\n\n\tlet entries: fs.Dirent[];\n\ttry {\n\t\tentries = fs.readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn agents;\n\t}\n\n\tfor (const entry of entries) {\n\t\tif (!entry.name.endsWith(\".md\") || (!entry.isFile() && !entry.isSymbolicLink())) continue;\n\t\tconst filePath = path.join(dir, entry.name);\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = fs.readFileSync(filePath, \"utf-8\");\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst agent = parseAgentConfig(content, filePath, source);\n\t\tif (agent) agents.push(agent);\n\t}\n\treturn agents;\n}\n\nfunction findNearestProjectAgentsDir(cwd: string): string | null {\n\tlet currentDir = cwd;\n\twhile (true) {\n\t\tconst candidate = path.join(currentDir, CONFIG_DIR_NAME, \"agents\");\n\t\ttry {\n\t\t\tif (fs.statSync(candidate).isDirectory()) return candidate;\n\t\t} catch {}\n\t\tconst parentDir = path.dirname(currentDir);\n\t\tif (parentDir === currentDir) return null;\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport function discoverAgents(cwd: string, scope: AgentScope): AgentDiscoveryResult {\n\tconst userDir = path.join(getAgentDir(), \"agents\");\n\tconst projectAgentsDir = findNearestProjectAgentsDir(cwd);\n\tconst bundledAgents = scope === \"project\" ? [] : BUNDLED_AGENTS;\n\tconst userAgents = scope === \"project\" ? [] : loadAgentsFromDir(userDir, \"user\");\n\tconst projectAgents = scope === \"user\" || !projectAgentsDir ? [] : loadAgentsFromDir(projectAgentsDir, \"project\");\n\tconst agentMap = new Map<string, AgentConfig>();\n\n\tfor (const agent of bundledAgents) agentMap.set(agent.name, agent);\n\tfor (const agent of userAgents) agentMap.set(agent.name, agent);\n\tfor (const agent of projectAgents) agentMap.set(agent.name, agent);\n\n\treturn { agents: Array.from(agentMap.values()), projectAgentsDir };\n}\n\nasync function loadAgentsFromDirWithOperations(dir: string, operations: ToolOperations): Promise<AgentConfig[]> {\n\tconst agents: AgentConfig[] = [];\n\tlet entries: string[];\n\ttry {\n\t\tentries = await operations.readdir(dir);\n\t} catch {\n\t\treturn agents;\n\t}\n\tfor (const name of entries.sort()) {\n\t\tif (!name.endsWith(\".md\")) continue;\n\t\tconst filePath = joinPortablePath(dir, name);\n\t\ttry {\n\t\t\tconst stat = await operations.stat(filePath);\n\t\t\tif (!stat.isFile()) continue;\n\t\t\tconst agent = parseAgentConfig((await operations.readFile(filePath)).toString(\"utf8\"), filePath, \"project\");\n\t\t\tif (agent) agents.push(agent);\n\t\t} catch {}\n\t}\n\treturn agents;\n}\n\nasync function findNearestProjectAgentsDirWithOperations(\n\tcwd: string,\n\toperations: ToolOperations,\n\troot: string,\n\tpathFlavor: PortablePathFlavor,\n): Promise<string | null> {\n\tlet currentDir = cwd;\n\twhile (true) {\n\t\tconst candidate = joinPortablePath(currentDir, CONFIG_DIR_NAME, \"agents\");\n\t\ttry {\n\t\t\tif ((await operations.stat(candidate)).isDirectory()) return candidate;\n\t\t} catch {}\n\t\tif (pathComparisonValue(currentDir, pathFlavor) === pathComparisonValue(root, pathFlavor)) return null;\n\t\tconst parentDir = dirnamePortablePath(currentDir, pathFlavor);\n\t\tif (parentDir === currentDir) return null;\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nfunction discoverHostOwnedAgents(scope: AgentScope): AgentDiscoveryResult {\n\treturn {\n\t\tagents:\n\t\t\tscope === \"project\"\n\t\t\t\t? []\n\t\t\t\t: [...BUNDLED_AGENTS, ...loadAgentsFromDir(path.join(getAgentDir(), \"agents\"), \"user\")],\n\t\tprojectAgentsDir: null,\n\t};\n}\n\nexport async function discoverAgentsWithOperations(\n\tcwd: string,\n\tscope: AgentScope,\n\toperations?: ToolOperations,\n): Promise<AgentDiscoveryResult> {\n\tif (!operations) return discoverAgents(cwd, scope);\n\tconst backend = operations.getBackendInfo?.();\n\tif (backend?.type === \"local\") return discoverAgents(cwd, scope);\n\tif (!backend) return discoverHostOwnedAgents(scope);\n\tif (backend.type === \"remote\" && !backend.configured) {\n\t\treturn discoverHostOwnedAgents(scope);\n\t}\n\tconst remoteCwd = backend.workspace.root;\n\tconst pathFlavor = backend.workspace.pathFlavor;\n\tconst userDir = path.join(getAgentDir(), \"agents\");\n\tconst projectAgentsDir =\n\t\tscope === \"user\"\n\t\t\t? null\n\t\t\t: await findNearestProjectAgentsDirWithOperations(remoteCwd, operations, backend.workspace.root, pathFlavor);\n\tconst bundledAgents = scope === \"project\" ? [] : BUNDLED_AGENTS;\n\tconst userAgents = scope === \"project\" ? [] : loadAgentsFromDir(userDir, \"user\");\n\tconst projectAgents = projectAgentsDir ? await loadAgentsFromDirWithOperations(projectAgentsDir, operations) : [];\n\tconst agentMap = new Map<string, AgentConfig>();\n\tfor (const agent of bundledAgents) agentMap.set(agent.name, agent);\n\tfor (const agent of userAgents) agentMap.set(agent.name, agent);\n\tfor (const agent of projectAgents) agentMap.set(agent.name, agent);\n\treturn { agents: Array.from(agentMap.values()), projectAgentsDir };\n}\n\nexport interface AgentListFormatResult {\n\ttext: string;\n\tremaining: number;\n}\n\nexport function formatAgentList(agents: AgentConfig[], maxItems: number): AgentListFormatResult {\n\tif (agents.length === 0) return { text: \"none\", remaining: 0 };\n\tconst listed = agents.slice(0, maxItems);\n\treturn {\n\t\ttext: listed.map((agent) => `${agent.name} (${agent.source}): ${agent.description}`).join(\"; \"),\n\t\tremaining: agents.length - listed.length,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"subagent-agents.js","sourceRoot":"","sources":["../../../src/core/tools/subagent-agents.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../config.ts\";\nimport { parseFrontmatter } from \"../../utils/frontmatter.ts\";\nimport {\n\tdirnamePortablePath,\n\tjoinPortablePath,\n\ttype PortablePathFlavor,\n\tpathComparisonValue,\n} from \"../lsp/portable-path.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\n\nexport type AgentScope = \"user\" | \"project\" | \"both\";\ntype AgentConfigSource = \"user\" | \"project\";\nexport type AgentSource = \"bundled\" | AgentConfigSource | \"session\";\n\nexport interface AgentConfig {\n\tname: string;\n\tdescription: string;\n\ttools?: string[];\n\tmodel?: string;\n\tmodelHint?: string;\n\tskills?: string[];\n\tcwd?: string;\n\tsystemPrompt: string;\n\tsource: AgentSource;\n\tfilePath: string;\n}\n\nexport interface AgentDiscoveryResult {\n\tagents: AgentConfig[];\n\tprojectAgentsDir: string | null;\n}\n\nconst BUNDLED_AGENTS: AgentConfig[] = [\n\t{\n\t\tname: \"explore\",\n\t\tdescription: \"Fast codebase exploration that returns compressed context for handoff to other agents\",\n\t\ttools: [\"read\", \"grep\", \"find\", \"ls\", \"bash\"],\n\t\tsystemPrompt: `You are an explorer. Quickly investigate a codebase and return structured findings that another agent can use without re-reading everything.\n\nYour output will be passed to an agent who has NOT seen the files you explored.\n\nThoroughness (infer from task, default medium):\n- Quick: Targeted lookups, key files only\n- Medium: Follow imports, read critical sections\n- Thorough: Trace all dependencies, check tests/types\n\nStrategy:\n1. grep/find to locate relevant code\n2. Read key sections\n3. Identify types, interfaces, and key functions\n4. Note dependencies between files\n\nReturn files and exact line ranges, key code, architecture, and the best file to inspect first.`,\n\t\tsource: \"bundled\",\n\t\tfilePath: \"<builtin:subagent/explore>\",\n\t},\n\t{\n\t\tname: \"worker\",\n\t\tdescription: \"General-purpose subagent with full capabilities and isolated context\",\n\t\tsystemPrompt: `You are a worker agent with full capabilities. Work autonomously to complete the delegated task.\n\nWhen finished, report what was completed, files changed, and anything the parent agent should know.`,\n\t\tsource: \"bundled\",\n\t\tfilePath: \"<builtin:subagent/worker>\",\n\t},\n\t{\n\t\tname: \"reviewer\",\n\t\tdescription: \"Code review specialist for quality and security analysis\",\n\t\ttools: [\"read\", \"grep\", \"find\", \"ls\", \"bash\"],\n\t\tsystemPrompt: `You are a senior code reviewer. Analyze code for correctness, security, quality, and maintainability.\n\nUse bash only for read-only commands. Do not modify files or run builds.\n\nReport files reviewed, critical issues, warnings, suggestions, and a concise summary. Include exact file paths and line numbers.`,\n\t\tsource: \"bundled\",\n\t\tfilePath: \"<builtin:subagent/reviewer>\",\n\t},\n];\n\nfunction parseAgentConfig(content: string, filePath: string, source: AgentConfigSource): AgentConfig | undefined {\n\tconst { frontmatter, body } = parseFrontmatter<Record<string, string>>(content);\n\tif (!frontmatter.name || !frontmatter.description) return undefined;\n\tconst tools = frontmatter.tools\n\t\t?.split(\",\")\n\t\t.map((tool) => tool.trim())\n\t\t.filter(Boolean);\n\tconst skills = frontmatter.skills\n\t\t?.split(\",\")\n\t\t.map((skill) => skill.trim())\n\t\t.filter(Boolean);\n\treturn {\n\t\tname: frontmatter.name,\n\t\tdescription: frontmatter.description,\n\t\ttools: tools && tools.length > 0 ? tools : undefined,\n\t\tmodel: frontmatter.model,\n\t\tmodelHint: frontmatter.modelHint,\n\t\tskills: skills && skills.length > 0 ? skills : undefined,\n\t\tcwd: frontmatter.cwd,\n\t\tsystemPrompt: body,\n\t\tsource,\n\t\tfilePath,\n\t};\n}\n\nfunction loadAgentsFromDir(dir: string, source: AgentConfigSource): AgentConfig[] {\n\tconst agents: AgentConfig[] = [];\n\tif (!fs.existsSync(dir)) return agents;\n\n\tlet entries: fs.Dirent[];\n\ttry {\n\t\tentries = fs.readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn agents;\n\t}\n\n\tfor (const entry of entries) {\n\t\tif (!entry.name.endsWith(\".md\") || (!entry.isFile() && !entry.isSymbolicLink())) continue;\n\t\tconst filePath = path.join(dir, entry.name);\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = fs.readFileSync(filePath, \"utf-8\");\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst agent = parseAgentConfig(content, filePath, source);\n\t\tif (agent) agents.push(agent);\n\t}\n\treturn agents;\n}\n\nfunction findNearestProjectAgentsDir(cwd: string): string | null {\n\tlet currentDir = cwd;\n\twhile (true) {\n\t\tconst candidate = path.join(currentDir, CONFIG_DIR_NAME, \"agents\");\n\t\ttry {\n\t\t\tif (fs.statSync(candidate).isDirectory()) return candidate;\n\t\t} catch {}\n\t\tconst parentDir = path.dirname(currentDir);\n\t\tif (parentDir === currentDir) return null;\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport function discoverAgents(cwd: string, scope: AgentScope): AgentDiscoveryResult {\n\tconst userDir = path.join(getAgentDir(), \"agents\");\n\tconst projectAgentsDir = findNearestProjectAgentsDir(cwd);\n\tconst bundledAgents = scope === \"project\" ? [] : BUNDLED_AGENTS;\n\tconst userAgents = scope === \"project\" ? [] : loadAgentsFromDir(userDir, \"user\");\n\tconst projectAgents = scope === \"user\" || !projectAgentsDir ? [] : loadAgentsFromDir(projectAgentsDir, \"project\");\n\tconst agentMap = new Map<string, AgentConfig>();\n\n\tfor (const agent of bundledAgents) agentMap.set(agent.name, agent);\n\tfor (const agent of userAgents) agentMap.set(agent.name, agent);\n\tfor (const agent of projectAgents) agentMap.set(agent.name, agent);\n\n\treturn { agents: Array.from(agentMap.values()), projectAgentsDir };\n}\n\nasync function loadAgentsFromDirWithOperations(dir: string, operations: ToolOperations): Promise<AgentConfig[]> {\n\tconst agents: AgentConfig[] = [];\n\tlet entries: string[];\n\ttry {\n\t\tentries = await operations.readdir(dir);\n\t} catch {\n\t\treturn agents;\n\t}\n\tfor (const name of entries.sort()) {\n\t\tif (!name.endsWith(\".md\")) continue;\n\t\tconst filePath = joinPortablePath(dir, name);\n\t\ttry {\n\t\t\tconst stat = await operations.stat(filePath);\n\t\t\tif (!stat.isFile()) continue;\n\t\t\tconst agent = parseAgentConfig((await operations.readFile(filePath)).toString(\"utf8\"), filePath, \"project\");\n\t\t\tif (agent) agents.push(agent);\n\t\t} catch {}\n\t}\n\treturn agents;\n}\n\nasync function findNearestProjectAgentsDirWithOperations(\n\tcwd: string,\n\toperations: ToolOperations,\n\troot: string,\n\tpathFlavor: PortablePathFlavor,\n): Promise<string | null> {\n\tlet currentDir = cwd;\n\twhile (true) {\n\t\tconst candidate = joinPortablePath(currentDir, CONFIG_DIR_NAME, \"agents\");\n\t\ttry {\n\t\t\tif ((await operations.stat(candidate)).isDirectory()) return candidate;\n\t\t} catch {}\n\t\tif (pathComparisonValue(currentDir, pathFlavor) === pathComparisonValue(root, pathFlavor)) return null;\n\t\tconst parentDir = dirnamePortablePath(currentDir, pathFlavor);\n\t\tif (parentDir === currentDir) return null;\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nfunction discoverHostOwnedAgents(scope: AgentScope): AgentDiscoveryResult {\n\treturn {\n\t\tagents:\n\t\t\tscope === \"project\"\n\t\t\t\t? []\n\t\t\t\t: [...BUNDLED_AGENTS, ...loadAgentsFromDir(path.join(getAgentDir(), \"agents\"), \"user\")],\n\t\tprojectAgentsDir: null,\n\t};\n}\n\nexport async function discoverAgentsWithOperations(\n\tcwd: string,\n\tscope: AgentScope,\n\toperations?: ToolOperations,\n): Promise<AgentDiscoveryResult> {\n\tif (!operations) return discoverAgents(cwd, scope);\n\tconst backend = operations.getBackendInfo?.();\n\tif (backend?.type === \"local\") return discoverAgents(cwd, scope);\n\tif (!backend) return discoverHostOwnedAgents(scope);\n\tif (backend.type === \"remote\" && !backend.configured) {\n\t\treturn discoverHostOwnedAgents(scope);\n\t}\n\tconst remoteCwd = backend.workspace.root;\n\tconst pathFlavor = backend.workspace.pathFlavor;\n\tconst userDir = path.join(getAgentDir(), \"agents\");\n\tconst projectAgentsDir =\n\t\tscope === \"user\"\n\t\t\t? null\n\t\t\t: await findNearestProjectAgentsDirWithOperations(remoteCwd, operations, backend.workspace.root, pathFlavor);\n\tconst bundledAgents = scope === \"project\" ? [] : BUNDLED_AGENTS;\n\tconst userAgents = scope === \"project\" ? [] : loadAgentsFromDir(userDir, \"user\");\n\tconst projectAgents = projectAgentsDir ? await loadAgentsFromDirWithOperations(projectAgentsDir, operations) : [];\n\tconst agentMap = new Map<string, AgentConfig>();\n\tfor (const agent of bundledAgents) agentMap.set(agent.name, agent);\n\tfor (const agent of userAgents) agentMap.set(agent.name, agent);\n\tfor (const agent of projectAgents) agentMap.set(agent.name, agent);\n\treturn { agents: Array.from(agentMap.values()), projectAgentsDir };\n}\n\nexport interface AgentListFormatResult {\n\ttext: string;\n\tremaining: number;\n}\n\nexport function formatAgentList(agents: AgentConfig[], maxItems: number): AgentListFormatResult {\n\tif (agents.length === 0) return { text: \"none\", remaining: 0 };\n\tconst listed = agents.slice(0, maxItems);\n\treturn {\n\t\ttext: listed.map((agent) => `${agent.name} (${agent.source}): ${agent.description}`).join(\"; \"),\n\t\tremaining: agents.length - listed.length,\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Subagent Tool - Delegate tasks to specialized agents\n *\n * Runs each task in a fresh embedded AgentSession using an injected runner.\n *\n * Supports three modes:\n * - Single: { task: \"...\", responseFormat: \"...\", systemPrompt: \"...\" }\n * - Parallel: { tasks: [{ task: \"...\", model: \"...\" }, ...] }\n * - Chain: { chain: [{ task: \"... {previous} ...\" }, ...] }\n */\n\nimport * as os from \"node:os\";\nimport type { AgentTool, AgentToolResult } from \"@greppleai/grip-agent-core\";\nimport type { Api, AssistantMessage, Message, Model, TextContent } from \"@greppleai/grip-ai\";\nimport { StringEnum } from \"@greppleai/grip-ai\";\nimport { Container, Markdown, Spacer, Text } from \"@greppleai/grip-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { getMarkdownTheme, type Theme, type ThemeColor } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\nimport {\n\ttype AgentConfig,\n\ttype AgentScope,\n\ttype AgentSource,\n\tdiscoverAgentsWithOperations,\n} from \"./subagent-agents.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst GENERIC_SYSTEM_PROMPT =\n\t\"You are an isolated subagent. Complete the delegated task autonomously and return only the information requested by the parent agent.\";\nconst MAX_PARALLEL_TASKS = 8;\nconst MAX_CHAIN_STEPS = 16;\nconst MAX_CONCURRENCY = 4;\nconst COLLAPSED_ITEM_COUNT = 10;\nconst PER_TASK_OUTPUT_CAP = 50 * 1024;\nconst MAX_RETAINED_MESSAGE_CHARS = 64 * 1024;\nconst MAX_RETAINED_TASK_CHARS = 256 * 1024;\nconst MAX_RETAINED_TASK_MESSAGES = 100;\nconst MAX_RETAINED_TASK_DESCRIPTION_CHARS = 16 * 1024;\n\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\treturn `${(count / 1000000).toFixed(1)}M`;\n}\n\ntype SubagentUsageDisplayMetrics = Omit<SubagentUsageStats, \"contextTokens\" | \"turns\"> &\n\tPartial<Pick<SubagentUsageStats, \"contextTokens\" | \"turns\">>;\n\nfunction formatUsageStats(usage: SubagentUsageDisplayMetrics, model?: string): string {\n\tconst parts: string[] = [];\n\tif (usage.turns) parts.push(`${usage.turns} turn${usage.turns > 1 ? \"s\" : \"\"}`);\n\tif (usage.input) parts.push(`in:${formatTokens(usage.input)}`);\n\tif (usage.output) parts.push(`out:${formatTokens(usage.output)}`);\n\tif (usage.cacheRead) parts.push(`R${formatTokens(usage.cacheRead)}`);\n\tif (usage.cacheWrite) parts.push(`W${formatTokens(usage.cacheWrite)}`);\n\tif (usage.cost) parts.push(`$${usage.cost.toFixed(4)}`);\n\tif (usage.contextTokens && usage.contextTokens > 0) {\n\t\tparts.push(`ctx:${formatTokens(usage.contextTokens)}`);\n\t}\n\tif (model) parts.push(model);\n\treturn parts.join(\" \");\n}\n\nexport function formatSubagentModelCatalog(\n\tcurrentModel: Model<Api> | undefined,\n\tavailableModels: Model<Api>[],\n): string | undefined {\n\tif (!currentModel) return undefined;\n\tconst providerModels = availableModels.filter((model) => model.provider === currentModel.provider);\n\tif (providerModels.length === 0) return undefined;\n\n\tconst lines = [\n\t\t`Authenticated subagent models for the current ${currentModel.provider} provider:`,\n\t\t\"Omit model to inherit the current model.\",\n\t];\n\tfor (const model of providerModels) {\n\t\tconst capabilities = [\n\t\t\tmodel.reasoning ? \"reasoning\" : \"non-reasoning\",\n\t\t\t`context ${formatTokens(model.contextWindow)}`,\n\t\t\t`max output ${formatTokens(model.maxTokens)}`,\n\t\t\t`input $${model.cost.input}/M`,\n\t\t\t`output $${model.cost.output}/M`,\n\t\t];\n\t\tif (model.cost.cacheRead > 0) capabilities.push(`cache read $${model.cost.cacheRead}/M`);\n\t\tif (model.cost.cacheWrite > 0) capabilities.push(`cache write $${model.cost.cacheWrite}/M`);\n\t\tlines.push(`- ${model.provider}/${model.id}: ${capabilities.join(\", \")}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\ntype SubagentToolThemeForeground = (color: ThemeColor, text: string) => string;\n\nfunction shortenSubagentToolPath(filePath: string): string {\n\tconst home = os.homedir();\n\treturn filePath.startsWith(home) ? `~${filePath.slice(home.length)}` : filePath;\n}\n\nfunction formatBashToolCall(args: Record<string, unknown>, themeFg: SubagentToolThemeForeground): string {\n\tconst command = (args.command as string) || \"...\";\n\tconst preview = command.length > 60 ? `${command.slice(0, 60)}...` : command;\n\treturn themeFg(\"muted\", \"$ \") + themeFg(\"toolOutput\", preview);\n}\n\nfunction formatReadToolCall(args: Record<string, unknown>, themeFg: SubagentToolThemeForeground): string {\n\tconst rawPath = (args.file_path || args.path || \"...\") as string;\n\tconst filePath = shortenSubagentToolPath(rawPath);\n\tconst offset = args.offset as number | undefined;\n\tconst limit = args.limit as number | undefined;\n\tlet text = themeFg(\"accent\", filePath);\n\tif (offset !== undefined || limit !== undefined) {\n\t\tconst startLine = offset ?? 1;\n\t\tconst endLine = limit !== undefined ? startLine + limit - 1 : \"\";\n\t\ttext += themeFg(\"warning\", `:${startLine}${endLine ? `-${endLine}` : \"\"}`);\n\t}\n\treturn themeFg(\"muted\", \"read \") + text;\n}\n\nfunction formatWriteToolCall(args: Record<string, unknown>, themeFg: SubagentToolThemeForeground): string {\n\tconst rawPath = (args.file_path || args.path || \"...\") as string;\n\tconst filePath = shortenSubagentToolPath(rawPath);\n\tconst content = (args.content || \"\") as string;\n\tconst lines = content.split(\"\\n\").length;\n\tlet text = themeFg(\"muted\", \"write \") + themeFg(\"accent\", filePath);\n\tif (lines > 1) text += themeFg(\"dim\", ` (${lines} lines)`);\n\treturn text;\n}\n\nfunction formatToolCall(toolName: string, args: Record<string, unknown>, themeFg: SubagentToolThemeForeground): string {\n\tswitch (toolName) {\n\t\tcase \"bash\":\n\t\t\treturn formatBashToolCall(args, themeFg);\n\t\tcase \"read\":\n\t\t\treturn formatReadToolCall(args, themeFg);\n\t\tcase \"write\":\n\t\t\treturn formatWriteToolCall(args, themeFg);\n\t\tcase \"edit\": {\n\t\t\tconst rawPath = (args.file_path || args.path || \"...\") as string;\n\t\t\treturn themeFg(\"muted\", \"edit \") + themeFg(\"accent\", shortenSubagentToolPath(rawPath));\n\t\t}\n\t\tcase \"ls\": {\n\t\t\tconst rawPath = (args.path || \".\") as string;\n\t\t\treturn themeFg(\"muted\", \"ls \") + themeFg(\"accent\", shortenSubagentToolPath(rawPath));\n\t\t}\n\t\tcase \"find\": {\n\t\t\tconst pattern = (args.pattern || \"*\") as string;\n\t\t\tconst rawPath = (args.path || \".\") as string;\n\t\t\treturn (\n\t\t\t\tthemeFg(\"muted\", \"find \") +\n\t\t\t\tthemeFg(\"accent\", pattern) +\n\t\t\t\tthemeFg(\"dim\", ` in ${shortenSubagentToolPath(rawPath)}`)\n\t\t\t);\n\t\t}\n\t\tcase \"grep\": {\n\t\t\tconst pattern = (args.pattern || \"\") as string;\n\t\t\tconst rawPath = (args.path || \".\") as string;\n\t\t\treturn (\n\t\t\t\tthemeFg(\"muted\", \"grep \") +\n\t\t\t\tthemeFg(\"accent\", `/${pattern}/`) +\n\t\t\t\tthemeFg(\"dim\", ` in ${shortenSubagentToolPath(rawPath)}`)\n\t\t\t);\n\t\t}\n\t\tdefault: {\n\t\t\tconst argsStr = JSON.stringify(args);\n\t\t\tconst preview = argsStr.length > 50 ? `${argsStr.slice(0, 50)}...` : argsStr;\n\t\t\treturn themeFg(\"accent\", toolName) + themeFg(\"dim\", ` ${preview}`);\n\t\t}\n\t}\n}\n\nexport interface SubagentUsageStats {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n\tcontextTokens: number;\n\tturns: number;\n}\n\nexport type SubagentStatus = \"queued\" | \"running\" | \"completed\" | \"failed\";\nexport type SubagentRunStatus = Exclude<SubagentStatus, \"queued\">;\nexport type SubagentMode = \"single\" | \"parallel\" | \"chain\";\nexport type SubagentAgentSource = AgentSource | \"ad-hoc\" | \"unknown\";\n\nexport interface SubagentResult {\n\tstatus: SubagentStatus;\n\trunId?: string;\n\tsessionReference?: string;\n\tagent: string;\n\tagentSource: SubagentAgentSource;\n\ttask: string;\n\texitCode: number;\n\tmessages: Message[];\n\tstderr: string;\n\tusage: SubagentUsageStats;\n\tmodel?: string;\n\tstopReason?: string;\n\terrorMessage?: string;\n\tresponseFormat?: string;\n\tstep?: number;\n}\nexport interface SubagentDetails {\n\tmode: SubagentMode;\n\tagentScope: AgentScope;\n\tprojectAgentsDir: string | null;\n\tresults: SubagentResult[];\n}\n\nexport interface SubagentRunInfo {\n\trunId: string;\n\tsessionReference?: string;\n\tstatus: SubagentRunStatus;\n\tagent: string;\n\ttask: string;\n\tcwd: string;\n\tmodel?: string;\n\tcreatedAt: string;\n\tupdatedAt: string;\n\tlastOutput?: string;\n}\n\nexport type SubagentModelHint =\n\t| \"cheapest\"\n\t| \"fastest\"\n\t| \"strongest\"\n\t| \"best-reasoning\"\n\t| \"large-context\"\n\t| \"same-as-parent\"\n\t| \"balanced\";\n\nexport interface SessionSubagentConfig {\n\tname: string;\n\tdescription: string;\n\tsystemPrompt: string;\n\ttools?: string[];\n\tmodel?: string;\n\tmodelHint?: SubagentModelHint;\n\tskills?: string[];\n\tcwd?: string;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface SubagentRunRegistry {\n\tlist(): SubagentRunInfo[];\n}\n\nexport interface SubagentConfigRegistry {\n\tlist(): SessionSubagentConfig[];\n\tupsert(config: SessionSubagentConfig): void;\n\tget(name: string): SessionSubagentConfig | undefined;\n}\n\ninterface PresentationSegment {\n\tdisplayItemCount: number;\n\tassistantOutput?: string;\n}\n\ninterface SubagentPresentationState {\n\tdisplayItems: DisplayItem[];\n\tassistantOutputs: string[];\n\tsegments: PresentationSegment[];\n}\n\ninterface RetainedSubagentMessageState {\n\tpresentation: SubagentPresentationState;\n\tretainedChars: number;\n\tretainedSizes: number[];\n}\n\nconst presentationCache = new WeakMap<Message[], SubagentPresentationState>();\n\nfunction appendPresentationMessage(state: SubagentPresentationState, message: Message): void {\n\tconst segment: PresentationSegment = { displayItemCount: 0 };\n\tif (message.role === \"assistant\") {\n\t\tconst textParts: string[] = [];\n\t\tfor (const part of message.content) {\n\t\t\tif (part.type === \"text\") {\n\t\t\t\tstate.displayItems.push({ type: \"text\", text: part.text });\n\t\t\t\ttextParts.push(part.text);\n\t\t\t\tsegment.displayItemCount++;\n\t\t\t} else if (part.type === \"toolCall\") {\n\t\t\t\tstate.displayItems.push({ type: \"toolCall\", name: part.name, args: part.arguments });\n\t\t\t\tsegment.displayItemCount++;\n\t\t\t}\n\t\t}\n\t\tif (textParts.length > 0) {\n\t\t\tsegment.assistantOutput = textParts.join(\"\\n\");\n\t\t\tstate.assistantOutputs.push(segment.assistantOutput);\n\t\t}\n\t}\n\tstate.segments.push(segment);\n}\n\nfunction removeOldestPresentationMessage(state: SubagentPresentationState): void {\n\tconst segment = state.segments.shift();\n\tif (!segment) return;\n\tif (segment.displayItemCount > 0) state.displayItems.splice(0, segment.displayItemCount);\n\tif (segment.assistantOutput !== undefined) state.assistantOutputs.shift();\n}\n\nfunction getPresentationState(messages: Message[]): SubagentPresentationState {\n\tconst cached = presentationCache.get(messages);\n\tif (cached) return cached;\n\tconst state: SubagentPresentationState = { displayItems: [], assistantOutputs: [], segments: [] };\n\tfor (const message of messages) appendPresentationMessage(state, message);\n\tpresentationCache.set(messages, state);\n\treturn state;\n}\n\nfunction getFinalOutput(messages: Message[]): string {\n\treturn getPresentationState(messages).assistantOutputs.at(-1) ?? \"\";\n}\n\nfunction isFailedResult(result: SubagentResult): boolean {\n\treturn result.status === \"failed\";\n}\n\nfunction getResultOutput(result: SubagentResult): string {\n\tif (isFailedResult(result)) {\n\t\treturn result.errorMessage || result.stderr || getFinalOutput(result.messages) || \"(no output)\";\n\t}\n\treturn getFinalOutput(result.messages) || \"(no output)\";\n}\n\nfunction truncateParallelOutput(output: string): string {\n\tconst byteLength = Buffer.byteLength(output, \"utf8\");\n\tif (byteLength <= PER_TASK_OUTPUT_CAP) return output;\n\n\tlet truncated = output.slice(0, PER_TASK_OUTPUT_CAP);\n\twhile (Buffer.byteLength(truncated, \"utf8\") > PER_TASK_OUTPUT_CAP) {\n\t\ttruncated = truncated.slice(0, -1);\n\t}\n\treturn `${truncated}\\n\\n[Output truncated: ${byteLength - Buffer.byteLength(truncated, \"utf8\")} bytes omitted.]`;\n}\n\ntype DisplayItem = { type: \"text\"; text: string } | { type: \"toolCall\"; name: string; args: Record<string, unknown> };\n\nfunction getDisplayItems(messages: Message[]): DisplayItem[] {\n\treturn getPresentationState(messages).displayItems;\n}\n\nasync function mapWithConcurrencyLimit<TIn, TOut>(\n\titems: TIn[],\n\tconcurrency: number,\n\tfn: (item: TIn, index: number) => Promise<TOut>,\n): Promise<TOut[]> {\n\tif (items.length === 0) return [];\n\tconst limit = Math.max(1, Math.min(concurrency, items.length));\n\tconst results: TOut[] = new Array(items.length);\n\tlet nextIndex = 0;\n\tconst workers = new Array(limit).fill(null).map(async () => {\n\t\twhile (true) {\n\t\t\tconst current = nextIndex++;\n\t\t\tif (current >= items.length) return;\n\t\t\tresults[current] = await fn(items[current], current);\n\t\t}\n\t});\n\tawait Promise.all(workers);\n\treturn results;\n}\nfunction truncateRetainedTask(task: string): string {\n\tif (task.length <= MAX_RETAINED_TASK_DESCRIPTION_CHARS) return task;\n\treturn `${task.slice(0, MAX_RETAINED_TASK_DESCRIPTION_CHARS)}\\n\\n[Task truncated in retained details]`;\n}\n\nfunction truncateRetainedText(text: string): string {\n\tif (text.length <= MAX_RETAINED_MESSAGE_CHARS) return text;\n\treturn `${text.slice(0, MAX_RETAINED_MESSAGE_CHARS)}\\n\\n[Retained output truncated: ${text.length - MAX_RETAINED_MESSAGE_CHARS} characters omitted.]`;\n}\n\nfunction compactRetainedMessage(message: Message): Message | undefined {\n\tif (JSON.stringify(message).length <= MAX_RETAINED_MESSAGE_CHARS) return message;\n\tif (message.role === \"assistant\") {\n\t\tconst text = message.content\n\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t.map((part) => part.text)\n\t\t\t.join(\"\\n\");\n\t\treturn {\n\t\t\t...message,\n\t\t\terrorMessage: message.errorMessage ? truncateRetainedText(message.errorMessage) : undefined,\n\t\t\tcontent: [{ type: \"text\", text: truncateRetainedText(text || \"[Oversized assistant event omitted]\") }],\n\t\t};\n\t}\n\tif (message.role === \"toolResult\") {\n\t\tconst text = message.content\n\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t.map((part) => part.text)\n\t\t\t.join(\"\\n\");\n\t\treturn {\n\t\t\t...message,\n\t\t\ttoolCallId: message.toolCallId.slice(0, 1024),\n\t\t\ttoolName: message.toolName.slice(0, 1024),\n\t\t\tdetails: undefined,\n\t\t\tcontent: [{ type: \"text\", text: truncateRetainedText(text || \"[Oversized tool result omitted]\") }],\n\t\t};\n\t}\n\treturn undefined;\n}\nfunction retainSubagentMessage(result: SubagentResult, state: RetainedSubagentMessageState, message: Message): void {\n\tconst retainedMessage = compactRetainedMessage(message);\n\tif (!retainedMessage) return;\n\n\tconst retainedSize = JSON.stringify(retainedMessage).length;\n\tresult.messages.push(retainedMessage);\n\tappendPresentationMessage(state.presentation, retainedMessage);\n\tstate.retainedSizes.push(retainedSize);\n\tstate.retainedChars += retainedSize;\n\twhile (\n\t\tresult.messages.length > MAX_RETAINED_TASK_MESSAGES ||\n\t\t(state.retainedChars > MAX_RETAINED_TASK_CHARS && result.messages.length > 1)\n\t) {\n\t\tresult.messages.shift();\n\t\tremoveOldestPresentationMessage(state.presentation);\n\t\tstate.retainedChars -= state.retainedSizes.shift() ?? 0;\n\t}\n}\n\nfunction recordSubagentAssistantMessage(result: SubagentResult, message: AssistantMessage): void {\n\tresult.usage.turns++;\n\tconst usage = message.usage;\n\tif (usage) {\n\t\tresult.usage.input += usage.input || 0;\n\t\tresult.usage.output += usage.output || 0;\n\t\tresult.usage.cacheRead += usage.cacheRead || 0;\n\t\tresult.usage.cacheWrite += usage.cacheWrite || 0;\n\t\tresult.usage.cost += usage.cost?.total || 0;\n\t\tresult.usage.contextTokens = usage.totalTokens || 0;\n\t}\n\tif (!result.model && message.model) result.model = message.model;\n\tif (message.stopReason) result.stopReason = message.stopReason;\n\tresult.errorMessage = message.errorMessage;\n}\n\ntype OnUpdateCallback = (partial: AgentToolResult<SubagentDetails>) => void;\n\nexport interface SubagentRunRequest {\n\tcwd: string;\n\ttoolOperations?: ToolOperations;\n\tprompt: string;\n\t/** Human-readable delegated task, without wrapper markup. */\n\ttask: string;\n\tagent: string;\n\tagentSource: SubagentAgentSource;\n\tsystemPrompt: string;\n\tmodel?: string;\n\ttools?: string[];\n\tskills?: string[];\n\tcontinueSession?: string;\n\tsignal?: AbortSignal;\n\tonMessage: (message: Message) => void;\n}\n\nexport interface SubagentRunOutcome {\n\texitCode: number;\n\tstderr: string;\n\trunId?: string;\n\tsessionReference?: string;\n}\n\nexport type SubagentRunner = (request: SubagentRunRequest) => Promise<SubagentRunOutcome>;\n\ninterface SubagentTaskSpec {\n\tagent?: string;\n\ttask: string;\n\tresponseFormat?: string;\n\tsystemPrompt?: string;\n\tmodel?: string;\n\tmodelHint?: SubagentModelHint;\n\ttools?: string[];\n\tskills?: string[];\n\tcwd?: string;\n\ttoolOperations?: ToolOperations;\n\tcontinueSession?: string;\n}\ninterface SubagentModelSelection {\n\tspec: SubagentTaskSpec;\n\tpreset: AgentConfig | undefined;\n\tinheritedModel: string | undefined;\n\tagentName: string;\n\tresult: SubagentResult;\n\tresolveModelHintOption: ((hint: SubagentModelHint) => string | undefined) | undefined;\n}\n\nfunction selectSubagentModel(selection: SubagentModelSelection): string | undefined {\n\tconst { spec, preset, inheritedModel, agentName, result, resolveModelHintOption } = selection;\n\treturn (\n\t\tspec.model ??\n\t\t(spec.modelHint\n\t\t\t? resolveModelHint(spec.modelHint, resolveModelHintOption, `task \"${agentName}\"`, result)\n\t\t\t: undefined) ??\n\t\tpreset?.model ??\n\t\t(preset?.modelHint\n\t\t\t? resolveModelHint(\n\t\t\t\t\tpreset.modelHint as SubagentModelHint,\n\t\t\t\t\tresolveModelHintOption,\n\t\t\t\t\t`agent \"${agentName}\"`,\n\t\t\t\t\tresult,\n\t\t\t\t)\n\t\t\t: undefined) ??\n\t\tinheritedModel\n\t);\n}\n\nfunction finalizeSubagentRun(result: SubagentResult, outcome: SubagentRunOutcome, aborted: boolean): SubagentResult {\n\tresult.runId = outcome.runId;\n\tresult.sessionReference = outcome.sessionReference;\n\tresult.exitCode = outcome.exitCode;\n\tresult.stderr = outcome.stderr;\n\tif (aborted) {\n\t\tresult.status = \"failed\";\n\t\tresult.stopReason = \"aborted\";\n\t\tresult.errorMessage ??= outcome.stderr || \"Subagent was aborted\";\n\t\treturn result;\n\t}\n\tresult.status =\n\t\toutcome.exitCode !== 0 || result.stopReason === \"error\" || result.stopReason === \"aborted\"\n\t\t\t? \"failed\"\n\t\t\t: \"completed\";\n\treturn result;\n}\nasync function invokeSubagentRunner(runner: SubagentRunner, request: SubagentRunRequest): Promise<SubagentRunOutcome> {\n\ttry {\n\t\treturn await runner(request);\n\t} catch (error) {\n\t\tif (!request.signal?.aborted) throw error;\n\t\treturn { exitCode: 1, stderr: error instanceof Error ? error.message : String(error) };\n\t}\n}\n\nexport function formatSubagentTaskPrompt(task: string, responseFormat?: string): string {\n\tconst sections = [`<task>\\n${task}\\n</task>`];\n\tif (responseFormat?.trim()) {\n\t\tsections.push(`<response-format>\\n${responseFormat}\\n</response-format>`);\n\t}\n\treturn sections.join(\"\\n\\n\");\n}\n\nasync function runSingleAgent(\n\tdefaultCwd: string,\n\tagents: AgentConfig[],\n\tspec: SubagentTaskSpec,\n\tinheritedModel: string | undefined,\n\trunner: SubagentRunner,\n\tstep: number | undefined,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: OnUpdateCallback | undefined,\n\tmakeDetails: (results: SubagentResult[]) => SubagentDetails,\n\tresolveModelHintOption: ((hint: SubagentModelHint) => string | undefined) | undefined,\n): Promise<SubagentResult> {\n\tconst preset = spec.agent ? agents.find((agent) => agent.name === spec.agent) : undefined;\n\tconst agentName = spec.agent ?? \"ad-hoc\";\n\tif (spec.agent && !preset) {\n\t\tconst available = agents.map((agent) => `\"${agent.name}\"`).join(\", \") || \"none\";\n\t\treturn {\n\t\t\tstatus: \"failed\",\n\t\t\tagent: agentName,\n\t\t\tagentSource: \"unknown\",\n\t\t\ttask: truncateRetainedTask(spec.task),\n\t\t\tresponseFormat: spec.responseFormat,\n\t\t\texitCode: 1,\n\t\t\tmessages: [],\n\t\t\tstderr: `Unknown agent: \"${agentName}\". Available agents: ${available}.`,\n\t\t\tusage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },\n\t\t\tstep,\n\t\t};\n\t}\n\n\tconst currentResult: SubagentResult = {\n\t\tstatus: \"running\",\n\t\tagent: agentName,\n\t\tagentSource: preset?.source ?? \"ad-hoc\",\n\t\ttask: truncateRetainedTask(spec.task),\n\t\tresponseFormat: spec.responseFormat,\n\t\texitCode: -1,\n\t\tmessages: [],\n\t\tstderr: \"\",\n\t\tusage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },\n\t\tstep,\n\t};\n\tconst effectiveModel = selectSubagentModel({\n\t\tspec,\n\t\tpreset,\n\t\tinheritedModel,\n\t\tagentName,\n\t\tresult: currentResult,\n\t\tresolveModelHintOption,\n\t});\n\tconst effectiveTools = spec.tools ?? preset?.tools;\n\tconst effectiveSkills = spec.skills ?? preset?.skills;\n\tconst effectiveCwd = spec.cwd ?? preset?.cwd ?? defaultCwd;\n\tconst effectiveSystemPrompt = spec.systemPrompt ?? preset?.systemPrompt ?? GENERIC_SYSTEM_PROMPT;\n\tcurrentResult.model = effectiveModel;\n\tif (currentResult.status === \"failed\") return currentResult;\n\tif (signal?.aborted) {\n\t\tcurrentResult.status = \"failed\";\n\t\tcurrentResult.exitCode = 1;\n\t\tcurrentResult.stderr = \"Subagent was aborted\";\n\t\tcurrentResult.stopReason = \"aborted\";\n\t\tcurrentResult.errorMessage = \"Subagent was aborted\";\n\t\treturn currentResult;\n\t}\n\tconst retainedMessageState: RetainedSubagentMessageState = {\n\t\tpresentation: getPresentationState(currentResult.messages),\n\t\tretainedChars: 0,\n\t\tretainedSizes: [],\n\t};\n\tconst emitUpdate = (): void => {\n\t\tonUpdate?.({\n\t\t\tcontent: [{ type: \"text\", text: getFinalOutput(currentResult.messages) || \"(running...)\" }],\n\t\t\tdetails: makeDetails([currentResult]),\n\t\t});\n\t};\n\tconst onMessage = (message: Message): void => {\n\t\tretainSubagentMessage(currentResult, retainedMessageState, message);\n\t\tif (message.role === \"assistant\") recordSubagentAssistantMessage(currentResult, message);\n\t\temitUpdate();\n\t};\n\n\temitUpdate();\n\tconst outcome = await invokeSubagentRunner(runner, {\n\t\tcwd: effectiveCwd,\n\t\ttoolOperations: spec.toolOperations,\n\t\tprompt: formatSubagentTaskPrompt(spec.task, spec.responseFormat),\n\t\ttask: spec.task,\n\t\tagent: agentName,\n\t\tagentSource: preset?.source ?? \"ad-hoc\",\n\t\tsystemPrompt: effectiveSystemPrompt,\n\t\tmodel: effectiveModel,\n\t\ttools: effectiveTools,\n\t\tskills: effectiveSkills,\n\t\tcontinueSession: spec.continueSession,\n\t\tsignal,\n\t\tonMessage,\n\t});\n\treturn finalizeSubagentRun(currentResult, outcome, signal?.aborted === true);\n}\n\nconst MODEL_DESCRIPTION = \"Model for this task. Omit to inherit the parent model\";\nconst STEP_MODEL_DESCRIPTION = \"Model for this step. Omit to inherit the parent model\";\nconst MODEL_HINT_VALUES = [\n\t\"cheapest\",\n\t\"fastest\",\n\t\"strongest\",\n\t\"best-reasoning\",\n\t\"large-context\",\n\t\"same-as-parent\",\n\t\"balanced\",\n] as const;\nconst MODEL_HINT_DESCRIPTION =\n\t\"Advisory model selection hint. Exact model overrides this. Supported: cheapest, fastest, strongest, best-reasoning, large-context, same-as-parent, balanced.\";\n\nfunction appendModelCatalog(description: string, modelCatalog?: string): string {\n\treturn modelCatalog ? `${description}.\\n\\n${modelCatalog}` : description;\n}\n\nfunction createModelHintSchema() {\n\treturn StringEnum(MODEL_HINT_VALUES, { description: MODEL_HINT_DESCRIPTION });\n}\n\nfunction mergeSessionAgents(agents: AgentConfig[], configs: SessionSubagentConfig[]): AgentConfig[] {\n\tconst agentMap = new Map<string, AgentConfig>();\n\tfor (const agent of agents) agentMap.set(agent.name, agent);\n\tfor (const config of configs) {\n\t\tagentMap.set(config.name, {\n\t\t\tname: config.name,\n\t\t\tdescription: config.description,\n\t\t\tsystemPrompt: config.systemPrompt,\n\t\t\ttools: config.tools,\n\t\t\tmodel: config.model,\n\t\t\tmodelHint: config.modelHint,\n\t\t\tskills: config.skills,\n\t\t\tcwd: config.cwd,\n\t\t\tsource: \"session\",\n\t\t\tfilePath: `<session-subagent:${config.name}>`,\n\t\t});\n\t}\n\treturn Array.from(agentMap.values());\n}\n\nfunction resolveModelHint(\n\thint: SubagentModelHint | undefined,\n\tresolveModelHintOption: ((hint: SubagentModelHint) => string | undefined) | undefined,\n\tcontext: string,\n\tresult: SubagentResult,\n): string | undefined {\n\tif (!hint) return undefined;\n\tconst resolved = resolveModelHintOption?.(hint);\n\tif (!resolved) {\n\t\tresult.status = \"failed\";\n\t\tresult.exitCode = 1;\n\t\tresult.stderr = `Could not resolve modelHint \"${hint}\" for ${context}.`;\n\t\tresult.errorMessage = result.stderr;\n\t\tresult.stopReason = \"error\";\n\t\treturn undefined;\n\t}\n\treturn resolved;\n}\n\nfunction createSubagentParamsSchema(modelCatalog?: string) {\n\tconst TaskItem = Type.Object({\n\t\tagent: Type.Optional(Type.String({ description: \"Optional named agent preset\" })),\n\t\ttask: Type.String({ description: \"Task to delegate\" }),\n\t\tresponseFormat: Type.Optional(Type.String({ description: \"Requested response content and structure\" })),\n\t\tsystemPrompt: Type.Optional(\n\t\t\tType.String({ description: \"Persona/instructions overriding the preset system prompt\" }),\n\t\t),\n\t\tmodel: Type.Optional(Type.String({ description: appendModelCatalog(MODEL_DESCRIPTION, modelCatalog) })),\n\t\tmodelHint: Type.Optional(createModelHintSchema()),\n\t\ttools: Type.Optional(Type.Array(Type.String(), { description: \"Tool allowlist overriding preset defaults\" })),\n\t\tskills: Type.Optional(\n\t\t\tType.Array(Type.String(), { description: \"Skills to preload before the first subagent turn\" }),\n\t\t),\n\t\tcwd: Type.Optional(Type.String({ description: \"Working directory for the agent session\" })),\n\t});\n\n\tconst ChainItem = Type.Object({\n\t\tagent: Type.Optional(Type.String({ description: \"Optional named agent preset\" })),\n\t\ttask: Type.String({ description: \"Task with optional {previous} placeholder for prior output\" }),\n\t\tresponseFormat: Type.Optional(Type.String({ description: \"Requested response content and structure\" })),\n\t\tsystemPrompt: Type.Optional(\n\t\t\tType.String({ description: \"Persona/instructions overriding the preset system prompt\" }),\n\t\t),\n\t\tmodel: Type.Optional(Type.String({ description: appendModelCatalog(STEP_MODEL_DESCRIPTION, modelCatalog) })),\n\t\tmodelHint: Type.Optional(createModelHintSchema()),\n\t\ttools: Type.Optional(Type.Array(Type.String(), { description: \"Tool allowlist overriding preset defaults\" })),\n\t\tskills: Type.Optional(\n\t\t\tType.Array(Type.String(), { description: \"Skills to preload before the first subagent turn\" }),\n\t\t),\n\t\tcwd: Type.Optional(Type.String({ description: \"Working directory for the agent session\" })),\n\t});\n\n\tconst AgentScopeSchema = StringEnum([\"user\", \"project\", \"both\"] as const, {\n\t\tdescription: 'Which agent directories to use. Default: \"user\". Use \"both\" to include project-local agents.',\n\t\tdefault: \"user\",\n\t});\n\n\treturn Type.Object({\n\t\tagent: Type.Optional(Type.String({ description: \"Optional named agent preset (single mode)\" })),\n\t\ttask: Type.Optional(\n\t\t\tType.String({ description: \"Task to delegate (single mode) or follow-up prompt when continuing a subagent\" }),\n\t\t),\n\t\tresponseFormat: Type.Optional(Type.String({ description: \"Requested response content and structure\" })),\n\t\tsystemPrompt: Type.Optional(\n\t\t\tType.String({ description: \"Persona/instructions overriding the preset system prompt\" }),\n\t\t),\n\t\tmodel: Type.Optional(Type.String({ description: appendModelCatalog(MODEL_DESCRIPTION, modelCatalog) })),\n\t\tmodelHint: Type.Optional(createModelHintSchema()),\n\t\ttools: Type.Optional(Type.Array(Type.String(), { description: \"Tool allowlist overriding preset defaults\" })),\n\t\tskills: Type.Optional(\n\t\t\tType.Array(Type.String(), { description: \"Skills to preload before the first subagent turn\" }),\n\t\t),\n\t\ttasks: Type.Optional(Type.Array(TaskItem, { description: \"Tasks for parallel execution\" })),\n\t\tchain: Type.Optional(\n\t\t\tType.Array(ChainItem, { description: \"Tasks for sequential execution\", maxItems: MAX_CHAIN_STEPS }),\n\t\t),\n\t\tagentScope: Type.Optional(AgentScopeSchema),\n\t\tcontinueSession: Type.Optional(Type.String({ description: \"Run id of a previous subagent run to continue\" })),\n\t\tcwd: Type.Optional(Type.String({ description: \"Working directory for the subagent session (single mode)\" })),\n\t});\n}\n\nexport const subagentParamsSchema = createSubagentParamsSchema();\n\nexport type SubagentToolInput = Static<typeof subagentParamsSchema>;\n\nexport interface SubagentToolOptions {\n\trunner?: SubagentRunner;\n\tmodelCatalog?: string;\n\tresolveModelHint?: (hint: SubagentModelHint) => string | undefined;\n\t/** Host-controlled trust grant for project-local agent presets. */\n\ttrustProjectAgents?: boolean;\n\trunRegistry?: SubagentRunRegistry;\n\tconfigRegistry?: SubagentConfigRegistry;\n}\nconst subagentRunsParamsSchema = Type.Object({\n\tstatus: Type.Optional(\n\t\tStringEnum([\"running\", \"completed\", \"failed\"] as const, { description: \"Filter runs by status\" }),\n\t),\n});\n\nexport type SubagentRunsToolInput = Static<typeof subagentRunsParamsSchema>;\n\nfunction truncateRunPreview(text: string | undefined): string {\n\tif (!text) return \"\";\n\tconst trimmed = text.trim();\n\treturn trimmed.length > 240 ? `${trimmed.slice(0, 240)}...` : trimmed;\n}\n\nexport interface SubagentRunsDetails {\n\truns: SubagentRunInfo[];\n}\n\nexport function createSubagentRunsToolDefinition(\n\tregistry?: SubagentRunRegistry,\n): ToolDefinition<typeof subagentRunsParamsSchema, SubagentRunsDetails> {\n\treturn {\n\t\tname: \"subagent_runs\",\n\t\tlabel: \"Subagent Runs\",\n\t\tdescription: \"List subagent runs in the current session so one can be selected and continued by run id.\",\n\t\tpromptSnippet: \"List subagent runs from the current session for continuation\",\n\t\tparameters: subagentRunsParamsSchema,\n\t\tasync execute(_toolCallId, params) {\n\t\t\tif (!registry) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Subagent run registry is not configured for this session.\" }],\n\t\t\t\t\tdetails: { runs: [] },\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst runs = registry.list().filter((run) => !params.status || run.status === params.status);\n\t\t\tif (runs.length === 0) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"No subagent runs found.\" }], details: { runs } };\n\t\t\t}\n\t\t\tconst text = runs\n\t\t\t\t.map((run, index) => {\n\t\t\t\t\tconst lines = [\n\t\t\t\t\t\t`${index + 1}. ${run.runId} [${run.status}] ${run.agent}${run.model ? ` (${run.model})` : \"\"}`,\n\t\t\t\t\t\t` Task: ${run.task.replace(/\\s+/g, \" \")}`,\n\t\t\t\t\t\t` CWD: ${run.cwd}`,\n\t\t\t\t\t];\n\t\t\t\t\tif (run.sessionReference) lines.push(` Session: ${run.sessionReference}`);\n\t\t\t\t\tconst preview = truncateRunPreview(run.lastOutput);\n\t\t\t\t\tif (preview) lines.push(` Output: ${preview}`);\n\t\t\t\t\treturn lines.join(\"\\n\");\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\\n\");\n\t\t\treturn { content: [{ type: \"text\", text }], details: { runs } };\n\t\t},\n\t\trenderCall(_args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"subagent_runs\")), 0, 0);\n\t\t},\n\t\trenderResult(result, _options, theme) {\n\t\t\tconst text = result.content\n\t\t\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t\t\t.map((part) => part.text)\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.trim();\n\t\t\treturn new Text(theme.fg(\"toolOutput\", text), 0, 0);\n\t\t},\n\t};\n}\nconst createSubagentConfigParamsSchema = Type.Object({\n\tname: Type.String({ description: \"Session-scoped subagent preset name\" }),\n\tdescription: Type.String({ description: \"Short description shown when this preset is available\" }),\n\tsystemPrompt: Type.String({ description: \"System prompt/persona for this subagent preset\" }),\n\tmodel: Type.Optional(Type.String({ description: \"Exact model for this preset. Overrides modelHint.\" })),\n\tmodelHint: Type.Optional(createModelHintSchema()),\n\ttools: Type.Optional(Type.Array(Type.String(), { description: \"Default tool allowlist for this preset\" })),\n\tskills: Type.Optional(\n\t\tType.Array(Type.String(), { description: \"Skill names to preload before the first subagent turn\" }),\n\t),\n\tcwd: Type.Optional(Type.String({ description: \"Default working directory for this preset\" })),\n});\n\nexport type CreateSubagentToolInput = Static<typeof createSubagentConfigParamsSchema>;\n\nexport interface CreateSubagentDetails {\n\tconfig?: SessionSubagentConfig;\n\tconfigs: SessionSubagentConfig[];\n}\n\nexport function createCreateSubagentToolDefinition(\n\tregistry?: SubagentConfigRegistry,\n): ToolDefinition<typeof createSubagentConfigParamsSchema, CreateSubagentDetails> {\n\treturn {\n\t\tname: \"create_subagent\",\n\t\tlabel: \"Create Subagent\",\n\t\tdescription: \"Create or replace a session-scoped named subagent preset for later subagent calls.\",\n\t\tpromptSnippet: \"Create session-scoped subagent presets with tools, skills, cwd, and model hints\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use create_subagent when a reusable temporary role would reduce repeated subagent configuration.\",\n\t\t\t\"Prefer modelHint for cost/performance intent unless an exact model is required.\",\n\t\t],\n\t\tparameters: createSubagentConfigParamsSchema,\n\t\tasync execute(_toolCallId, params) {\n\t\t\tif (!registry) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Subagent config registry is not configured for this session.\" }],\n\t\t\t\t\tdetails: { configs: [] },\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst trimmedName = params.name.trim();\n\t\t\tif (!/^[A-Za-z0-9_-]{1,64}$/.test(trimmedName)) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\", text: \"Invalid subagent name. Use 1-64 letters, numbers, underscores, or hyphens.\" },\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { configs: registry.list() },\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst now = new Date().toISOString();\n\t\t\tconst existing = registry.get(trimmedName);\n\t\t\tconst config: SessionSubagentConfig = {\n\t\t\t\tname: trimmedName,\n\t\t\t\tdescription: params.description.trim(),\n\t\t\t\tsystemPrompt: params.systemPrompt,\n\t\t\t\tmodel: params.model?.trim() || undefined,\n\t\t\t\tmodelHint: params.modelHint,\n\t\t\t\ttools: params.tools?.map((tool) => tool.trim()).filter(Boolean),\n\t\t\t\tskills: params.skills?.map((skill) => skill.trim()).filter(Boolean),\n\t\t\t\tcwd: params.cwd?.trim() || undefined,\n\t\t\t\tcreatedAt: existing?.createdAt ?? now,\n\t\t\t\tupdatedAt: now,\n\t\t\t};\n\t\t\tregistry.upsert(config);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Created subagent preset \"${config.name}\".` }],\n\t\t\t\tdetails: { config, configs: registry.list() },\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"create_subagent \")) + theme.fg(\"accent\", args.name), 0, 0);\n\t\t},\n\t\trenderResult(result, _options, theme) {\n\t\t\tconst text = result.content\n\t\t\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t\t\t.map((part) => part.text)\n\t\t\t\t.join(\"\\n\");\n\t\t\treturn new Text(theme.fg(\"toolOutput\", text), 0, 0);\n\t\t},\n\t};\n}\n\ninterface SubagentModeSelection {\n\tmode: SubagentMode;\n\thasChain: boolean;\n\thasTasks: boolean;\n\thasSingle: boolean;\n\tmodeCount: number;\n}\n\ntype SubagentDetailsBuilder = (results: SubagentResult[]) => SubagentDetails;\ntype SubagentDetailsFactory = (mode: SubagentMode) => SubagentDetailsBuilder;\n\ninterface SubagentExecutionEnvironment {\n\tagents: AgentConfig[];\n\tworkspaceCwd: string;\n\tworkspaceOperations: ToolOperations;\n\tinheritedModel: string | undefined;\n\trunner: SubagentRunner;\n\tsignal: AbortSignal | undefined;\n\tonUpdate: OnUpdateCallback | undefined;\n\tmakeDetails: SubagentDetailsFactory;\n\tresolveModelHintOption: ((hint: SubagentModelHint) => string | undefined) | undefined;\n}\n\ninterface SubagentToolExecutionResult extends AgentToolResult<SubagentDetails> {\n\tisError?: boolean;\n}\n\nfunction inheritedSubagentModelName(model: Model<Api> | undefined): string | undefined {\n\treturn model ? `${model.provider}/${model.id}` : undefined;\n}\n\nfunction selectSubagentMode(params: SubagentToolInput): SubagentModeSelection {\n\tconst hasChain = (params.chain?.length ?? 0) > 0;\n\tconst hasTasks = (params.tasks?.length ?? 0) > 0;\n\tconst hasSingle = Boolean(params.task);\n\treturn {\n\t\tmode: hasChain ? \"chain\" : hasTasks ? \"parallel\" : \"single\",\n\t\thasChain,\n\t\thasTasks,\n\t\thasSingle,\n\t\tmodeCount: Number(hasChain) + Number(hasTasks) + Number(hasSingle),\n\t};\n}\n\nfunction createSubagentDetailsFactory(agentScope: AgentScope, projectAgentsDir: string | null): SubagentDetailsFactory {\n\treturn (mode) => (results) => ({ mode, agentScope, projectAgentsDir, results });\n}\n\nfunction hasContinuedSessionOverrides(params: SubagentToolInput): boolean {\n\treturn (\n\t\tparams.agent !== undefined ||\n\t\tparams.systemPrompt !== undefined ||\n\t\tparams.model !== undefined ||\n\t\tparams.modelHint !== undefined ||\n\t\tparams.tools !== undefined ||\n\t\tparams.skills !== undefined ||\n\t\tparams.cwd !== undefined ||\n\t\tparams.agentScope !== undefined\n\t);\n}\n\nfunction validateSubagentRequest(\n\tparams: SubagentToolInput,\n\tselection: SubagentModeSelection,\n\tagents: AgentConfig[],\n\tmakeDetails: SubagentDetailsFactory,\n): SubagentToolExecutionResult | undefined {\n\tif (selection.modeCount !== 1) {\n\t\tconst available = agents.map((agent) => `${agent.name} (${agent.source})`).join(\", \") || \"none\";\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{ type: \"text\", text: `Invalid parameters. Provide exactly one mode.\\nAvailable agents: ${available}` },\n\t\t\t],\n\t\t\tdetails: makeDetails(\"single\")([]),\n\t\t};\n\t}\n\tif (params.continueSession && !selection.hasSingle) {\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: \"Invalid parameters. continueSession requires a single follow-up task.\" }],\n\t\t\tdetails: makeDetails(selection.mode)([]),\n\t\t\tisError: true,\n\t\t};\n\t}\n\tif (params.continueSession && hasContinuedSessionOverrides(params)) {\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: \"Invalid parameters. A continued subagent may only specify task and responseFormat.\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdetails: makeDetails(\"single\")([]),\n\t\t\tisError: true,\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction collectRequestedAgentNames(params: SubagentToolInput): Set<string> {\n\tconst names = new Set<string>();\n\tfor (const step of params.chain ?? []) if (step.agent) names.add(step.agent);\n\tfor (const task of params.tasks ?? []) if (task.agent) names.add(task.agent);\n\tif (params.agent) names.add(params.agent);\n\treturn names;\n}\n\nasync function authorizeProjectAgents(\n\tparams: SubagentToolInput,\n\tagentScope: AgentScope,\n\tagents: AgentConfig[],\n\tprojectAgentsDir: string | null,\n\ttrustProjectAgents: boolean | undefined,\n\tctx: ExtensionContext,\n\tmakeDetails: SubagentDetailsFactory,\n\tmode: SubagentMode,\n): Promise<SubagentToolExecutionResult | undefined> {\n\tif (agentScope === \"user\") return undefined;\n\tconst agentsByName = new Map<string, AgentConfig>();\n\tfor (const agent of agents) {\n\t\tif (!agentsByName.has(agent.name)) agentsByName.set(agent.name, agent);\n\t}\n\tconst projectAgents: AgentConfig[] = [];\n\tfor (const name of collectRequestedAgentNames(params)) {\n\t\tconst agent = agentsByName.get(name);\n\t\tif (agent?.source === \"project\") projectAgents.push(agent);\n\t}\n\tif (projectAgents.length === 0 || trustProjectAgents) return undefined;\n\tconst names = projectAgents.map((agent) => agent.name).join(\", \");\n\tconst dir = projectAgentsDir ?? \"(unknown)\";\n\tif (!ctx.hasUI) {\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: `Project-local agents require host approval, but no interactive UI is available. Agents: ${names}. Source: ${dir}.`,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdetails: makeDetails(mode)([]),\n\t\t\tisError: true,\n\t\t};\n\t}\n\tconst approved = await ctx.ui.confirm(\n\t\t\"Run project-local agents?\",\n\t\t`Agents: ${names}\\nSource: ${dir}\\n\\nProject agents are repo-controlled. Only continue for trusted repositories.`,\n\t);\n\tif (approved) return undefined;\n\treturn {\n\t\tcontent: [{ type: \"text\", text: \"Canceled: project-local agents not approved.\" }],\n\t\tdetails: makeDetails(mode)([]),\n\t\tisError: true,\n\t};\n}\n\nfunction createChainUpdate(\n\tonUpdate: OnUpdateCallback | undefined,\n\tresults: SubagentResult[],\n\tmakeDetails: SubagentDetailsFactory,\n): OnUpdateCallback | undefined {\n\tif (!onUpdate) return undefined;\n\treturn (partial) => {\n\t\tconst currentResult = partial.details?.results[0];\n\t\tif (!currentResult) return;\n\t\tonUpdate({\n\t\t\tcontent: partial.content,\n\t\t\tdetails: makeDetails(\"chain\")([...results, currentResult]),\n\t\t});\n\t};\n}\n\nasync function executeSubagentChain(\n\tparams: SubagentToolInput,\n\tenvironment: SubagentExecutionEnvironment,\n): Promise<SubagentToolExecutionResult> {\n\tconst chain = params.chain ?? [];\n\tif (chain.length > MAX_CHAIN_STEPS) {\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `Too many chain steps (${chain.length}). Max is ${MAX_CHAIN_STEPS}.` }],\n\t\t\tdetails: environment.makeDetails(\"chain\")([]),\n\t\t};\n\t}\n\tconst results: SubagentResult[] = [];\n\tlet previousOutput = \"\";\n\tfor (let index = 0; index < chain.length; index++) {\n\t\tconst step = chain[index];\n\t\tconst result = await runSingleAgent(\n\t\t\tenvironment.workspaceCwd,\n\t\t\tenvironment.agents,\n\t\t\t{\n\t\t\t\t...step,\n\t\t\t\ttask: step.task.replace(/\\{previous\\}/g, previousOutput),\n\t\t\t\ttoolOperations: environment.workspaceOperations,\n\t\t\t},\n\t\t\tenvironment.inheritedModel,\n\t\t\tenvironment.runner,\n\t\t\tindex + 1,\n\t\t\tenvironment.signal,\n\t\t\tcreateChainUpdate(environment.onUpdate, results, environment.makeDetails),\n\t\t\tenvironment.makeDetails(\"chain\"),\n\t\t\tenvironment.resolveModelHintOption,\n\t\t);\n\t\tresults.push(result);\n\t\tif (isFailedResult(result)) {\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: `Chain stopped at step ${index + 1} (${result.agent}): ${getResultOutput(result)}`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: environment.makeDetails(\"chain\")(results),\n\t\t\t\tisError: true,\n\t\t\t};\n\t\t}\n\t\tpreviousOutput = getFinalOutput(result.messages);\n\t}\n\treturn {\n\t\tcontent: [{ type: \"text\", text: getFinalOutput(results[results.length - 1].messages) || \"(no output)\" }],\n\t\tdetails: environment.makeDetails(\"chain\")(results),\n\t};\n}\n\nfunction createQueuedSubagentResult(\n\ttask: SubagentTaskSpec,\n\tagents: AgentConfig[],\n\tinheritedModel: string | undefined,\n): SubagentResult {\n\treturn {\n\t\tstatus: \"queued\",\n\t\tagent: task.agent ?? \"ad-hoc\",\n\t\tagentSource: task.agent ? \"unknown\" : \"ad-hoc\",\n\t\ttask: truncateRetainedTask(task.task),\n\t\tresponseFormat: task.responseFormat,\n\t\texitCode: -1,\n\t\tmessages: [],\n\t\tstderr: \"\",\n\t\tusage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },\n\t\tmodel:\n\t\t\ttask.model ??\n\t\t\t(task.modelHint ? `hint:${task.modelHint}` : undefined) ??\n\t\t\tagents.find((agent) => agent.name === task.agent)?.model ??\n\t\t\tinheritedModel,\n\t};\n}\n\nfunction emitParallelSubagentUpdate(\n\tonUpdate: OnUpdateCallback | undefined,\n\tresults: SubagentResult[],\n\tmakeDetails: SubagentDetailsFactory,\n): void {\n\tif (!onUpdate) return;\n\tconst running = results.filter((result) => result.status === \"running\" || result.status === \"queued\").length;\n\tconst done = results.length - running;\n\tonUpdate({\n\t\tcontent: [{ type: \"text\", text: `Parallel: ${done}/${results.length} done, ${running} running...` }],\n\t\tdetails: makeDetails(\"parallel\")([...results]),\n\t});\n}\n\nfunction formatParallelSubagentSummary(result: SubagentResult): string {\n\tconst output = truncateParallelOutput(getResultOutput(result));\n\tconst status = isFailedResult(result)\n\t\t? `failed${result.stopReason && result.stopReason !== \"end\" ? ` (${result.stopReason})` : \"\"}`\n\t\t: \"completed\";\n\treturn `### [${result.agent}] ${status}\\n\\n${output}`;\n}\n\nasync function executeParallelSubagents(\n\tparams: SubagentToolInput,\n\tenvironment: SubagentExecutionEnvironment,\n): Promise<SubagentToolExecutionResult> {\n\tconst tasks = params.tasks ?? [];\n\tif (tasks.length > MAX_PARALLEL_TASKS) {\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `Too many parallel tasks (${tasks.length}). Max is ${MAX_PARALLEL_TASKS}.` }],\n\t\t\tdetails: environment.makeDetails(\"parallel\")([]),\n\t\t};\n\t}\n\tconst currentResults = tasks.map((task) =>\n\t\tcreateQueuedSubagentResult(task, environment.agents, environment.inheritedModel),\n\t);\n\tconst results = await mapWithConcurrencyLimit(tasks, MAX_CONCURRENCY, async (task, index) => {\n\t\tconst result = await runSingleAgent(\n\t\t\tenvironment.workspaceCwd,\n\t\t\tenvironment.agents,\n\t\t\t{ ...task, toolOperations: environment.workspaceOperations },\n\t\t\tenvironment.inheritedModel,\n\t\t\tenvironment.runner,\n\t\t\tundefined,\n\t\t\tenvironment.signal,\n\t\t\t(partial) => {\n\t\t\t\tconst currentResult = partial.details?.results[0];\n\t\t\t\tif (!currentResult) return;\n\t\t\t\tcurrentResults[index] = currentResult;\n\t\t\t\temitParallelSubagentUpdate(environment.onUpdate, currentResults, environment.makeDetails);\n\t\t\t},\n\t\t\tenvironment.makeDetails(\"parallel\"),\n\t\t\tenvironment.resolveModelHintOption,\n\t\t);\n\t\tcurrentResults[index] = result;\n\t\temitParallelSubagentUpdate(environment.onUpdate, currentResults, environment.makeDetails);\n\t\treturn result;\n\t});\n\tconst successCount = results.filter((result) => !isFailedResult(result)).length;\n\tconst summaries = results.map(formatParallelSubagentSummary);\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Parallel: ${successCount}/${results.length} succeeded\\n\\n${summaries.join(\"\\n\\n---\\n\\n\")}`,\n\t\t\t},\n\t\t],\n\t\tdetails: environment.makeDetails(\"parallel\")(results),\n\t};\n}\n\nasync function executeSingleSubagent(\n\tparams: SubagentToolInput,\n\tenvironment: SubagentExecutionEnvironment,\n): Promise<SubagentToolExecutionResult> {\n\tconst result = await runSingleAgent(\n\t\tenvironment.workspaceCwd,\n\t\tenvironment.agents,\n\t\t{\n\t\t\tagent: params.agent,\n\t\t\ttask: params.task ?? \"\",\n\t\t\tresponseFormat: params.responseFormat,\n\t\t\tsystemPrompt: params.systemPrompt,\n\t\t\tmodel: params.model,\n\t\t\tmodelHint: params.modelHint,\n\t\t\ttools: params.tools,\n\t\t\tskills: params.skills,\n\t\t\tcwd: params.cwd,\n\t\t\ttoolOperations: environment.workspaceOperations,\n\t\t\tcontinueSession: params.continueSession,\n\t\t},\n\t\tenvironment.inheritedModel,\n\t\tenvironment.runner,\n\t\tundefined,\n\t\tenvironment.signal,\n\t\tenvironment.onUpdate,\n\t\tenvironment.makeDetails(\"single\"),\n\t\tenvironment.resolveModelHintOption,\n\t);\n\tif (isFailedResult(result)) {\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `Agent ${result.stopReason || \"failed\"}: ${getResultOutput(result)}` }],\n\t\t\tdetails: environment.makeDetails(\"single\")([result]),\n\t\t\tisError: true,\n\t\t};\n\t}\n\treturn {\n\t\tcontent: [{ type: \"text\", text: getFinalOutput(result.messages) || \"(no output)\" }],\n\t\tdetails: environment.makeDetails(\"single\")([result]),\n\t};\n}\n\nfunction executeSelectedSubagentMode(\n\tparams: SubagentToolInput,\n\tselection: SubagentModeSelection,\n\tenvironment: SubagentExecutionEnvironment,\n): Promise<SubagentToolExecutionResult> {\n\tif (selection.hasChain) return executeSubagentChain(params, environment);\n\tif (selection.hasTasks) return executeParallelSubagents(params, environment);\n\treturn executeSingleSubagent(params, environment);\n}\n\nfunction truncateSubagentCallTask(task: string, maxCharacters: number): string {\n\treturn task.length > maxCharacters ? `${task.slice(0, maxCharacters)}...` : task;\n}\n\nfunction renderSubagentChainCall(args: SubagentToolInput, scope: AgentScope, theme: Theme): Text {\n\tconst chain = args.chain ?? [];\n\tlet text =\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\ttheme.fg(\"accent\", `chain (${chain.length} steps)`) +\n\t\ttheme.fg(\"muted\", ` [${scope}]`);\n\tfor (let index = 0; index < Math.min(chain.length, 3); index++) {\n\t\tconst step = chain[index];\n\t\tconst cleanTask = step.task.replace(/\\{previous\\}/g, \"\").trim();\n\t\tconst preview = truncateSubagentCallTask(cleanTask, 40);\n\t\ttext +=\n\t\t\t\"\\n \" +\n\t\t\ttheme.fg(\"muted\", `${index + 1}.`) +\n\t\t\t\" \" +\n\t\t\ttheme.fg(\"accent\", step.agent ?? \"ad-hoc\") +\n\t\t\ttheme.fg(\"muted\", ` [${step.model ?? \"parent model\"}]`) +\n\t\t\ttheme.fg(\"dim\", ` ${preview}`);\n\t}\n\tif (chain.length > 3) text += `\\n ${theme.fg(\"muted\", `... +${chain.length - 3} more`)}`;\n\treturn new Text(text, 0, 0);\n}\n\nfunction renderParallelSubagentCall(args: SubagentToolInput, scope: AgentScope, theme: Theme): Text {\n\tconst tasks = args.tasks ?? [];\n\tlet text =\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\ttheme.fg(\"accent\", `parallel (${tasks.length} tasks)`) +\n\t\ttheme.fg(\"muted\", ` [${scope}]`);\n\tfor (const task of tasks.slice(0, 3)) {\n\t\tconst preview = truncateSubagentCallTask(task.task, 40);\n\t\ttext += `\\n ${theme.fg(\"accent\", task.agent ?? \"ad-hoc\")}${theme.fg(\"muted\", ` [${task.model ?? \"parent model\"}]`)}${theme.fg(\"dim\", ` ${preview}`)}`;\n\t}\n\tif (tasks.length > 3) text += `\\n ${theme.fg(\"muted\", `... +${tasks.length - 3} more`)}`;\n\treturn new Text(text, 0, 0);\n}\n\nfunction renderSingleSubagentCall(args: SubagentToolInput, scope: AgentScope, theme: Theme): Text {\n\tconst agentName = args.agent || \"ad-hoc\";\n\tconst preview = args.task ? truncateSubagentCallTask(args.task, 60) : \"...\";\n\tlet text =\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\ttheme.fg(\"accent\", agentName) +\n\t\ttheme.fg(\"muted\", ` [${scope}] [${args.model ?? \"parent model\"}]`);\n\ttext += `\\n ${theme.fg(\"dim\", preview)}`;\n\treturn new Text(text, 0, 0);\n}\n\ninterface SubagentStatusCounts {\n\tcompleted: number;\n\tfailed: number;\n\tactive: number;\n}\n\nfunction renderSubagentStatusIcon(status: SubagentStatus, theme: Theme): string {\n\tif (status === \"queued\") return theme.fg(\"muted\", \"[queued]\");\n\tif (status === \"running\") return theme.fg(\"warning\", \"[running]\");\n\tif (status === \"failed\") return theme.fg(\"error\", \"[failed]\");\n\treturn theme.fg(\"success\", \"[done]\");\n}\n\nfunction renderSubagentModel(model: string | undefined, theme: Theme): string {\n\treturn theme.fg(\"muted\", ` [${model ?? \"model pending\"}]`);\n}\n\nfunction renderSubagentDisplayItems(items: DisplayItem[], expanded: boolean, theme: Theme, limit?: number): string {\n\tconst toShow = limit ? items.slice(-limit) : items;\n\tconst skipped = limit && items.length > limit ? items.length - limit : 0;\n\tlet text = skipped > 0 ? theme.fg(\"muted\", `... ${skipped} earlier items\\n`) : \"\";\n\tfor (const item of toShow) {\n\t\tif (item.type === \"text\") {\n\t\t\tconst preview = expanded ? item.text : item.text.split(\"\\n\").slice(0, 3).join(\"\\n\");\n\t\t\ttext += `${theme.fg(\"toolOutput\", preview)}\\n`;\n\t\t\tcontinue;\n\t\t}\n\t\ttext += `${theme.fg(\"muted\", \"-> \") + formatToolCall(item.name, item.args, theme.fg.bind(theme))}\\n`;\n\t}\n\treturn text.trimEnd();\n}\n\nfunction aggregateSubagentUsage(results: SubagentResult[]): SubagentUsageDisplayMetrics {\n\tconst total = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 };\n\tfor (const result of results) {\n\t\ttotal.input += result.usage.input;\n\t\ttotal.output += result.usage.output;\n\t\ttotal.cacheRead += result.usage.cacheRead;\n\t\ttotal.cacheWrite += result.usage.cacheWrite;\n\t\ttotal.cost += result.usage.cost;\n\t\ttotal.turns += result.usage.turns;\n\t}\n\treturn total;\n}\n\nfunction countSubagentStatuses(results: SubagentResult[]): SubagentStatusCounts {\n\tconst counts: SubagentStatusCounts = { completed: 0, failed: 0, active: 0 };\n\tfor (const result of results) {\n\t\tif (result.status === \"completed\") counts.completed++;\n\t\telse if (result.status === \"failed\") counts.failed++;\n\t\telse counts.active++;\n\t}\n\treturn counts;\n}\n\nfunction appendSubagentToolCalls(container: Container, items: DisplayItem[], theme: Theme): void {\n\tfor (const item of items) {\n\t\tif (item.type !== \"toolCall\") continue;\n\t\tcontainer.addChild(\n\t\t\tnew Text(theme.fg(\"muted\", \"-> \") + formatToolCall(item.name, item.args, theme.fg.bind(theme)), 0, 0),\n\t\t);\n\t}\n}\n\nfunction appendSubagentMarkdown(container: Container, output: string): void {\n\tif (!output) return;\n\tcontainer.addChild(new Spacer(1));\n\tcontainer.addChild(new Markdown(output.trim(), 0, 0, getMarkdownTheme()));\n}\n\nfunction appendSubagentUsage(\n\tcontainer: Container,\n\tusage: SubagentUsageDisplayMetrics,\n\ttheme: Theme,\n\tmodel?: string,\n\tprefix = \"\",\n\twithSpacer = false,\n): void {\n\tconst text = formatUsageStats(usage, model);\n\tif (!text) return;\n\tif (withSpacer) container.addChild(new Spacer(1));\n\tcontainer.addChild(new Text(theme.fg(\"dim\", `${prefix}${text}`), 0, 0));\n}\n\nfunction appendExpandedBatchResult(container: Container, result: SubagentResult, heading: string, theme: Theme): void {\n\tcontainer.addChild(new Spacer(1));\n\tcontainer.addChild(new Text(heading, 0, 0));\n\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Task: \") + theme.fg(\"dim\", result.task), 0, 0));\n\tif (result.responseFormat) {\n\t\tcontainer.addChild(\n\t\t\tnew Text(theme.fg(\"muted\", \"Response format: \") + theme.fg(\"dim\", result.responseFormat), 0, 0),\n\t\t);\n\t}\n\tappendSubagentToolCalls(container, getDisplayItems(result.messages), theme);\n\tappendSubagentMarkdown(container, getFinalOutput(result.messages));\n\tappendSubagentUsage(container, result.usage, theme, result.model);\n}\n\nfunction renderExpandedSingleSubagent(result: SubagentResult, theme: Theme): Container {\n\tconst container = new Container();\n\tconst failed = isFailedResult(result);\n\tlet header = `${renderSubagentStatusIcon(result.status, theme)} ${theme.fg(\"toolTitle\", theme.bold(result.agent))}${theme.fg(\"muted\", ` (${result.agentSource})`)}${renderSubagentModel(result.model, theme)}`;\n\tif (failed && result.stopReason) header += ` ${theme.fg(\"error\", `[${result.stopReason}]`)}`;\n\tcontainer.addChild(new Text(header, 0, 0));\n\tif (failed && result.errorMessage) {\n\t\tcontainer.addChild(new Text(theme.fg(\"error\", `Error: ${result.errorMessage}`), 0, 0));\n\t}\n\tcontainer.addChild(new Spacer(1));\n\tcontainer.addChild(new Text(theme.fg(\"muted\", \"─── Task ───\"), 0, 0));\n\tcontainer.addChild(new Text(theme.fg(\"dim\", result.task), 0, 0));\n\tif (result.responseFormat) {\n\t\tcontainer.addChild(\n\t\t\tnew Text(theme.fg(\"muted\", \"Response format: \") + theme.fg(\"dim\", result.responseFormat), 0, 0),\n\t\t);\n\t}\n\tcontainer.addChild(new Spacer(1));\n\tcontainer.addChild(new Text(theme.fg(\"muted\", \"─── Output ───\"), 0, 0));\n\tconst displayItems = getDisplayItems(result.messages);\n\tconst finalOutput = getFinalOutput(result.messages);\n\tif (displayItems.length === 0 && !finalOutput) {\n\t\tcontainer.addChild(\n\t\t\tnew Text(theme.fg(\"muted\", result.status === \"running\" ? \"(running...)\" : \"(no output)\"), 0, 0),\n\t\t);\n\t} else {\n\t\tappendSubagentToolCalls(container, displayItems, theme);\n\t\tappendSubagentMarkdown(container, finalOutput);\n\t}\n\tappendSubagentUsage(container, result.usage, theme, result.model, \"\", true);\n\treturn container;\n}\n\nfunction renderCollapsedSingleSubagent(result: SubagentResult, theme: Theme): Text {\n\tconst failed = isFailedResult(result);\n\tconst displayItems = getDisplayItems(result.messages);\n\tlet text = `${renderSubagentStatusIcon(result.status, theme)} ${theme.fg(\"toolTitle\", theme.bold(result.agent))}${theme.fg(\"muted\", ` (${result.agentSource})`)}${renderSubagentModel(result.model, theme)}`;\n\tif (failed && result.stopReason) text += ` ${theme.fg(\"error\", `[${result.stopReason}]`)}`;\n\tif (failed && result.errorMessage) text += `\\n${theme.fg(\"error\", `Error: ${result.errorMessage}`)}`;\n\telse if (displayItems.length === 0) {\n\t\ttext += `\\n${theme.fg(\"muted\", result.status === \"running\" ? \"(running...)\" : \"(no output)\")}`;\n\t} else {\n\t\ttext += `\\n${renderSubagentDisplayItems(displayItems, false, theme, COLLAPSED_ITEM_COUNT)}`;\n\t\tif (displayItems.length > COLLAPSED_ITEM_COUNT) text += `\\n${theme.fg(\"muted\", \"(Ctrl+O to expand)\")}`;\n\t}\n\tconst usage = formatUsageStats(result.usage, result.model);\n\tif (usage) text += `\\n${theme.fg(\"dim\", usage)}`;\n\treturn new Text(text, 0, 0);\n}\n\nfunction renderSingleSubagentResult(result: SubagentResult, expanded: boolean, theme: Theme): Text | Container {\n\treturn expanded ? renderExpandedSingleSubagent(result, theme) : renderCollapsedSingleSubagent(result, theme);\n}\n\nfunction renderExpandedSubagentChain(\n\tresults: SubagentResult[],\n\tcounts: SubagentStatusCounts,\n\ticon: string,\n\ttheme: Theme,\n): Container {\n\tconst container = new Container();\n\tcontainer.addChild(\n\t\tnew Text(\n\t\t\ticon +\n\t\t\t\t\" \" +\n\t\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"chain \")) +\n\t\t\t\ttheme.fg(\"accent\", `${counts.completed}/${results.length} steps`),\n\t\t\t0,\n\t\t\t0,\n\t\t),\n\t);\n\tfor (const result of results) {\n\t\tconst heading = `${theme.fg(\"muted\", `─── Step ${result.step}: `) + theme.fg(\"accent\", result.agent)}${renderSubagentModel(result.model, theme)} ${renderSubagentStatusIcon(result.status, theme)}`;\n\t\tappendExpandedBatchResult(container, result, heading, theme);\n\t}\n\tappendSubagentUsage(container, aggregateSubagentUsage(results), theme, undefined, \"Total: \", true);\n\treturn container;\n}\n\nfunction renderCollapsedSubagentChain(\n\tresults: SubagentResult[],\n\tcounts: SubagentStatusCounts,\n\ticon: string,\n\ttheme: Theme,\n): Text {\n\tlet text =\n\t\ticon +\n\t\t\" \" +\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"chain \")) +\n\t\ttheme.fg(\"accent\", `${counts.completed}/${results.length} steps`);\n\tfor (const result of results) {\n\t\tconst items = getDisplayItems(result.messages);\n\t\ttext += `\\n\\n${theme.fg(\"muted\", `─── Step ${result.step}: `)}${theme.fg(\"accent\", result.agent)}${renderSubagentModel(result.model, theme)} ${renderSubagentStatusIcon(result.status, theme)}`;\n\t\tif (items.length === 0) {\n\t\t\tconst empty =\n\t\t\t\tresult.status === \"running\" || result.status === \"queued\" ? `(${result.status}...)` : \"(no output)\";\n\t\t\ttext += `\\n${theme.fg(\"muted\", empty)}`;\n\t\t} else text += `\\n${renderSubagentDisplayItems(items, false, theme, 5)}`;\n\t}\n\tconst usage = formatUsageStats(aggregateSubagentUsage(results));\n\tif (usage) text += `\\n\\n${theme.fg(\"dim\", `Total: ${usage}`)}`;\n\ttext += `\\n${theme.fg(\"muted\", \"(Ctrl+O to expand)\")}`;\n\treturn new Text(text, 0, 0);\n}\n\nfunction renderSubagentChain(results: SubagentResult[], expanded: boolean, theme: Theme): Text | Container {\n\tconst counts = countSubagentStatuses(results);\n\tconst icon =\n\t\tcounts.active > 0\n\t\t\t? theme.fg(\"warning\", \"[running]\")\n\t\t\t: counts.failed > 0\n\t\t\t\t? theme.fg(\"error\", \"[failed]\")\n\t\t\t\t: theme.fg(\"success\", \"[done]\");\n\treturn expanded\n\t\t? renderExpandedSubagentChain(results, counts, icon, theme)\n\t\t: renderCollapsedSubagentChain(results, counts, icon, theme);\n}\n\nfunction parallelSubagentStatus(counts: SubagentStatusCounts, total: number): string {\n\treturn counts.active > 0\n\t\t? `${counts.completed + counts.failed}/${total} done, ${counts.active} running`\n\t\t: `${counts.completed}/${total} tasks`;\n}\n\nfunction renderExpandedParallelSubagents(\n\tresults: SubagentResult[],\n\ticon: string,\n\tstatus: string,\n\ttheme: Theme,\n): Container {\n\tconst container = new Container();\n\tcontainer.addChild(\n\t\tnew Text(`${icon} ${theme.fg(\"toolTitle\", theme.bold(\"parallel \"))}${theme.fg(\"accent\", status)}`, 0, 0),\n\t);\n\tfor (const result of results) {\n\t\tconst heading = `${theme.fg(\"muted\", \"─── \") + theme.fg(\"accent\", result.agent)}${renderSubagentModel(result.model, theme)} ${renderSubagentStatusIcon(result.status, theme)}`;\n\t\tappendExpandedBatchResult(container, result, heading, theme);\n\t}\n\tappendSubagentUsage(container, aggregateSubagentUsage(results), theme, undefined, \"Total: \", true);\n\treturn container;\n}\n\nfunction renderCollapsedParallelSubagents(\n\tresults: SubagentResult[],\n\texpanded: boolean,\n\tcounts: SubagentStatusCounts,\n\ticon: string,\n\tstatus: string,\n\ttheme: Theme,\n): Text {\n\tlet text = `${icon} ${theme.fg(\"toolTitle\", theme.bold(\"parallel \"))}${theme.fg(\"accent\", status)}`;\n\tfor (const result of results) {\n\t\tconst items = getDisplayItems(result.messages);\n\t\ttext += `\\n\\n${theme.fg(\"muted\", \"─── \")}${theme.fg(\"accent\", result.agent)}${renderSubagentModel(result.model, theme)} ${renderSubagentStatusIcon(result.status, theme)}`;\n\t\tif (items.length === 0) {\n\t\t\tconst empty =\n\t\t\t\tresult.status === \"running\" || result.status === \"queued\" ? `(${result.status}...)` : \"(no output)\";\n\t\t\ttext += `\\n${theme.fg(\"muted\", empty)}`;\n\t\t} else text += `\\n${renderSubagentDisplayItems(items, expanded, theme, 5)}`;\n\t}\n\tif (counts.active === 0) {\n\t\tconst usage = formatUsageStats(aggregateSubagentUsage(results));\n\t\tif (usage) text += `\\n\\n${theme.fg(\"dim\", `Total: ${usage}`)}`;\n\t}\n\tif (!expanded) text += `\\n${theme.fg(\"muted\", \"(Ctrl+O to expand)\")}`;\n\treturn new Text(text, 0, 0);\n}\n\nfunction renderParallelSubagents(results: SubagentResult[], expanded: boolean, theme: Theme): Text | Container {\n\tconst counts = countSubagentStatuses(results);\n\tconst icon =\n\t\tcounts.active > 0\n\t\t\t? theme.fg(\"warning\", \"[running]\")\n\t\t\t: counts.failed > 0\n\t\t\t\t? theme.fg(\"warning\", \"[partial]\")\n\t\t\t\t: theme.fg(\"success\", \"[done]\");\n\tconst status = parallelSubagentStatus(counts, results.length);\n\treturn expanded && counts.active === 0\n\t\t? renderExpandedParallelSubagents(results, icon, status, theme)\n\t\t: renderCollapsedParallelSubagents(results, expanded, counts, icon, status, theme);\n}\n\nfunction renderSubagentFallback(result: AgentToolResult<SubagentDetails>): Text {\n\tconst content = result.content[0];\n\treturn new Text(content?.type === \"text\" ? content.text : \"(no output)\", 0, 0);\n}\n\nfunction renderSubagentResult(\n\tresult: AgentToolResult<SubagentDetails>,\n\texpanded: boolean,\n\ttheme: Theme,\n): Text | Container {\n\tconst details = result.details;\n\tif (!details || details.results.length === 0) return renderSubagentFallback(result);\n\tif (details.mode === \"single\" && details.results.length === 1) {\n\t\treturn renderSingleSubagentResult(details.results[0], expanded, theme);\n\t}\n\tif (details.mode === \"chain\") return renderSubagentChain(details.results, expanded, theme);\n\tif (details.mode === \"parallel\") return renderParallelSubagents(details.results, expanded, theme);\n\treturn renderSubagentFallback(result);\n}\n\nexport function createSubagentToolDefinition(\n\toptions: SubagentToolOptions = {},\n): ToolDefinition<typeof subagentParamsSchema, SubagentDetails> {\n\tconst runner = options.runner;\n\tconst parameters = options.modelCatalog ? createSubagentParamsSchema(options.modelCatalog) : subagentParamsSchema;\n\treturn {\n\t\tname: \"subagent\",\n\t\tlabel: \"Subagent\",\n\t\tdescription: [\n\t\t\t\"Delegate tasks to isolated subagent sessions with optional named presets.\",\n\t\t\t\"Modes: single (task), parallel (tasks array), chain (sequential with {previous} placeholder).\",\n\t\t\t\"Each task can specify responseFormat, systemPrompt, model, tools, cwd, and an optional agent preset.\",\n\t\t\t\"Omitted models inherit the parent model. Bundled presets: explore, worker, reviewer.\",\n\t\t\t'Default agent scope is \"user\"; project-local presets require host approval or trustProjectAgents in the host configuration.',\n\t\t].join(\" \"),\n\t\tpromptSnippet: \"Delegate tasks to specialized agents in isolated sessions\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use subagent for focused parallel investigation or when a task benefits from an isolated context window.\",\n\t\t\t\"Do not delegate trivial work that is faster to perform directly.\",\n\t\t],\n\t\tparameters,\n\n\t\tasync execute(_toolCallId, params, signal, onUpdate, ctx) {\n\t\t\tconst selection = selectSubagentMode(params);\n\t\t\tconst agentScope: AgentScope = params.agentScope ?? \"user\";\n\t\t\tconst workspaceOperations = ctx.toolOperations;\n\t\t\tif (!workspaceOperations) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Subagents require explicit workspace tool operations.\" }],\n\t\t\t\t\tdetails: { mode: selection.mode, agentScope, projectAgentsDir: null, results: [] },\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst backendInfo = workspaceOperations.getBackendInfo?.();\n\t\t\tif (backendInfo?.type === \"remote\" && !backendInfo.configured) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Subagents cannot run with an unconfigured remote backend.\" }],\n\t\t\t\t\tdetails: { mode: selection.mode, agentScope, projectAgentsDir: null, results: [] },\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst workspaceCwd = workspaceOperations.cwd ?? ctx.cwd;\n\t\t\tconst discovery = await discoverAgentsWithOperations(workspaceCwd, agentScope, workspaceOperations);\n\t\t\tconst agents = mergeSessionAgents(discovery.agents, options.configRegistry?.list() ?? []);\n\t\t\tconst makeDetails = createSubagentDetailsFactory(agentScope, discovery.projectAgentsDir);\n\t\t\tconst validationError = validateSubagentRequest(params, selection, agents, makeDetails);\n\t\t\tif (validationError) return validationError;\n\t\t\tif (!runner) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Subagent runner is not configured for this session.\" }],\n\t\t\t\t\tdetails: makeDetails(selection.mode)([]),\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst authorizationError = await authorizeProjectAgents(\n\t\t\t\tparams,\n\t\t\t\tagentScope,\n\t\t\t\tagents,\n\t\t\t\tdiscovery.projectAgentsDir,\n\t\t\t\toptions.trustProjectAgents,\n\t\t\t\tctx,\n\t\t\t\tmakeDetails,\n\t\t\t\tselection.mode,\n\t\t\t);\n\t\t\tif (authorizationError) return authorizationError;\n\t\t\treturn executeSelectedSubagentMode(params, selection, {\n\t\t\t\tagents,\n\t\t\t\tworkspaceCwd,\n\t\t\t\tworkspaceOperations,\n\t\t\t\tinheritedModel: inheritedSubagentModelName(ctx.model),\n\t\t\t\trunner,\n\t\t\t\tsignal,\n\t\t\t\tonUpdate,\n\t\t\t\tmakeDetails,\n\t\t\t\tresolveModelHintOption: options.resolveModelHint,\n\t\t\t});\n\t\t},\n\n\t\trenderCall(args, theme, _context) {\n\t\t\tconst scope: AgentScope = args.agentScope ?? \"user\";\n\t\t\tif (args.chain && args.chain.length > 0) return renderSubagentChainCall(args, scope, theme);\n\t\t\tif (args.tasks && args.tasks.length > 0) return renderParallelSubagentCall(args, scope, theme);\n\t\t\treturn renderSingleSubagentCall(args, scope, theme);\n\t\t},\n\n\t\trenderResult(result, { expanded }, theme, _context) {\n\t\t\treturn renderSubagentResult(result, expanded, theme);\n\t\t},\n\t};\n}\nexport function createSubagentRunsTool(\n\tregistry?: SubagentRunRegistry,\n): AgentTool<typeof subagentRunsParamsSchema, SubagentRunsDetails> {\n\treturn wrapToolDefinition(createSubagentRunsToolDefinition(registry));\n}\n\nexport function createCreateSubagentTool(\n\tregistry?: SubagentConfigRegistry,\n): AgentTool<typeof createSubagentConfigParamsSchema, CreateSubagentDetails> {\n\treturn wrapToolDefinition(createCreateSubagentToolDefinition(registry));\n}\n\nexport function createSubagentTool(\n\toptions?: SubagentToolOptions,\n): AgentTool<typeof subagentParamsSchema, SubagentDetails> {\n\treturn wrapToolDefinition(createSubagentToolDefinition(options));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent.ts"],"names":[],"mappings":"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"}
|