@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,7 +1,7 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
-
export const
|
|
4
|
+
export const DM_CODING_AGENT_PACKAGE = "@duckmind/dm-coding-agent";
|
|
5
5
|
export const DM_SUBAGENT_PI_BINARY_ENV = "DM_SUBAGENT_PI_BINARY";
|
|
6
6
|
export function findPiPackageRootFromEntry(entryPoint) {
|
|
7
7
|
let dir = path.dirname(entryPoint);
|
|
@@ -9,7 +9,7 @@ export function findPiPackageRootFromEntry(entryPoint) {
|
|
|
9
9
|
const packageJsonPath = path.join(dir, "package.json");
|
|
10
10
|
if (fs.existsSync(packageJsonPath)) {
|
|
11
11
|
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
12
|
-
if (pkg.name ===
|
|
12
|
+
if (pkg.name === DM_CODING_AGENT_PACKAGE)
|
|
13
13
|
return dir;
|
|
14
14
|
}
|
|
15
15
|
dir = path.dirname(dir);
|
|
@@ -17,7 +17,7 @@ export function findPiPackageRootFromEntry(entryPoint) {
|
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
19
|
export function resolveInstalledPiPackageRoot() {
|
|
20
|
-
return findPiPackageRootFromEntry(fileURLToPath(import.meta.resolve(
|
|
20
|
+
return findPiPackageRootFromEntry(fileURLToPath(import.meta.resolve(DM_CODING_AGENT_PACKAGE)));
|
|
21
21
|
}
|
|
22
22
|
export function resolvePiPackageRoot() {
|
|
23
23
|
try {
|
|
@@ -35,14 +35,24 @@ function isRunnableNodeScript(filePath, existsSync) {
|
|
|
35
35
|
function normalizePath(filePath) {
|
|
36
36
|
return path.isAbsolute(filePath) ? filePath : path.resolve(filePath);
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
function isStandalonePiExecutable(execPath) {
|
|
39
|
+
const executableName = execPath.split(/[\\/]/).pop();
|
|
40
|
+
return /^dm(?:\.exe)?$/i.test(executableName ?? "");
|
|
41
|
+
}
|
|
42
|
+
export function resolvePiCliScript(deps = {}) {
|
|
39
43
|
const existsSync = deps.existsSync ?? fs.existsSync;
|
|
44
|
+
const realpathSync = deps.realpathSync ?? fs.realpathSync;
|
|
40
45
|
const readFileSync = deps.readFileSync ?? ((filePath, encoding) => fs.readFileSync(filePath, encoding));
|
|
41
46
|
const argv1 = deps.argv1 ?? process.argv[1];
|
|
42
47
|
if (argv1) {
|
|
43
48
|
const argvPath = normalizePath(argv1);
|
|
44
49
|
if (isRunnableNodeScript(argvPath, existsSync)) {
|
|
45
|
-
|
|
50
|
+
try {
|
|
51
|
+
const canonicalArgvPath = realpathSync(argvPath);
|
|
52
|
+
if (isRunnableNodeScript(canonicalArgvPath, existsSync) && findPiPackageRootFromEntry(canonicalArgvPath)) {
|
|
53
|
+
return canonicalArgvPath;
|
|
54
|
+
}
|
|
55
|
+
} catch {}
|
|
46
56
|
}
|
|
47
57
|
}
|
|
48
58
|
try {
|
|
@@ -52,13 +62,13 @@ export function resolveWindowsPiCliScript(deps = {}) {
|
|
|
52
62
|
return path.join(root, "package.json");
|
|
53
63
|
const packageRoot = deps.resolvePackageEntry ? findPiPackageRootFromEntry(deps.resolvePackageEntry()) : resolveInstalledPiPackageRoot();
|
|
54
64
|
if (!packageRoot)
|
|
55
|
-
throw new Error(`Could not resolve ${
|
|
65
|
+
throw new Error(`Could not resolve ${DM_CODING_AGENT_PACKAGE} package root`);
|
|
56
66
|
return path.join(packageRoot, "package.json");
|
|
57
67
|
});
|
|
58
68
|
const packageJsonPath = resolvePackageJson();
|
|
59
69
|
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
60
70
|
const binField = packageJson.bin;
|
|
61
|
-
const binPath = typeof binField === "string" ? binField : binField?.
|
|
71
|
+
const binPath = typeof binField === "string" ? binField : binField?.dm ?? Object.values(binField ?? {})[0];
|
|
62
72
|
if (!binPath)
|
|
63
73
|
return;
|
|
64
74
|
const candidate = path.resolve(path.dirname(packageJsonPath), binPath);
|
|
@@ -76,15 +86,16 @@ export function getPiSpawnCommand(args, deps = {}) {
|
|
|
76
86
|
if (piBinary) {
|
|
77
87
|
return { command: piBinary, args };
|
|
78
88
|
}
|
|
79
|
-
const
|
|
80
|
-
if (
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
89
|
+
const execPath = deps.execPath ?? process.execPath;
|
|
90
|
+
if (isStandalonePiExecutable(execPath)) {
|
|
91
|
+
return { command: execPath, args };
|
|
92
|
+
}
|
|
93
|
+
const piCliPath = resolvePiCliScript(deps);
|
|
94
|
+
if (piCliPath) {
|
|
95
|
+
return {
|
|
96
|
+
command: execPath,
|
|
97
|
+
args: [piCliPath, ...args]
|
|
98
|
+
};
|
|
88
99
|
}
|
|
89
100
|
return { command: "dm", args };
|
|
90
101
|
}
|
|
@@ -7,26 +7,34 @@ const SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
|
7
7
|
const ITEM_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
8
8
|
const ITEM_REF_PATTERN = /\{([A-Za-z_][A-Za-z0-9_]*)(?:\.([^{}]+))?\}/g;
|
|
9
9
|
const RESERVED_TEMPLATE_NAMES = new Set(["task", "previous", "chain_dir", "outputs"]);
|
|
10
|
-
const DYNAMIC_STEP_KEYS = new Set(["expand", "parallel", "collect", "concurrency", "failFast", "phase", "label", "acceptance"]);
|
|
11
|
-
const RUNNER_DYNAMIC_STEP_KEYS = new Set([...DYNAMIC_STEP_KEYS, "effectiveAcceptance", "sessionFiles", "thinkingOverrides"]);
|
|
10
|
+
const DYNAMIC_STEP_KEYS = new Set(["expand", "parallel", "collect", "concurrency", "failFast", "phase", "label", "acceptance", "agentContract", "gateOn"]);
|
|
11
|
+
const RUNNER_DYNAMIC_STEP_KEYS = new Set([...DYNAMIC_STEP_KEYS, "effectiveAcceptance", "acceptanceInput", "acceptanceRole", "sessionFiles", "thinkingOverrides"]);
|
|
12
12
|
const DYNAMIC_EXPAND_KEYS = new Set(["from", "item", "key", "maxItems", "onEmpty"]);
|
|
13
13
|
const DYNAMIC_EXPAND_FROM_KEYS = new Set(["output", "path"]);
|
|
14
|
-
const DYNAMIC_PARALLEL_KEYS = new Set(["agent", "task", "phase", "label", "outputSchema", "cwd", "output", "outputMode", "reads", "progress", "skill", "model", "toolBudget", "acceptance"]);
|
|
14
|
+
const DYNAMIC_PARALLEL_KEYS = new Set(["agent", "task", "phase", "label", "outputSchema", "cwd", "output", "outputMode", "reads", "progress", "skill", "model", "fast", "toolBudget", "acceptance", "agentContract", "gateOn"]);
|
|
15
15
|
const RUNNER_DYNAMIC_PARALLEL_KEYS = new Set([
|
|
16
16
|
...DYNAMIC_PARALLEL_KEYS,
|
|
17
17
|
"outputName",
|
|
18
18
|
"structured",
|
|
19
19
|
"inheritProjectContext",
|
|
20
|
+
"inheritGlobalContext",
|
|
20
21
|
"inheritSkills",
|
|
21
22
|
"skills",
|
|
22
23
|
"outputPath",
|
|
24
|
+
"namespaceOutputPath",
|
|
23
25
|
"maxSubagentDepth",
|
|
26
|
+
"timeoutMs",
|
|
27
|
+
"waitToolEnabled",
|
|
28
|
+
"waitToolDefaultTimeoutMs",
|
|
24
29
|
"structuredOutput",
|
|
25
30
|
"structuredOutputSchema",
|
|
26
31
|
"tools",
|
|
32
|
+
"allowNestedSubagents",
|
|
27
33
|
"extensions",
|
|
28
34
|
"subagentOnlyExtensions",
|
|
29
35
|
"mcpDirectTools",
|
|
36
|
+
"mutationTools",
|
|
37
|
+
"capabilityCeiling",
|
|
30
38
|
"completionGuard",
|
|
31
39
|
"systemPrompt",
|
|
32
40
|
"systemPromptMode",
|
|
@@ -34,7 +42,11 @@ const RUNNER_DYNAMIC_PARALLEL_KEYS = new Set([
|
|
|
34
42
|
"modelCandidates",
|
|
35
43
|
"sessionFile",
|
|
36
44
|
"effectiveAcceptance",
|
|
37
|
-
"
|
|
45
|
+
"acceptanceInput",
|
|
46
|
+
"acceptanceRole",
|
|
47
|
+
"parentSessionId",
|
|
48
|
+
"launchResolvedExtensions",
|
|
49
|
+
"requestedCwd"
|
|
38
50
|
]);
|
|
39
51
|
const DYNAMIC_COLLECT_KEYS = new Set(["as", "outputSchema"]);
|
|
40
52
|
export function isSafeOutputName(name) {
|
|
@@ -267,15 +279,16 @@ export function collectDynamicResults(step, items, results) {
|
|
|
267
279
|
...result?.structuredOutput !== undefined ? { structured: result.structuredOutput } : {},
|
|
268
280
|
...result?.error ? { error: result.error } : {},
|
|
269
281
|
...result?.timedOut ? { timedOut: true } : {},
|
|
282
|
+
...result?.stopped ? { stopped: true } : {},
|
|
270
283
|
...result?.savedOutputPath ? { outputPath: result.savedOutputPath } : {},
|
|
271
284
|
...result?.artifactPaths ? { artifactPaths: result.artifactPaths } : {}
|
|
272
285
|
};
|
|
273
286
|
});
|
|
274
287
|
}
|
|
275
|
-
export function validateDynamicCollection(schema, value) {
|
|
288
|
+
export async function validateDynamicCollection(schema, value) {
|
|
276
289
|
if (!schema)
|
|
277
290
|
return;
|
|
278
|
-
const validation = validateStructuredOutputValue(schema, value);
|
|
291
|
+
const validation = await validateStructuredOutputValue(schema, value);
|
|
279
292
|
if (validation.status === "invalid") {
|
|
280
293
|
throw new DynamicFanoutError(`Collected output validation failed: ${validation.message}`);
|
|
281
294
|
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export const DM_SUBAGENT_EXTENSION_BINDINGS_ENV = "DM_SUBAGENT_EXTENSION_BINDINGS";
|
|
2
|
+
export const MAX_EXTENSION_BINDING_NAMESPACES = 16;
|
|
3
|
+
export const MAX_EXTENSION_BINDINGS_BYTES = 16 * 1024;
|
|
4
|
+
export const MAX_EXTENSION_BINDINGS_DEPTH = 16;
|
|
5
|
+
export const MAX_EXTENSION_BINDINGS_PROPERTIES = 256;
|
|
6
|
+
const EXTENSION_BINDING_NAMESPACE = /^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,62})\/[1-9][0-9]{0,8}$/;
|
|
7
|
+
function canonicalizeJson(value, path, depth, seen, propertyCount) {
|
|
8
|
+
if (value === null || typeof value === "string" || typeof value === "boolean")
|
|
9
|
+
return value;
|
|
10
|
+
if (typeof value === "number") {
|
|
11
|
+
if (!Number.isFinite(value))
|
|
12
|
+
throw new Error(`${path} must contain only finite JSON numbers.`);
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
if (typeof value !== "object")
|
|
16
|
+
throw new Error(`${path} must contain only plain JSON values.`);
|
|
17
|
+
if (depth > MAX_EXTENSION_BINDINGS_DEPTH)
|
|
18
|
+
throw new Error(`${path} exceeds the maximum nesting depth of ${MAX_EXTENSION_BINDINGS_DEPTH}.`);
|
|
19
|
+
if (seen.has(value))
|
|
20
|
+
throw new Error(`${path} must not contain cycles.`);
|
|
21
|
+
seen.add(value);
|
|
22
|
+
try {
|
|
23
|
+
if (Array.isArray(value)) {
|
|
24
|
+
const output = [];
|
|
25
|
+
for (let index = 0;index < value.length; index++) {
|
|
26
|
+
if (!Object.prototype.hasOwnProperty.call(value, index))
|
|
27
|
+
throw new Error(`${path} must not contain sparse arrays.`);
|
|
28
|
+
output.push(canonicalizeJson(value[index], `${path}[${index}]`, depth + 1, seen, propertyCount));
|
|
29
|
+
}
|
|
30
|
+
return Object.freeze(output);
|
|
31
|
+
}
|
|
32
|
+
const prototype = Object.getPrototypeOf(value);
|
|
33
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
34
|
+
throw new Error(`${path} must contain only plain JSON objects.`);
|
|
35
|
+
if (Object.getOwnPropertySymbols(value).length > 0)
|
|
36
|
+
throw new Error(`${path} must not contain symbol keys.`);
|
|
37
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
38
|
+
const output = {};
|
|
39
|
+
for (const key of Object.keys(descriptors).sort()) {
|
|
40
|
+
const descriptor = descriptors[key];
|
|
41
|
+
if (!descriptor.enumerable || !("value" in descriptor))
|
|
42
|
+
throw new Error(`${path}.${key} must be an enumerable data property.`);
|
|
43
|
+
propertyCount.value += 1;
|
|
44
|
+
if (propertyCount.value > MAX_EXTENSION_BINDINGS_PROPERTIES)
|
|
45
|
+
throw new Error(`extensionBindings exceeds ${MAX_EXTENSION_BINDINGS_PROPERTIES} total properties.`);
|
|
46
|
+
Object.defineProperty(output, key, { value: canonicalizeJson(descriptor.value, `${path}.${key}`, depth + 1, seen, propertyCount), enumerable: true, writable: false, configurable: false });
|
|
47
|
+
}
|
|
48
|
+
return Object.freeze(output);
|
|
49
|
+
} finally {
|
|
50
|
+
seen.delete(value);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function normalizeExtensionBindings(input) {
|
|
54
|
+
if (input === undefined)
|
|
55
|
+
return;
|
|
56
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
57
|
+
throw new Error("extensionBindings must be a plain JSON object.");
|
|
58
|
+
const prototype = Object.getPrototypeOf(input);
|
|
59
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
60
|
+
throw new Error("extensionBindings must be a plain JSON object.");
|
|
61
|
+
const keys = Object.keys(input);
|
|
62
|
+
if (keys.length > MAX_EXTENSION_BINDING_NAMESPACES)
|
|
63
|
+
throw new Error(`extensionBindings supports at most ${MAX_EXTENSION_BINDING_NAMESPACES} namespaces.`);
|
|
64
|
+
for (const key of keys) {
|
|
65
|
+
if (!EXTENSION_BINDING_NAMESPACE.test(key))
|
|
66
|
+
throw new Error(`extensionBindings namespace '${key}' must use a package-like name followed by '/<positive-version>'.`);
|
|
67
|
+
}
|
|
68
|
+
const value = canonicalizeJson(input, "extensionBindings", 0, new Set, { value: 0 });
|
|
69
|
+
const json = JSON.stringify(value);
|
|
70
|
+
const bytes = Buffer.byteLength(json, "utf8");
|
|
71
|
+
if (bytes > MAX_EXTENSION_BINDINGS_BYTES)
|
|
72
|
+
throw new Error(`extensionBindings canonical JSON is ${bytes} bytes; maximum is ${MAX_EXTENSION_BINDINGS_BYTES}.`);
|
|
73
|
+
return { value, json };
|
|
74
|
+
}
|
|
75
|
+
export function encodeExtensionBindings(input) {
|
|
76
|
+
return input === undefined ? undefined : normalizeExtensionBindings(input).json;
|
|
77
|
+
}
|
|
78
|
+
export function omitExtensionBindingsEnv(env) {
|
|
79
|
+
const { [DM_SUBAGENT_EXTENSION_BINDINGS_ENV]: _extensionBindings, ...sanitized } = env;
|
|
80
|
+
return sanitized;
|
|
81
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
const UNSUPPORTED = {
|
|
2
|
+
steer: "The one-shot stdin adapter closes input after launch and cannot accept live steer messages.",
|
|
3
|
+
resume: "The one-shot stdin adapter has no durable external session identity.",
|
|
4
|
+
structuredOutput: "The generic external CLI adapter does not parse a trusted structured result.",
|
|
5
|
+
toolEvents: "The generic external CLI adapter treats stdout as untrusted text, not native DM tool events.",
|
|
6
|
+
supervisor: "The generic external CLI adapter has no trusted supervisor event transport.",
|
|
7
|
+
forkContext: "Native DM fork context is not available without an adapter-owned handoff artifact.",
|
|
8
|
+
extensionBindings: "Native DM extension bindings are never passed to external runners."
|
|
9
|
+
};
|
|
10
|
+
const CAPABILITY_KEYS = new Set(Object.keys(UNSUPPORTED));
|
|
11
|
+
const PROMPT_FILE_UNSUPPORTED = {
|
|
12
|
+
...UNSUPPORTED,
|
|
13
|
+
steer: "The one-shot prompt-file adapter closes input after launch and cannot accept live steer messages.",
|
|
14
|
+
resume: "The one-shot prompt-file adapter does not retain a durable external session identity."
|
|
15
|
+
};
|
|
16
|
+
export const CODE_OWNED_EXTERNAL_CLI_ADAPTER_IDS = [
|
|
17
|
+
"codex-exec",
|
|
18
|
+
"codex-exec-writer",
|
|
19
|
+
"claude-code",
|
|
20
|
+
"claude-code-writer",
|
|
21
|
+
"cursor-agent",
|
|
22
|
+
"cursor-agent-writer"
|
|
23
|
+
];
|
|
24
|
+
const CODE_OWNED_EXTERNAL_CLI_ADAPTER_ID_SET = new Set(CODE_OWNED_EXTERNAL_CLI_ADAPTER_IDS);
|
|
25
|
+
export const CODE_OWNED_EXTERNAL_CLI_ADAPTER_LABEL = CODE_OWNED_EXTERNAL_CLI_ADAPTER_IDS.map((id) => `'${id}'`).join(", ");
|
|
26
|
+
export function isCodeOwnedExternalCliAdapterId(value) {
|
|
27
|
+
return typeof value === "string" && CODE_OWNED_EXTERNAL_CLI_ADAPTER_ID_SET.has(value);
|
|
28
|
+
}
|
|
29
|
+
const RESERVED_READ_ONLY_ADAPTERS = [
|
|
30
|
+
{ name: "claude-code", writer: "claude-code-writer", access: "file-write" },
|
|
31
|
+
{ name: "codex-exec", writer: "codex-exec-writer", access: "workspace-write" },
|
|
32
|
+
{ name: "cursor-agent", writer: "cursor-agent-writer", access: "workspace-write" }
|
|
33
|
+
];
|
|
34
|
+
export function validateCodeOwnedProfileRunner(agent) {
|
|
35
|
+
const selectionNames = [agent.name, ...agent.localName ? [agent.localName] : [], ...agent.aliases ?? []];
|
|
36
|
+
for (const adapter of RESERVED_READ_ONLY_ADAPTERS) {
|
|
37
|
+
if (selectionNames.includes(adapter.name) && !(agent.runner?.type === "external-cli" && agent.runner.adapter === adapter.name)) {
|
|
38
|
+
return `Selection name '${adapter.name}' is reserved for the read-only '${adapter.name}' adapter. Use '${adapter.writer}' for explicit ${adapter.access} access.`;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
export function parseExternalCliCapabilityNarrowing(value, label) {
|
|
44
|
+
if (value === undefined)
|
|
45
|
+
return;
|
|
46
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
47
|
+
throw new Error(`${label} must be an object.`);
|
|
48
|
+
const input = value;
|
|
49
|
+
const unknown = Object.keys(input).filter((key) => !CAPABILITY_KEYS.has(key));
|
|
50
|
+
if (unknown.length > 0)
|
|
51
|
+
throw new Error(`${label} has unsupported fields: ${unknown.join(", ")}.`);
|
|
52
|
+
for (const [key, setting] of Object.entries(input)) {
|
|
53
|
+
if (setting !== false)
|
|
54
|
+
throw new Error(`${label}.${key} may only be false; user config cannot widen code-owned external adapter capabilities.`);
|
|
55
|
+
}
|
|
56
|
+
return input;
|
|
57
|
+
}
|
|
58
|
+
export function resolveExternalCliRunnerStatus(input) {
|
|
59
|
+
const codexExec = input.adapter === "codex-exec";
|
|
60
|
+
const codexExecWriter = input.adapter === "codex-exec-writer";
|
|
61
|
+
const claudeCode = input.adapter === "claude-code";
|
|
62
|
+
const claudeCodeWriter = input.adapter === "claude-code-writer";
|
|
63
|
+
const cursorAgent = input.adapter === "cursor-agent";
|
|
64
|
+
const cursorAgentWriter = input.adapter === "cursor-agent-writer";
|
|
65
|
+
const cursor = cursorAgent || cursorAgentWriter;
|
|
66
|
+
const unsupported = cursor ? PROMPT_FILE_UNSUPPORTED : UNSUPPORTED;
|
|
67
|
+
return {
|
|
68
|
+
type: "external-cli",
|
|
69
|
+
command: input.command,
|
|
70
|
+
args: input.args ?? [],
|
|
71
|
+
promptDelivery: cursor ? "prompt-file" : input.promptDelivery ?? "stdin",
|
|
72
|
+
adapter: { id: input.adapter ?? "external-cli", version: 1, executionMode: cursor ? "one-shot-prompt-file" : "one-shot-stdin" },
|
|
73
|
+
...codexExec ? { safety: { sandbox: "read-only", approvalPolicy: "never", ephemeral: true } } : {},
|
|
74
|
+
...codexExecWriter ? { safety: { access: "workspace-write", sandbox: "workspace-write", approvalPolicy: "never", ephemeral: true } } : {},
|
|
75
|
+
...claudeCode ? { safety: { access: "read-only", authentication: "existing-cli-required", permissionMode: "plan", tools: "none", mcp: "empty-strict", settingSources: "user", userSettingsTrust: "required", sessionPersistence: false } } : {},
|
|
76
|
+
...claudeCodeWriter ? { safety: { access: "workspace-write", authentication: "existing-cli-required", permissionMode: "acceptEdits", tools: "Read,Write,Edit,Glob,Grep", mcp: "empty-strict", settingSources: "user", userSettingsTrust: "required", sessionPersistence: false } } : {},
|
|
77
|
+
...cursorAgent ? { safety: { access: "read-only", authentication: "cursor-api-key-or-existing-login", mode: "ask", sandbox: "enabled", workspaceTrust: "existing-required", sessionReuse: false } } : {},
|
|
78
|
+
...cursorAgentWriter ? { safety: { access: "workspace-write", authentication: "cursor-api-key-or-existing-login", mode: "print", sandbox: "enabled", workspaceTrust: "existing-required", sessionReuse: false } } : {},
|
|
79
|
+
capabilities: {
|
|
80
|
+
stop: true,
|
|
81
|
+
steer: false,
|
|
82
|
+
resume: false,
|
|
83
|
+
structuredOutput: false,
|
|
84
|
+
toolEvents: false,
|
|
85
|
+
supervisor: "unsupported",
|
|
86
|
+
forkContext: false,
|
|
87
|
+
extensionBindings: false
|
|
88
|
+
},
|
|
89
|
+
unsupportedReasons: unsupported,
|
|
90
|
+
nonResumableReason: unsupported.resume
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export function normalizeExternalCliRunnerStatus(value) {
|
|
94
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
95
|
+
return;
|
|
96
|
+
const input = value;
|
|
97
|
+
if (input.type !== "external-cli" || typeof input.command !== "string" || !input.command.trim())
|
|
98
|
+
return;
|
|
99
|
+
const args = Array.isArray(input.args) && input.args.every((arg) => typeof arg === "string") ? input.args : undefined;
|
|
100
|
+
const promptDelivery = input.promptDelivery === "stdin" ? "stdin" : undefined;
|
|
101
|
+
const adapterId = input.adapter && typeof input.adapter === "object" && !Array.isArray(input.adapter) ? input.adapter.id : undefined;
|
|
102
|
+
if (adapterId === "grok-build") {
|
|
103
|
+
return {
|
|
104
|
+
type: "external-cli",
|
|
105
|
+
command: input.command,
|
|
106
|
+
args: args ?? [],
|
|
107
|
+
promptDelivery: "prompt-file",
|
|
108
|
+
adapter: { id: "grok-build", version: 1, executionMode: "one-shot-prompt-file" },
|
|
109
|
+
capabilities: { stop: true, steer: false, resume: false, structuredOutput: false, toolEvents: false, supervisor: "unsupported", forkContext: false, extensionBindings: false },
|
|
110
|
+
unsupportedReasons: PROMPT_FILE_UNSUPPORTED,
|
|
111
|
+
nonResumableReason: PROMPT_FILE_UNSUPPORTED.resume
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const adapter = isCodeOwnedExternalCliAdapterId(adapterId) ? adapterId : undefined;
|
|
115
|
+
return resolveExternalCliRunnerStatus({ ...adapter ? { adapter } : {}, command: input.command, ...args ? { args } : {}, ...promptDelivery ? { promptDelivery } : {} });
|
|
116
|
+
}
|
|
117
|
+
export function externalCliReceiptMetadata(input) {
|
|
118
|
+
const { runner } = input;
|
|
119
|
+
return {
|
|
120
|
+
adapter: { ...runner.adapter },
|
|
121
|
+
capabilities: { ...runner.capabilities },
|
|
122
|
+
...runner.safety ? { safety: { ...runner.safety } } : {},
|
|
123
|
+
...input.externalProcess ? {
|
|
124
|
+
outputArtifacts: {
|
|
125
|
+
stdoutPath: input.externalProcess.stdoutPath,
|
|
126
|
+
stderrPath: input.externalProcess.stderrPath,
|
|
127
|
+
...input.outputReference || input.externalProcess.finalOutputPath ? { finalOutputPath: input.outputReference ?? input.externalProcess.finalOutputPath } : {}
|
|
128
|
+
}
|
|
129
|
+
} : input.outputReference ? { outputArtifacts: { finalOutputPath: input.outputReference } } : {},
|
|
130
|
+
handoff: { mode: "fresh" },
|
|
131
|
+
supervisor: { mode: "unsupported", reason: runner.unsupportedReasons.supervisor },
|
|
132
|
+
nonResumableReason: runner.nonResumableReason
|
|
133
|
+
};
|
|
134
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
const MAX_PROBE_OUTPUT_BYTES = 256 * 1024;
|
|
5
|
+
const MAX_PROBE_TIMEOUT_MS = 5000;
|
|
6
|
+
const MAX_CACHE_ENTRIES = 64;
|
|
7
|
+
const cache = new Map;
|
|
8
|
+
const lookup = new Map;
|
|
9
|
+
function resolveBinary(command, env) {
|
|
10
|
+
if (path.isAbsolute(command) || command.includes(path.sep)) {
|
|
11
|
+
const resolved = path.resolve(command);
|
|
12
|
+
fs.accessSync(resolved, fs.constants.X_OK);
|
|
13
|
+
return resolved;
|
|
14
|
+
}
|
|
15
|
+
const extensions = process.platform === "win32" ? (env.PATHEXT ?? ".EXE;.CMD;.BAT;.COM").split(";") : [""];
|
|
16
|
+
for (const directory of (env.PATH ?? "").split(path.delimiter)) {
|
|
17
|
+
if (!directory)
|
|
18
|
+
continue;
|
|
19
|
+
for (const extension of extensions) {
|
|
20
|
+
const candidate = path.join(directory, `${command}${extension}`);
|
|
21
|
+
try {
|
|
22
|
+
fs.accessSync(candidate, fs.constants.X_OK);
|
|
23
|
+
return fs.realpathSync(candidate);
|
|
24
|
+
} catch {}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
throw new Error(`External CLI binary '${command}' was not found on PATH.`);
|
|
28
|
+
}
|
|
29
|
+
function probeWithTimeout(binaryPath, args, env, label, timeoutMs, cwd) {
|
|
30
|
+
const result = spawnSync(binaryPath, [...args], {
|
|
31
|
+
cwd,
|
|
32
|
+
env,
|
|
33
|
+
encoding: "utf-8",
|
|
34
|
+
killSignal: "SIGKILL",
|
|
35
|
+
maxBuffer: MAX_PROBE_OUTPUT_BYTES,
|
|
36
|
+
timeout: timeoutMs,
|
|
37
|
+
windowsHide: true
|
|
38
|
+
});
|
|
39
|
+
if (result.error)
|
|
40
|
+
throw new Error(`External CLI ${label} preflight failed: ${result.error.message}`, { cause: result.error });
|
|
41
|
+
if (result.status !== 0)
|
|
42
|
+
throw new Error(`External CLI ${label} preflight exited with code ${result.status}: ${(result.stderr || result.stdout).trim()}`);
|
|
43
|
+
return result.stdout.trim();
|
|
44
|
+
}
|
|
45
|
+
function narrowPositiveInteger(value, ceiling, label) {
|
|
46
|
+
if (value === undefined)
|
|
47
|
+
return ceiling;
|
|
48
|
+
if (!Number.isSafeInteger(value) || value <= 0 || value > ceiling)
|
|
49
|
+
throw new Error(`${label} may only narrow the code-owned ceiling of ${ceiling}.`);
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
function specKey(spec) {
|
|
53
|
+
return JSON.stringify([spec.id, spec.versionArgs, spec.helpArgs, spec.evidenceArgs, spec.evidenceLabel, spec.probeTimeoutMs]);
|
|
54
|
+
}
|
|
55
|
+
export function preflightExternalCli(command, spec, env, cwd) {
|
|
56
|
+
const binaryPath = resolveBinary(command, env);
|
|
57
|
+
const binaryMtimeMs = fs.statSync(binaryPath).mtimeMs;
|
|
58
|
+
const lookupKey = JSON.stringify([binaryPath, binaryMtimeMs, specKey(spec)]);
|
|
59
|
+
const cachedKey = lookup.get(lookupKey);
|
|
60
|
+
const cached = cachedKey ? cache.get(cachedKey) : undefined;
|
|
61
|
+
const probeTimeoutMs = narrowPositiveInteger(spec.probeTimeoutMs, MAX_PROBE_TIMEOUT_MS, "probeTimeoutMs");
|
|
62
|
+
const base = cached ?? {
|
|
63
|
+
binaryPath,
|
|
64
|
+
binaryMtimeMs,
|
|
65
|
+
version: probeWithTimeout(binaryPath, spec.versionArgs, env, "version", probeTimeoutMs, cwd),
|
|
66
|
+
help: probeWithTimeout(binaryPath, spec.helpArgs, env, "help", probeTimeoutMs, cwd)
|
|
67
|
+
};
|
|
68
|
+
const evidence = spec.evidenceArgs ? probeWithTimeout(binaryPath, spec.evidenceArgs, env, spec.evidenceLabel ?? "evidence", probeTimeoutMs, cwd) : undefined;
|
|
69
|
+
const result = { ...base, ...evidence !== undefined ? { evidence } : {}, cacheHit: Boolean(cached) };
|
|
70
|
+
spec.validate?.(result);
|
|
71
|
+
if (!cached) {
|
|
72
|
+
const cacheKey = JSON.stringify([binaryPath, base.version, binaryMtimeMs, specKey(spec)]);
|
|
73
|
+
cache.set(cacheKey, base);
|
|
74
|
+
lookup.set(lookupKey, cacheKey);
|
|
75
|
+
while (cache.size > MAX_CACHE_ENTRIES) {
|
|
76
|
+
const oldest = cache.keys().next().value;
|
|
77
|
+
cache.delete(oldest);
|
|
78
|
+
for (const [candidateLookup, candidateCache] of lookup)
|
|
79
|
+
if (candidateCache === oldest)
|
|
80
|
+
lookup.delete(candidateLookup);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
export function invalidateExternalCliPreflight(command, spec, _reason) {
|
|
86
|
+
const key = specKey(spec);
|
|
87
|
+
for (const [cacheKey, entry] of cache) {
|
|
88
|
+
if (entry.binaryPath === command || entry.binaryPath.endsWith(`${path.sep}${command}`) || cacheKey.includes(key))
|
|
89
|
+
cache.delete(cacheKey);
|
|
90
|
+
}
|
|
91
|
+
for (const [lookupKey, cacheKey] of lookup)
|
|
92
|
+
if (!cache.has(cacheKey))
|
|
93
|
+
lookup.delete(lookupKey);
|
|
94
|
+
}
|
|
95
|
+
export function clearExternalCliPreflightCacheForTests() {
|
|
96
|
+
cache.clear();
|
|
97
|
+
lookup.clear();
|
|
98
|
+
}
|