@schovest/pi-coding-agent 0.7.3
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 +142 -0
- package/README.md +686 -0
- package/dist/bun/cli.d.ts +3 -0
- package/dist/bun/cli.d.ts.map +1 -0
- package/dist/bun/cli.js +9 -0
- package/dist/bun/cli.js.map +1 -0
- package/dist/bun/register-bedrock.d.ts +2 -0
- package/dist/bun/register-bedrock.d.ts.map +1 -0
- package/dist/bun/register-bedrock.js +4 -0
- package/dist/bun/register-bedrock.js.map +1 -0
- package/dist/bun/restore-sandbox-env.d.ts +13 -0
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
- package/dist/bun/restore-sandbox-env.js +32 -0
- package/dist/bun/restore-sandbox-env.js.map +1 -0
- package/dist/cli/args.d.ts +57 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +381 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config-selector.d.ts +14 -0
- package/dist/cli/config-selector.d.ts.map +1 -0
- package/dist/cli/config-selector.js +31 -0
- package/dist/cli/config-selector.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +82 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/initial-message.d.ts +18 -0
- package/dist/cli/initial-message.d.ts.map +1 -0
- package/dist/cli/initial-message.js +22 -0
- package/dist/cli/initial-message.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +98 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/project-trust.d.ts +10 -0
- package/dist/cli/project-trust.d.ts.map +1 -0
- package/dist/cli/project-trust.js +48 -0
- package/dist/cli/project-trust.js.map +1 -0
- package/dist/cli/session-picker.d.ts +9 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +35 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli/startup-ui.d.ts +16 -0
- package/dist/cli/startup-ui.d.ts.map +1 -0
- package/dist/cli/startup-ui.js +112 -0
- package/dist/cli/startup-ui.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +18 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +92 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +433 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session-runtime.d.ts +119 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -0
- package/dist/core/agent-session-runtime.js +303 -0
- package/dist/core/agent-session-runtime.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +88 -0
- package/dist/core/agent-session-services.d.ts.map +1 -0
- package/dist/core/agent-session-services.js +119 -0
- package/dist/core/agent-session-services.js.map +1 -0
- package/dist/core/agent-session.d.ts +661 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +2758 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-guidance.d.ts +5 -0
- package/dist/core/auth-guidance.d.ts.map +1 -0
- package/dist/core/auth-guidance.js +21 -0
- package/dist/core/auth-guidance.js.map +1 -0
- package/dist/core/auth-storage.d.ts +141 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +443 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/background-process-manager.d.ts +52 -0
- package/dist/core/background-process-manager.d.ts.map +1 -0
- package/dist/core/background-process-manager.js +127 -0
- package/dist/core/background-process-manager.js.map +1 -0
- package/dist/core/bash-executor.d.ts +32 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +111 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/claude-plugin-manager.d.ts +110 -0
- package/dist/core/claude-plugin-manager.d.ts.map +1 -0
- package/dist/core/claude-plugin-manager.js +518 -0
- package/dist/core/claude-plugin-manager.js.map +1 -0
- package/dist/core/command-palette/command-palette-component.d.ts +24 -0
- package/dist/core/command-palette/command-palette-component.d.ts.map +1 -0
- package/dist/core/command-palette/command-palette-component.js +86 -0
- package/dist/core/command-palette/command-palette-component.js.map +1 -0
- package/dist/core/command-palette/command-palette-list.d.ts +16 -0
- package/dist/core/command-palette/command-palette-list.d.ts.map +1 -0
- package/dist/core/command-palette/command-palette-list.js +58 -0
- package/dist/core/command-palette/command-palette-list.js.map +1 -0
- package/dist/core/command-palette/command-registry.d.ts +9 -0
- package/dist/core/command-palette/command-registry.d.ts.map +1 -0
- package/dist/core/command-palette/command-registry.js +26 -0
- package/dist/core/command-palette/command-registry.js.map +1 -0
- package/dist/core/command-palette/index.d.ts +4 -0
- package/dist/core/command-palette/index.d.ts.map +1 -0
- package/dist/core/command-palette/index.js +3 -0
- package/dist/core/command-palette/index.js.map +1 -0
- package/dist/core/command-palette/types.d.ts +17 -0
- package/dist/core/command-palette/types.d.ts.map +1 -0
- package/dist/core/command-palette/types.js +2 -0
- package/dist/core/command-palette/types.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +90 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +250 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +121 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +622 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +38 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +153 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/defaults.d.ts +3 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +2 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +15 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +75 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/experimental.d.ts +2 -0
- package/dist/core/experimental.d.ts.map +1 -0
- package/dist/core/experimental.js +4 -0
- package/dist/core/experimental.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +249 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +37 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +226 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +1066 -0
- package/dist/core/export-html/template.html +55 -0
- package/dist/core/export-html/template.js +1864 -0
- package/dist/core/export-html/tool-renderer.d.ts +34 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +108 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +6 -0
- package/dist/core/extensions/index.d.ts +12 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +24 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +499 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +166 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +896 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +1209 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +45 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +20 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +22 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +54 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +338 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/http-dispatcher.d.ts +21 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -0
- package/dist/core/http-dispatcher.js +48 -0
- package/dist/core/http-dispatcher.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +363 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +303 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/messages.d.ts +77 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +123 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-registry.d.ts +161 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +810 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +111 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +513 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/output-guard.d.ts +7 -0
- package/dist/core/output-guard.d.ts.map +1 -0
- package/dist/core/output-guard.js +89 -0
- package/dist/core/output-guard.js.map +1 -0
- package/dist/core/package-manager.d.ts +207 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +2074 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/primary-agents/discovery.d.ts +4 -0
- package/dist/core/primary-agents/discovery.d.ts.map +1 -0
- package/dist/core/primary-agents/discovery.js +89 -0
- package/dist/core/primary-agents/discovery.js.map +1 -0
- package/dist/core/primary-agents/index.d.ts +3 -0
- package/dist/core/primary-agents/index.d.ts.map +1 -0
- package/dist/core/primary-agents/index.js +2 -0
- package/dist/core/primary-agents/index.js.map +1 -0
- package/dist/core/primary-agents/types.d.ts +18 -0
- package/dist/core/primary-agents/types.d.ts.map +1 -0
- package/dist/core/primary-agents/types.js +2 -0
- package/dist/core/primary-agents/types.js.map +1 -0
- package/dist/core/project-trust.d.ts +15 -0
- package/dist/core/project-trust.d.ts.map +1 -0
- package/dist/core/project-trust.js +58 -0
- package/dist/core/project-trust.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +53 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +236 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/provider-attribution.d.ts +4 -0
- package/dist/core/provider-attribution.d.ts.map +1 -0
- package/dist/core/provider-attribution.js +72 -0
- package/dist/core/provider-attribution.js.map +1 -0
- package/dist/core/provider-display-names.d.ts +2 -0
- package/dist/core/provider-display-names.d.ts.map +1 -0
- package/dist/core/provider-display-names.js +36 -0
- package/dist/core/provider-display-names.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +31 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +249 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +206 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +827 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/sdk.d.ts +111 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +269 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-cwd.d.ts +19 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +38 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-manager.d.ts +362 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +1283 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +309 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +907 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +60 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +387 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +14 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +30 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/source-info.d.ts +18 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +19 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/subagents/discovery.d.ts +9 -0
- package/dist/core/subagents/discovery.d.ts.map +1 -0
- package/dist/core/subagents/discovery.js +97 -0
- package/dist/core/subagents/discovery.js.map +1 -0
- package/dist/core/subagents/index.d.ts +5 -0
- package/dist/core/subagents/index.d.ts.map +1 -0
- package/dist/core/subagents/index.js +4 -0
- package/dist/core/subagents/index.js.map +1 -0
- package/dist/core/subagents/runner.d.ts +6 -0
- package/dist/core/subagents/runner.d.ts.map +1 -0
- package/dist/core/subagents/runner.js +406 -0
- package/dist/core/subagents/runner.js.map +1 -0
- package/dist/core/subagents/tool.d.ts +24 -0
- package/dist/core/subagents/tool.d.ts.map +1 -0
- package/dist/core/subagents/tool.js +223 -0
- package/dist/core/subagents/tool.js.map +1 -0
- package/dist/core/subagents/types.d.ts +78 -0
- package/dist/core/subagents/types.d.ts.map +1 -0
- package/dist/core/subagents/types.js +2 -0
- package/dist/core/subagents/types.js.map +1 -0
- package/dist/core/system-prompt.d.ts +30 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +121 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/telemetry.d.ts +3 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +9 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/core/timings.d.ts +8 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +31 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tool-matcher.d.ts +27 -0
- package/dist/core/tool-matcher.d.ts.map +1 -0
- package/dist/core/tool-matcher.js +43 -0
- package/dist/core/tool-matcher.js.map +1 -0
- package/dist/core/tools/bash.d.ts +83 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +380 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +87 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +345 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +51 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +284 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +52 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +35 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +297 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +37 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +304 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +40 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +112 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +37 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +167 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/output-accumulator.d.ts +52 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -0
- package/dist/core/tools/output-accumulator.js +184 -0
- package/dist/core/tools/output-accumulator.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +10 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +99 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +35 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +289 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/render-utils.d.ts +24 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +65 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.js +34 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +70 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +215 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +26 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +197 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/core/trust-manager.d.ts +31 -0
- package/dist/core/trust-manager.d.ts.map +1 -0
- package/dist/core/trust-manager.js +187 -0
- package/dist/core/trust-manager.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +12 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +665 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +33 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +403 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +9 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/assets/clankolas.png +0 -0
- package/dist/modes/interactive/components/agent-selector.d.ts +21 -0
- package/dist/modes/interactive/components/agent-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/agent-selector.js +85 -0
- package/dist/modes/interactive/components/agent-selector.js.map +1 -0
- package/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +333 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +20 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +121 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/background-process-selector.d.ts +40 -0
- package/dist/modes/interactive/components/background-process-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/background-process-selector.js +187 -0
- package/dist/modes/interactive/components/background-process-selector.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +175 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +54 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +44 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +71 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +506 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +76 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +20 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +79 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
- package/dist/modes/interactive/components/daxnuts.js +140 -0
- package/dist/modes/interactive/components/daxnuts.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +133 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +21 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.js +40 -0
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +119 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +23 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-input.js +61 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +83 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
- package/dist/modes/interactive/components/first-time-setup.js +103 -0
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +28 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +231 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +34 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +35 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +36 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +180 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +47 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +278 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +31 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +165 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/plugin-manager.d.ts +67 -0
- package/dist/modes/interactive/components/plugin-manager.d.ts.map +1 -0
- package/dist/modes/interactive/components/plugin-manager.js +443 -0
- package/dist/modes/interactive/components/plugin-manager.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +290 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +155 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +96 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +861 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +71 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +410 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +39 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/subagent-details.d.ts +63 -0
- package/dist/modes/interactive/components/subagent-details.d.ts.map +1 -0
- package/dist/modes/interactive/components/subagent-details.js +360 -0
- package/dist/modes/interactive/components/subagent-details.js.map +1 -0
- package/dist/modes/interactive/components/subagent-overlay.d.ts +51 -0
- package/dist/modes/interactive/components/subagent-overlay.d.ts.map +1 -0
- package/dist/modes/interactive/components/subagent-overlay.js +324 -0
- package/dist/modes/interactive/components/subagent-overlay.js.map +1 -0
- package/dist/modes/interactive/components/subagents-panel.d.ts +23 -0
- package/dist/modes/interactive/components/subagents-panel.d.ts.map +1 -0
- package/dist/modes/interactive/components/subagents-panel.js +192 -0
- package/dist/modes/interactive/components/subagents-panel.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +50 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +51 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +63 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +317 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +89 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +1093 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/trust-selector.js +91 -0
- package/dist/modes/interactive/components/trust-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +114 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +10 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +29 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +417 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +5518 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +86 -0
- package/dist/modes/interactive/theme/light.json +85 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.d.ts +100 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +1034 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/print-mode.d.ts +28 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +132 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +49 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +227 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +467 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +616 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +420 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/package-manager-cli.d.ts +9 -0
- package/dist/package-manager-cli.d.ts.map +1 -0
- package/dist/package-manager-cli.js +764 -0
- package/dist/package-manager-cli.js.map +1 -0
- package/dist/utils/ansi.d.ts +2 -0
- package/dist/utils/ansi.d.ts.map +1 -0
- package/dist/utils/ansi.js +52 -0
- package/dist/utils/ansi.js.map +1 -0
- package/dist/utils/changelog.d.ts +22 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +165 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/child-process.d.ts +15 -0
- package/dist/utils/child-process.d.ts.map +1 -0
- package/dist/utils/child-process.js +88 -0
- package/dist/utils/child-process.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +245 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard-native.d.ts +10 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -0
- package/dist/utils/clipboard-native.js +20 -0
- package/dist/utils/clipboard-native.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +117 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/deprecation.d.ts +4 -0
- package/dist/utils/deprecation.d.ts.map +1 -0
- package/dist/utils/deprecation.js +13 -0
- package/dist/utils/deprecation.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts +5 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -0
- package/dist/utils/exif-orientation.js +158 -0
- package/dist/utils/exif-orientation.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +26 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/fs-watch.d.ts +5 -0
- package/dist/utils/fs-watch.d.ts.map +1 -0
- package/dist/utils/fs-watch.js +25 -0
- package/dist/utils/fs-watch.js.map +1 -0
- package/dist/utils/git.d.ts +26 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +195 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/html.d.ts +7 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +40 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/image-convert.d.ts +9 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +39 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-resize-core.d.ts +30 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -0
- package/dist/utils/image-resize-core.js +124 -0
- package/dist/utils/image-resize-core.js.map +1 -0
- package/dist/utils/image-resize-worker.d.ts +2 -0
- package/dist/utils/image-resize-worker.d.ts.map +1 -0
- package/dist/utils/image-resize-worker.js +31 -0
- package/dist/utils/image-resize-worker.js.map +1 -0
- package/dist/utils/image-resize.d.ts +16 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +97 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +7 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/mime.d.ts +3 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +69 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/open-browser.d.ts +9 -0
- package/dist/utils/open-browser.d.ts.map +1 -0
- package/dist/utils/open-browser.js +22 -0
- package/dist/utils/open-browser.js.map +1 -0
- package/dist/utils/paths.d.ts +31 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +92 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/photon.d.ts +21 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +121 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/pi-user-agent.d.ts +2 -0
- package/dist/utils/pi-user-agent.d.ts.map +1 -0
- package/dist/utils/pi-user-agent.js +5 -0
- package/dist/utils/pi-user-agent.js.map +1 -0
- package/dist/utils/shell.d.ts +30 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +195 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/syntax-highlight.d.ts +12 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/utils/syntax-highlight.js +118 -0
- package/dist/utils/syntax-highlight.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +3 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +328 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/dist/utils/version-check.d.ts +15 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +82 -0
- package/dist/utils/version-check.js.map +1 -0
- package/dist/utils/windows-self-update.d.ts +3 -0
- package/dist/utils/windows-self-update.d.ts.map +1 -0
- package/dist/utils/windows-self-update.js +77 -0
- package/dist/utils/windows-self-update.js.map +1 -0
- package/docs/compaction.md +394 -0
- package/docs/containerization.md +111 -0
- package/docs/custom-provider.md +736 -0
- package/docs/development.md +71 -0
- package/docs/docs.json +172 -0
- package/docs/extensions.md +2657 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/index.md +86 -0
- package/docs/json.md +82 -0
- package/docs/keybindings.md +199 -0
- package/docs/mcp.md +476 -0
- package/docs/models.md +604 -0
- package/docs/packages.md +228 -0
- package/docs/plugins.md +48 -0
- package/docs/primary-agents.md +272 -0
- package/docs/prompt-templates.md +95 -0
- package/docs/providers.md +256 -0
- package/docs/quickstart.md +165 -0
- package/docs/rpc.md +1408 -0
- package/docs/sdk.md +1161 -0
- package/docs/security.md +55 -0
- package/docs/session-format.md +412 -0
- package/docs/sessions.md +145 -0
- package/docs/settings.md +317 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +231 -0
- package/docs/subagents.md +334 -0
- package/docs/terminal-setup.md +148 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +295 -0
- package/docs/tmux.md +63 -0
- package/docs/tui.md +927 -0
- package/docs/usage.md +328 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +25 -0
- package/examples/extensions/README.md +211 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/border-status-editor.ts +150 -0
- package/examples/extensions/built-in-tool-renderer.ts +249 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +72 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +127 -0
- package/examples/extensions/custom-footer.ts +64 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +400 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +132 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +15 -0
- package/examples/extensions/dynamic-tools.ts +74 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/git-merge-and-resolve.ts +115 -0
- package/examples/extensions/github-issue-autocomplete.ts +185 -0
- package/examples/extensions/gondolin/index.ts +531 -0
- package/examples/extensions/gondolin/package-lock.json +185 -0
- package/examples/extensions/gondolin/package.json +19 -0
- package/examples/extensions/handoff.ts +191 -0
- package/examples/extensions/hello.ts +26 -0
- package/examples/extensions/hidden-thinking-label.ts +53 -0
- package/examples/extensions/inline-bash.ts +94 -0
- package/examples/extensions/input-transform-streaming.ts +39 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +426 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +1450 -0
- package/examples/extensions/overlay-test.ts +153 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/preset.ts +430 -0
- package/examples/extensions/project-trust.ts +64 -0
- package/examples/extensions/prompt-customizer.ts +97 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/provider-payload.ts +18 -0
- package/examples/extensions/qna.ts +122 -0
- package/examples/extensions/question.ts +264 -0
- package/examples/extensions/questionnaire.ts +427 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/rpc-demo.ts +118 -0
- package/examples/extensions/sandbox/index.ts +321 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/space-invaders.ts +560 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +32 -0
- package/examples/extensions/structured-output.ts +65 -0
- package/examples/extensions/subagent/README.md +175 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +126 -0
- package/examples/extensions/subagent/index.ts +1009 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +206 -0
- package/examples/extensions/system-prompt-header.ts +17 -0
- package/examples/extensions/tic-tac-toe.ts +1008 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -0
- package/examples/extensions/todo.ts +297 -0
- package/examples/extensions/tool-override.ts +144 -0
- package/examples/extensions/tools.ts +146 -0
- package/examples/extensions/trigger-compact.ts +50 -0
- package/examples/extensions/truncated-tool.ts +195 -0
- package/examples/extensions/widget-placement.ts +9 -0
- package/examples/extensions/with-deps/index.ts +32 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/extensions/working-indicator.ts +123 -0
- package/examples/extensions/working-message-test.ts +25 -0
- package/examples/rpc-extension-ui.ts +632 -0
- package/examples/sdk/01-minimal.ts +26 -0
- package/examples/sdk/02-custom-model.ts +53 -0
- package/examples/sdk/03-custom-prompt.ts +70 -0
- package/examples/sdk/04-skills.ts +55 -0
- package/examples/sdk/05-tools.ts +48 -0
- package/examples/sdk/06-extensions.ts +94 -0
- package/examples/sdk/07-context-files.ts +42 -0
- package/examples/sdk/08-prompt-templates.ts +51 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +52 -0
- package/examples/sdk/10-settings.ts +53 -0
- package/examples/sdk/11-sessions.ts +52 -0
- package/examples/sdk/12-full-control.ts +77 -0
- package/examples/sdk/13-session-runtime.ts +67 -0
- package/examples/sdk/README.md +144 -0
- package/npm-shrinkwrap.json +1806 -0
- package/package.json +96 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/core/subagents/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@schovest/pi-agent-core\";\nimport type { Model, Usage } from \"@schovest/pi-ai\";\nimport { clampThinkingLevel, modelsAreEqual } from \"@schovest/pi-ai\";\nimport type { AgentSession } from \"../agent-session.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"../defaults.ts\";\nimport { resolveActiveSkills, resolveActiveTools } from \"../tool-matcher.ts\";\nimport { discoverSubagents } from \"./discovery.ts\";\nimport type {\n\tSubagentDefinition,\n\tSubagentRunEvent,\n\tSubagentRunOptions,\n\tSubagentRunRequest,\n\tSubagentRunResult,\n\tSubagentTask,\n\tSubagentTaskResult,\n} from \"./types.ts\";\n\nconst MAX_PARALLEL_TASKS = 8;\nconst PARALLEL_CONCURRENCY = 4;\n\ninterface ResolvedTask {\n\tindex: number;\n\tdefinition: SubagentDefinition;\n\ttask: SubagentTask;\n\ttitle: string;\n\tmodel: Model<any>;\n\tthinking: ThinkingLevel;\n\ttools: string[];\n\tskills: string[];\n\tprompt: string;\n}\n\nfunction textFromMessage(message: AgentMessage): string {\n\tif (message.role !== \"assistant\") {\n\t\treturn \"\";\n\t}\n\treturn message.content\n\t\t.filter((part) => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\nfunction lastAssistantText(messages: AgentMessage[]): string {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst text = textFromMessage(messages[index]);\n\t\tif (text) {\n\t\t\treturn text;\n\t\t}\n\t}\n\treturn \"\";\n}\n\nfunction lastAssistantError(messages: AgentMessage[]): string | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst message = messages[index];\n\t\tif (message.role === \"assistant\" && message.errorMessage) {\n\t\t\treturn message.errorMessage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction usageFromMessages(messages: AgentMessage[]): Usage | undefined {\n\tlet aggregate: Usage | undefined;\n\tfor (const message of messages) {\n\t\tif (message.role !== \"assistant\") continue;\n\t\tconst usage = message.usage;\n\t\tif (!usage) continue;\n\t\tif (!aggregate) {\n\t\t\taggregate = {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t};\n\t\t}\n\t\taggregate.input += usage.input;\n\t\taggregate.output += usage.output;\n\t\taggregate.cacheRead += usage.cacheRead;\n\t\taggregate.cacheWrite += usage.cacheWrite;\n\t\taggregate.totalTokens += usage.totalTokens;\n\t\taggregate.cost.input += usage.cost.input;\n\t\taggregate.cost.output += usage.cost.output;\n\t\taggregate.cost.cacheRead += usage.cost.cacheRead;\n\t\taggregate.cost.cacheWrite += usage.cost.cacheWrite;\n\t\taggregate.cost.total += usage.cost.total;\n\t}\n\treturn aggregate;\n}\n\nfunction formatModel(model: Model<any>): string {\n\treturn `${model.provider}/${model.id}`;\n}\n\nfunction resolveModel(session: AgentSession, requested: string | undefined): Model<any> {\n\tif (requested) {\n\t\tconst slashIndex = requested.indexOf(\"/\");\n\t\tconst model =\n\t\t\tslashIndex === -1\n\t\t\t\t? session.modelRegistry.getAll().find((candidate) => candidate.id === requested)\n\t\t\t\t: session.modelRegistry.find(requested.slice(0, slashIndex), requested.slice(slashIndex + 1));\n\t\tif (!model) {\n\t\t\tthrow new Error(`Unknown subagent model: ${requested}`);\n\t\t}\n\t\treturn model;\n\t}\n\n\tconst defaultProvider = session.settingsManager.getDefaultProvider();\n\tconst defaultModel = session.settingsManager.getDefaultModel();\n\tif (defaultProvider && defaultModel) {\n\t\tconst model = session.modelRegistry.find(defaultProvider, defaultModel);\n\t\tif (model && session.modelRegistry.hasConfiguredAuth(model)) {\n\t\t\treturn model;\n\t\t}\n\t}\n\n\tif (!session.model) {\n\t\tthrow new Error(\"No model selected for subagent run\");\n\t}\n\treturn session.model;\n}\n\nfunction resolveThinking(\n\tsession: AgentSession,\n\tmodel: Model<any>,\n\ttask: SubagentTask,\n\tdefinition: SubagentDefinition,\n): ThinkingLevel {\n\tconst requested =\n\t\ttask.thinking ??\n\t\tdefinition.thinking ??\n\t\tsession.settingsManager.getDefaultThinkingLevel() ??\n\t\tDEFAULT_THINKING_LEVEL;\n\treturn clampThinkingLevel(model, requested) as ThinkingLevel;\n}\n\nfunction buildPrompt(definition: SubagentDefinition, task: string): string {\n\treturn [`You are the \"${definition.name}\" subagent.`, definition.prompt, `Task:\\n${task}`].join(\"\\n\\n\");\n}\n\nasync function resolveTask(\n\tsession: AgentSession,\n\tdefinitions: Map<string, SubagentDefinition>,\n\ttask: SubagentTask,\n\tindex: number,\n\tallToolNames: string[],\n): Promise<ResolvedTask | SubagentTaskResult> {\n\tconst definition = definitions.get(task.agent);\n\tif (!definition) {\n\t\tconst available = [...definitions.keys()].join(\", \");\n\t\treturn {\n\t\t\tindex,\n\t\t\tagent: task.agent,\n\t\t\ttask: task.task,\n\t\t\ttitle: task.title,\n\t\t\tstatus: \"failed\",\n\t\t\toutput: \"\",\n\t\t\terror: `Unknown subagent: ${task.agent}. Available: ${available}`,\n\t\t\tmessages: [],\n\t\t\tevents: [],\n\t\t};\n\t}\n\ttry {\n\t\tconst model = resolveModel(session, task.model ?? definition.model);\n\t\tconst thinking = resolveThinking(session, model, task, definition);\n\t\tconst includedTools = task.includedTools ?? definition.includedTools;\n\t\tconst excludedTools = task.excludedTools ?? definition.excludedTools;\n\t\tconst skillsPatterns = task.skills ?? definition.skills;\n\t\tconst resolvedTools = resolveActiveTools(allToolNames, includedTools, excludedTools, [\n\t\t\t\"read\",\n\t\t\t\"bash\",\n\t\t\t\"edit\",\n\t\t\t\"write\",\n\t\t]);\n\t\treturn {\n\t\t\tindex,\n\t\t\tdefinition,\n\t\t\ttask,\n\t\t\ttitle: task.title,\n\t\t\tmodel,\n\t\t\tthinking,\n\t\t\ttools: resolvedTools,\n\t\t\tskills: skillsPatterns ?? [],\n\t\t\tprompt: buildPrompt(definition, task.task),\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tindex,\n\t\t\tagent: definition.name,\n\t\t\ttask: task.task,\n\t\t\ttitle: task.title,\n\t\t\tstatus: \"failed\",\n\t\t\toutput: \"\",\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\tmessages: [],\n\t\t\tevents: [],\n\t\t};\n\t}\n}\n\nfunction createEvent(\n\trunId: string,\n\tresolved: ResolvedTask,\n\tstatus: SubagentRunEvent[\"status\"],\n\toverrides: Partial<SubagentRunEvent> = {},\n): SubagentRunEvent {\n\treturn {\n\t\trunId,\n\t\tindex: resolved.index,\n\t\tagent: resolved.definition.name,\n\t\ttask: resolved.task.task,\n\t\ttitle: resolved.title,\n\t\tstatus,\n\t\tmodel: formatModel(resolved.model),\n\t\tthinking: resolved.thinking,\n\t\ttimestamp: Date.now(),\n\t\t...overrides,\n\t};\n}\n\nfunction summarizeUnknown(value: unknown, maxLength = 240): string | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\tconst text = typeof value === \"string\" ? value : JSON.stringify(value);\n\t\treturn text.length > maxLength ? `${text.slice(0, maxLength - 1)}…` : text;\n\t} catch {\n\t\treturn String(value);\n\t}\n}\n\nfunction textFromToolResult(result: unknown): string | undefined {\n\tif (!result || typeof result !== \"object\" || !(\"content\" in result)) {\n\t\treturn undefined;\n\t}\n\tconst content = (result as { content?: unknown }).content;\n\tif (!Array.isArray(content)) {\n\t\treturn undefined;\n\t}\n\tconst text = content\n\t\t.flatMap((part) => {\n\t\t\tif (!part || typeof part !== \"object\") {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst candidate = part as { type?: unknown; text?: unknown };\n\t\t\treturn candidate.type === \"text\" && typeof candidate.text === \"string\" ? [candidate.text] : [];\n\t\t})\n\t\t.join(\"\\n\");\n\treturn summarizeUnknown(text);\n}\n\nfunction countToolCalls(events: SubagentRunEvent[]): number {\n\treturn events.filter((e) => e.currentTool && e.currentToolArgs).length;\n}\n\nasync function runOne(\n\tsession: AgentSession,\n\trunId: string,\n\tresolved: ResolvedTask,\n\toptions: SubagentRunOptions,\n): Promise<SubagentTaskResult> {\n\tconst events: SubagentRunEvent[] = [];\n\tconst emit = (event: SubagentRunEvent): void => {\n\t\tevents.push(event);\n\t\tsession.recordSubagentRunEvent(event);\n\t\toptions.onEvent?.(event, child);\n\t};\n\n\tconst allSkills = session.resourceLoader.getSkills().skills;\n\tconst resolvedSkills = resolveActiveSkills(allSkills, resolved.skills.length > 0 ? resolved.skills : undefined);\n\n\tconst child = session.createSubagentChildSession({\n\t\tmodel: resolved.model,\n\t\tthinkingLevel: resolved.thinking,\n\t\ttools: resolved.tools,\n\t\tskills: resolvedSkills,\n\t});\n\tconst unsubscribe = child.subscribe((event) => {\n\t\tif (event.type === \"tool_execution_start\" || event.type === \"tool_execution_update\") {\n\t\t\temit(\n\t\t\t\tcreateEvent(runId, resolved, \"running\", {\n\t\t\t\t\tcurrentTool: event.toolName,\n\t\t\t\t\tcurrentToolArgs: summarizeUnknown(event.args),\n\t\t\t\t}),\n\t\t\t);\n\t\t} else if (event.type === \"tool_execution_end\") {\n\t\t\temit(\n\t\t\t\tcreateEvent(runId, resolved, \"running\", {\n\t\t\t\t\tcurrentTool: event.toolName,\n\t\t\t\t\ttoolResultSummary: textFromToolResult(event.result),\n\t\t\t\t\terror: event.isError ? textFromToolResult(event.result) : undefined,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else if (event.type === \"message_update\" && event.message.role === \"assistant\") {\n\t\t\tconst outputSummary = textFromMessage(event.message).slice(0, 240);\n\t\t\tif (outputSummary) {\n\t\t\t\temit(createEvent(runId, resolved, \"running\", { outputSummary }));\n\t\t\t}\n\t\t} else if (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\tconst outputSummary = textFromMessage(event.message).slice(0, 240);\n\t\t\temit(\n\t\t\t\tcreateEvent(runId, resolved, \"running\", {\n\t\t\t\t\toutputSummary: outputSummary || undefined,\n\t\t\t\t\tusage: event.message.usage,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t});\n\tconst abortChild = (): void => {\n\t\tvoid child.abort();\n\t};\n\toptions.signal?.addEventListener(\"abort\", abortChild, { once: true });\n\n\temit(createEvent(runId, resolved, \"running\"));\n\ttry {\n\t\tif (options.signal?.aborted) {\n\t\t\tawait child.abort();\n\t\t} else {\n\t\t\tawait child.prompt(resolved.prompt, { expandPromptTemplates: false });\n\t\t}\n\n\t\tconst messages = [...child.messages];\n\t\tconst usage = usageFromMessages(messages);\n\t\tconst error = lastAssistantError(messages);\n\t\tconst output = lastAssistantText(messages);\n\t\tconst status = options.signal?.aborted ? \"aborted\" : error ? \"failed\" : \"success\";\n\t\temit(\n\t\t\tcreateEvent(runId, resolved, status, {\n\t\t\t\tusage,\n\t\t\t\terror,\n\t\t\t\toutputSummary: output.slice(0, 240),\n\t\t\t}),\n\t\t);\n\n\t\t// Write a reference entry in the parent session, then inline the messages\n\t\tconst subagentEntryId = session.sessionManager.appendSubagentRunEntry({\n\t\t\trunId,\n\t\t\tindex: resolved.index,\n\t\t\tagent: resolved.definition.name,\n\t\t\ttask: resolved.task.task,\n\t\t\ttitle: resolved.title,\n\t\t\tstatus,\n\t\t\tmodel: formatModel(resolved.model),\n\t\t\tthinking: resolved.thinking,\n\t\t\ttotalTokens: usage?.totalTokens,\n\t\t\ttoolCount: countToolCalls(events),\n\t\t\toutputSummary: output.slice(0, 240) || undefined,\n\t\t\terror,\n\t\t});\n\t\tsession.sessionManager.appendSubagentMessages(subagentEntryId, messages);\n\n\t\treturn {\n\t\t\tindex: resolved.index,\n\t\t\tagent: resolved.definition.name,\n\t\t\ttask: resolved.task.task,\n\t\t\ttitle: resolved.title,\n\t\t\tstatus,\n\t\t\toutput,\n\t\t\tmodel: formatModel(resolved.model),\n\t\t\tthinking: resolved.thinking,\n\t\t\tusage,\n\t\t\terror,\n\t\t\tmessages,\n\t\t\tevents,\n\t\t};\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconst status = options.signal?.aborted ? \"aborted\" : \"failed\";\n\t\temit(createEvent(runId, resolved, status, { error: message }));\n\n\t\t// Write a reference entry in the parent session for failed/aborted runs, then inline the messages\n\t\tconst subagentEntryId = session.sessionManager.appendSubagentRunEntry({\n\t\t\trunId,\n\t\t\tindex: resolved.index,\n\t\t\tagent: resolved.definition.name,\n\t\t\ttask: resolved.task.task,\n\t\t\ttitle: resolved.title,\n\t\t\tstatus,\n\t\t\tmodel: formatModel(resolved.model),\n\t\t\tthinking: resolved.thinking,\n\t\t\ttoolCount: countToolCalls(events),\n\t\t\terror: message,\n\t\t});\n\t\tsession.sessionManager.appendSubagentMessages(subagentEntryId, [...child.messages]);\n\n\t\treturn {\n\t\t\tindex: resolved.index,\n\t\t\tagent: resolved.definition.name,\n\t\t\ttask: resolved.task.task,\n\t\t\ttitle: resolved.title,\n\t\t\tstatus,\n\t\t\toutput: \"\",\n\t\t\tmodel: formatModel(resolved.model),\n\t\t\tthinking: resolved.thinking,\n\t\t\terror: message,\n\t\t\tmessages: [...child.messages],\n\t\t\tevents,\n\t\t};\n\t} finally {\n\t\toptions.signal?.removeEventListener(\"abort\", abortChild);\n\t\tunsubscribe();\n\t\tchild.dispose();\n\t}\n}\n\nasync function runWithConcurrency<T>(items: T[], concurrency: number, run: (item: T) => Promise<void>): Promise<void> {\n\tlet nextIndex = 0;\n\tconst workers = Array.from({ length: Math.min(concurrency, items.length) }, async () => {\n\t\tfor (;;) {\n\t\t\tconst item = items[nextIndex];\n\t\t\tnextIndex++;\n\t\t\tif (!item) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait run(item);\n\t\t}\n\t});\n\tawait Promise.all(workers);\n}\n\nfunction aggregateResultUsage(results: SubagentTaskResult[]): Usage | undefined {\n\treturn usageFromMessages(results.flatMap((result) => result.messages));\n}\n\nexport async function runSubagents(\n\tsession: AgentSession,\n\trequest: SubagentRunRequest,\n\toptions: SubagentRunOptions = {},\n): Promise<SubagentRunResult> {\n\tconst mode: \"parallel\" | \"chain\" = \"chain\" in request ? \"chain\" : \"parallel\";\n\tconst tasks = \"chain\" in request ? request.chain : request.tasks;\n\n\tif (tasks.length > MAX_PARALLEL_TASKS) {\n\t\tthrow new Error(`subagent runs support at most ${MAX_PARALLEL_TASKS} tasks`);\n\t}\n\n\tconst definitions = new Map(\n\t\t(\n\t\t\tawait discoverSubagents({\n\t\t\t\tcwd: session.cwd,\n\t\t\t\tagentDir: options.agentDir ?? session.agentDir,\n\t\t\t\tscope: request.subagentScope ?? \"both\",\n\t\t\t})\n\t\t).map((definition) => [definition.name, definition]),\n\t);\n\n\tconst allToolNames = session.getAllToolNames();\n\tconst runId = `subagent:${Date.now()}:${Math.random().toString(36).slice(2)}`;\n\tlet results: SubagentTaskResult[];\n\n\tif (mode === \"chain\") {\n\t\tresults = [];\n\t\tfor (let index = 0; index < tasks.length; index++) {\n\t\t\tconst previous = results.at(-1)?.output ?? \"\";\n\t\t\tconst task = { ...tasks[index], task: tasks[index].task.replaceAll(\"{previous}\", previous) };\n\t\t\tconst resolved = await resolveTask(session, definitions, task, index, allToolNames);\n\t\t\tif (\"status\" in resolved) {\n\t\t\t\tresults.push(resolved);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst result = await runOne(session, runId, resolved, options);\n\t\t\tresults.push(result);\n\t\t\tif (result.status !== \"success\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconst resolvedTasks = await Promise.all(\n\t\t\ttasks.map((task, index) => resolveTask(session, definitions, task, index, allToolNames)),\n\t\t);\n\t\tresults = new Array<SubagentTaskResult>(resolvedTasks.length);\n\t\tawait runWithConcurrency(resolvedTasks, PARALLEL_CONCURRENCY, async (resolved) => {\n\t\t\tif (\"status\" in resolved) {\n\t\t\t\tresults[resolved.index] = resolved;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresults[resolved.index] = await runOne(session, runId, resolved, options);\n\t\t});\n\t}\n\n\treturn {\n\t\tmode,\n\t\tresults,\n\t\tusage: aggregateResultUsage(results),\n\t};\n}\n\nexport function modelMatches(a: Model<any> | undefined, b: Model<any> | undefined): boolean {\n\treturn !!a && !!b && modelsAreEqual(a, b);\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import type { AgentSession } from "../agent-session.ts";
|
|
3
|
+
export declare function createSubagentToolDefinition(session: AgentSession): import("../extensions/types.ts").ToolDefinition<Type.TObject<{
|
|
4
|
+
tasks: Type.TOptional<Type.TArray<Type.TObject<{
|
|
5
|
+
agent: Type.TString;
|
|
6
|
+
task: Type.TString;
|
|
7
|
+
title: Type.TString;
|
|
8
|
+
model: Type.TOptional<Type.TString>;
|
|
9
|
+
thinking: Type.TOptional<Type.TUnion<[Type.TLiteral<"off">, Type.TLiteral<"minimal">, Type.TLiteral<"low">, Type.TLiteral<"medium">, Type.TLiteral<"high">, Type.TLiteral<"xhigh">]>>;
|
|
10
|
+
includedTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
11
|
+
excludedTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
12
|
+
}>>>;
|
|
13
|
+
chain: Type.TOptional<Type.TArray<Type.TObject<{
|
|
14
|
+
agent: Type.TString;
|
|
15
|
+
task: Type.TString;
|
|
16
|
+
title: Type.TString;
|
|
17
|
+
model: Type.TOptional<Type.TString>;
|
|
18
|
+
thinking: Type.TOptional<Type.TUnion<[Type.TLiteral<"off">, Type.TLiteral<"minimal">, Type.TLiteral<"low">, Type.TLiteral<"medium">, Type.TLiteral<"high">, Type.TLiteral<"xhigh">]>>;
|
|
19
|
+
includedTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
20
|
+
excludedTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
21
|
+
}>>>;
|
|
22
|
+
subagentScope: Type.TOptional<Type.TUnion<[Type.TLiteral<"user">, Type.TLiteral<"project">, Type.TLiteral<"both">]>>;
|
|
23
|
+
}>, unknown, any> & import("../extensions/types.ts").ToolDefinition<any, any, any>;
|
|
24
|
+
//# sourceMappingURL=tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/core/subagents/tool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA2LxD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;mFAuEjE","sourcesContent":["import { Text } from \"@schovest/pi-tui\";\nimport { minimatch } from \"minimatch\";\nimport { Type } from \"typebox\";\nimport { theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { AgentSession } from \"../agent-session.ts\";\nimport { defineTool } from \"../extensions/types.ts\";\nimport type { Skill } from \"../skills.ts\";\nimport { discoverSubagentsSync } from \"./discovery.ts\";\nimport type { SubagentDefinition, SubagentRunEvent, SubagentRunResult } from \"./types.ts\";\n\nconst ThinkingSchema = Type.Union([\n\tType.Literal(\"off\"),\n\tType.Literal(\"minimal\"),\n\tType.Literal(\"low\"),\n\tType.Literal(\"medium\"),\n\tType.Literal(\"high\"),\n\tType.Literal(\"xhigh\"),\n]);\n\nfunction createSubagentNameSchema(subagentNames: string[]) {\n\tconst description = `Subagent name. Available values: ${subagentNames.join(\", \")}`;\n\treturn Type.String({ description, enum: subagentNames });\n}\n\nfunction createTaskSchema(subagentNames: string[]) {\n\treturn Type.Object({\n\t\tagent: createSubagentNameSchema(subagentNames),\n\t\ttask: Type.String(),\n\t\ttitle: Type.String({ description: \"Short display title summarizing this subagent task, 2-6 words\" }),\n\t\tmodel: Type.Optional(Type.String()),\n\t\tthinking: Type.Optional(ThinkingSchema),\n\t\tincludedTools: Type.Optional(Type.Array(Type.String())),\n\t\texcludedTools: Type.Optional(Type.Array(Type.String())),\n\t});\n}\n\nfunction createSubagentToolSchema(subagentNames: string[]) {\n\tconst taskSchema = createTaskSchema(subagentNames);\n\treturn Type.Object({\n\t\ttasks: Type.Optional(Type.Array(taskSchema)),\n\t\tchain: Type.Optional(Type.Array(taskSchema)),\n\t\tsubagentScope: Type.Optional(Type.Union([Type.Literal(\"user\"), Type.Literal(\"project\"), Type.Literal(\"both\")])),\n\t});\n}\n\ntype SubagentTaskInput = {\n\tagent: string;\n\ttask: string;\n\ttitle: string;\n\tmodel?: string;\n\tthinking?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n\tincludedTools?: string[];\n\texcludedTools?: string[];\n};\n\ntype SubagentToolInput = {\n\ttasks?: SubagentTaskInput[];\n\tchain?: SubagentTaskInput[];\n\tsubagentScope?: \"user\" | \"project\" | \"both\";\n};\n\ninterface SubagentToolDetails {\n\tresult?: SubagentRunResult;\n\tevents: SubagentRunEvent[];\n\tchildren: Map<number, AgentSession>;\n}\n\nfunction formatSubagentDescription(def: SubagentDefinition, availableSkills: Skill[]): string {\n\tlet desc = def.description;\n\tif (def.skills && def.skills.length > 0) {\n\t\tconst matchedNames = availableSkills\n\t\t\t.filter((s) => def.skills!.some((p) => minimatch(s.name, p, { nocase: true })))\n\t\t\t.map((s) => s.name);\n\t\tif (matchedNames.length > 0) {\n\t\t\tdesc += `\\n\\nAvailable skills: ${matchedNames.join(\", \")}`;\n\t\t}\n\t}\n\treturn desc;\n}\n\nfunction validateMode(input: SubagentToolInput): void {\n\tconst hasTasks = !!input.tasks && input.tasks.length > 0;\n\tconst hasChain = !!input.chain && input.chain.length > 0;\n\tif (hasTasks === hasChain) {\n\t\tthrow new Error(\"subagent expects exactly one of tasks or chain\");\n\t}\n}\n\nfunction formatToolArgs(toolName: string, argsJson: string | undefined): string {\n\tif (!argsJson) return \"\";\n\ttry {\n\t\tconst args: Record<string, unknown> = JSON.parse(argsJson);\n\t\tswitch (toolName) {\n\t\t\tcase \"bash\":\n\t\t\t\treturn typeof args.command === \"string\" ? truncate(args.command, 80) : truncate(argsJson, 80);\n\t\t\tcase \"read\":\n\t\t\t\treturn truncate(String(args.file_path ?? args.path ?? argsJson), 80);\n\t\t\tcase \"edit\":\n\t\t\t\treturn truncate(String(args.path ?? args.file_path ?? argsJson), 80);\n\t\t\tcase \"write\":\n\t\t\t\treturn truncate(String(args.path ?? args.file_path ?? argsJson), 80);\n\t\t\tcase \"ls\":\n\t\t\t\treturn truncate(String(args.path ?? args.dir ?? \".\"), 80);\n\t\t\tcase \"grep\": {\n\t\t\t\tconst pattern = String(args.pattern ?? \"\");\n\t\t\t\tconst searchPath = args.path ? ` in ${args.path}` : \"\";\n\t\t\t\tconst include = args.glob ? ` (${args.glob})` : \"\";\n\t\t\t\treturn truncate(`/${pattern}/${searchPath}${include}`, 80);\n\t\t\t}\n\t\t\tcase \"find\": {\n\t\t\t\tconst pattern = String(args.pattern ?? args.glob ?? \"\");\n\t\t\t\tconst searchPath = args.path ? ` in ${args.path}` : \"\";\n\t\t\t\treturn truncate(`${pattern}${searchPath}`, 80);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn truncate(argsJson, 80);\n\t\t}\n\t} catch {\n\t\treturn truncate(argsJson, 80);\n\t}\n}\n\nfunction truncate(text: string, maxLength: number): string {\n\treturn text.length > maxLength ? `${text.slice(0, maxLength - 1)}…` : text;\n}\n\nfunction displayTitle(item: { title?: string; task: string }): string {\n\treturn item.title ?? item.task.slice(0, 7);\n}\n\nfunction toolCallCount(events: SubagentRunEvent[]): number {\n\treturn events.filter((e) => e.currentTool && e.currentToolArgs).length;\n}\n\nfunction recentToolCalls(events: SubagentRunEvent[], max: number): string {\n\tconst toolEvents = events.filter((e) => e.currentTool && e.currentToolArgs);\n\treturn toolEvents\n\t\t.slice(-max)\n\t\t.map((e) => {\n\t\t\tconst args = formatToolArgs(e.currentTool!, e.currentToolArgs);\n\t\t\treturn `> ${e.currentTool}${args ? ` ${args}` : \"\"}`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n\nfunction resultText(result: SubagentRunResult): string {\n\treturn result.results\n\t\t.map((item) => {\n\t\t\tconst tokens = item.usage ? ` tokens=${item.usage.totalTokens}` : \"\";\n\t\t\tconst tools = ` tools=${toolCallCount(item.events)}`;\n\t\t\tconst heading = `${item.index + 1}. ${displayTitle(item)}: ${item.status} ${item.model ?? \"\"} thinking=${item.thinking ?? \"default\"}${tokens}${tools}`;\n\t\t\tconst recent = recentToolCalls(item.events, 3);\n\t\t\tconst body = item.error ? `Error: ${item.error}` : item.output;\n\t\t\tconst parts = [heading];\n\t\t\tif (recent) parts.push(recent);\n\t\t\tif (body) parts.push(body);\n\t\t\treturn parts.join(\"\\n\");\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nfunction renderDetails(details: SubagentToolDetails | undefined, _expanded: boolean): string {\n\tif (!details) {\n\t\treturn \"\";\n\t}\n\tif (details.result) {\n\t\tconst lines = details.result.results.map((result) => {\n\t\t\tconst usage = result.usage ? ` tokens=${result.usage.totalTokens}` : \"\";\n\t\t\tconst tools = ` tools=${toolCallCount(result.events)}`;\n\t\t\tconst base = `${result.index + 1}. ${displayTitle(result)}: ${result.status} ${result.model ?? \"\"} thinking=${result.thinking ?? \"default\"}${usage}${tools}`;\n\t\t\tconst recent = recentToolCalls(result.events, 3);\n\t\t\treturn recent ? `${base}\\n${recent}` : base;\n\t\t});\n\t\treturn lines.join(\"\\n\\n\");\n\t}\n\tconst latest = new Map<number, SubagentRunEvent>();\n\tfor (const event of details.events) {\n\t\tlatest.set(event.index, event);\n\t}\n\treturn Array.from(latest.values())\n\t\t.sort((a, b) => a.index - b.index)\n\t\t.map((event) => {\n\t\t\tconst itemEvents = details.events.filter((e) => e.index === event.index);\n\t\t\tconst tools = ` tools=${toolCallCount(itemEvents)}`;\n\t\t\tconst base = `${event.index + 1}. ${displayTitle(event)}: ${event.status} ${event.model ?? \"\"} thinking=${event.thinking ?? \"default\"}${tools}`;\n\t\t\tconst recent = recentToolCalls(itemEvents, 3);\n\t\t\treturn recent ? `${base}\\n${recent}` : base;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport function createSubagentToolDefinition(session: AgentSession) {\n\tconst availableAgents = discoverSubagentsSync({\n\t\tcwd: session.cwd,\n\t\tagentDir: session.agentDir,\n\t\tscope: \"both\",\n\t});\n\tconst subagentNames = availableAgents.map((agent) => agent.name);\n\tconst availableSkills = session.resourceLoader.getSkills().skills;\n\tconst agentSummary = availableAgents\n\t\t.map((agent) => {\n\t\t\tconst desc = formatSubagentDescription(agent, availableSkills);\n\t\t\treturn `${agent.name} (${agent.scope}) - ${desc}`;\n\t\t})\n\t\t.join(\"; \");\n\tconst parameterSummary = `agent must be one of: ${subagentNames.join(\", \")}. Use subagentScope=\"project\" or \"both\" for project-defined subagents.`;\n\tconst usageGuidance =\n\t\t\"Always use tasks[] even for a single subagent. For 2+ independent subagents, use one subagent call with tasks[] so they run concurrently. Use chain[] for sequential dependent work where each step references {previous}.\";\n\n\treturn defineTool({\n\t\tname: \"subagent\",\n\t\tlabel: \"subagent\",\n\t\tdescription: `Run one or more specialized in-memory subagents. ${parameterSummary} ${usageGuidance}`,\n\t\tpromptSnippet:\n\t\t\t\"subagent - run specialized in-memory subagents: explorer for fast search/discovery, worker for unit-scoped execution.\",\n\t\tpromptGuidelines: [\n\t\t\t`Available subagents for the subagent tool: ${agentSummary}`,\n\t\t\t`Subagent parameter options: ${parameterSummary}`,\n\t\t\tusageGuidance,\n\t\t\t\"Use subagent for independent subtasks that benefit from a focused agent role.\",\n\t\t\t\"Do not use subagent recursively from inside subagents.\",\n\t\t\t\"Each task must include a concise title (2-6 words) summarizing what it does, e.g. '搜索数据库配置' or 'fix login CSS'. The title is displayed in the UI to identify subagent runs.\",\n\t\t],\n\t\tparameters: createSubagentToolSchema(subagentNames),\n\t\texecutionMode: \"parallel\",\n\t\texecute: async (_toolCallId, params, signal, onUpdate) => {\n\t\t\tvalidateMode(params);\n\t\t\tconst details: SubagentToolDetails = { events: [], children: new Map() };\n\t\t\tconst result = await session.runSubagents(\n\t\t\t\tparams.chain\n\t\t\t\t\t? { chain: params.chain, subagentScope: params.subagentScope }\n\t\t\t\t\t: { tasks: params.tasks!, subagentScope: params.subagentScope },\n\t\t\t\t{\n\t\t\t\t\tsignal,\n\t\t\t\t\tonEvent: (event, child) => {\n\t\t\t\t\t\tdetails.events.push(event);\n\t\t\t\t\t\tdetails.children.set(event.index, child);\n\t\t\t\t\t\tonUpdate?.({ content: [{ type: \"text\", text: renderDetails(details, false) }], details });\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tdetails.result = result;\n\t\t\tdetails.children.clear();\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: resultText(result) }],\n\t\t\t\tdetails,\n\t\t\t};\n\t\t},\n\t\trenderCall: (args) => {\n\t\t\tconst title = args.chain ? `chain ${args.chain.length}` : `parallel ${args.tasks?.length ?? 0}`;\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(`subagent ${title}`)), 0, 0);\n\t\t},\n\t\trenderResult: (result, options) => {\n\t\t\tconst details = result.details as SubagentToolDetails | undefined;\n\t\t\tconst lines = renderDetails(details, options.expanded);\n\t\t\tconst fallback = result.content\n\t\t\t\t.filter((part) => 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\", lines || fallback), 0, 0);\n\t\t},\n\t});\n}\n"]}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { Text } from "@schovest/pi-tui";
|
|
2
|
+
import { minimatch } from "minimatch";
|
|
3
|
+
import { Type } from "typebox";
|
|
4
|
+
import { theme } from "../../modes/interactive/theme/theme.js";
|
|
5
|
+
import { defineTool } from "../extensions/types.js";
|
|
6
|
+
import { discoverSubagentsSync } from "./discovery.js";
|
|
7
|
+
const ThinkingSchema = Type.Union([
|
|
8
|
+
Type.Literal("off"),
|
|
9
|
+
Type.Literal("minimal"),
|
|
10
|
+
Type.Literal("low"),
|
|
11
|
+
Type.Literal("medium"),
|
|
12
|
+
Type.Literal("high"),
|
|
13
|
+
Type.Literal("xhigh"),
|
|
14
|
+
]);
|
|
15
|
+
function createSubagentNameSchema(subagentNames) {
|
|
16
|
+
const description = `Subagent name. Available values: ${subagentNames.join(", ")}`;
|
|
17
|
+
return Type.String({ description, enum: subagentNames });
|
|
18
|
+
}
|
|
19
|
+
function createTaskSchema(subagentNames) {
|
|
20
|
+
return Type.Object({
|
|
21
|
+
agent: createSubagentNameSchema(subagentNames),
|
|
22
|
+
task: Type.String(),
|
|
23
|
+
title: Type.String({ description: "Short display title summarizing this subagent task, 2-6 words" }),
|
|
24
|
+
model: Type.Optional(Type.String()),
|
|
25
|
+
thinking: Type.Optional(ThinkingSchema),
|
|
26
|
+
includedTools: Type.Optional(Type.Array(Type.String())),
|
|
27
|
+
excludedTools: Type.Optional(Type.Array(Type.String())),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function createSubagentToolSchema(subagentNames) {
|
|
31
|
+
const taskSchema = createTaskSchema(subagentNames);
|
|
32
|
+
return Type.Object({
|
|
33
|
+
tasks: Type.Optional(Type.Array(taskSchema)),
|
|
34
|
+
chain: Type.Optional(Type.Array(taskSchema)),
|
|
35
|
+
subagentScope: Type.Optional(Type.Union([Type.Literal("user"), Type.Literal("project"), Type.Literal("both")])),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function formatSubagentDescription(def, availableSkills) {
|
|
39
|
+
let desc = def.description;
|
|
40
|
+
if (def.skills && def.skills.length > 0) {
|
|
41
|
+
const matchedNames = availableSkills
|
|
42
|
+
.filter((s) => def.skills.some((p) => minimatch(s.name, p, { nocase: true })))
|
|
43
|
+
.map((s) => s.name);
|
|
44
|
+
if (matchedNames.length > 0) {
|
|
45
|
+
desc += `\n\nAvailable skills: ${matchedNames.join(", ")}`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return desc;
|
|
49
|
+
}
|
|
50
|
+
function validateMode(input) {
|
|
51
|
+
const hasTasks = !!input.tasks && input.tasks.length > 0;
|
|
52
|
+
const hasChain = !!input.chain && input.chain.length > 0;
|
|
53
|
+
if (hasTasks === hasChain) {
|
|
54
|
+
throw new Error("subagent expects exactly one of tasks or chain");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function formatToolArgs(toolName, argsJson) {
|
|
58
|
+
if (!argsJson)
|
|
59
|
+
return "";
|
|
60
|
+
try {
|
|
61
|
+
const args = JSON.parse(argsJson);
|
|
62
|
+
switch (toolName) {
|
|
63
|
+
case "bash":
|
|
64
|
+
return typeof args.command === "string" ? truncate(args.command, 80) : truncate(argsJson, 80);
|
|
65
|
+
case "read":
|
|
66
|
+
return truncate(String(args.file_path ?? args.path ?? argsJson), 80);
|
|
67
|
+
case "edit":
|
|
68
|
+
return truncate(String(args.path ?? args.file_path ?? argsJson), 80);
|
|
69
|
+
case "write":
|
|
70
|
+
return truncate(String(args.path ?? args.file_path ?? argsJson), 80);
|
|
71
|
+
case "ls":
|
|
72
|
+
return truncate(String(args.path ?? args.dir ?? "."), 80);
|
|
73
|
+
case "grep": {
|
|
74
|
+
const pattern = String(args.pattern ?? "");
|
|
75
|
+
const searchPath = args.path ? ` in ${args.path}` : "";
|
|
76
|
+
const include = args.glob ? ` (${args.glob})` : "";
|
|
77
|
+
return truncate(`/${pattern}/${searchPath}${include}`, 80);
|
|
78
|
+
}
|
|
79
|
+
case "find": {
|
|
80
|
+
const pattern = String(args.pattern ?? args.glob ?? "");
|
|
81
|
+
const searchPath = args.path ? ` in ${args.path}` : "";
|
|
82
|
+
return truncate(`${pattern}${searchPath}`, 80);
|
|
83
|
+
}
|
|
84
|
+
default:
|
|
85
|
+
return truncate(argsJson, 80);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return truncate(argsJson, 80);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function truncate(text, maxLength) {
|
|
93
|
+
return text.length > maxLength ? `${text.slice(0, maxLength - 1)}…` : text;
|
|
94
|
+
}
|
|
95
|
+
function displayTitle(item) {
|
|
96
|
+
return item.title ?? item.task.slice(0, 7);
|
|
97
|
+
}
|
|
98
|
+
function toolCallCount(events) {
|
|
99
|
+
return events.filter((e) => e.currentTool && e.currentToolArgs).length;
|
|
100
|
+
}
|
|
101
|
+
function recentToolCalls(events, max) {
|
|
102
|
+
const toolEvents = events.filter((e) => e.currentTool && e.currentToolArgs);
|
|
103
|
+
return toolEvents
|
|
104
|
+
.slice(-max)
|
|
105
|
+
.map((e) => {
|
|
106
|
+
const args = formatToolArgs(e.currentTool, e.currentToolArgs);
|
|
107
|
+
return `> ${e.currentTool}${args ? ` ${args}` : ""}`;
|
|
108
|
+
})
|
|
109
|
+
.join("\n");
|
|
110
|
+
}
|
|
111
|
+
function resultText(result) {
|
|
112
|
+
return result.results
|
|
113
|
+
.map((item) => {
|
|
114
|
+
const tokens = item.usage ? ` tokens=${item.usage.totalTokens}` : "";
|
|
115
|
+
const tools = ` tools=${toolCallCount(item.events)}`;
|
|
116
|
+
const heading = `${item.index + 1}. ${displayTitle(item)}: ${item.status} ${item.model ?? ""} thinking=${item.thinking ?? "default"}${tokens}${tools}`;
|
|
117
|
+
const recent = recentToolCalls(item.events, 3);
|
|
118
|
+
const body = item.error ? `Error: ${item.error}` : item.output;
|
|
119
|
+
const parts = [heading];
|
|
120
|
+
if (recent)
|
|
121
|
+
parts.push(recent);
|
|
122
|
+
if (body)
|
|
123
|
+
parts.push(body);
|
|
124
|
+
return parts.join("\n");
|
|
125
|
+
})
|
|
126
|
+
.join("\n\n");
|
|
127
|
+
}
|
|
128
|
+
function renderDetails(details, _expanded) {
|
|
129
|
+
if (!details) {
|
|
130
|
+
return "";
|
|
131
|
+
}
|
|
132
|
+
if (details.result) {
|
|
133
|
+
const lines = details.result.results.map((result) => {
|
|
134
|
+
const usage = result.usage ? ` tokens=${result.usage.totalTokens}` : "";
|
|
135
|
+
const tools = ` tools=${toolCallCount(result.events)}`;
|
|
136
|
+
const base = `${result.index + 1}. ${displayTitle(result)}: ${result.status} ${result.model ?? ""} thinking=${result.thinking ?? "default"}${usage}${tools}`;
|
|
137
|
+
const recent = recentToolCalls(result.events, 3);
|
|
138
|
+
return recent ? `${base}\n${recent}` : base;
|
|
139
|
+
});
|
|
140
|
+
return lines.join("\n\n");
|
|
141
|
+
}
|
|
142
|
+
const latest = new Map();
|
|
143
|
+
for (const event of details.events) {
|
|
144
|
+
latest.set(event.index, event);
|
|
145
|
+
}
|
|
146
|
+
return Array.from(latest.values())
|
|
147
|
+
.sort((a, b) => a.index - b.index)
|
|
148
|
+
.map((event) => {
|
|
149
|
+
const itemEvents = details.events.filter((e) => e.index === event.index);
|
|
150
|
+
const tools = ` tools=${toolCallCount(itemEvents)}`;
|
|
151
|
+
const base = `${event.index + 1}. ${displayTitle(event)}: ${event.status} ${event.model ?? ""} thinking=${event.thinking ?? "default"}${tools}`;
|
|
152
|
+
const recent = recentToolCalls(itemEvents, 3);
|
|
153
|
+
return recent ? `${base}\n${recent}` : base;
|
|
154
|
+
})
|
|
155
|
+
.join("\n\n");
|
|
156
|
+
}
|
|
157
|
+
export function createSubagentToolDefinition(session) {
|
|
158
|
+
const availableAgents = discoverSubagentsSync({
|
|
159
|
+
cwd: session.cwd,
|
|
160
|
+
agentDir: session.agentDir,
|
|
161
|
+
scope: "both",
|
|
162
|
+
});
|
|
163
|
+
const subagentNames = availableAgents.map((agent) => agent.name);
|
|
164
|
+
const availableSkills = session.resourceLoader.getSkills().skills;
|
|
165
|
+
const agentSummary = availableAgents
|
|
166
|
+
.map((agent) => {
|
|
167
|
+
const desc = formatSubagentDescription(agent, availableSkills);
|
|
168
|
+
return `${agent.name} (${agent.scope}) - ${desc}`;
|
|
169
|
+
})
|
|
170
|
+
.join("; ");
|
|
171
|
+
const parameterSummary = `agent must be one of: ${subagentNames.join(", ")}. Use subagentScope="project" or "both" for project-defined subagents.`;
|
|
172
|
+
const usageGuidance = "Always use tasks[] even for a single subagent. For 2+ independent subagents, use one subagent call with tasks[] so they run concurrently. Use chain[] for sequential dependent work where each step references {previous}.";
|
|
173
|
+
return defineTool({
|
|
174
|
+
name: "subagent",
|
|
175
|
+
label: "subagent",
|
|
176
|
+
description: `Run one or more specialized in-memory subagents. ${parameterSummary} ${usageGuidance}`,
|
|
177
|
+
promptSnippet: "subagent - run specialized in-memory subagents: explorer for fast search/discovery, worker for unit-scoped execution.",
|
|
178
|
+
promptGuidelines: [
|
|
179
|
+
`Available subagents for the subagent tool: ${agentSummary}`,
|
|
180
|
+
`Subagent parameter options: ${parameterSummary}`,
|
|
181
|
+
usageGuidance,
|
|
182
|
+
"Use subagent for independent subtasks that benefit from a focused agent role.",
|
|
183
|
+
"Do not use subagent recursively from inside subagents.",
|
|
184
|
+
"Each task must include a concise title (2-6 words) summarizing what it does, e.g. '搜索数据库配置' or 'fix login CSS'. The title is displayed in the UI to identify subagent runs.",
|
|
185
|
+
],
|
|
186
|
+
parameters: createSubagentToolSchema(subagentNames),
|
|
187
|
+
executionMode: "parallel",
|
|
188
|
+
execute: async (_toolCallId, params, signal, onUpdate) => {
|
|
189
|
+
validateMode(params);
|
|
190
|
+
const details = { events: [], children: new Map() };
|
|
191
|
+
const result = await session.runSubagents(params.chain
|
|
192
|
+
? { chain: params.chain, subagentScope: params.subagentScope }
|
|
193
|
+
: { tasks: params.tasks, subagentScope: params.subagentScope }, {
|
|
194
|
+
signal,
|
|
195
|
+
onEvent: (event, child) => {
|
|
196
|
+
details.events.push(event);
|
|
197
|
+
details.children.set(event.index, child);
|
|
198
|
+
onUpdate?.({ content: [{ type: "text", text: renderDetails(details, false) }], details });
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
details.result = result;
|
|
202
|
+
details.children.clear();
|
|
203
|
+
return {
|
|
204
|
+
content: [{ type: "text", text: resultText(result) }],
|
|
205
|
+
details,
|
|
206
|
+
};
|
|
207
|
+
},
|
|
208
|
+
renderCall: (args) => {
|
|
209
|
+
const title = args.chain ? `chain ${args.chain.length}` : `parallel ${args.tasks?.length ?? 0}`;
|
|
210
|
+
return new Text(theme.fg("toolTitle", theme.bold(`subagent ${title}`)), 0, 0);
|
|
211
|
+
},
|
|
212
|
+
renderResult: (result, options) => {
|
|
213
|
+
const details = result.details;
|
|
214
|
+
const lines = renderDetails(details, options.expanded);
|
|
215
|
+
const fallback = result.content
|
|
216
|
+
.filter((part) => part.type === "text")
|
|
217
|
+
.map((part) => part.text)
|
|
218
|
+
.join("\n");
|
|
219
|
+
return new Text(theme.fg("toolOutput", lines || fallback), 0, 0);
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/core/subagents/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { Text } from \"@schovest/pi-tui\";\nimport { minimatch } from \"minimatch\";\nimport { Type } from \"typebox\";\nimport { theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { AgentSession } from \"../agent-session.ts\";\nimport { defineTool } from \"../extensions/types.ts\";\nimport type { Skill } from \"../skills.ts\";\nimport { discoverSubagentsSync } from \"./discovery.ts\";\nimport type { SubagentDefinition, SubagentRunEvent, SubagentRunResult } from \"./types.ts\";\n\nconst ThinkingSchema = Type.Union([\n\tType.Literal(\"off\"),\n\tType.Literal(\"minimal\"),\n\tType.Literal(\"low\"),\n\tType.Literal(\"medium\"),\n\tType.Literal(\"high\"),\n\tType.Literal(\"xhigh\"),\n]);\n\nfunction createSubagentNameSchema(subagentNames: string[]) {\n\tconst description = `Subagent name. Available values: ${subagentNames.join(\", \")}`;\n\treturn Type.String({ description, enum: subagentNames });\n}\n\nfunction createTaskSchema(subagentNames: string[]) {\n\treturn Type.Object({\n\t\tagent: createSubagentNameSchema(subagentNames),\n\t\ttask: Type.String(),\n\t\ttitle: Type.String({ description: \"Short display title summarizing this subagent task, 2-6 words\" }),\n\t\tmodel: Type.Optional(Type.String()),\n\t\tthinking: Type.Optional(ThinkingSchema),\n\t\tincludedTools: Type.Optional(Type.Array(Type.String())),\n\t\texcludedTools: Type.Optional(Type.Array(Type.String())),\n\t});\n}\n\nfunction createSubagentToolSchema(subagentNames: string[]) {\n\tconst taskSchema = createTaskSchema(subagentNames);\n\treturn Type.Object({\n\t\ttasks: Type.Optional(Type.Array(taskSchema)),\n\t\tchain: Type.Optional(Type.Array(taskSchema)),\n\t\tsubagentScope: Type.Optional(Type.Union([Type.Literal(\"user\"), Type.Literal(\"project\"), Type.Literal(\"both\")])),\n\t});\n}\n\ntype SubagentTaskInput = {\n\tagent: string;\n\ttask: string;\n\ttitle: string;\n\tmodel?: string;\n\tthinking?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n\tincludedTools?: string[];\n\texcludedTools?: string[];\n};\n\ntype SubagentToolInput = {\n\ttasks?: SubagentTaskInput[];\n\tchain?: SubagentTaskInput[];\n\tsubagentScope?: \"user\" | \"project\" | \"both\";\n};\n\ninterface SubagentToolDetails {\n\tresult?: SubagentRunResult;\n\tevents: SubagentRunEvent[];\n\tchildren: Map<number, AgentSession>;\n}\n\nfunction formatSubagentDescription(def: SubagentDefinition, availableSkills: Skill[]): string {\n\tlet desc = def.description;\n\tif (def.skills && def.skills.length > 0) {\n\t\tconst matchedNames = availableSkills\n\t\t\t.filter((s) => def.skills!.some((p) => minimatch(s.name, p, { nocase: true })))\n\t\t\t.map((s) => s.name);\n\t\tif (matchedNames.length > 0) {\n\t\t\tdesc += `\\n\\nAvailable skills: ${matchedNames.join(\", \")}`;\n\t\t}\n\t}\n\treturn desc;\n}\n\nfunction validateMode(input: SubagentToolInput): void {\n\tconst hasTasks = !!input.tasks && input.tasks.length > 0;\n\tconst hasChain = !!input.chain && input.chain.length > 0;\n\tif (hasTasks === hasChain) {\n\t\tthrow new Error(\"subagent expects exactly one of tasks or chain\");\n\t}\n}\n\nfunction formatToolArgs(toolName: string, argsJson: string | undefined): string {\n\tif (!argsJson) return \"\";\n\ttry {\n\t\tconst args: Record<string, unknown> = JSON.parse(argsJson);\n\t\tswitch (toolName) {\n\t\t\tcase \"bash\":\n\t\t\t\treturn typeof args.command === \"string\" ? truncate(args.command, 80) : truncate(argsJson, 80);\n\t\t\tcase \"read\":\n\t\t\t\treturn truncate(String(args.file_path ?? args.path ?? argsJson), 80);\n\t\t\tcase \"edit\":\n\t\t\t\treturn truncate(String(args.path ?? args.file_path ?? argsJson), 80);\n\t\t\tcase \"write\":\n\t\t\t\treturn truncate(String(args.path ?? args.file_path ?? argsJson), 80);\n\t\t\tcase \"ls\":\n\t\t\t\treturn truncate(String(args.path ?? args.dir ?? \".\"), 80);\n\t\t\tcase \"grep\": {\n\t\t\t\tconst pattern = String(args.pattern ?? \"\");\n\t\t\t\tconst searchPath = args.path ? ` in ${args.path}` : \"\";\n\t\t\t\tconst include = args.glob ? ` (${args.glob})` : \"\";\n\t\t\t\treturn truncate(`/${pattern}/${searchPath}${include}`, 80);\n\t\t\t}\n\t\t\tcase \"find\": {\n\t\t\t\tconst pattern = String(args.pattern ?? args.glob ?? \"\");\n\t\t\t\tconst searchPath = args.path ? ` in ${args.path}` : \"\";\n\t\t\t\treturn truncate(`${pattern}${searchPath}`, 80);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn truncate(argsJson, 80);\n\t\t}\n\t} catch {\n\t\treturn truncate(argsJson, 80);\n\t}\n}\n\nfunction truncate(text: string, maxLength: number): string {\n\treturn text.length > maxLength ? `${text.slice(0, maxLength - 1)}…` : text;\n}\n\nfunction displayTitle(item: { title?: string; task: string }): string {\n\treturn item.title ?? item.task.slice(0, 7);\n}\n\nfunction toolCallCount(events: SubagentRunEvent[]): number {\n\treturn events.filter((e) => e.currentTool && e.currentToolArgs).length;\n}\n\nfunction recentToolCalls(events: SubagentRunEvent[], max: number): string {\n\tconst toolEvents = events.filter((e) => e.currentTool && e.currentToolArgs);\n\treturn toolEvents\n\t\t.slice(-max)\n\t\t.map((e) => {\n\t\t\tconst args = formatToolArgs(e.currentTool!, e.currentToolArgs);\n\t\t\treturn `> ${e.currentTool}${args ? ` ${args}` : \"\"}`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n\nfunction resultText(result: SubagentRunResult): string {\n\treturn result.results\n\t\t.map((item) => {\n\t\t\tconst tokens = item.usage ? ` tokens=${item.usage.totalTokens}` : \"\";\n\t\t\tconst tools = ` tools=${toolCallCount(item.events)}`;\n\t\t\tconst heading = `${item.index + 1}. ${displayTitle(item)}: ${item.status} ${item.model ?? \"\"} thinking=${item.thinking ?? \"default\"}${tokens}${tools}`;\n\t\t\tconst recent = recentToolCalls(item.events, 3);\n\t\t\tconst body = item.error ? `Error: ${item.error}` : item.output;\n\t\t\tconst parts = [heading];\n\t\t\tif (recent) parts.push(recent);\n\t\t\tif (body) parts.push(body);\n\t\t\treturn parts.join(\"\\n\");\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nfunction renderDetails(details: SubagentToolDetails | undefined, _expanded: boolean): string {\n\tif (!details) {\n\t\treturn \"\";\n\t}\n\tif (details.result) {\n\t\tconst lines = details.result.results.map((result) => {\n\t\t\tconst usage = result.usage ? ` tokens=${result.usage.totalTokens}` : \"\";\n\t\t\tconst tools = ` tools=${toolCallCount(result.events)}`;\n\t\t\tconst base = `${result.index + 1}. ${displayTitle(result)}: ${result.status} ${result.model ?? \"\"} thinking=${result.thinking ?? \"default\"}${usage}${tools}`;\n\t\t\tconst recent = recentToolCalls(result.events, 3);\n\t\t\treturn recent ? `${base}\\n${recent}` : base;\n\t\t});\n\t\treturn lines.join(\"\\n\\n\");\n\t}\n\tconst latest = new Map<number, SubagentRunEvent>();\n\tfor (const event of details.events) {\n\t\tlatest.set(event.index, event);\n\t}\n\treturn Array.from(latest.values())\n\t\t.sort((a, b) => a.index - b.index)\n\t\t.map((event) => {\n\t\t\tconst itemEvents = details.events.filter((e) => e.index === event.index);\n\t\t\tconst tools = ` tools=${toolCallCount(itemEvents)}`;\n\t\t\tconst base = `${event.index + 1}. ${displayTitle(event)}: ${event.status} ${event.model ?? \"\"} thinking=${event.thinking ?? \"default\"}${tools}`;\n\t\t\tconst recent = recentToolCalls(itemEvents, 3);\n\t\t\treturn recent ? `${base}\\n${recent}` : base;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport function createSubagentToolDefinition(session: AgentSession) {\n\tconst availableAgents = discoverSubagentsSync({\n\t\tcwd: session.cwd,\n\t\tagentDir: session.agentDir,\n\t\tscope: \"both\",\n\t});\n\tconst subagentNames = availableAgents.map((agent) => agent.name);\n\tconst availableSkills = session.resourceLoader.getSkills().skills;\n\tconst agentSummary = availableAgents\n\t\t.map((agent) => {\n\t\t\tconst desc = formatSubagentDescription(agent, availableSkills);\n\t\t\treturn `${agent.name} (${agent.scope}) - ${desc}`;\n\t\t})\n\t\t.join(\"; \");\n\tconst parameterSummary = `agent must be one of: ${subagentNames.join(\", \")}. Use subagentScope=\"project\" or \"both\" for project-defined subagents.`;\n\tconst usageGuidance =\n\t\t\"Always use tasks[] even for a single subagent. For 2+ independent subagents, use one subagent call with tasks[] so they run concurrently. Use chain[] for sequential dependent work where each step references {previous}.\";\n\n\treturn defineTool({\n\t\tname: \"subagent\",\n\t\tlabel: \"subagent\",\n\t\tdescription: `Run one or more specialized in-memory subagents. ${parameterSummary} ${usageGuidance}`,\n\t\tpromptSnippet:\n\t\t\t\"subagent - run specialized in-memory subagents: explorer for fast search/discovery, worker for unit-scoped execution.\",\n\t\tpromptGuidelines: [\n\t\t\t`Available subagents for the subagent tool: ${agentSummary}`,\n\t\t\t`Subagent parameter options: ${parameterSummary}`,\n\t\t\tusageGuidance,\n\t\t\t\"Use subagent for independent subtasks that benefit from a focused agent role.\",\n\t\t\t\"Do not use subagent recursively from inside subagents.\",\n\t\t\t\"Each task must include a concise title (2-6 words) summarizing what it does, e.g. '搜索数据库配置' or 'fix login CSS'. The title is displayed in the UI to identify subagent runs.\",\n\t\t],\n\t\tparameters: createSubagentToolSchema(subagentNames),\n\t\texecutionMode: \"parallel\",\n\t\texecute: async (_toolCallId, params, signal, onUpdate) => {\n\t\t\tvalidateMode(params);\n\t\t\tconst details: SubagentToolDetails = { events: [], children: new Map() };\n\t\t\tconst result = await session.runSubagents(\n\t\t\t\tparams.chain\n\t\t\t\t\t? { chain: params.chain, subagentScope: params.subagentScope }\n\t\t\t\t\t: { tasks: params.tasks!, subagentScope: params.subagentScope },\n\t\t\t\t{\n\t\t\t\t\tsignal,\n\t\t\t\t\tonEvent: (event, child) => {\n\t\t\t\t\t\tdetails.events.push(event);\n\t\t\t\t\t\tdetails.children.set(event.index, child);\n\t\t\t\t\t\tonUpdate?.({ content: [{ type: \"text\", text: renderDetails(details, false) }], details });\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tdetails.result = result;\n\t\t\tdetails.children.clear();\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: resultText(result) }],\n\t\t\t\tdetails,\n\t\t\t};\n\t\t},\n\t\trenderCall: (args) => {\n\t\t\tconst title = args.chain ? `chain ${args.chain.length}` : `parallel ${args.tasks?.length ?? 0}`;\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(`subagent ${title}`)), 0, 0);\n\t\t},\n\t\trenderResult: (result, options) => {\n\t\t\tconst details = result.details as SubagentToolDetails | undefined;\n\t\t\tconst lines = renderDetails(details, options.expanded);\n\t\t\tconst fallback = result.content\n\t\t\t\t.filter((part) => 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\", lines || fallback), 0, 0);\n\t\t},\n\t});\n}\n"]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { AgentMessage, ThinkingLevel } from "@schovest/pi-agent-core";
|
|
2
|
+
import type { Usage } from "@schovest/pi-ai";
|
|
3
|
+
import type { AgentSession } from "../agent-session.ts";
|
|
4
|
+
export type SubagentScope = "user" | "project" | "both";
|
|
5
|
+
export type SubagentDefinitionScope = "builtin" | "user" | "project";
|
|
6
|
+
export type SubagentRunMode = "parallel" | "chain";
|
|
7
|
+
export type SubagentRunStatus = "pending" | "running" | "success" | "failed" | "aborted";
|
|
8
|
+
export interface SubagentDefinition {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
prompt: string;
|
|
12
|
+
scope: SubagentDefinitionScope;
|
|
13
|
+
sourcePath?: string;
|
|
14
|
+
model?: string;
|
|
15
|
+
thinking?: ThinkingLevel;
|
|
16
|
+
includedTools?: string[];
|
|
17
|
+
excludedTools?: string[];
|
|
18
|
+
skills?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface SubagentTask {
|
|
21
|
+
agent: string;
|
|
22
|
+
task: string;
|
|
23
|
+
title: string;
|
|
24
|
+
model?: string;
|
|
25
|
+
thinking?: ThinkingLevel;
|
|
26
|
+
includedTools?: string[];
|
|
27
|
+
excludedTools?: string[];
|
|
28
|
+
skills?: string[];
|
|
29
|
+
}
|
|
30
|
+
export type SubagentRunRequest = {
|
|
31
|
+
tasks: SubagentTask[];
|
|
32
|
+
subagentScope?: SubagentScope;
|
|
33
|
+
} | {
|
|
34
|
+
chain: SubagentTask[];
|
|
35
|
+
subagentScope?: SubagentScope;
|
|
36
|
+
};
|
|
37
|
+
export interface SubagentRunOptions {
|
|
38
|
+
signal?: AbortSignal;
|
|
39
|
+
agentDir?: string;
|
|
40
|
+
onEvent?: (event: SubagentRunEvent, child: AgentSession) => void;
|
|
41
|
+
}
|
|
42
|
+
export interface SubagentRunEvent {
|
|
43
|
+
runId: string;
|
|
44
|
+
index: number;
|
|
45
|
+
agent: string;
|
|
46
|
+
task: string;
|
|
47
|
+
title: string;
|
|
48
|
+
status: SubagentRunStatus;
|
|
49
|
+
model?: string;
|
|
50
|
+
thinking?: ThinkingLevel;
|
|
51
|
+
currentTool?: string;
|
|
52
|
+
currentToolArgs?: string;
|
|
53
|
+
toolResultSummary?: string;
|
|
54
|
+
outputSummary?: string;
|
|
55
|
+
usage?: Usage;
|
|
56
|
+
error?: string;
|
|
57
|
+
timestamp: number;
|
|
58
|
+
}
|
|
59
|
+
export interface SubagentTaskResult {
|
|
60
|
+
index: number;
|
|
61
|
+
agent: string;
|
|
62
|
+
task: string;
|
|
63
|
+
title: string;
|
|
64
|
+
status: Exclude<SubagentRunStatus, "pending" | "running">;
|
|
65
|
+
output: string;
|
|
66
|
+
model?: string;
|
|
67
|
+
thinking?: ThinkingLevel;
|
|
68
|
+
usage?: Usage;
|
|
69
|
+
error?: string;
|
|
70
|
+
messages: AgentMessage[];
|
|
71
|
+
events: SubagentRunEvent[];
|
|
72
|
+
}
|
|
73
|
+
export interface SubagentRunResult {
|
|
74
|
+
mode: SubagentRunMode;
|
|
75
|
+
results: SubagentTaskResult[];
|
|
76
|
+
usage?: Usage;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/subagents/types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@schovest/pi-agent-core\";\nimport type { Usage } from \"@schovest/pi-ai\";\nimport type { AgentSession } from \"../agent-session.ts\";\n\nexport type SubagentScope = \"user\" | \"project\" | \"both\";\nexport type SubagentDefinitionScope = \"builtin\" | \"user\" | \"project\";\nexport type SubagentRunMode = \"parallel\" | \"chain\";\nexport type SubagentRunStatus = \"pending\" | \"running\" | \"success\" | \"failed\" | \"aborted\";\n\nexport interface SubagentDefinition {\n\tname: string;\n\tdescription: string;\n\tprompt: string;\n\tscope: SubagentDefinitionScope;\n\tsourcePath?: string;\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n\tincludedTools?: string[];\n\texcludedTools?: string[];\n\tskills?: string[]; // glob 模式列表,匹配主 agent 已加载的 skills\n}\n\nexport interface SubagentTask {\n\tagent: string;\n\ttask: string;\n\ttitle: string;\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n\tincludedTools?: string[];\n\texcludedTools?: string[];\n\tskills?: string[]; // 运行时覆盖 definition 的 skills\n}\n\nexport type SubagentRunRequest =\n\t| { tasks: SubagentTask[]; subagentScope?: SubagentScope }\n\t| { chain: SubagentTask[]; subagentScope?: SubagentScope };\n\nexport interface SubagentRunOptions {\n\tsignal?: AbortSignal;\n\tagentDir?: string;\n\tonEvent?: (event: SubagentRunEvent, child: AgentSession) => void;\n}\n\nexport interface SubagentRunEvent {\n\trunId: string;\n\tindex: number;\n\tagent: string;\n\ttask: string;\n\ttitle: string;\n\tstatus: SubagentRunStatus;\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\ttoolResultSummary?: string;\n\toutputSummary?: string;\n\tusage?: Usage;\n\terror?: string;\n\ttimestamp: number;\n}\n\nexport interface SubagentTaskResult {\n\tindex: number;\n\tagent: string;\n\ttask: string;\n\ttitle: string;\n\tstatus: Exclude<SubagentRunStatus, \"pending\" | \"running\">;\n\toutput: string;\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n\tusage?: Usage;\n\terror?: string;\n\tmessages: AgentMessage[];\n\tevents: SubagentRunEvent[];\n}\n\nexport interface SubagentRunResult {\n\tmode: SubagentRunMode;\n\tresults: SubagentTaskResult[];\n\tusage?: Usage;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/subagents/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@schovest/pi-agent-core\";\nimport type { Usage } from \"@schovest/pi-ai\";\nimport type { AgentSession } from \"../agent-session.ts\";\n\nexport type SubagentScope = \"user\" | \"project\" | \"both\";\nexport type SubagentDefinitionScope = \"builtin\" | \"user\" | \"project\";\nexport type SubagentRunMode = \"parallel\" | \"chain\";\nexport type SubagentRunStatus = \"pending\" | \"running\" | \"success\" | \"failed\" | \"aborted\";\n\nexport interface SubagentDefinition {\n\tname: string;\n\tdescription: string;\n\tprompt: string;\n\tscope: SubagentDefinitionScope;\n\tsourcePath?: string;\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n\tincludedTools?: string[];\n\texcludedTools?: string[];\n\tskills?: string[]; // glob 模式列表,匹配主 agent 已加载的 skills\n}\n\nexport interface SubagentTask {\n\tagent: string;\n\ttask: string;\n\ttitle: string;\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n\tincludedTools?: string[];\n\texcludedTools?: string[];\n\tskills?: string[]; // 运行时覆盖 definition 的 skills\n}\n\nexport type SubagentRunRequest =\n\t| { tasks: SubagentTask[]; subagentScope?: SubagentScope }\n\t| { chain: SubagentTask[]; subagentScope?: SubagentScope };\n\nexport interface SubagentRunOptions {\n\tsignal?: AbortSignal;\n\tagentDir?: string;\n\tonEvent?: (event: SubagentRunEvent, child: AgentSession) => void;\n}\n\nexport interface SubagentRunEvent {\n\trunId: string;\n\tindex: number;\n\tagent: string;\n\ttask: string;\n\ttitle: string;\n\tstatus: SubagentRunStatus;\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\ttoolResultSummary?: string;\n\toutputSummary?: string;\n\tusage?: Usage;\n\terror?: string;\n\ttimestamp: number;\n}\n\nexport interface SubagentTaskResult {\n\tindex: number;\n\tagent: string;\n\ttask: string;\n\ttitle: string;\n\tstatus: Exclude<SubagentRunStatus, \"pending\" | \"running\">;\n\toutput: string;\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n\tusage?: Usage;\n\terror?: string;\n\tmessages: AgentMessage[];\n\tevents: SubagentRunEvent[];\n}\n\nexport interface SubagentRunResult {\n\tmode: SubagentRunMode;\n\tresults: SubagentTaskResult[];\n\tusage?: Usage;\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System prompt construction and project context loading
|
|
3
|
+
*/
|
|
4
|
+
import { type Skill } from "./skills.ts";
|
|
5
|
+
export interface BuildSystemPromptOptions {
|
|
6
|
+
/** Custom system prompt (replaces default). */
|
|
7
|
+
customPrompt?: string;
|
|
8
|
+
/** Primary agent role prompt (prepended to default prompt when non-empty). */
|
|
9
|
+
primaryAgentPrompt?: string;
|
|
10
|
+
/** Tools to include in prompt. Default: [read, bash, edit, write] */
|
|
11
|
+
selectedTools?: string[];
|
|
12
|
+
/** Optional one-line tool snippets keyed by tool name. */
|
|
13
|
+
toolSnippets?: Record<string, string>;
|
|
14
|
+
/** Additional guideline bullets appended to the default system prompt guidelines. */
|
|
15
|
+
promptGuidelines?: string[];
|
|
16
|
+
/** Text to append to system prompt. */
|
|
17
|
+
appendSystemPrompt?: string;
|
|
18
|
+
/** Working directory. */
|
|
19
|
+
cwd: string;
|
|
20
|
+
/** Pre-loaded context files. */
|
|
21
|
+
contextFiles?: Array<{
|
|
22
|
+
path: string;
|
|
23
|
+
content: string;
|
|
24
|
+
}>;
|
|
25
|
+
/** Pre-loaded skills. */
|
|
26
|
+
skills?: Skill[];
|
|
27
|
+
}
|
|
28
|
+
/** Build the system prompt with tools, guidelines, and context */
|
|
29
|
+
export declare function buildSystemPrompt(options: BuildSystemPromptOptions): string;
|
|
30
|
+
//# sourceMappingURL=system-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,wBAAwB;IACxC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAmJ3E","sourcesContent":["/**\n * System prompt construction and project context loading\n */\n\nimport { getDocsPath, getExamplesPath, getReadmePath } from \"../config.ts\";\nimport { formatSkillsForPrompt, type Skill } from \"./skills.ts\";\n\nexport interface BuildSystemPromptOptions {\n\t/** Custom system prompt (replaces default). */\n\tcustomPrompt?: string;\n\t/** Primary agent role prompt (prepended to default prompt when non-empty). */\n\tprimaryAgentPrompt?: string;\n\t/** Tools to include in prompt. Default: [read, bash, edit, write] */\n\tselectedTools?: string[];\n\t/** Optional one-line tool snippets keyed by tool name. */\n\ttoolSnippets?: Record<string, string>;\n\t/** Additional guideline bullets appended to the default system prompt guidelines. */\n\tpromptGuidelines?: string[];\n\t/** Text to append to system prompt. */\n\tappendSystemPrompt?: string;\n\t/** Working directory. */\n\tcwd: string;\n\t/** Pre-loaded context files. */\n\tcontextFiles?: Array<{ path: string; content: string }>;\n\t/** Pre-loaded skills. */\n\tskills?: Skill[];\n}\n\n/** Build the system prompt with tools, guidelines, and context */\nexport function buildSystemPrompt(options: BuildSystemPromptOptions): string {\n\tconst {\n\t\tcustomPrompt,\n\t\tprimaryAgentPrompt,\n\t\tselectedTools,\n\t\ttoolSnippets,\n\t\tpromptGuidelines,\n\t\tappendSystemPrompt,\n\t\tcwd,\n\t\tcontextFiles: providedContextFiles,\n\t\tskills: providedSkills,\n\t} = options;\n\tconst resolvedCwd = cwd;\n\tconst promptCwd = resolvedCwd.replace(/\\\\/g, \"/\");\n\n\tconst now = new Date();\n\tconst year = now.getFullYear();\n\tconst month = String(now.getMonth() + 1).padStart(2, \"0\");\n\tconst day = String(now.getDate()).padStart(2, \"0\");\n\tconst date = `${year}-${month}-${day}`;\n\n\tconst appendSection = appendSystemPrompt ? `\\n\\n${appendSystemPrompt}` : \"\";\n\n\tconst contextFiles = providedContextFiles ?? [];\n\tconst skills = providedSkills ?? [];\n\n\tif (customPrompt) {\n\t\tlet prompt = primaryAgentPrompt ? `${primaryAgentPrompt}\\n\\n${customPrompt}` : customPrompt;\n\n\t\tif (appendSection) {\n\t\t\tprompt += appendSection;\n\t\t}\n\n\t\t// Append project context files\n\t\tif (contextFiles.length > 0) {\n\t\t\tprompt += \"\\n\\n<project_context>\\n\\n\";\n\t\t\tprompt += \"Project-specific instructions and guidelines:\\n\\n\";\n\t\t\tfor (const { path: filePath, content } of contextFiles) {\n\t\t\t\tprompt += `<project_instructions path=\"${filePath}\">\\n${content}\\n</project_instructions>\\n\\n`;\n\t\t\t}\n\t\t\tprompt += \"</project_context>\\n\";\n\t\t}\n\n\t\t// Append skills section (only if read tool is available)\n\t\tconst customPromptHasRead = !selectedTools || selectedTools.includes(\"read\");\n\t\tif (customPromptHasRead && skills.length > 0) {\n\t\t\tprompt += formatSkillsForPrompt(skills);\n\t\t}\n\n\t\t// Add date and working directory last\n\t\tprompt += `\\nCurrent date: ${date}`;\n\t\tprompt += `\\nCurrent working directory: ${promptCwd}`;\n\n\t\treturn prompt;\n\t}\n\n\t// Get absolute paths to documentation and examples\n\tconst readmePath = getReadmePath();\n\tconst docsPath = getDocsPath();\n\tconst examplesPath = getExamplesPath();\n\n\t// Build tools list based on selected tools.\n\t// A tool appears in Available tools only when the caller provides a one-line snippet.\n\tconst tools = selectedTools || [\"read\", \"bash\", \"edit\", \"write\"];\n\tconst visibleTools = tools.filter((name) => !!toolSnippets?.[name]);\n\tconst toolsList =\n\t\tvisibleTools.length > 0 ? visibleTools.map((name) => `- ${name}: ${toolSnippets![name]}`).join(\"\\n\") : \"(none)\";\n\n\t// Build guidelines based on which tools are actually available\n\tconst guidelinesList: string[] = [];\n\tconst guidelinesSet = new Set<string>();\n\tconst addGuideline = (guideline: string): void => {\n\t\tif (guidelinesSet.has(guideline)) {\n\t\t\treturn;\n\t\t}\n\t\tguidelinesSet.add(guideline);\n\t\tguidelinesList.push(guideline);\n\t};\n\n\tconst hasBash = tools.includes(\"bash\");\n\tconst hasGrep = tools.includes(\"grep\");\n\tconst hasFind = tools.includes(\"find\");\n\tconst hasLs = tools.includes(\"ls\");\n\tconst hasRead = tools.includes(\"read\");\n\n\t// File exploration guidelines\n\tif (hasBash && !hasGrep && !hasFind && !hasLs) {\n\t\taddGuideline(\"Use bash for file operations like ls, rg, find\");\n\t}\n\n\tfor (const guideline of promptGuidelines ?? []) {\n\t\tconst normalized = guideline.trim();\n\t\tif (normalized.length > 0) {\n\t\t\taddGuideline(normalized);\n\t\t}\n\t}\n\n\t// Always include these\n\taddGuideline(\"Be concise in your responses\");\n\taddGuideline(\"Show file paths clearly when working with files\");\n\n\tconst guidelines = guidelinesList.map((g) => `- ${g}`).join(\"\\n\");\n\n\tconst primaryPrefix = primaryAgentPrompt ? `${primaryAgentPrompt}\\n\\n` : \"\";\n\tlet prompt = `${primaryPrefix}You are an expert coding assistant operating inside pi, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.\n\nAvailable tools:\n${toolsList}\n\nIn addition to the tools above, you may have access to other custom tools depending on the project.\n\nGuidelines:\n${guidelines}\n\nPi documentation (read only when the user asks about pi itself, its SDK, extensions, themes, skills, or TUI):\n- Main documentation: ${readmePath}\n- Additional docs: ${docsPath}\n- Examples: ${examplesPath} (extensions, custom tools, SDK)\n- When reading pi docs or examples, resolve docs/... under Additional docs and examples/... under Examples, not the current working directory\n- When asked about: extensions (docs/extensions.md, examples/extensions/), themes (docs/themes.md), skills (docs/skills.md), prompt templates (docs/prompt-templates.md), TUI components (docs/tui.md), keybindings (docs/keybindings.md), SDK integrations (docs/sdk.md), custom providers (docs/custom-provider.md), adding models (docs/models.md), pi packages (docs/packages.md), Claude-compatible plugins (docs/plugins.md)\n- When working on pi topics, read the docs and examples, and follow .md cross-references before implementing\n- Always read pi .md files completely and follow links to related docs (e.g., tui.md for TUI API details)`;\n\n\tif (appendSection) {\n\t\tprompt += appendSection;\n\t}\n\n\t// Append project context files\n\tif (contextFiles.length > 0) {\n\t\tprompt += \"\\n\\n<project_context>\\n\\n\";\n\t\tprompt += \"Project-specific instructions and guidelines:\\n\\n\";\n\t\tfor (const { path: filePath, content } of contextFiles) {\n\t\t\tprompt += `<project_instructions path=\"${filePath}\">\\n${content}\\n</project_instructions>\\n\\n`;\n\t\t}\n\t\tprompt += \"</project_context>\\n\";\n\t}\n\n\t// Append skills section (only if read tool is available)\n\tif (hasRead && skills.length > 0) {\n\t\tprompt += formatSkillsForPrompt(skills);\n\t}\n\n\t// Add date and working directory last\n\tprompt += `\\nCurrent date: ${date}`;\n\tprompt += `\\nCurrent working directory: ${promptCwd}`;\n\n\treturn prompt;\n}\n"]}
|