@selesai/code 0.5.28 → 0.6.1
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 +24 -0
- package/README.md +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +9 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/credential-print.d.ts +23 -0
- package/dist/cli/credential-print.d.ts.map +1 -0
- package/dist/cli/credential-print.js +117 -0
- package/dist/cli/credential-print.js.map +1 -0
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +1 -1
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +3 -0
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +12 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +20 -14
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +11 -3
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +11 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +14 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +10 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +1 -1
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/llama/provider.d.ts.map +1 -1
- package/dist/core/llama/provider.js +8 -3
- package/dist/core/llama/provider.js.map +1 -1
- package/dist/core/model-config.d.ts +30 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +6 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +2 -2
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -0
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +20 -3
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +2 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +5 -4
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +13 -6
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +24 -11
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts +15 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +66 -9
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +19 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/system-prompt.test.d.ts +2 -0
- package/dist/core/system-prompt.test.d.ts.map +1 -0
- package/dist/core/system-prompt.test.js +89 -0
- package/dist/core/system-prompt.test.js.map +1 -0
- package/dist/core/tools/bash.d.ts +2 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +34 -5
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +3 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/defaults/models.json +13 -45
- package/dist/defaults/settings.json +1 -2
- package/dist/extensions/copy-turn.test.ts +131 -0
- package/dist/extensions/copy-turn.ts +6 -1
- package/dist/extensions/package.json +0 -1
- package/dist/extensions/pi-intercom/CHANGELOG.md +249 -0
- package/dist/extensions/pi-intercom/README.md +102 -39
- package/dist/extensions/pi-intercom/broker/broker.ts +1233 -36
- package/dist/extensions/pi-intercom/broker/client.test.ts +83 -0
- package/dist/extensions/pi-intercom/broker/client.ts +315 -12
- package/dist/extensions/pi-intercom/broker/extension-state.ts +186 -0
- package/dist/extensions/pi-intercom/broker/extension.test.ts +387 -0
- package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -0
- package/dist/extensions/pi-intercom/broker/framing.ts +82 -24
- package/dist/extensions/pi-intercom/broker/paths.test.ts +153 -0
- package/dist/extensions/pi-intercom/broker/paths.ts +117 -8
- package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -0
- package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -0
- package/dist/extensions/pi-intercom/broker/spawn.test.ts +160 -23
- package/dist/extensions/pi-intercom/broker/spawn.ts +113 -27
- package/dist/extensions/pi-intercom/config.test.ts +93 -0
- package/dist/extensions/pi-intercom/config.ts +55 -6
- package/dist/extensions/pi-intercom/cwd.test.ts +40 -0
- package/dist/extensions/pi-intercom/cwd.ts +31 -0
- package/dist/extensions/pi-intercom/extension-api.ts +44 -0
- package/dist/extensions/pi-intercom/format-context.test.ts +31 -0
- package/dist/extensions/pi-intercom/format-context.ts +32 -0
- package/dist/extensions/pi-intercom/index.ts +742 -145
- package/dist/extensions/pi-intercom/intercom.integration.test.ts +2646 -0
- package/dist/extensions/pi-intercom/package.json +15 -5
- package/dist/extensions/pi-intercom/reply-tracker.test.ts +134 -0
- package/dist/extensions/pi-intercom/reply-tracker.ts +31 -13
- package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +13 -11
- package/dist/extensions/pi-intercom/test/inline-message.test.ts +184 -0
- package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -0
- package/dist/extensions/pi-intercom/types.ts +94 -4
- package/dist/extensions/pi-intercom/ui/compose.ts +8 -4
- package/dist/extensions/pi-intercom/ui/inline-message.ts +61 -25
- package/dist/extensions/pi-intercom/ui/session-list.ts +7 -3
- package/dist/extensions/pi-subagents/CHANGELOG.md +88 -0
- package/dist/extensions/pi-subagents/LICENSE +21 -0
- package/dist/extensions/pi-subagents/README.md +158 -69
- package/dist/extensions/pi-subagents/agents/architect.md +5 -4
- package/dist/extensions/pi-subagents/agents/builder.md +6 -4
- package/dist/extensions/pi-subagents/agents/commentator.md +3 -2
- package/dist/extensions/pi-subagents/agents/explorer.md +3 -2
- package/dist/extensions/pi-subagents/agents/recapper.md +3 -2
- package/dist/extensions/pi-subagents/agents/researcher.md +4 -3
- package/dist/extensions/pi-subagents/package-lock.json +2 -2
- package/dist/extensions/pi-subagents/package.json +3 -3
- package/dist/extensions/pi-subagents/prompts/review-loop.md +1 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +22 -988
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +257 -0
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +431 -0
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +144 -0
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +281 -0
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +125 -37
- package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +4 -0
- package/dist/extensions/pi-subagents/src/agents/agents.ts +118 -9
- package/dist/extensions/pi-subagents/src/agents/skills.ts +14 -12
- package/dist/extensions/pi-subagents/src/agents/task-aware-routing.ts +125 -0
- package/dist/extensions/pi-subagents/src/api/delegation.ts +3 -0
- package/dist/extensions/pi-subagents/src/api/preflight.ts +17 -13
- package/dist/extensions/pi-subagents/src/extension/chain-validation.ts +17 -1
- package/dist/extensions/pi-subagents/src/extension/index.ts +22 -8
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +248 -6
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +33 -8
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +32 -14
- package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +9 -4
- package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +33 -4
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +86 -21
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +24 -13
- package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +7 -5
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -2
- package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +48 -5
- package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +68 -1
- package/dist/extensions/pi-subagents/src/runs/background/notify.ts +56 -5
- package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +92 -11
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +29 -3
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +388 -29
- package/dist/extensions/pi-subagents/src/runs/foreground/async-stop-action.ts +65 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +3 -3
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +214 -60
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +546 -252
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +42 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +553 -154
- package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +19 -13
- package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +51 -19
- package/dist/extensions/pi-subagents/src/runs/shared/chain-outputs.ts +3 -1
- package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +44 -11
- package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +8 -0
- package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +97 -20
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +43 -12
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +52 -4
- package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +19 -0
- package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +45 -9
- package/dist/extensions/pi-subagents/src/runs/shared/runtime-acknowledged-extensions.ts +71 -0
- package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +63 -9
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +31 -1
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +101 -0
- package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +22 -1
- package/dist/extensions/pi-subagents/src/runs/shared/usage-budget.ts +65 -0
- package/dist/extensions/pi-subagents/src/runs/shared/workflow-graph.ts +26 -1
- package/dist/extensions/pi-subagents/src/shared/settings.ts +17 -1
- package/dist/extensions/pi-subagents/src/shared/types.ts +196 -12
- package/dist/extensions/pi-subagents/src/shared/utils.ts +102 -5
- package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +10 -1
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +46 -4
- package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +5 -3
- package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +87 -24
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +182 -9
- package/dist/extensions/pi-subagents/src/tui/render.ts +55 -34
- package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +14 -7
- package/dist/extensions/pi-subagents/src/watchdog/review.ts +5 -4
- package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +170 -17
- package/dist/extensions/pi-subagents/src/watchdog/scope.ts +62 -0
- package/dist/extensions/pi-subagents/src/watchdog/settings.ts +41 -1
- package/dist/extensions/pi-subagents/src/watchdog/types.ts +10 -0
- package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +113 -8
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +419 -47
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +84 -0
- package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +4 -2
- package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +51 -2
- package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +62 -22
- package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +48 -0
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +8 -6
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +231 -19
- package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +48 -7
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +44 -0
- package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +199 -17
- package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +898 -16
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +112 -23
- package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +17 -5
- package/dist/extensions/pi-subagents/test/support/mock-pi.ts +2 -0
- package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +18 -2
- package/dist/extensions/pi-subagents/test/support/register-loader.mjs +3 -3
- package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +3 -1
- package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +198 -6
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +161 -1
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +47 -2
- package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +60 -0
- package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +8 -0
- package/dist/extensions/pi-subagents/test/unit/builtin-agent-documentation.test.ts +63 -0
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +136 -0
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +6 -0
- package/dist/extensions/pi-subagents/test/unit/chain-validation.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +48 -48
- package/dist/extensions/pi-subagents/test/unit/config-dir-runtime.test.ts +23 -0
- package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +27 -0
- package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +28 -2
- package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +1 -0
- package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +176 -8
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +164 -5
- package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +41 -1
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +17 -12
- package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +18 -2
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +20 -1
- package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +30 -2
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +39 -2
- package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +22 -0
- package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +103 -0
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +18 -0
- package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +48 -0
- package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +13 -1
- package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +29 -4
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +223 -4
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +30 -0
- package/dist/extensions/pi-subagents/test/unit/runtime-acknowledged-extensions.test.ts +52 -0
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +46 -2
- package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +91 -1
- package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/streamed-progress-bounds.test.ts +78 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +41 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +77 -0
- package/dist/extensions/pi-subagents/test/unit/task-aware-routing.test.ts +213 -0
- package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +26 -1
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +61 -10
- package/dist/extensions/pi-subagents/test/unit/total-cost.test.ts +1 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +210 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-scope.test.ts +33 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +32 -0
- package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +43 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +3 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +10 -2
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +1 -2
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +16 -46
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +4 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +22 -13
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts +12 -0
- package/dist/modes/interactive/external-editor.d.ts.map +1 -0
- package/dist/modes/interactive/external-editor.js +37 -0
- package/dist/modes/interactive/external-editor.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +72 -64
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +14 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/skills/ponytail/SKILL.md +1 -3
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +19 -8
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +1 -1
- package/docs/custom-provider.md +14 -5
- package/docs/environment-variables.md +86 -0
- package/docs/extensions.md +15 -5
- package/docs/index.md +1 -0
- package/docs/models.md +9 -2
- package/docs/plans/subagent-delegation/phase-0-correctness.md +265 -0
- package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +486 -0
- package/docs/plans/subagent-delegation/phase-2-context-controls.md +282 -0
- package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +362 -0
- package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +381 -0
- package/docs/providers.md +21 -2
- package/docs/rpc.md +23 -6
- package/docs/session-format.md +2 -0
- package/docs/settings.md +1 -1
- package/docs/usage.md +0 -13
- package/examples/extensions/custom-compaction.ts +5 -2
- package/examples/extensions/custom-provider-anthropic/index.ts +9 -3
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/handoff.ts +11 -3
- package/examples/extensions/message-renderer.ts +3 -3
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/summarize.ts +5 -2
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/sdk/12-full-control.ts +3 -1
- package/package.json +16 -7
- package/dist/extensions/caveman/caveman-instructions.cjs +0 -11
- package/dist/extensions/caveman/index.js +0 -118
- package/dist/extensions/caveman/package.json +0 -8
- package/dist/extensions/caveman/test/extension.test.js +0 -203
- package/dist/extensions/caveman/test/helpers.test.js +0 -58
- package/dist/skills/caveman/SKILL.md +0 -50
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import * as os from "node:os";
|
|
6
6
|
import * as path from "node:path";
|
|
7
7
|
import type { Message } from "@earendil-works/pi-ai";
|
|
8
|
-
import type { AgentConfig } from "../agents/agents.ts";
|
|
8
|
+
import type { AgentConfig, AgentSource } from "../agents/agents.ts";
|
|
9
9
|
import type { FSWatcher } from "node:fs";
|
|
10
10
|
import type { ExtensionContext } from "@selesai/code";
|
|
11
11
|
import type { ModelScopeConfig } from "../runs/shared/model-scope.ts";
|
|
@@ -35,11 +35,11 @@ export interface ChainOutputMapEntry {
|
|
|
35
35
|
|
|
36
36
|
export type ChainOutputMap = Record<string, ChainOutputMapEntry>;
|
|
37
37
|
|
|
38
|
-
export type WorkflowNodeStatus = "pending" | "running" | "completed" | "failed" | "paused" | "stopped" | "detached";
|
|
38
|
+
export type WorkflowNodeStatus = "pending" | "running" | "completed" | "failed" | "paused" | "stopped" | "detached" | "rejected";
|
|
39
39
|
|
|
40
40
|
export interface WorkflowGraphNode {
|
|
41
41
|
id: string;
|
|
42
|
-
kind: "step" | "parallel-group" | "dynamic-parallel-group" | "agent";
|
|
42
|
+
kind: "step" | "parallel-group" | "dynamic-parallel-group" | "agent" | "checkpoint";
|
|
43
43
|
agent?: string;
|
|
44
44
|
phase?: string;
|
|
45
45
|
label: string;
|
|
@@ -59,6 +59,16 @@ export interface WorkflowGraphNode {
|
|
|
59
59
|
structured?: boolean;
|
|
60
60
|
acceptanceStatus?: AcceptanceLedgerStatus;
|
|
61
61
|
error?: string;
|
|
62
|
+
checkpoint?: ChainCheckpointState;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface ChainCheckpointState {
|
|
66
|
+
name: string;
|
|
67
|
+
message?: string;
|
|
68
|
+
status: "pending" | "approved" | "rejected";
|
|
69
|
+
stepIndex: number;
|
|
70
|
+
approvedAt?: number;
|
|
71
|
+
rejectedAt?: number;
|
|
62
72
|
}
|
|
63
73
|
|
|
64
74
|
export interface WorkflowGraphSnapshot {
|
|
@@ -215,6 +225,7 @@ export interface ControlEvent {
|
|
|
215
225
|
}
|
|
216
226
|
|
|
217
227
|
export type SubagentResultStatus = "completed" | "failed" | "paused" | "stopped" | "detached";
|
|
228
|
+
export type SubagentOutputState = "present" | "absent" | "unknown";
|
|
218
229
|
export type SubagentRunMode = "single" | "parallel" | "chain";
|
|
219
230
|
|
|
220
231
|
export interface ParallelHandoffPatch {
|
|
@@ -507,7 +518,10 @@ export type PublicNestedRunSummary = Pick<
|
|
|
507
518
|
|
|
508
519
|
export interface SubagentResultIntercomChild {
|
|
509
520
|
agent: string;
|
|
521
|
+
/** Process/lifecycle status. It does not establish semantic task completion. */
|
|
510
522
|
status: SubagentResultStatus;
|
|
523
|
+
/** Whether the child produced substantive output before its process ended. */
|
|
524
|
+
outputState?: SubagentOutputState;
|
|
511
525
|
summary: string;
|
|
512
526
|
index?: number;
|
|
513
527
|
artifactPath?: string;
|
|
@@ -566,6 +580,11 @@ export interface AgentProgress {
|
|
|
566
580
|
toolCount: number;
|
|
567
581
|
turnCount?: number;
|
|
568
582
|
tokens: number;
|
|
583
|
+
/** Resolved launch model/effort and split usage for public live projections. */
|
|
584
|
+
model?: string;
|
|
585
|
+
thinking?: string;
|
|
586
|
+
inputTokens?: number;
|
|
587
|
+
outputTokens?: number;
|
|
569
588
|
durationMs: number;
|
|
570
589
|
error?: string;
|
|
571
590
|
failedTool?: string;
|
|
@@ -756,12 +775,68 @@ export interface ProtocolOutputLimit {
|
|
|
756
775
|
diagnosticTail: string;
|
|
757
776
|
}
|
|
758
777
|
|
|
778
|
+
export interface LaunchResolvedChildExtensionsV1 {
|
|
779
|
+
version: 1;
|
|
780
|
+
/** This is parent-resolved launch intent, not child-runtime acknowledgement that extensions loaded. */
|
|
781
|
+
source: "launch-resolved";
|
|
782
|
+
disableAmbientExtensions: boolean;
|
|
783
|
+
runtime: string[];
|
|
784
|
+
configured: string[];
|
|
785
|
+
effective: string[];
|
|
786
|
+
omitted: {
|
|
787
|
+
runtime: number;
|
|
788
|
+
configured: number;
|
|
789
|
+
effective: number;
|
|
790
|
+
};
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
export interface RuntimeAcknowledgedChildExtensionsV1 {
|
|
794
|
+
version: 1;
|
|
795
|
+
/** Best-effort child-runtime registration acknowledgement, not extension health. */
|
|
796
|
+
source: "child-runtime";
|
|
797
|
+
ids: string[];
|
|
798
|
+
omitted: number;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
export interface UsageBudgetLimitConfig {
|
|
802
|
+
soft?: number;
|
|
803
|
+
hard: number;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
export interface UsageBudgetConfig {
|
|
807
|
+
tokens?: UsageBudgetLimitConfig;
|
|
808
|
+
costUsd?: UsageBudgetLimitConfig;
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
export interface UsageBudgetMetricState extends UsageBudgetLimitConfig {
|
|
812
|
+
used: number;
|
|
813
|
+
outcome: "within-budget" | "soft-exceeded" | "hard-exceeded";
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
export interface UsageBudgetState {
|
|
817
|
+
version: 1;
|
|
818
|
+
/** Enforced from usage reported by completed or streaming child runs; no reservation estimates. */
|
|
819
|
+
source: "reported";
|
|
820
|
+
tokens?: UsageBudgetMetricState;
|
|
821
|
+
costUsd?: UsageBudgetMetricState;
|
|
822
|
+
exhausted: boolean;
|
|
823
|
+
reason?: "tokens" | "costUsd";
|
|
824
|
+
}
|
|
825
|
+
|
|
759
826
|
export interface SingleResult {
|
|
827
|
+
/**
|
|
828
|
+
* Stable child identity within the foreground run. Pair with Details.runId for
|
|
829
|
+
* cross-run correlation. This is assigned in launch order, remains stable across
|
|
830
|
+
* partial progress snapshots and the final result, and is independent of the
|
|
831
|
+
* result row's array position.
|
|
832
|
+
*/
|
|
833
|
+
index: number;
|
|
760
834
|
agent: string;
|
|
761
835
|
task: string;
|
|
762
836
|
/** Resolved launch context for this child. */
|
|
763
837
|
context?: "fresh" | "fork";
|
|
764
838
|
exitCode: number;
|
|
839
|
+
processSignal?: string | null;
|
|
765
840
|
detached?: boolean;
|
|
766
841
|
detachedReason?: string;
|
|
767
842
|
interrupted?: boolean;
|
|
@@ -791,10 +866,14 @@ export interface SingleResult {
|
|
|
791
866
|
artifactPaths?: ArtifactPaths;
|
|
792
867
|
truncation?: TruncationResult;
|
|
793
868
|
finalOutput?: string;
|
|
869
|
+
/** Provenance-aware state for substantive child output, excluding synthetic lifecycle messages. */
|
|
870
|
+
outputState?: SubagentOutputState;
|
|
794
871
|
outputMode?: OutputMode;
|
|
795
872
|
savedOutputPath?: string;
|
|
796
873
|
outputReference?: SavedOutputReference;
|
|
797
874
|
outputSaveError?: string;
|
|
875
|
+
/** Best-effort metadata persistence failure; execution and receipt publication continue. */
|
|
876
|
+
metadataSaveError?: string;
|
|
798
877
|
structuredOutput?: unknown;
|
|
799
878
|
structuredOutputFailed?: boolean;
|
|
800
879
|
structuredOutputPath?: string;
|
|
@@ -802,6 +881,8 @@ export interface SingleResult {
|
|
|
802
881
|
acceptance?: AcceptanceLedger;
|
|
803
882
|
agentContract?: AgentContract;
|
|
804
883
|
launchContractDigest?: string;
|
|
884
|
+
launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
|
|
885
|
+
runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
|
|
805
886
|
execution?: ExecutionProjection;
|
|
806
887
|
review?: ReviewProjection;
|
|
807
888
|
effects?: EffectsProjection;
|
|
@@ -831,12 +912,51 @@ export interface SpawnBudgetSnapshot {
|
|
|
831
912
|
grantHistory: SpawnBudgetGrant[];
|
|
832
913
|
}
|
|
833
914
|
|
|
915
|
+
// ============================================================================
|
|
916
|
+
// Runtime catalog (action:list machine metadata)
|
|
917
|
+
// ============================================================================
|
|
918
|
+
|
|
919
|
+
/** Machine-readable catalog entry for one visible runtime agent. */
|
|
920
|
+
export interface CatalogAgentMetadata {
|
|
921
|
+
name: string;
|
|
922
|
+
source: AgentSource;
|
|
923
|
+
description: string;
|
|
924
|
+
/** false for capability-ceiling-restricted agents (still visible, not launchable). */
|
|
925
|
+
executable: boolean;
|
|
926
|
+
/** Present only when the agent is capability-ceiling-restricted. */
|
|
927
|
+
restrictionSources?: string[];
|
|
928
|
+
aliases?: string[];
|
|
929
|
+
/** Normalized to explicit "fresh" when the agent has no defaultContext. */
|
|
930
|
+
defaultContext: "fresh" | "fork";
|
|
931
|
+
acceptanceRole?: AcceptanceRole;
|
|
932
|
+
/** Effective declared tools: normal tools plus mcp:-prefixed direct MCP tools. */
|
|
933
|
+
tools?: string[];
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
/** Machine-readable catalog entry for one visible chain. */
|
|
937
|
+
export interface CatalogChainMetadata {
|
|
938
|
+
name: string;
|
|
939
|
+
source: AgentSource;
|
|
940
|
+
description: string;
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
/** Versioned action:list catalog mirroring the human list output. */
|
|
944
|
+
export interface CatalogMetadataV1 {
|
|
945
|
+
version: 1;
|
|
946
|
+
agents: CatalogAgentMetadata[];
|
|
947
|
+
chains: CatalogChainMetadata[];
|
|
948
|
+
/** Present only when a capability ceiling restricted visible agents. */
|
|
949
|
+
capabilityCeilingSources?: string[];
|
|
950
|
+
}
|
|
951
|
+
|
|
834
952
|
export interface Details {
|
|
835
953
|
mode: SubagentRunMode | "management";
|
|
836
954
|
runId?: string;
|
|
837
955
|
/** Run-level context summary. "mixed" when children resolved to different modes. */
|
|
838
956
|
context?: "fresh" | "fork" | "mixed";
|
|
839
957
|
results: SingleResult[];
|
|
958
|
+
/** Runtime-resolved human+machine catalog for { action: "list" } results. */
|
|
959
|
+
catalog?: CatalogMetadataV1;
|
|
840
960
|
controlEvents?: ControlEvent[];
|
|
841
961
|
steering?: SteerActionResult;
|
|
842
962
|
asyncId?: string;
|
|
@@ -847,6 +967,7 @@ export interface Details {
|
|
|
847
967
|
stopped?: boolean;
|
|
848
968
|
turnBudget?: ResolvedTurnBudget;
|
|
849
969
|
toolBudget?: ResolvedToolBudget;
|
|
970
|
+
usageBudget?: UsageBudgetState;
|
|
850
971
|
progress?: AgentProgress[];
|
|
851
972
|
progressSummary?: ProgressSummary;
|
|
852
973
|
artifacts?: {
|
|
@@ -860,10 +981,11 @@ export interface Details {
|
|
|
860
981
|
artifactPath?: string;
|
|
861
982
|
};
|
|
862
983
|
// Chain metadata for observability
|
|
863
|
-
chainAgents?: string[]; // Agent names in order, e.g., ["
|
|
984
|
+
chainAgents?: string[]; // Agent names in order, e.g., ["explorer", "architect"]
|
|
864
985
|
totalSteps?: number; // Total steps in chain
|
|
865
986
|
currentStepIndex?: number; // 0-indexed current step (for running chains)
|
|
866
987
|
workflowGraph?: WorkflowGraphSnapshot;
|
|
988
|
+
checkpoint?: ChainCheckpointState;
|
|
867
989
|
outputs?: ChainOutputMap;
|
|
868
990
|
// Aggregated child usage across all agents in the run
|
|
869
991
|
totalChildUsage?: Usage;
|
|
@@ -877,6 +999,10 @@ export interface Details {
|
|
|
877
999
|
processTerminal?: ProcessTerminalV1;
|
|
878
1000
|
};
|
|
879
1001
|
launchContractDigest?: string;
|
|
1002
|
+
launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
|
|
1003
|
+
runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
|
|
1004
|
+
/** Original launch contract whose persisted session is being revived. */
|
|
1005
|
+
sourceLaunchContractDigest?: string;
|
|
880
1006
|
}
|
|
881
1007
|
|
|
882
1008
|
// ============================================================================
|
|
@@ -914,7 +1040,7 @@ export interface AsyncParallelGroupStatus {
|
|
|
914
1040
|
stepIndex: number;
|
|
915
1041
|
}
|
|
916
1042
|
|
|
917
|
-
export type NestedRunState = "queued" | "running" | "complete" | "failed" | "paused" | "stopped";
|
|
1043
|
+
export type NestedRunState = "queued" | "running" | "complete" | "failed" | "paused" | "stopped" | "rejected";
|
|
918
1044
|
export type NestedOwnerState = "live" | "gone" | "unknown";
|
|
919
1045
|
|
|
920
1046
|
export interface NestedRunAddress {
|
|
@@ -928,7 +1054,7 @@ export interface NestedRunAddress {
|
|
|
928
1054
|
|
|
929
1055
|
export interface NestedStepSummary {
|
|
930
1056
|
agent: string;
|
|
931
|
-
status: "pending" | "running" | "complete" | "completed" | "failed" | "paused" | "stopped";
|
|
1057
|
+
status: "pending" | "running" | "complete" | "completed" | "failed" | "paused" | "stopped" | "rejected";
|
|
932
1058
|
sessionFile?: string;
|
|
933
1059
|
transcriptPath?: string;
|
|
934
1060
|
transcriptError?: string;
|
|
@@ -951,6 +1077,8 @@ export interface NestedStepSummary {
|
|
|
951
1077
|
toolBudget?: ToolBudgetState;
|
|
952
1078
|
toolBudgetBlocked?: boolean;
|
|
953
1079
|
processTerminal?: ProcessTerminalV1;
|
|
1080
|
+
launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
|
|
1081
|
+
runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
|
|
954
1082
|
capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
|
|
955
1083
|
capabilityAudit?: SubagentCapabilityAudit;
|
|
956
1084
|
children?: NestedRunSummary[];
|
|
@@ -969,6 +1097,8 @@ export interface NestedRunSummary extends NestedRunAddress {
|
|
|
969
1097
|
capabilityToken?: string;
|
|
970
1098
|
mode?: SubagentRunMode;
|
|
971
1099
|
processTerminal?: ProcessTerminalV1;
|
|
1100
|
+
launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
|
|
1101
|
+
runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
|
|
972
1102
|
capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
|
|
973
1103
|
capabilityAudit?: SubagentCapabilityAudit;
|
|
974
1104
|
state: NestedRunState;
|
|
@@ -1029,7 +1159,11 @@ export interface AsyncStartedEvent {
|
|
|
1029
1159
|
chainStepCount?: number;
|
|
1030
1160
|
parallelGroups?: AsyncParallelGroupStatus[];
|
|
1031
1161
|
workflowGraph?: WorkflowGraphSnapshot;
|
|
1162
|
+
checkpoint?: ChainCheckpointState;
|
|
1032
1163
|
launchContractDigest?: string;
|
|
1164
|
+
launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
|
|
1165
|
+
runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
|
|
1166
|
+
usageBudget?: UsageBudgetState;
|
|
1033
1167
|
timeoutMs?: number;
|
|
1034
1168
|
deadlineAt?: number;
|
|
1035
1169
|
turnBudget?: TurnBudgetState;
|
|
@@ -1043,7 +1177,7 @@ export interface AsyncStatus {
|
|
|
1043
1177
|
sessionId?: string;
|
|
1044
1178
|
mode: SubagentRunMode;
|
|
1045
1179
|
isNested?: boolean;
|
|
1046
|
-
state: "queued" | "running" | "complete" | "failed" | "paused" | "stopped";
|
|
1180
|
+
state: "queued" | "running" | "complete" | "failed" | "paused" | "stopped" | "rejected";
|
|
1047
1181
|
error?: string;
|
|
1048
1182
|
activityState?: ActivityState;
|
|
1049
1183
|
lastActivityAt?: number;
|
|
@@ -1065,6 +1199,7 @@ export interface AsyncStatus {
|
|
|
1065
1199
|
wrapUpRequested?: boolean;
|
|
1066
1200
|
toolBudget?: ToolBudgetState;
|
|
1067
1201
|
toolBudgetBlocked?: boolean;
|
|
1202
|
+
usageBudget?: UsageBudgetState;
|
|
1068
1203
|
pid?: number;
|
|
1069
1204
|
cwd?: string;
|
|
1070
1205
|
currentStep?: number;
|
|
@@ -1072,19 +1207,25 @@ export interface AsyncStatus {
|
|
|
1072
1207
|
pendingAppends?: number;
|
|
1073
1208
|
parallelGroups?: AsyncParallelGroupStatus[];
|
|
1074
1209
|
workflowGraph?: WorkflowGraphSnapshot;
|
|
1210
|
+
checkpoint?: ChainCheckpointState;
|
|
1075
1211
|
processTerminal?: ProcessTerminalV1;
|
|
1076
1212
|
launchContractDigest?: string;
|
|
1213
|
+
launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
|
|
1214
|
+
runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
|
|
1077
1215
|
capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
|
|
1078
1216
|
capabilityAudit?: SubagentCapabilityAudit;
|
|
1079
1217
|
steps?: Array<{
|
|
1080
1218
|
agent: string;
|
|
1081
1219
|
/** Resolved launch context for this child step. */
|
|
1082
1220
|
context?: "fresh" | "fork";
|
|
1221
|
+
/** Short caller-facing task/goal shown in fleet surfaces when available. */
|
|
1222
|
+
description?: string;
|
|
1083
1223
|
phase?: string;
|
|
1084
1224
|
label?: string;
|
|
1085
1225
|
outputName?: string;
|
|
1086
1226
|
structured?: boolean;
|
|
1087
|
-
|
|
1227
|
+
checkpoint?: ChainCheckpointState;
|
|
1228
|
+
status: "pending" | "running" | "complete" | "completed" | "failed" | "paused" | "stopped" | "rejected";
|
|
1088
1229
|
children?: NestedRunSummary[];
|
|
1089
1230
|
sessionFile?: string;
|
|
1090
1231
|
transcriptPath?: string;
|
|
@@ -1125,6 +1266,8 @@ export interface AsyncStatus {
|
|
|
1125
1266
|
acceptance?: AcceptanceLedger;
|
|
1126
1267
|
agentContract?: AgentContract;
|
|
1127
1268
|
launchContractDigest?: string;
|
|
1269
|
+
launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
|
|
1270
|
+
runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
|
|
1128
1271
|
execution?: ExecutionProjection;
|
|
1129
1272
|
review?: ReviewProjection;
|
|
1130
1273
|
effects?: EffectsProjection;
|
|
@@ -1136,6 +1279,7 @@ export interface AsyncStatus {
|
|
|
1136
1279
|
sessionDir?: string;
|
|
1137
1280
|
outputFile?: string;
|
|
1138
1281
|
totalTokens?: TokenUsage;
|
|
1282
|
+
usageBudget?: UsageBudgetState;
|
|
1139
1283
|
totalCost?: CostSummary;
|
|
1140
1284
|
sessionFile?: string;
|
|
1141
1285
|
outputs?: ChainOutputMap;
|
|
@@ -1144,6 +1288,7 @@ export interface AsyncStatus {
|
|
|
1144
1288
|
|
|
1145
1289
|
export type AsyncJobStep = NonNullable<AsyncStatus["steps"]>[number] & {
|
|
1146
1290
|
index?: number;
|
|
1291
|
+
description?: string;
|
|
1147
1292
|
};
|
|
1148
1293
|
|
|
1149
1294
|
export interface AsyncJobState {
|
|
@@ -1151,7 +1296,7 @@ export interface AsyncJobState {
|
|
|
1151
1296
|
asyncDir: string;
|
|
1152
1297
|
/** Parent-resolved launch directory retained for trusted live artifact lookup. */
|
|
1153
1298
|
cwd?: string;
|
|
1154
|
-
status: "queued" | "running" | "complete" | "failed" | "paused" | "stopped";
|
|
1299
|
+
status: "queued" | "running" | "complete" | "failed" | "paused" | "stopped" | "rejected";
|
|
1155
1300
|
/** Short caller-facing task/goal shown in fleet surfaces when available. */
|
|
1156
1301
|
description?: string;
|
|
1157
1302
|
pid?: number;
|
|
@@ -1172,6 +1317,7 @@ export interface AsyncJobState {
|
|
|
1172
1317
|
chainStepCount?: number;
|
|
1173
1318
|
parallelGroups?: AsyncParallelGroupStatus[];
|
|
1174
1319
|
steps?: AsyncJobStep[];
|
|
1320
|
+
checkpoint?: ChainCheckpointState;
|
|
1175
1321
|
stepsTotal?: number;
|
|
1176
1322
|
runningSteps?: number;
|
|
1177
1323
|
completedSteps?: number;
|
|
@@ -1191,6 +1337,8 @@ export interface AsyncJobState {
|
|
|
1191
1337
|
sessionDir?: string;
|
|
1192
1338
|
outputFile?: string;
|
|
1193
1339
|
totalTokens?: TokenUsage;
|
|
1340
|
+
totalCost?: CostSummary;
|
|
1341
|
+
usageBudget?: UsageBudgetState;
|
|
1194
1342
|
sessionFile?: string;
|
|
1195
1343
|
controlEventCursor?: number;
|
|
1196
1344
|
nestedRoute?: NestedRouteInfo;
|
|
@@ -1202,6 +1350,8 @@ export interface ForegroundResumeChild {
|
|
|
1202
1350
|
index: number;
|
|
1203
1351
|
context?: "fresh" | "fork";
|
|
1204
1352
|
sessionFile?: string;
|
|
1353
|
+
model?: string;
|
|
1354
|
+
thinking?: string;
|
|
1205
1355
|
status: SubagentResultStatus;
|
|
1206
1356
|
activityState?: ActivityState;
|
|
1207
1357
|
lastActivityAt?: number;
|
|
@@ -1214,6 +1364,7 @@ export interface ForegroundResumeChild {
|
|
|
1214
1364
|
exitCode?: number;
|
|
1215
1365
|
error?: string;
|
|
1216
1366
|
finalOutput?: string;
|
|
1367
|
+
outputState?: SubagentOutputState;
|
|
1217
1368
|
outputMode?: OutputMode;
|
|
1218
1369
|
savedOutputPath?: string;
|
|
1219
1370
|
outputSaveError?: string;
|
|
@@ -1223,6 +1374,9 @@ export interface ForegroundResumeChild {
|
|
|
1223
1374
|
detachedReason?: string;
|
|
1224
1375
|
acceptance?: AcceptanceLedger;
|
|
1225
1376
|
agentContract?: AgentContract;
|
|
1377
|
+
launchContractDigest?: string;
|
|
1378
|
+
launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
|
|
1379
|
+
runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
|
|
1226
1380
|
execution?: ExecutionProjection;
|
|
1227
1381
|
review?: ReviewProjection;
|
|
1228
1382
|
effects?: EffectsProjection;
|
|
@@ -1238,6 +1392,7 @@ export interface ForegroundResumeRun {
|
|
|
1238
1392
|
/** Originating parent session. Detached exits can outlive the active session. */
|
|
1239
1393
|
sessionId?: string;
|
|
1240
1394
|
updatedAt: number;
|
|
1395
|
+
checkpoint?: ChainCheckpointState;
|
|
1241
1396
|
children: ForegroundResumeChild[];
|
|
1242
1397
|
}
|
|
1243
1398
|
|
|
@@ -1254,12 +1409,19 @@ export interface ForegroundChildControl {
|
|
|
1254
1409
|
currentPath?: string;
|
|
1255
1410
|
turnCount?: number;
|
|
1256
1411
|
tokens?: number;
|
|
1412
|
+
inputTokens?: number;
|
|
1413
|
+
outputTokens?: number;
|
|
1414
|
+
model?: string;
|
|
1415
|
+
thinking?: string;
|
|
1257
1416
|
toolCount?: number;
|
|
1258
1417
|
interrupt?: () => boolean;
|
|
1418
|
+
detach?: () => boolean;
|
|
1259
1419
|
}
|
|
1260
1420
|
|
|
1261
1421
|
export interface ForegroundRunControl {
|
|
1262
1422
|
runId: string;
|
|
1423
|
+
/** Originating parent session; required for public fleet projection. */
|
|
1424
|
+
sessionId?: string;
|
|
1263
1425
|
mode: SubagentRunMode;
|
|
1264
1426
|
startedAt: number;
|
|
1265
1427
|
updatedAt: number;
|
|
@@ -1276,12 +1438,19 @@ export interface ForegroundRunControl {
|
|
|
1276
1438
|
currentPath?: string;
|
|
1277
1439
|
turnCount?: number;
|
|
1278
1440
|
tokens?: number;
|
|
1441
|
+
inputTokens?: number;
|
|
1442
|
+
outputTokens?: number;
|
|
1443
|
+
model?: string;
|
|
1444
|
+
thinking?: string;
|
|
1279
1445
|
toolCount?: number;
|
|
1280
1446
|
/** Independently tracked children for foreground parallel work and fleet inspection. */
|
|
1281
1447
|
activeChildren?: Map<number, ForegroundChildControl>;
|
|
1448
|
+
/** Scheduling owners that may still launch another child. Removal is safe only at zero. */
|
|
1449
|
+
schedulingOwners?: number;
|
|
1282
1450
|
nestedRoute?: NestedRouteInfo;
|
|
1283
1451
|
nestedChildren?: NestedRunSummary[];
|
|
1284
1452
|
interrupt?: () => boolean;
|
|
1453
|
+
detach?: () => boolean;
|
|
1285
1454
|
}
|
|
1286
1455
|
|
|
1287
1456
|
export interface SubagentState {
|
|
@@ -1290,6 +1459,8 @@ export interface SubagentState {
|
|
|
1290
1459
|
/** Runtime-owned artifact resolution inputs used by Fleet transcript targeting. */
|
|
1291
1460
|
artifactDirPreference?: ArtifactDirPreference;
|
|
1292
1461
|
parentSessionFile?: string | null;
|
|
1462
|
+
/** Last valid parent session model observed for this session; used when continuation contexts omit ctx.model. */
|
|
1463
|
+
lastParentModel?: { provider: string; id: string };
|
|
1293
1464
|
subagentInProgress?: boolean;
|
|
1294
1465
|
subagentSpawns?: {
|
|
1295
1466
|
sessionId: string | null;
|
|
@@ -1370,6 +1541,7 @@ export interface RunSyncOptions {
|
|
|
1370
1541
|
timeoutMs?: number;
|
|
1371
1542
|
deadlineAt?: number;
|
|
1372
1543
|
turnBudget?: ResolvedTurnBudget;
|
|
1544
|
+
usageBudget?: UsageBudgetConfig;
|
|
1373
1545
|
/** Enforce maxTurns + graceTurns as a hard model-turn boundary. */
|
|
1374
1546
|
enforceHardTurnLimit?: boolean;
|
|
1375
1547
|
toolBudget?: ResolvedToolBudget;
|
|
@@ -1378,6 +1550,11 @@ export interface RunSyncOptions {
|
|
|
1378
1550
|
intercomEvents?: IntercomEventBus;
|
|
1379
1551
|
onUpdate?: (r: import("@earendil-works/pi-agent-core").AgentToolResult<Details>) => void;
|
|
1380
1552
|
onControlEvent?: (event: ControlEvent) => void;
|
|
1553
|
+
/** Exposes a non-terminating detach callback while the child is active. */
|
|
1554
|
+
onDetachReady?: (detach: (reason?: string) => boolean) => void;
|
|
1555
|
+
/** Internal foreground receipt proposal; returns true only when the outer waiter accepted it. */
|
|
1556
|
+
onDetachReceipt?: (result: SingleResult) => boolean;
|
|
1557
|
+
/** Authoritative terminal result, emitted only after the full detached run finalizes. */
|
|
1381
1558
|
onDetachedExit?: (result: SingleResult) => void;
|
|
1382
1559
|
controlConfig?: ResolvedControlConfig;
|
|
1383
1560
|
intercomSessionName?: string;
|
|
@@ -1429,6 +1606,8 @@ export type IntercomBridgeMode = "off" | "fork-only" | "always";
|
|
|
1429
1606
|
export interface IntercomBridgeConfig {
|
|
1430
1607
|
mode?: IntercomBridgeMode;
|
|
1431
1608
|
instructionFile?: string;
|
|
1609
|
+
/** Deliver grouped completion messages through an external acknowledged intercom listener. */
|
|
1610
|
+
resultDelivery?: boolean;
|
|
1432
1611
|
}
|
|
1433
1612
|
|
|
1434
1613
|
interface TopLevelParallelConfig {
|
|
@@ -1457,10 +1636,14 @@ export interface ScheduledRunsConfig {
|
|
|
1457
1636
|
maxPending?: number;
|
|
1458
1637
|
}
|
|
1459
1638
|
|
|
1639
|
+
export type FleetViewPlacement = "aboveEditor" | "belowEditor";
|
|
1640
|
+
|
|
1460
1641
|
export interface ExtensionConfig {
|
|
1461
1642
|
asyncByDefault?: boolean;
|
|
1462
|
-
/** Show the Claude Code-style navigable fleet
|
|
1643
|
+
/** Show the Claude Code-style navigable fleet. Defaults to true. */
|
|
1463
1644
|
fleetView?: boolean;
|
|
1645
|
+
/** Place the persistent FleetView above or below the editor. Defaults to belowEditor. */
|
|
1646
|
+
fleetViewPlacement?: FleetViewPlacement;
|
|
1464
1647
|
/** Show the legacy above-editor async runs widget. Defaults to true only when fleetView is disabled. */
|
|
1465
1648
|
asyncWidget?: boolean;
|
|
1466
1649
|
/** Tool description variant registered for the parent-facing subagent tool. Defaults to full. */
|
|
@@ -1478,6 +1661,7 @@ export interface ExtensionConfig {
|
|
|
1478
1661
|
completionBatch?: CompletionBatchConfig;
|
|
1479
1662
|
turnBudget?: TurnBudgetConfig;
|
|
1480
1663
|
toolBudget?: ToolBudgetConfig;
|
|
1664
|
+
usageBudget?: UsageBudgetConfig;
|
|
1481
1665
|
parallel?: TopLevelParallelConfig;
|
|
1482
1666
|
chain?: ExtensionChainConfig;
|
|
1483
1667
|
worktreeSetupHook?: string;
|
|
@@ -1500,7 +1684,7 @@ export const DEFAULT_MAX_OUTPUT: Required<MaxOutputConfig> = {
|
|
|
1500
1684
|
};
|
|
1501
1685
|
|
|
1502
1686
|
export const DEFAULT_ARTIFACT_CONFIG: ArtifactConfig = {
|
|
1503
|
-
enabled:
|
|
1687
|
+
enabled: false,
|
|
1504
1688
|
dir: "project",
|
|
1505
1689
|
includeInput: true,
|
|
1506
1690
|
includeOutput: true,
|
|
@@ -1581,7 +1765,7 @@ export const SLASH_SUBAGENT_CANCEL_EVENT = "subagent:slash:cancel";
|
|
|
1581
1765
|
export const POLL_INTERVAL_MS = 250;
|
|
1582
1766
|
export const MAX_WIDGET_JOBS = 4;
|
|
1583
1767
|
export const DEFAULT_SUBAGENT_MAX_DEPTH = 2;
|
|
1584
|
-
export const SUBAGENT_ACTIONS = ["list", "get", "models", "create", "update", "delete", "eject", "disable", "enable", "reset", "status", "grant-spawn-budget", "interrupt", "resume", "steer", "stop", "append-step", "doctor", "watchdog.status", "watchdog.check", "watchdog.configure", "watchdog.recommend-model", "schedule", "schedule-list", "schedule-status", "schedule-cancel"] as const;
|
|
1768
|
+
export const SUBAGENT_ACTIONS = ["list", "get", "models", "create", "update", "delete", "eject", "disable", "enable", "reset", "status", "grant-spawn-budget", "interrupt", "resume", "steer", "stop", "append-step", "approve-checkpoint", "reject-checkpoint", "doctor", "watchdog.status", "watchdog.check", "watchdog.configure", "watchdog.recommend-model", "schedule", "schedule-list", "schedule-status", "schedule-cancel"] as const;
|
|
1585
1769
|
|
|
1586
1770
|
export const DEFAULT_FORK_PREAMBLE =
|
|
1587
1771
|
"You are a delegated subagent running from a fork of the parent session. " +
|
|
@@ -7,7 +7,7 @@ import * as os from "node:os";
|
|
|
7
7
|
import * as path from "node:path";
|
|
8
8
|
import type { Message } from "@earendil-works/pi-ai";
|
|
9
9
|
import { formatToolCall } from "./formatters.ts";
|
|
10
|
-
import type { AgentProgress, AsyncStatus, Details, DisplayItem, ErrorInfo, NestedRunSummary, SingleResult, ToolCallSummary, Usage } from "./types.ts";
|
|
10
|
+
import type { AgentProgress, AsyncStatus, ChainOutputMap, Details, DisplayItem, ErrorInfo, NestedRunSummary, SingleResult, ToolCallSummary, Usage } from "./types.ts";
|
|
11
11
|
|
|
12
12
|
// ============================================================================
|
|
13
13
|
// File System Utilities
|
|
@@ -77,8 +77,19 @@ export function resolveConfigDirName(codingAgentModule?: unknown, entryPoint?: s
|
|
|
77
77
|
?? DEFAULT_CONFIG_DIR_NAME;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
let cachedConfigDirName: { entryPoint: string | undefined; packageRoot: string | undefined; value: string } | undefined;
|
|
81
|
+
|
|
80
82
|
export function getConfigDirName(): string {
|
|
81
|
-
|
|
83
|
+
const entryPoint = process.argv[1];
|
|
84
|
+
const packageRoot = process.env[SELESAI_CODING_AGENT_PACKAGE_ROOT_ENV];
|
|
85
|
+
if (cachedConfigDirName
|
|
86
|
+
&& cachedConfigDirName.entryPoint === entryPoint
|
|
87
|
+
&& cachedConfigDirName.packageRoot === packageRoot) {
|
|
88
|
+
return cachedConfigDirName.value;
|
|
89
|
+
}
|
|
90
|
+
const value = resolveConfigDirName(undefined, entryPoint, packageRoot);
|
|
91
|
+
cachedConfigDirName = { entryPoint, packageRoot, value };
|
|
92
|
+
return value;
|
|
82
93
|
}
|
|
83
94
|
|
|
84
95
|
export function getProjectConfigDir(projectRoot: string): string {
|
|
@@ -403,12 +414,40 @@ export function compactForegroundResult(result: SingleResult): SingleResult {
|
|
|
403
414
|
messages: undefined,
|
|
404
415
|
progress: undefined,
|
|
405
416
|
toolCalls: toolCalls.length ? toolCalls : undefined,
|
|
417
|
+
// Reference-first terminal details: once an authoritative saved output path
|
|
418
|
+
// exists, drop the raw final output and truncation marker from the model-
|
|
419
|
+
// visible projection; consumers recover the file from `savedOutputPath`.
|
|
420
|
+
// Explicit `outputMode: "inline"` is the sole legacy full-text opt-out and
|
|
421
|
+
// keeps its final output in the terminal projection (e.g. delegation v1
|
|
422
|
+
// `response.output` stays populated).
|
|
423
|
+
finalOutput: result.savedOutputPath && result.outputMode !== "inline" ? undefined : result.finalOutput,
|
|
424
|
+
truncation: result.savedOutputPath && result.outputMode !== "inline" ? undefined : result.truncation,
|
|
406
425
|
};
|
|
407
426
|
}
|
|
408
427
|
|
|
428
|
+
/**
|
|
429
|
+
* Strip chain `details.outputs` text/structured payloads from the terminal
|
|
430
|
+
* projection while retaining the output names and step metadata. Chain output
|
|
431
|
+
* bindings themselves remain reference-first in the completion content and
|
|
432
|
+
* `{outputs.name}` interpolation (see outputEntryFromResult).
|
|
433
|
+
*/
|
|
434
|
+
function compactChainOutputs(outputs: ChainOutputMap | undefined): ChainOutputMap | undefined {
|
|
435
|
+
if (!outputs) return undefined;
|
|
436
|
+
const compact: ChainOutputMap = {};
|
|
437
|
+
for (const [name, entry] of Object.entries(outputs)) {
|
|
438
|
+
compact[name] = {
|
|
439
|
+
agent: entry.agent,
|
|
440
|
+
stepIndex: entry.stepIndex,
|
|
441
|
+
text: "",
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
return compact;
|
|
445
|
+
}
|
|
446
|
+
|
|
409
447
|
export function compactForegroundDetails(details: Details): Details {
|
|
410
448
|
return {
|
|
411
449
|
...details,
|
|
450
|
+
outputs: compactChainOutputs(details.outputs),
|
|
412
451
|
results: details.results.map(compactForegroundResult),
|
|
413
452
|
progress: details.progress
|
|
414
453
|
? details.progress.map(compactCompletedProgress)
|
|
@@ -416,6 +455,49 @@ export function compactForegroundDetails(details: Details): Details {
|
|
|
416
455
|
};
|
|
417
456
|
}
|
|
418
457
|
|
|
458
|
+
/**
|
|
459
|
+
* Streaming counterparts to compactForegroundResult / compactCompletedProgress.
|
|
460
|
+
*
|
|
461
|
+
* The completed-compaction helpers above bail out while a child is still
|
|
462
|
+
* `running`, so a long or deeply nested fan-out streams full, unbounded progress on
|
|
463
|
+
* every tick. Pi serializes each streamed `tool_execution_update` as a single
|
|
464
|
+
* child-stdout line, which the parent reads under `MAX_CHILD_PENDING_LINE_BYTES`;
|
|
465
|
+
* an unbounded running snapshot can cross that cap and kill the child with
|
|
466
|
+
* `protocol_output_limit`.
|
|
467
|
+
*
|
|
468
|
+
* These bound the STREAMED snapshot only. The final returned result keeps the full
|
|
469
|
+
* live progress and message transcript, and every live-display consumer already
|
|
470
|
+
* reads just the last few entries (`recentTools.slice(-3)`, `recentOutput.slice(-5)`).
|
|
471
|
+
*/
|
|
472
|
+
export const MAX_STREAMED_RECENT_TOOLS = 32;
|
|
473
|
+
export const MAX_STREAMED_TOOL_CALLS = 64;
|
|
474
|
+
export const MAX_STREAMED_OUTPUT_LINE_CHARS = 2000;
|
|
475
|
+
|
|
476
|
+
/** Keep only the most recent tool-history entries in a streamed snapshot. */
|
|
477
|
+
export function boundStreamedRecentTools(recentTools: AgentProgress["recentTools"]): AgentProgress["recentTools"] {
|
|
478
|
+
return recentTools.slice(-MAX_STREAMED_RECENT_TOOLS).map((tool) => ({ ...tool }));
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/** Cap per-line length of recent output so one long line can't inflate a snapshot. */
|
|
482
|
+
export function boundStreamedRecentOutput(recentOutput: string[]): string[] {
|
|
483
|
+
return recentOutput.map((line) =>
|
|
484
|
+
line.length > MAX_STREAMED_OUTPUT_LINE_CHARS
|
|
485
|
+
? `${line.slice(0, MAX_STREAMED_OUTPUT_LINE_CHARS)}… [truncated]`
|
|
486
|
+
: line,
|
|
487
|
+
);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* Compact tool-call summaries for a streamed snapshot, standing in for the
|
|
492
|
+
* unbounded `messages` transcript. Prefers an existing `toolCalls` summary, else
|
|
493
|
+
* derives one from `messages`; bounded to the most recent calls.
|
|
494
|
+
*/
|
|
495
|
+
export function boundStreamedToolCalls(result: Pick<SingleResult, "toolCalls" | "messages">): ToolCallSummary[] | undefined {
|
|
496
|
+
const summaries = result.toolCalls?.length ? result.toolCalls : extractToolCallSummaries(result.messages);
|
|
497
|
+
if (!summaries.length) return undefined;
|
|
498
|
+
return summaries.slice(-MAX_STREAMED_TOOL_CALLS).map((summary) => ({ ...summary }));
|
|
499
|
+
}
|
|
500
|
+
|
|
419
501
|
export function hasEmptyTerminalAssistantResponse(messages: Message[]): boolean {
|
|
420
502
|
const lastAssistant = messages.findLast((message) => message.role === "assistant");
|
|
421
503
|
return lastAssistant?.role === "assistant"
|
|
@@ -428,7 +510,7 @@ export function hasEmptyTerminalAssistantResponse(messages: Message[]): boolean
|
|
|
428
510
|
* Detect errors in subagent execution from messages (only errors with no subsequent success)
|
|
429
511
|
*/
|
|
430
512
|
export function detectSubagentError(messages: Message[]): ErrorInfo {
|
|
431
|
-
let
|
|
513
|
+
let recoveryIndex = -1;
|
|
432
514
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
433
515
|
const msg = messages[i];
|
|
434
516
|
if (msg.role === "assistant") {
|
|
@@ -436,13 +518,28 @@ export function detectSubagentError(messages: Message[]): ErrorInfo {
|
|
|
436
518
|
(c) => c.type === "text" && "text" in c && typeof c.text === "string" && c.text.trim().length > 0,
|
|
437
519
|
);
|
|
438
520
|
if (hasText) {
|
|
439
|
-
|
|
521
|
+
recoveryIndex = i;
|
|
440
522
|
break;
|
|
441
523
|
}
|
|
442
524
|
}
|
|
443
525
|
}
|
|
444
526
|
|
|
445
|
-
const
|
|
527
|
+
const terminalAssistantIndex = messages.findLastIndex((message) => message.role === "assistant");
|
|
528
|
+
const terminalAssistant = messages[terminalAssistantIndex];
|
|
529
|
+
const cleanTerminalStop = terminalAssistant?.role === "assistant"
|
|
530
|
+
&& terminalAssistant.stopReason === "stop"
|
|
531
|
+
&& !terminalAssistant.errorMessage
|
|
532
|
+
&& !terminalAssistant.content.some((part) => part.type === "toolCall");
|
|
533
|
+
if (cleanTerminalStop) {
|
|
534
|
+
for (let i = terminalAssistantIndex - 1; i >= 0; i--) {
|
|
535
|
+
const msg = messages[i];
|
|
536
|
+
if (msg.role !== "toolResult") continue;
|
|
537
|
+
if (msg.isError !== true) recoveryIndex = Math.max(recoveryIndex, i);
|
|
538
|
+
break;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
const scanStart = recoveryIndex >= 0 ? recoveryIndex + 1 : 0;
|
|
446
543
|
|
|
447
544
|
for (let i = messages.length - 1; i >= scanStart; i--) {
|
|
448
545
|
const msg = messages[i];
|