@code-yeongyu/senpi 2026.8.13 → 2026.8.16
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 +1 -0
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +14 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js +5 -4
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/core/agent-session.d.ts +80 -8
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +206 -31
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +19 -8
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/experimental.d.ts +4 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +4 -0
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/export-html/template.js +31 -9
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.d.ts +4 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.js +30 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts +2 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js +13 -47
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts +18 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js +64 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.d.ts +3 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.js +27 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts +15 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js +45 -11
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +3 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +17 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +225 -75
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +2 -3
- package/dist/core/extensions/builtin/compaction/lane-policy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.js +2 -3
- package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.js +2 -0
- package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/overflow-retry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/overflow-retry.js +38 -4
- package/dist/core/extensions/builtin/compaction/overflow-retry.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +2 -1
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/summarization-turn-order.d.ts +33 -0
- package/dist/core/extensions/builtin/compaction/summarization-turn-order.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/summarization-turn-order.js +67 -0
- package/dist/core/extensions/builtin/compaction/summarization-turn-order.js.map +1 -0
- package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.js +31 -8
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.js +11 -12
- package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js +16 -0
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +4 -0
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/process-tree.js +6 -1
- package/dist/core/extensions/builtin/mcp/process-tree.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.js +14 -0
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.js +91 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/index.js +22 -2
- package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js +25 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.js +2 -0
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/extensions/builtin/reasoning/index.d.ts +3 -0
- package/dist/core/extensions/builtin/reasoning/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/reasoning/index.js +211 -0
- package/dist/core/extensions/builtin/reasoning/index.js.map +1 -0
- package/dist/core/extensions/builtin/service-tier.d.ts +44 -1
- package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
- package/dist/core/extensions/builtin/service-tier.js +176 -24
- package/dist/core/extensions/builtin/service-tier.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +4 -4
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +13 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +24 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/lockfile-policy.d.ts +15 -0
- package/dist/core/lockfile-policy.d.ts.map +1 -0
- package/dist/core/lockfile-policy.js +15 -0
- package/dist/core/lockfile-policy.js.map +1 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +1 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts +34 -7
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +115 -27
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +5 -3
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-api-key-auth.d.ts.map +1 -1
- package/dist/core/provider-api-key-auth.js +45 -2
- package/dist/core/provider-api-key-auth.js.map +1 -1
- package/dist/core/provider-composer.d.ts +12 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts +13 -0
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +15 -0
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts +1 -1
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +5 -3
- package/dist/core/retry-fallback/controller.js.map +1 -1
- package/dist/core/retry-fallback/settings.d.ts.map +1 -1
- package/dist/core/retry-fallback/settings.js +4 -1
- package/dist/core/retry-fallback/settings.js.map +1 -1
- package/dist/core/sdk.d.ts +5 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +14 -8
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +20 -4
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +50 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +258 -15
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/thinking-levels.d.ts +22 -0
- package/dist/core/thinking-levels.d.ts.map +1 -1
- package/dist/core/thinking-levels.js +29 -0
- package/dist/core/thinking-levels.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +2 -0
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +2 -0
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +2 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +2 -0
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +18 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +2 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +17 -1
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/model-favorites.d.ts +2 -1
- package/dist/modes/interactive/components/model-favorites.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-favorites.js +72 -6
- package/dist/modes/interactive/components/model-favorites.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +5 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +10 -6
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +10 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +22 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +14 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +109 -50
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
- package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
- package/dist/modes/interactive/model-catalog-refresh.js +36 -0
- package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +2 -0
- package/dist/modes/interactive/theme/grok-day.json +2 -0
- package/dist/modes/interactive/theme/grok-night.json +2 -0
- package/dist/modes/interactive/theme/light.json +2 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +23 -10
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +9 -1
- package/dist/modes/interactive/theme/theme.d.ts +5 -3
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +12 -2
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +4 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +5 -2
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts +10 -0
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +87 -19
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +3 -3
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +26 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +25 -2
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +60 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +2 -14
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-writer.d.ts +29 -10
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +229 -50
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/server/create-harness.d.ts.map +1 -1
- package/dist/server/create-harness.js +2 -0
- package/dist/server/create-harness.js.map +1 -1
- package/dist/utils/shell.d.ts +27 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +79 -13
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +10 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +14 -19
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/compaction.md +3 -3
- package/docs/custom-provider.md +1 -1
- package/docs/environment-variables.md +8 -2
- package/docs/extensions.md +13 -1
- package/docs/json.md +9 -5
- package/docs/keybindings.md +8 -2
- package/docs/providers.md +9 -1
- package/docs/rpc.md +128 -6
- package/docs/sdk.md +9 -0
- package/docs/settings.md +93 -1
- package/docs/terminal-setup.md +23 -2
- package/docs/themes.md +24 -3
- package/docs/tui.md +2 -2
- package/docs/usage.md +24 -4
- package/examples/extensions/subagent/agents.ts +40 -9
- package/examples/extensions/subagent/index.ts +26 -3
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +38 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +5 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +5 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +14 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/call-capture.ts +64 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +45 -61
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +6 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-execution-event.ts +201 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +22 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts +25 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +77 -12
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.d.ts +43 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.js +67 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.d.ts +4 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.js +127 -88
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.d.ts +5 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.js +9 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.d.ts +12 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.js +88 -45
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.js +28 -19
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/types.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts +6 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +7 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js +19 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts +18 -5
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts +4 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/search/index.d.ts +21 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/index.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/index.js +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/index.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.d.ts +29 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.js +103 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/README.md +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +40 -14
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +16 -4
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.d.ts +69 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.js +159 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js +125 -5
- package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +13 -9
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js +208 -42
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +13 -4
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +10 -7
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +31 -7
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +8 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.d.ts +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.js +234 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.js +6 -3
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +44 -9
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js +32 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/deepseek.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/google-vertex.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +14 -3
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.js +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js +34 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/README.md +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.d.ts +26 -0
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.js +121 -0
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.js.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.d.ts +6 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js +23 -7
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +4 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js +7 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts +30 -0
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.js +24 -0
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/layout.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/layout.js +9 -2
- package/node_modules/@earendil-works/pi-tui/dist/layout.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts +8 -2
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js +6 -2
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +6 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +18 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts +21 -0
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js +243 -5
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +2 -0
- package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.js +33 -8
- package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.d.ts +0 -19
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.js +0 -41
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.js.map +0 -1
|
@@ -23,6 +23,42 @@ export interface AgentDiscoveryResult {
|
|
|
23
23
|
projectAgentsDir: string | null;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Raw agent frontmatter. Values are `unknown` because `parseFrontmatter` runs a
|
|
28
|
+
* real YAML parser, so any scalar or collection can appear here.
|
|
29
|
+
*
|
|
30
|
+
* A type alias rather than an interface: `parseFrontmatter` constrains its
|
|
31
|
+
* parameter to `Record<string, unknown>`, and only an alias picks up the
|
|
32
|
+
* implicit index signature that satisfies it.
|
|
33
|
+
*/
|
|
34
|
+
type AgentFrontmatter = {
|
|
35
|
+
name?: unknown;
|
|
36
|
+
description?: unknown;
|
|
37
|
+
tools?: unknown;
|
|
38
|
+
model?: unknown;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Normalize a frontmatter `tools` value to a list of tool names.
|
|
43
|
+
*
|
|
44
|
+
* Both spellings are valid YAML and both are in use:
|
|
45
|
+
*
|
|
46
|
+
* tools: read, bash # string
|
|
47
|
+
* tools: [read, bash] # array
|
|
48
|
+
*
|
|
49
|
+
* so accept either. Anything else (a number, a map, a nested list) yields no
|
|
50
|
+
* tools rather than throwing: this runs inside agent discovery, where a single
|
|
51
|
+
* bad file must not take down every other agent in the same directory.
|
|
52
|
+
*/
|
|
53
|
+
function parseToolList(value: unknown): string[] | undefined {
|
|
54
|
+
const raw = Array.isArray(value) ? value : typeof value === "string" ? value.split(",") : [];
|
|
55
|
+
const tools = raw
|
|
56
|
+
.filter((t): t is string => typeof t === "string")
|
|
57
|
+
.map((t) => t.trim())
|
|
58
|
+
.filter(Boolean);
|
|
59
|
+
return tools.length > 0 ? tools : undefined;
|
|
60
|
+
}
|
|
61
|
+
|
|
26
62
|
function loadAgentsFromDir(dir: string, source: "user" | "project"): AgentConfig[] {
|
|
27
63
|
const agents: AgentConfig[] = [];
|
|
28
64
|
|
|
@@ -49,22 +85,17 @@ function loadAgentsFromDir(dir: string, source: "user" | "project"): AgentConfig
|
|
|
49
85
|
continue;
|
|
50
86
|
}
|
|
51
87
|
|
|
52
|
-
const { frontmatter, body } = parseFrontmatter<
|
|
88
|
+
const { frontmatter, body } = parseFrontmatter<AgentFrontmatter>(content);
|
|
53
89
|
|
|
54
|
-
if (
|
|
90
|
+
if (typeof frontmatter.name !== "string" || typeof frontmatter.description !== "string") {
|
|
55
91
|
continue;
|
|
56
92
|
}
|
|
57
93
|
|
|
58
|
-
const tools = frontmatter.tools
|
|
59
|
-
?.split(",")
|
|
60
|
-
.map((t: string) => t.trim())
|
|
61
|
-
.filter(Boolean);
|
|
62
|
-
|
|
63
94
|
agents.push({
|
|
64
95
|
name: frontmatter.name,
|
|
65
96
|
description: frontmatter.description,
|
|
66
|
-
tools:
|
|
67
|
-
model: frontmatter.model,
|
|
97
|
+
tools: parseToolList(frontmatter.tools),
|
|
98
|
+
model: typeof frontmatter.model === "string" ? frontmatter.model : undefined,
|
|
68
99
|
systemPrompt: body,
|
|
69
100
|
source,
|
|
70
101
|
filePath,
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
* - Chain: { chain: [{ agent: "name", task: "... {previous} ..." }, ...] }
|
|
11
11
|
*
|
|
12
12
|
* Uses JSON mode to capture structured output from subagents.
|
|
13
|
+
*
|
|
14
|
+
* Agent definitions live in `~/.pi/agent/agents/*.md` (user scope) and `.pi/agents/*.md`
|
|
15
|
+
* (project scope), with `name`, `description`, optional `tools` (`read, bash` or `[read, bash]`)
|
|
16
|
+
* and optional `model` frontmatter. When `model` is omitted, the subagent inherits the
|
|
17
|
+
* dispatching session's active model and thinking level.
|
|
13
18
|
*/
|
|
14
19
|
|
|
15
20
|
import { spawn } from "node:child_process";
|
|
@@ -23,7 +28,7 @@ import {
|
|
|
23
28
|
getMarkdownTheme,
|
|
24
29
|
withFileMutationQueue,
|
|
25
30
|
} from "@code-yeongyu/senpi";
|
|
26
|
-
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
31
|
+
import type { AgentToolResult, ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
27
32
|
import type { Message } from "@earendil-works/pi-ai";
|
|
28
33
|
import { StringEnum } from "@earendil-works/pi-ai";
|
|
29
34
|
import { Container, Markdown, Spacer, Text } from "@earendil-works/pi-tui";
|
|
@@ -264,8 +269,14 @@ function getPiInvocation(args: string[]): { command: string; args: string[] } {
|
|
|
264
269
|
|
|
265
270
|
type OnUpdateCallback = (partial: AgentToolResult<SubagentDetails>) => void;
|
|
266
271
|
|
|
272
|
+
interface DispatchDefaults {
|
|
273
|
+
model?: string;
|
|
274
|
+
thinkingLevel?: ThinkingLevel;
|
|
275
|
+
}
|
|
276
|
+
|
|
267
277
|
async function runSingleAgent(
|
|
268
278
|
defaultCwd: string,
|
|
279
|
+
dispatchDefaults: DispatchDefaults,
|
|
269
280
|
agents: AgentConfig[],
|
|
270
281
|
agentName: string,
|
|
271
282
|
task: string,
|
|
@@ -292,7 +303,12 @@ async function runSingleAgent(
|
|
|
292
303
|
}
|
|
293
304
|
|
|
294
305
|
const args: string[] = ["--mode", "json", "-p", "--no-session"];
|
|
295
|
-
|
|
306
|
+
const inheritsDispatchConfig = !agent.model;
|
|
307
|
+
const model = agent.model ?? dispatchDefaults.model;
|
|
308
|
+
if (model) args.push("--model", model);
|
|
309
|
+
if (inheritsDispatchConfig && dispatchDefaults.thinkingLevel) {
|
|
310
|
+
args.push("--thinking", dispatchDefaults.thinkingLevel);
|
|
311
|
+
}
|
|
296
312
|
if (agent.tools && agent.tools.length > 0) args.push("--tools", agent.tools.join(","));
|
|
297
313
|
|
|
298
314
|
let tmpPromptDir: string | null = null;
|
|
@@ -306,7 +322,7 @@ async function runSingleAgent(
|
|
|
306
322
|
messages: [],
|
|
307
323
|
stderr: "",
|
|
308
324
|
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
|
|
309
|
-
model
|
|
325
|
+
model,
|
|
310
326
|
step,
|
|
311
327
|
};
|
|
312
328
|
|
|
@@ -471,6 +487,10 @@ export default function (pi: ExtensionAPI) {
|
|
|
471
487
|
|
|
472
488
|
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
473
489
|
const agentScope: AgentScope = params.agentScope ?? "user";
|
|
490
|
+
const dispatchDefaults: DispatchDefaults = {
|
|
491
|
+
model: ctx.model ? `${ctx.model.provider}/${ctx.model.id}` : undefined,
|
|
492
|
+
thinkingLevel: ctx.thinkingLevel,
|
|
493
|
+
};
|
|
474
494
|
const discovery = discoverAgents(ctx.cwd, agentScope);
|
|
475
495
|
const agents = discovery.agents;
|
|
476
496
|
const confirmProjectAgents = params.confirmProjectAgents ?? true;
|
|
@@ -552,6 +572,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
552
572
|
|
|
553
573
|
const result = await runSingleAgent(
|
|
554
574
|
ctx.cwd,
|
|
575
|
+
dispatchDefaults,
|
|
555
576
|
agents,
|
|
556
577
|
step.agent,
|
|
557
578
|
taskWithContext,
|
|
@@ -624,6 +645,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
624
645
|
const results = await mapWithConcurrencyLimit(params.tasks, MAX_CONCURRENCY, async (t, index) => {
|
|
625
646
|
const result = await runSingleAgent(
|
|
626
647
|
ctx.cwd,
|
|
648
|
+
dispatchDefaults,
|
|
627
649
|
agents,
|
|
628
650
|
t.agent,
|
|
629
651
|
t.task,
|
|
@@ -666,6 +688,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
666
688
|
if (params.agent && params.task) {
|
|
667
689
|
const result = await runSingleAgent(
|
|
668
690
|
ctx.cwd,
|
|
691
|
+
dispatchDefaults,
|
|
669
692
|
agents,
|
|
670
693
|
params.agent,
|
|
671
694
|
params.task,
|
|
@@ -12,6 +12,44 @@
|
|
|
12
12
|
|
|
13
13
|
### Removed
|
|
14
14
|
|
|
15
|
+
## [2026.8.16] - 2026-08-16
|
|
16
|
+
|
|
17
|
+
### Breaking Changes
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- Published one versioned `senpi.eval.execution` event per settled eval cell: the in-process bus receives bounded rich call details, while the external RPC projection exposes only byte-capped timing/count metadata for safe OMO analytics; total wall time, kernel runtime, pending calls, exact aggregate totals, and overflow accounting are reported separately ([#897](https://github.com/code-yeongyu/senpi/pull/897)).
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
### Removed
|
|
28
|
+
|
|
29
|
+
## [2026.8.14] - 2026-08-14
|
|
30
|
+
|
|
31
|
+
### Breaking Changes
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
### Removed
|
|
40
|
+
|
|
41
|
+
## [2026.8.13-2] - 2026-08-13
|
|
42
|
+
|
|
43
|
+
### Breaking Changes
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
|
|
47
|
+
### Changed
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
|
|
51
|
+
### Removed
|
|
52
|
+
|
|
15
53
|
## [2026.8.13] - 2026-08-13
|
|
16
54
|
|
|
17
55
|
### Breaking Changes
|
|
@@ -20,6 +20,11 @@ task-tool names are known.
|
|
|
20
20
|
- Loopback, bearer-authenticated kernel bridge with bounded JSONL frames.
|
|
21
21
|
- Structured status events for file operations, environment access, phases,
|
|
22
22
|
bridge activity, and delegated task progress.
|
|
23
|
+
- One versioned `senpi.eval.execution` event at terminal cell settlement. The
|
|
24
|
+
in-process event bus receives bounded per-call arguments and result previews
|
|
25
|
+
for extension-owned consumers; external RPC clients receive a 32 KiB-capped
|
|
26
|
+
metadata-only projection with wall time, kernel time, exact call counts,
|
|
27
|
+
pending-call counts, and bounded per-tool aggregates.
|
|
23
28
|
- Bounded streaming output with head/tail previews, column clamping, and
|
|
24
29
|
session-adjacent spill files for large streams.
|
|
25
30
|
- TUI and HTML-export rendering for syntax-highlighted cells, status rows,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-yeongyu/senpi-codemode",
|
|
3
|
-
"version": "2026.8.
|
|
3
|
+
"version": "2026.8.16",
|
|
4
|
+
"private": true,
|
|
4
5
|
"description": "Source-only senpi extension package for codemode evaluation tools",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"main": "./src/index.ts",
|
|
@@ -30,14 +31,14 @@
|
|
|
30
31
|
},
|
|
31
32
|
"dependencies": {
|
|
32
33
|
"@babel/parser": "8.0.4",
|
|
33
|
-
"@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.8.
|
|
34
|
+
"@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.8.16",
|
|
34
35
|
"typebox": "1.3.8"
|
|
35
36
|
},
|
|
36
37
|
"peerDependencies": {
|
|
37
|
-
"@code-yeongyu/senpi": "2026.8.
|
|
38
|
+
"@code-yeongyu/senpi": "2026.8.16"
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
40
|
-
"@code-yeongyu/senpi": "2026.8.
|
|
41
|
+
"@code-yeongyu/senpi": "2026.8.16"
|
|
41
42
|
},
|
|
42
43
|
"keywords": [
|
|
43
44
|
"senpi",
|
|
@@ -17,6 +17,11 @@ import type { CodemodeSessionManager, CreateCodemodeSessionManagerOptions } from
|
|
|
17
17
|
import { SessionManagerProxy } from "./extension/session-manager-proxy.ts";
|
|
18
18
|
import { WAKE_SOURCE_STATE_EVENT, type WakeSourceState } from "./extension/wake-source-state.ts";
|
|
19
19
|
import { EvalDetachedCellManager, type EvalDetachedCellStatusEntry } from "./tool/detached-cell-manager.ts";
|
|
20
|
+
import {
|
|
21
|
+
EVAL_EXECUTION_EVENT,
|
|
22
|
+
type EvalExecutionEventPayload,
|
|
23
|
+
toEvalExecutionRpcPayload,
|
|
24
|
+
} from "./tool/eval-execution-event.ts";
|
|
20
25
|
import { createEvalTool } from "./tool/eval-tool.ts";
|
|
21
26
|
import { renderEvalCall, renderEvalResult } from "./tool/render.ts";
|
|
22
27
|
|
|
@@ -39,8 +44,10 @@ export interface CodemodeExtensionAPI {
|
|
|
39
44
|
getActiveTools(): string[];
|
|
40
45
|
getAllTools(): readonly EvalSchemaToolInfo[];
|
|
41
46
|
sendUserMessage(content: string, options?: { deliverAs?: "steer" | "followUp" }): void;
|
|
42
|
-
/** Optional host event bus; a host without one turns
|
|
47
|
+
/** Optional host event bus; a host without one turns extension event emission into a harmless no-op. */
|
|
43
48
|
events?: { emit(name: string, data: unknown): void };
|
|
49
|
+
/** Optional host RPC surface for forwarding extension-owned events to connected clients. */
|
|
50
|
+
rpc?: { emit(name: string, data: unknown): void };
|
|
44
51
|
}
|
|
45
52
|
|
|
46
53
|
export interface SenpiCodemodeOptions {
|
|
@@ -90,6 +97,11 @@ export default function senpiCodemode(pi: CodemodeExtensionAPI, options: SenpiCo
|
|
|
90
97
|
modelId: string | undefined,
|
|
91
98
|
cellManager: EvalDetachedCellManager,
|
|
92
99
|
): void => {
|
|
100
|
+
const onCellSettled = (payload: EvalExecutionEventPayload): void => {
|
|
101
|
+
if (activeCells !== cellManager) return;
|
|
102
|
+
pi.rpc?.emit(EVAL_EXECUTION_EVENT, toEvalExecutionRpcPayload(payload));
|
|
103
|
+
pi.events?.emit(EVAL_EXECUTION_EVENT, payload);
|
|
104
|
+
};
|
|
93
105
|
pi.registerTool(
|
|
94
106
|
createEvalTool({
|
|
95
107
|
enabledLanguages: runtime.enabledLanguages,
|
|
@@ -102,6 +114,7 @@ export default function senpiCodemode(pi: CodemodeExtensionAPI, options: SenpiCo
|
|
|
102
114
|
artifactsDir: runtime.artifactsDir,
|
|
103
115
|
cellManager,
|
|
104
116
|
executionTracker: manager,
|
|
117
|
+
onCellSettled,
|
|
105
118
|
renderers,
|
|
106
119
|
spawns: runtime.spawns,
|
|
107
120
|
spawnDefaultAgent: runtime.settings.taskTools.task,
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { type AgentToolResult, sanitizeTerminalLabel } from "@code-yeongyu/senpi";
|
|
2
|
+
import type { EvalToolCallSummary } from "./types.ts";
|
|
2
3
|
|
|
3
4
|
export const MAX_ENRICHED_TOOL_CALLS = 30;
|
|
5
|
+
export const MAX_AGGREGATED_TOOL_NAMES = 64;
|
|
6
|
+
export const MAX_CAPTURED_IDENTIFIER_CODE_POINTS = 128;
|
|
7
|
+
export const MAX_CAPTURED_TOOL_NAME_CODE_POINTS = 128;
|
|
8
|
+
export const MAX_RPC_EVENT_BYTES = 32 * 1024;
|
|
4
9
|
|
|
5
10
|
const MAX_ARGUMENT_STRING_CODE_POINTS = 512;
|
|
6
11
|
const MAX_ARGUMENT_ENTRIES = 32;
|
|
@@ -13,6 +18,22 @@ type BoundedValue = {
|
|
|
13
18
|
readonly truncated: boolean;
|
|
14
19
|
};
|
|
15
20
|
|
|
21
|
+
export interface EvalToolCallMetric {
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly startedAt: number;
|
|
24
|
+
ok: boolean | undefined;
|
|
25
|
+
durationMs: number | undefined;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ToolCallCapture {
|
|
29
|
+
readonly callId: string;
|
|
30
|
+
readonly args: unknown;
|
|
31
|
+
readonly startedAt: number;
|
|
32
|
+
readonly metric: EvalToolCallMetric;
|
|
33
|
+
readonly includeDetails: boolean;
|
|
34
|
+
readonly argsTruncated?: true;
|
|
35
|
+
}
|
|
36
|
+
|
|
16
37
|
export function capCodePoints(text: string, max: number): string {
|
|
17
38
|
let end = 0;
|
|
18
39
|
let count = 0;
|
|
@@ -83,6 +104,49 @@ export function boundToolCallArgs(args: unknown): { args: unknown; truncated: bo
|
|
|
83
104
|
}
|
|
84
105
|
}
|
|
85
106
|
|
|
107
|
+
export function createToolCallMetric(name: string, startedAt: number): EvalToolCallMetric {
|
|
108
|
+
return {
|
|
109
|
+
name: capCodePoints(name, MAX_CAPTURED_TOOL_NAME_CODE_POINTS),
|
|
110
|
+
startedAt,
|
|
111
|
+
ok: undefined,
|
|
112
|
+
durationMs: undefined,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function settleToolCallMetric(metric: EvalToolCallMetric, ok: boolean, completedAt: number): void {
|
|
117
|
+
metric.ok = ok;
|
|
118
|
+
metric.durationMs = Math.max(0, completedAt - metric.startedAt);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function recordToolCall(
|
|
122
|
+
toolCalls: EvalToolCallSummary[],
|
|
123
|
+
ok: boolean,
|
|
124
|
+
capture: ToolCallCapture,
|
|
125
|
+
resultPreview: string | undefined,
|
|
126
|
+
error: string | undefined,
|
|
127
|
+
): void {
|
|
128
|
+
const completedAt = Date.now();
|
|
129
|
+
settleToolCallMetric(capture.metric, ok, completedAt);
|
|
130
|
+
const summary = {
|
|
131
|
+
name: capture.metric.name,
|
|
132
|
+
ok,
|
|
133
|
+
...(error === undefined ? {} : { error: capCodePoints(error, 512) }),
|
|
134
|
+
...(capture.includeDetails ? { durationMs: completedAt - capture.startedAt } : {}),
|
|
135
|
+
};
|
|
136
|
+
const enrichedCount = toolCalls.filter((toolCall) => toolCall.callId !== undefined).length;
|
|
137
|
+
if (!capture.includeDetails || enrichedCount >= MAX_ENRICHED_TOOL_CALLS) {
|
|
138
|
+
toolCalls.push(summary);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
toolCalls.push({
|
|
142
|
+
...summary,
|
|
143
|
+
callId: capture.callId,
|
|
144
|
+
args: capture.args,
|
|
145
|
+
...(capture.argsTruncated === true ? { argsTruncated: true } : {}),
|
|
146
|
+
...(resultPreview === undefined ? {} : { resultPreview }),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
86
150
|
export function toolCallResultPreview(result: AgentToolResult<unknown>): string | undefined {
|
|
87
151
|
for (const part of result.content) {
|
|
88
152
|
if (part.type !== "text") continue;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type AgentToolResult, type ExtensionContext, sanitizeTerminalLabel } from "@code-yeongyu/senpi";
|
|
2
2
|
import type { KernelToHostMessage } from "../bridge/protocol.ts";
|
|
3
|
+
import { RESERVED_SCHEMA_TOOL } from "../bridge/reserved.ts";
|
|
3
4
|
import type { AgentExecuteTool } from "../bridges/agent-bridge.ts";
|
|
4
5
|
import { isReservedToolName, runReservedTool } from "../bridges/reserved-dispatch.ts";
|
|
5
6
|
import type { EvalSchemaToolInfo } from "../bridges/schema-bridge.ts";
|
|
@@ -7,7 +8,15 @@ import { appendSchemaHint } from "../bridges/schema-hint.ts";
|
|
|
7
8
|
import type { CompletionRequest, CompletionResult } from "../completion/handler.ts";
|
|
8
9
|
import { handleCompletionToolCall } from "../completion/tool-bridge.ts";
|
|
9
10
|
import type { ResolvedCodemodeSettings } from "../config/settings.ts";
|
|
10
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
boundToolCallArgs,
|
|
13
|
+
capCodePoints,
|
|
14
|
+
createToolCallMetric,
|
|
15
|
+
MAX_CAPTURED_IDENTIFIER_CODE_POINTS,
|
|
16
|
+
recordToolCall,
|
|
17
|
+
type ToolCallCapture,
|
|
18
|
+
toolCallResultPreview,
|
|
19
|
+
} from "./call-capture.ts";
|
|
11
20
|
import { CellResultBuilder, type CellState } from "./cell-runtime.ts";
|
|
12
21
|
import { type EvalImageResizer, marshalToolResult, toolResultIsError } from "./image.ts";
|
|
13
22
|
import { upsertStatusEvent } from "./status-events.ts";
|
|
@@ -22,13 +31,6 @@ type ResolvedToolReply = {
|
|
|
22
31
|
readonly errorText?: string;
|
|
23
32
|
};
|
|
24
33
|
|
|
25
|
-
type ToolCallEnrichment = {
|
|
26
|
-
readonly callId: string;
|
|
27
|
-
readonly args: unknown;
|
|
28
|
-
readonly startedAt: number;
|
|
29
|
-
readonly argsTruncated?: true;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
34
|
export interface CellBridgeRuntime {
|
|
33
35
|
readonly executeTool: AgentExecuteTool;
|
|
34
36
|
readonly listTools?: () => readonly EvalSchemaToolInfo[];
|
|
@@ -111,9 +113,21 @@ export class CellHandler {
|
|
|
111
113
|
}
|
|
112
114
|
|
|
113
115
|
async #handleToolCall(message: Extract<KernelToHostMessage, { type: "tool-call" }>): Promise<void> {
|
|
116
|
+
const startedAt = Date.now();
|
|
117
|
+
const metric = createToolCallMetric(message.toolName, startedAt);
|
|
118
|
+
this.#state.toolCallMetrics.push(metric);
|
|
119
|
+
const capturedArgs = boundToolCallArgs(message.args);
|
|
120
|
+
const capture: ToolCallCapture = {
|
|
121
|
+
callId: capCodePoints(message.callId, MAX_CAPTURED_IDENTIFIER_CODE_POINTS),
|
|
122
|
+
args: capturedArgs.args,
|
|
123
|
+
startedAt,
|
|
124
|
+
metric,
|
|
125
|
+
includeDetails: message.toolName !== RESERVED_SCHEMA_TOOL,
|
|
126
|
+
...(capturedArgs.truncated ? { argsTruncated: true } : {}),
|
|
127
|
+
};
|
|
114
128
|
if (message.toolName === "eval") {
|
|
115
129
|
const error = "recursive eval is not allowed";
|
|
116
|
-
this.#state.toolCalls
|
|
130
|
+
recordToolCall(this.#state.toolCalls, false, capture, undefined, error);
|
|
117
131
|
this.#kernel.deliverToolReply({
|
|
118
132
|
type: "tool-reply",
|
|
119
133
|
callId: message.callId,
|
|
@@ -123,20 +137,24 @@ export class CellHandler {
|
|
|
123
137
|
return;
|
|
124
138
|
}
|
|
125
139
|
if (isReservedToolName(message.toolName)) {
|
|
126
|
-
await this.#deliverToolReply(
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
140
|
+
await this.#deliverToolReply(
|
|
141
|
+
message,
|
|
142
|
+
async () => ({
|
|
143
|
+
value: await runReservedTool(message.toolName, {
|
|
144
|
+
callId: message.callId,
|
|
145
|
+
args: message.args,
|
|
146
|
+
executeTool: this.#runtime.executeTool,
|
|
147
|
+
taskToolName: this.#runtime.settings.taskTools.task,
|
|
148
|
+
taskOutputToolName: this.#runtime.settings.taskTools.output,
|
|
149
|
+
listTools: this.#runtime.listTools,
|
|
150
|
+
signal: this.#state.signal,
|
|
151
|
+
emitStatus: (event) => this.#recordStatus(event),
|
|
152
|
+
marshalToolResult,
|
|
153
|
+
}),
|
|
154
|
+
toolCallOk: true,
|
|
137
155
|
}),
|
|
138
|
-
|
|
139
|
-
|
|
156
|
+
capture,
|
|
157
|
+
);
|
|
140
158
|
return;
|
|
141
159
|
}
|
|
142
160
|
if (message.toolName === "completion" && this.#runtime.complete) {
|
|
@@ -148,16 +166,10 @@ export class CellHandler {
|
|
|
148
166
|
isActive: () => this.#state.active,
|
|
149
167
|
});
|
|
150
168
|
if (!this.#state.active) return;
|
|
151
|
-
this.#state.toolCalls.
|
|
152
|
-
result.ok
|
|
153
|
-
? { name: message.toolName, ok: true }
|
|
154
|
-
: { name: message.toolName, ok: false, error: result.error },
|
|
155
|
-
);
|
|
169
|
+
recordToolCall(this.#state.toolCalls, result.ok, capture, undefined, result.ok ? undefined : result.error);
|
|
156
170
|
this.#resultBuilder.emitUpdate(false);
|
|
157
171
|
return;
|
|
158
172
|
}
|
|
159
|
-
const capturedArgs = boundToolCallArgs(message.args);
|
|
160
|
-
const startedAt = Date.now();
|
|
161
173
|
await this.#deliverToolReply(
|
|
162
174
|
message,
|
|
163
175
|
async () => {
|
|
@@ -185,24 +197,19 @@ export class CellHandler {
|
|
|
185
197
|
...(errorText === undefined ? {} : { errorText }),
|
|
186
198
|
};
|
|
187
199
|
},
|
|
188
|
-
|
|
189
|
-
callId: message.callId,
|
|
190
|
-
args: capturedArgs.args,
|
|
191
|
-
startedAt,
|
|
192
|
-
...(capturedArgs.truncated ? { argsTruncated: true } : {}),
|
|
193
|
-
},
|
|
200
|
+
capture,
|
|
194
201
|
);
|
|
195
202
|
}
|
|
196
203
|
|
|
197
204
|
async #deliverToolReply(
|
|
198
205
|
message: Extract<KernelToHostMessage, { type: "tool-call" }>,
|
|
199
206
|
resolve: () => Promise<ResolvedToolReply>,
|
|
200
|
-
|
|
207
|
+
capture: ToolCallCapture,
|
|
201
208
|
): Promise<void> {
|
|
202
209
|
try {
|
|
203
210
|
const reply = await resolve();
|
|
204
211
|
if (!this.#state.active) return;
|
|
205
|
-
this.#
|
|
212
|
+
recordToolCall(this.#state.toolCalls, reply.toolCallOk, capture, reply.resultPreview, reply.errorText);
|
|
206
213
|
this.#kernel.deliverToolReply({ type: "tool-reply", callId: message.callId, ok: true, value: reply.value });
|
|
207
214
|
} catch (error) {
|
|
208
215
|
if (!this.#state.active) return;
|
|
@@ -211,7 +218,7 @@ export class CellHandler {
|
|
|
211
218
|
message.toolName,
|
|
212
219
|
this.#toolParameters(message.toolName),
|
|
213
220
|
);
|
|
214
|
-
this.#
|
|
221
|
+
recordToolCall(this.#state.toolCalls, false, capture, undefined, text);
|
|
215
222
|
this.#kernel.deliverToolReply({
|
|
216
223
|
type: "tool-reply",
|
|
217
224
|
callId: message.callId,
|
|
@@ -222,29 +229,6 @@ export class CellHandler {
|
|
|
222
229
|
this.#resultBuilder.emitUpdate(false);
|
|
223
230
|
}
|
|
224
231
|
|
|
225
|
-
#pushToolCall(
|
|
226
|
-
name: string,
|
|
227
|
-
ok: boolean,
|
|
228
|
-
enrich: ToolCallEnrichment | undefined,
|
|
229
|
-
resultPreview: string | undefined,
|
|
230
|
-
error: string | undefined,
|
|
231
|
-
): void {
|
|
232
|
-
const summary = { name, ok, ...(error === undefined ? {} : { error }) };
|
|
233
|
-
const enrichedCount = this.#state.toolCalls.filter((toolCall) => toolCall.callId !== undefined).length;
|
|
234
|
-
if (enrich === undefined || enrichedCount >= MAX_ENRICHED_TOOL_CALLS) {
|
|
235
|
-
this.#state.toolCalls.push(summary);
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
this.#state.toolCalls.push({
|
|
239
|
-
...summary,
|
|
240
|
-
callId: enrich.callId,
|
|
241
|
-
args: enrich.args,
|
|
242
|
-
durationMs: Date.now() - enrich.startedAt,
|
|
243
|
-
...(enrich.argsTruncated === true ? { argsTruncated: true } : {}),
|
|
244
|
-
...(resultPreview === undefined ? {} : { resultPreview }),
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
|
|
248
232
|
#toolParameters(toolName: string): unknown {
|
|
249
233
|
return this.#runtime.listTools?.().find((tool) => tool.name === toolName)?.parameters;
|
|
250
234
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AgentToolResult, AgentToolUpdateCallback, ExtensionContext } from "@code-yeongyu/senpi";
|
|
2
2
|
import type { KernelToHostMessage } from "../bridge/protocol.ts";
|
|
3
|
+
import type { EvalToolCallMetric } from "./call-capture.ts";
|
|
3
4
|
import { type EvalImageResizer, EvalOutputCollector, type EvalOutputResult } from "./image.ts";
|
|
4
5
|
import type { EvalStatusEvent, EvalToolDetails, EvalToolInput } from "./types.ts";
|
|
5
6
|
|
|
@@ -9,14 +10,17 @@ type ToolCall = EvalToolDetails["toolCalls"] extends readonly (infer Item)[] ? I
|
|
|
9
10
|
|
|
10
11
|
export interface CellState {
|
|
11
12
|
readonly input: EvalToolInput;
|
|
13
|
+
readonly startedAt: number;
|
|
12
14
|
readonly signal: AbortSignal;
|
|
13
15
|
readonly onUpdate: AgentToolUpdateCallback<EvalToolDetails> | undefined;
|
|
14
16
|
readonly toolCalls: ToolCall[];
|
|
17
|
+
readonly toolCallMetrics: EvalToolCallMetric[];
|
|
15
18
|
readonly pendingBridgeCalls: Promise<void>[];
|
|
16
19
|
readonly statusEvents: EvalStatusEvent[];
|
|
17
20
|
active: boolean;
|
|
18
21
|
output: string;
|
|
19
22
|
phase: string | undefined;
|
|
23
|
+
error: string | undefined;
|
|
20
24
|
durationMs: number;
|
|
21
25
|
status: "pending" | "running" | "complete" | "error";
|
|
22
26
|
}
|
|
@@ -70,6 +74,7 @@ export class CellResultBuilder {
|
|
|
70
74
|
if (result.valueRepr) this.#output.push(`${result.valueRepr}\n`);
|
|
71
75
|
this.#state.status = "complete";
|
|
72
76
|
} else {
|
|
77
|
+
this.#state.error = result.error.message;
|
|
73
78
|
this.#output.push(`${result.error.message}\n`);
|
|
74
79
|
this.#state.status = "error";
|
|
75
80
|
}
|
|
@@ -77,6 +82,7 @@ export class CellResultBuilder {
|
|
|
77
82
|
}
|
|
78
83
|
|
|
79
84
|
async finalizeCancellation(error: Error): Promise<AgentToolResult<EvalToolDetails>> {
|
|
85
|
+
this.#state.error = error.message;
|
|
80
86
|
this.#output.push(`${error.message}\n`);
|
|
81
87
|
this.#state.status = "error";
|
|
82
88
|
return await this.#finish(true);
|