@selesai/code 0.13.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/core/agent-session.d.ts +1 -1
- package/dist/core/agent-session.js +1 -1
- package/dist/core/sdk.d.ts +2 -2
- package/dist/core/sdk.js +1 -1
- package/dist/core/system-prompt.d.ts +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/extensions/ascii.txt +9 -0
- package/dist/extensions/package.json +1 -2
- package/dist/extensions/pi-hermes-memory/CHANGELOG.md +371 -0
- package/dist/extensions/pi-hermes-memory/LICENSE +21 -0
- package/dist/extensions/pi-hermes-memory/README.md +643 -0
- package/dist/extensions/pi-hermes-memory/docs/0.1/TASKS.md +197 -0
- package/dist/extensions/pi-hermes-memory/docs/0.2/PLAN.md +290 -0
- package/dist/extensions/pi-hermes-memory/docs/0.2/TASKS.md +134 -0
- package/dist/extensions/pi-hermes-memory/docs/0.2/TEST-PLAN.md +216 -0
- package/dist/extensions/pi-hermes-memory/docs/0.3/PLAN.md +330 -0
- package/dist/extensions/pi-hermes-memory/docs/0.3/TASKS.md +125 -0
- package/dist/extensions/pi-hermes-memory/docs/0.4/PLAN.md +160 -0
- package/dist/extensions/pi-hermes-memory/docs/0.4/TASKS.md +113 -0
- package/dist/extensions/pi-hermes-memory/docs/0.6/CHANGELOG.md +57 -0
- package/dist/extensions/pi-hermes-memory/docs/0.6/PLAN.md +202 -0
- package/dist/extensions/pi-hermes-memory/docs/0.6/TASKS.md +144 -0
- package/dist/extensions/pi-hermes-memory/docs/0.7/PLAN.md +349 -0
- package/dist/extensions/pi-hermes-memory/docs/0.7/TASKS.md +110 -0
- package/dist/extensions/pi-hermes-memory/docs/PUBLISHING.md +149 -0
- package/dist/extensions/pi-hermes-memory/docs/ROADMAP.md +468 -0
- package/dist/extensions/pi-hermes-memory/docs/images/memory-architecture.svg +1 -0
- package/dist/extensions/pi-hermes-memory/docs/images/pi-logo.svg +22 -0
- package/dist/extensions/pi-hermes-memory/docs/images/pi_memory.png +0 -0
- package/dist/extensions/pi-hermes-memory/docs/images/pi_memory.svg +19 -0
- package/dist/extensions/pi-hermes-memory/docs/images/security-flow.svg +1 -0
- package/dist/extensions/pi-hermes-memory/docs/images/session-lifecycle.svg +1 -0
- package/dist/extensions/pi-hermes-memory/docs/images/source-architecture.svg +1 -0
- package/dist/extensions/pi-hermes-memory/docs/mermaid/memory-architecture.mmd +49 -0
- package/dist/extensions/pi-hermes-memory/docs/mermaid/security-flow.mmd +40 -0
- package/dist/extensions/pi-hermes-memory/docs/mermaid/session-lifecycle.mmd +56 -0
- package/dist/extensions/pi-hermes-memory/docs/mermaid/source-architecture.mmd +54 -0
- package/dist/extensions/pi-hermes-memory/package-lock.json +3799 -0
- package/dist/extensions/pi-hermes-memory/package.json +66 -0
- package/dist/extensions/pi-hermes-memory/scripts/check-min-sdk.mjs +99 -0
- package/dist/extensions/pi-hermes-memory/scripts/ensure-dev.mjs +57 -0
- package/dist/extensions/pi-hermes-memory/src/auto-consolidation-warning.ts +6 -0
- package/dist/extensions/pi-hermes-memory/src/config.ts +178 -0
- package/dist/extensions/pi-hermes-memory/src/constants.ts +424 -0
- package/dist/extensions/pi-hermes-memory/src/extension-root-migration.ts +639 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/auto-consolidate.ts +401 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +297 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/child-process-watchdog.mjs +90 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/correction-detector.ts +300 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/index-sessions.ts +86 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/insights.ts +78 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/interview.ts +37 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/learn-memory.ts +186 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/message-parts.ts +27 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/pi-child-process.ts +485 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/preview-context.ts +105 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +506 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +145 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/session-flush.ts +151 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/session-live-index.ts +94 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/skills-command.ts +1334 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/standing-pin.ts +111 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/switch-project.ts +75 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +266 -0
- package/dist/extensions/pi-hermes-memory/src/index.ts +378 -0
- package/dist/extensions/pi-hermes-memory/src/lifecycle-timing.ts +54 -0
- package/dist/extensions/pi-hermes-memory/src/paths.ts +61 -0
- package/dist/extensions/pi-hermes-memory/src/project-context.ts +13 -0
- package/dist/extensions/pi-hermes-memory/src/project-memory-migration.ts +93 -0
- package/dist/extensions/pi-hermes-memory/src/project.ts +157 -0
- package/dist/extensions/pi-hermes-memory/src/prompt-context.ts +55 -0
- package/dist/extensions/pi-hermes-memory/src/store/atomic-lock-coordinator.ts +375 -0
- package/dist/extensions/pi-hermes-memory/src/store/canonical-storage-path.ts +54 -0
- package/dist/extensions/pi-hermes-memory/src/store/content-scanner.ts +101 -0
- package/dist/extensions/pi-hermes-memory/src/store/db.ts +1180 -0
- package/dist/extensions/pi-hermes-memory/src/store/fts-query.ts +101 -0
- package/dist/extensions/pi-hermes-memory/src/store/markdown-mutation-lock.ts +38 -0
- package/dist/extensions/pi-hermes-memory/src/store/memory-lookup.ts +24 -0
- package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +1191 -0
- package/dist/extensions/pi-hermes-memory/src/store/recovery-maintenance.ts +66 -0
- package/dist/extensions/pi-hermes-memory/src/store/schema.ts +118 -0
- package/dist/extensions/pi-hermes-memory/src/store/session-anchor-search.ts +472 -0
- package/dist/extensions/pi-hermes-memory/src/store/session-indexer.ts +511 -0
- package/dist/extensions/pi-hermes-memory/src/store/session-parser.ts +213 -0
- package/dist/extensions/pi-hermes-memory/src/store/session-search.ts +234 -0
- package/dist/extensions/pi-hermes-memory/src/store/skill-store.ts +950 -0
- package/dist/extensions/pi-hermes-memory/src/store/skill-utils.ts +133 -0
- package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +1002 -0
- package/dist/extensions/pi-hermes-memory/src/store/sqlite-native.ts +241 -0
- package/dist/extensions/pi-hermes-memory/src/store/standing-instructions.ts +247 -0
- package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +95 -0
- package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +469 -0
- package/dist/extensions/pi-hermes-memory/src/tools/session-search-tool.ts +246 -0
- package/dist/extensions/pi-hermes-memory/src/tools/shared-output-view.ts +170 -0
- package/dist/extensions/pi-hermes-memory/src/tools/skill-tool.ts +333 -0
- package/dist/extensions/pi-hermes-memory/src/tools/tool-result-views.ts +105 -0
- package/dist/extensions/pi-hermes-memory/src/types.ts +214 -0
- package/dist/extensions/pi-hermes-memory/tests/config.test.ts +434 -0
- package/dist/extensions/pi-hermes-memory/tests/extension-root-migration.test.ts +368 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/auto-consolidate.test.ts +984 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/background-review.test.ts +950 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/correction-detector.test.ts +671 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/insights.test.ts +157 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/interview.test.ts +127 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/pi-child-process.test.ts +905 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/preview-context.test.ts +152 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/prompt-context.test.ts +166 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/resources-discover.test.ts +71 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +614 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +192 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/session-flush.test.ts +677 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/session-live-index.test.ts +225 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/skills-command.test.ts +827 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/standing-pin.test.ts +134 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/sync-markdown-memories.test.ts +491 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/system-prompt.test.ts +199 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/thinking-max.test.ts +64 -0
- package/dist/extensions/pi-hermes-memory/tests/index.test.ts +30 -0
- package/dist/extensions/pi-hermes-memory/tests/integration/flow.test.ts +126 -0
- package/dist/extensions/pi-hermes-memory/tests/lifecycle-timing.test.ts +76 -0
- package/dist/extensions/pi-hermes-memory/tests/paths.test.ts +23 -0
- package/dist/extensions/pi-hermes-memory/tests/project-memory-migration.test.ts +80 -0
- package/dist/extensions/pi-hermes-memory/tests/project-rebinding.test.ts +115 -0
- package/dist/extensions/pi-hermes-memory/tests/project.test.ts +120 -0
- package/dist/extensions/pi-hermes-memory/tests/run-all-timeout.test.ts +107 -0
- package/dist/extensions/pi-hermes-memory/tests/run-all.sh +45 -0
- package/dist/extensions/pi-hermes-memory/tests/store/atomic-lock-coordinator.test.ts +381 -0
- package/dist/extensions/pi-hermes-memory/tests/store/content-scanner.test.ts +388 -0
- package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +1046 -0
- package/dist/extensions/pi-hermes-memory/tests/store/markdown-mutation-lock.test.ts +34 -0
- package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +2150 -0
- package/dist/extensions/pi-hermes-memory/tests/store/recovery-maintenance.test.ts +170 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-anchor-search.test.ts +210 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-indexer.test.ts +643 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-parser.test.ts +282 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-search.test.ts +287 -0
- package/dist/extensions/pi-hermes-memory/tests/store/skill-store.test.ts +678 -0
- package/dist/extensions/pi-hermes-memory/tests/store/skill-utils.test.ts +21 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-lazy-load.test.ts +78 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +543 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-native.test.ts +164 -0
- package/dist/extensions/pi-hermes-memory/tests/store/standing-instructions.test.ts +171 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +84 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/memory-tool.test.ts +709 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/session-search-tool.test.ts +345 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/shared-output-view.test.ts +362 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/skill-tool.test.ts +478 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/tool-result-renderer-wiring.test.ts +40 -0
- package/dist/extensions/pi-hermes-memory/tsconfig.json +19 -0
- package/dist/extensions/pi-subagents/.oxlintrc.json +43 -0
- package/dist/extensions/pi-subagents/AGENTS.md +5 -0
- package/dist/extensions/pi-subagents/CHANGELOG.md +157 -0
- package/dist/extensions/pi-subagents/README.md +12 -6
- package/dist/extensions/pi-subagents/VISION.md +81 -0
- package/dist/extensions/pi-subagents/agents/claude-code-writer.md +15 -0
- package/dist/extensions/pi-subagents/agents/claude-code.md +15 -0
- package/dist/extensions/pi-subagents/agents/codex-exec-writer.md +15 -0
- package/dist/extensions/pi-subagents/agents/codex-exec.md +15 -0
- package/dist/extensions/pi-subagents/agents/cursor-agent-writer.md +14 -0
- package/dist/extensions/pi-subagents/agents/cursor-agent.md +14 -0
- package/dist/extensions/pi-subagents/agents/reviewer.md +1 -3
- package/dist/extensions/pi-subagents/docs/agents.md +488 -0
- package/dist/extensions/pi-subagents/docs/configuration.md +46 -9
- package/dist/extensions/pi-subagents/docs/extension-api.md +42 -3
- package/dist/extensions/pi-subagents/docs/models.md +27 -4
- package/dist/extensions/pi-subagents/docs/observability.md +10 -9
- package/dist/extensions/pi-subagents/docs/tool-reference.md +102 -6
- package/dist/extensions/pi-subagents/docs/workflows.md +135 -0
- package/dist/extensions/pi-subagents/package-lock.json +389 -2
- package/dist/extensions/pi-subagents/package.json +3 -1
- package/dist/extensions/pi-subagents/prompts/review-loop.md +2 -2
- package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +1 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +3 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +7 -3
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -2
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +26 -5
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +41 -22
- package/dist/extensions/pi-subagents/src/agents/agent-refinements.ts +4 -4
- package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +9 -2
- package/dist/extensions/pi-subagents/src/agents/agents.ts +322 -75
- package/dist/extensions/pi-subagents/src/agents/builtin-names.ts +6 -0
- package/dist/extensions/pi-subagents/src/agents/runtime-agent-events.ts +70 -0
- package/dist/extensions/pi-subagents/src/agents/runtime-agent-registry.ts +27 -20
- package/dist/extensions/pi-subagents/src/api/agents.ts +10 -5
- package/dist/extensions/pi-subagents/src/api/background-work.ts +5 -1
- package/dist/extensions/pi-subagents/src/api/delegation.ts +0 -7
- package/dist/extensions/pi-subagents/src/api/preflight.ts +34 -12
- package/dist/extensions/pi-subagents/src/extension/config.ts +70 -0
- package/dist/extensions/pi-subagents/src/extension/doctor.ts +3 -3
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +5 -3
- package/dist/extensions/pi-subagents/src/extension/index.ts +83 -30
- package/dist/extensions/pi-subagents/src/extension/public-execution.ts +44 -15
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +55 -19
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +41 -15
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +28 -31
- package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +2 -1
- package/dist/extensions/pi-subagents/src/inspectors/herdr/inspector-runner.ts +2 -10
- package/dist/extensions/pi-subagents/src/inspectors/herdr/session-roots-codec.ts +42 -0
- package/dist/extensions/pi-subagents/src/integrations/herdr-status.ts +51 -3
- package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +2 -0
- package/dist/extensions/pi-subagents/src/profiles/profiles.ts +5 -6
- package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +77 -10
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +176 -53
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +19 -12
- package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +29 -27
- package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +20 -3
- package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +23 -261
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +73 -7
- package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +8 -3
- package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +74 -8
- package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +37 -21
- package/dist/extensions/pi-subagents/src/runs/background/inspect-rpc.ts +8 -8
- package/dist/extensions/pi-subagents/src/runs/background/notify.ts +184 -9
- package/dist/extensions/pi-subagents/src/runs/background/result-delivery-ownership.ts +45 -0
- package/dist/extensions/pi-subagents/src/runs/background/result-files.ts +28 -14
- package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +38 -15
- package/dist/extensions/pi-subagents/src/runs/background/resume-guidance.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +50 -13
- package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +93 -8
- package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +10 -4
- package/dist/extensions/pi-subagents/src/runs/background/steering.ts +4 -14
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +549 -377
- package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +58 -10
- package/dist/extensions/pi-subagents/src/runs/background/terminal-run-index.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +26 -1
- package/dist/extensions/pi-subagents/src/runs/background/wait-config.ts +23 -9
- package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +9 -2
- package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +2 -2
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +204 -129
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +9 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +23 -1
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +773 -311
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +140 -115
- package/dist/extensions/pi-subagents/src/runs/shared/abort-recovery.ts +119 -0
- package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +463 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +19 -4
- package/dist/extensions/pi-subagents/src/runs/shared/child-launch-plan.ts +151 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +21 -7
- package/dist/extensions/pi-subagents/src/runs/shared/claude-code-adapter.ts +129 -0
- package/dist/extensions/pi-subagents/src/runs/shared/codex-exec-adapter.ts +129 -0
- package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +89 -0
- package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +5 -4
- package/dist/extensions/pi-subagents/src/runs/shared/cursor-agent-adapter.ts +114 -0
- package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +3 -3
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-contract.ts +167 -0
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +122 -0
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-runner.ts +348 -55
- package/dist/extensions/pi-subagents/src/runs/shared/fast-mode-extension.ts +5 -5
- package/dist/extensions/pi-subagents/src/runs/shared/host-step-status.ts +230 -0
- package/dist/extensions/pi-subagents/src/runs/shared/lane-metadata.ts +105 -0
- package/dist/extensions/pi-subagents/src/runs/shared/launch-cwd.ts +16 -0
- package/dist/extensions/pi-subagents/src/runs/shared/long-running-guard.ts +2 -1
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-config-sources.ts +422 -0
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +221 -158
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-grant.ts +197 -0
- package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +69 -7
- package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +47 -6
- package/dist/extensions/pi-subagents/src/runs/shared/mutation-evidence.ts +7 -2
- package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +9 -3
- package/dist/extensions/pi-subagents/src/runs/shared/nested-render.ts +9 -5
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +419 -7
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +15 -1
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +81 -8
- package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +13 -0
- package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +21 -1
- package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +44 -4
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +98 -13
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +847 -0
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +18 -0
- package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +46 -0
- package/dist/extensions/pi-subagents/src/shared/extension-context.ts +24 -0
- package/dist/extensions/pi-subagents/src/shared/fork-context.ts +21 -0
- package/dist/extensions/pi-subagents/src/shared/formatters.ts +18 -3
- package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +5 -1
- package/dist/extensions/pi-subagents/src/shared/pruned-fork.ts +450 -0
- package/dist/extensions/pi-subagents/src/shared/session-file-trust.ts +19 -0
- package/dist/extensions/pi-subagents/src/shared/session-tokens.ts +14 -3
- package/dist/extensions/pi-subagents/src/shared/settings.ts +19 -105
- package/dist/extensions/pi-subagents/src/shared/shortcuts.ts +17 -0
- package/dist/extensions/pi-subagents/src/shared/types.ts +359 -40
- package/dist/extensions/pi-subagents/src/shared/utils.ts +41 -84
- package/dist/extensions/pi-subagents/src/shared/workflow-child-permit.ts +116 -0
- package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +1 -9
- package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +0 -4
- package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +1 -2
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +378 -88
- package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +22 -11
- package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +3 -0
- package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +147 -79
- package/dist/extensions/pi-subagents/src/tui/fleet-transcript.ts +11 -5
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +39 -18
- package/dist/extensions/pi-subagents/src/tui/render.ts +369 -46
- package/dist/extensions/pi-subagents/src/watchdog/turn-delta.ts +1 -1
- package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +6 -3
- package/dist/extensions/pi-subagents/src/workflows/host-command.ts +230 -0
- package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +740 -58
- package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +121 -0
- package/dist/extensions/pi-subagents/src/workflows/workflow-preflight.ts +270 -0
- package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +195 -6
- package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +246 -0
- package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +1114 -260
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +34 -0
- package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +150 -3
- package/dist/extensions/pi-subagents/test/integration/claude-code-smoke.test.ts +52 -0
- package/dist/extensions/pi-subagents/test/integration/claude-code-writer-smoke.test.ts +55 -0
- package/dist/extensions/pi-subagents/test/integration/codex-exec-smoke.test.ts +53 -0
- package/dist/extensions/pi-subagents/test/integration/codex-exec-writer-smoke.test.ts +57 -0
- package/dist/extensions/pi-subagents/test/integration/cursor-agent-smoke.test.ts +59 -0
- package/dist/extensions/pi-subagents/test/integration/cursor-agent-writer-smoke.test.ts +62 -0
- package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +57 -1
- package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +1 -0
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +20 -0
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +4 -3
- package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +54 -4
- package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +482 -4
- package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +157 -9
- package/dist/extensions/pi-subagents/test/integration/session-tokens.test.ts +5 -5
- package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +1508 -291
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +423 -1
- package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +8 -0
- package/dist/extensions/pi-subagents/test/support/cursor-smoke-inputs.ts +51 -0
- package/dist/extensions/pi-subagents/test/support/helpers.ts +2 -0
- package/dist/extensions/pi-subagents/test/support/mock-pi.ts +5 -5
- package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +6 -6
- package/dist/extensions/pi-subagents/test/unit/abort-recovery.test.ts +152 -0
- package/dist/extensions/pi-subagents/test/unit/active-async-capacity.test.ts +48 -0
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +184 -6
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +66 -6
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +77 -0
- package/dist/extensions/pi-subagents/test/unit/agent-refinements.test.ts +18 -0
- package/dist/extensions/pi-subagents/test/unit/anti-slop-oxlint.test.ts +86 -0
- package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +101 -1
- package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +121 -0
- package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +28 -0
- package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +14 -7
- package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +53 -0
- package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +190 -0
- package/dist/extensions/pi-subagents/test/unit/async-status-snapshot.test.ts +42 -0
- package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +8 -4
- package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +23 -0
- package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +78 -1
- package/dist/extensions/pi-subagents/test/unit/child-launch-plan.test.ts +94 -0
- package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +21 -0
- package/dist/extensions/pi-subagents/test/unit/child-session-name.test.ts +50 -0
- package/dist/extensions/pi-subagents/test/unit/claude-code-adapter.test.ts +245 -0
- package/dist/extensions/pi-subagents/test/unit/codex-exec-adapter.test.ts +192 -0
- package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +27 -0
- package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +150 -0
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +21 -0
- package/dist/extensions/pi-subagents/test/unit/cursor-agent-adapter.test.ts +259 -0
- package/dist/extensions/pi-subagents/test/unit/cursor-smoke-inputs.test.ts +77 -0
- package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +1 -4
- package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/extension-context.test.ts +27 -0
- package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +223 -0
- package/dist/extensions/pi-subagents/test/unit/fast-mode-extension.test.ts +27 -0
- package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +208 -2
- package/dist/extensions/pi-subagents/test/unit/fleet-transcript.test.ts +29 -1
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +110 -1
- package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +10 -0
- package/dist/extensions/pi-subagents/test/unit/formatters.test.ts +14 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +18 -9
- package/dist/extensions/pi-subagents/test/unit/herdr-session-roots-codec.test.ts +63 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-shell-command.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +132 -0
- package/dist/extensions/pi-subagents/test/unit/host-command.test.ts +156 -0
- package/dist/extensions/pi-subagents/test/unit/host-step-status.test.ts +98 -0
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +178 -26
- package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +2 -1
- package/dist/extensions/pi-subagents/test/unit/inspect-rpc.test.ts +21 -0
- package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-grant.test.ts +138 -0
- package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +91 -0
- package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +72 -7
- package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +21 -0
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +1 -0
- package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +20 -2
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +129 -1
- package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +4 -0
- package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +358 -0
- package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +574 -21
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +109 -1
- package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +71 -1
- package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +7 -7
- package/dist/extensions/pi-subagents/test/unit/pruned-fork.test.ts +214 -0
- package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +29 -8
- package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +53 -0
- package/dist/extensions/pi-subagents/test/unit/result-delivery-ownership.test.ts +34 -0
- package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +101 -3
- package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +1 -0
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +10 -8
- package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +71 -1
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +41 -7
- package/dist/extensions/pi-subagents/test/unit/runtime-agent-registration.test.ts +136 -2
- package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +137 -0
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +33 -12
- package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +504 -1
- package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +8 -0
- package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +12 -1
- package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +3 -5
- package/dist/extensions/pi-subagents/test/unit/steering.test.ts +5 -6
- package/dist/extensions/pi-subagents/test/unit/subagent-action-recovery.test.ts +0 -8
- package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +5 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +157 -2
- package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +63 -4
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +27 -23
- package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +44 -0
- package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +1 -0
- package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +7 -5
- package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +106 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +484 -9
- package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +38 -4
- package/dist/extensions/pi-subagents/test/unit/workflow-preflight.test.ts +155 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +318 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-resume-hint.test.ts +365 -0
- package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +349 -0
- package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +21 -0
- package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +2 -7
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/effect/index.ts +13 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/effect/rules/no-service-constructor-imports.ts +52 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/index.ts +41 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-chained-type-assertions.ts +77 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-conditional-empty-object-spread.ts +49 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-known-value-widening.ts +247 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-module-mocking.ts +91 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-object-parameters.ts +126 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-reflect-apply.ts +28 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-reflect-get.ts +28 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-runtime-typeof.ts +67 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-shape-in-symbol-names.ts +39 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unknown-parameters.ts +83 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unknown-returns.ts +115 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unknown-type-aliases.ts +72 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unsafe-dictionary-type.ts +134 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-widen-then-assert.ts +366 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/require-safety-comment-for-type-assertion.ts +62 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/shared/dictionary-types.ts +502 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/shared/lexical-type-parameters.ts +60 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/shared/reflect-method.ts +35 -0
- package/dist/extensions/pi-tool-display/tests/capabilities.test.ts +1 -1
- package/dist/extensions/pi-tool-display/tests/settings-inspector.test.ts +2 -2
- package/dist/extensions/pi-tool-display/tests/tool-overrides-mcp.test.ts +1 -1
- package/dist/modes/interactive/interactive-mode.js +7 -7
- package/dist/skills/workflow/SKILL.md +65 -50
- package/package.json +112 -110
- package/dist/extensions/enable-readonly-tools.test.ts +0 -63
- package/dist/extensions/enable-readonly-tools.ts +0 -24
- package/dist/extensions/model-prompt-injector/config.json +0 -16
- package/dist/extensions/model-prompt-injector/index.test.ts +0 -102
- package/dist/extensions/model-prompt-injector/index.ts +0 -148
- package/dist/extensions/pi-subagents/src/runs/shared/turn-budget.ts +0 -98
- package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +0 -250
|
@@ -9,7 +9,10 @@ import {
|
|
|
9
9
|
type NestedPathEntry,
|
|
10
10
|
} from "./nested-path.ts";
|
|
11
11
|
import {
|
|
12
|
-
|
|
12
|
+
formatUnresolvedMcpDirectToolSelectors,
|
|
13
|
+
resolveMcpDirectToolResolution,
|
|
14
|
+
type McpConfig,
|
|
15
|
+
type McpRuntimeSnapshotHost,
|
|
13
16
|
type ResolvedMcpDirectToolSelection,
|
|
14
17
|
} from "./mcp-direct-tool-allowlist.ts";
|
|
15
18
|
import { resolvePiPackageRoot } from "./pi-spawn.ts";
|
|
@@ -45,7 +48,7 @@ import {
|
|
|
45
48
|
encodeChildWatchdogConfig,
|
|
46
49
|
type ChildWatchdogConfig,
|
|
47
50
|
} from "../../watchdog/child-status.ts";
|
|
48
|
-
import { WAIT_TOOL_ENABLED_ENV } from "../background/wait-config.ts";
|
|
51
|
+
import { WAIT_TOOL_DEFAULT_TIMEOUT_MS_ENV, WAIT_TOOL_ENABLED_ENV } from "../background/wait-config.ts";
|
|
49
52
|
import {
|
|
50
53
|
SELESAI_CODING_AGENT_PACKAGE_ROOT_ENV,
|
|
51
54
|
getAgentDir,
|
|
@@ -141,6 +144,7 @@ export const SUBAGENT_STEER_CAPABILITY_ENV = "SELESAI_SUBAGENT_STEER_CAPABILITY"
|
|
|
141
144
|
export const SUBAGENT_STEER_ACK_DIR_ENV = "SELESAI_SUBAGENT_STEER_ACK_DIR";
|
|
142
145
|
export const PI_INTERCOM_STABLE_ID_ENV = "PI_INTERCOM_STABLE_ID";
|
|
143
146
|
export const PI_INTERCOM_SESSION_ID_ENV = "PI_INTERCOM_SESSION_ID";
|
|
147
|
+
export const SUBAGENT_INHERIT_GLOBAL_CONTEXT_ENV = "SELESAI_SUBAGENT_INHERIT_GLOBAL_CONTEXT";
|
|
144
148
|
|
|
145
149
|
export interface BuildPiArgsInput {
|
|
146
150
|
parentSessionId?: string;
|
|
@@ -153,6 +157,7 @@ export interface BuildPiArgsInput {
|
|
|
153
157
|
thinking?: string | false;
|
|
154
158
|
systemPromptMode?: "append" | "replace";
|
|
155
159
|
inheritProjectContext: boolean;
|
|
160
|
+
inheritGlobalContext: boolean;
|
|
156
161
|
inheritSkills: boolean;
|
|
157
162
|
requireReadTool?: boolean;
|
|
158
163
|
tools?: string[];
|
|
@@ -160,9 +165,16 @@ export interface BuildPiArgsInput {
|
|
|
160
165
|
subagentOnlyExtensions?: string[];
|
|
161
166
|
systemPrompt?: string | null;
|
|
162
167
|
mcpDirectTools?: string[];
|
|
168
|
+
mcpConfig?: McpConfig;
|
|
169
|
+
runtimeServerNames?: string[];
|
|
163
170
|
cwd?: string;
|
|
164
171
|
promptFileStem?: string;
|
|
165
172
|
intercomSessionName?: string;
|
|
173
|
+
/** Human-readable display name for the child session (agent + task excerpt,
|
|
174
|
+
* derived by the caller). Passed to the child as PI_SUBAGENT_SESSION_NAME;
|
|
175
|
+
* the prompt runtime applies it via pi.setSessionName unless an intercom
|
|
176
|
+
* target takes precedence. */
|
|
177
|
+
sessionName?: string;
|
|
166
178
|
orchestratorIntercomTarget?: string;
|
|
167
179
|
runId?: string;
|
|
168
180
|
childAgentName?: string;
|
|
@@ -199,9 +211,12 @@ export interface BuildPiArgsInput {
|
|
|
199
211
|
*/
|
|
200
212
|
taskDelivery?: SubagentTaskDelivery;
|
|
201
213
|
waitToolEnabled?: boolean;
|
|
214
|
+
waitToolDefaultTimeoutMs?: number;
|
|
215
|
+
allowNestedSubagents?: boolean;
|
|
202
216
|
capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
|
|
203
217
|
thinkingCeiling?: import("../../shared/model-info.ts").ThinkingLevel;
|
|
204
218
|
extensionBindings?: ExtensionBindings;
|
|
219
|
+
runtimeSnapshotHost?: McpRuntimeSnapshotHost;
|
|
205
220
|
}
|
|
206
221
|
|
|
207
222
|
export interface BuildPiArgsResult {
|
|
@@ -275,9 +290,12 @@ function resolveFastModeExtension(input: Pick<ResolvePiLaunchToolPlanInput, "fas
|
|
|
275
290
|
|
|
276
291
|
export interface ResolvePiLaunchToolPlanInput {
|
|
277
292
|
tools?: string[];
|
|
293
|
+
allowNestedSubagents?: boolean;
|
|
278
294
|
extensions?: string[];
|
|
279
295
|
subagentOnlyExtensions?: string[];
|
|
280
296
|
mcpDirectTools?: string[];
|
|
297
|
+
mcpConfig?: McpConfig;
|
|
298
|
+
runtimeServerNames?: string[];
|
|
281
299
|
cwd?: string;
|
|
282
300
|
requireReadTool?: boolean;
|
|
283
301
|
structuredOutput?:
|
|
@@ -294,6 +312,7 @@ export interface ResolvePiLaunchToolPlanInput {
|
|
|
294
312
|
inheritedCapabilityCeiling?: ResolvedSubagentCapabilityCeiling;
|
|
295
313
|
agentName?: string;
|
|
296
314
|
permissionRules?: PermissionRules;
|
|
315
|
+
runtimeSnapshotHost?: McpRuntimeSnapshotHost;
|
|
297
316
|
}
|
|
298
317
|
|
|
299
318
|
export interface PiLaunchToolPlan {
|
|
@@ -316,6 +335,8 @@ export interface PiLaunchToolPlan {
|
|
|
316
335
|
capabilityAudit?: SubagentCapabilityAudit;
|
|
317
336
|
/** Non-fatal launch warnings; they do not change behavior. */
|
|
318
337
|
warnings: string[];
|
|
338
|
+
mcpConfig?: McpConfig;
|
|
339
|
+
runtimeServerNames?: string[];
|
|
319
340
|
}
|
|
320
341
|
|
|
321
342
|
function extensionIdentifier(value: string): string {
|
|
@@ -337,6 +358,21 @@ function hasPermissionRules(rules: PermissionRules | undefined): boolean {
|
|
|
337
358
|
return rules !== undefined && Object.keys(rules).length > 0;
|
|
338
359
|
}
|
|
339
360
|
|
|
361
|
+
function filterRuntimeMcpConfig(
|
|
362
|
+
config: McpConfig,
|
|
363
|
+
runtimeServerNames: readonly string[],
|
|
364
|
+
effectiveRuntimeServerNames: readonly string[],
|
|
365
|
+
): McpConfig {
|
|
366
|
+
const runtimeNames = new Set(runtimeServerNames);
|
|
367
|
+
const effectiveNames = new Set(effectiveRuntimeServerNames);
|
|
368
|
+
return {
|
|
369
|
+
...config,
|
|
370
|
+
mcpServers: Object.fromEntries(
|
|
371
|
+
Object.entries(config.mcpServers).filter(([name]) => !runtimeNames.has(name) || effectiveNames.has(name)),
|
|
372
|
+
),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
|
|
340
376
|
export function projectLaunchResolvedChildExtensions(
|
|
341
377
|
toolPlan: Pick<
|
|
342
378
|
PiLaunchToolPlan,
|
|
@@ -453,7 +489,10 @@ export function resolvePiLaunchToolPlan(
|
|
|
453
489
|
? ["read", ...requestedBuiltinTools]
|
|
454
490
|
: requestedBuiltinTools
|
|
455
491
|
).filter((tool) => !allowedToolSet || allowedToolSet.has(tool));
|
|
456
|
-
const fanoutAuthorized = declaredBuiltinTools.includes("subagent")
|
|
492
|
+
const fanoutAuthorized = declaredBuiltinTools.includes("subagent") || (
|
|
493
|
+
input.allowNestedSubagents === true &&
|
|
494
|
+
(!allowedToolSet || allowedToolSet.has("subagent"))
|
|
495
|
+
);
|
|
457
496
|
const toolExtensionPaths: string[] = capabilityCeiling?.denyExtensions
|
|
458
497
|
? []
|
|
459
498
|
: (input.tools ?? []).filter(
|
|
@@ -461,15 +500,27 @@ export function resolvePiLaunchToolPlan(
|
|
|
461
500
|
!requestedBuiltinTools.includes(tool) &&
|
|
462
501
|
(tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js")),
|
|
463
502
|
);
|
|
464
|
-
const
|
|
465
|
-
? []
|
|
466
|
-
:
|
|
503
|
+
const mcpResolution = capabilityCeiling?.denyExtensions
|
|
504
|
+
? { selections: [], unresolvedSelectors: [] }
|
|
505
|
+
: resolveMcpDirectToolResolution(input.mcpDirectTools, input.cwd, input.runtimeSnapshotHost, input.mcpConfig);
|
|
506
|
+
if (mcpResolution.unresolvedSelectors.length > 0) {
|
|
507
|
+
throw new Error(formatUnresolvedMcpDirectToolSelectors(mcpResolution.unresolvedSelectors));
|
|
508
|
+
}
|
|
509
|
+
const resolvedMcpSelections = mcpResolution.selections;
|
|
467
510
|
const effectiveMcpSelections = resolvedMcpSelections.filter(
|
|
468
511
|
(selection) => !allowedToolSet || allowedToolSet.has(selection.name),
|
|
469
512
|
);
|
|
470
513
|
const effectiveMcpTools = effectiveMcpSelections.map(
|
|
471
514
|
(selection) => selection.name,
|
|
472
515
|
);
|
|
516
|
+
const runtimeServerNames = mcpResolution.runtimeServerNames ?? input.runtimeServerNames ?? [];
|
|
517
|
+
const effectiveRuntimeServerNames = runtimeServerNames.filter((serverName) =>
|
|
518
|
+
effectiveMcpSelections.some((selection) => selection.selector.startsWith(`${serverName}/`)),
|
|
519
|
+
);
|
|
520
|
+
const effectiveMcpConfig = mcpResolution.mcpConfig ?? input.mcpConfig;
|
|
521
|
+
const filteredMcpConfig = effectiveMcpConfig
|
|
522
|
+
? filterRuntimeMcpConfig(effectiveMcpConfig, runtimeServerNames, effectiveRuntimeServerNames)
|
|
523
|
+
: undefined;
|
|
473
524
|
const explicitToolAllowlist =
|
|
474
525
|
input.tools !== undefined ||
|
|
475
526
|
(input.mcpDirectTools?.length ?? 0) > 0 ||
|
|
@@ -605,6 +656,9 @@ export function resolvePiLaunchToolPlan(
|
|
|
605
656
|
extensionArgs,
|
|
606
657
|
disableAmbientExtensions,
|
|
607
658
|
warnings,
|
|
659
|
+
...(effectiveRuntimeServerNames.length > 0 && filteredMcpConfig
|
|
660
|
+
? { mcpConfig: filteredMcpConfig, runtimeServerNames: effectiveRuntimeServerNames }
|
|
661
|
+
: {}),
|
|
608
662
|
...(capabilityAudit ? { capabilityAudit } : {}),
|
|
609
663
|
};
|
|
610
664
|
}
|
|
@@ -641,9 +695,12 @@ export function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {
|
|
|
641
695
|
|
|
642
696
|
const toolPlan = resolvePiLaunchToolPlan({
|
|
643
697
|
tools: input.tools,
|
|
698
|
+
allowNestedSubagents: input.allowNestedSubagents,
|
|
644
699
|
extensions: input.extensions,
|
|
645
700
|
subagentOnlyExtensions: input.subagentOnlyExtensions,
|
|
646
701
|
mcpDirectTools: input.mcpDirectTools,
|
|
702
|
+
mcpConfig: input.mcpConfig,
|
|
703
|
+
runtimeServerNames: input.runtimeServerNames,
|
|
647
704
|
cwd: input.cwd,
|
|
648
705
|
requireReadTool: input.requireReadTool,
|
|
649
706
|
structuredOutput: input.structuredOutput,
|
|
@@ -656,6 +713,7 @@ export function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {
|
|
|
656
713
|
),
|
|
657
714
|
agentName: input.childAgentName,
|
|
658
715
|
permissionRules: input.permissionRules,
|
|
716
|
+
runtimeSnapshotHost: input.runtimeSnapshotHost,
|
|
659
717
|
});
|
|
660
718
|
if (toolPlan.explicitToolAllowlist) {
|
|
661
719
|
args.push(
|
|
@@ -669,6 +727,14 @@ export function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {
|
|
|
669
727
|
}
|
|
670
728
|
for (const extPath of toolPlan.extensionArgs)
|
|
671
729
|
args.push("--extension", extPath);
|
|
730
|
+
let tempDir: string | undefined;
|
|
731
|
+
if (toolPlan.mcpConfig && toolPlan.runtimeServerNames?.length) {
|
|
732
|
+
if (!tempDir)
|
|
733
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagent-"));
|
|
734
|
+
const mcpConfigPath = path.join(tempDir, "mcp-config.json");
|
|
735
|
+
fs.writeFileSync(mcpConfigPath, JSON.stringify(toolPlan.mcpConfig, null, 2), { mode: 0o600 });
|
|
736
|
+
args.push("--mcp-config", mcpConfigPath);
|
|
737
|
+
}
|
|
672
738
|
|
|
673
739
|
if (!input.inheritProjectContext) {
|
|
674
740
|
args.push("--no-context-files");
|
|
@@ -677,9 +743,9 @@ export function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {
|
|
|
677
743
|
args.push("--no-skills");
|
|
678
744
|
}
|
|
679
745
|
|
|
680
|
-
let tempDir: string | undefined;
|
|
681
746
|
if (input.systemPrompt !== undefined && input.systemPrompt !== null) {
|
|
682
|
-
|
|
747
|
+
if (!tempDir)
|
|
748
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagent-"));
|
|
683
749
|
const stem = (input.promptFileStem ?? "prompt").replace(/[^\w.-]/g, "_");
|
|
684
750
|
const promptPath = path.join(tempDir, `${stem}.md`);
|
|
685
751
|
// Inject <active_agent> tag so @gotgenes/pi-permission-system can
|
|
@@ -741,6 +807,9 @@ export function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {
|
|
|
741
807
|
if (input.waitToolEnabled !== undefined) {
|
|
742
808
|
env[WAIT_TOOL_ENABLED_ENV] = input.waitToolEnabled ? "true" : "false";
|
|
743
809
|
}
|
|
810
|
+
if (input.waitToolDefaultTimeoutMs !== undefined) {
|
|
811
|
+
env[WAIT_TOOL_DEFAULT_TIMEOUT_MS_ENV] = String(input.waitToolDefaultTimeoutMs);
|
|
812
|
+
}
|
|
744
813
|
const inheritedNestedRoute = Boolean(
|
|
745
814
|
process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] &&
|
|
746
815
|
process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] &&
|
|
@@ -818,11 +887,15 @@ export function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {
|
|
|
818
887
|
? "1"
|
|
819
888
|
: "0";
|
|
820
889
|
env.SELESAI_SUBAGENT_INHERIT_SKILLS = input.inheritSkills ? "1" : "0";
|
|
890
|
+
env[SUBAGENT_INHERIT_GLOBAL_CONTEXT_ENV] = input.inheritGlobalContext ? "1" : "0";
|
|
821
891
|
env[PI_INTERCOM_STABLE_ID_ENV] = input.intercomSessionName || undefined;
|
|
822
892
|
env[PI_INTERCOM_SESSION_ID_ENV] = undefined;
|
|
823
893
|
if (input.intercomSessionName) {
|
|
824
894
|
env.SELESAI_SUBAGENT_INTERCOM_SESSION_NAME = input.intercomSessionName;
|
|
825
895
|
}
|
|
896
|
+
if (input.sessionName?.trim()) {
|
|
897
|
+
env.PI_SUBAGENT_SESSION_NAME = input.sessionName.trim();
|
|
898
|
+
}
|
|
826
899
|
if (input.orchestratorIntercomTarget) {
|
|
827
900
|
env[SUBAGENT_ORCHESTRATOR_TARGET_ENV] = input.orchestratorIntercomTarget;
|
|
828
901
|
}
|
|
@@ -2,6 +2,19 @@ export function formatProcessSignalError(signal: string): string {
|
|
|
2
2
|
return `Subagent process terminated by signal ${signal}.`;
|
|
3
3
|
}
|
|
4
4
|
|
|
5
|
+
export function formatMidToolExitError(input: {
|
|
6
|
+
toolName: string;
|
|
7
|
+
exitCode: number | null;
|
|
8
|
+
processSignal?: string | null;
|
|
9
|
+
}): string {
|
|
10
|
+
const terminal = [`exit ${input.exitCode ?? "unknown"}`, ...(input.processSignal ? [`signal ${input.processSignal}`] : [])].join(", ");
|
|
11
|
+
return `Subagent process exited during '${input.toolName}' tool execution (${terminal}) before the tool completed. Earlier assistant output is not a terminal result.`;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function isOrdinaryToolForMidToolExit(toolName: string): boolean {
|
|
15
|
+
return toolName !== "intercom" && toolName !== "contact_supervisor";
|
|
16
|
+
}
|
|
17
|
+
|
|
5
18
|
export function isUnexplainedProcessSignal(input: {
|
|
6
19
|
processSignal?: string | null;
|
|
7
20
|
interrupted?: boolean;
|
|
@@ -2,6 +2,9 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import * as fs from "node:fs";
|
|
3
3
|
import * as path from "node:path";
|
|
4
4
|
import { getAgentDir } from "../../shared/utils.ts";
|
|
5
|
+
import { isUnexplainedProcessSignal } from "./process-signal.ts";
|
|
6
|
+
|
|
7
|
+
export type RunOutcome = "completed" | "failed" | "timed_out" | "stopped" | "interrupted";
|
|
5
8
|
|
|
6
9
|
export interface RunEntry {
|
|
7
10
|
agent: string;
|
|
@@ -9,6 +12,7 @@ export interface RunEntry {
|
|
|
9
12
|
taskHash?: string;
|
|
10
13
|
ts: number;
|
|
11
14
|
status: "ok" | "error";
|
|
15
|
+
outcome?: RunOutcome;
|
|
12
16
|
duration: number;
|
|
13
17
|
exit?: number;
|
|
14
18
|
}
|
|
@@ -129,14 +133,30 @@ function appendPrivateHistoryLine(historyPath: string, line: string): void {
|
|
|
129
133
|
}
|
|
130
134
|
}
|
|
131
135
|
|
|
132
|
-
export function recordRun(
|
|
136
|
+
export function recordRun(
|
|
137
|
+
agent: string,
|
|
138
|
+
task: string,
|
|
139
|
+
exitCode: number,
|
|
140
|
+
durationMs: number,
|
|
141
|
+
terminal: { interrupted?: boolean; processSignal?: string | null; stopped?: boolean; timedOut?: boolean; turnBudgetExceeded?: boolean } = {},
|
|
142
|
+
): void {
|
|
133
143
|
try {
|
|
144
|
+
const outcome: RunOutcome = terminal.stopped
|
|
145
|
+
? "stopped"
|
|
146
|
+
: terminal.interrupted
|
|
147
|
+
? "interrupted"
|
|
148
|
+
: terminal.timedOut
|
|
149
|
+
? "timed_out"
|
|
150
|
+
: exitCode !== 0 && isUnexplainedProcessSignal(terminal)
|
|
151
|
+
? "stopped"
|
|
152
|
+
: exitCode === 0 ? "completed" : "failed";
|
|
134
153
|
const entry: RunEntry = {
|
|
135
154
|
agent,
|
|
136
155
|
task: REDACTED_TASK,
|
|
137
156
|
taskHash: hashTask(task),
|
|
138
157
|
ts: Math.floor(Date.now() / 1000),
|
|
139
158
|
status: exitCode === 0 ? "ok" : "error",
|
|
159
|
+
outcome,
|
|
140
160
|
duration: durationMs,
|
|
141
161
|
...(exitCode !== 0 ? { exit: exitCode } : {}),
|
|
142
162
|
};
|
|
@@ -96,6 +96,23 @@ function formatOutputPathInstruction(outputPath: string, capabilities?: OutputIn
|
|
|
96
96
|
].join("\n");
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
+
export function requestedOutputPathFromTask(task: string): string | undefined {
|
|
100
|
+
for (const line of task.split(/\r?\n/).reverse()) {
|
|
101
|
+
const match = line.match(/^\s*(?:Write your findings to(?: exactly this path)?:|The runtime will persist it to exactly this path:)\s*(.+?)\s*$/i);
|
|
102
|
+
if (!match?.[1]) continue;
|
|
103
|
+
const requested = match[1].trim();
|
|
104
|
+
return requested.startsWith("`") && requested.endsWith("`") ? requested.slice(1, -1) : requested;
|
|
105
|
+
}
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function outputPathMappingFromTask(task: string, savedPath: string | undefined): { requestedPath: string; savedPath: string } | undefined {
|
|
110
|
+
const requestedPath = requestedOutputPathFromTask(task);
|
|
111
|
+
if (!requestedPath || !savedPath) return undefined;
|
|
112
|
+
if (path.isAbsolute(requestedPath) && path.normalize(requestedPath) === path.normalize(savedPath)) return undefined;
|
|
113
|
+
return { requestedPath, savedPath };
|
|
114
|
+
}
|
|
115
|
+
|
|
99
116
|
export function injectSingleOutputInstruction(task: string, outputPath: string | undefined, capabilities?: OutputInstructionCapabilities): string {
|
|
100
117
|
if (!outputPath) return task;
|
|
101
118
|
return `${task}\n\n---\n**Output:**\n${formatOutputPathInstruction(outputPath, capabilities)}`;
|
|
@@ -144,6 +161,23 @@ export function validateFileOnlyOutputMode(outputMode: OutputMode | undefined, o
|
|
|
144
161
|
return undefined;
|
|
145
162
|
}
|
|
146
163
|
|
|
164
|
+
export function resolveSingleOutputClaimPath(outputPath: string): string {
|
|
165
|
+
let existing = path.resolve(outputPath);
|
|
166
|
+
const missingSegments: string[] = [];
|
|
167
|
+
while (!fs.existsSync(existing)) {
|
|
168
|
+
missingSegments.unshift(path.basename(existing));
|
|
169
|
+
const parent = path.dirname(existing);
|
|
170
|
+
if (parent === existing) break;
|
|
171
|
+
existing = parent;
|
|
172
|
+
}
|
|
173
|
+
return path.join(fs.realpathSync(existing), ...missingSegments);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function outputClaimError(outputPath: string, expectedClaimPath: string | undefined): string | undefined {
|
|
177
|
+
if (expectedClaimPath && resolveSingleOutputClaimPath(outputPath) !== expectedClaimPath) return "Output path changed after it was claimed.";
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
|
|
147
181
|
export function captureSingleOutputSnapshot(outputPath: string | undefined): SingleOutputSnapshot | undefined {
|
|
148
182
|
if (!outputPath) return undefined;
|
|
149
183
|
try {
|
|
@@ -158,9 +192,12 @@ export function captureSingleOutputSnapshot(outputPath: string | undefined): Sin
|
|
|
158
192
|
function persistSingleOutput(
|
|
159
193
|
outputPath: string | undefined,
|
|
160
194
|
fullOutput: string,
|
|
161
|
-
|
|
195
|
+
expectedClaimPath?: string,
|
|
196
|
+
): { savedPath?: string; error?: string; fatalError?: boolean } {
|
|
162
197
|
if (!outputPath) return {};
|
|
163
198
|
try {
|
|
199
|
+
const claimError = outputClaimError(outputPath, expectedClaimPath);
|
|
200
|
+
if (claimError) return { error: claimError, fatalError: true };
|
|
164
201
|
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
165
202
|
fs.writeFileSync(outputPath, fullOutput, "utf-8");
|
|
166
203
|
return { savedPath: outputPath };
|
|
@@ -173,8 +210,11 @@ export function resolveSingleOutput(
|
|
|
173
210
|
outputPath: string | undefined,
|
|
174
211
|
fallbackOutput: string,
|
|
175
212
|
beforeRun: SingleOutputSnapshot | undefined,
|
|
176
|
-
|
|
213
|
+
expectedClaimPath?: string,
|
|
214
|
+
): { fullOutput: string; savedPath?: string; saveError?: string; fatalError?: boolean } {
|
|
177
215
|
if (!outputPath) return { fullOutput: fallbackOutput };
|
|
216
|
+
const claimError = outputClaimError(outputPath, expectedClaimPath);
|
|
217
|
+
if (claimError) return { fullOutput: fallbackOutput, saveError: claimError, fatalError: true };
|
|
178
218
|
|
|
179
219
|
let changedSinceStart = false;
|
|
180
220
|
try {
|
|
@@ -203,9 +243,9 @@ export function resolveSingleOutput(
|
|
|
203
243
|
}
|
|
204
244
|
}
|
|
205
245
|
|
|
206
|
-
const save = persistSingleOutput(outputPath, fallbackOutput);
|
|
246
|
+
const save = persistSingleOutput(outputPath, fallbackOutput, expectedClaimPath);
|
|
207
247
|
if (save.savedPath) return { fullOutput: fallbackOutput, savedPath: save.savedPath };
|
|
208
|
-
return { fullOutput: fallbackOutput, saveError: save.error };
|
|
248
|
+
return { fullOutput: fallbackOutput, saveError: save.error, ...(save.fatalError ? { fatalError: true } : {}) };
|
|
209
249
|
}
|
|
210
250
|
|
|
211
251
|
export function finalizeSingleOutput(params: {
|
|
@@ -6,7 +6,7 @@ import { registerNativeSupervisorClient } from "../../intercom/native-supervisor
|
|
|
6
6
|
import { shouldUseNativeFsWatch } from "../../shared/watch-strategy.ts";
|
|
7
7
|
import { decodePermissionRules, permissionDecision, PERMISSION_AUDIT_PATH_ENV, PERMISSION_POLICY_ENV } from "./permissions.ts";
|
|
8
8
|
import { consumeSteerRequestsFromDir, MAX_STEER_QUEUE_SIZE, steerAckPathFromDir, writeSteerAckAt, writeSteerCapabilityAt, writeSteerRequestToDir, type SteerDeliveryStatus, type SteerRequest } from "../background/control-channel.ts";
|
|
9
|
-
import { SUBAGENT_CHILD_AGENT_ENV, SUBAGENT_CHILD_INDEX_ENV, SUBAGENT_FANOUT_CHILD_ENV, SUBAGENT_STEER_ACK_DIR_ENV, SUBAGENT_STEER_CAPABILITY_ENV, SUBAGENT_STEER_INBOX_ENV } from "./pi-args.ts";
|
|
9
|
+
import { SUBAGENT_CHILD_AGENT_ENV, SUBAGENT_CHILD_INDEX_ENV, SUBAGENT_FANOUT_CHILD_ENV, SUBAGENT_INHERIT_GLOBAL_CONTEXT_ENV, SUBAGENT_STEER_ACK_DIR_ENV, SUBAGENT_STEER_CAPABILITY_ENV, SUBAGENT_STEER_INBOX_ENV } from "./pi-args.ts";
|
|
10
10
|
import { RUNTIME_EXTENSION_ACK_EVENT, RUNTIME_EXTENSION_ACK_PATH_ENV, isRuntimeAcknowledgedExtensionId, writeRuntimeAcknowledgedExtensions } from "./runtime-acknowledged-extensions.ts";
|
|
11
11
|
import { createStructuredOutputToolParameters, STRUCTURED_OUTPUT_ACCEPTANCE_CAPTURE_ENV, STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV, validateStructuredOutputValue } from "./structured-output.ts";
|
|
12
12
|
import {
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
import { TOOL_BUDGET_ENV, TOOL_BUDGET_ZERO_AUTH_ENV, decodeToolBudgetEnv, shouldBlockToolForBudget, toolBudgetBlockedMessage, toolBudgetSoftNudge } from "./tool-budget.ts";
|
|
21
21
|
import type { JsonSchemaObject, ResolvedToolBudget, SubagentState } from "../../shared/types.ts";
|
|
22
22
|
import { resolveCurrentSessionId } from "../../shared/session-identity.ts";
|
|
23
|
-
import { resolveWatchPath } from "../../shared/utils.ts";
|
|
23
|
+
import { getAgentDir, resolveWatchPath } from "../../shared/utils.ts";
|
|
24
24
|
import { registerChildWatchdog } from "../../watchdog/register-child.ts";
|
|
25
25
|
import { CHILD_WATCHDOG_CONFIG_ENV, decodeChildWatchdogConfig } from "../../watchdog/child-status.ts";
|
|
26
26
|
import { requestWatchdogPermission, type WatchdogPermissionRequest, type WatchdogPermissionResult } from "../../watchdog/permission-arbiter.ts";
|
|
@@ -32,6 +32,9 @@ import { drainOutstandingWork } from "../background/auto-drain.ts";
|
|
|
32
32
|
const SUBAGENT_INHERIT_PROJECT_CONTEXT_ENV = "SELESAI_SUBAGENT_INHERIT_PROJECT_CONTEXT";
|
|
33
33
|
const SUBAGENT_INHERIT_SKILLS_ENV = "SELESAI_SUBAGENT_INHERIT_SKILLS";
|
|
34
34
|
export const SUBAGENT_INTERCOM_SESSION_NAME_ENV = "SELESAI_SUBAGENT_INTERCOM_SESSION_NAME";
|
|
35
|
+
/** Human-readable child display name (agent + task excerpt) set by the parent
|
|
36
|
+
* at launch; applied via pi.setSessionName when no intercom target exists. */
|
|
37
|
+
export const SUBAGENT_SESSION_NAME_ENV = "PI_SUBAGENT_SESSION_NAME";
|
|
35
38
|
const STEERING_LEGACY_SETTLE_FALLBACK_MS = 1000;
|
|
36
39
|
const STEERING_SAFETY_POLL_INTERVAL_MS = 5000;
|
|
37
40
|
|
|
@@ -68,7 +71,8 @@ const PARENT_ONLY_CUSTOM_MESSAGE_TYPES = new Set([
|
|
|
68
71
|
"subagent-control-notice",
|
|
69
72
|
]);
|
|
70
73
|
const SUBAGENT_ORCHESTRATION_SKILL_NAME_PATTERN = /<name>\s*pi-subagents\s*<\/name>/;
|
|
71
|
-
const
|
|
74
|
+
const PROJECT_CONTEXT_XML_HEADER = "\n\n<project_context>\n\n";
|
|
75
|
+
const PROJECT_CONTEXT_LEGACY_HEADER = "\n\n# Project Context\n\nProject-specific instructions and guidelines:\n\n";
|
|
72
76
|
const SKILLS_HEADER = "\n\nThe following skills provide specialized instructions for specific tasks.";
|
|
73
77
|
const DATE_HEADER = "\nCurrent date:";
|
|
74
78
|
|
|
@@ -148,10 +152,80 @@ function findSectionEnd(prompt: string, startIndex: number, nextHeaders: string[
|
|
|
148
152
|
}
|
|
149
153
|
|
|
150
154
|
export function stripProjectContext(prompt: string): string {
|
|
151
|
-
const
|
|
152
|
-
if (
|
|
153
|
-
|
|
154
|
-
|
|
155
|
+
const xmlStartIndex = prompt.indexOf(PROJECT_CONTEXT_XML_HEADER);
|
|
156
|
+
if (xmlStartIndex !== -1) {
|
|
157
|
+
const closingTag = "</project_context>";
|
|
158
|
+
const closingIndex = prompt.indexOf(closingTag, xmlStartIndex + PROJECT_CONTEXT_XML_HEADER.length);
|
|
159
|
+
if (closingIndex !== -1) {
|
|
160
|
+
return `${prompt.slice(0, xmlStartIndex)}${prompt.slice(closingIndex + closingTag.length)}`;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const legacyStartIndex = prompt.indexOf(PROJECT_CONTEXT_LEGACY_HEADER);
|
|
164
|
+
if (legacyStartIndex === -1) return prompt;
|
|
165
|
+
const endIndex = findSectionEnd(prompt, legacyStartIndex + PROJECT_CONTEXT_LEGACY_HEADER.length, [SKILLS_HEADER, DATE_HEADER]);
|
|
166
|
+
return `${prompt.slice(0, legacyStartIndex)}${prompt.slice(endIndex)}`;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const GLOBAL_CONTEXT_FILE_NAMES = new Set(["agents.md", "agents.override.md", "claude.md"]);
|
|
170
|
+
|
|
171
|
+
function canonicalDirectory(dir: string): string {
|
|
172
|
+
try {
|
|
173
|
+
return fs.realpathSync(dir);
|
|
174
|
+
} catch {
|
|
175
|
+
return path.resolve(dir);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function expandContextPath(filePath: string): string {
|
|
180
|
+
const home = process.env.HOME ?? process.env.USERPROFILE;
|
|
181
|
+
return filePath === "~"
|
|
182
|
+
? home ?? filePath
|
|
183
|
+
: /^~[\\/]/.test(filePath)
|
|
184
|
+
? path.join(home ?? "~", filePath.slice(2))
|
|
185
|
+
: filePath;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function isContextFilePath(filePath: string): boolean {
|
|
189
|
+
return GLOBAL_CONTEXT_FILE_NAMES.has(path.basename(expandContextPath(filePath)).toLowerCase());
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function isGlobalContextFile(filePath: string): boolean {
|
|
193
|
+
const expanded = expandContextPath(filePath);
|
|
194
|
+
if (!isContextFilePath(filePath)) return false;
|
|
195
|
+
return canonicalDirectory(path.dirname(expanded)) === canonicalDirectory(getAgentDir());
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function stripGlobalInstructionsFromXmlContext(context: string): string {
|
|
199
|
+
const block = /<project_instructions\s+path=(["'])(.*?)\1\s*>[\s\S]*?<\/project_instructions>\s*/gi;
|
|
200
|
+
return context.replace(block, (match, _quote: string, filePath: string) => isGlobalContextFile(filePath) ? "" : match);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function stripGlobalInstructionsFromLegacyContext(context: string): string {
|
|
204
|
+
const sections = [...context.matchAll(/^## ([^\r\n]+)(?:\r?\n|$)/gm)]
|
|
205
|
+
.filter((match) => isContextFilePath(match[1]!.trim()));
|
|
206
|
+
let rewritten = "";
|
|
207
|
+
let cursor = 0;
|
|
208
|
+
for (let index = 0; index < sections.length; index++) {
|
|
209
|
+
const section = sections[index]!;
|
|
210
|
+
const start = section.index!;
|
|
211
|
+
const end = sections[index + 1]?.index ?? context.length;
|
|
212
|
+
rewritten += context.slice(cursor, start);
|
|
213
|
+
if (!isGlobalContextFile(section[1]!.trim())) rewritten += context.slice(start, end);
|
|
214
|
+
cursor = end;
|
|
215
|
+
}
|
|
216
|
+
return `${rewritten}${context.slice(cursor)}`;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export function stripGlobalContext(prompt: string): string {
|
|
220
|
+
const rewrittenXml = prompt.replace(/<project_context>[\s\S]*?<\/project_context>/gi, (context) => {
|
|
221
|
+
const rewritten = stripGlobalInstructionsFromXmlContext(context);
|
|
222
|
+
return /<project_instructions\b/i.test(rewritten) ? rewritten : "";
|
|
223
|
+
});
|
|
224
|
+
const legacyStartIndex = rewrittenXml.indexOf(PROJECT_CONTEXT_LEGACY_HEADER);
|
|
225
|
+
if (legacyStartIndex === -1) return rewrittenXml;
|
|
226
|
+
const legacyEndIndex = findSectionEnd(rewrittenXml, legacyStartIndex + PROJECT_CONTEXT_LEGACY_HEADER.length, [SKILLS_HEADER, DATE_HEADER]);
|
|
227
|
+
const legacyContext = rewrittenXml.slice(legacyStartIndex, legacyEndIndex);
|
|
228
|
+
return `${rewrittenXml.slice(0, legacyStartIndex)}${stripGlobalInstructionsFromLegacyContext(legacyContext)}${rewrittenXml.slice(legacyEndIndex)}`;
|
|
155
229
|
}
|
|
156
230
|
|
|
157
231
|
export function stripInheritedSkills(prompt: string): string {
|
|
@@ -177,12 +251,15 @@ function stripChildBoundaryInstructions(prompt: string): string {
|
|
|
177
251
|
|
|
178
252
|
export function rewriteSubagentPrompt(
|
|
179
253
|
prompt: string,
|
|
180
|
-
options: { inheritProjectContext: boolean; inheritSkills: boolean; fanoutChild?: boolean },
|
|
254
|
+
options: { inheritProjectContext: boolean; inheritGlobalContext: boolean; inheritSkills: boolean; fanoutChild?: boolean },
|
|
181
255
|
): string {
|
|
182
256
|
let rewritten = prompt;
|
|
183
257
|
if (!options.inheritProjectContext) {
|
|
184
258
|
rewritten = stripProjectContext(rewritten);
|
|
185
259
|
}
|
|
260
|
+
if (!options.inheritGlobalContext) {
|
|
261
|
+
rewritten = stripGlobalContext(rewritten);
|
|
262
|
+
}
|
|
186
263
|
if (!options.inheritSkills) {
|
|
187
264
|
rewritten = stripInheritedSkills(rewritten);
|
|
188
265
|
}
|
|
@@ -214,6 +291,7 @@ const PORTABLE_TOOL_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;
|
|
|
214
291
|
const MAX_PORTABLE_TOOL_ID_LENGTH = 64;
|
|
215
292
|
const COMPOSITE_TOOL_ID_APIS = new Set([
|
|
216
293
|
"azure-openai-responses",
|
|
294
|
+
"cursor-native",
|
|
217
295
|
"openai-completions",
|
|
218
296
|
"openai-responses",
|
|
219
297
|
]);
|
|
@@ -597,7 +675,7 @@ export default function registerSubagentPromptRuntime(pi: ExtensionAPI): void {
|
|
|
597
675
|
registerPermissionGate(pi);
|
|
598
676
|
registerToolBudget(pi, decodeToolBudgetEnv(process.env[TOOL_BUDGET_ENV], { allowZero: process.env[TOOL_BUDGET_ZERO_AUTH_ENV] === "1" }));
|
|
599
677
|
registerChildWatchdog(pi);
|
|
600
|
-
const
|
|
678
|
+
const waitToolConfig = resolveWaitToolConfig();
|
|
601
679
|
const waitState = {
|
|
602
680
|
baseCwd: "",
|
|
603
681
|
currentSessionId: null,
|
|
@@ -612,7 +690,7 @@ export default function registerSubagentPromptRuntime(pi: ExtensionAPI): void {
|
|
|
612
690
|
watcherRestartTimer: null,
|
|
613
691
|
resultFileCoalescer: { schedule: () => false, clear: () => {} },
|
|
614
692
|
} as unknown as SubagentState;
|
|
615
|
-
if (typeof pi.registerTool === "function") registerWaitTool(pi, waitState,
|
|
693
|
+
if (typeof pi.registerTool === "function") registerWaitTool(pi, waitState, waitToolConfig.enabled, undefined, waitToolConfig.defaultTimeoutMs);
|
|
616
694
|
let nativeSupervisorClientRegistered = false;
|
|
617
695
|
const registerNativeSupervisorClientOnce = (): void => {
|
|
618
696
|
if (nativeSupervisorClientRegistered) return;
|
|
@@ -682,18 +760,25 @@ export default function registerSubagentPromptRuntime(pi: ExtensionAPI): void {
|
|
|
682
760
|
onRuntimeEvent("before_agent_start", async (event: unknown) => {
|
|
683
761
|
if (!event || typeof event !== "object" || !("systemPrompt" in event) || typeof event.systemPrompt !== "string") return undefined;
|
|
684
762
|
registerNativeSupervisorClientOnce();
|
|
763
|
+
// The intercom target is a routing address and always wins; the display
|
|
764
|
+
// name (agent + task excerpt, computed by the parent at launch) only
|
|
765
|
+
// applies when the bridge is not addressing this child.
|
|
685
766
|
const intercomSessionName = process.env[SUBAGENT_INTERCOM_SESSION_NAME_ENV]?.trim();
|
|
686
|
-
|
|
687
|
-
|
|
767
|
+
const displaySessionName = process.env[SUBAGENT_SESSION_NAME_ENV]?.trim();
|
|
768
|
+
const childSessionName = intercomSessionName || displaySessionName;
|
|
769
|
+
if (childSessionName && typeof pi.setSessionName === "function") {
|
|
770
|
+
pi.setSessionName(childSessionName);
|
|
688
771
|
}
|
|
689
772
|
|
|
690
773
|
const inheritProjectContext = readBooleanEnv(SUBAGENT_INHERIT_PROJECT_CONTEXT_ENV);
|
|
774
|
+
const inheritGlobalContext = readBooleanEnv(SUBAGENT_INHERIT_GLOBAL_CONTEXT_ENV);
|
|
691
775
|
const inheritSkills = readBooleanEnv(SUBAGENT_INHERIT_SKILLS_ENV);
|
|
692
776
|
const fanoutChild = readBooleanEnv(SUBAGENT_FANOUT_CHILD_ENV);
|
|
693
777
|
let rewritten = event.systemPrompt;
|
|
694
|
-
if (inheritProjectContext !== undefined || inheritSkills !== undefined || fanoutChild !== undefined) {
|
|
778
|
+
if (inheritProjectContext !== undefined || inheritGlobalContext !== undefined || inheritSkills !== undefined || fanoutChild !== undefined) {
|
|
695
779
|
rewritten = rewriteSubagentPrompt(event.systemPrompt, {
|
|
696
780
|
inheritProjectContext: inheritProjectContext ?? true,
|
|
781
|
+
inheritGlobalContext: inheritGlobalContext ?? true,
|
|
697
782
|
inheritSkills: inheritSkills ?? true,
|
|
698
783
|
fanoutChild: fanoutChild === true,
|
|
699
784
|
});
|
|
@@ -40,7 +40,7 @@ export function formatSubagentExtensionConflictError(
|
|
|
40
40
|
const settings = JSON.stringify({
|
|
41
41
|
subagents: { agentOverrides: { [input.agent]: { extensions: [] } } },
|
|
42
42
|
});
|
|
43
|
-
return `${error}\n\nSubagent startup loaded conflicting ambient Pi extensions. Retry this run after disabling ambient extension discovery for agent ${JSON.stringify(input.agent)} in project .
|
|
43
|
+
return `${error}\n\nSubagent startup loaded conflicting ambient Pi extensions. Retry this run after disabling ambient extension discovery for agent ${JSON.stringify(input.agent)} in project .selesai/settings.json: ${settings}. Replace the empty array with only the required extension entry paths when this agent needs extension tools.`;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
function hasUsage(usage: Usage): boolean {
|