@selesai/code 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -1
- package/README.md +1 -1
- package/dist/bun/cli.d.ts +0 -1
- package/dist/bun/cli.js +0 -1
- package/dist/bun/register-bedrock.d.ts +0 -1
- package/dist/bun/register-bedrock.js +0 -1
- package/dist/bun/restore-sandbox-env.d.ts +0 -1
- package/dist/bun/restore-sandbox-env.js +0 -1
- package/dist/cli/args.d.ts +0 -1
- package/dist/cli/args.js +0 -1
- package/dist/cli/config-selector.d.ts +0 -1
- package/dist/cli/config-selector.js +0 -1
- package/dist/cli/credential-print.d.ts +0 -1
- package/dist/cli/credential-print.js +0 -1
- package/dist/cli/file-processor.d.ts +0 -1
- package/dist/cli/file-processor.js +0 -1
- package/dist/cli/initial-message.d.ts +0 -1
- package/dist/cli/initial-message.js +0 -1
- package/dist/cli/list-models.d.ts +0 -1
- package/dist/cli/list-models.js +0 -1
- package/dist/cli/project-trust.d.ts +0 -1
- package/dist/cli/project-trust.js +0 -1
- package/dist/cli/session-picker.d.ts +0 -1
- package/dist/cli/session-picker.js +0 -1
- package/dist/cli/startup-ui.d.ts +0 -1
- package/dist/cli/startup-ui.js +0 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +0 -1
- package/dist/config.d.ts +0 -1
- package/dist/config.js +0 -1
- package/dist/core/agent-session-auto-handoff.test.d.ts +0 -1
- package/dist/core/agent-session-auto-handoff.test.js +0 -1
- package/dist/core/agent-session-runtime.d.ts +0 -1
- package/dist/core/agent-session-runtime.js +0 -1
- package/dist/core/agent-session-services.d.ts +0 -1
- package/dist/core/agent-session-services.js +0 -1
- package/dist/core/agent-session-skill-block.test.d.ts +0 -1
- package/dist/core/agent-session-skill-block.test.js +0 -1
- package/dist/core/agent-session.d.ts +0 -1
- package/dist/core/agent-session.js +0 -1
- package/dist/core/agents.d.ts +0 -1
- package/dist/core/agents.js +0 -1
- package/dist/core/auth-guidance.d.ts +0 -1
- package/dist/core/auth-guidance.js +0 -1
- package/dist/core/auth-storage.d.ts +0 -1
- package/dist/core/auth-storage.js +0 -1
- package/dist/core/bash-executor.d.ts +0 -1
- package/dist/core/bash-executor.js +0 -1
- package/dist/core/built-in-extensions.d.ts +0 -1
- package/dist/core/built-in-extensions.js +0 -1
- package/dist/core/cache-stats.d.ts +0 -1
- package/dist/core/cache-stats.js +0 -1
- package/dist/core/compaction/branch-summarization.d.ts +0 -1
- package/dist/core/compaction/branch-summarization.js +0 -1
- package/dist/core/compaction/compaction.d.ts +0 -1
- package/dist/core/compaction/compaction.js +0 -1
- package/dist/core/compaction/index.d.ts +0 -1
- package/dist/core/compaction/index.js +0 -1
- package/dist/core/compaction/utils.d.ts +0 -1
- package/dist/core/compaction/utils.js +0 -1
- package/dist/core/defaults.d.ts +0 -1
- package/dist/core/defaults.js +0 -1
- package/dist/core/diagnostics.d.ts +0 -1
- package/dist/core/diagnostics.js +0 -1
- package/dist/core/event-bus.d.ts +0 -1
- package/dist/core/event-bus.js +0 -1
- package/dist/core/exec.d.ts +0 -1
- package/dist/core/exec.js +0 -1
- package/dist/core/experimental.d.ts +0 -1
- package/dist/core/experimental.js +0 -1
- package/dist/core/export-html/ansi-to-html.d.ts +0 -1
- package/dist/core/export-html/ansi-to-html.js +0 -1
- package/dist/core/export-html/index.d.ts +0 -1
- package/dist/core/export-html/index.js +0 -1
- package/dist/core/export-html/tool-renderer.d.ts +0 -1
- package/dist/core/export-html/tool-renderer.js +0 -1
- package/dist/core/extensions/index.d.ts +0 -1
- package/dist/core/extensions/index.js +0 -1
- package/dist/core/extensions/loader.d.ts +0 -1
- package/dist/core/extensions/loader.js +0 -1
- package/dist/core/extensions/runner.d.ts +0 -1
- package/dist/core/extensions/runner.js +0 -1
- package/dist/core/extensions/types.d.ts +0 -1
- package/dist/core/extensions/types.js +0 -1
- package/dist/core/extensions/wrapper.d.ts +0 -1
- package/dist/core/extensions/wrapper.js +0 -1
- package/dist/core/footer-data-provider.d.ts +0 -1
- package/dist/core/footer-data-provider.js +0 -1
- package/dist/core/git-command.d.ts +0 -1
- package/dist/core/git-command.js +0 -1
- package/dist/core/http-dispatcher.d.ts +0 -1
- package/dist/core/http-dispatcher.js +0 -1
- package/dist/core/index.d.ts +0 -1
- package/dist/core/index.js +0 -1
- package/dist/core/keybindings.d.ts +0 -1
- package/dist/core/keybindings.js +0 -1
- package/dist/core/llama/client.d.ts +0 -1
- package/dist/core/llama/client.js +0 -1
- package/dist/core/llama/huggingface.d.ts +0 -1
- package/dist/core/llama/huggingface.js +0 -1
- package/dist/core/llama/index.d.ts +0 -1
- package/dist/core/llama/index.js +0 -1
- package/dist/core/llama/provider.d.ts +0 -1
- package/dist/core/llama/provider.js +0 -1
- package/dist/core/llama/ui.d.ts +0 -1
- package/dist/core/llama/ui.js +0 -1
- package/dist/core/messages.d.ts +0 -1
- package/dist/core/messages.js +0 -1
- package/dist/core/model-config.d.ts +0 -1
- package/dist/core/model-config.js +0 -1
- package/dist/core/model-registry.d.ts +0 -1
- package/dist/core/model-registry.js +0 -1
- package/dist/core/model-resolver.d.ts +0 -1
- package/dist/core/model-resolver.js +0 -1
- package/dist/core/model-runtime.d.ts +0 -1
- package/dist/core/model-runtime.js +0 -1
- package/dist/core/models-store.d.ts +0 -1
- package/dist/core/models-store.js +0 -1
- package/dist/core/output-guard.d.ts +0 -1
- package/dist/core/output-guard.js +0 -1
- package/dist/core/package-manager.d.ts +0 -1
- package/dist/core/package-manager.js +0 -1
- package/dist/core/package-manager.test.d.ts +0 -1
- package/dist/core/package-manager.test.js +0 -1
- package/dist/core/project-trust.d.ts +0 -1
- package/dist/core/project-trust.js +0 -1
- package/dist/core/prompt-templates.d.ts +0 -1
- package/dist/core/prompt-templates.js +0 -1
- package/dist/core/provider-attribution.d.ts +0 -1
- package/dist/core/provider-attribution.js +0 -1
- package/dist/core/provider-composer.d.ts +0 -1
- package/dist/core/provider-composer.js +0 -1
- package/dist/core/radius.d.ts +0 -1
- package/dist/core/radius.js +0 -1
- package/dist/core/remote-catalog-provider.d.ts +0 -1
- package/dist/core/remote-catalog-provider.js +0 -1
- package/dist/core/resolve-config-value.d.ts +0 -1
- package/dist/core/resolve-config-value.js +0 -1
- package/dist/core/resource-loader.d.ts +0 -1
- package/dist/core/resource-loader.js +0 -1
- package/dist/core/runtime-credentials.d.ts +0 -1
- package/dist/core/runtime-credentials.js +0 -1
- package/dist/core/sdk.d.ts +0 -1
- package/dist/core/sdk.js +0 -1
- package/dist/core/session-cwd.d.ts +0 -1
- package/dist/core/session-cwd.js +0 -1
- package/dist/core/session-manager.d.ts +0 -1
- package/dist/core/session-manager.js +0 -1
- package/dist/core/settings-manager-auto-handoff.test.d.ts +0 -1
- package/dist/core/settings-manager-auto-handoff.test.js +0 -1
- package/dist/core/settings-manager.d.ts +0 -4
- package/dist/core/settings-manager.js +0 -12
- package/dist/core/skills.d.ts +0 -1
- package/dist/core/skills.js +0 -1
- package/dist/core/slash-commands.d.ts +0 -1
- package/dist/core/slash-commands.js +0 -1
- package/dist/core/source-info.d.ts +0 -1
- package/dist/core/source-info.js +0 -1
- package/dist/core/system-prompt.d.ts +0 -1
- package/dist/core/system-prompt.js +0 -1
- package/dist/core/system-prompt.test.d.ts +0 -1
- package/dist/core/system-prompt.test.js +0 -1
- package/dist/core/telemetry.d.ts +0 -1
- package/dist/core/telemetry.js +0 -1
- package/dist/core/timings.d.ts +0 -1
- package/dist/core/timings.js +0 -1
- package/dist/core/tools/bash.d.ts +0 -1
- package/dist/core/tools/bash.js +0 -1
- package/dist/core/tools/edit-diff.d.ts +0 -1
- package/dist/core/tools/edit-diff.js +0 -1
- package/dist/core/tools/edit.d.ts +0 -1
- package/dist/core/tools/edit.js +0 -1
- package/dist/core/tools/file-mutation-queue.d.ts +0 -1
- package/dist/core/tools/file-mutation-queue.js +0 -1
- package/dist/core/tools/find.d.ts +0 -1
- package/dist/core/tools/find.js +0 -1
- package/dist/core/tools/grep.d.ts +0 -1
- package/dist/core/tools/grep.js +0 -1
- package/dist/core/tools/index.d.ts +0 -1
- package/dist/core/tools/index.js +0 -1
- package/dist/core/tools/ls.d.ts +0 -1
- package/dist/core/tools/ls.js +0 -1
- package/dist/core/tools/output-accumulator.d.ts +0 -1
- package/dist/core/tools/output-accumulator.js +0 -1
- package/dist/core/tools/path-utils.d.ts +0 -1
- package/dist/core/tools/path-utils.js +0 -1
- package/dist/core/tools/read.d.ts +0 -1
- package/dist/core/tools/read.js +0 -1
- package/dist/core/tools/render-utils.d.ts +0 -1
- package/dist/core/tools/render-utils.js +0 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +0 -1
- package/dist/core/tools/tool-definition-wrapper.js +0 -1
- package/dist/core/tools/truncate.d.ts +0 -1
- package/dist/core/tools/truncate.js +0 -1
- package/dist/core/tools/write.d.ts +0 -1
- package/dist/core/tools/write.js +0 -1
- package/dist/core/trust-manager.d.ts +0 -1
- package/dist/core/trust-manager.js +0 -1
- package/dist/core/usage-totals.d.ts +0 -1
- package/dist/core/usage-totals.js +0 -1
- package/dist/defaults/models.json +8 -0
- package/dist/defaults/settings.json +6 -7
- package/dist/extensions/inline-skills.test.ts +13 -13
- package/dist/extensions/inline-skills.ts +6 -6
- package/dist/extensions/pi-subagents/CHANGELOG.md +89 -12
- package/dist/extensions/pi-subagents/README.md +339 -604
- package/dist/extensions/pi-subagents/package-lock.json +190 -2079
- package/dist/extensions/pi-subagents/package.json +13 -5
- package/dist/extensions/pi-subagents/prompts/parallel-context-build.md +1 -1
- package/dist/extensions/pi-subagents/prompts/parallel-handoff-plan.md +1 -1
- package/dist/extensions/pi-subagents/prompts/review-loop.md +1 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +10 -10
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +32 -43
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +106 -105
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +3 -3
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +28 -35
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +167 -124
- package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +19 -0
- package/dist/extensions/pi-subagents/src/agents/agents.ts +163 -75
- package/dist/extensions/pi-subagents/src/agents/chain-serializer.ts +10 -7
- package/dist/extensions/pi-subagents/src/agents/frontmatter.ts +5 -3
- package/dist/extensions/pi-subagents/src/agents/identity.ts +1 -1
- package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +14 -11
- package/dist/extensions/pi-subagents/src/agents/skills.ts +23 -6
- package/dist/extensions/pi-subagents/src/agents/task-aware-routing.ts +8 -1
- package/dist/extensions/pi-subagents/src/api/control-channel.ts +4 -0
- package/dist/extensions/pi-subagents/src/api/delegation.ts +26 -194
- package/dist/extensions/pi-subagents/src/api/external-runs.ts +129 -0
- package/dist/extensions/pi-subagents/src/api/intercom-bridge.ts +3 -0
- package/dist/extensions/pi-subagents/src/api/pi-args.ts +5 -0
- package/dist/extensions/pi-subagents/src/api/preflight.ts +4 -4
- package/dist/extensions/pi-subagents/src/api/shared-types.ts +19 -0
- package/dist/extensions/pi-subagents/src/extension/config.ts +10 -0
- package/dist/extensions/pi-subagents/src/extension/control-notices.ts +5 -39
- package/dist/extensions/pi-subagents/src/extension/doctor.ts +10 -9
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +7 -4
- package/dist/extensions/pi-subagents/src/extension/index.ts +243 -77
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +18 -6
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +50 -39
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +36 -103
- package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +229 -0
- package/dist/extensions/pi-subagents/src/inspectors/herdr/client.ts +130 -0
- package/dist/extensions/pi-subagents/src/inspectors/herdr/inspector-runner.ts +141 -0
- package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +154 -0
- package/dist/extensions/pi-subagents/src/integrations/herdr-status.ts +330 -0
- package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +3 -2
- package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +5 -1
- package/dist/extensions/pi-subagents/src/missions/actions.ts +372 -0
- package/dist/extensions/pi-subagents/src/missions/lifecycle.ts +314 -0
- package/dist/extensions/pi-subagents/src/missions/store.ts +442 -0
- package/dist/extensions/pi-subagents/src/missions/types.ts +135 -0
- package/dist/extensions/pi-subagents/src/policy/authority.ts +46 -0
- package/dist/extensions/pi-subagents/src/profiles/profiles.ts +32 -6
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +103 -72
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +10 -2
- package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +6 -6
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +29 -1
- package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +3 -3
- package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +3 -2
- package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +9 -7
- package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +3 -4
- package/dist/extensions/pi-subagents/src/runs/background/notify.ts +3 -28
- package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +5 -5
- package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +18 -68
- package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +3 -3
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +35 -8
- package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +602 -375
- package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +3 -3
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +612 -464
- package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +50 -9
- package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +253 -0
- package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +12 -4
- package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +3 -3
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +8 -4
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +74 -102
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +21 -22
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1050 -396
- package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +44 -18
- package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +0 -1
- package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +302 -22
- package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-runner.ts +130 -0
- package/dist/extensions/pi-subagents/src/runs/shared/long-running-guard.ts +42 -1
- package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +59 -5
- package/dist/extensions/pi-subagents/src/runs/shared/nested-render.ts +9 -4
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +86 -2
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +11 -2
- package/dist/extensions/pi-subagents/src/runs/shared/permissions.ts +95 -0
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +11 -1
- package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +15 -6
- package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +9 -63
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +37 -6
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +5 -2
- package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +2 -23
- package/dist/extensions/pi-subagents/src/runs/shared/turn-budget.ts +6 -6
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +124 -13
- package/dist/extensions/pi-subagents/src/shared/accessible-dir.ts +29 -7
- package/dist/extensions/pi-subagents/src/shared/artifacts.ts +18 -1
- package/dist/extensions/pi-subagents/src/shared/fork-context.ts +3 -2
- package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +1 -0
- package/dist/extensions/pi-subagents/src/shared/settings.ts +10 -0
- package/dist/extensions/pi-subagents/src/shared/types.ts +158 -55
- package/dist/extensions/pi-subagents/src/shared/utils.ts +16 -66
- package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +33 -199
- package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +43 -126
- package/dist/extensions/pi-subagents/src/slash/inline-subagents.ts +103 -0
- package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +158 -205
- package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +22 -58
- package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +14 -0
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +44 -642
- package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +18 -14
- package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +156 -21
- package/dist/extensions/pi-subagents/src/tui/fleet-transcript.ts +110 -5
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +60 -24
- package/dist/extensions/pi-subagents/src/tui/render.ts +296 -140
- package/dist/extensions/pi-subagents/src/types/pi-runtime-compat.d.ts +14 -0
- package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +1 -1
- package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +13 -7
- package/dist/extensions/pi-subagents/src/watchdog/model-selection.ts +2 -2
- package/dist/extensions/pi-subagents/src/watchdog/permission-arbiter.ts +145 -0
- package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +1 -1
- package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +1 -1
- package/dist/extensions/pi-subagents/src/watchdog/review.ts +4 -1
- package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +3 -2
- package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +140 -0
- package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +415 -0
- package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +41 -144
- package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +16 -16
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +415 -298
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +149 -82
- package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +40 -40
- package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +15 -15
- package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +193 -133
- package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +1 -49
- package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +62 -0
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +56 -58
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +81 -68
- package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +20 -25
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +425 -317
- package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +73 -73
- package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +123 -98
- package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +653 -240
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +20 -1661
- package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +8 -5
- package/dist/extensions/pi-subagents/test/support/mock-pi.ts +6 -6
- package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +4 -20
- package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +25 -4
- package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +280 -295
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +47 -207
- package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +26 -26
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +89 -89
- package/dist/extensions/pi-subagents/test/unit/agent-selection.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +10 -0
- package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +33 -9
- package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +24 -2
- package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +11 -9
- package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +40 -40
- package/dist/extensions/pi-subagents/test/unit/authority-policy.test.ts +22 -0
- package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +5 -39
- package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +19 -19
- package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/chain-serializer.test.ts +20 -20
- package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +99 -0
- package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +41 -0
- package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +35 -5
- package/dist/extensions/pi-subagents/test/unit/config-dir-runtime.test.ts +7 -0
- package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +16 -82
- package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +162 -620
- package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +25 -25
- package/dist/extensions/pi-subagents/test/unit/ensure-accessible-dir.test.ts +125 -0
- package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +94 -0
- package/dist/extensions/pi-subagents/test/unit/external-runs.test.ts +66 -0
- package/dist/extensions/pi-subagents/test/unit/extra-agent-dirs.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +242 -52
- package/dist/extensions/pi-subagents/test/unit/fleet-transcript.test.ts +127 -0
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +197 -36
- package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +4 -4
- package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +245 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +494 -0
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +261 -31
- package/dist/extensions/pi-subagents/test/unit/inline-subagents.test.ts +52 -0
- package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +6 -6
- package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +217 -0
- package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +182 -0
- package/dist/extensions/pi-subagents/test/unit/mock-pi.test.ts +22 -0
- package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +10 -10
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +20 -12
- package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +47 -5
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +49 -55
- package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +20 -3
- package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +37 -7
- package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +10 -10
- package/dist/extensions/pi-subagents/test/unit/path-handling.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/permissions.test.ts +46 -0
- package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +31 -10
- package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +40 -16
- package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +42 -44
- package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +13 -13
- package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +4 -4
- package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +75 -9
- package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +20 -84
- package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +15 -16
- package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +28 -28
- package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +19 -12
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +37 -21
- package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +50 -50
- package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +396 -433
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +76 -153
- package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +411 -0
- package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +1 -91
- package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +139 -0
- package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +29 -0
- package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +13 -13
- package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/steering.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +35 -35
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +53 -18
- package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +13 -1
- package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +44 -11
- package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +2 -26
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +24 -148
- package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +11 -9
- package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +351 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +13 -13
- package/dist/extensions/pi-subagents/test/unit/watchdog-lsp-diagnostics.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-permission-arbiter.test.ts +79 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +8 -8
- package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +45 -9
- package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +197 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-graph.test.ts +8 -8
- package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +142 -12
- package/dist/extensions/pi-subagents/tsconfig.json +15 -0
- package/dist/extensions/pi-web-agent/package.json +1 -1
- package/dist/extensions/rtk.test.ts +126 -0
- package/dist/extensions/rtk.ts +56 -20
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.js +0 -1
- package/dist/migrations.d.ts +0 -1
- package/dist/migrations.js +0 -1
- package/dist/modes/index.d.ts +0 -1
- package/dist/modes/index.js +0 -1
- package/dist/modes/interactive/components/armin.d.ts +0 -1
- package/dist/modes/interactive/components/armin.js +0 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +0 -1
- package/dist/modes/interactive/components/assistant-message.js +0 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +0 -1
- package/dist/modes/interactive/components/bash-execution.js +0 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts +0 -1
- package/dist/modes/interactive/components/bordered-loader.js +0 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +0 -1
- package/dist/modes/interactive/components/branch-summary-message.js +0 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +0 -1
- package/dist/modes/interactive/components/config-selector.d.ts +0 -1
- package/dist/modes/interactive/components/config-selector.js +0 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts +0 -1
- package/dist/modes/interactive/components/countdown-timer.js +0 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +0 -1
- package/dist/modes/interactive/components/custom-editor.js +0 -1
- package/dist/modes/interactive/components/custom-entry.d.ts +0 -1
- package/dist/modes/interactive/components/custom-entry.js +0 -1
- package/dist/modes/interactive/components/custom-message.d.ts +0 -1
- package/dist/modes/interactive/components/custom-message.js +0 -1
- package/dist/modes/interactive/components/daxnuts.d.ts +0 -1
- package/dist/modes/interactive/components/daxnuts.js +0 -1
- package/dist/modes/interactive/components/diff.d.ts +0 -1
- package/dist/modes/interactive/components/diff.js +0 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts +0 -1
- package/dist/modes/interactive/components/dynamic-border.js +0 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts +0 -1
- package/dist/modes/interactive/components/earendil-announcement.js +0 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +0 -1
- package/dist/modes/interactive/components/extension-editor.js +0 -1
- package/dist/modes/interactive/components/extension-input.d.ts +0 -1
- package/dist/modes/interactive/components/extension-input.js +0 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +0 -1
- package/dist/modes/interactive/components/extension-selector.js +0 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts +0 -1
- package/dist/modes/interactive/components/first-time-setup.js +0 -1
- package/dist/modes/interactive/components/footer.d.ts +0 -1
- package/dist/modes/interactive/components/footer.js +0 -1
- package/dist/modes/interactive/components/index.d.ts +0 -1
- package/dist/modes/interactive/components/index.js +0 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +0 -1
- package/dist/modes/interactive/components/keybinding-hints.js +0 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +0 -1
- package/dist/modes/interactive/components/login-dialog.js +0 -1
- package/dist/modes/interactive/components/model-selector.d.ts +0 -1
- package/dist/modes/interactive/components/model-selector.js +0 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +0 -1
- package/dist/modes/interactive/components/oauth-selector.js +0 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +0 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts +0 -1
- package/dist/modes/interactive/components/session-selector-search.js +0 -1
- package/dist/modes/interactive/components/session-selector.d.ts +0 -1
- package/dist/modes/interactive/components/session-selector.js +0 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +0 -3
- package/dist/modes/interactive/components/settings-selector.js +1 -14
- package/dist/modes/interactive/components/show-images-selector.d.ts +0 -1
- package/dist/modes/interactive/components/show-images-selector.js +0 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +0 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +0 -1
- package/dist/modes/interactive/components/status-indicator.js +0 -1
- package/dist/modes/interactive/components/theme-selector.d.ts +0 -1
- package/dist/modes/interactive/components/theme-selector.js +0 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +0 -1
- package/dist/modes/interactive/components/thinking-selector.js +0 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +0 -1
- package/dist/modes/interactive/components/tool-execution.js +0 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +0 -1
- package/dist/modes/interactive/components/tree-selector.js +0 -1
- package/dist/modes/interactive/components/trust-selector.d.ts +0 -1
- package/dist/modes/interactive/components/trust-selector.js +0 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts +0 -1
- package/dist/modes/interactive/components/user-message-selector.js +0 -1
- package/dist/modes/interactive/components/user-message.d.ts +0 -1
- package/dist/modes/interactive/components/user-message.js +0 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts +0 -1
- package/dist/modes/interactive/components/visual-truncate.js +0 -1
- package/dist/modes/interactive/external-editor.d.ts +0 -1
- package/dist/modes/interactive/external-editor.js +0 -1
- package/dist/modes/interactive/interactive-mode.d.ts +0 -2
- package/dist/modes/interactive/interactive-mode.js +1 -22
- package/dist/modes/interactive/model-search.d.ts +0 -1
- package/dist/modes/interactive/model-search.js +0 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +0 -1
- package/dist/modes/interactive/theme/theme-controller.js +0 -1
- package/dist/modes/interactive/theme/theme.d.ts +0 -1
- package/dist/modes/interactive/theme/theme.js +0 -1
- package/dist/modes/print-mode.d.ts +0 -1
- package/dist/modes/print-mode.js +0 -1
- package/dist/modes/rpc/jsonl.d.ts +0 -1
- package/dist/modes/rpc/jsonl.js +0 -1
- package/dist/modes/rpc/rpc-client.d.ts +1 -2
- package/dist/modes/rpc/rpc-client.js +1 -2
- package/dist/modes/rpc/rpc-mode.d.ts +0 -1
- package/dist/modes/rpc/rpc-mode.js +0 -9
- package/dist/modes/rpc/rpc-types.d.ts +0 -1
- package/dist/modes/rpc/rpc-types.js +0 -1
- package/dist/package-manager-cli.d.ts +0 -1
- package/dist/package-manager-cli.js +0 -1
- package/dist/rpc-entry.d.ts +0 -1
- package/dist/rpc-entry.js +0 -1
- package/dist/utils/ansi.d.ts +0 -1
- package/dist/utils/ansi.js +0 -1
- package/dist/utils/changelog.d.ts +0 -1
- package/dist/utils/changelog.js +0 -1
- package/dist/utils/child-process.d.ts +0 -1
- package/dist/utils/child-process.js +0 -1
- package/dist/utils/clipboard-image.d.ts +0 -1
- package/dist/utils/clipboard-image.js +0 -1
- package/dist/utils/clipboard-native.d.ts +0 -1
- package/dist/utils/clipboard-native.js +0 -1
- package/dist/utils/clipboard.d.ts +0 -1
- package/dist/utils/clipboard.js +0 -1
- package/dist/utils/deprecation.d.ts +0 -1
- package/dist/utils/deprecation.js +0 -1
- package/dist/utils/exif-orientation.d.ts +0 -1
- package/dist/utils/exif-orientation.js +0 -1
- package/dist/utils/frontmatter.d.ts +0 -1
- package/dist/utils/frontmatter.js +0 -1
- package/dist/utils/fs-watch.d.ts +0 -1
- package/dist/utils/fs-watch.js +0 -1
- package/dist/utils/git.d.ts +0 -1
- package/dist/utils/git.js +0 -1
- package/dist/utils/html.d.ts +0 -1
- package/dist/utils/html.js +0 -1
- package/dist/utils/image-convert.d.ts +0 -1
- package/dist/utils/image-convert.js +0 -1
- package/dist/utils/image-process.d.ts +0 -1
- package/dist/utils/image-process.js +0 -1
- package/dist/utils/image-resize-core.d.ts +0 -1
- package/dist/utils/image-resize-core.js +0 -1
- package/dist/utils/image-resize-worker.d.ts +0 -1
- package/dist/utils/image-resize-worker.js +0 -1
- package/dist/utils/image-resize.d.ts +0 -1
- package/dist/utils/image-resize.js +0 -1
- package/dist/utils/json.d.ts +0 -1
- package/dist/utils/json.js +0 -1
- package/dist/utils/mime.d.ts +0 -1
- package/dist/utils/mime.js +0 -1
- package/dist/utils/open-browser.d.ts +0 -1
- package/dist/utils/open-browser.js +0 -1
- package/dist/utils/paths.d.ts +0 -1
- package/dist/utils/paths.js +0 -1
- package/dist/utils/photon.d.ts +0 -1
- package/dist/utils/photon.js +0 -1
- package/dist/utils/pi-user-agent.d.ts +0 -1
- package/dist/utils/pi-user-agent.js +0 -1
- package/dist/utils/shell.d.ts +0 -1
- package/dist/utils/shell.js +0 -1
- package/dist/utils/sleep.d.ts +0 -1
- package/dist/utils/sleep.js +0 -1
- package/dist/utils/syntax-highlight.d.ts +0 -1
- package/dist/utils/syntax-highlight.js +0 -1
- package/dist/utils/thinking-tags.d.ts +0 -1
- package/dist/utils/thinking-tags.js +0 -1
- package/dist/utils/tools-manager.d.ts +3 -3
- package/dist/utils/tools-manager.js +125 -42
- package/dist/utils/version-check.d.ts +0 -1
- package/dist/utils/version-check.js +0 -1
- package/dist/utils/windows-self-update.d.ts +0 -1
- package/dist/utils/windows-self-update.js +0 -1
- package/docs/rpc.md +1 -2
- package/docs/settings.md +0 -1
- package/docs/skills.md +10 -18
- package/package.json +4 -3
- package/dist/bun/cli.d.ts.map +0 -1
- package/dist/bun/cli.js.map +0 -1
- package/dist/bun/register-bedrock.d.ts.map +0 -1
- package/dist/bun/register-bedrock.js.map +0 -1
- package/dist/bun/restore-sandbox-env.d.ts.map +0 -1
- package/dist/bun/restore-sandbox-env.js.map +0 -1
- package/dist/cli/args.d.ts.map +0 -1
- package/dist/cli/args.js.map +0 -1
- package/dist/cli/config-selector.d.ts.map +0 -1
- package/dist/cli/config-selector.js.map +0 -1
- package/dist/cli/credential-print.d.ts.map +0 -1
- package/dist/cli/credential-print.js.map +0 -1
- package/dist/cli/file-processor.d.ts.map +0 -1
- package/dist/cli/file-processor.js.map +0 -1
- package/dist/cli/initial-message.d.ts.map +0 -1
- package/dist/cli/initial-message.js.map +0 -1
- package/dist/cli/list-models.d.ts.map +0 -1
- package/dist/cli/list-models.js.map +0 -1
- package/dist/cli/project-trust.d.ts.map +0 -1
- package/dist/cli/project-trust.js.map +0 -1
- package/dist/cli/session-picker.d.ts.map +0 -1
- package/dist/cli/session-picker.js.map +0 -1
- package/dist/cli/startup-ui.d.ts.map +0 -1
- package/dist/cli/startup-ui.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/core/agent-session-auto-handoff.test.d.ts.map +0 -1
- package/dist/core/agent-session-auto-handoff.test.js.map +0 -1
- package/dist/core/agent-session-runtime.d.ts.map +0 -1
- package/dist/core/agent-session-runtime.js.map +0 -1
- package/dist/core/agent-session-services.d.ts.map +0 -1
- package/dist/core/agent-session-services.js.map +0 -1
- package/dist/core/agent-session-skill-block.test.d.ts.map +0 -1
- package/dist/core/agent-session-skill-block.test.js.map +0 -1
- package/dist/core/agent-session.d.ts.map +0 -1
- package/dist/core/agent-session.js.map +0 -1
- package/dist/core/agents.d.ts.map +0 -1
- package/dist/core/agents.js.map +0 -1
- package/dist/core/auth-guidance.d.ts.map +0 -1
- package/dist/core/auth-guidance.js.map +0 -1
- package/dist/core/auth-storage.d.ts.map +0 -1
- package/dist/core/auth-storage.js.map +0 -1
- package/dist/core/bash-executor.d.ts.map +0 -1
- package/dist/core/bash-executor.js.map +0 -1
- package/dist/core/built-in-extensions.d.ts.map +0 -1
- package/dist/core/built-in-extensions.js.map +0 -1
- package/dist/core/cache-stats.d.ts.map +0 -1
- package/dist/core/cache-stats.js.map +0 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +0 -1
- package/dist/core/compaction/branch-summarization.js.map +0 -1
- package/dist/core/compaction/compaction.d.ts.map +0 -1
- package/dist/core/compaction/compaction.js.map +0 -1
- package/dist/core/compaction/index.d.ts.map +0 -1
- package/dist/core/compaction/index.js.map +0 -1
- package/dist/core/compaction/utils.d.ts.map +0 -1
- package/dist/core/compaction/utils.js.map +0 -1
- package/dist/core/defaults.d.ts.map +0 -1
- package/dist/core/defaults.js.map +0 -1
- package/dist/core/diagnostics.d.ts.map +0 -1
- package/dist/core/diagnostics.js.map +0 -1
- package/dist/core/event-bus.d.ts.map +0 -1
- package/dist/core/event-bus.js.map +0 -1
- package/dist/core/exec.d.ts.map +0 -1
- package/dist/core/exec.js.map +0 -1
- package/dist/core/experimental.d.ts.map +0 -1
- package/dist/core/experimental.js.map +0 -1
- package/dist/core/export-html/ansi-to-html.d.ts.map +0 -1
- package/dist/core/export-html/ansi-to-html.js.map +0 -1
- package/dist/core/export-html/index.d.ts.map +0 -1
- package/dist/core/export-html/index.js.map +0 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +0 -1
- package/dist/core/export-html/tool-renderer.js.map +0 -1
- package/dist/core/extensions/index.d.ts.map +0 -1
- package/dist/core/extensions/index.js.map +0 -1
- package/dist/core/extensions/loader.d.ts.map +0 -1
- package/dist/core/extensions/loader.js.map +0 -1
- package/dist/core/extensions/runner.d.ts.map +0 -1
- package/dist/core/extensions/runner.js.map +0 -1
- package/dist/core/extensions/types.d.ts.map +0 -1
- package/dist/core/extensions/types.js.map +0 -1
- package/dist/core/extensions/wrapper.d.ts.map +0 -1
- package/dist/core/extensions/wrapper.js.map +0 -1
- package/dist/core/footer-data-provider.d.ts.map +0 -1
- package/dist/core/footer-data-provider.js.map +0 -1
- package/dist/core/git-command.d.ts.map +0 -1
- package/dist/core/git-command.js.map +0 -1
- package/dist/core/http-dispatcher.d.ts.map +0 -1
- package/dist/core/http-dispatcher.js.map +0 -1
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js.map +0 -1
- package/dist/core/keybindings.d.ts.map +0 -1
- package/dist/core/keybindings.js.map +0 -1
- package/dist/core/llama/client.d.ts.map +0 -1
- package/dist/core/llama/client.js.map +0 -1
- package/dist/core/llama/huggingface.d.ts.map +0 -1
- package/dist/core/llama/huggingface.js.map +0 -1
- package/dist/core/llama/index.d.ts.map +0 -1
- package/dist/core/llama/index.js.map +0 -1
- package/dist/core/llama/provider.d.ts.map +0 -1
- package/dist/core/llama/provider.js.map +0 -1
- package/dist/core/llama/ui.d.ts.map +0 -1
- package/dist/core/llama/ui.js.map +0 -1
- package/dist/core/messages.d.ts.map +0 -1
- package/dist/core/messages.js.map +0 -1
- package/dist/core/model-config.d.ts.map +0 -1
- package/dist/core/model-config.js.map +0 -1
- package/dist/core/model-registry.d.ts.map +0 -1
- package/dist/core/model-registry.js.map +0 -1
- package/dist/core/model-resolver.d.ts.map +0 -1
- package/dist/core/model-resolver.js.map +0 -1
- package/dist/core/model-runtime.d.ts.map +0 -1
- package/dist/core/model-runtime.js.map +0 -1
- package/dist/core/models-store.d.ts.map +0 -1
- package/dist/core/models-store.js.map +0 -1
- package/dist/core/output-guard.d.ts.map +0 -1
- package/dist/core/output-guard.js.map +0 -1
- package/dist/core/package-manager.d.ts.map +0 -1
- package/dist/core/package-manager.js.map +0 -1
- package/dist/core/package-manager.test.d.ts.map +0 -1
- package/dist/core/package-manager.test.js.map +0 -1
- package/dist/core/project-trust.d.ts.map +0 -1
- package/dist/core/project-trust.js.map +0 -1
- package/dist/core/prompt-templates.d.ts.map +0 -1
- package/dist/core/prompt-templates.js.map +0 -1
- package/dist/core/provider-attribution.d.ts.map +0 -1
- package/dist/core/provider-attribution.js.map +0 -1
- package/dist/core/provider-composer.d.ts.map +0 -1
- package/dist/core/provider-composer.js.map +0 -1
- package/dist/core/radius.d.ts.map +0 -1
- package/dist/core/radius.js.map +0 -1
- package/dist/core/remote-catalog-provider.d.ts.map +0 -1
- package/dist/core/remote-catalog-provider.js.map +0 -1
- package/dist/core/resolve-config-value.d.ts.map +0 -1
- package/dist/core/resolve-config-value.js.map +0 -1
- package/dist/core/resource-loader.d.ts.map +0 -1
- package/dist/core/resource-loader.js.map +0 -1
- package/dist/core/runtime-credentials.d.ts.map +0 -1
- package/dist/core/runtime-credentials.js.map +0 -1
- package/dist/core/sdk.d.ts.map +0 -1
- package/dist/core/sdk.js.map +0 -1
- package/dist/core/session-cwd.d.ts.map +0 -1
- package/dist/core/session-cwd.js.map +0 -1
- package/dist/core/session-manager.d.ts.map +0 -1
- package/dist/core/session-manager.js.map +0 -1
- package/dist/core/settings-manager-auto-handoff.test.d.ts.map +0 -1
- package/dist/core/settings-manager-auto-handoff.test.js.map +0 -1
- package/dist/core/settings-manager.d.ts.map +0 -1
- package/dist/core/settings-manager.js.map +0 -1
- package/dist/core/skills.d.ts.map +0 -1
- package/dist/core/skills.js.map +0 -1
- package/dist/core/slash-commands.d.ts.map +0 -1
- package/dist/core/slash-commands.js.map +0 -1
- package/dist/core/source-info.d.ts.map +0 -1
- package/dist/core/source-info.js.map +0 -1
- package/dist/core/system-prompt.d.ts.map +0 -1
- package/dist/core/system-prompt.js.map +0 -1
- package/dist/core/system-prompt.test.d.ts.map +0 -1
- package/dist/core/system-prompt.test.js.map +0 -1
- package/dist/core/telemetry.d.ts.map +0 -1
- package/dist/core/telemetry.js.map +0 -1
- package/dist/core/timings.d.ts.map +0 -1
- package/dist/core/timings.js.map +0 -1
- package/dist/core/tools/bash.d.ts.map +0 -1
- package/dist/core/tools/bash.js.map +0 -1
- package/dist/core/tools/edit-diff.d.ts.map +0 -1
- package/dist/core/tools/edit-diff.js.map +0 -1
- package/dist/core/tools/edit.d.ts.map +0 -1
- package/dist/core/tools/edit.js.map +0 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +0 -1
- package/dist/core/tools/file-mutation-queue.js.map +0 -1
- package/dist/core/tools/find.d.ts.map +0 -1
- package/dist/core/tools/find.js.map +0 -1
- package/dist/core/tools/grep.d.ts.map +0 -1
- package/dist/core/tools/grep.js.map +0 -1
- package/dist/core/tools/index.d.ts.map +0 -1
- package/dist/core/tools/index.js.map +0 -1
- package/dist/core/tools/ls.d.ts.map +0 -1
- package/dist/core/tools/ls.js.map +0 -1
- package/dist/core/tools/output-accumulator.d.ts.map +0 -1
- package/dist/core/tools/output-accumulator.js.map +0 -1
- package/dist/core/tools/path-utils.d.ts.map +0 -1
- package/dist/core/tools/path-utils.js.map +0 -1
- package/dist/core/tools/read.d.ts.map +0 -1
- package/dist/core/tools/read.js.map +0 -1
- package/dist/core/tools/render-utils.d.ts.map +0 -1
- package/dist/core/tools/render-utils.js.map +0 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +0 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +0 -1
- package/dist/core/tools/truncate.d.ts.map +0 -1
- package/dist/core/tools/truncate.js.map +0 -1
- package/dist/core/tools/write.d.ts.map +0 -1
- package/dist/core/tools/write.js.map +0 -1
- package/dist/core/trust-manager.d.ts.map +0 -1
- package/dist/core/trust-manager.js.map +0 -1
- package/dist/core/usage-totals.d.ts.map +0 -1
- package/dist/core/usage-totals.js.map +0 -1
- package/dist/extensions/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/dist/extensions/pi-subagents/test/unit/slash-chain-groups.test.ts +0 -464
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/main.d.ts.map +0 -1
- package/dist/main.js.map +0 -1
- package/dist/migrations.d.ts.map +0 -1
- package/dist/migrations.js.map +0 -1
- package/dist/modes/index.d.ts.map +0 -1
- package/dist/modes/index.js.map +0 -1
- package/dist/modes/interactive/components/armin.d.ts.map +0 -1
- package/dist/modes/interactive/components/armin.js.map +0 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +0 -1
- package/dist/modes/interactive/components/assistant-message.js.map +0 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +0 -1
- package/dist/modes/interactive/components/bash-execution.js.map +0 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +0 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +0 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +0 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +0 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +0 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +0 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/config-selector.js.map +0 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +0 -1
- package/dist/modes/interactive/components/countdown-timer.js.map +0 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +0 -1
- package/dist/modes/interactive/components/custom-editor.js.map +0 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +0 -1
- package/dist/modes/interactive/components/custom-entry.js.map +0 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +0 -1
- package/dist/modes/interactive/components/custom-message.js.map +0 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +0 -1
- package/dist/modes/interactive/components/daxnuts.js.map +0 -1
- package/dist/modes/interactive/components/diff.d.ts.map +0 -1
- package/dist/modes/interactive/components/diff.js.map +0 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +0 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +0 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +0 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +0 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +0 -1
- package/dist/modes/interactive/components/extension-editor.js.map +0 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +0 -1
- package/dist/modes/interactive/components/extension-input.js.map +0 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/extension-selector.js.map +0 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +0 -1
- package/dist/modes/interactive/components/first-time-setup.js.map +0 -1
- package/dist/modes/interactive/components/footer.d.ts.map +0 -1
- package/dist/modes/interactive/components/footer.js.map +0 -1
- package/dist/modes/interactive/components/index.d.ts.map +0 -1
- package/dist/modes/interactive/components/index.js.map +0 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +0 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +0 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +0 -1
- package/dist/modes/interactive/components/login-dialog.js.map +0 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/model-selector.js.map +0 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/oauth-selector.js.map +0 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/scoped-models-selector.js.map +0 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +0 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +0 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/session-selector.js.map +0 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/settings-selector.js.map +0 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +0 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +0 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +0 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +0 -1
- package/dist/modes/interactive/components/status-indicator.js.map +0 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/theme-selector.js.map +0 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +0 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +0 -1
- package/dist/modes/interactive/components/tool-execution.js.map +0 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/tree-selector.js.map +0 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/trust-selector.js.map +0 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/user-message-selector.js.map +0 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +0 -1
- package/dist/modes/interactive/components/user-message.js.map +0 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +0 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +0 -1
- package/dist/modes/interactive/external-editor.d.ts.map +0 -1
- package/dist/modes/interactive/external-editor.js.map +0 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +0 -1
- package/dist/modes/interactive/interactive-mode.js.map +0 -1
- package/dist/modes/interactive/model-search.d.ts.map +0 -1
- package/dist/modes/interactive/model-search.js.map +0 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +0 -1
- package/dist/modes/interactive/theme/theme-controller.js.map +0 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +0 -1
- package/dist/modes/interactive/theme/theme.js.map +0 -1
- package/dist/modes/print-mode.d.ts.map +0 -1
- package/dist/modes/print-mode.js.map +0 -1
- package/dist/modes/rpc/jsonl.d.ts.map +0 -1
- package/dist/modes/rpc/jsonl.js.map +0 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +0 -1
- package/dist/modes/rpc/rpc-client.js.map +0 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +0 -1
- package/dist/modes/rpc/rpc-mode.js.map +0 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +0 -1
- package/dist/modes/rpc/rpc-types.js.map +0 -1
- package/dist/package-manager-cli.d.ts.map +0 -1
- package/dist/package-manager-cli.js.map +0 -1
- package/dist/rpc-entry.d.ts.map +0 -1
- package/dist/rpc-entry.js.map +0 -1
- package/dist/utils/ansi.d.ts.map +0 -1
- package/dist/utils/ansi.js.map +0 -1
- package/dist/utils/changelog.d.ts.map +0 -1
- package/dist/utils/changelog.js.map +0 -1
- package/dist/utils/child-process.d.ts.map +0 -1
- package/dist/utils/child-process.js.map +0 -1
- package/dist/utils/clipboard-image.d.ts.map +0 -1
- package/dist/utils/clipboard-image.js.map +0 -1
- package/dist/utils/clipboard-native.d.ts.map +0 -1
- package/dist/utils/clipboard-native.js.map +0 -1
- package/dist/utils/clipboard.d.ts.map +0 -1
- package/dist/utils/clipboard.js.map +0 -1
- package/dist/utils/deprecation.d.ts.map +0 -1
- package/dist/utils/deprecation.js.map +0 -1
- package/dist/utils/exif-orientation.d.ts.map +0 -1
- package/dist/utils/exif-orientation.js.map +0 -1
- package/dist/utils/frontmatter.d.ts.map +0 -1
- package/dist/utils/frontmatter.js.map +0 -1
- package/dist/utils/fs-watch.d.ts.map +0 -1
- package/dist/utils/fs-watch.js.map +0 -1
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/html.d.ts.map +0 -1
- package/dist/utils/html.js.map +0 -1
- package/dist/utils/image-convert.d.ts.map +0 -1
- package/dist/utils/image-convert.js.map +0 -1
- package/dist/utils/image-process.d.ts.map +0 -1
- package/dist/utils/image-process.js.map +0 -1
- package/dist/utils/image-resize-core.d.ts.map +0 -1
- package/dist/utils/image-resize-core.js.map +0 -1
- package/dist/utils/image-resize-worker.d.ts.map +0 -1
- package/dist/utils/image-resize-worker.js.map +0 -1
- package/dist/utils/image-resize.d.ts.map +0 -1
- package/dist/utils/image-resize.js.map +0 -1
- package/dist/utils/json.d.ts.map +0 -1
- package/dist/utils/json.js.map +0 -1
- package/dist/utils/mime.d.ts.map +0 -1
- package/dist/utils/mime.js.map +0 -1
- package/dist/utils/open-browser.d.ts.map +0 -1
- package/dist/utils/open-browser.js.map +0 -1
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js.map +0 -1
- package/dist/utils/photon.d.ts.map +0 -1
- package/dist/utils/photon.js.map +0 -1
- package/dist/utils/pi-user-agent.d.ts.map +0 -1
- package/dist/utils/pi-user-agent.js.map +0 -1
- package/dist/utils/shell.d.ts.map +0 -1
- package/dist/utils/shell.js.map +0 -1
- package/dist/utils/sleep.d.ts.map +0 -1
- package/dist/utils/sleep.js.map +0 -1
- package/dist/utils/syntax-highlight.d.ts.map +0 -1
- package/dist/utils/syntax-highlight.js.map +0 -1
- package/dist/utils/thinking-tags.d.ts.map +0 -1
- package/dist/utils/thinking-tags.js.map +0 -1
- package/dist/utils/tools-manager.d.ts.map +0 -1
- package/dist/utils/tools-manager.js.map +0 -1
- package/dist/utils/version-check.d.ts.map +0 -1
- package/dist/utils/version-check.js.map +0 -1
- package/dist/utils/windows-self-update.d.ts.map +0 -1
- package/dist/utils/windows-self-update.js.map +0 -1
|
@@ -6,7 +6,7 @@ import { afterEach, describe, it } from "node:test";
|
|
|
6
6
|
import { handleManagementAction } from "../../src/agents/agent-management.ts";
|
|
7
7
|
import { serializeAgent } from "../../src/agents/agent-serializer.ts";
|
|
8
8
|
import { parseChain, serializeChain } from "../../src/agents/chain-serializer.ts";
|
|
9
|
-
import {
|
|
9
|
+
import { discoverAgents, discoverAgentsAll, type AgentConfig } from "../../src/agents/agents.ts";
|
|
10
10
|
import { parseFrontmatter } from "../../src/agents/frontmatter.ts";
|
|
11
11
|
import { buildPiArgs } from "../../src/runs/shared/pi-args.ts";
|
|
12
12
|
import { THINKING_LEVELS } from "../../src/shared/model-info.ts";
|
|
@@ -60,7 +60,7 @@ describe("folded frontmatter blocks", () => {
|
|
|
60
60
|
it("folds ordinary lines and paragraph breaks for > and >-", () => {
|
|
61
61
|
const expected = "first line second line\nthird line";
|
|
62
62
|
const folded = parseFrontmatter(`---
|
|
63
|
-
name:
|
|
63
|
+
name: builder
|
|
64
64
|
description: >
|
|
65
65
|
first line
|
|
66
66
|
second line
|
|
@@ -69,7 +69,7 @@ description: >
|
|
|
69
69
|
---
|
|
70
70
|
body`);
|
|
71
71
|
const stripped = parseFrontmatter(`---
|
|
72
|
-
name:
|
|
72
|
+
name: builder
|
|
73
73
|
description: >-
|
|
74
74
|
first line
|
|
75
75
|
second line
|
|
@@ -80,7 +80,7 @@ body`);
|
|
|
80
80
|
|
|
81
81
|
assert.equal(folded.frontmatter.description, expected);
|
|
82
82
|
assert.equal(stripped.frontmatter.description, expected);
|
|
83
|
-
assert.equal(folded.frontmatter.name, "
|
|
83
|
+
assert.equal(folded.frontmatter.name, "builder");
|
|
84
84
|
});
|
|
85
85
|
|
|
86
86
|
it("keeps quoted indicators as literal values", () => {
|
|
@@ -105,12 +105,12 @@ description: >
|
|
|
105
105
|
|
|
106
106
|
${" ".repeat(3)}
|
|
107
107
|
second
|
|
108
|
-
name:
|
|
108
|
+
name: builder
|
|
109
109
|
---
|
|
110
110
|
body`);
|
|
111
111
|
|
|
112
112
|
assert.equal(parsed.frontmatter.description, "normal\n code\nnext\nfirst\n\nsecond");
|
|
113
|
-
assert.equal(parsed.frontmatter.name, "
|
|
113
|
+
assert.equal(parsed.frontmatter.name, "builder");
|
|
114
114
|
});
|
|
115
115
|
|
|
116
116
|
it("keeps paragraph breaks adjacent to more-indented lines", () => {
|
|
@@ -136,20 +136,63 @@ body`);
|
|
|
136
136
|
});
|
|
137
137
|
});
|
|
138
138
|
|
|
139
|
+
describe("agent runner frontmatter", () => {
|
|
140
|
+
it("parses and serializes an external-cli runner", () => withTempHome(() => {
|
|
141
|
+
const project = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-runner-agent-"));
|
|
142
|
+
tempDirs.push(project);
|
|
143
|
+
writeAgent(path.join(project, ".selesai", "agents", "external.md"), `---
|
|
144
|
+
name: external
|
|
145
|
+
description: External runner
|
|
146
|
+
runner:
|
|
147
|
+
type: external-cli
|
|
148
|
+
command: ${JSON.stringify(process.execPath)}
|
|
149
|
+
args: ["-e", "process.stdin.pipe(process.stdout)"]
|
|
150
|
+
promptDelivery: stdin
|
|
151
|
+
async: true
|
|
152
|
+
---
|
|
153
|
+
Review carefully.`.replace(" description:", "description:"));
|
|
154
|
+
|
|
155
|
+
const external = discoverAgents(project, "project").agents.find((agent) => agent.name === "external")!;
|
|
156
|
+
assert.deepEqual(external.runner, { type: "external-cli", command: process.execPath, args: ["-e", "process.stdin.pipe(process.stdout)"], promptDelivery: "stdin" });
|
|
157
|
+
assert.match(serializeAgent(external), /runner:\n type: external-cli\n command:/);
|
|
158
|
+
assert.deepEqual(discoverAgents(project, "project").agents.find((agent) => agent.name === "external")?.runner, external.runner);
|
|
159
|
+
}));
|
|
160
|
+
|
|
161
|
+
it("rejects invalid and Pi-only external runner fields", () => withTempHome(() => {
|
|
162
|
+
const invalidCases = [
|
|
163
|
+
"type: unknown\n command: node",
|
|
164
|
+
"type: external-cli\n command: ''",
|
|
165
|
+
"type: external-cli\n command: node\n args: nope",
|
|
166
|
+
"type: external-cli\n command: node\n args: [ok, 1]",
|
|
167
|
+
"type: external-cli\n command: node\n promptDelivery: argv",
|
|
168
|
+
];
|
|
169
|
+
for (const [index, runner] of invalidCases.entries()) {
|
|
170
|
+
const project = fs.mkdtempSync(path.join(os.tmpdir(), `pi-subagents-invalid-runner-${index}-`));
|
|
171
|
+
tempDirs.push(project);
|
|
172
|
+
writeAgent(path.join(project, ".selesai", "agents", "external.md"), `---\nname: external\ndescription: External\nrunner:\n ${runner}\n---\nBody`);
|
|
173
|
+
assert.throws(() => discoverAgents(project, "project"), /invalid runner\.type|non-empty command|args must be an array of strings|promptDelivery must be 'stdin'/);
|
|
174
|
+
}
|
|
175
|
+
const project = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-runner-pi-only-"));
|
|
176
|
+
tempDirs.push(project);
|
|
177
|
+
writeAgent(path.join(project, ".selesai", "agents", "external.md"), `---\nname: external\ndescription: External\nrunner:\n type: external-cli\n command: node\nmodel: provider/model\n---\nBody`);
|
|
178
|
+
assert.throws(() => discoverAgents(project, "project"), /unsupported Pi-only fields: model/);
|
|
179
|
+
}));
|
|
180
|
+
});
|
|
181
|
+
|
|
139
182
|
describe("agent skillPath frontmatter", () => {
|
|
140
183
|
it("parses and serializes comma-separated paths", () => withTempHome(() => {
|
|
141
184
|
const project = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-skill-path-agent-"));
|
|
142
185
|
tempDirs.push(project);
|
|
143
|
-
writeAgent(path.join(project, ".selesai", "agents", "
|
|
144
|
-
name:
|
|
186
|
+
writeAgent(path.join(project, ".selesai", "agents", "builder.md"), `---
|
|
187
|
+
name: builder
|
|
145
188
|
description: Worker
|
|
146
189
|
skillPath: ./skills, ../shared-skills
|
|
147
190
|
---
|
|
148
191
|
body`);
|
|
149
192
|
|
|
150
|
-
const
|
|
151
|
-
assert.deepEqual(
|
|
152
|
-
assert.match(serializeAgent(
|
|
193
|
+
const builder = discoverAgents(project, "both").agents.find((agent) => agent.name === "builder")!;
|
|
194
|
+
assert.deepEqual(builder.skillPath, ["./skills", "../shared-skills"]);
|
|
195
|
+
assert.match(serializeAgent(builder), /^skillPath: \.\/skills, \.\.\/shared-skills$/m);
|
|
153
196
|
}));
|
|
154
197
|
});
|
|
155
198
|
|
|
@@ -157,20 +200,20 @@ describe("agent aliases", () => {
|
|
|
157
200
|
it("parses and serializes agent aliases", () => withTempHome(() => {
|
|
158
201
|
const project = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-alias-agent-"));
|
|
159
202
|
tempDirs.push(project);
|
|
160
|
-
writeAgent(path.join(project, ".selesai", "agents", "
|
|
161
|
-
name:
|
|
203
|
+
writeAgent(path.join(project, ".selesai", "agents", "builder.md"), `---
|
|
204
|
+
name: builder
|
|
162
205
|
description: Worker
|
|
163
|
-
aliases:
|
|
206
|
+
aliases: developer, coder, builder
|
|
164
207
|
---
|
|
165
208
|
body`);
|
|
166
209
|
|
|
167
|
-
const
|
|
168
|
-
assert.deepEqual(
|
|
169
|
-
assert.match(serializeAgent(
|
|
210
|
+
const builder = discoverAgents(project, "both").agents.find((agent) => agent.name === "builder")!;
|
|
211
|
+
assert.deepEqual(builder.aliases, ["developer", "coder"]);
|
|
212
|
+
assert.match(serializeAgent(builder), /^aliases: developer, coder$/m);
|
|
170
213
|
|
|
171
214
|
const ctx = { cwd: project, modelRegistry: { getAvailable: () => [] } };
|
|
172
|
-
assert.match(handleManagementAction("list", {}, ctx).content[0]?.text ?? "", /aliases:
|
|
173
|
-
assert.match(handleManagementAction("get", { agent: "
|
|
215
|
+
assert.match(handleManagementAction("list", {}, ctx).content[0]?.text ?? "", /aliases: developer, coder/);
|
|
216
|
+
assert.match(handleManagementAction("get", { agent: "developer" }, ctx).content[0]?.text ?? "", /Agent: builder/);
|
|
174
217
|
}));
|
|
175
218
|
|
|
176
219
|
it("reports management alias collisions as ambiguous", () => withTempHome(() => {
|
|
@@ -178,7 +221,7 @@ body`);
|
|
|
178
221
|
tempDirs.push(project);
|
|
179
222
|
writeAgent(path.join(project, ".selesai", "agents", "review-agent.md"), `---
|
|
180
223
|
name: review-agent
|
|
181
|
-
description: Custom
|
|
224
|
+
description: Custom commentator
|
|
182
225
|
aliases: developer
|
|
183
226
|
---
|
|
184
227
|
body`);
|
|
@@ -186,7 +229,7 @@ body`);
|
|
|
186
229
|
const ctx = { cwd: project, modelRegistry: { getAvailable: () => [] } };
|
|
187
230
|
const getResult = handleManagementAction("get", { agent: "developer" }, ctx);
|
|
188
231
|
assert.equal(getResult.isError, true);
|
|
189
|
-
assert.match(getResult.content[0]?.text ?? "", /Ambiguous agent alias or name 'developer':
|
|
232
|
+
assert.match(getResult.content[0]?.text ?? "", /Ambiguous agent alias or name 'developer': (?:review-agent, builder|builder, review-agent)/);
|
|
190
233
|
|
|
191
234
|
const disableResult = handleManagementAction("disable", { agent: "developer" }, ctx);
|
|
192
235
|
assert.equal(disableResult.isError, true);
|
|
@@ -198,8 +241,8 @@ describe("agent simple-scalar list frontmatter", () => {
|
|
|
198
241
|
it("discovers newline block lists for all list fields and routes MCP tools", () => {
|
|
199
242
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-agent-block-list-frontmatter-"));
|
|
200
243
|
tempDirs.push(dir);
|
|
201
|
-
writeAgent(path.join(dir, ".selesai", "agents", "
|
|
202
|
-
name:
|
|
244
|
+
writeAgent(path.join(dir, ".selesai", "agents", "builder.md"), `---
|
|
245
|
+
name: builder
|
|
203
246
|
description: Worker
|
|
204
247
|
tools:
|
|
205
248
|
- read-only
|
|
@@ -227,15 +270,15 @@ subagentOnlyExtensions:
|
|
|
227
270
|
Do work
|
|
228
271
|
`);
|
|
229
272
|
|
|
230
|
-
const
|
|
231
|
-
assert.deepEqual(
|
|
232
|
-
assert.deepEqual(
|
|
233
|
-
assert.deepEqual(
|
|
234
|
-
assert.deepEqual(
|
|
235
|
-
assert.deepEqual(
|
|
236
|
-
assert.deepEqual(
|
|
237
|
-
assert.deepEqual(
|
|
238
|
-
assert.deepEqual(
|
|
273
|
+
const builder = discoverAgents(dir, "project").agents.find((agent) => agent.name === "builder");
|
|
274
|
+
assert.deepEqual(builder?.tools, ["read-only"]);
|
|
275
|
+
assert.deepEqual(builder?.mcpDirectTools, ["github/search_repositories"]);
|
|
276
|
+
assert.deepEqual(builder?.defaultReads, ["input-one.md", "input-two.md"]);
|
|
277
|
+
assert.deepEqual(builder?.skills, ["review-checklist", "safe-bash"]);
|
|
278
|
+
assert.deepEqual(builder?.skillPath, ["./private-skills", "../shared-skills"]);
|
|
279
|
+
assert.deepEqual(builder?.fallbackModels, ["openai/gpt-5-mini", "anthropic/claude-sonnet-4"]);
|
|
280
|
+
assert.deepEqual(builder?.extensions, ["./extension-one.ts", "./extension-two.ts"]);
|
|
281
|
+
assert.deepEqual(builder?.subagentOnlyExtensions, ["./child-only.ts", "./child-helper.ts"]);
|
|
239
282
|
});
|
|
240
283
|
|
|
241
284
|
it("preserves MCP-only tools as an explicit empty builtin allowlist", () => {
|
|
@@ -259,8 +302,8 @@ Do MCP work
|
|
|
259
302
|
it("preserves comma-separated syntax across all list fields", () => {
|
|
260
303
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-agent-comma-list-frontmatter-"));
|
|
261
304
|
tempDirs.push(dir);
|
|
262
|
-
writeAgent(path.join(dir, ".selesai", "agents", "
|
|
263
|
-
name:
|
|
305
|
+
writeAgent(path.join(dir, ".selesai", "agents", "builder.md"), `---
|
|
306
|
+
name: builder
|
|
264
307
|
description: Worker
|
|
265
308
|
tools: read-only, mcp:github/search_repositories
|
|
266
309
|
defaultReads: input-one.md, input-two.md
|
|
@@ -274,63 +317,67 @@ subagentOnlyExtensions: ./child-only.ts, ./child-helper.ts
|
|
|
274
317
|
Do work
|
|
275
318
|
`);
|
|
276
319
|
|
|
277
|
-
const
|
|
278
|
-
assert.deepEqual(
|
|
279
|
-
assert.deepEqual(
|
|
280
|
-
assert.deepEqual(
|
|
281
|
-
assert.deepEqual(
|
|
282
|
-
assert.deepEqual(
|
|
283
|
-
assert.deepEqual(
|
|
284
|
-
assert.deepEqual(
|
|
285
|
-
assert.deepEqual(
|
|
320
|
+
const builder = discoverAgents(dir, "project").agents.find((agent) => agent.name === "builder");
|
|
321
|
+
assert.deepEqual(builder?.tools, ["read-only"]);
|
|
322
|
+
assert.deepEqual(builder?.mcpDirectTools, ["github/search_repositories"]);
|
|
323
|
+
assert.deepEqual(builder?.defaultReads, ["input-one.md", "input-two.md"]);
|
|
324
|
+
assert.deepEqual(builder?.skills, ["review-checklist", "safe-bash"]);
|
|
325
|
+
assert.deepEqual(builder?.skillPath, ["./private-skills", "../shared-skills"]);
|
|
326
|
+
assert.deepEqual(builder?.fallbackModels, ["openai/gpt-5-mini", "anthropic/claude-sonnet-4"]);
|
|
327
|
+
assert.deepEqual(builder?.extensions, ["./extension-one.ts", "./extension-two.ts"]);
|
|
328
|
+
assert.deepEqual(builder?.subagentOnlyExtensions, ["./child-only.ts", "./child-helper.ts"]);
|
|
286
329
|
});
|
|
287
330
|
});
|
|
288
331
|
|
|
289
332
|
describe("agent permission frontmatter", () => {
|
|
290
|
-
it("
|
|
333
|
+
it("parses and preserves explicit non-bash permission rules", () => {
|
|
291
334
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-agent-permission-frontmatter-"));
|
|
292
335
|
tempDirs.push(dir);
|
|
293
336
|
const agentsDir = path.join(dir, ".selesai", "agents");
|
|
294
337
|
fs.mkdirSync(agentsDir, { recursive: true });
|
|
295
|
-
fs.writeFileSync(path.join(agentsDir, "
|
|
296
|
-
name:
|
|
338
|
+
fs.writeFileSync(path.join(agentsDir, "builder.md"), `---
|
|
339
|
+
name: builder
|
|
297
340
|
description: Worker
|
|
298
341
|
tools: bash,read,write
|
|
299
342
|
permission:
|
|
300
|
-
"*": ask
|
|
301
343
|
read: allow
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
"git *": allow
|
|
344
|
+
write: ask
|
|
345
|
+
edit: deny
|
|
305
346
|
---
|
|
306
347
|
|
|
307
348
|
Do work
|
|
308
349
|
`, "utf-8");
|
|
309
350
|
|
|
310
|
-
const
|
|
311
|
-
|
|
312
|
-
assert.equal(
|
|
313
|
-
read: allow
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
351
|
+
const builder = discoverAgents(dir, "project").agents.find((agent) => agent.name === "builder");
|
|
352
|
+
assert.deepEqual(builder?.permissions, { read: "allow", write: "ask", edit: "deny" });
|
|
353
|
+
assert.equal(builder?.extraFields?.permission, undefined);
|
|
354
|
+
assert.match(serializeAgent(builder!), /^permissions:\n read: allow\n write: ask\n edit: deny$/m);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
it("rejects bash permission rules and conflicting aliases", () => {
|
|
358
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-agent-permission-invalid-"));
|
|
359
|
+
tempDirs.push(dir);
|
|
360
|
+
const agentsDir = path.join(dir, ".selesai", "agents");
|
|
361
|
+
fs.mkdirSync(agentsDir, { recursive: true });
|
|
362
|
+
fs.writeFileSync(path.join(agentsDir, "builder.md"), `---\nname: builder\ndescription: Worker\npermission:\n bash: deny\n---\n`, "utf-8");
|
|
363
|
+
assert.throws(() => discoverAgents(dir, "project"), /pi-guard/);
|
|
364
|
+
|
|
365
|
+
fs.writeFileSync(path.join(agentsDir, "builder.md"), `---\nname: builder\ndescription: Worker\npermission:\n write: ask\npermissions:\n edit: deny\n---\n`, "utf-8");
|
|
366
|
+
assert.throws(() => discoverAgents(dir, "project"), /cannot declare both permission and permissions/);
|
|
320
367
|
});
|
|
321
368
|
});
|
|
322
369
|
|
|
323
370
|
describe("agent frontmatter defaultContext", () => {
|
|
324
371
|
it("serializes defaultContext into agent frontmatter", () => {
|
|
325
372
|
const agent: AgentConfig = {
|
|
326
|
-
name: "
|
|
373
|
+
name: "builder",
|
|
327
374
|
description: "Worker",
|
|
328
375
|
systemPrompt: "Do work",
|
|
329
376
|
systemPromptMode: "replace",
|
|
330
377
|
inheritProjectContext: true,
|
|
331
378
|
inheritSkills: false,
|
|
332
379
|
source: "project",
|
|
333
|
-
filePath: "/tmp/
|
|
380
|
+
filePath: "/tmp/builder.md",
|
|
334
381
|
defaultContext: "fork",
|
|
335
382
|
};
|
|
336
383
|
|
|
@@ -343,8 +390,8 @@ describe("agent frontmatter defaultContext", () => {
|
|
|
343
390
|
tempDirs.push(dir);
|
|
344
391
|
const agentsDir = path.join(dir, ".selesai", "agents");
|
|
345
392
|
fs.mkdirSync(agentsDir, { recursive: true });
|
|
346
|
-
fs.writeFileSync(path.join(agentsDir, "
|
|
347
|
-
name:
|
|
393
|
+
fs.writeFileSync(path.join(agentsDir, "builder.md"), `---
|
|
394
|
+
name: builder
|
|
348
395
|
description: Worker
|
|
349
396
|
defaultContext: fork
|
|
350
397
|
---
|
|
@@ -353,59 +400,18 @@ Do work
|
|
|
353
400
|
`, "utf-8");
|
|
354
401
|
|
|
355
402
|
const result = discoverAgents(dir, "project");
|
|
356
|
-
const
|
|
357
|
-
assert.equal(
|
|
403
|
+
const builder = result.agents.find((agent) => agent.name === "builder");
|
|
404
|
+
assert.equal(builder?.defaultContext, "fork");
|
|
358
405
|
});
|
|
359
406
|
|
|
360
|
-
it("loads
|
|
407
|
+
it("loads bundled architect, builder, and commentator context defaults", () => {
|
|
361
408
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-builtin-default-context-"));
|
|
362
409
|
tempDirs.push(dir);
|
|
363
410
|
const agents = discoverAgentsAll(dir).builtin;
|
|
364
411
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
builder: "fresh",
|
|
369
|
-
commentator: "fresh",
|
|
370
|
-
explorer: "fresh",
|
|
371
|
-
researcher: "fresh",
|
|
372
|
-
};
|
|
373
|
-
assert.deepEqual(
|
|
374
|
-
agents.map((agent) => agent.name).sort(),
|
|
375
|
-
[...BUILTIN_AGENT_NAMES].sort(),
|
|
376
|
-
);
|
|
377
|
-
for (const [name, context] of Object.entries(expected)) {
|
|
378
|
-
const agent = agents.find((candidate) => candidate.name === name);
|
|
379
|
-
assert.equal(agent?.defaultContext, context, `${name} should default to ${context} context`);
|
|
380
|
-
}
|
|
381
|
-
});
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
describe("bundled agent descriptions and acceptance roles", () => {
|
|
385
|
-
it("survives discovery with declared descriptions and acceptance roles", () => {
|
|
386
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-bundled-catalog-roles-"));
|
|
387
|
-
tempDirs.push(dir);
|
|
388
|
-
const agents = discoverAgentsAll(dir).builtin;
|
|
389
|
-
|
|
390
|
-
const expected: Record<string, { description: string; acceptanceRole: "read-only" | "writer" }> = {
|
|
391
|
-
architect: { description: "Read-only architecture and implementation planning", acceptanceRole: "read-only" },
|
|
392
|
-
builder: { description: "Mutation-capable scoped implementation", acceptanceRole: "writer" },
|
|
393
|
-
commentator: { description: "Read-only evidence-based review", acceptanceRole: "read-only" },
|
|
394
|
-
explorer: { description: "Read-only local codebase reconnaissance", acceptanceRole: "read-only" },
|
|
395
|
-
recapper: { description: "Read-only handoff and context synthesis", acceptanceRole: "read-only" },
|
|
396
|
-
researcher: { description: "Read-only external and code-first research", acceptanceRole: "read-only" },
|
|
397
|
-
};
|
|
398
|
-
|
|
399
|
-
assert.deepEqual(
|
|
400
|
-
agents.map((agent) => agent.name).sort(),
|
|
401
|
-
[...BUILTIN_AGENT_NAMES].sort(),
|
|
402
|
-
);
|
|
403
|
-
for (const [name, expectedEntry] of Object.entries(expected)) {
|
|
404
|
-
const agent = agents.find((candidate) => candidate.name === name);
|
|
405
|
-
assert.ok(agent, `bundled agent ${name} not discovered`);
|
|
406
|
-
assert.equal(agent.description, expectedEntry.description, `${name} description`);
|
|
407
|
-
assert.equal(agent.acceptanceRole, expectedEntry.acceptanceRole, `${name} acceptanceRole`);
|
|
408
|
-
}
|
|
412
|
+
assert.equal(agents.find((candidate) => candidate.name === "architect")?.defaultContext, "fork");
|
|
413
|
+
assert.equal(agents.find((candidate) => candidate.name === "builder")?.defaultContext, "fresh");
|
|
414
|
+
assert.equal(agents.find((candidate) => candidate.name === "commentator")?.defaultContext, "fresh");
|
|
409
415
|
});
|
|
410
416
|
});
|
|
411
417
|
|
|
@@ -413,9 +419,9 @@ describe("agent frontmatter launch defaults", () => {
|
|
|
413
419
|
it("serializes and discovers single-agent launch defaults", () => {
|
|
414
420
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-agent-launch-defaults-"));
|
|
415
421
|
tempDirs.push(dir);
|
|
416
|
-
const filePath = path.join(dir, ".selesai", "agents", "
|
|
422
|
+
const filePath = path.join(dir, ".selesai", "agents", "builder.md");
|
|
417
423
|
const agent: AgentConfig = {
|
|
418
|
-
name: "
|
|
424
|
+
name: "builder",
|
|
419
425
|
description: "Worker",
|
|
420
426
|
systemPrompt: "Do work",
|
|
421
427
|
systemPromptMode: "replace",
|
|
@@ -436,29 +442,29 @@ describe("agent frontmatter launch defaults", () => {
|
|
|
436
442
|
assert.match(serialized, /^acceptance: \{"level":"none","reason":"lightweight lookup"\}$/m);
|
|
437
443
|
writeAgent(filePath, serialized);
|
|
438
444
|
|
|
439
|
-
const
|
|
440
|
-
assert.equal(
|
|
441
|
-
assert.equal(
|
|
442
|
-
assert.deepEqual(
|
|
443
|
-
assert.deepEqual(
|
|
445
|
+
const builder = discoverAgents(dir, "project").agents.find((candidate) => candidate.name === "builder");
|
|
446
|
+
assert.equal(builder?.defaultAsync, false);
|
|
447
|
+
assert.equal(builder?.defaultTimeoutMs, 90_000);
|
|
448
|
+
assert.deepEqual(builder?.defaultTurnBudget, { maxTurns: 12, graceTurns: 2 });
|
|
449
|
+
assert.deepEqual(builder?.defaultAcceptance, { level: "none", reason: "lightweight lookup" });
|
|
444
450
|
});
|
|
445
451
|
|
|
446
452
|
it("parses scalar acceptance defaults and rejects invalid policies", () => {
|
|
447
453
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-agent-acceptance-defaults-"));
|
|
448
454
|
tempDirs.push(dir);
|
|
449
|
-
const filePath = path.join(dir, ".selesai", "agents", "
|
|
455
|
+
const filePath = path.join(dir, ".selesai", "agents", "builder.md");
|
|
450
456
|
writeAgent(filePath, `---
|
|
451
|
-
name:
|
|
457
|
+
name: builder
|
|
452
458
|
description: Worker
|
|
453
459
|
acceptance: checked
|
|
454
460
|
---
|
|
455
461
|
|
|
456
462
|
Do work
|
|
457
463
|
`);
|
|
458
|
-
assert.equal(discoverAgents(dir, "project").agents.find((agent) => agent.name === "
|
|
464
|
+
assert.equal(discoverAgents(dir, "project").agents.find((agent) => agent.name === "builder")?.defaultAcceptance, "checked");
|
|
459
465
|
|
|
460
466
|
writeAgent(filePath, `---
|
|
461
|
-
name:
|
|
467
|
+
name: builder
|
|
462
468
|
description: Worker
|
|
463
469
|
acceptance: { level: "none", reason: "NA" }
|
|
464
470
|
---
|
|
@@ -466,12 +472,12 @@ acceptance: { level: "none", reason: "NA" }
|
|
|
466
472
|
Do work
|
|
467
473
|
`);
|
|
468
474
|
assert.deepEqual(
|
|
469
|
-
discoverAgents(dir, "project").agents.find((agent) => agent.name === "
|
|
475
|
+
discoverAgents(dir, "project").agents.find((agent) => agent.name === "builder")?.defaultAcceptance,
|
|
470
476
|
{ level: "none", reason: "NA" },
|
|
471
477
|
);
|
|
472
478
|
|
|
473
479
|
writeAgent(filePath, `---
|
|
474
|
-
name:
|
|
480
|
+
name: builder
|
|
475
481
|
description: Worker
|
|
476
482
|
acceptance: none
|
|
477
483
|
---
|
|
@@ -480,7 +486,7 @@ Do work
|
|
|
480
486
|
`);
|
|
481
487
|
assert.throws(
|
|
482
488
|
() => discoverAgents(dir, "project"),
|
|
483
|
-
/Agent '
|
|
489
|
+
/Agent 'builder' acceptance frontmatter level "none" requires a reason/,
|
|
484
490
|
);
|
|
485
491
|
});
|
|
486
492
|
|
|
@@ -519,8 +525,8 @@ Explore the codebase
|
|
|
519
525
|
it("rejects invalid launch defaults instead of silently ignoring them", () => {
|
|
520
526
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-agent-invalid-launch-defaults-"));
|
|
521
527
|
tempDirs.push(dir);
|
|
522
|
-
writeAgent(path.join(dir, ".selesai", "agents", "
|
|
523
|
-
name:
|
|
528
|
+
writeAgent(path.join(dir, ".selesai", "agents", "builder.md"), `---
|
|
529
|
+
name: builder
|
|
524
530
|
description: Worker
|
|
525
531
|
async: sometimes
|
|
526
532
|
---
|
|
@@ -530,7 +536,7 @@ Do work
|
|
|
530
536
|
|
|
531
537
|
assert.throws(
|
|
532
538
|
() => discoverAgents(dir, "project"),
|
|
533
|
-
/Agent '
|
|
539
|
+
/Agent 'builder' has invalid async frontmatter; expected true or false/,
|
|
534
540
|
);
|
|
535
541
|
});
|
|
536
542
|
});
|
|
@@ -546,7 +552,7 @@ name: dynamic-review
|
|
|
546
552
|
description: Markdown fallback
|
|
547
553
|
---
|
|
548
554
|
|
|
549
|
-
##
|
|
555
|
+
## explorer
|
|
550
556
|
|
|
551
557
|
Run the markdown chain
|
|
552
558
|
`, "utf-8");
|
|
@@ -555,14 +561,14 @@ Run the markdown chain
|
|
|
555
561
|
description: "JSON dynamic chain",
|
|
556
562
|
chain: [
|
|
557
563
|
{
|
|
558
|
-
agent: "
|
|
564
|
+
agent: "explorer",
|
|
559
565
|
task: "Return targets",
|
|
560
566
|
as: "targets",
|
|
561
567
|
outputSchema: { type: "object" },
|
|
562
568
|
},
|
|
563
569
|
{
|
|
564
570
|
expand: { from: { output: "targets", path: "/items" }, maxItems: 4 },
|
|
565
|
-
parallel: { agent: "
|
|
571
|
+
parallel: { agent: "commentator", task: "Review {item.path}" },
|
|
566
572
|
collect: { as: "reviews" },
|
|
567
573
|
},
|
|
568
574
|
],
|
|
@@ -588,8 +594,8 @@ describe("package-provided agents and chains", () => {
|
|
|
588
594
|
agents: ["./agents"],
|
|
589
595
|
},
|
|
590
596
|
});
|
|
591
|
-
writeAgent(path.join(workflowRoot, "agents", "
|
|
592
|
-
name:
|
|
597
|
+
writeAgent(path.join(workflowRoot, "agents", "commentator.md"), `---
|
|
598
|
+
name: commentator
|
|
593
599
|
package: my-workflow
|
|
594
600
|
description: Review changes for this workflow.
|
|
595
601
|
---
|
|
@@ -610,22 +616,22 @@ package: my-workflow
|
|
|
610
616
|
description: Run workflow review.
|
|
611
617
|
---
|
|
612
618
|
|
|
613
|
-
## my-workflow.
|
|
619
|
+
## my-workflow.commentator
|
|
614
620
|
|
|
615
621
|
Review the task.
|
|
616
622
|
`);
|
|
617
623
|
|
|
618
624
|
const all = discoverAgentsAll(dir);
|
|
619
|
-
const packagedAgent = all.package.find((agent) => agent.name === "my-workflow.
|
|
625
|
+
const packagedAgent = all.package.find((agent) => agent.name === "my-workflow.commentator");
|
|
620
626
|
assert.ok(packagedAgent);
|
|
621
627
|
assert.equal(packagedAgent.source, "package");
|
|
622
|
-
assert.equal(packagedAgent.filePath, path.join(workflowRoot, "agents", "
|
|
623
|
-
assert.equal(discoverAgents(dir, "both").agents.find((agent) => agent.name === "my-workflow.
|
|
628
|
+
assert.equal(packagedAgent.filePath, path.join(workflowRoot, "agents", "commentator.md"));
|
|
629
|
+
assert.equal(discoverAgents(dir, "both").agents.find((agent) => agent.name === "my-workflow.commentator")?.source, "package");
|
|
624
630
|
|
|
625
631
|
const packagedChain = all.chains.find((chain) => chain.name === "my-workflow.review");
|
|
626
632
|
assert.ok(packagedChain);
|
|
627
633
|
assert.equal(packagedChain.source, "package");
|
|
628
|
-
assert.equal(packagedChain.steps[0]?.agent, "my-workflow.
|
|
634
|
+
assert.equal(packagedChain.steps[0]?.agent, "my-workflow.commentator");
|
|
629
635
|
}));
|
|
630
636
|
|
|
631
637
|
it("loads packages referenced from Pi settings", () => withTempHome(() => {
|
|
@@ -643,8 +649,8 @@ Review the task.
|
|
|
643
649
|
},
|
|
644
650
|
},
|
|
645
651
|
});
|
|
646
|
-
writeAgent(path.join(packageRoot, "agents", "
|
|
647
|
-
name:
|
|
652
|
+
writeAgent(path.join(packageRoot, "agents", "architect.md"), `---
|
|
653
|
+
name: architect
|
|
648
654
|
package: settings-workflow
|
|
649
655
|
description: Plan from a settings-installed package.
|
|
650
656
|
---
|
|
@@ -652,7 +658,7 @@ description: Plan from a settings-installed package.
|
|
|
652
658
|
Plan the work.
|
|
653
659
|
`);
|
|
654
660
|
|
|
655
|
-
const agent = discoverAgents(dir, "both").agents.find((candidate) => candidate.name === "settings-workflow.
|
|
661
|
+
const agent = discoverAgents(dir, "both").agents.find((candidate) => candidate.name === "settings-workflow.architect");
|
|
656
662
|
assert.ok(agent);
|
|
657
663
|
assert.equal(agent.source, "package");
|
|
658
664
|
}));
|
|
@@ -669,8 +675,8 @@ Plan the work.
|
|
|
669
675
|
agents: ["./agents"],
|
|
670
676
|
},
|
|
671
677
|
});
|
|
672
|
-
writeAgent(path.join(packageRoot, "agents", "
|
|
673
|
-
name:
|
|
678
|
+
writeAgent(path.join(packageRoot, "agents", "commentator.md"), `---
|
|
679
|
+
name: commentator
|
|
674
680
|
package: nested-workflow
|
|
675
681
|
description: Review from a project package.
|
|
676
682
|
---
|
|
@@ -678,10 +684,10 @@ description: Review from a project package.
|
|
|
678
684
|
Review nested project work.
|
|
679
685
|
`);
|
|
680
686
|
|
|
681
|
-
const agent = discoverAgents(nested, "both").agents.find((candidate) => candidate.name === "nested-workflow.
|
|
687
|
+
const agent = discoverAgents(nested, "both").agents.find((candidate) => candidate.name === "nested-workflow.commentator");
|
|
682
688
|
assert.ok(agent);
|
|
683
689
|
assert.equal(agent.source, "package");
|
|
684
|
-
assert.equal(agent.filePath, path.join(packageRoot, "agents", "
|
|
690
|
+
assert.equal(agent.filePath, path.join(packageRoot, "agents", "commentator.md"));
|
|
685
691
|
}));
|
|
686
692
|
|
|
687
693
|
it("keeps nearest project root discovery by default when a nested .pi exists", () => withTempHome(() => {
|
|
@@ -697,8 +703,8 @@ Review nested project work.
|
|
|
697
703
|
name: "outer-workflow",
|
|
698
704
|
"pi-subagents": { agents: ["./agents"] },
|
|
699
705
|
});
|
|
700
|
-
writeAgent(path.join(packageRoot, "agents", "
|
|
701
|
-
name:
|
|
706
|
+
writeAgent(path.join(packageRoot, "agents", "architect.md"), `---
|
|
707
|
+
name: architect
|
|
702
708
|
package: outer-workflow
|
|
703
709
|
description: Plan from the outer project package.
|
|
704
710
|
---
|
|
@@ -706,7 +712,7 @@ description: Plan from the outer project package.
|
|
|
706
712
|
Plan outer project work.
|
|
707
713
|
`);
|
|
708
714
|
|
|
709
|
-
const agent = discoverAgents(nested, "both").agents.find((candidate) => candidate.name === "outer-workflow.
|
|
715
|
+
const agent = discoverAgents(nested, "both").agents.find((candidate) => candidate.name === "outer-workflow.architect");
|
|
710
716
|
assert.equal(agent, undefined);
|
|
711
717
|
}));
|
|
712
718
|
|
|
@@ -731,8 +737,8 @@ Plan outer project work.
|
|
|
731
737
|
name: "outer-workflow",
|
|
732
738
|
"pi-subagents": { agents: ["./agents"] },
|
|
733
739
|
});
|
|
734
|
-
writeAgent(path.join(packageRoot, "agents", "
|
|
735
|
-
name:
|
|
740
|
+
writeAgent(path.join(packageRoot, "agents", "architect.md"), `---
|
|
741
|
+
name: architect
|
|
736
742
|
package: outer-workflow
|
|
737
743
|
description: Plan from the outer project package.
|
|
738
744
|
---
|
|
@@ -741,10 +747,10 @@ Plan outer project work.
|
|
|
741
747
|
`);
|
|
742
748
|
|
|
743
749
|
const agents = discoverAgents(nested, "both").agents;
|
|
744
|
-
const packageAgent = agents.find((candidate) => candidate.name === "outer-workflow.
|
|
750
|
+
const packageAgent = agents.find((candidate) => candidate.name === "outer-workflow.architect");
|
|
745
751
|
assert.ok(packageAgent);
|
|
746
752
|
assert.equal(packageAgent.source, "package");
|
|
747
|
-
assert.equal(packageAgent.filePath, path.join(packageRoot, "agents", "
|
|
753
|
+
assert.equal(packageAgent.filePath, path.join(packageRoot, "agents", "architect.md"));
|
|
748
754
|
const commentator = agents.find((candidate) => candidate.name === "commentator");
|
|
749
755
|
assert.equal(commentator?.model, "openai/gpt-5.4");
|
|
750
756
|
assert.equal(commentator?.override?.path, path.join(dir, ".selesai", "settings.json"));
|
|
@@ -877,42 +883,42 @@ Ignored
|
|
|
877
883
|
chains: ["./chains"],
|
|
878
884
|
},
|
|
879
885
|
});
|
|
880
|
-
writeAgent(path.join(packageRoot, "agents", "
|
|
881
|
-
name:
|
|
882
|
-
description: Package
|
|
886
|
+
writeAgent(path.join(packageRoot, "agents", "explorer.md"), `---
|
|
887
|
+
name: explorer
|
|
888
|
+
description: Package explorer
|
|
883
889
|
---
|
|
884
890
|
|
|
885
|
-
Package
|
|
891
|
+
Package explorer.
|
|
886
892
|
`);
|
|
887
893
|
writeAgent(path.join(packageRoot, "chains", "shared.chain.md"), `---
|
|
888
894
|
name: shared
|
|
889
895
|
description: Package chain
|
|
890
896
|
---
|
|
891
897
|
|
|
892
|
-
##
|
|
898
|
+
## explorer
|
|
893
899
|
|
|
894
900
|
Package chain.
|
|
895
901
|
`);
|
|
896
|
-
writeAgent(path.join(home, ".selesai", "agent", "agents", "
|
|
897
|
-
name:
|
|
898
|
-
description: User
|
|
902
|
+
writeAgent(path.join(home, ".selesai", "agent", "agents", "explorer.md"), `---
|
|
903
|
+
name: explorer
|
|
904
|
+
description: User explorer
|
|
899
905
|
---
|
|
900
906
|
|
|
901
|
-
User
|
|
907
|
+
User explorer.
|
|
902
908
|
`);
|
|
903
|
-
writeAgent(path.join(dir, ".selesai", "agents", "
|
|
904
|
-
name:
|
|
905
|
-
description: Project
|
|
909
|
+
writeAgent(path.join(dir, ".selesai", "agents", "explorer.md"), `---
|
|
910
|
+
name: explorer
|
|
911
|
+
description: Project explorer
|
|
906
912
|
---
|
|
907
913
|
|
|
908
|
-
Project
|
|
914
|
+
Project explorer.
|
|
909
915
|
`);
|
|
910
916
|
writeAgent(path.join(home, ".selesai", "agent", "chains", "shared.chain.md"), `---
|
|
911
917
|
name: shared
|
|
912
918
|
description: User chain
|
|
913
919
|
---
|
|
914
920
|
|
|
915
|
-
##
|
|
921
|
+
## explorer
|
|
916
922
|
|
|
917
923
|
User chain.
|
|
918
924
|
`);
|
|
@@ -921,13 +927,13 @@ name: shared
|
|
|
921
927
|
description: Project chain
|
|
922
928
|
---
|
|
923
929
|
|
|
924
|
-
##
|
|
930
|
+
## explorer
|
|
925
931
|
|
|
926
932
|
Project chain.
|
|
927
933
|
`);
|
|
928
934
|
|
|
929
|
-
assert.equal(discoverAgents(dir, "user").agents.find((agent) => agent.name === "
|
|
930
|
-
assert.equal(discoverAgents(dir, "project").agents.find((agent) => agent.name === "
|
|
935
|
+
assert.equal(discoverAgents(dir, "user").agents.find((agent) => agent.name === "explorer")?.source, "user");
|
|
936
|
+
assert.equal(discoverAgents(dir, "project").agents.find((agent) => agent.name === "explorer")?.source, "project");
|
|
931
937
|
const chainByName = new Map(discoverAgentsAll(dir).chains.map((chain) => [chain.name, chain]));
|
|
932
938
|
assert.equal(chainByName.get("shared")?.source, "project");
|
|
933
939
|
}));
|
|
@@ -942,17 +948,17 @@ Project chain.
|
|
|
942
948
|
agents: ["./agents"],
|
|
943
949
|
},
|
|
944
950
|
});
|
|
945
|
-
writeAgent(path.join(packageRoot, "agents", "
|
|
946
|
-
name:
|
|
951
|
+
writeAgent(path.join(packageRoot, "agents", "commentator.md"), `---
|
|
952
|
+
name: commentator
|
|
947
953
|
package: readonly-workflow
|
|
948
|
-
description: Read-only package
|
|
954
|
+
description: Read-only package commentator.
|
|
949
955
|
---
|
|
950
956
|
|
|
951
957
|
Review only.
|
|
952
958
|
`);
|
|
953
959
|
|
|
954
960
|
const result = handleManagementAction("update", {
|
|
955
|
-
agent: "readonly-workflow.
|
|
961
|
+
agent: "readonly-workflow.commentator",
|
|
956
962
|
config: { description: "Changed" },
|
|
957
963
|
}, {
|
|
958
964
|
cwd: dir,
|
|
@@ -1023,14 +1029,14 @@ Validate changes
|
|
|
1023
1029
|
describe("agent frontmatter maxSubagentDepth", () => {
|
|
1024
1030
|
it("serializes maxSubagentDepth into agent frontmatter", () => {
|
|
1025
1031
|
const agent: AgentConfig = {
|
|
1026
|
-
name: "
|
|
1032
|
+
name: "explorer",
|
|
1027
1033
|
description: "Scout",
|
|
1028
1034
|
systemPrompt: "Inspect code",
|
|
1029
1035
|
systemPromptMode: "replace",
|
|
1030
1036
|
inheritProjectContext: false,
|
|
1031
1037
|
inheritSkills: false,
|
|
1032
1038
|
source: "project",
|
|
1033
|
-
filePath: "/tmp/
|
|
1039
|
+
filePath: "/tmp/explorer.md",
|
|
1034
1040
|
maxSubagentDepth: 1,
|
|
1035
1041
|
};
|
|
1036
1042
|
|
|
@@ -1043,8 +1049,8 @@ describe("agent frontmatter maxSubagentDepth", () => {
|
|
|
1043
1049
|
tempDirs.push(dir);
|
|
1044
1050
|
const agentsDir = path.join(dir, ".selesai", "agents");
|
|
1045
1051
|
fs.mkdirSync(agentsDir, { recursive: true });
|
|
1046
|
-
fs.writeFileSync(path.join(agentsDir, "
|
|
1047
|
-
name:
|
|
1052
|
+
fs.writeFileSync(path.join(agentsDir, "explorer.md"), `---
|
|
1053
|
+
name: explorer
|
|
1048
1054
|
description: Scout
|
|
1049
1055
|
maxSubagentDepth: 1
|
|
1050
1056
|
---
|
|
@@ -1053,8 +1059,8 @@ Inspect code
|
|
|
1053
1059
|
`, "utf-8");
|
|
1054
1060
|
|
|
1055
1061
|
const result = discoverAgents(dir, "project");
|
|
1056
|
-
const
|
|
1057
|
-
assert.equal(
|
|
1062
|
+
const explorer = result.agents.find((agent) => agent.name === "explorer");
|
|
1063
|
+
assert.equal(explorer?.maxSubagentDepth, 1);
|
|
1058
1064
|
});
|
|
1059
1065
|
});
|
|
1060
1066
|
|
|
@@ -1128,14 +1134,14 @@ Do work
|
|
|
1128
1134
|
describe("agent frontmatter fallbackModels", () => {
|
|
1129
1135
|
it("serializes fallbackModels into agent frontmatter", () => {
|
|
1130
1136
|
const agent: AgentConfig = {
|
|
1131
|
-
name: "
|
|
1137
|
+
name: "builder",
|
|
1132
1138
|
description: "Worker",
|
|
1133
1139
|
systemPrompt: "Do work",
|
|
1134
1140
|
systemPromptMode: "replace",
|
|
1135
1141
|
inheritProjectContext: false,
|
|
1136
1142
|
inheritSkills: false,
|
|
1137
1143
|
source: "project",
|
|
1138
|
-
filePath: "/tmp/
|
|
1144
|
+
filePath: "/tmp/builder.md",
|
|
1139
1145
|
fallbackModels: ["openai/gpt-5-mini", "anthropic/claude-sonnet-4"],
|
|
1140
1146
|
};
|
|
1141
1147
|
|
|
@@ -1148,8 +1154,8 @@ describe("agent frontmatter fallbackModels", () => {
|
|
|
1148
1154
|
tempDirs.push(dir);
|
|
1149
1155
|
const agentsDir = path.join(dir, ".selesai", "agents");
|
|
1150
1156
|
fs.mkdirSync(agentsDir, { recursive: true });
|
|
1151
|
-
fs.writeFileSync(path.join(agentsDir, "
|
|
1152
|
-
name:
|
|
1157
|
+
fs.writeFileSync(path.join(agentsDir, "builder.md"), `---
|
|
1158
|
+
name: builder
|
|
1153
1159
|
description: Worker
|
|
1154
1160
|
fallbackModels: openai/gpt-5-mini, anthropic/claude-sonnet-4
|
|
1155
1161
|
---
|
|
@@ -1158,22 +1164,22 @@ Do work
|
|
|
1158
1164
|
`, "utf-8");
|
|
1159
1165
|
|
|
1160
1166
|
const result = discoverAgents(dir, "project");
|
|
1161
|
-
const
|
|
1162
|
-
assert.deepEqual(
|
|
1167
|
+
const builder = result.agents.find((agent) => agent.name === "builder");
|
|
1168
|
+
assert.deepEqual(builder?.fallbackModels, ["openai/gpt-5-mini", "anthropic/claude-sonnet-4"]);
|
|
1163
1169
|
});
|
|
1164
1170
|
});
|
|
1165
1171
|
|
|
1166
1172
|
describe("agent frontmatter systemPromptMode", () => {
|
|
1167
1173
|
it("serializes systemPromptMode into agent frontmatter", () => {
|
|
1168
1174
|
const agent: AgentConfig = {
|
|
1169
|
-
name: "
|
|
1175
|
+
name: "builder",
|
|
1170
1176
|
description: "Worker",
|
|
1171
1177
|
systemPrompt: "Do work",
|
|
1172
1178
|
systemPromptMode: "replace",
|
|
1173
1179
|
inheritProjectContext: false,
|
|
1174
1180
|
inheritSkills: false,
|
|
1175
1181
|
source: "project",
|
|
1176
|
-
filePath: "/tmp/
|
|
1182
|
+
filePath: "/tmp/builder.md",
|
|
1177
1183
|
};
|
|
1178
1184
|
|
|
1179
1185
|
const serialized = serializeAgent(agent);
|
|
@@ -1185,8 +1191,8 @@ describe("agent frontmatter systemPromptMode", () => {
|
|
|
1185
1191
|
tempDirs.push(dir);
|
|
1186
1192
|
const agentsDir = path.join(dir, ".selesai", "agents");
|
|
1187
1193
|
fs.mkdirSync(agentsDir, { recursive: true });
|
|
1188
|
-
fs.writeFileSync(path.join(agentsDir, "
|
|
1189
|
-
name:
|
|
1194
|
+
fs.writeFileSync(path.join(agentsDir, "builder.md"), `---
|
|
1195
|
+
name: builder
|
|
1190
1196
|
description: Worker
|
|
1191
1197
|
systemPromptMode: replace
|
|
1192
1198
|
---
|
|
@@ -1195,22 +1201,22 @@ Do work
|
|
|
1195
1201
|
`, "utf-8");
|
|
1196
1202
|
|
|
1197
1203
|
const result = discoverAgents(dir, "project");
|
|
1198
|
-
const
|
|
1199
|
-
assert.equal(
|
|
1204
|
+
const builder = result.agents.find((agent) => agent.name === "builder");
|
|
1205
|
+
assert.equal(builder?.systemPromptMode, "replace");
|
|
1200
1206
|
});
|
|
1201
1207
|
});
|
|
1202
1208
|
|
|
1203
1209
|
describe("agent frontmatter prompt inheritance flags", () => {
|
|
1204
1210
|
it("serializes inheritProjectContext and inheritSkills into agent frontmatter", () => {
|
|
1205
1211
|
const agent: AgentConfig = {
|
|
1206
|
-
name: "
|
|
1212
|
+
name: "builder",
|
|
1207
1213
|
description: "Worker",
|
|
1208
1214
|
systemPrompt: "Do work",
|
|
1209
1215
|
systemPromptMode: "replace",
|
|
1210
1216
|
inheritProjectContext: true,
|
|
1211
1217
|
inheritSkills: true,
|
|
1212
1218
|
source: "project",
|
|
1213
|
-
filePath: "/tmp/
|
|
1219
|
+
filePath: "/tmp/builder.md",
|
|
1214
1220
|
};
|
|
1215
1221
|
|
|
1216
1222
|
const serialized = serializeAgent(agent);
|
|
@@ -1223,8 +1229,8 @@ describe("agent frontmatter prompt inheritance flags", () => {
|
|
|
1223
1229
|
tempDirs.push(dir);
|
|
1224
1230
|
const agentsDir = path.join(dir, ".selesai", "agents");
|
|
1225
1231
|
fs.mkdirSync(agentsDir, { recursive: true });
|
|
1226
|
-
fs.writeFileSync(path.join(agentsDir, "
|
|
1227
|
-
name:
|
|
1232
|
+
fs.writeFileSync(path.join(agentsDir, "builder.md"), `---
|
|
1233
|
+
name: builder
|
|
1228
1234
|
description: Worker
|
|
1229
1235
|
inheritProjectContext: true
|
|
1230
1236
|
inheritSkills: true
|
|
@@ -1234,23 +1240,23 @@ Do work
|
|
|
1234
1240
|
`, "utf-8");
|
|
1235
1241
|
|
|
1236
1242
|
const result = discoverAgents(dir, "project");
|
|
1237
|
-
const
|
|
1238
|
-
assert.equal(
|
|
1239
|
-
assert.equal(
|
|
1243
|
+
const builder = result.agents.find((agent) => agent.name === "builder");
|
|
1244
|
+
assert.equal(builder?.inheritProjectContext, true);
|
|
1245
|
+
assert.equal(builder?.inheritSkills, true);
|
|
1240
1246
|
});
|
|
1241
1247
|
});
|
|
1242
1248
|
|
|
1243
1249
|
describe("agent frontmatter subagentOnlyExtensions", () => {
|
|
1244
1250
|
it("serializes subagentOnlyExtensions into agent frontmatter", () => {
|
|
1245
1251
|
const agent: AgentConfig = {
|
|
1246
|
-
name: "
|
|
1252
|
+
name: "builder",
|
|
1247
1253
|
description: "Worker",
|
|
1248
1254
|
systemPrompt: "Do work",
|
|
1249
1255
|
systemPromptMode: "replace",
|
|
1250
1256
|
inheritProjectContext: false,
|
|
1251
1257
|
inheritSkills: false,
|
|
1252
1258
|
source: "project",
|
|
1253
|
-
filePath: "/tmp/
|
|
1259
|
+
filePath: "/tmp/builder.md",
|
|
1254
1260
|
subagentOnlyExtensions: ["./tools/child-search.ts", "/opt/pi/child-only.ts"],
|
|
1255
1261
|
};
|
|
1256
1262
|
|
|
@@ -1263,8 +1269,8 @@ describe("agent frontmatter subagentOnlyExtensions", () => {
|
|
|
1263
1269
|
tempDirs.push(dir);
|
|
1264
1270
|
const agentsDir = path.join(dir, ".selesai", "agents");
|
|
1265
1271
|
fs.mkdirSync(agentsDir, { recursive: true });
|
|
1266
|
-
fs.writeFileSync(path.join(agentsDir, "
|
|
1267
|
-
name:
|
|
1272
|
+
fs.writeFileSync(path.join(agentsDir, "builder.md"), `---
|
|
1273
|
+
name: builder
|
|
1268
1274
|
description: Worker
|
|
1269
1275
|
subagentOnlyExtensions: ./tools/child-search.ts, /opt/pi/child-only.ts
|
|
1270
1276
|
---
|
|
@@ -1273,8 +1279,8 @@ Do work
|
|
|
1273
1279
|
`, "utf-8");
|
|
1274
1280
|
|
|
1275
1281
|
const result = discoverAgents(dir, "project");
|
|
1276
|
-
const
|
|
1277
|
-
assert.deepEqual(
|
|
1282
|
+
const builder = result.agents.find((agent) => agent.name === "builder");
|
|
1283
|
+
assert.deepEqual(builder?.subagentOnlyExtensions, ["./tools/child-search.ts", "/opt/pi/child-only.ts"]);
|
|
1278
1284
|
});
|
|
1279
1285
|
});
|
|
1280
1286
|
|
|
@@ -1284,8 +1290,8 @@ describe("agent frontmatter prompt assembly defaults", () => {
|
|
|
1284
1290
|
tempDirs.push(dir);
|
|
1285
1291
|
const agentsDir = path.join(dir, ".selesai", "agents");
|
|
1286
1292
|
fs.mkdirSync(agentsDir, { recursive: true });
|
|
1287
|
-
fs.writeFileSync(path.join(agentsDir, "
|
|
1288
|
-
name:
|
|
1293
|
+
fs.writeFileSync(path.join(agentsDir, "builder.md"), `---
|
|
1294
|
+
name: builder
|
|
1289
1295
|
description: Worker
|
|
1290
1296
|
---
|
|
1291
1297
|
|
|
@@ -1293,10 +1299,10 @@ Do work
|
|
|
1293
1299
|
`, "utf-8");
|
|
1294
1300
|
|
|
1295
1301
|
const result = discoverAgents(dir, "project");
|
|
1296
|
-
const
|
|
1297
|
-
assert.equal(
|
|
1298
|
-
assert.equal(
|
|
1299
|
-
assert.equal(
|
|
1302
|
+
const builder = result.agents.find((agent) => agent.name === "builder");
|
|
1303
|
+
assert.equal(builder?.systemPromptMode, "replace");
|
|
1304
|
+
assert.equal(builder?.inheritProjectContext, false);
|
|
1305
|
+
assert.equal(builder?.inheritSkills, false);
|
|
1300
1306
|
});
|
|
1301
1307
|
|
|
1302
1308
|
it("builtin agents inherit project context by default", () => {
|
|
@@ -1312,12 +1318,12 @@ Do work
|
|
|
1312
1318
|
process.env.USERPROFILE = homeDir;
|
|
1313
1319
|
|
|
1314
1320
|
const result = discoverAgents(dir, "both");
|
|
1315
|
-
const
|
|
1316
|
-
const builder = result.agents.find((agent) => agent.name === "builder");
|
|
1321
|
+
const explorer = result.agents.find((agent) => agent.name === "explorer");
|
|
1317
1322
|
const commentator = result.agents.find((agent) => agent.name === "commentator");
|
|
1318
|
-
|
|
1319
|
-
assert.equal(
|
|
1323
|
+
const recapper = result.agents.find((agent) => agent.name === "recapper");
|
|
1324
|
+
assert.equal(explorer?.inheritProjectContext, true);
|
|
1320
1325
|
assert.equal(commentator?.inheritProjectContext, true);
|
|
1326
|
+
assert.equal(recapper?.inheritProjectContext, true);
|
|
1321
1327
|
} finally {
|
|
1322
1328
|
if (previousHome === undefined) delete process.env.HOME;
|
|
1323
1329
|
else process.env.HOME = previousHome;
|
|
@@ -1353,14 +1359,16 @@ Do work
|
|
|
1353
1359
|
it("keeps the bundled architect read-only for repository tools", () => {
|
|
1354
1360
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-builtin-architect-tools-"));
|
|
1355
1361
|
const homeDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-builtin-architect-home-"));
|
|
1356
|
-
tempDirs.push(dir
|
|
1362
|
+
tempDirs.push(dir);
|
|
1363
|
+
tempDirs.push(homeDir);
|
|
1357
1364
|
const previousHome = process.env.HOME;
|
|
1358
1365
|
const previousUserProfile = process.env.USERPROFILE;
|
|
1366
|
+
|
|
1359
1367
|
try {
|
|
1360
1368
|
process.env.HOME = homeDir;
|
|
1361
1369
|
process.env.USERPROFILE = homeDir;
|
|
1362
|
-
const architect = discoverAgentsAll(dir).builtin.find((
|
|
1363
|
-
assert.ok(architect);
|
|
1370
|
+
const architect = discoverAgentsAll(dir).builtin.find((agent) => agent.name === "architect");
|
|
1371
|
+
assert.ok(architect, "architect builtin should be discovered");
|
|
1364
1372
|
assert.deepEqual(architect.tools, ["read", "grep", "find", "ls"]);
|
|
1365
1373
|
assert.equal(architect.acceptanceRole, "read-only");
|
|
1366
1374
|
} finally {
|
|
@@ -1371,7 +1379,7 @@ Do work
|
|
|
1371
1379
|
}
|
|
1372
1380
|
});
|
|
1373
1381
|
|
|
1374
|
-
it("builder
|
|
1382
|
+
it("builder includes the child-facing supervisor tool", () => {
|
|
1375
1383
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-builtin-supervisor-tool-"));
|
|
1376
1384
|
const homeDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-builtin-supervisor-tool-home-"));
|
|
1377
1385
|
tempDirs.push(dir);
|
|
@@ -1382,10 +1390,10 @@ Do work
|
|
|
1382
1390
|
try {
|
|
1383
1391
|
process.env.HOME = homeDir;
|
|
1384
1392
|
process.env.USERPROFILE = homeDir;
|
|
1385
|
-
const
|
|
1393
|
+
const agents = discoverAgentsAll(dir).builtin;
|
|
1394
|
+
const agent = agents.find((candidate) => candidate.name === "builder");
|
|
1386
1395
|
assert.ok(agent, "builder builtin should be discovered");
|
|
1387
1396
|
assert.deepEqual(agent?.tools, ["read", "grep", "find", "ls", "bash", "edit", "write"]);
|
|
1388
|
-
assert.equal(agent?.tools?.includes("contact_supervisor"), false);
|
|
1389
1397
|
} finally {
|
|
1390
1398
|
if (previousHome === undefined) delete process.env.HOME;
|
|
1391
1399
|
else process.env.HOME = previousHome;
|
|
@@ -1394,36 +1402,13 @@ Do work
|
|
|
1394
1402
|
}
|
|
1395
1403
|
});
|
|
1396
1404
|
|
|
1397
|
-
it("
|
|
1398
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-
|
|
1399
|
-
const homeDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-builtin-researcher-tools-home-"));
|
|
1400
|
-
tempDirs.push(dir);
|
|
1401
|
-
tempDirs.push(homeDir);
|
|
1402
|
-
const previousHome = process.env.HOME;
|
|
1403
|
-
const previousUserProfile = process.env.USERPROFILE;
|
|
1404
|
-
|
|
1405
|
-
try {
|
|
1406
|
-
process.env.HOME = homeDir;
|
|
1407
|
-
process.env.USERPROFILE = homeDir;
|
|
1408
|
-
const agent = discoverAgentsAll(dir).builtin.find((candidate) => candidate.name === "researcher");
|
|
1409
|
-
assert.ok(agent, "researcher builtin should be discovered");
|
|
1410
|
-
assert.deepEqual(agent?.tools, ["read", "web_explore"]);
|
|
1411
|
-
assert.deepEqual(agent?.mcpDirectTools, ["grep_app_search", "grep_app_fetch"]);
|
|
1412
|
-
} finally {
|
|
1413
|
-
if (previousHome === undefined) delete process.env.HOME;
|
|
1414
|
-
else process.env.HOME = previousHome;
|
|
1415
|
-
if (previousUserProfile === undefined) delete process.env.USERPROFILE;
|
|
1416
|
-
else process.env.USERPROFILE = previousUserProfile;
|
|
1417
|
-
}
|
|
1418
|
-
});
|
|
1419
|
-
|
|
1420
|
-
it("defaults delegate to append mode with inherited project context", () => {
|
|
1421
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-agent-delegate-default-prompt-settings-"));
|
|
1405
|
+
it("defaults recapper to replace mode with inherited project context", () => {
|
|
1406
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-agent-recapper-default-prompt-settings-"));
|
|
1422
1407
|
tempDirs.push(dir);
|
|
1423
1408
|
const agentsDir = path.join(dir, ".selesai", "agents");
|
|
1424
1409
|
fs.mkdirSync(agentsDir, { recursive: true });
|
|
1425
|
-
fs.writeFileSync(path.join(agentsDir, "
|
|
1426
|
-
name:
|
|
1410
|
+
fs.writeFileSync(path.join(agentsDir, "recapper.md"), `---
|
|
1411
|
+
name: recapper
|
|
1427
1412
|
description: Delegate
|
|
1428
1413
|
---
|
|
1429
1414
|
|
|
@@ -1431,10 +1416,10 @@ Do work
|
|
|
1431
1416
|
`, "utf-8");
|
|
1432
1417
|
|
|
1433
1418
|
const result = discoverAgents(dir, "project");
|
|
1434
|
-
const
|
|
1435
|
-
assert.equal(
|
|
1436
|
-
assert.equal(
|
|
1437
|
-
assert.equal(
|
|
1419
|
+
const recapper = result.agents.find((agent) => agent.name === "recapper");
|
|
1420
|
+
assert.equal(recapper?.systemPromptMode, "replace");
|
|
1421
|
+
assert.equal(recapper?.inheritProjectContext, false);
|
|
1422
|
+
assert.equal(recapper?.inheritSkills, false);
|
|
1438
1423
|
});
|
|
1439
1424
|
});
|
|
1440
1425
|
|
|
@@ -1446,9 +1431,9 @@ describe("packaged agent and chain discovery", () => {
|
|
|
1446
1431
|
const nestedChainDir = path.join(dir, ".selesai", "chains", "code-analysis", "deep");
|
|
1447
1432
|
fs.mkdirSync(nestedDir, { recursive: true });
|
|
1448
1433
|
fs.mkdirSync(nestedChainDir, { recursive: true });
|
|
1449
|
-
fs.writeFileSync(path.join(nestedDir, "
|
|
1450
|
-
name:
|
|
1451
|
-
description: Nested
|
|
1434
|
+
fs.writeFileSync(path.join(nestedDir, "explorer.md"), `---
|
|
1435
|
+
name: explorer
|
|
1436
|
+
description: Nested explorer
|
|
1452
1437
|
---
|
|
1453
1438
|
|
|
1454
1439
|
Inspect code
|
|
@@ -1458,13 +1443,13 @@ name: review-flow
|
|
|
1458
1443
|
description: Review flow
|
|
1459
1444
|
---
|
|
1460
1445
|
|
|
1461
|
-
##
|
|
1446
|
+
## explorer
|
|
1462
1447
|
|
|
1463
1448
|
Review
|
|
1464
1449
|
`, "utf-8");
|
|
1465
1450
|
|
|
1466
1451
|
const result = discoverAgentsAll(dir);
|
|
1467
|
-
assert.ok(result.project.find((agent) => agent.name === "
|
|
1452
|
+
assert.ok(result.project.find((agent) => agent.name === "explorer" && agent.filePath === path.join(nestedDir, "explorer.md")));
|
|
1468
1453
|
assert.ok(result.chains.find((chain) => chain.name === "review-flow" && chain.filePath === path.join(nestedChainDir, "review.chain.md")));
|
|
1469
1454
|
assert.equal(result.project.some((agent) => agent.filePath.endsWith("review.chain.md")), false);
|
|
1470
1455
|
});
|
|
@@ -1474,8 +1459,8 @@ Review
|
|
|
1474
1459
|
tempDirs.push(dir);
|
|
1475
1460
|
const agentsDir = path.join(dir, ".selesai", "agents");
|
|
1476
1461
|
fs.mkdirSync(agentsDir, { recursive: true });
|
|
1477
|
-
fs.writeFileSync(path.join(agentsDir, "
|
|
1478
|
-
name:
|
|
1462
|
+
fs.writeFileSync(path.join(agentsDir, "explorer.md"), `---
|
|
1463
|
+
name: explorer
|
|
1479
1464
|
package: code-analysis
|
|
1480
1465
|
description: Fast recon
|
|
1481
1466
|
---
|
|
@@ -1483,14 +1468,14 @@ description: Fast recon
|
|
|
1483
1468
|
Inspect code
|
|
1484
1469
|
`, "utf-8");
|
|
1485
1470
|
|
|
1486
|
-
const
|
|
1487
|
-
assert.ok(
|
|
1488
|
-
assert.equal(
|
|
1489
|
-
assert.equal(
|
|
1490
|
-
const serialized = serializeAgent(
|
|
1491
|
-
assert.match(serialized, /^name:
|
|
1471
|
+
const explorer = discoverAgents(dir, "project").agents.find((agent) => agent.name === "code-analysis.explorer");
|
|
1472
|
+
assert.ok(explorer);
|
|
1473
|
+
assert.equal(explorer.localName, "explorer");
|
|
1474
|
+
assert.equal(explorer.packageName, "code-analysis");
|
|
1475
|
+
const serialized = serializeAgent(explorer);
|
|
1476
|
+
assert.match(serialized, /^name: explorer$/m);
|
|
1492
1477
|
assert.match(serialized, /^package: code-analysis$/m);
|
|
1493
|
-
assert.doesNotMatch(serialized, /^name: code-analysis\.
|
|
1478
|
+
assert.doesNotMatch(serialized, /^name: code-analysis\.explorer$/m);
|
|
1494
1479
|
});
|
|
1495
1480
|
|
|
1496
1481
|
it("recursively discovers packaged chains by runtime name and preserves package on serialize", () => {
|
|
@@ -1504,7 +1489,7 @@ package: code-analysis
|
|
|
1504
1489
|
description: Review flow
|
|
1505
1490
|
---
|
|
1506
1491
|
|
|
1507
|
-
## code-analysis.
|
|
1492
|
+
## code-analysis.explorer
|
|
1508
1493
|
|
|
1509
1494
|
Inspect {task}
|
|
1510
1495
|
`;
|
|
@@ -1514,11 +1499,11 @@ Inspect {task}
|
|
|
1514
1499
|
assert.ok(chain);
|
|
1515
1500
|
assert.equal(chain.localName, "review-flow");
|
|
1516
1501
|
assert.equal(chain.packageName, "code-analysis");
|
|
1517
|
-
assert.equal(chain.steps[0]?.agent, "code-analysis.
|
|
1502
|
+
assert.equal(chain.steps[0]?.agent, "code-analysis.explorer");
|
|
1518
1503
|
const serialized = serializeChain(chain);
|
|
1519
1504
|
assert.match(serialized, /^name: review-flow$/m);
|
|
1520
1505
|
assert.match(serialized, /^package: code-analysis$/m);
|
|
1521
|
-
assert.match(serialized, /^## code-analysis\.
|
|
1506
|
+
assert.match(serialized, /^## code-analysis\.explorer$/m);
|
|
1522
1507
|
assert.doesNotMatch(serialized, /^name: code-analysis\.review-flow$/m);
|
|
1523
1508
|
});
|
|
1524
1509
|
|
|
@@ -1527,35 +1512,35 @@ Inspect {task}
|
|
|
1527
1512
|
tempDirs.push(dir);
|
|
1528
1513
|
fs.mkdirSync(path.join(dir, ".agents"), { recursive: true });
|
|
1529
1514
|
fs.mkdirSync(path.join(dir, ".selesai", "agents"), { recursive: true });
|
|
1530
|
-
fs.writeFileSync(path.join(dir, ".agents", "
|
|
1531
|
-
name:
|
|
1532
|
-
description: Legacy
|
|
1515
|
+
fs.writeFileSync(path.join(dir, ".agents", "explorer.md"), `---
|
|
1516
|
+
name: explorer
|
|
1517
|
+
description: Legacy explorer
|
|
1533
1518
|
---
|
|
1534
1519
|
|
|
1535
1520
|
Legacy
|
|
1536
1521
|
`, "utf-8");
|
|
1537
|
-
fs.writeFileSync(path.join(dir, ".selesai", "agents", "
|
|
1538
|
-
name:
|
|
1539
|
-
description: Project
|
|
1522
|
+
fs.writeFileSync(path.join(dir, ".selesai", "agents", "explorer.md"), `---
|
|
1523
|
+
name: explorer
|
|
1524
|
+
description: Project explorer
|
|
1540
1525
|
---
|
|
1541
1526
|
|
|
1542
1527
|
Project
|
|
1543
1528
|
`, "utf-8");
|
|
1544
1529
|
fs.writeFileSync(path.join(dir, ".selesai", "agents", "packaged.md"), `---
|
|
1545
|
-
name:
|
|
1530
|
+
name: explorer
|
|
1546
1531
|
package: code-analysis
|
|
1547
|
-
description: Packaged
|
|
1532
|
+
description: Packaged explorer
|
|
1548
1533
|
---
|
|
1549
1534
|
|
|
1550
1535
|
Packaged
|
|
1551
1536
|
`, "utf-8");
|
|
1552
1537
|
|
|
1553
1538
|
const agents = discoverAgents(dir, "project").agents;
|
|
1554
|
-
const unqualified = agents.find((agent) => agent.name === "
|
|
1555
|
-
const packaged = agents.find((agent) => agent.name === "code-analysis.
|
|
1556
|
-
assert.equal(unqualified?.description, "Project
|
|
1557
|
-
assert.equal(unqualified?.filePath, path.join(dir, ".selesai", "agents", "
|
|
1558
|
-
assert.equal(packaged?.description, "Packaged
|
|
1539
|
+
const unqualified = agents.find((agent) => agent.name === "explorer");
|
|
1540
|
+
const packaged = agents.find((agent) => agent.name === "code-analysis.explorer");
|
|
1541
|
+
assert.equal(unqualified?.description, "Project explorer");
|
|
1542
|
+
assert.equal(unqualified?.filePath, path.join(dir, ".selesai", "agents", "explorer.md"));
|
|
1543
|
+
assert.equal(packaged?.description, "Packaged explorer");
|
|
1559
1544
|
});
|
|
1560
1545
|
|
|
1561
1546
|
it("parses packaged chains directly from serializer helpers", () => {
|
|
@@ -1565,7 +1550,7 @@ package: code-analysis
|
|
|
1565
1550
|
description: Review flow
|
|
1566
1551
|
---
|
|
1567
1552
|
|
|
1568
|
-
## code-analysis.
|
|
1553
|
+
## code-analysis.explorer
|
|
1569
1554
|
|
|
1570
1555
|
Inspect
|
|
1571
1556
|
`, "project", "/tmp/review.chain.md");
|
|
@@ -1583,8 +1568,8 @@ Inspect
|
|
|
1583
1568
|
const chainsDir = path.join(dir, ".selesai", "chains");
|
|
1584
1569
|
fs.mkdirSync(agentsDir, { recursive: true });
|
|
1585
1570
|
fs.mkdirSync(chainsDir, { recursive: true });
|
|
1586
|
-
fs.writeFileSync(path.join(agentsDir, "
|
|
1587
|
-
name:
|
|
1571
|
+
fs.writeFileSync(path.join(agentsDir, "explorer.md"), `---
|
|
1572
|
+
name: explorer
|
|
1588
1573
|
package: Code Analysis!
|
|
1589
1574
|
description: Fast recon
|
|
1590
1575
|
---
|
|
@@ -1597,13 +1582,13 @@ package: Code Analysis!
|
|
|
1597
1582
|
description: Review flow
|
|
1598
1583
|
---
|
|
1599
1584
|
|
|
1600
|
-
## code-analysis.
|
|
1585
|
+
## code-analysis.explorer
|
|
1601
1586
|
|
|
1602
1587
|
Review
|
|
1603
1588
|
`, "utf-8");
|
|
1604
1589
|
|
|
1605
1590
|
const result = discoverAgentsAll(dir);
|
|
1606
|
-
assert.ok(result.project.find((agent) => agent.name === "code-analysis.
|
|
1591
|
+
assert.ok(result.project.find((agent) => agent.name === "code-analysis.explorer"));
|
|
1607
1592
|
assert.ok(result.chains.find((chain) => chain.name === "code-analysis.review-flow"));
|
|
1608
1593
|
});
|
|
1609
1594
|
|
|
@@ -1614,8 +1599,8 @@ Review
|
|
|
1614
1599
|
const chainsDir = path.join(dir, ".selesai", "chains");
|
|
1615
1600
|
fs.mkdirSync(agentsDir, { recursive: true });
|
|
1616
1601
|
fs.mkdirSync(chainsDir, { recursive: true });
|
|
1617
|
-
fs.writeFileSync(path.join(agentsDir, "
|
|
1618
|
-
name:
|
|
1602
|
+
fs.writeFileSync(path.join(agentsDir, "explorer.md"), `---
|
|
1603
|
+
name: explorer
|
|
1619
1604
|
package: !!!
|
|
1620
1605
|
description: Fast recon
|
|
1621
1606
|
---
|
|
@@ -1628,13 +1613,13 @@ package: !!!
|
|
|
1628
1613
|
description: Review flow
|
|
1629
1614
|
---
|
|
1630
1615
|
|
|
1631
|
-
##
|
|
1616
|
+
## explorer
|
|
1632
1617
|
|
|
1633
1618
|
Review
|
|
1634
1619
|
`, "utf-8");
|
|
1635
1620
|
|
|
1636
1621
|
const result = discoverAgentsAll(dir);
|
|
1637
|
-
assert.equal(result.project.some((agent) => agent.filePath.endsWith("
|
|
1622
|
+
assert.equal(result.project.some((agent) => agent.filePath.endsWith("explorer.md")), false);
|
|
1638
1623
|
assert.equal(result.chains.some((chain) => chain.filePath.endsWith("review.chain.md")), false);
|
|
1639
1624
|
});
|
|
1640
1625
|
});
|
|
@@ -1778,7 +1763,7 @@ name: ignored-chain
|
|
|
1778
1763
|
description: Ignored chain
|
|
1779
1764
|
---
|
|
1780
1765
|
|
|
1781
|
-
##
|
|
1766
|
+
## explorer
|
|
1782
1767
|
|
|
1783
1768
|
Ignore
|
|
1784
1769
|
`, "utf-8");
|
|
@@ -1787,7 +1772,7 @@ name: canonical-chain
|
|
|
1787
1772
|
description: Canonical chain
|
|
1788
1773
|
---
|
|
1789
1774
|
|
|
1790
|
-
##
|
|
1775
|
+
## builder
|
|
1791
1776
|
|
|
1792
1777
|
Inspect canonical
|
|
1793
1778
|
`, "utf-8");
|
|
@@ -1816,7 +1801,7 @@ name: shared-chain
|
|
|
1816
1801
|
description: User chain
|
|
1817
1802
|
---
|
|
1818
1803
|
|
|
1819
|
-
##
|
|
1804
|
+
## explorer
|
|
1820
1805
|
|
|
1821
1806
|
Inspect user
|
|
1822
1807
|
`, "utf-8");
|
|
@@ -1825,7 +1810,7 @@ name: shared-chain
|
|
|
1825
1810
|
description: Project chain
|
|
1826
1811
|
---
|
|
1827
1812
|
|
|
1828
|
-
##
|
|
1813
|
+
## builder
|
|
1829
1814
|
|
|
1830
1815
|
Inspect project
|
|
1831
1816
|
`, "utf-8");
|
|
@@ -1838,7 +1823,7 @@ Inspect project
|
|
|
1838
1823
|
assert.ok(shared);
|
|
1839
1824
|
assert.equal(shared.filePath, path.join(dir, ".selesai", "chains", "shared.chain.md"));
|
|
1840
1825
|
assert.equal(shared.description, "Project chain");
|
|
1841
|
-
assert.equal(shared.steps[0]?.agent, "
|
|
1826
|
+
assert.equal(shared.steps[0]?.agent, "builder");
|
|
1842
1827
|
assert.equal(shared.steps[0]?.task, "Inspect project");
|
|
1843
1828
|
} finally {
|
|
1844
1829
|
if (oldHome === undefined) delete process.env.HOME;
|