@duckmind/dm-windows-x64 0.61.4 → 0.61.9
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/dm.exe +0 -0
- package/extensions/.dm-extensions.json +211 -67
- package/extensions/dm-subagents/agents/claude-code-writer.md +15 -0
- package/extensions/dm-subagents/agents/claude-code.md +15 -0
- package/extensions/dm-subagents/agents/codex-exec-writer.md +15 -0
- package/extensions/dm-subagents/agents/codex-exec.md +15 -0
- package/extensions/dm-subagents/agents/cursor-agent-writer.md +14 -0
- package/extensions/dm-subagents/agents/cursor-agent.md +14 -0
- package/extensions/dm-subagents/agents/delegate.md +3 -2
- package/extensions/dm-subagents/agents/oracle.md +10 -5
- package/extensions/dm-subagents/agents/researcher.md +2 -2
- package/extensions/dm-subagents/agents/reviewer.md +17 -7
- package/extensions/dm-subagents/agents/scout.md +5 -5
- package/extensions/dm-subagents/agents/worker.md +6 -2
- package/extensions/dm-subagents/async-retention-discovery-worker.mjs +167 -0
- package/extensions/dm-subagents/index.js +4 -0
- package/extensions/dm-subagents/inspector-runner.mjs +10 -0
- package/extensions/dm-subagents/install.mjs +3 -2
- package/extensions/dm-subagents/package.json +2 -2
- package/extensions/dm-subagents/prompts/council.md +60 -0
- package/extensions/dm-subagents/prompts/parallel-review.md +5 -1
- package/extensions/dm-subagents/prompts/review-loop.md +13 -7
- package/extensions/dm-subagents/skills/council-mode/SKILL.md +59 -0
- package/extensions/dm-subagents/skills/council-mode/references/pass-contracts.md +150 -0
- package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +96 -911
- package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +70 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +539 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +161 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +51 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +295 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/review-and-validation.md +73 -0
- package/extensions/dm-subagents/src/agents/agent-management.js +716 -484
- package/extensions/dm-subagents/src/agents/agent-refinements.js +563 -0
- package/extensions/dm-subagents/src/agents/agent-serializer.js +70 -5
- package/extensions/dm-subagents/src/agents/agents.js +1447 -299
- package/extensions/dm-subagents/src/agents/builtin-names.js +15 -0
- package/extensions/dm-subagents/src/agents/chain-serializer.js +12 -7
- package/extensions/dm-subagents/src/agents/frontmatter.js +64 -14
- package/extensions/dm-subagents/src/agents/identity.js +1 -1
- package/extensions/dm-subagents/src/agents/proactive-skills.js +14 -11
- package/extensions/dm-subagents/src/agents/runtime-agent-events.js +49 -0
- package/extensions/dm-subagents/src/agents/runtime-agent-registry.js +412 -0
- package/extensions/dm-subagents/src/agents/skills.js +52 -35
- package/extensions/dm-subagents/src/api/agents.js +6 -0
- package/extensions/dm-subagents/src/api/background-work.js +151 -0
- package/extensions/dm-subagents/src/api/capability-ceiling.js +12 -0
- package/extensions/dm-subagents/src/api/control-channel.js +3 -0
- package/extensions/dm-subagents/src/api/delegation.js +5 -0
- package/extensions/dm-subagents/src/api/dm-args.js +3 -0
- package/extensions/dm-subagents/src/api/external-job-provider.js +137 -0
- package/extensions/dm-subagents/src/api/external-runs.js +233 -0
- package/extensions/dm-subagents/src/api/intercom-bridge.js +3 -0
- package/extensions/dm-subagents/src/api/preflight.js +322 -0
- package/extensions/dm-subagents/src/api/project-panes.js +11 -0
- package/extensions/dm-subagents/src/api/shared-types.js +4 -0
- package/extensions/dm-subagents/src/extension/config.js +175 -0
- package/extensions/dm-subagents/src/extension/control-notices.js +4 -43
- package/extensions/dm-subagents/src/extension/doctor.js +71 -17
- package/extensions/dm-subagents/src/extension/fanout-child.js +49 -32
- package/extensions/dm-subagents/src/extension/index.js +711 -265
- package/extensions/dm-subagents/src/extension/public-execution.js +114 -0
- package/extensions/dm-subagents/src/extension/rpc.js +427 -22
- package/extensions/dm-subagents/src/extension/schemas.js +158 -65
- package/extensions/dm-subagents/src/extension/steering-notices.js +23 -0
- package/extensions/dm-subagents/src/extension/subagent-guide.js +31 -0
- package/extensions/dm-subagents/src/extension/tool-description.js +92 -74
- package/extensions/dm-subagents/src/extension/tool-result.js +7 -0
- package/extensions/dm-subagents/src/inspectors/herdr/actions.js +218 -0
- package/extensions/dm-subagents/src/inspectors/herdr/client.js +123 -0
- package/extensions/dm-subagents/src/inspectors/herdr/focus.js +47 -0
- package/extensions/dm-subagents/src/inspectors/herdr/inspector-runner.js +160 -0
- package/extensions/dm-subagents/src/inspectors/herdr/project-panes.js +618 -0
- package/extensions/dm-subagents/src/inspectors/herdr/session-roots-codec.js +21 -0
- package/extensions/dm-subagents/src/inspectors/herdr/shell-command.js +15 -0
- package/extensions/dm-subagents/src/integrations/herdr-status.js +377 -0
- package/extensions/dm-subagents/src/intercom/intercom-bridge.js +17 -13
- package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +371 -79
- package/extensions/dm-subagents/src/intercom/result-intercom.js +47 -7
- package/extensions/dm-subagents/src/missions/actions.js +394 -0
- package/extensions/dm-subagents/src/missions/goal-driver.js +149 -0
- package/extensions/dm-subagents/src/missions/lifecycle.js +331 -0
- package/extensions/dm-subagents/src/missions/store.js +548 -0
- package/extensions/dm-subagents/src/missions/types.js +9 -0
- package/extensions/dm-subagents/src/missions/workflow-state.js +245 -0
- package/extensions/dm-subagents/src/policy/authority.js +37 -0
- package/extensions/dm-subagents/src/profiles/profiles.js +36 -18
- package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +427 -0
- package/extensions/dm-subagents/src/runs/background/active-run-index.js +122 -0
- package/extensions/dm-subagents/src/runs/background/async-execution.js +925 -137
- package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +515 -148
- package/extensions/dm-subagents/src/runs/background/async-resume.js +378 -51
- package/extensions/dm-subagents/src/runs/background/async-retention.js +828 -0
- package/extensions/dm-subagents/src/runs/background/async-status-snapshot.js +31 -0
- package/extensions/dm-subagents/src/runs/background/async-status.js +259 -22
- package/extensions/dm-subagents/src/runs/background/auto-drain.js +46 -0
- package/extensions/dm-subagents/src/runs/background/chain-append.js +50 -15
- package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +67 -12
- package/extensions/dm-subagents/src/runs/background/completion-batcher.js +5 -1
- package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +3 -11
- package/extensions/dm-subagents/src/runs/background/completion-replay.js +245 -0
- package/extensions/dm-subagents/src/runs/background/control-channel.js +423 -36
- package/extensions/dm-subagents/src/runs/background/fleet-view.js +132 -59
- package/extensions/dm-subagents/src/runs/background/index-segment.js +38 -0
- package/extensions/dm-subagents/src/runs/background/inspect-rpc.js +373 -0
- package/extensions/dm-subagents/src/runs/background/notify.js +357 -57
- package/extensions/dm-subagents/src/runs/background/owned-process-tree.js +86 -0
- package/extensions/dm-subagents/src/runs/background/process-terminal.js +269 -0
- package/extensions/dm-subagents/src/runs/background/result-delivery-ownership.js +34 -0
- package/extensions/dm-subagents/src/runs/background/result-files.js +469 -0
- package/extensions/dm-subagents/src/runs/background/result-watcher.js +540 -75
- package/extensions/dm-subagents/src/runs/background/resume-guidance.js +44 -0
- package/extensions/dm-subagents/src/runs/background/retained-children.js +119 -0
- package/extensions/dm-subagents/src/runs/background/run-id-query.js +5 -0
- package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +93 -9
- package/extensions/dm-subagents/src/runs/background/run-status.js +303 -32
- package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +784 -376
- package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +75 -34
- package/extensions/dm-subagents/src/runs/background/steering.js +221 -0
- package/extensions/dm-subagents/src/runs/background/subagent-runner.js +3106 -844
- package/extensions/dm-subagents/src/runs/background/subagent-wait.js +529 -0
- package/extensions/dm-subagents/src/runs/background/terminal-run-index.js +106 -0
- package/extensions/dm-subagents/src/runs/background/top-level-async.js +1 -1
- package/extensions/dm-subagents/src/runs/background/wait-completions.js +155 -0
- package/extensions/dm-subagents/src/runs/background/wait-config.js +46 -0
- package/extensions/dm-subagents/src/runs/background/wait-subscriptions.js +278 -0
- package/extensions/dm-subagents/src/runs/background/wait-tool.js +47 -0
- package/extensions/dm-subagents/src/runs/foreground/async-dismiss-action.js +81 -0
- package/extensions/dm-subagents/src/runs/foreground/async-steering-action.js +245 -0
- package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +74 -0
- package/extensions/dm-subagents/src/runs/foreground/execution.js +1401 -342
- package/extensions/dm-subagents/src/runs/foreground/foreground-control.js +133 -0
- package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +148 -0
- package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +139 -0
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +4278 -1441
- package/extensions/dm-subagents/src/runs/foreground/workflow-detach-reconcile.js +278 -0
- package/extensions/dm-subagents/src/runs/foreground/workflow-foreground-steering.js +155 -0
- package/extensions/dm-subagents/src/runs/shared/abort-recovery.js +97 -0
- package/extensions/dm-subagents/src/runs/shared/acceptance.js +597 -148
- package/extensions/dm-subagents/src/runs/shared/agent-contract.js +35 -0
- package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +472 -0
- package/extensions/dm-subagents/src/runs/shared/background-process-options.js +6 -0
- package/extensions/dm-subagents/src/runs/shared/capability-ceiling.js +175 -0
- package/extensions/dm-subagents/src/runs/shared/child-identity.js +32 -0
- package/extensions/dm-subagents/src/runs/shared/child-launch-plan.js +65 -0
- package/extensions/dm-subagents/src/runs/shared/child-protocol.js +447 -0
- package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +120 -0
- package/extensions/dm-subagents/src/runs/shared/codex-exec-adapter.js +129 -0
- package/extensions/dm-subagents/src/runs/shared/completion-evidence.js +40 -0
- package/extensions/dm-subagents/src/runs/shared/completion-guard.js +140 -83
- package/extensions/dm-subagents/src/runs/shared/context-mode.js +38 -0
- package/extensions/dm-subagents/src/runs/shared/cursor-agent-adapter.js +101 -0
- package/extensions/dm-subagents/src/runs/shared/dm-args.js +445 -72
- package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +27 -16
- package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +19 -6
- package/extensions/dm-subagents/src/runs/shared/extension-bindings.js +81 -0
- package/extensions/dm-subagents/src/runs/shared/external-cli-contract.js +134 -0
- package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +98 -0
- package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +419 -0
- package/extensions/dm-subagents/src/runs/shared/external-job-bridge.js +404 -0
- package/extensions/dm-subagents/src/runs/shared/external-job-runner.js +334 -0
- package/extensions/dm-subagents/src/runs/shared/fast-mode-extension.js +8 -0
- package/extensions/dm-subagents/src/runs/shared/host-step-status.js +228 -0
- package/extensions/dm-subagents/src/runs/shared/lane-metadata.js +104 -0
- package/extensions/dm-subagents/src/runs/shared/launch-cwd.js +17 -0
- package/extensions/dm-subagents/src/runs/shared/llm-intent-arbiter.js +190 -0
- package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +48 -3
- package/extensions/dm-subagents/src/runs/shared/mcp-config-sources.js +387 -0
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +212 -137
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-grant.js +131 -0
- package/extensions/dm-subagents/src/runs/shared/model-exclusions.js +207 -0
- package/extensions/dm-subagents/src/runs/shared/model-fallback.js +225 -55
- package/extensions/dm-subagents/src/runs/shared/model-scope.js +85 -28
- package/extensions/dm-subagents/src/runs/shared/mutation-evidence.js +182 -0
- package/extensions/dm-subagents/src/runs/shared/nested-events.js +264 -102
- package/extensions/dm-subagents/src/runs/shared/nested-render.js +15 -5
- package/extensions/dm-subagents/src/runs/shared/orca-progress-tabs.js +505 -0
- package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +653 -0
- package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +29 -12
- package/extensions/dm-subagents/src/runs/shared/permissions.js +108 -0
- package/extensions/dm-subagents/src/runs/shared/process-signal.js +13 -0
- package/extensions/dm-subagents/src/runs/shared/run-fanout-budget.js +257 -0
- package/extensions/dm-subagents/src/runs/shared/run-history.js +133 -13
- package/extensions/dm-subagents/src/runs/shared/runtime-acknowledged-extensions.js +62 -0
- package/extensions/dm-subagents/src/runs/shared/session-lease.js +225 -0
- package/extensions/dm-subagents/src/runs/shared/single-output.js +129 -27
- package/extensions/dm-subagents/src/runs/shared/spawn-budget.js +95 -0
- package/extensions/dm-subagents/src/runs/shared/structured-output.js +129 -10
- package/extensions/dm-subagents/src/runs/shared/subagent-control.js +66 -11
- package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +548 -70
- package/extensions/dm-subagents/src/runs/shared/subagent-startup-retry.js +50 -0
- package/extensions/dm-subagents/src/runs/shared/task-intent.js +130 -0
- package/extensions/dm-subagents/src/runs/shared/tool-availability.js +59 -0
- package/extensions/dm-subagents/src/runs/shared/tool-budget.js +7 -5
- package/extensions/dm-subagents/src/runs/shared/tool-timeout.js +64 -0
- package/extensions/dm-subagents/src/runs/shared/usage-budget.js +74 -0
- package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +22 -0
- package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +721 -0
- package/extensions/dm-subagents/src/runs/shared/worktree.js +168 -19
- package/extensions/dm-subagents/src/shared/accessible-dir.js +35 -0
- package/extensions/dm-subagents/src/shared/agent-stream-options.js +3 -0
- package/extensions/dm-subagents/src/shared/artifacts.js +170 -11
- package/extensions/dm-subagents/src/shared/atomic-json.js +36 -38
- package/extensions/dm-subagents/src/shared/capacity-resilient-json.js +77 -0
- package/extensions/dm-subagents/src/shared/child-session-name.js +15 -0
- package/extensions/dm-subagents/src/shared/child-transcript.js +57 -2
- package/extensions/dm-subagents/src/shared/completion-owner.js +7 -0
- package/extensions/dm-subagents/src/shared/display-text.js +142 -0
- package/extensions/dm-subagents/src/shared/extension-context.js +17 -0
- package/extensions/dm-subagents/src/shared/file-coalescer.js +9 -0
- package/extensions/dm-subagents/src/shared/file-system-retry.js +56 -0
- package/extensions/dm-subagents/src/shared/fork-context.js +96 -33
- package/extensions/dm-subagents/src/shared/formatters.js +21 -7
- package/extensions/dm-subagents/src/shared/launch-contract.js +94 -0
- package/extensions/dm-subagents/src/shared/model-info.js +10 -5
- package/extensions/dm-subagents/src/shared/node-executable.js +19 -0
- package/extensions/dm-subagents/src/shared/prompt-resources.js +10 -0
- package/extensions/dm-subagents/src/shared/pruned-fork.js +427 -0
- package/extensions/dm-subagents/src/shared/session-file-trust.js +19 -0
- package/extensions/dm-subagents/src/shared/session-tokens.js +14 -3
- package/extensions/dm-subagents/src/shared/settings.js +39 -47
- package/extensions/dm-subagents/src/shared/shortcuts.js +16 -0
- package/extensions/dm-subagents/src/shared/status-format.js +9 -2
- package/extensions/dm-subagents/src/shared/thinking-ceiling.js +41 -0
- package/extensions/dm-subagents/src/shared/types.js +47 -7
- package/extensions/dm-subagents/src/shared/utf8.js +12 -0
- package/extensions/dm-subagents/src/shared/utils.js +151 -131
- package/extensions/dm-subagents/src/shared/watch-strategy.js +3 -0
- package/extensions/dm-subagents/src/shared/workflow-child-permit.js +84 -0
- package/extensions/dm-subagents/src/slash/delegation-adapters.js +274 -0
- package/extensions/dm-subagents/src/slash/delegation-json.js +113 -0
- package/extensions/dm-subagents/src/slash/delegation-request.js +152 -0
- package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +294 -243
- package/extensions/dm-subagents/src/slash/prompt-workflows.js +35 -73
- package/extensions/dm-subagents/src/slash/selector.js +101 -0
- package/extensions/dm-subagents/src/slash/slash-bridge.js +17 -1
- package/extensions/dm-subagents/src/slash/slash-commands.js +722 -732
- package/extensions/dm-subagents/src/slash/slash-live-state.js +37 -19
- package/extensions/dm-subagents/src/slash/subagents-admin.js +410 -0
- package/extensions/dm-subagents/src/tui/fleet-status.js +824 -0
- package/extensions/dm-subagents/src/tui/fleet-transcript.js +479 -0
- package/extensions/dm-subagents/src/tui/fleet.js +1326 -0
- package/extensions/dm-subagents/src/tui/render-helpers.js +22 -0
- package/extensions/dm-subagents/src/tui/render.js +1511 -261
- package/extensions/dm-subagents/src/watchdog/change-signature.js +220 -0
- package/extensions/dm-subagents/src/watchdog/child-status.js +151 -0
- package/extensions/dm-subagents/src/watchdog/emission-guard.js +90 -0
- package/extensions/dm-subagents/src/watchdog/lsp-diagnostics.js +484 -0
- package/extensions/dm-subagents/src/watchdog/model-selection.js +154 -0
- package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +138 -0
- package/extensions/dm-subagents/src/watchdog/register-child.js +112 -0
- package/extensions/dm-subagents/src/watchdog/register-main.js +419 -0
- package/extensions/dm-subagents/src/watchdog/render.js +54 -0
- package/extensions/dm-subagents/src/watchdog/review.js +251 -0
- package/extensions/dm-subagents/src/watchdog/runtime.js +803 -0
- package/extensions/dm-subagents/src/watchdog/scope.js +56 -0
- package/extensions/dm-subagents/src/watchdog/settings.js +515 -0
- package/extensions/dm-subagents/src/watchdog/tool-actions.js +151 -0
- package/extensions/dm-subagents/src/watchdog/turn-delta.js +169 -0
- package/extensions/dm-subagents/src/watchdog/types.js +29 -0
- package/extensions/dm-subagents/src/watchdog/warning-format.js +58 -0
- package/extensions/dm-subagents/src/workflows/chat-progress.js +116 -0
- package/extensions/dm-subagents/src/workflows/host-command.js +227 -0
- package/extensions/dm-subagents/src/workflows/scripted-workflow.js +2011 -0
- package/extensions/dm-subagents/src/workflows/workflow-child-summary.js +116 -0
- package/extensions/dm-subagents/src/workflows/workflow-preflight.js +243 -0
- package/extensions/dm-subagents/src/workflows/workflow-receipt.js +387 -0
- package/extensions/dm-subagents/src/workflows/workflow-settlement.js +189 -0
- package/package.json +4 -3
- package/extensions/dm-fff/package.json +0 -21
- package/extensions/dm-fff/src/index.js +0 -691
- package/extensions/dm-fff/src/query.js +0 -60
- package/extensions/dm-subagents/agents/context-builder.md +0 -46
- package/extensions/dm-subagents/agents/planner.md +0 -55
- package/extensions/dm-subagents/prompts/parallel-context-build.md +0 -55
- package/extensions/dm-subagents/prompts/parallel-handoff-plan.md +0 -61
- package/extensions/dm-subagents/src/runs/background/wait.js +0 -206
- package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +0 -1013
- package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +0 -981
- package/extensions/dm-subagents/src/runs/shared/turn-budget.js +0 -50
|
@@ -1,33 +1,79 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
1
2
|
import * as fs from "node:fs";
|
|
2
3
|
import * as os from "node:os";
|
|
3
4
|
import * as path from "node:path";
|
|
4
5
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
|
|
6
|
+
import {
|
|
7
|
+
encodeNestedPathEnv,
|
|
8
|
+
parseNestedPathEnv
|
|
9
|
+
} from "./nested-path.js";
|
|
10
|
+
import {
|
|
11
|
+
formatUnresolvedMcpDirectToolSelectors,
|
|
12
|
+
resolveMcpDirectToolResolution
|
|
13
|
+
} from "./mcp-direct-tool-allowlist.js";
|
|
14
|
+
import { resolvePiPackageRoot } from "./dm-spawn.js";
|
|
15
|
+
import { encodeExtensionBindings, DM_SUBAGENT_EXTENSION_BINDINGS_ENV } from "./extension-bindings.js";
|
|
16
|
+
import { RUNTIME_EXTENSION_ACK_PATH_ENV } from "./runtime-acknowledged-extensions.js";
|
|
17
|
+
import {
|
|
18
|
+
STRUCTURED_OUTPUT_ACCEPTANCE_CAPTURE_ENV,
|
|
19
|
+
STRUCTURED_OUTPUT_CAPTURE_ENV,
|
|
20
|
+
STRUCTURED_OUTPUT_SCHEMA_ENV
|
|
21
|
+
} from "./structured-output.js";
|
|
22
|
+
import {
|
|
23
|
+
TEMP_ROOT_DIR
|
|
24
|
+
} from "../../shared/types.js";
|
|
25
|
+
import { THINKING_LEVELS } from "../../shared/model-info.js";
|
|
26
|
+
import { decodeThinkingCeiling, intersectThinkingCeilings, SUBAGENT_THINKING_CEILING_ENV } from "../../shared/thinking-ceiling.js";
|
|
27
|
+
import { encodeRunFanoutBudgetDescriptor, RUN_FANOUT_BUDGET_ENV } from "./run-fanout-budget.js";
|
|
28
|
+
import {
|
|
29
|
+
TOOL_BUDGET_ENV,
|
|
30
|
+
TOOL_BUDGET_ZERO_AUTH_ENV,
|
|
31
|
+
encodeToolBudgetEnv
|
|
32
|
+
} from "./tool-budget.js";
|
|
33
|
+
import {
|
|
34
|
+
CHILD_TOOL_DIAGNOSTIC_PATH_ENV,
|
|
35
|
+
MCP_DIRECT_CHILD_TOOLS_ENV,
|
|
36
|
+
REQUIRED_CHILD_TOOLS_ENV
|
|
37
|
+
} from "./tool-availability.js";
|
|
38
|
+
import {
|
|
39
|
+
CHILD_WATCHDOG_CONFIG_ENV,
|
|
40
|
+
encodeChildWatchdogConfig
|
|
41
|
+
} from "../../watchdog/child-status.js";
|
|
42
|
+
import { WAIT_TOOL_DEFAULT_TIMEOUT_MS_ENV, WAIT_TOOL_ENABLED_ENV } from "../background/wait-config.js";
|
|
43
|
+
import {
|
|
44
|
+
DM_CODING_AGENT_PACKAGE_ROOT_ENV,
|
|
45
|
+
getAgentDir
|
|
46
|
+
} from "../../shared/utils.js";
|
|
47
|
+
import {
|
|
48
|
+
encodePermissionRules,
|
|
49
|
+
PERMISSION_AUDIT_PATH_ENV,
|
|
50
|
+
PERMISSION_POLICY_ENV
|
|
51
|
+
} from "./permissions.js";
|
|
52
|
+
import {
|
|
53
|
+
SUBAGENT_CAPABILITY_CEILING_ENV,
|
|
54
|
+
capabilityCeilingAgentRestrictionSources,
|
|
55
|
+
decodeSubagentCapabilityCeiling,
|
|
56
|
+
encodeSubagentCapabilityCeiling,
|
|
57
|
+
intersectSubagentCapabilityCeilings,
|
|
58
|
+
isAgentAllowedByCapabilityCeiling
|
|
59
|
+
} from "./capability-ceiling.js";
|
|
11
60
|
const TASK_ARG_LIMIT = 8000;
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const runtimeSuffix = [".js", ".mjs", ".cjs", ".ts", ".mts", ".cts"].includes(moduleSuffix) ? moduleSuffix : ".ts";
|
|
16
|
-
return path.join(path.dirname(modulePath), `${relativeStem}${runtimeSuffix}`);
|
|
61
|
+
export const SUBAGENT_TASK_DELIVERY_ENV = "DM_SUBAGENT_TASK_DELIVERY";
|
|
62
|
+
export function resolveSubagentTaskDelivery(env = process.env) {
|
|
63
|
+
return env[SUBAGENT_TASK_DELIVERY_ENV]?.trim().toLowerCase() === "file" ? "file" : "auto";
|
|
17
64
|
}
|
|
18
|
-
function
|
|
19
|
-
return
|
|
65
|
+
function shouldDeliverTaskViaFile(task, delivery) {
|
|
66
|
+
return delivery === "file" || task.length > TASK_ARG_LIMIT;
|
|
20
67
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
const FANOUT_CHILD_EXTENSION_PATH = resolveFanoutChildPath();
|
|
68
|
+
const MAX_LAUNCH_RESOLVED_EXTENSION_IDS = 32;
|
|
69
|
+
const PROMPT_RUNTIME_EXTENSION_PATH = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-prompt-runtime.js");
|
|
70
|
+
const FANOUT_CHILD_EXTENSION_PATH = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "extension", "fanout-child.js");
|
|
71
|
+
const FAST_MODE_EXTENSION_PATH = path.join(path.dirname(fileURLToPath(import.meta.url)), "fast-mode-extension.js");
|
|
72
|
+
const FAST_MODE_ALLOWED_MODELS = new Set([
|
|
73
|
+
"openai-codex/gpt-5.6-luna",
|
|
74
|
+
"openai-codex/gpt-5.6-sol"
|
|
75
|
+
]);
|
|
76
|
+
const OPENAI_PROMPT_CACHE_KEY_MAX_LENGTH = 64;
|
|
31
77
|
export const SUBAGENT_CHILD_ENV = "DM_SUBAGENT_CHILD";
|
|
32
78
|
export const SUBAGENT_ORCHESTRATOR_TARGET_ENV = "DM_SUBAGENT_ORCHESTRATOR_TARGET";
|
|
33
79
|
export const SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV = "DM_SUBAGENT_ORCHESTRATOR_SESSION_ID";
|
|
@@ -45,7 +91,20 @@ export const SUBAGENT_PARENT_DEPTH_ENV = "DM_SUBAGENT_PARENT_DEPTH";
|
|
|
45
91
|
export const SUBAGENT_PARENT_PATH_ENV = "DM_SUBAGENT_PARENT_PATH";
|
|
46
92
|
export const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = "DM_SUBAGENT_PARENT_CAPABILITY_TOKEN";
|
|
47
93
|
export const SUBAGENT_PARENT_SESSION_ENV = "DM_SUBAGENT_PARENT_SESSION";
|
|
94
|
+
export const SUBAGENT_FORK_CACHE_KEY_ENV = "DM_SUBAGENT_FORK_CACHE_KEY";
|
|
48
95
|
export const SUBAGENT_STEER_INBOX_ENV = "DM_SUBAGENT_STEER_INBOX";
|
|
96
|
+
export const SUBAGENT_STEER_CAPABILITY_ENV = "DM_SUBAGENT_STEER_CAPABILITY";
|
|
97
|
+
export const SUBAGENT_STEER_ACK_DIR_ENV = "DM_SUBAGENT_STEER_ACK_DIR";
|
|
98
|
+
export const PI_INTERCOM_STABLE_ID_ENV = "PI_INTERCOM_STABLE_ID";
|
|
99
|
+
export const PI_INTERCOM_SESSION_ID_ENV = "PI_INTERCOM_SESSION_ID";
|
|
100
|
+
export const SUBAGENT_INHERIT_GLOBAL_CONTEXT_ENV = "DM_SUBAGENT_INHERIT_GLOBAL_CONTEXT";
|
|
101
|
+
export function deriveForkPromptCacheKey(parentSessionId) {
|
|
102
|
+
const parent = parentSessionId?.trim();
|
|
103
|
+
if (!parent)
|
|
104
|
+
return;
|
|
105
|
+
const digest = createHash("sha256").update(parent).digest("hex").slice(0, OPENAI_PROMPT_CACHE_KEY_MAX_LENGTH - "dm-fork:".length);
|
|
106
|
+
return `dm-fork:${digest}`;
|
|
107
|
+
}
|
|
49
108
|
function sanitizeSupervisorChannelSegment(value) {
|
|
50
109
|
return value.trim().replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "unknown";
|
|
51
110
|
}
|
|
@@ -56,11 +115,247 @@ export function applyThinkingSuffix(model, thinking, replaceExisting = false) {
|
|
|
56
115
|
if (!model || !thinking)
|
|
57
116
|
return model;
|
|
58
117
|
const colonIdx = model.lastIndexOf(":");
|
|
59
|
-
if (colonIdx !== -1 && THINKING_LEVELS.
|
|
118
|
+
if (colonIdx !== -1 && THINKING_LEVELS.some((level) => level === model.substring(colonIdx + 1))) {
|
|
60
119
|
return replaceExisting ? `${model.slice(0, colonIdx)}:${thinking}` : model;
|
|
61
120
|
}
|
|
62
121
|
return `${model}:${thinking}`;
|
|
63
122
|
}
|
|
123
|
+
function stripThinkingSuffix(model) {
|
|
124
|
+
const colonIdx = model.lastIndexOf(":");
|
|
125
|
+
if (colonIdx === -1)
|
|
126
|
+
return model;
|
|
127
|
+
return THINKING_LEVELS.some((level) => level === model.substring(colonIdx + 1)) ? model.slice(0, colonIdx) : model;
|
|
128
|
+
}
|
|
129
|
+
function resolveFastModeExtension(input) {
|
|
130
|
+
if (!input.fast)
|
|
131
|
+
return [];
|
|
132
|
+
const candidates = ((input.modelCandidates?.length) ? input.modelCandidates : input.model ? [input.model] : []).map(stripThinkingSuffix);
|
|
133
|
+
if (candidates.length === 0) {
|
|
134
|
+
throw new Error(`fast mode requires an explicit supported native OpenAI-Codex model${input.agentName ? ` for agent '${input.agentName}'` : ""}.`);
|
|
135
|
+
}
|
|
136
|
+
const unsupported = candidates.filter((model) => !FAST_MODE_ALLOWED_MODELS.has(model));
|
|
137
|
+
if (unsupported.length > 0) {
|
|
138
|
+
throw new Error(`fast mode supports only ${[...FAST_MODE_ALLOWED_MODELS].join(", ")}; unsupported model${unsupported.length === 1 ? "" : "s"}: ${unsupported.join(", ")}.`);
|
|
139
|
+
}
|
|
140
|
+
return [FAST_MODE_EXTENSION_PATH];
|
|
141
|
+
}
|
|
142
|
+
function extensionIdentifier(value) {
|
|
143
|
+
return `sha256:${createHash("sha256").update(path.normalize(value.trim())).digest("hex").slice(0, 16)}`;
|
|
144
|
+
}
|
|
145
|
+
function boundedExtensionIdentifiers(values) {
|
|
146
|
+
const ids = [...new Set(values.map(extensionIdentifier))];
|
|
147
|
+
return {
|
|
148
|
+
ids: ids.slice(0, MAX_LAUNCH_RESOLVED_EXTENSION_IDS),
|
|
149
|
+
omitted: Math.max(0, ids.length - MAX_LAUNCH_RESOLVED_EXTENSION_IDS)
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function hasPermissionRules(rules) {
|
|
153
|
+
return rules !== undefined && Object.keys(rules).length > 0;
|
|
154
|
+
}
|
|
155
|
+
function filterRuntimeMcpConfig(config, runtimeServerNames, effectiveRuntimeServerNames) {
|
|
156
|
+
const runtimeNames = new Set(runtimeServerNames);
|
|
157
|
+
const effectiveNames = new Set(effectiveRuntimeServerNames);
|
|
158
|
+
return {
|
|
159
|
+
...config,
|
|
160
|
+
mcpServers: Object.fromEntries(Object.entries(config.mcpServers).filter(([name]) => !runtimeNames.has(name) || effectiveNames.has(name)))
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
export function projectLaunchResolvedChildExtensions(toolPlan) {
|
|
164
|
+
const runtime = boundedExtensionIdentifiers(toolPlan.runtimeExtensions);
|
|
165
|
+
const configured = boundedExtensionIdentifiers(toolPlan.configuredExtensions);
|
|
166
|
+
const effective = boundedExtensionIdentifiers(toolPlan.extensionArgs);
|
|
167
|
+
return {
|
|
168
|
+
version: 1,
|
|
169
|
+
source: "launch-resolved",
|
|
170
|
+
disableAmbientExtensions: toolPlan.disableAmbientExtensions,
|
|
171
|
+
runtime: runtime.ids,
|
|
172
|
+
configured: configured.ids,
|
|
173
|
+
effective: effective.ids,
|
|
174
|
+
omitted: {
|
|
175
|
+
runtime: runtime.omitted,
|
|
176
|
+
configured: configured.omitted,
|
|
177
|
+
effective: effective.omitted
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
export function resolvePermissionSystemExtension() {
|
|
182
|
+
const agentDir = getAgentDir();
|
|
183
|
+
const candidates = [
|
|
184
|
+
path.join(agentDir, "npm", "node_modules", "@gotgenes", "dm-permission-system"),
|
|
185
|
+
path.join(agentDir, "extensions", "dm-permission-system")
|
|
186
|
+
];
|
|
187
|
+
const errors = [];
|
|
188
|
+
for (const extDir of candidates) {
|
|
189
|
+
if (!fs.existsSync(extDir))
|
|
190
|
+
continue;
|
|
191
|
+
const pkgPath = path.join(extDir, "package.json");
|
|
192
|
+
if (!fs.existsSync(pkgPath)) {
|
|
193
|
+
errors.push(new Error(`Permission-system package manifest is missing at ${pkgPath}.`));
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
let pkg;
|
|
198
|
+
const parsed = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
199
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
200
|
+
throw new Error("manifest root must be an object");
|
|
201
|
+
}
|
|
202
|
+
pkg = parsed;
|
|
203
|
+
const extensions = pkg.dm?.extensions;
|
|
204
|
+
const entry = Array.isArray(extensions) ? extensions[0] : undefined;
|
|
205
|
+
if (typeof entry !== "string" || !entry.trim()) {
|
|
206
|
+
throw new Error(`Permission-system package manifest at ${pkgPath} must declare dm.extensions[0] as a non-empty string.`);
|
|
207
|
+
}
|
|
208
|
+
const resolved = path.resolve(extDir, entry);
|
|
209
|
+
if (fs.existsSync(resolved))
|
|
210
|
+
return resolved;
|
|
211
|
+
throw new Error(`Permission-system extension entry ${JSON.stringify(entry)} in ${pkgPath} does not exist at ${resolved}.`);
|
|
212
|
+
} catch (error) {
|
|
213
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
214
|
+
errors.push(message.startsWith("Permission-system") ? new Error(message) : new Error(`Cannot read permission-system package manifest at ${pkgPath}: ${message}`));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (errors.length > 0)
|
|
218
|
+
throw errors[0];
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
export function resolvePiLaunchToolPlan(input) {
|
|
222
|
+
const capabilityCeiling = intersectSubagentCapabilityCeilings(input.capabilityCeiling, input.inheritedCapabilityCeiling);
|
|
223
|
+
const allowedToolSet = capabilityCeiling?.allowedTools === undefined ? undefined : new Set(capabilityCeiling.allowedTools);
|
|
224
|
+
const requestedBuiltinTools = input.tools?.filter((tool) => !(tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js"))) ?? [];
|
|
225
|
+
if (input.requireReadTool && allowedToolSet && !allowedToolSet.has("read")) {
|
|
226
|
+
throw new Error(`Capability ceiling from ${capabilityCeiling?.sources.join(", ") || "unknown source"} excludes required tool 'read' for lazy skill loading.`);
|
|
227
|
+
}
|
|
228
|
+
const declaredBuiltinTools = input.tools === undefined ? allowedToolSet ? [...allowedToolSet] : [] : (input.requireReadTool && requestedBuiltinTools.length > 0 && !requestedBuiltinTools.includes("read") && !allowedToolSet ? ["read", ...requestedBuiltinTools] : requestedBuiltinTools).filter((tool) => !allowedToolSet || allowedToolSet.has(tool));
|
|
229
|
+
const fanoutAuthorized = declaredBuiltinTools.includes("subagent") || input.allowNestedSubagents === true && (!allowedToolSet || allowedToolSet.has("subagent"));
|
|
230
|
+
const toolExtensionPaths = capabilityCeiling?.denyExtensions ? [] : (input.tools ?? []).filter((tool) => !requestedBuiltinTools.includes(tool) && (tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js")));
|
|
231
|
+
const mcpResolution = capabilityCeiling?.denyExtensions ? { selections: [], unresolvedSelectors: [] } : resolveMcpDirectToolResolution(input.mcpDirectTools, input.cwd, input.runtimeSnapshotHost, input.mcpConfig);
|
|
232
|
+
if (mcpResolution.unresolvedSelectors.length > 0) {
|
|
233
|
+
throw new Error(formatUnresolvedMcpDirectToolSelectors(mcpResolution.unresolvedSelectors));
|
|
234
|
+
}
|
|
235
|
+
const resolvedMcpSelections = mcpResolution.selections;
|
|
236
|
+
const resolvedMcpNames = new Set(resolvedMcpSelections.map((selection) => selection.name));
|
|
237
|
+
const legacyMcpNameCounts = countLegacyUnderscoreMcpToolNames(resolvedMcpSelections);
|
|
238
|
+
const effectiveMcpSelections = resolvedMcpSelections.filter((selection) => !allowedToolSet || allowedToolSet.has(selection.name) || isLegacyUnderscoreMcpToolAllowed(selection, allowedToolSet, resolvedMcpNames, legacyMcpNameCounts));
|
|
239
|
+
const effectiveMcpTools = effectiveMcpSelections.map((selection) => selection.name);
|
|
240
|
+
const runtimeServerNames = mcpResolution.runtimeServerNames ?? input.runtimeServerNames ?? [];
|
|
241
|
+
const effectiveRuntimeServerNames = runtimeServerNames.filter((serverName) => effectiveMcpSelections.some((selection) => selection.selector.startsWith(`${serverName}/`)));
|
|
242
|
+
const effectiveMcpConfig = mcpResolution.mcpConfig ?? input.mcpConfig;
|
|
243
|
+
const filteredMcpConfig = effectiveMcpConfig ? filterRuntimeMcpConfig(effectiveMcpConfig, runtimeServerNames, effectiveRuntimeServerNames) : undefined;
|
|
244
|
+
const explicitToolAllowlist = input.tools !== undefined || (input.mcpDirectTools?.length ?? 0) > 0 || allowedToolSet !== undefined;
|
|
245
|
+
const internalTools = input.structuredOutput ? ["structured_output"] : [];
|
|
246
|
+
const effectiveToolAllowlist = [
|
|
247
|
+
...new Set([
|
|
248
|
+
...declaredBuiltinTools,
|
|
249
|
+
...effectiveMcpTools,
|
|
250
|
+
...internalTools
|
|
251
|
+
])
|
|
252
|
+
];
|
|
253
|
+
const legacySupervisorPairing = declaredBuiltinTools.includes("contact_supervisor");
|
|
254
|
+
const requiredChildTools = explicitToolAllowlist ? [
|
|
255
|
+
...new Set([
|
|
256
|
+
...input.tools !== undefined ? declaredBuiltinTools : [],
|
|
257
|
+
...input.mcpDirectTools?.length ? effectiveMcpTools : [],
|
|
258
|
+
...internalTools
|
|
259
|
+
].filter((tool) => tool !== "contact_supervisor" && (!legacySupervisorPairing || tool !== "intercom")))
|
|
260
|
+
] : [];
|
|
261
|
+
const permSystemExt = capabilityCeiling?.denyExtensions ? undefined : hasPermissionRules(input.permissionRules) ? resolvePermissionSystemExtension() : undefined;
|
|
262
|
+
if (input.fast && capabilityCeiling?.denyExtensions)
|
|
263
|
+
throw new Error("fast mode requires a child runtime extension, but this launch denies extensions.");
|
|
264
|
+
const fastModeExtensions = resolveFastModeExtension({ fast: input.fast, model: input.model, modelCandidates: input.modelCandidates, agentName: input.agentName });
|
|
265
|
+
const runtimeExtensions = [
|
|
266
|
+
PROMPT_RUNTIME_EXTENSION_PATH,
|
|
267
|
+
...fastModeExtensions,
|
|
268
|
+
...fanoutAuthorized ? [FANOUT_CHILD_EXTENSION_PATH] : [],
|
|
269
|
+
...permSystemExt ? [permSystemExt] : []
|
|
270
|
+
];
|
|
271
|
+
const disableAmbientExtensions = capabilityCeiling?.denyExtensions === true || input.extensions !== undefined;
|
|
272
|
+
const warnings = [];
|
|
273
|
+
if (capabilityCeiling?.denyExtensions !== true && Array.isArray(input.extensions) && input.extensions.length === 0) {
|
|
274
|
+
const agentLabel = input.agentName ? ` for agent '${input.agentName}'` : "";
|
|
275
|
+
warnings.push(`extensions: [] override${agentLabel} disables ALL ambient extensions for this child (not just "adds nothing"), ` + "including any model-provider extension needed to resolve a provider-qualified model. " + "List the extensions this child actually needs instead of an empty array.");
|
|
276
|
+
}
|
|
277
|
+
const configuredExtensions = capabilityCeiling?.denyExtensions ? [] : [
|
|
278
|
+
...toolExtensionPaths,
|
|
279
|
+
...input.extensions ?? [],
|
|
280
|
+
...input.subagentOnlyExtensions ?? []
|
|
281
|
+
];
|
|
282
|
+
const extensionArgs = disableAmbientExtensions ? [...new Set([...runtimeExtensions, ...configuredExtensions])] : [
|
|
283
|
+
...new Set([
|
|
284
|
+
...runtimeExtensions,
|
|
285
|
+
...toolExtensionPaths,
|
|
286
|
+
...input.subagentOnlyExtensions ?? []
|
|
287
|
+
])
|
|
288
|
+
];
|
|
289
|
+
const requestedToolNames = input.tools !== undefined ? [
|
|
290
|
+
...new Set([
|
|
291
|
+
...requestedBuiltinTools,
|
|
292
|
+
...resolvedMcpSelections.map((selection) => selection.name)
|
|
293
|
+
])
|
|
294
|
+
] : undefined;
|
|
295
|
+
const capabilityAudit = capabilityCeiling ? {
|
|
296
|
+
ceiling: capabilityCeiling,
|
|
297
|
+
...requestedToolNames ? { requestedTools: requestedToolNames } : {},
|
|
298
|
+
effectiveTools: effectiveToolAllowlist,
|
|
299
|
+
removedTools: requestedToolNames?.filter((tool) => !effectiveToolAllowlist.includes(tool)) ?? [],
|
|
300
|
+
internalTools,
|
|
301
|
+
extensionsDenied: capabilityCeiling.denyExtensions,
|
|
302
|
+
removedExtensionCount: capabilityCeiling.denyExtensions ? (input.extensions?.length ?? 0) + (input.subagentOnlyExtensions?.length ?? 0) + (input.tools ?? []).filter((tool) => tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js")).length : 0,
|
|
303
|
+
requestedMcpToolCount: input.mcpDirectTools?.length ?? 0,
|
|
304
|
+
effectiveMcpTools,
|
|
305
|
+
agentAllowed: input.agentName === undefined ? true : isAgentAllowedByCapabilityCeiling(input.agentName, capabilityCeiling),
|
|
306
|
+
...capabilityCeilingAgentRestrictionSources(capabilityCeiling) ? {
|
|
307
|
+
agentRestrictionSources: capabilityCeilingAgentRestrictionSources(capabilityCeiling)
|
|
308
|
+
} : {}
|
|
309
|
+
} : undefined;
|
|
310
|
+
return {
|
|
311
|
+
...capabilityCeiling ? { capabilityCeiling } : {},
|
|
312
|
+
requestedBuiltinTools,
|
|
313
|
+
declaredBuiltinTools,
|
|
314
|
+
toolExtensionPaths,
|
|
315
|
+
resolvedMcpSelections,
|
|
316
|
+
effectiveMcpSelections,
|
|
317
|
+
effectiveMcpTools,
|
|
318
|
+
explicitToolAllowlist,
|
|
319
|
+
internalTools,
|
|
320
|
+
effectiveToolAllowlist,
|
|
321
|
+
requiredChildTools,
|
|
322
|
+
fanoutAuthorized,
|
|
323
|
+
runtimeExtensions,
|
|
324
|
+
configuredExtensions,
|
|
325
|
+
extensionArgs,
|
|
326
|
+
disableAmbientExtensions,
|
|
327
|
+
warnings,
|
|
328
|
+
...effectiveRuntimeServerNames.length > 0 && filteredMcpConfig ? { mcpConfig: filteredMcpConfig, runtimeServerNames: effectiveRuntimeServerNames } : {},
|
|
329
|
+
...capabilityAudit ? { capabilityAudit } : {}
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
function countLegacyUnderscoreMcpToolNames(selections) {
|
|
333
|
+
const counts = new Map;
|
|
334
|
+
for (const selection of selections) {
|
|
335
|
+
const legacyName = legacyUnderscoreMcpToolName(selection);
|
|
336
|
+
if (legacyName !== selection.name)
|
|
337
|
+
counts.set(legacyName, (counts.get(legacyName) ?? 0) + 1);
|
|
338
|
+
}
|
|
339
|
+
return counts;
|
|
340
|
+
}
|
|
341
|
+
function isLegacyUnderscoreMcpToolAllowed(selection, allowedToolSet, resolvedMcpNames, legacyMcpNameCounts) {
|
|
342
|
+
const legacyName = legacyUnderscoreMcpToolName(selection);
|
|
343
|
+
return legacyMcpNameCounts.get(legacyName) === 1 && !resolvedMcpNames.has(legacyName) && allowedToolSet.has(legacyName);
|
|
344
|
+
}
|
|
345
|
+
function legacyUnderscoreMcpToolName(selection) {
|
|
346
|
+
const slash = selection.selector.indexOf("/");
|
|
347
|
+
if (slash < 1)
|
|
348
|
+
return selection.name;
|
|
349
|
+
const toolName = selection.selector.slice(slash + 1);
|
|
350
|
+
const suffix = `_${toolName}`;
|
|
351
|
+
if (!selection.name.endsWith(suffix))
|
|
352
|
+
return selection.name;
|
|
353
|
+
const prefix = selection.name.slice(0, -suffix.length);
|
|
354
|
+
return `${prefix.replace(/-/g, "_")}${suffix}`;
|
|
355
|
+
}
|
|
356
|
+
function escapeXmlAttr(value) {
|
|
357
|
+
return value.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
|
|
358
|
+
}
|
|
64
359
|
export function buildPiArgs(input) {
|
|
65
360
|
const args = [...input.baseArgs];
|
|
66
361
|
if (input.sessionFile) {
|
|
@@ -79,47 +374,62 @@ export function buildPiArgs(input) {
|
|
|
79
374
|
if (modelArg) {
|
|
80
375
|
args.push("--model", modelArg);
|
|
81
376
|
}
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
377
|
+
const toolPlan = resolvePiLaunchToolPlan({
|
|
378
|
+
tools: input.tools,
|
|
379
|
+
allowNestedSubagents: input.allowNestedSubagents,
|
|
380
|
+
extensions: input.extensions,
|
|
381
|
+
subagentOnlyExtensions: input.subagentOnlyExtensions,
|
|
382
|
+
mcpDirectTools: input.mcpDirectTools,
|
|
383
|
+
mcpConfig: input.mcpConfig,
|
|
384
|
+
runtimeServerNames: input.runtimeServerNames,
|
|
385
|
+
cwd: input.cwd,
|
|
386
|
+
requireReadTool: input.requireReadTool,
|
|
387
|
+
structuredOutput: input.structuredOutput,
|
|
388
|
+
fast: input.fast,
|
|
389
|
+
model: modelArg,
|
|
390
|
+
modelCandidates: input.modelCandidates,
|
|
391
|
+
capabilityCeiling: input.capabilityCeiling,
|
|
392
|
+
inheritedCapabilityCeiling: decodeSubagentCapabilityCeiling(process.env[SUBAGENT_CAPABILITY_CEILING_ENV]),
|
|
393
|
+
agentName: input.childAgentName,
|
|
394
|
+
permissionRules: input.permissionRules,
|
|
395
|
+
runtimeSnapshotHost: input.runtimeSnapshotHost
|
|
396
|
+
});
|
|
397
|
+
if (toolPlan.explicitToolAllowlist) {
|
|
398
|
+
args.push(toolPlan.effectiveToolAllowlist.length > 0 ? "--tools" : "--no-tools");
|
|
399
|
+
if (toolPlan.effectiveToolAllowlist.length > 0)
|
|
400
|
+
args.push(toolPlan.effectiveToolAllowlist.join(","));
|
|
99
401
|
}
|
|
100
|
-
|
|
101
|
-
if (input.extensions !== undefined) {
|
|
402
|
+
if (toolPlan.disableAmbientExtensions) {
|
|
102
403
|
args.push("--no-extensions");
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
404
|
+
}
|
|
405
|
+
for (const extPath of toolPlan.extensionArgs)
|
|
406
|
+
args.push("--extension", extPath);
|
|
407
|
+
let tempDir;
|
|
408
|
+
if (toolPlan.mcpConfig && toolPlan.runtimeServerNames?.length) {
|
|
409
|
+
if (!tempDir)
|
|
410
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
|
|
411
|
+
const mcpConfigPath = path.join(tempDir, "mcp-config.json");
|
|
412
|
+
fs.writeFileSync(mcpConfigPath, JSON.stringify(toolPlan.mcpConfig, null, 2), { mode: 384 });
|
|
413
|
+
args.push("--mcp-config", mcpConfigPath);
|
|
414
|
+
}
|
|
415
|
+
if (!input.inheritProjectContext) {
|
|
416
|
+
args.push("--no-context-files");
|
|
110
417
|
}
|
|
111
418
|
if (!input.inheritSkills) {
|
|
112
419
|
args.push("--no-skills");
|
|
113
420
|
}
|
|
114
|
-
let tempDir;
|
|
115
421
|
if (input.systemPrompt !== undefined && input.systemPrompt !== null) {
|
|
116
|
-
|
|
422
|
+
if (!tempDir)
|
|
423
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
|
|
117
424
|
const stem = (input.promptFileStem ?? "prompt").replace(/[^\w.-]/g, "_");
|
|
118
425
|
const promptPath = path.join(tempDir, `${stem}.md`);
|
|
119
|
-
|
|
426
|
+
const taggedPrompt = input.childAgentName ? `<active_agent name="${escapeXmlAttr(input.childAgentName)}"/>
|
|
427
|
+
|
|
428
|
+
${input.systemPrompt}` : input.systemPrompt;
|
|
429
|
+
fs.writeFileSync(promptPath, taggedPrompt, { mode: 384 });
|
|
120
430
|
args.push(input.systemPromptMode === "replace" ? "--system-prompt" : "--append-system-prompt", promptPath);
|
|
121
431
|
}
|
|
122
|
-
if (input.task.
|
|
432
|
+
if (shouldDeliverTaskViaFile(input.task, input.taskDelivery ?? resolveSubagentTaskDelivery())) {
|
|
123
433
|
if (!tempDir) {
|
|
124
434
|
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
|
|
125
435
|
}
|
|
@@ -130,8 +440,31 @@ export function buildPiArgs(input) {
|
|
|
130
440
|
args.push(`Task: ${input.task}`);
|
|
131
441
|
}
|
|
132
442
|
const env = {};
|
|
443
|
+
env[DM_SUBAGENT_EXTENSION_BINDINGS_ENV] = encodeExtensionBindings(input.extensionBindings);
|
|
444
|
+
const piPackageRoot = process.env[DM_CODING_AGENT_PACKAGE_ROOT_ENV] ?? resolvePiPackageRoot();
|
|
445
|
+
if (piPackageRoot)
|
|
446
|
+
env[DM_CODING_AGENT_PACKAGE_ROOT_ENV] = piPackageRoot;
|
|
447
|
+
if (!tempDir)
|
|
448
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
|
|
449
|
+
const runtimeAcknowledgedExtensionsPath = path.join(tempDir, "runtime-acknowledged-extensions.json");
|
|
450
|
+
env[RUNTIME_EXTENSION_ACK_PATH_ENV] = runtimeAcknowledgedExtensionsPath;
|
|
451
|
+
let toolDiagnosticPath;
|
|
452
|
+
if (toolPlan.requiredChildTools.length > 0) {
|
|
453
|
+
if (!tempDir)
|
|
454
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
|
|
455
|
+
toolDiagnosticPath = path.join(tempDir, "tool-diagnostic.json");
|
|
456
|
+
env[REQUIRED_CHILD_TOOLS_ENV] = JSON.stringify(toolPlan.requiredChildTools);
|
|
457
|
+
env[CHILD_TOOL_DIAGNOSTIC_PATH_ENV] = toolDiagnosticPath;
|
|
458
|
+
}
|
|
459
|
+
env[MCP_DIRECT_CHILD_TOOLS_ENV] = toolPlan.effectiveMcpTools.length > 0 ? JSON.stringify(toolPlan.effectiveMcpTools) : undefined;
|
|
133
460
|
env[SUBAGENT_CHILD_ENV] = "1";
|
|
134
|
-
env[SUBAGENT_FANOUT_CHILD_ENV] = fanoutAuthorized ? "1" : "0";
|
|
461
|
+
env[SUBAGENT_FANOUT_CHILD_ENV] = toolPlan.fanoutAuthorized ? "1" : "0";
|
|
462
|
+
if (input.waitToolEnabled !== undefined) {
|
|
463
|
+
env[WAIT_TOOL_ENABLED_ENV] = input.waitToolEnabled ? "true" : "false";
|
|
464
|
+
}
|
|
465
|
+
if (input.waitToolDefaultTimeoutMs !== undefined) {
|
|
466
|
+
env[WAIT_TOOL_DEFAULT_TIMEOUT_MS_ENV] = String(input.waitToolDefaultTimeoutMs);
|
|
467
|
+
}
|
|
135
468
|
const inheritedNestedRoute = Boolean(process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] && process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] && process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV]);
|
|
136
469
|
const parentRunId = input.parentRunId ?? input.runId ?? (inheritedNestedRoute ? process.env[SUBAGENT_RUN_ID_ENV] : undefined) ?? process.env[SUBAGENT_PARENT_RUN_ID_ENV] ?? "";
|
|
137
470
|
const parentChildIndex = input.parentChildIndex !== undefined ? String(input.parentChildIndex) : input.childIndex !== undefined ? String(input.childIndex) : process.env[SUBAGENT_PARENT_CHILD_INDEX_ENV] ?? "";
|
|
@@ -139,31 +472,41 @@ export function buildPiArgs(input) {
|
|
|
139
472
|
const parentDepth = input.parentDepth ?? (inheritedNestedRoute && Number.isFinite(inheritedDepth) ? inheritedDepth + 1 : 1);
|
|
140
473
|
const parentPath = input.parentPath ?? [
|
|
141
474
|
...parseNestedPathEnv(process.env[SUBAGENT_PARENT_PATH_ENV]),
|
|
142
|
-
...parentRunId ? [
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
475
|
+
...parentRunId ? [
|
|
476
|
+
{
|
|
477
|
+
runId: parentRunId,
|
|
478
|
+
...parentChildIndex && /^\d+$/.test(parentChildIndex) ? { stepIndex: Number(parentChildIndex) } : {},
|
|
479
|
+
...input.childAgentName ? { agent: input.childAgentName } : {}
|
|
480
|
+
}
|
|
481
|
+
] : []
|
|
147
482
|
];
|
|
148
|
-
env[SUBAGENT_PARENT_EVENT_SINK_ENV] = fanoutAuthorized ? input.parentEventSink ?? process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] ?? "" : "";
|
|
149
|
-
env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] = fanoutAuthorized ? input.parentControlInbox ?? process.env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] ?? "" : "";
|
|
150
|
-
env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] = fanoutAuthorized ? input.parentRootRunId ?? process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] ?? input.runId ?? "" : "";
|
|
151
|
-
env[SUBAGENT_PARENT_RUN_ID_ENV] = fanoutAuthorized ? parentRunId : "";
|
|
152
|
-
env[SUBAGENT_PARENT_CHILD_INDEX_ENV] = fanoutAuthorized ? parentChildIndex : "";
|
|
153
|
-
env[SUBAGENT_PARENT_DEPTH_ENV] = fanoutAuthorized ? String(parentDepth) : "";
|
|
154
|
-
env[SUBAGENT_PARENT_PATH_ENV] = fanoutAuthorized ? encodeNestedPathEnv(parentPath) : "";
|
|
155
|
-
env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] = fanoutAuthorized ? input.parentCapabilityToken ?? process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] ?? "" : "";
|
|
483
|
+
env[SUBAGENT_PARENT_EVENT_SINK_ENV] = toolPlan.fanoutAuthorized ? input.parentEventSink ?? process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] ?? "" : "";
|
|
484
|
+
env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] = toolPlan.fanoutAuthorized ? input.parentControlInbox ?? process.env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] ?? "" : "";
|
|
485
|
+
env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] = toolPlan.fanoutAuthorized ? input.parentRootRunId ?? process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] ?? input.runId ?? "" : "";
|
|
486
|
+
env[SUBAGENT_PARENT_RUN_ID_ENV] = toolPlan.fanoutAuthorized ? parentRunId : "";
|
|
487
|
+
env[SUBAGENT_PARENT_CHILD_INDEX_ENV] = toolPlan.fanoutAuthorized ? parentChildIndex : "";
|
|
488
|
+
env[SUBAGENT_PARENT_DEPTH_ENV] = toolPlan.fanoutAuthorized ? String(parentDepth) : "";
|
|
489
|
+
env[SUBAGENT_PARENT_PATH_ENV] = toolPlan.fanoutAuthorized ? encodeNestedPathEnv(parentPath) : "";
|
|
490
|
+
env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] = toolPlan.fanoutAuthorized ? input.parentCapabilityToken ?? process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] ?? "" : "";
|
|
491
|
+
env[RUN_FANOUT_BUDGET_ENV] = toolPlan.fanoutAuthorized ? input.runFanoutBudget ? encodeRunFanoutBudgetDescriptor(input.runFanoutBudget) : process.env[RUN_FANOUT_BUDGET_ENV] : undefined;
|
|
156
492
|
env.DM_SUBAGENT_INHERIT_PROJECT_CONTEXT = input.inheritProjectContext ? "1" : "0";
|
|
493
|
+
env[SUBAGENT_INHERIT_GLOBAL_CONTEXT_ENV] = input.inheritGlobalContext ? "1" : "0";
|
|
157
494
|
env.DM_SUBAGENT_INHERIT_SKILLS = input.inheritSkills ? "1" : "0";
|
|
495
|
+
env[PI_INTERCOM_STABLE_ID_ENV] = input.intercomSessionName || undefined;
|
|
496
|
+
env[PI_INTERCOM_SESSION_ID_ENV] = undefined;
|
|
158
497
|
if (input.intercomSessionName) {
|
|
159
498
|
env.DM_SUBAGENT_INTERCOM_SESSION_NAME = input.intercomSessionName;
|
|
160
499
|
}
|
|
500
|
+
if (input.sessionName?.trim()) {
|
|
501
|
+
env.DM_SUBAGENT_SESSION_NAME = input.sessionName.trim();
|
|
502
|
+
}
|
|
161
503
|
if (input.orchestratorIntercomTarget) {
|
|
162
504
|
env[SUBAGENT_ORCHESTRATOR_TARGET_ENV] = input.orchestratorIntercomTarget;
|
|
163
505
|
}
|
|
164
506
|
if (input.parentSessionId) {
|
|
165
507
|
env[SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV] = input.parentSessionId;
|
|
166
508
|
}
|
|
509
|
+
const encodedPermissionRules = encodePermissionRules(input.permissionRules);
|
|
167
510
|
if (input.orchestratorIntercomTarget && input.parentSessionId && input.runId && input.childAgentName) {
|
|
168
511
|
const childIndex = input.childIndex ?? 0;
|
|
169
512
|
const channelDir = supervisorChannelDir(input.runId, input.childAgentName, childIndex);
|
|
@@ -171,6 +514,8 @@ export function buildPiArgs(input) {
|
|
|
171
514
|
fs.mkdirSync(path.join(channelDir, "replies"), { recursive: true });
|
|
172
515
|
env[SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV] = channelDir;
|
|
173
516
|
}
|
|
517
|
+
if (encodedPermissionRules)
|
|
518
|
+
env[PERMISSION_AUDIT_PATH_ENV] = input.permissionAuditPath ?? path.join(tempDir, "permission-audit.jsonl");
|
|
174
519
|
if (input.runId) {
|
|
175
520
|
env[SUBAGENT_RUN_ID_ENV] = input.runId;
|
|
176
521
|
}
|
|
@@ -180,23 +525,51 @@ export function buildPiArgs(input) {
|
|
|
180
525
|
if (input.childIndex !== undefined) {
|
|
181
526
|
env[SUBAGENT_CHILD_INDEX_ENV] = String(input.childIndex);
|
|
182
527
|
}
|
|
183
|
-
if (input.mcpDirectTools?.length)
|
|
528
|
+
if (!toolPlan.capabilityCeiling && input.mcpDirectTools?.length)
|
|
184
529
|
env.MCP_DIRECT_TOOLS = input.mcpDirectTools.join(",");
|
|
185
|
-
|
|
530
|
+
else if (toolPlan.capabilityCeiling && toolPlan.effectiveMcpSelections.length && !toolPlan.capabilityCeiling.denyExtensions)
|
|
531
|
+
env.MCP_DIRECT_TOOLS = toolPlan.effectiveMcpSelections.map((selection) => selection.selector).join(",");
|
|
532
|
+
else
|
|
186
533
|
env.MCP_DIRECT_TOOLS = "__none__";
|
|
187
|
-
|
|
534
|
+
const encodedCapabilityCeiling = encodeSubagentCapabilityCeiling(toolPlan.capabilityCeiling);
|
|
535
|
+
const thinkingCeiling = intersectThinkingCeilings(input.thinkingCeiling, decodeThinkingCeiling(process.env[SUBAGENT_THINKING_CEILING_ENV]));
|
|
536
|
+
if (thinkingCeiling)
|
|
537
|
+
env[SUBAGENT_THINKING_CEILING_ENV] = thinkingCeiling;
|
|
538
|
+
if (encodedCapabilityCeiling)
|
|
539
|
+
env[SUBAGENT_CAPABILITY_CEILING_ENV] = encodedCapabilityCeiling;
|
|
540
|
+
if (encodedPermissionRules)
|
|
541
|
+
env[PERMISSION_POLICY_ENV] = encodedPermissionRules;
|
|
188
542
|
if (input.structuredOutput) {
|
|
189
543
|
env[STRUCTURED_OUTPUT_CAPTURE_ENV] = input.structuredOutput.outputPath;
|
|
190
544
|
env[STRUCTURED_OUTPUT_SCHEMA_ENV] = input.structuredOutput.schemaPath;
|
|
545
|
+
if (input.structuredOutput.acceptanceReportPath)
|
|
546
|
+
env[STRUCTURED_OUTPUT_ACCEPTANCE_CAPTURE_ENV] = input.structuredOutput.acceptanceReportPath;
|
|
191
547
|
}
|
|
192
548
|
if (input.steerInboxDir) {
|
|
193
549
|
env[SUBAGENT_STEER_INBOX_ENV] = input.steerInboxDir;
|
|
194
550
|
}
|
|
551
|
+
if (input.steerCapabilityPath)
|
|
552
|
+
env[SUBAGENT_STEER_CAPABILITY_ENV] = input.steerCapabilityPath;
|
|
553
|
+
if (input.steerAckDir)
|
|
554
|
+
env[SUBAGENT_STEER_ACK_DIR_ENV] = input.steerAckDir;
|
|
195
555
|
const encodedToolBudget = encodeToolBudgetEnv(input.toolBudget);
|
|
196
556
|
if (encodedToolBudget)
|
|
197
557
|
env[TOOL_BUDGET_ENV] = encodedToolBudget;
|
|
558
|
+
env[TOOL_BUDGET_ZERO_AUTH_ENV] = input.allowZeroToolBudget ? "1" : undefined;
|
|
559
|
+
const encodedChildWatchdog = encodeChildWatchdogConfig(input.childWatchdog);
|
|
560
|
+
if (encodedChildWatchdog)
|
|
561
|
+
env[CHILD_WATCHDOG_CONFIG_ENV] = encodedChildWatchdog;
|
|
198
562
|
env[SUBAGENT_PARENT_SESSION_ENV] = input.parentSessionId ?? process.env[SUBAGENT_PARENT_SESSION_ENV] ?? "";
|
|
199
|
-
|
|
563
|
+
env[SUBAGENT_FORK_CACHE_KEY_ENV] = input.forkCacheKey?.trim() || undefined;
|
|
564
|
+
return {
|
|
565
|
+
args,
|
|
566
|
+
env,
|
|
567
|
+
warnings: toolPlan.warnings,
|
|
568
|
+
tempDir,
|
|
569
|
+
toolDiagnosticPath,
|
|
570
|
+
runtimeAcknowledgedExtensionsPath,
|
|
571
|
+
capabilityAudit: toolPlan.capabilityAudit
|
|
572
|
+
};
|
|
200
573
|
}
|
|
201
574
|
export const parseParentPathEnv = parseNestedPathEnv;
|
|
202
575
|
export function cleanupTempDir(tempDir) {
|