@selesai/code 0.13.15 → 0.13.18
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 +37 -0
- package/README.md +2 -14
- package/dist/bun/cli.d.ts +3 -1
- package/dist/bun/cli.js +3 -9
- package/dist/bun/{register-bedrock.js → runtime-setup.js} +5 -0
- package/dist/bun/sandbox-env-setup.d.ts +1 -0
- package/dist/bun/sandbox-env-setup.js +3 -0
- package/dist/cli/auth-command.d.ts +23 -0
- package/dist/cli/auth-command.js +102 -0
- package/dist/cli/config-selector.js +2 -1
- package/dist/cli/setup.d.ts +1 -0
- package/dist/cli/setup.js +11 -0
- package/dist/cli.js +2 -14
- package/dist/config.d.ts +3 -2
- package/dist/config.js +9 -4
- package/dist/core/agent-session-runtime.js +15 -7
- package/dist/core/agent-session.d.ts +2 -6
- package/dist/core/agent-session.js +15 -4
- package/dist/core/compaction/branch-summarization.d.ts +1 -1
- package/dist/core/compaction/branch-summarization.js +2 -1
- package/dist/core/extensions/loader.js +3 -0
- package/dist/core/extensions/types.d.ts +16 -2
- package/dist/core/http-dispatcher.js +2 -0
- package/dist/core/keybindings.d.ts +5 -0
- package/dist/core/keybindings.js +4 -0
- package/dist/core/messages.d.ts +1 -1
- package/dist/core/model-config.d.ts +15 -0
- package/dist/core/model-config.js +3 -0
- package/dist/core/model-runtime.d.ts +1 -0
- package/dist/core/model-runtime.js +5 -2
- package/dist/core/provider-composer.js +8 -2
- package/dist/core/session-export.d.ts +3 -0
- package/dist/core/session-export.js +31 -0
- package/dist/core/session-manager.d.ts +3 -2
- package/dist/core/session-manager.js +40 -13
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.js +4 -2
- package/dist/core/system-prompt.js +10 -10
- package/dist/core/tools/bash.js +3 -117
- package/dist/core/tools/edit.d.ts +1 -12
- package/dist/core/tools/edit.js +5 -163
- package/dist/core/tools/find.js +4 -55
- package/dist/core/tools/grep.js +4 -60
- package/dist/core/tools/ls.js +4 -49
- package/dist/core/tools/read.d.ts +4 -0
- package/dist/core/tools/read.js +10 -122
- package/dist/core/tools/renderers/bash.d.ts +11 -0
- package/dist/core/tools/renderers/bash.js +129 -0
- package/dist/core/tools/renderers/edit.d.ts +22 -0
- package/dist/core/tools/renderers/edit.js +166 -0
- package/dist/core/tools/renderers/find.d.ts +9 -0
- package/dist/core/tools/renderers/find.js +63 -0
- package/dist/core/tools/renderers/grep.d.ts +9 -0
- package/dist/core/tools/renderers/grep.js +68 -0
- package/dist/core/tools/renderers/index.d.ts +27 -0
- package/dist/core/tools/renderers/index.js +46 -0
- package/dist/core/tools/renderers/ls.d.ts +9 -0
- package/dist/core/tools/renderers/ls.js +57 -0
- package/dist/core/tools/renderers/read.d.ts +10 -0
- package/dist/core/tools/renderers/read.js +128 -0
- package/dist/core/tools/renderers/write.d.ts +9 -0
- package/dist/core/tools/renderers/write.js +152 -0
- package/dist/core/tools/write.js +5 -146
- package/dist/extensions/capability-gateway/index.ts +12 -1
- package/dist/extensions/capability-gateway/integration.test.ts +23 -0
- package/dist/extensions/pi-hermes-memory/CHANGELOG.md +18 -0
- package/dist/extensions/pi-hermes-memory/README.md +16 -12
- package/dist/extensions/pi-hermes-memory/docs/ROADMAP.md +1 -1
- package/dist/extensions/pi-hermes-memory/package-lock.json +587 -62
- package/dist/extensions/pi-hermes-memory/package.json +4 -4
- package/dist/extensions/pi-hermes-memory/src/config.ts +32 -0
- package/dist/extensions/pi-hermes-memory/src/constants.ts +12 -2
- package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +109 -51
- package/dist/extensions/pi-hermes-memory/src/handlers/index-sessions.ts +9 -3
- package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +257 -98
- package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +9 -2
- package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +5 -0
- package/dist/extensions/pi-hermes-memory/src/index.ts +22 -2
- package/dist/extensions/pi-hermes-memory/src/paths.ts +1 -1
- package/dist/extensions/pi-hermes-memory/src/store/db.ts +6 -0
- package/dist/extensions/pi-hermes-memory/src/store/fts-query.ts +58 -1
- package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +60 -8
- package/dist/extensions/pi-hermes-memory/src/store/session-indexer.ts +169 -7
- package/dist/extensions/pi-hermes-memory/src/store/session-search.ts +7 -21
- package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +134 -15
- package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +4 -2
- package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +24 -9
- package/dist/extensions/pi-hermes-memory/src/types.ts +11 -0
- package/dist/extensions/pi-hermes-memory/tests/config.test.ts +42 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/background-review.test.ts +159 -3
- package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +452 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +39 -0
- package/dist/extensions/pi-hermes-memory/tests/integration/corruption-recovery-integration.test.ts +91 -0
- package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +29 -0
- package/dist/extensions/pi-hermes-memory/tests/store/fts-query.test.ts +116 -0
- package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +163 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-indexer.test.ts +233 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-search.test.ts +12 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +175 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-native.test.ts +2 -2
- package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +22 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/memory-tool.test.ts +37 -1
- package/dist/extensions/pi-intercom/CHANGELOG.md +13 -0
- package/dist/extensions/pi-intercom/README.md +16 -2
- package/dist/extensions/pi-intercom/broker/spawn.test.ts +19 -2
- package/dist/extensions/pi-intercom/broker/spawn.ts +4 -4
- package/dist/extensions/pi-intercom/index.ts +1 -1
- package/dist/extensions/pi-intercom/intercom.integration.test.ts +121 -2
- package/dist/extensions/pi-intercom/package.json +1 -1
- package/dist/extensions/pi-intercom/project-agent.test.ts +1 -1
- package/dist/extensions/pi-intercom/project-agent.ts +1 -6
- package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +7 -6
- package/dist/extensions/pi-rewind-hook/index.test.ts +7 -0
- package/dist/extensions/pi-subagents/.github/workflows/test.yml +36 -4
- package/dist/extensions/pi-subagents/CHANGELOG.md +120 -0
- package/dist/extensions/pi-subagents/README.md +3 -3
- package/dist/extensions/pi-subagents/agents/researcher.md +23 -13
- package/dist/extensions/pi-subagents/agents/reviewer.md +1 -1
- package/dist/extensions/pi-subagents/agents/scout.md +1 -1
- package/dist/extensions/pi-subagents/docs/agents.md +32 -16
- package/dist/extensions/pi-subagents/docs/configuration.md +41 -15
- package/dist/extensions/pi-subagents/docs/extension-api.md +109 -6
- package/dist/extensions/pi-subagents/docs/missions.md +2 -0
- package/dist/extensions/pi-subagents/docs/models.md +58 -1
- package/dist/extensions/pi-subagents/docs/observability.md +50 -12
- package/dist/extensions/pi-subagents/docs/tool-reference.md +17 -10
- package/dist/extensions/pi-subagents/docs/watchdog.md +1 -1
- package/dist/extensions/pi-subagents/docs/workflows.md +26 -9
- package/dist/extensions/pi-subagents/package-lock.json +747 -177
- package/dist/extensions/pi-subagents/package.json +6 -4
- package/dist/extensions/pi-subagents/runner-server-preload.mjs +13 -0
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +2 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +1 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +21 -4
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +2 -0
- package/dist/extensions/pi-subagents/src/agents/advertised-agent-prompt.ts +63 -0
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +61 -16
- package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +2 -0
- package/dist/extensions/pi-subagents/src/agents/agents.ts +8 -0
- package/dist/extensions/pi-subagents/src/api/capability-ceiling.ts +0 -1
- package/dist/extensions/pi-subagents/src/api/{pi-args.ts → child-tool-plan.ts} +1 -1
- package/dist/extensions/pi-subagents/src/api/preflight.ts +7 -4
- package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -2
- package/dist/extensions/pi-subagents/src/api/workflow-resources.ts +6 -0
- package/dist/extensions/pi-subagents/src/extension/config.ts +4 -2
- package/dist/extensions/pi-subagents/src/extension/doctor.ts +2 -10
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +9 -11
- package/dist/extensions/pi-subagents/src/extension/index.ts +99 -10
- package/dist/extensions/pi-subagents/src/extension/public-execution.ts +13 -0
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +7 -23
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +11 -8
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +25 -7
- package/dist/extensions/pi-subagents/src/integrations/pi-web-session-liveness.ts +73 -0
- package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +228 -136
- package/dist/extensions/pi-subagents/src/intercom/supervisor-ui.ts +244 -0
- package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +37 -16
- package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +18 -18
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +51 -25
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +46 -3
- package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +14 -3
- package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +9 -0
- package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +10 -12
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -15
- package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +40 -29
- package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +8 -0
- package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +79 -247
- package/dist/extensions/pi-subagents/src/runs/background/notify.ts +88 -12
- package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +6 -6
- package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +24 -24
- package/dist/extensions/pi-subagents/src/runs/background/retained-nested-route-tracker.ts +96 -0
- package/dist/extensions/pi-subagents/src/runs/background/run-child-session.ts +642 -0
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +75 -6
- package/dist/extensions/pi-subagents/src/runs/background/runner-aliases.ts +163 -0
- package/dist/extensions/pi-subagents/src/runs/background/runner-child-launch.ts +86 -0
- package/dist/extensions/pi-subagents/src/runs/background/runner-child-sessions.ts +31 -0
- package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +18 -4
- package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +3 -1
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +597 -1092
- package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +3 -0
- package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +4 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +20 -17
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +296 -394
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +4 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +3 -1
- package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +9 -5
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +630 -283
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +8 -5
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +78 -98
- package/dist/extensions/pi-subagents/src/runs/shared/abort-recovery.ts +3 -3
- package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +16 -3
- package/dist/extensions/pi-subagents/src/runs/shared/agent-contract.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +47 -47
- package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +1 -2
- package/dist/extensions/pi-subagents/src/runs/shared/child-hooks.ts +174 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +14 -3
- package/dist/extensions/pi-subagents/src/runs/shared/child-launch.ts +319 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-lifecycle.ts +25 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-runtime-config.ts +126 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-session.ts +373 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-tool-plan.ts +530 -0
- package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +2 -2
- package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +2 -1
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +16 -0
- package/dist/extensions/pi-subagents/src/runs/shared/host-step-status.ts +11 -11
- package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +30 -20
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +5 -4
- package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +84 -15
- package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +88 -12
- package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +37 -53
- package/dist/extensions/pi-subagents/src/runs/shared/nested-path.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +18 -7
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +57 -12
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +3 -4
- package/dist/extensions/pi-subagents/src/runs/shared/permissions.ts +0 -11
- package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +4 -1
- package/dist/extensions/pi-subagents/src/runs/shared/readonly-drain-observation.ts +42 -0
- package/dist/extensions/pi-subagents/src/runs/shared/readonly-model-continuation.ts +69 -0
- package/dist/extensions/pi-subagents/src/runs/shared/readonly-session-evidence.ts +307 -0
- package/dist/extensions/pi-subagents/src/runs/shared/run-fanout-budget.ts +8 -21
- package/dist/extensions/pi-subagents/src/runs/shared/runtime-acknowledged-extensions.ts +3 -30
- package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +17 -4
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +2 -0
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +99 -386
- package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +18 -62
- package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +0 -14
- package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +31 -9
- package/dist/extensions/pi-subagents/src/runs/shared/worktree-setup-command.ts +190 -0
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +506 -226
- package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +1 -1
- package/dist/extensions/pi-subagents/src/shared/jsonl-writer.ts +11 -0
- package/dist/extensions/pi-subagents/src/shared/model-response-aliases.ts +13 -0
- package/dist/extensions/pi-subagents/src/shared/thinking-ceiling.ts +0 -6
- package/dist/extensions/pi-subagents/src/shared/types.ts +145 -89
- package/dist/extensions/pi-subagents/src/shared/utils.ts +13 -6
- package/dist/extensions/pi-subagents/src/shared/watch-strategy.ts +2 -0
- package/dist/extensions/pi-subagents/src/shared/workflow-child-permit.ts +18 -13
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +0 -6
- package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +1 -1
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +11 -6
- package/dist/extensions/pi-subagents/src/tui/render.ts +277 -46
- package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +0 -1
- package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +12 -12
- package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +3 -3
- package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +116 -15
- package/dist/extensions/pi-subagents/src/workflows/workflow-checklist.ts +15 -18
- package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +57 -8
- package/dist/extensions/pi-subagents/src/workflows/workflow-preflight.ts +19 -19
- package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +3 -3
- package/dist/extensions/pi-subagents/src/workflows/workflow-resources.ts +97 -22
- package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +3 -0
- package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +336 -21
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-1.test.ts +1181 -0
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-2.test.ts +2240 -0
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-3.test.ts +2268 -0
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-4.test.ts +1512 -0
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +231 -16
- package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +4 -18
- package/dist/extensions/pi-subagents/test/integration/foreign-workflow-steering.test.ts +95 -0
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +9 -15
- package/dist/extensions/pi-subagents/test/integration/in-process-child.test.ts +374 -0
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +20 -10
- package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +18 -6
- package/dist/extensions/pi-subagents/test/integration/recovered-assistant-error.test.ts +151 -0
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +42 -1
- package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +150 -25
- package/dist/extensions/pi-subagents/test/integration/result-publication.test.ts +354 -0
- package/dist/extensions/pi-subagents/test/integration/shared-cwd-terminal-evidence.test.ts +117 -0
- package/dist/extensions/pi-subagents/test/integration/single-execution.part-1.test.ts +3678 -0
- package/dist/extensions/pi-subagents/test/integration/{single-execution.test.ts → single-execution.part-2.test.ts} +500 -4207
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +1 -2
- package/dist/extensions/pi-subagents/test/integration/workflow-result-publication.test.ts +127 -0
- package/dist/extensions/pi-subagents/test/integration/workflow-steer-inbox.test.ts +365 -0
- package/dist/extensions/pi-subagents/test/smoke/pi085-child.ts +31 -0
- package/dist/extensions/pi-subagents/test/smoke/pi085-clean-install.mjs +74 -0
- package/dist/extensions/pi-subagents/test/smoke/pi085-extension.ts +16 -0
- package/dist/extensions/pi-subagents/test/support/async-execution-fixture.ts +699 -0
- package/dist/extensions/pi-subagents/test/support/fake-child-session.ts +418 -0
- package/dist/extensions/pi-subagents/test/support/foreign-workflow-steer-host.mjs +13 -0
- package/dist/extensions/pi-subagents/test/support/mock-pi.ts +30 -76
- package/dist/extensions/pi-subagents/test/support/notify-diagnostics-fixture.ts +84 -0
- package/dist/extensions/pi-subagents/test/support/result-publication-capacity-preload.mjs +70 -0
- package/dist/extensions/pi-subagents/test/support/runner-child-session-factory.ts +17 -0
- package/dist/extensions/pi-subagents/test/support/single-execution-fixture.ts +390 -0
- package/dist/extensions/pi-subagents/test/unit/acceptance-compaction.test.ts +120 -0
- package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +24 -3
- package/dist/extensions/pi-subagents/test/unit/advertised-agent-prompt.test.ts +87 -0
- package/dist/extensions/pi-subagents/test/unit/advertised-agent-refresh.test.ts +163 -0
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +70 -31
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +78 -3
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +2 -8
- package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +73 -66
- package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +51 -1
- package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +49 -1
- package/dist/extensions/pi-subagents/test/unit/async-spawn-preload.test.ts +103 -0
- package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +9 -8
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +10 -7
- package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +48 -6
- package/dist/extensions/pi-subagents/test/unit/child-runtime-config.test.ts +90 -0
- package/dist/extensions/pi-subagents/test/unit/{pi-args-permission-system.test.ts → child-tool-plan-permission-system.test.ts} +48 -86
- package/dist/extensions/pi-subagents/test/unit/child-tool-plan.test.ts +33 -0
- package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +18 -18
- package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +8 -7
- package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +225 -65
- package/dist/extensions/pi-subagents/test/unit/extension-bindings.test.ts +17 -22
- package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +11 -1
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +47 -3
- package/dist/extensions/pi-subagents/test/unit/foreign-workflow-steering.test.ts +74 -0
- package/dist/extensions/pi-subagents/test/unit/fork-cache-key.test.ts +23 -29
- package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +96 -4
- package/dist/extensions/pi-subagents/test/unit/host-step-status.test.ts +4 -4
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +116 -55
- package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +58 -1
- package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +104 -3
- package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +10 -1
- package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +31 -1
- package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +102 -51
- package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +196 -6
- package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +181 -38
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +62 -70
- package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +58 -53
- package/dist/extensions/pi-subagents/test/unit/notify-diagnostics.test.ts +42 -0
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +84 -0
- package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +13 -5
- package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +21 -5
- package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +5 -4
- package/dist/extensions/pi-subagents/test/unit/permissions.test.ts +2 -6
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +28 -2
- package/dist/extensions/pi-subagents/test/unit/pi-web-session-liveness.test.ts +209 -0
- package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +38 -1
- package/dist/extensions/pi-subagents/test/unit/prompt-audit-optional-peers.test.ts +43 -0
- package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +24 -2
- package/dist/extensions/pi-subagents/test/unit/readonly-drain-observation.test.ts +174 -0
- package/dist/extensions/pi-subagents/test/unit/readonly-model-continuation.test.ts +94 -0
- package/dist/extensions/pi-subagents/test/unit/readonly-session-evidence.test.ts +1329 -0
- package/dist/extensions/pi-subagents/test/unit/recursion-guard.test.ts +29 -80
- package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +11 -8
- package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/retained-nested-route-tracker.test.ts +175 -0
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +38 -12
- package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +2 -5
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +89 -1
- package/dist/extensions/pi-subagents/test/unit/runtime-acknowledged-extensions.test.ts +2 -16
- package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +27 -3
- package/dist/extensions/pi-subagents/test/unit/scheduled-supervisor-demand.test.ts +215 -0
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +15 -11
- package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +237 -1
- package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +2 -5
- package/dist/extensions/pi-subagents/test/unit/streamed-progress-bounds.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +14 -1
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +130 -739
- package/dist/extensions/pi-subagents/test/unit/supervisor-ask-registration.test.ts +682 -0
- package/dist/extensions/pi-subagents/test/unit/supervisor-ui.test.ts +137 -0
- package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +1 -11
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +23 -3
- package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +8 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +19 -1
- package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +72 -4
- package/dist/extensions/pi-subagents/test/unit/workflow-checklist.test.ts +17 -3
- package/dist/extensions/pi-subagents/test/unit/workflow-child-summary.test.ts +34 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +12 -2
- package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +46 -6
- package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/workflow-resources.test.ts +133 -1
- package/dist/extensions/pi-subagents/test/unit/workflow-resume-hint.test.ts +53 -2
- package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +222 -14
- package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +526 -85
- package/dist/extensions/pi-web-agent/src/backends/config.ts +1 -0
- package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +5 -3
- package/dist/extensions/pi-web-agent/src/search/tokenin.ts +7 -3
- package/dist/extensions/pi-web-agent/src/types.ts +1 -1
- package/dist/extensions/pi-zentui/README.md +17 -0
- package/dist/extensions/pi-zentui/assets/screenshots/footer-status-hyperlink.png +0 -0
- package/dist/extensions/pi-zentui/docs/configuration.md +71 -2
- package/dist/extensions/pi-zentui/extensions/zentui/config.ts +11 -0
- package/dist/extensions/pi-zentui/extensions/zentui/editor-transfer.ts +14 -0
- package/dist/extensions/pi-zentui/extensions/zentui/extension-status.ts +29 -13
- package/dist/extensions/pi-zentui/extensions/zentui/footer-layout.ts +5 -4
- package/dist/extensions/pi-zentui/extensions/zentui/footer-text.ts +11 -0
- package/dist/extensions/pi-zentui/extensions/zentui/footer.ts +11 -10
- package/dist/extensions/pi-zentui/extensions/zentui/index.ts +77 -3
- package/dist/extensions/pi-zentui/extensions/zentui/presets.ts +77 -0
- package/dist/extensions/pi-zentui/extensions/zentui/settings-command.ts +103 -2
- package/dist/extensions/pi-zentui/extensions/zentui/working-line-extension-segments.ts +115 -0
- package/dist/extensions/pi-zentui/extensions/zentui/working-line.ts +87 -5
- package/dist/extensions/pi-zentui/package-lock.json +277 -517
- package/dist/extensions/pi-zentui/package.json +7 -4
- package/dist/extensions/pi-zentui/test/config-presets.test.ts +238 -0
- package/dist/extensions/pi-zentui/test/editor-transfer.test.ts +24 -1
- package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +570 -2
- package/dist/extensions/pi-zentui/test/extension-status.test.ts +90 -0
- package/dist/extensions/pi-zentui/test/footer-hyperlink.test.ts +243 -0
- package/dist/extensions/pi-zentui/test/package-contents.mjs +1 -0
- package/dist/extensions/pi-zentui/test/presets.test.ts +121 -0
- package/dist/extensions/pi-zentui/test/settings-command.test.ts +205 -1
- package/dist/extensions/pi-zentui/test/working-line-extension-segments.test.ts +139 -0
- package/dist/extensions/pi-zentui/test/working-line-lifecycle.integration.test.ts +237 -3
- package/dist/extensions/pi-zentui/test/working-line.test.ts +94 -2
- package/dist/index.d.ts +1 -1
- package/dist/main.js +4 -1
- package/dist/modes/interactive/chat-viewport.d.ts +19 -0
- package/dist/modes/interactive/chat-viewport.js +27 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +6 -2
- package/dist/modes/interactive/components/assistant-message.js +30 -13
- package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
- package/dist/modes/interactive/components/custom-editor.js +39 -1
- package/dist/modes/interactive/components/first-time-setup.js +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts +2 -0
- package/dist/modes/interactive/components/markdown-transform.js +18 -0
- package/dist/modes/interactive/components/model-selector.js +19 -17
- package/dist/modes/interactive/components/scoped-models-selector.js +21 -23
- package/dist/modes/interactive/components/settings-selector.d.ts +7 -1
- package/dist/modes/interactive/components/settings-selector.js +128 -20
- package/dist/modes/interactive/components/settings-submenu.d.ts +71 -0
- package/dist/modes/interactive/components/settings-submenu.js +164 -0
- package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
- package/dist/modes/interactive/components/status-indicator.js +10 -3
- package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
- package/dist/modes/interactive/components/thinking-selector.js +75 -18
- package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
- package/dist/modes/interactive/components/tool-execution.js +35 -33
- package/dist/modes/interactive/components/trust-selector.js +2 -2
- package/dist/modes/interactive/interactive-mode.d.ts +13 -15
- package/dist/modes/interactive/interactive-mode.js +144 -80
- package/dist/modes/interactive/session-share.d.ts +15 -0
- package/dist/modes/interactive/session-share.js +183 -0
- package/dist/modes/interactive/theme/dark.json +2 -1
- package/dist/modes/interactive/theme/light.json +2 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
- package/dist/modes/interactive/theme/theme-controller.js +5 -0
- package/dist/modes/interactive/theme/theme-json.d.ts +83 -0
- package/dist/modes/interactive/theme/theme-json.js +129 -0
- package/dist/modes/interactive/theme/theme-schema.json +9 -1
- package/dist/modes/interactive/theme/theme.d.ts +14 -5
- package/dist/modes/interactive/theme/theme.js +18 -119
- package/dist/modes/interactive/tui-renderer.d.ts +20 -0
- package/dist/modes/interactive/tui-renderer.js +65 -0
- package/dist/utils/exif-orientation.js +2 -3
- package/dist/utils/management-http.d.ts +24 -0
- package/dist/utils/management-http.js +53 -0
- package/dist/utils/text.d.ts +7 -0
- package/dist/utils/text.js +8 -0
- package/dist/utils/tools-manager.d.ts +1 -0
- package/dist/utils/tools-manager.js +43 -21
- package/docs/docs.json +0 -4
- package/package.json +4 -4
- package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +0 -415
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +0 -1059
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +0 -116
- package/dist/extensions/pi-subagents/src/shared/post-exit-stdio-guard.ts +0 -85
- package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +0 -224
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +0 -6986
- package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +0 -447
- package/dist/extensions/pi-subagents/test/support/real-session-child-cli.mjs +0 -185
- package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +0 -311
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling-pi-args.test.ts +0 -84
- package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +0 -202
- package/dist/extensions/pi-subagents/test/unit/close-grace-timer.test.ts +0 -101
- package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +0 -2347
- package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +0 -104
- package/dist/extensions/pi-subagents/test/unit/windows-hide-spawn.test.ts +0 -49
- package/dist/skills/imagegen-frontend-mobile/SKILL.md +0 -1465
- package/dist/skills/imagegen-frontend-web/SKILL.md +0 -987
- package/dist/skills/implanger/SKILL.md +0 -70
- package/dist/skills/output/SKILL.md +0 -49
- package/dist/skills/planger/SKILL.md +0 -167
- package/dist/skills/workflow/SKILL.md +0 -95
- package/docs/workflows.md +0 -18
- /package/dist/bun/{register-bedrock.d.ts → runtime-setup.d.ts} +0 -0
|
@@ -4,7 +4,7 @@ import { discoverAgentsAll, type AgentSource } from "../agents/agents.ts";
|
|
|
4
4
|
import { isAsyncAvailable } from "../runs/background/async-execution.ts";
|
|
5
5
|
import { formatSpawnBudgetSummary, getSpawnBudgetSnapshot } from "../runs/shared/spawn-budget.ts";
|
|
6
6
|
import { getActiveAsyncCapacitySnapshot, resolveAbandonedSlotReleaseAfterMs, resolveMaxActiveAsyncRunsPerSession } from "../runs/background/active-async-capacity.ts";
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
import { diagnoseIntercomBridge, type IntercomBridgeDiagnostic } from "../intercom/intercom-bridge.ts";
|
|
9
9
|
import { discoverAvailableSkills, type SkillSource } from "../agents/skills.ts";
|
|
10
10
|
import {
|
|
@@ -178,14 +178,6 @@ function formatSpawnBudgetSection(input: DoctorReportInput): string[] {
|
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
function formatRunFanoutSection(input: DoctorReportInput): string[] {
|
|
181
|
-
try {
|
|
182
|
-
const inherited = decodeRunFanoutBudgetDescriptor(process.env[RUN_FANOUT_BUDGET_ENV]);
|
|
183
|
-
if (inherited) {
|
|
184
|
-
return [`- usage: ${formatRunFanoutBudget(getRunFanoutBudgetSnapshot(inherited)).replace(/^Run fan-out: /, "")}`, `- root run: ${inherited.rootRunId}`, "- reset boundary: cumulative claims are never released; a new top-level run creates a new budget"];
|
|
185
|
-
}
|
|
186
|
-
} catch (error) {
|
|
187
|
-
return [`- inherited budget: invalid — ${errorText(error)}`];
|
|
188
|
-
}
|
|
189
181
|
const configured = resolveMaxSubagentSpawnsPerRun(input.config.maxSubagentSpawnsPerRun);
|
|
190
182
|
const source = normalizeMaxSubagentSpawnsPerRun(process.env.SELESAI_SUBAGENT_MAX_SPAWNS_PER_RUN) !== undefined
|
|
191
183
|
? "environment"
|
|
@@ -214,7 +206,7 @@ function formatPermissionSystemSection(): string[] {
|
|
|
214
206
|
if (trimmed) {
|
|
215
207
|
lines.push(`- parent session: set (${trimmed})`);
|
|
216
208
|
} else {
|
|
217
|
-
lines.push("- parent session: not set — ask forwarding from
|
|
209
|
+
lines.push("- parent session: not set — ask forwarding from background children will not reach a parent UI");
|
|
218
210
|
}
|
|
219
211
|
const isChild = process.env["SELESAI_SUBAGENT_CHILD"] === "1";
|
|
220
212
|
lines.push(`- subagent process: ${isChild ? "yes (SELESAI_SUBAGENT_CHILD=1)" : "no"}`);
|
|
@@ -6,8 +6,8 @@ import { discoverAgents } from "../agents/agents.ts";
|
|
|
6
6
|
import { getArtifactsDir } from "../shared/artifacts.ts";
|
|
7
7
|
import { createSubagentExecutor, type SubagentParamsLike } from "../runs/foreground/subagent-executor.ts";
|
|
8
8
|
import { resolveWaitToolConfig } from "../runs/background/wait-config.ts";
|
|
9
|
-
import {
|
|
10
|
-
import { readNestedControlRequests,
|
|
9
|
+
import type { ChildRuntimeConfig } from "../runs/shared/child-runtime-config.ts";
|
|
10
|
+
import { readNestedControlRequests, resolveInheritedNestedRoute, type NestedRoute, writeNestedControlResult } from "../runs/shared/nested-events.ts";
|
|
11
11
|
import { deliverSubagentIntercomMessageEvent } from "../intercom/result-intercom.ts";
|
|
12
12
|
import { resolveSubagentIntercomTarget } from "../intercom/intercom-bridge.ts";
|
|
13
13
|
import { createSubagentParamsSchema } from "./schemas.ts";
|
|
@@ -51,12 +51,8 @@ function createChildSafeState(): SubagentState {
|
|
|
51
51
|
};
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
function resolveNestedControlRoute(): NestedRoute | undefined {
|
|
55
|
-
|
|
56
|
-
return resolveNestedRouteFromEnv();
|
|
57
|
-
} catch {
|
|
58
|
-
return undefined;
|
|
59
|
-
}
|
|
54
|
+
function resolveNestedControlRoute(config: ChildRuntimeConfig): NestedRoute | undefined {
|
|
55
|
+
return config.nestedRoute ? resolveInheritedNestedRoute(config.nestedRoute) : undefined;
|
|
60
56
|
}
|
|
61
57
|
|
|
62
58
|
function nestedControlRouteKey(route: NestedRoute): string {
|
|
@@ -145,8 +141,9 @@ function startNestedControlInboxListener(pi: ExtensionAPI, state: SubagentState,
|
|
|
145
141
|
return () => clearInterval(timer);
|
|
146
142
|
}
|
|
147
143
|
|
|
148
|
-
|
|
149
|
-
|
|
144
|
+
/** Register the child-side `subagent` tool for fanout-authorized children. */
|
|
145
|
+
export default function registerFanoutChildSubagentExtension(pi: ExtensionAPI, childConfig: ChildRuntimeConfig): void {
|
|
146
|
+
if (!childConfig.fanoutChild) return;
|
|
150
147
|
|
|
151
148
|
const globalStore = globalThis as Record<string, unknown>;
|
|
152
149
|
const registeredKey = "__piSubagentFanoutChildRegisteredApis";
|
|
@@ -172,6 +169,7 @@ export default function registerFanoutChildSubagentExtension(pi: ExtensionAPI):
|
|
|
172
169
|
expandTilde,
|
|
173
170
|
discoverAgents,
|
|
174
171
|
allowMutatingManagementActions: false,
|
|
172
|
+
childRuntime: childConfig,
|
|
175
173
|
});
|
|
176
174
|
|
|
177
175
|
const params = createSubagentParamsSchema();
|
|
@@ -190,7 +188,7 @@ export default function registerFanoutChildSubagentExtension(pi: ExtensionAPI):
|
|
|
190
188
|
};
|
|
191
189
|
|
|
192
190
|
pi.registerTool(tool);
|
|
193
|
-
const route = resolveNestedControlRoute();
|
|
191
|
+
const route = resolveNestedControlRoute(childConfig);
|
|
194
192
|
if (!route) return;
|
|
195
193
|
const listenerCleanupKey = "__piSubagentFanoutChildNestedControlInboxCleanups";
|
|
196
194
|
const listenerCleanups = globalStore[listenerCleanupKey] instanceof Map
|
|
@@ -19,7 +19,8 @@ import * as path from "node:path";
|
|
|
19
19
|
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
20
20
|
import { keyText, type ExtensionAPI, type ExtensionContext, type ToolDefinition } from "@selesai/code";
|
|
21
21
|
import { Box, Container, Spacer, Text, truncateToWidth, visibleWidth, wrapTextWithAnsi, type Component } from "@earendil-works/pi-tui";
|
|
22
|
-
import { discoverAgentSnapshot, discoverAgents, type AgentConfig, type AgentScope } from "../agents/agents.ts";
|
|
22
|
+
import { clearAgentDiscoveryCache, discoverAgentSnapshot, discoverAgents, type AgentConfig, type AgentScope } from "../agents/agents.ts";
|
|
23
|
+
import { appendAdvertisedAgentPrompt, buildAdvertisedAgentPrompt } from "../agents/advertised-agent-prompt.ts";
|
|
23
24
|
import { clearRuntimeAgentsForPi, listRuntimeAgentConfigs, mergeRuntimeAgents } from "../agents/runtime-agent-registry.ts";
|
|
24
25
|
import { registerRuntimeAgentEventListener } from "../agents/runtime-agent-events.ts";
|
|
25
26
|
import { ensureAccessibleDir } from "../shared/accessible-dir.ts";
|
|
@@ -46,7 +47,16 @@ import { registerPromptTemplateDelegationBridge } from "../slash/prompt-template
|
|
|
46
47
|
import { registerMainWatchdog } from "../watchdog/register-main.ts";
|
|
47
48
|
import { registerSlashSubagentBridge } from "../slash/slash-bridge.ts";
|
|
48
49
|
import { createNativeSupervisorChannel } from "../intercom/native-supervisor-channel.ts";
|
|
50
|
+
import {
|
|
51
|
+
renderSupervisorReply,
|
|
52
|
+
renderSupervisorRequest,
|
|
53
|
+
SUPERVISOR_REPLY_ENTRY_TYPE,
|
|
54
|
+
SUPERVISOR_REQUEST_MESSAGE_TYPE,
|
|
55
|
+
type SupervisorRequestMessageDetails,
|
|
56
|
+
} from "../intercom/supervisor-ui.ts";
|
|
49
57
|
import { registerHerdrStatusBridge, type HerdrStatusRun } from "../integrations/herdr-status.ts";
|
|
58
|
+
import { hasLiveSubagentWork, registerPiWebSessionLiveness } from "../integrations/pi-web-session-liveness.ts";
|
|
59
|
+
import { createRetainedNestedRouteTracker } from "../runs/background/retained-nested-route-tracker.ts";
|
|
50
60
|
import { listHerdrProjectPaneRoots, restoreHerdrProjectPaneSnapshots } from "../inspectors/herdr/project-panes.ts";
|
|
51
61
|
import { registerSubagentRpcBridge } from "./rpc.ts";
|
|
52
62
|
import { clearSlashSnapshots, getSlashRenderableSnapshot, resolveSlashMessageDetails, restoreSlashFinalSnapshots, type SlashMessageDetails } from "../slash/slash-live-state.ts";
|
|
@@ -56,7 +66,8 @@ import { createWaitSubscriptionManager } from "../runs/background/wait-subscript
|
|
|
56
66
|
import { drainOutstandingWork } from "../runs/background/auto-drain.ts";
|
|
57
67
|
import registerSubagentNotify, { parseSubagentNotifyContent, type SubagentNotifyDetails } from "../runs/background/notify.ts";
|
|
58
68
|
import { formatSteeringNotice, handleSubagentSteeringNotice, SUBAGENT_STEERING_MESSAGE_TYPE, type SubagentSteeringMessageDetails } from "./steering-notices.ts";
|
|
59
|
-
import { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from "../runs/shared/
|
|
69
|
+
import { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from "../runs/shared/child-runtime-config.ts";
|
|
70
|
+
import { disposeChildSessions } from "../runs/shared/child-session.ts";
|
|
60
71
|
import { resolveCurrentSubagentCapabilityCeiling } from "../runs/shared/capability-ceiling.ts";
|
|
61
72
|
import { formatDuration, shortenPath } from "../shared/formatters.ts";
|
|
62
73
|
import { applyModelExclusionsConfig, loadConfig, resolveAsyncByDefault, resolveScheduledStoreRoot } from "./config.ts";
|
|
@@ -479,11 +490,14 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
479
490
|
}, run);
|
|
480
491
|
};
|
|
481
492
|
|
|
482
|
-
const supervisorChannel = createNativeSupervisorChannel(pi, state
|
|
493
|
+
const supervisorChannel = createNativeSupervisorChannel(pi, state, {
|
|
494
|
+
getCurrentOwnerStates: () => executor.getCurrentSupervisorOwnerStates(),
|
|
495
|
+
});
|
|
483
496
|
const waitSubscriptionManager = createWaitSubscriptionManager(pi, state);
|
|
484
497
|
const mainWatchdog = registerMainWatchdog(pi);
|
|
485
498
|
const resultDeliveryOwnership = createResultDeliveryOwnership(state);
|
|
486
499
|
const completionNotifier = registerSubagentNotify(pi, state, { batchConfig: config.completionBatch, ownership: resultDeliveryOwnership });
|
|
500
|
+
let retainedNestedRouteTracker: ReturnType<typeof createRetainedNestedRouteTracker> | undefined;
|
|
487
501
|
const fleetStatus = fleetViewEnabled
|
|
488
502
|
? new SubagentFleetStatus(state, async (itemKey) => {
|
|
489
503
|
const ctx = withLastUiContext((current) => current);
|
|
@@ -502,6 +516,7 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
502
516
|
let executorScheduled: ((id: string, params: SubagentParamsLike, signal: AbortSignal, ctx: ExtensionContext) => Promise<AgentToolResult<Details>>) | undefined;
|
|
503
517
|
let goalTurnId = 0;
|
|
504
518
|
let parentSessionEnvValue: string | null = null;
|
|
519
|
+
let releaseHostSessionLiveness = () => {};
|
|
505
520
|
const scheduledStoreRoot = config.scheduledRuns?.storeRoot === undefined ? undefined : resolveScheduledStoreRoot(config.scheduledRuns.storeRoot);
|
|
506
521
|
const scheduledRunManager = createScheduledRunManager({
|
|
507
522
|
config,
|
|
@@ -519,6 +534,15 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
519
534
|
resolveCapabilityCeiling: (sessionId) => resolveCurrentSubagentCapabilityCeiling(sessionId),
|
|
520
535
|
});
|
|
521
536
|
let refreshResultDelivery = () => {};
|
|
537
|
+
let advertisedAgents: AgentConfig[] = [];
|
|
538
|
+
let advertisedContext: Pick<ExtensionContext, "cwd" | "model"> | undefined;
|
|
539
|
+
const refreshAdvertisedAgents = () => {
|
|
540
|
+
advertisedAgents = [];
|
|
541
|
+
if (!advertisedContext) return;
|
|
542
|
+
clearAgentDiscoveryCache();
|
|
543
|
+
advertisedAgents = discoverAgents(advertisedContext.cwd, "both", advertisedContext.model?.provider).agents
|
|
544
|
+
.filter((agent) => agent.advertise === true);
|
|
545
|
+
};
|
|
522
546
|
const hasResultDeliveryDemand = () => {
|
|
523
547
|
if ([...state.asyncJobs.values()].some((job) => job.status === "queued" || job.status === "running")) return true;
|
|
524
548
|
if (state.foregroundControls.size > 0) return true;
|
|
@@ -546,6 +570,7 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
546
570
|
const { ensurePoller, refreshWidget, handleStarted, handleComplete, resetJobs, restoreActiveJobs, dispose: disposeAsyncJobTracker } = createAsyncJobTracker(pi, state, DIRS.async, {
|
|
547
571
|
widgetEnabled: asyncWidgetEnabled,
|
|
548
572
|
onJobTerminal: () => refreshResultDelivery(),
|
|
573
|
+
supervisorRequestState: supervisorChannel.getSupervisorRequestState,
|
|
549
574
|
});
|
|
550
575
|
const resultWatcher = createResultWatcher(
|
|
551
576
|
pi,
|
|
@@ -583,7 +608,7 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
583
608
|
}, ASYNC_RETENTION_DELAY_MS);
|
|
584
609
|
asyncRetentionTimer.unref?.();
|
|
585
610
|
|
|
586
|
-
const
|
|
611
|
+
const executorDeps: Parameters<typeof createSubagentExecutor>[0] = {
|
|
587
612
|
pi,
|
|
588
613
|
state,
|
|
589
614
|
config,
|
|
@@ -596,11 +621,30 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
596
621
|
getSubagentSessionRoot,
|
|
597
622
|
expandTilde,
|
|
598
623
|
discoverAgents: discoverAgentsForRuntime,
|
|
624
|
+
onAgentsChanged: () => {
|
|
625
|
+
try {
|
|
626
|
+
refreshAdvertisedAgents();
|
|
627
|
+
} catch (error) {
|
|
628
|
+
// The mutation already persisted. Withdraw stale guidance, not its result.
|
|
629
|
+
console.error("Failed to refresh advertised agents; catalog withdrawn until refresh:", error);
|
|
630
|
+
}
|
|
631
|
+
},
|
|
599
632
|
activateSupervisorTransport: () => supervisorChannel.activateTransport(),
|
|
633
|
+
findPendingAsks: (target) => supervisorChannel.findPendingAsks(target),
|
|
600
634
|
refreshResultDelivery: () => refreshResultDelivery(),
|
|
601
|
-
|
|
635
|
+
trackRetainedNestedRoute: undefined,
|
|
636
|
+
};
|
|
637
|
+
const executor = createSubagentExecutor(executorDeps);
|
|
602
638
|
executorScheduled = executor.executeScheduled;
|
|
603
639
|
|
|
640
|
+
pi.registerMessageRenderer<SupervisorRequestMessageDetails>(SUPERVISOR_REQUEST_MESSAGE_TYPE, renderSupervisorRequest);
|
|
641
|
+
const registerEntryRenderer = (pi as unknown as {
|
|
642
|
+
registerEntryRenderer?: (customType: string, renderer: (entry: { data?: unknown }, options: { expanded: boolean }, theme: ExtensionContext["ui"]["theme"]) => Component | undefined) => void;
|
|
643
|
+
}).registerEntryRenderer;
|
|
644
|
+
if (typeof registerEntryRenderer === "function") {
|
|
645
|
+
registerEntryRenderer.call(pi, SUPERVISOR_REPLY_ENTRY_TYPE, renderSupervisorReply);
|
|
646
|
+
}
|
|
647
|
+
|
|
604
648
|
pi.registerMessageRenderer<SlashMessageDetails>(SLASH_RESULT_TYPE, (message, options, theme) => {
|
|
605
649
|
const details = resolveSlashMessageDetails(message.details);
|
|
606
650
|
if (!details) return undefined;
|
|
@@ -755,6 +799,16 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
755
799
|
|
|
756
800
|
pi.registerTool(tool);
|
|
757
801
|
|
|
802
|
+
pi.on("before_agent_start", (event, ctx) => {
|
|
803
|
+
const selectedTools = event.systemPromptOptions.selectedTools ?? pi.getActiveTools();
|
|
804
|
+
const sessionId = state.currentSessionId ?? resolveCurrentSessionId(ctx.sessionManager);
|
|
805
|
+
const advertisedPrompt = selectedTools.includes("subagent")
|
|
806
|
+
? buildAdvertisedAgentPrompt(advertisedAgents, resolveCurrentSubagentCapabilityCeiling(sessionId))
|
|
807
|
+
: undefined;
|
|
808
|
+
const systemPrompt = appendAdvertisedAgentPrompt(event.systemPrompt, advertisedPrompt);
|
|
809
|
+
if (systemPrompt !== event.systemPrompt) return { systemPrompt };
|
|
810
|
+
});
|
|
811
|
+
|
|
758
812
|
registerWaitTool(pi, state, waitToolConfig.enabled, waitSubscriptionManager, waitToolConfig.defaultTimeoutMs);
|
|
759
813
|
|
|
760
814
|
pi.on("agent_end", async (_event, ctx) => {
|
|
@@ -889,6 +943,7 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
889
943
|
const previousRuntimeSessionId = state.currentSessionId;
|
|
890
944
|
resultDeliveryOwnership.claimPredecessor(previousSessionFile, previousRuntimeSessionId);
|
|
891
945
|
state.currentSessionId = resolveCurrentSessionId(ctx.sessionManager);
|
|
946
|
+
state.supervisorOwnerSessionId = ctx.sessionManager.getSessionId() || null;
|
|
892
947
|
transitionResultDelivery();
|
|
893
948
|
state.parentSessionFile = ctx.sessionManager.getSessionFile();
|
|
894
949
|
state.trustedSessionFileRoot = state.parentSessionFile ? path.join(getAgentDir(), "sessions") : undefined;
|
|
@@ -906,10 +961,10 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
906
961
|
const projectPaneOwnerRoot = path.resolve(ctx.cwd);
|
|
907
962
|
restoreHerdrProjectPaneSnapshots(state, [...new Set([...(state.herdrProjectPanes?.keys() ?? []), ...listHerdrProjectPaneRoots(projectPaneOwnerRoot), projectPaneOwnerRoot])]);
|
|
908
963
|
// Set SELESAI_SUBAGENT_PARENT_SESSION for permission-system forwarding.
|
|
909
|
-
// Only set in the root session (the interactive UI session), not in
|
|
910
|
-
// child
|
|
911
|
-
//
|
|
912
|
-
//
|
|
964
|
+
// Only set in the root session (the interactive UI session), not in a
|
|
965
|
+
// child host: the runner process inherits the parent's value through
|
|
966
|
+
// its environment at spawn time and must not overwrite it with a child
|
|
967
|
+
// session's identity.
|
|
913
968
|
if (!process.env[SUBAGENT_CHILD_ENV]) {
|
|
914
969
|
const sessionId = ctx.sessionManager.getSessionId();
|
|
915
970
|
if (sessionId) {
|
|
@@ -925,6 +980,9 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
925
980
|
cleanupSessionArtifacts(ctx);
|
|
926
981
|
logSlowPhase("session-artifact-cleanup", phaseStartedAt);
|
|
927
982
|
state.foregroundControls.clear();
|
|
983
|
+
retainedNestedRouteTracker?.clear();
|
|
984
|
+
retainedNestedRouteTracker = undefined;
|
|
985
|
+
executorDeps.trackRetainedNestedRoute = undefined;
|
|
928
986
|
state.lastForegroundControlId = null;
|
|
929
987
|
phaseStartedAt = Date.now();
|
|
930
988
|
resetJobs(ctx);
|
|
@@ -961,6 +1019,8 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
961
1019
|
if (runtimeCleaned) return;
|
|
962
1020
|
runtimeCleaned = true;
|
|
963
1021
|
const shuttingDownParentSession = parentSessionEnvValue;
|
|
1022
|
+
releaseHostSessionLiveness();
|
|
1023
|
+
releaseHostSessionLiveness = () => {};
|
|
964
1024
|
// Workflow continuations retain their launch context; abort them before
|
|
965
1025
|
// teardown so a reload cannot launch through a stale context.
|
|
966
1026
|
for (const controller of state.workflowControllers?.values() ?? []) {
|
|
@@ -984,6 +1044,9 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
984
1044
|
for (const timer of state.cleanupTimers.values()) clearTimeout(timer);
|
|
985
1045
|
state.cleanupTimers.clear();
|
|
986
1046
|
state.asyncJobs.clear();
|
|
1047
|
+
retainedNestedRouteTracker?.clear();
|
|
1048
|
+
retainedNestedRouteTracker = undefined;
|
|
1049
|
+
executorDeps.trackRetainedNestedRoute = undefined;
|
|
987
1050
|
for (const unsubscribe of eventUnsubscribes) {
|
|
988
1051
|
try {
|
|
989
1052
|
unsubscribe();
|
|
@@ -998,6 +1061,7 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
998
1061
|
promptTemplateBridge.dispose();
|
|
999
1062
|
state.widgetsSuspended = false;
|
|
1000
1063
|
state.currentSessionId = null;
|
|
1064
|
+
state.supervisorOwnerSessionId = null;
|
|
1001
1065
|
state.statusProjectionSessionId = null;
|
|
1002
1066
|
state.parentSessionFile = null;
|
|
1003
1067
|
parentSessionEnvValue = null;
|
|
@@ -1077,6 +1141,21 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
1077
1141
|
installRuntime(ctx);
|
|
1078
1142
|
const recovering = event.reason === "startup" || event.reason === "reload" || event.reason === "resume";
|
|
1079
1143
|
resetSessionState(ctx, recovering, event.previousSessionFile);
|
|
1144
|
+
releaseHostSessionLiveness();
|
|
1145
|
+
const sessionId = ctx.sessionManager.getSessionId();
|
|
1146
|
+
const sessionFile = ctx.sessionManager.getSessionFile();
|
|
1147
|
+
const liveness = sessionId
|
|
1148
|
+
? registerPiWebSessionLiveness({
|
|
1149
|
+
sessionId,
|
|
1150
|
+
...(sessionFile ? { sessionFile } : {}),
|
|
1151
|
+
isActive: () => hasLiveSubagentWork(state) || completionNotifier.hasPendingDelivery(),
|
|
1152
|
+
})
|
|
1153
|
+
: { registered: false, release: () => {} };
|
|
1154
|
+
releaseHostSessionLiveness = liveness.release;
|
|
1155
|
+
if (liveness.registered) {
|
|
1156
|
+
retainedNestedRouteTracker = createRetainedNestedRouteTracker(state);
|
|
1157
|
+
executorDeps.trackRetainedNestedRoute = retainedNestedRouteTracker.track;
|
|
1158
|
+
}
|
|
1080
1159
|
herdrStatusBridge.sessionStarted({
|
|
1081
1160
|
hasUI: ctx.hasUI === true,
|
|
1082
1161
|
runs: activeHerdrRuns(),
|
|
@@ -1088,6 +1167,16 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
|
|
|
1088
1167
|
|
|
1089
1168
|
pi.on("session_shutdown", async () => {
|
|
1090
1169
|
runtimeEntry.cleanup();
|
|
1170
|
+
try {
|
|
1171
|
+
await disposeChildSessions();
|
|
1172
|
+
} catch (error) {
|
|
1173
|
+
console.error("Failed to dispose in-process child sessions:", error);
|
|
1174
|
+
}
|
|
1091
1175
|
await herdrStatusBridge.flush();
|
|
1092
1176
|
});
|
|
1093
|
-
|
|
1177
|
+
|
|
1178
|
+
pi.on("session_start", (_event, ctx) => {
|
|
1179
|
+
advertisedContext = { cwd: ctx.cwd, model: ctx.model };
|
|
1180
|
+
refreshAdvertisedAgents();
|
|
1181
|
+
});
|
|
1182
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { normalizeWorktreeBaseRef } from "../runs/shared/worktree.ts";
|
|
2
|
+
|
|
1
3
|
export interface PublicSubagentExecutionParams {
|
|
2
4
|
action?: unknown;
|
|
3
5
|
capabilities?: unknown;
|
|
@@ -28,6 +30,7 @@ export interface PublicSubagentExecutionParams {
|
|
|
28
30
|
preflight?: unknown;
|
|
29
31
|
isolation?: unknown;
|
|
30
32
|
worktree?: unknown;
|
|
33
|
+
baseRef?: unknown;
|
|
31
34
|
lane?: unknown;
|
|
32
35
|
async?: unknown;
|
|
33
36
|
output?: unknown;
|
|
@@ -69,6 +72,13 @@ export function normalizePublicSubagentExecution<T extends PublicSubagentExecuti
|
|
|
69
72
|
return { ok: false, error: "Public execution does not accept workflow resource provenance or permit fields.", mode: params.action === undefined ? "workflow" : "management" };
|
|
70
73
|
}
|
|
71
74
|
}
|
|
75
|
+
if (params.baseRef !== undefined) {
|
|
76
|
+
try {
|
|
77
|
+
normalizeWorktreeBaseRef(params.baseRef);
|
|
78
|
+
} catch (error) {
|
|
79
|
+
return { ok: false, error: error instanceof Error ? error.message : String(error), mode: params.action === undefined ? "workflow" : "management" };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
72
82
|
if (params.workflowScript !== undefined && params.workflowScriptPath !== undefined) {
|
|
73
83
|
return { ok: false, error: "workflowScript and workflowScriptPath are mutually exclusive.", mode: "workflow" };
|
|
74
84
|
}
|
|
@@ -122,6 +132,9 @@ export function normalizePublicSubagentExecution<T extends PublicSubagentExecuti
|
|
|
122
132
|
return { ok: false, error: "action must be a non-empty management/control action, or omit action and use workflowScript.", mode: "management" };
|
|
123
133
|
}
|
|
124
134
|
const normalizedAction = typeof action === "string" ? action.trim() : undefined;
|
|
135
|
+
if (params.baseRef !== undefined && normalizedAction !== undefined && normalizedAction !== "resume" && normalizedAction !== "schedule.create") {
|
|
136
|
+
return { ok: false, error: "baseRef is only supported for child execution, resume, and schedule.create.", mode: "management" };
|
|
137
|
+
}
|
|
125
138
|
if (normalizedAction !== undefined && hasNamedWorkflow) {
|
|
126
139
|
return { ok: false, error: "Named workflow resource execution must omit action.", mode: "management" };
|
|
127
140
|
}
|
|
@@ -24,7 +24,7 @@ import { readStatus } from "../shared/utils.ts";
|
|
|
24
24
|
import { SubagentParams } from "./schemas.ts";
|
|
25
25
|
import { normalizePublicSubagentExecution } from "./public-execution.ts";
|
|
26
26
|
import { ASYNC_STATUS_SNAPSHOT_KIND, ASYNC_STATUS_SNAPSHOT_VERSION, buildAsyncStatusSnapshotForState } from "../runs/background/async-status-snapshot.ts";
|
|
27
|
-
import { isStoppableAsyncStatusStep, resolveAsyncStatusChild, type ResolvedAsyncStatusChild } from "../runs/shared/child-identity.ts";
|
|
27
|
+
import { isStoppableAsyncStatusStep, resolveAsyncStatusChild, stopStoppableAsyncStatusChildren, type ResolvedAsyncStatusChild } from "../runs/shared/child-identity.ts";
|
|
28
28
|
|
|
29
29
|
export const SUBAGENT_RPC_PROTOCOL_VERSION = 1;
|
|
30
30
|
export const SUBAGENT_RPC_REQUEST_EVENT = "subagents:rpc:v1:request";
|
|
@@ -616,8 +616,8 @@ function stopAsyncRun(
|
|
|
616
616
|
}
|
|
617
617
|
}
|
|
618
618
|
if (initialStatus.mode === "workflow" && initialStatus.state === "running") {
|
|
619
|
+
const stopChild = options.state?.workflowChildStops?.get(initialRunId);
|
|
619
620
|
if (child) {
|
|
620
|
-
const stopChild = options.state?.workflowChildStops?.get(initialRunId);
|
|
621
621
|
if (stopChild) {
|
|
622
622
|
if (!stopChild(child.id, `Workflow child '${child.id}' stopped by RPC.`)) throw new SubagentRpcError("invalid_state", `Child '${childId}' in workflow ${initialRunId} is not available to stop.`);
|
|
623
623
|
emitChildStopping(initialRunId, location.asyncDir, child);
|
|
@@ -633,6 +633,7 @@ function stopAsyncRun(
|
|
|
633
633
|
}
|
|
634
634
|
const workflowController = options.state?.workflowControllers?.get(initialRunId);
|
|
635
635
|
if (workflowController && !child) {
|
|
636
|
+
stopStoppableAsyncStatusChildren(initialStatus, stopChild, "Workflow stopped by RPC.");
|
|
636
637
|
workflowController.abort(new Error("Workflow stopped by RPC."));
|
|
637
638
|
return {
|
|
638
639
|
runId: initialRunId,
|
|
@@ -642,27 +643,10 @@ function stopAsyncRun(
|
|
|
642
643
|
message: `Stop requested for async run ${initialRunId}.`,
|
|
643
644
|
};
|
|
644
645
|
}
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
kill: options.kill,
|
|
650
|
-
now: options.now,
|
|
651
|
-
source: "rpc-stop",
|
|
652
|
-
...(child ? { targetIndex: child.index, childId: child.id } : {}),
|
|
653
|
-
});
|
|
654
|
-
} catch (error) {
|
|
655
|
-
throw new SubagentRpcError("execution_failed", error instanceof Error ? error.message : String(error));
|
|
656
|
-
}
|
|
657
|
-
if (child) emitChildStopping(initialRunId, location.asyncDir, child);
|
|
658
|
-
return {
|
|
659
|
-
runId: initialRunId,
|
|
660
|
-
asyncDir: location.asyncDir,
|
|
661
|
-
previousState: initialStatus.state,
|
|
662
|
-
state: "stopping",
|
|
663
|
-
...(child ? { childId: child.id } : {}),
|
|
664
|
-
message: child ? `Stop requested for child ${child.id} in async run ${initialRunId}.` : `Stop requested for async run ${initialRunId}.`,
|
|
665
|
-
};
|
|
646
|
+
// Workflow controls live in-process; a persisted run directory cannot restore them.
|
|
647
|
+
throw new SubagentRpcError("invalid_state", child
|
|
648
|
+
? `Child '${child.id}' in workflow ${initialRunId} has no live stop callback available.`
|
|
649
|
+
: `Workflow ${initialRunId} has no live run controller available to stop.`);
|
|
666
650
|
}
|
|
667
651
|
|
|
668
652
|
let status;
|
|
@@ -77,6 +77,8 @@ const AcceptanceEvidenceKinds = [
|
|
|
77
77
|
"manual-notes",
|
|
78
78
|
];
|
|
79
79
|
|
|
80
|
+
// Provider boolean branches intentionally overapproximate false-only runtime inputs.
|
|
81
|
+
// Restricted function-declaration converters only support string enum members.
|
|
80
82
|
const AcceptanceOverride = Type.Unsafe({
|
|
81
83
|
anyOf: [
|
|
82
84
|
{ type: "string", enum: ["auto", "attested", "checked"] },
|
|
@@ -89,10 +91,10 @@ const AcceptanceOverride = Type.Unsafe({
|
|
|
89
91
|
{
|
|
90
92
|
type: "string",
|
|
91
93
|
},
|
|
92
|
-
{ type: "boolean"
|
|
94
|
+
{ type: "boolean" },
|
|
93
95
|
{ type: "object", additionalProperties: true },
|
|
94
96
|
],
|
|
95
|
-
description: `Optional acceptance policy. Prefer an inline JSON object. JSON-encoded object strings are tolerated only during input normalization; invalid strings fail closed. Reviewer/read-only calls, omit acceptance. { level: "checked", evidence: ["commands-run", "changed-files"] }. Supported evidence kinds: ${AcceptanceEvidenceKinds.join(",")}. acceptance.review.required.`,
|
|
97
|
+
description: `Optional acceptance policy. false disables acceptance; true is invalid. Prefer an inline JSON object. JSON-encoded object strings are tolerated only during input normalization; invalid strings fail closed. Reviewer/read-only calls, omit acceptance. { level: "checked", evidence: ["commands-run", "changed-files"] }. Supported evidence kinds: ${AcceptanceEvidenceKinds.join(",")}. acceptance.review.required.`,
|
|
96
98
|
});
|
|
97
99
|
|
|
98
100
|
const AgentContractOverride = Type.Object({
|
|
@@ -149,7 +151,7 @@ const WorkflowPreflightOverride = Type.Object({
|
|
|
149
151
|
version: Type.Integer({ minimum: 1, maximum: 1 }),
|
|
150
152
|
coverage: Type.Optional(Type.String({ enum: ["complete", "partial"] })),
|
|
151
153
|
lanes: Type.Array(WorkflowPreflightLane, { maxItems: 64 }),
|
|
152
|
-
}, { additionalProperties: false, description: "Bounded display-only lane hints for workflow launch/status.
|
|
154
|
+
}, { additionalProperties: false, description: "Bounded display-only lane hints for workflow launch/status. Coverage mismatches warn but never change launch authority or execution." });
|
|
153
155
|
|
|
154
156
|
// Parallel task item (within a parallel step)
|
|
155
157
|
export const ParallelTaskSchema = Type.Object({
|
|
@@ -257,7 +259,7 @@ export const ChainItem = Type.Object({
|
|
|
257
259
|
const MissionLaunchOverride = Type.Unsafe({
|
|
258
260
|
anyOf: [
|
|
259
261
|
{ type: "object", additionalProperties: true },
|
|
260
|
-
{ type: "boolean"
|
|
262
|
+
{ type: "boolean" },
|
|
261
263
|
],
|
|
262
264
|
});
|
|
263
265
|
const MissionUpdateOverride = Type.Unsafe({ type: "object", additionalProperties: true });
|
|
@@ -317,7 +319,7 @@ const SubagentParamProperties = {
|
|
|
317
319
|
scope: Type.Optional(Type.String({ enum: ["session", "user", "project"], description: "Scope for action='watchdog.configure'. Defaults to session to avoid persistent settings writes unless user/project is explicit." })),
|
|
318
320
|
target: Type.Optional(Type.String({ enum: ["main", "children", "child"], description: "Target for watchdog actions." })),
|
|
319
321
|
focus: Type.Optional(Type.Boolean({ description: "Focus the new Herdr pane for inspector.open or project.open." })),
|
|
320
|
-
thinking: Type.Optional(Type.Unsafe({ anyOf: [{ type: "string" }, { type: "boolean"
|
|
322
|
+
thinking: Type.Optional(Type.Unsafe({ anyOf: [{ type: "string" }, { type: "boolean" }], description: "Thinking level for action='watchdog.configure' only (off/minimal/low/medium/high/xhigh/max, inherit, or false for off; true is invalid). Ignored on dispatch; set per-run child thinking with a suffix on the model string, e.g. model: 'provider/id:high'." })),
|
|
321
323
|
at: Type.Optional(Type.String({ description: "One-shot trigger for action='schedule.create': a relative delay such as '+10m' or an ISO timestamp with timezone." })),
|
|
322
324
|
every: Type.Optional(Type.String({ description: "Fixed recurring interval for action='schedule.create', such as '30m', '6h', '2d', or '2w'." })),
|
|
323
325
|
sessionOnly: Type.Optional(Type.Boolean()),
|
|
@@ -326,7 +328,7 @@ const SubagentParamProperties = {
|
|
|
326
328
|
overlap: Type.Optional(Type.String({ enum: ["skip"], description: "Overlap policy. This slice supports skip only." })),
|
|
327
329
|
catchUp: Type.Optional(Type.String({ enum: ["none", "latest"], description: "Missed occurrence policy for recurring schedules. Defaults to latest." })),
|
|
328
330
|
missionId: Type.Optional(Type.String({ description: "Mission id." })),
|
|
329
|
-
mission: Type.Optional(Type.Unsafe({ ...MissionLaunchOverride, description: "Mission object, or false for no mission. Set exactly one non-empty title or summary; objective and labels are optional. goal may only be true and then requires budget.tokens." })),
|
|
331
|
+
mission: Type.Optional(Type.Unsafe({ ...MissionLaunchOverride, description: "Mission object, or false for no mission; true is invalid. Set exactly one non-empty title or summary; objective and labels are optional. goal may only be true and then requires budget.tokens." })),
|
|
330
332
|
missionUpdate: Type.Optional(Type.Unsafe({ ...MissionUpdateOverride, description: "Mission update: objective, goal false or {paused:boolean}, budget, summary, labels, decisions, artifacts, or delivery receipts." })),
|
|
331
333
|
missionStatus: Type.Optional(Type.String({ description: "Mission status." })),
|
|
332
334
|
missionScope: Type.Optional(Type.String({ description: "Mission list scope: project (default) or global pointer index." })),
|
|
@@ -343,7 +345,7 @@ const SubagentParamProperties = {
|
|
|
343
345
|
})),
|
|
344
346
|
workflow: Type.Optional(Type.String({ minLength: 1, description: "Extension-owned workflow resource; resolves its script and authority internally." })),
|
|
345
347
|
args: Type.Optional(Type.Unsafe({ type: "object", maxProperties: 16, additionalProperties: true, description: "Bounded plain-JSON args for workflow; resource validation applies." })),
|
|
346
|
-
workflowScript: Type.Optional(Type.String({ minLength: 1, description: "Inline JavaScript statement body with unknown resource provenance. Normally async unless asyncByDefault:false; set async:true
|
|
348
|
+
workflowScript: Type.Optional(Type.String({ minLength: 1, description: "Inline JavaScript statement body with unknown resource provenance. Normally async unless asyncByDefault:false; set async:true for async workflows and async:false only when the parent must block. Use explicit return, top-level await, plain helper functions, or explicit Promise chains. Nested async function, arrow, and method helpers are rejected. Globals: runs, emit, console, and mission state when enabled. No filesystem, shell, Pi tools, or host globals except through runs.host." })),
|
|
347
349
|
workflowScriptPath: Type.Optional(Type.String({ minLength: 1, description: "Path to a JavaScript workflow file with unknown resource provenance. Mutually exclusive with workflowScript and workflow. Relative paths resolve against the request cwd. The host reads the file before the filesystem-free workflow sandbox starts." })),
|
|
348
350
|
globalConcurrencyLimit: Type.Optional(Type.Integer({ minimum: 1 })),
|
|
349
351
|
maxSubagentSpawnsPerRun: Type.Optional(Type.Integer({ minimum: 1 })),
|
|
@@ -351,6 +353,7 @@ const SubagentParamProperties = {
|
|
|
351
353
|
chatProgress: Type.Optional(Type.String({ enum: ["auto", "off", "live-card"], description: "WorkflowScript chat progress projection. auto shows a live in-chat card only for watched foreground workflows in the same Git repository; it is off otherwise. Explicit live-card requires same-repository async:false; async workflows should omit chatProgress or use auto/off." })),
|
|
352
354
|
isolation: Type.Optional(Type.String({ enum: ["none", "worktree"], description: "Workflow child isolation. none runs in the shared cwd; worktree requires managed git worktree isolation." })),
|
|
353
355
|
worktree: Type.Optional(Type.Boolean({ description: "Managed child isolation. true gives each workflow child a separate git worktree; an individual runs.run/runs.all item can override a workflow default with worktree:false." })),
|
|
356
|
+
baseRef: Type.Optional(Type.String()),
|
|
354
357
|
lane: Type.Optional(WorkflowLaneMetadata),
|
|
355
358
|
context: Type.Optional(Type.String({
|
|
356
359
|
enum: ["fresh", "fork", "profile"],
|
|
@@ -386,7 +389,7 @@ const SubagentParamProperties = {
|
|
|
386
389
|
outputSchema: Type.Optional(JsonSchemaObject),
|
|
387
390
|
agentContract: Type.Optional(AgentContractOverride),
|
|
388
391
|
acceptance: Type.Optional(AcceptanceOverride),
|
|
389
|
-
gate: Type.Optional(Type.String({ minLength: 1, description: "Host gate command. Cannot be combined with acceptance." })),
|
|
392
|
+
gate: Type.Optional(Type.String({ minLength: 1, description: "Host gate command. Cannot be combined with acceptance; an explicit acceptance of false is treated as omitted." })),
|
|
390
393
|
};
|
|
391
394
|
|
|
392
395
|
const SubagentParamsSchema = Type.Object(SubagentParamProperties);
|