@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
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
export const SUBAGENT_CAPABILITY_CEILING_VERSION = 1;
|
|
3
|
+
export const SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY = "dm-subagents.capability-ceiling.v1";
|
|
4
|
+
export const SUBAGENT_CAPABILITY_CEILING_ENV = "DM_SUBAGENT_CAPABILITY_CEILING_V1";
|
|
5
|
+
function registry() {
|
|
6
|
+
const key = Symbol.for(SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY);
|
|
7
|
+
const store = globalThis;
|
|
8
|
+
const existing = store[key];
|
|
9
|
+
if (existing instanceof Map)
|
|
10
|
+
return existing;
|
|
11
|
+
const created = new Map;
|
|
12
|
+
store[key] = created;
|
|
13
|
+
return created;
|
|
14
|
+
}
|
|
15
|
+
function validateText(value, field) {
|
|
16
|
+
if (typeof value !== "string" || !value.trim() || /[\u0000-\u001f\u007f]/u.test(value) || Buffer.byteLength(value.trim(), "utf8") > 256) {
|
|
17
|
+
throw new Error(`Invalid capability ceiling ${field}; expected a non-empty string without control characters (max 256 UTF-8 bytes).`);
|
|
18
|
+
}
|
|
19
|
+
return value.trim();
|
|
20
|
+
}
|
|
21
|
+
function normalizeCeiling(ceiling) {
|
|
22
|
+
if (!ceiling || typeof ceiling !== "object" || Array.isArray(ceiling))
|
|
23
|
+
throw new Error("Invalid capability ceiling; expected an object.");
|
|
24
|
+
const hasAllowedTools = Object.hasOwn(ceiling, "allowedTools");
|
|
25
|
+
const hasAllowedAgents = Object.hasOwn(ceiling, "allowedAgents");
|
|
26
|
+
const hasDenyExtensions = Object.hasOwn(ceiling, "denyExtensions");
|
|
27
|
+
if (!hasAllowedTools && !hasAllowedAgents && !hasDenyExtensions)
|
|
28
|
+
throw new Error("Invalid capability ceiling; expected allowedTools, allowedAgents, or denyExtensions.");
|
|
29
|
+
if (hasDenyExtensions && typeof ceiling.denyExtensions !== "boolean")
|
|
30
|
+
throw new Error("Invalid capability ceiling denyExtensions; expected a boolean.");
|
|
31
|
+
const normalizeList = (field, pattern) => {
|
|
32
|
+
if (!Object.hasOwn(ceiling, field))
|
|
33
|
+
return;
|
|
34
|
+
const values = ceiling[field];
|
|
35
|
+
if (!Array.isArray(values))
|
|
36
|
+
throw new Error(`Invalid capability ceiling ${field}; expected an array.`);
|
|
37
|
+
if (values.length > 256)
|
|
38
|
+
throw new Error(`Invalid capability ceiling ${field}; expected at most 256 names.`);
|
|
39
|
+
return [...new Set(values.map((entry) => {
|
|
40
|
+
const name = validateText(entry, `${field} entry`);
|
|
41
|
+
if (!pattern.test(name))
|
|
42
|
+
throw new Error(`Invalid capability ceiling ${field} entry '${name}'.`);
|
|
43
|
+
if (Buffer.byteLength(name, "utf8") > 128)
|
|
44
|
+
throw new Error(`Invalid capability ceiling ${field} entry '${name}'; max 128 UTF-8 bytes.`);
|
|
45
|
+
return name;
|
|
46
|
+
}))].sort();
|
|
47
|
+
};
|
|
48
|
+
const allowedTools = normalizeList("allowedTools", /^[A-Za-z0-9_.:-]+$/u);
|
|
49
|
+
const allowedAgents = normalizeList("allowedAgents", /^[A-Za-z0-9_.:-]+$/u);
|
|
50
|
+
return {
|
|
51
|
+
version: SUBAGENT_CAPABILITY_CEILING_VERSION,
|
|
52
|
+
...allowedTools !== undefined ? { allowedTools } : {},
|
|
53
|
+
...allowedAgents !== undefined ? { allowedAgents } : {},
|
|
54
|
+
denyExtensions: ceiling.denyExtensions === true,
|
|
55
|
+
sources: []
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function parseSubagentCapabilityCeiling(value, field = "capability ceiling") {
|
|
59
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
60
|
+
throw new Error(`Invalid ${field}; expected an object.`);
|
|
61
|
+
const record = value;
|
|
62
|
+
if (record.version !== SUBAGENT_CAPABILITY_CEILING_VERSION)
|
|
63
|
+
throw new Error(`Invalid ${field} version.`);
|
|
64
|
+
const normalized = normalizeCeiling(record);
|
|
65
|
+
const sources = record.sources;
|
|
66
|
+
if (!Array.isArray(sources) || sources.some((source) => typeof source !== "string"))
|
|
67
|
+
throw new Error(`Invalid ${field} sources; expected an array of strings.`);
|
|
68
|
+
normalized.sources = [...new Set(sources.map((source) => validateText(source, `${field} source`)))].sort();
|
|
69
|
+
return normalized;
|
|
70
|
+
}
|
|
71
|
+
export function registerSubagentCapabilityCeiling(options) {
|
|
72
|
+
const sessionId = validateText(options.sessionId, "sessionId");
|
|
73
|
+
const source = validateText(options.source, "source");
|
|
74
|
+
let normalized = normalizeCeiling(options.ceiling);
|
|
75
|
+
const token = Symbol(source);
|
|
76
|
+
const store = registry();
|
|
77
|
+
let session = store.get(sessionId);
|
|
78
|
+
if (!session) {
|
|
79
|
+
session = new Map;
|
|
80
|
+
store.set(sessionId, session);
|
|
81
|
+
}
|
|
82
|
+
const setRegistration = () => {
|
|
83
|
+
normalized = normalizeCeiling(normalized);
|
|
84
|
+
normalized.sources = [source];
|
|
85
|
+
session.set(token, { source, ceiling: normalized });
|
|
86
|
+
};
|
|
87
|
+
setRegistration();
|
|
88
|
+
let disposed = false;
|
|
89
|
+
return {
|
|
90
|
+
update(ceiling) {
|
|
91
|
+
if (disposed)
|
|
92
|
+
throw new Error("Cannot update a disposed capability ceiling handle.");
|
|
93
|
+
normalized = normalizeCeiling(ceiling);
|
|
94
|
+
normalized.sources = [source];
|
|
95
|
+
session.set(token, { source, ceiling: normalized });
|
|
96
|
+
},
|
|
97
|
+
dispose() {
|
|
98
|
+
if (disposed)
|
|
99
|
+
return;
|
|
100
|
+
disposed = true;
|
|
101
|
+
session.delete(token);
|
|
102
|
+
if (session.size === 0)
|
|
103
|
+
store.delete(sessionId);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function intersectSubagentCapabilityCeilings(...ceilings) {
|
|
108
|
+
const active = ceilings.filter((ceiling) => ceiling !== undefined);
|
|
109
|
+
if (active.length === 0)
|
|
110
|
+
return;
|
|
111
|
+
const intersectLists = (field) => {
|
|
112
|
+
const definedLists = active.filter((ceiling) => ceiling[field] !== undefined).map((ceiling) => new Set(ceiling[field]));
|
|
113
|
+
if (definedLists.length === 0)
|
|
114
|
+
return;
|
|
115
|
+
return [...definedLists[0]].filter((entry) => definedLists.every((list) => list.has(entry))).sort();
|
|
116
|
+
};
|
|
117
|
+
const allowedTools = intersectLists("allowedTools");
|
|
118
|
+
const allowedAgents = intersectLists("allowedAgents");
|
|
119
|
+
return {
|
|
120
|
+
version: SUBAGENT_CAPABILITY_CEILING_VERSION,
|
|
121
|
+
...allowedTools !== undefined ? { allowedTools } : {},
|
|
122
|
+
...allowedAgents !== undefined ? { allowedAgents } : {},
|
|
123
|
+
denyExtensions: active.some((ceiling) => ceiling.denyExtensions),
|
|
124
|
+
sources: [...new Set(active.flatMap((ceiling) => ceiling.sources))].sort()
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export function resolveSubagentCapabilityCeiling(sessionId, inherited) {
|
|
128
|
+
const active = [];
|
|
129
|
+
if (sessionId) {
|
|
130
|
+
const registrations = registry().get(sessionId);
|
|
131
|
+
if (registrations)
|
|
132
|
+
active.push(...Array.from(registrations.values(), ({ ceiling }) => ceiling));
|
|
133
|
+
}
|
|
134
|
+
return intersectSubagentCapabilityCeilings(inherited, ...active);
|
|
135
|
+
}
|
|
136
|
+
export function resolveCurrentSubagentCapabilityCeiling(sessionId) {
|
|
137
|
+
return resolveSubagentCapabilityCeiling(sessionId, decodeSubagentCapabilityCeiling(process.env[SUBAGENT_CAPABILITY_CEILING_ENV]));
|
|
138
|
+
}
|
|
139
|
+
export function isAgentAllowedByCapabilityCeiling(agentName, ceiling) {
|
|
140
|
+
return ceiling?.allowedAgents === undefined || ceiling.allowedAgents.includes(agentName);
|
|
141
|
+
}
|
|
142
|
+
export function capabilityCeilingAgentRestrictionMessage(agentName, ceiling) {
|
|
143
|
+
if (isAgentAllowedByCapabilityCeiling(agentName, ceiling))
|
|
144
|
+
return;
|
|
145
|
+
const sources = ceiling?.sources.length ? ceiling.sources.join(", ") : "unknown source";
|
|
146
|
+
const allowed = ceiling?.allowedAgents?.length ? ceiling.allowedAgents.join(", ") : "(none)";
|
|
147
|
+
return `Capability ceiling from ${sources} does not allow agent '${agentName}'. Allowed agents: ${allowed}.`;
|
|
148
|
+
}
|
|
149
|
+
export function assertAgentAllowedByCapabilityCeiling(agentName, ceiling) {
|
|
150
|
+
const message = capabilityCeilingAgentRestrictionMessage(agentName, ceiling);
|
|
151
|
+
if (message)
|
|
152
|
+
throw new Error(message);
|
|
153
|
+
}
|
|
154
|
+
export function capabilityCeilingAgentRestrictionSources(ceiling) {
|
|
155
|
+
return ceiling?.allowedAgents === undefined ? undefined : [...ceiling.sources];
|
|
156
|
+
}
|
|
157
|
+
export function encodeSubagentCapabilityCeiling(ceiling) {
|
|
158
|
+
if (!ceiling)
|
|
159
|
+
return;
|
|
160
|
+
return Buffer.from(JSON.stringify(ceiling), "utf8").toString("base64url");
|
|
161
|
+
}
|
|
162
|
+
export function decodeSubagentCapabilityCeiling(value) {
|
|
163
|
+
if (value === undefined || value === "")
|
|
164
|
+
return;
|
|
165
|
+
let parsed;
|
|
166
|
+
try {
|
|
167
|
+
parsed = JSON.parse(Buffer.from(value, "base64url").toString("utf8"));
|
|
168
|
+
} catch (error) {
|
|
169
|
+
throw new Error(`Invalid inherited capability ceiling: ${error instanceof Error ? error.message : String(error)}`);
|
|
170
|
+
}
|
|
171
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed) || parsed.version !== SUBAGENT_CAPABILITY_CEILING_VERSION) {
|
|
172
|
+
throw new Error("Invalid inherited capability ceiling version.");
|
|
173
|
+
}
|
|
174
|
+
return parseSubagentCapabilityCeiling(parsed, "inherited capability ceiling");
|
|
175
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export function asyncStatusChildIdentity(step, index) {
|
|
2
|
+
return step.workflowKey ?? step.runId ?? `step:${index}`;
|
|
3
|
+
}
|
|
4
|
+
export function asyncStatusChildIdentityCandidates(step, index) {
|
|
5
|
+
return [...new Set([step.workflowKey, step.runId, `step:${index}`].filter((value) => typeof value === "string" && value.length > 0))];
|
|
6
|
+
}
|
|
7
|
+
export function resolveAsyncStatusChild(status, childId, options = {}) {
|
|
8
|
+
const matches = [];
|
|
9
|
+
for (const [index, step] of (status.steps ?? []).entries()) {
|
|
10
|
+
if (asyncStatusChildIdentityCandidates(step, index).includes(childId)) {
|
|
11
|
+
matches.push({ index, step, id: asyncStatusChildIdentity(step, index) });
|
|
12
|
+
}
|
|
13
|
+
if (options.includeNested) {
|
|
14
|
+
const findNested = (children) => {
|
|
15
|
+
for (const nested of children ?? []) {
|
|
16
|
+
if (nested.id === childId)
|
|
17
|
+
matches.push({ index, step, id: nested.id, nested });
|
|
18
|
+
findNested(nested.children);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
findNested(step.children);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (matches.length === 1)
|
|
25
|
+
return { ok: true, child: matches[0] };
|
|
26
|
+
if (matches.length > 1)
|
|
27
|
+
return { ok: false, code: "ambiguous", message: `Child '${childId}' is ambiguous under async run '${status.runId}'.` };
|
|
28
|
+
return { ok: false, code: "not_found", message: `Child '${childId}' was not found under async run '${status.runId}'.` };
|
|
29
|
+
}
|
|
30
|
+
export function isStoppableAsyncStatusStep(step) {
|
|
31
|
+
return step.status === "pending" || step.status === "running";
|
|
32
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import { resolveChildCwd } from "../../shared/utils.js";
|
|
3
|
+
import { resolveSingleOutputPath } from "./single-output.js";
|
|
4
|
+
export function normalizeOutputOverride(output) {
|
|
5
|
+
if (output === false || output === "false")
|
|
6
|
+
return false;
|
|
7
|
+
if (output === true || output === "true")
|
|
8
|
+
return;
|
|
9
|
+
return typeof output === "string" && output.length > 0 ? output : undefined;
|
|
10
|
+
}
|
|
11
|
+
export function resolveStepBehavior(agentConfig, stepOverrides, chainSkills) {
|
|
12
|
+
const stepOutput = normalizeOutputOverride(stepOverrides.output);
|
|
13
|
+
const output = stepOutput !== undefined ? stepOutput : normalizeOutputOverride(agentConfig.output) ?? false;
|
|
14
|
+
const reads = stepOverrides.reads !== undefined ? stepOverrides.reads : agentConfig.defaultReads ?? false;
|
|
15
|
+
const progress = stepOverrides.progress !== undefined ? stepOverrides.progress : agentConfig.defaultProgress ?? false;
|
|
16
|
+
let skills;
|
|
17
|
+
if (stepOverrides.skills === false) {
|
|
18
|
+
skills = false;
|
|
19
|
+
} else if (stepOverrides.skills !== undefined) {
|
|
20
|
+
skills = [...stepOverrides.skills];
|
|
21
|
+
if (chainSkills && chainSkills.length > 0) {
|
|
22
|
+
skills = [...new Set([...skills, ...chainSkills])];
|
|
23
|
+
}
|
|
24
|
+
} else {
|
|
25
|
+
skills = agentConfig.skills ? [...agentConfig.skills] : [];
|
|
26
|
+
if (chainSkills && chainSkills.length > 0) {
|
|
27
|
+
skills = [...new Set([...skills, ...chainSkills])];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const outputMode = stepOverrides.outputMode ?? agentConfig.outputMode ?? "inline";
|
|
31
|
+
const model = stepOverrides.model ?? agentConfig.model;
|
|
32
|
+
const fast = stepOverrides.fast ?? agentConfig.fast;
|
|
33
|
+
return { output, outputMode, reads, progress, skills, model, fast };
|
|
34
|
+
}
|
|
35
|
+
export function resolveTaskTextForFileUpdatePolicy(task, originalTask) {
|
|
36
|
+
if (!task)
|
|
37
|
+
return originalTask;
|
|
38
|
+
return originalTask ? task.replaceAll("{task}", originalTask) : task;
|
|
39
|
+
}
|
|
40
|
+
export function taskDisallowsFileUpdates(task) {
|
|
41
|
+
if (!task)
|
|
42
|
+
return false;
|
|
43
|
+
return /\breview[- ]only\b/i.test(task) || /\bread[- ]only\s+(?:review|audit|inspection|pass)\b/i.test(task) || /\b(?:no|without)\s+(?:file\s+)?edits?\b/i.test(task) || /\b(?:do not|don't|must not)\s+(?:edit|modify|write|touch)\b/i.test(task) || /\bleave\s+files?\s+unchanged\b/i.test(task);
|
|
44
|
+
}
|
|
45
|
+
export function suppressProgressForReadOnlyTask(behavior, task, originalTask) {
|
|
46
|
+
const policyTask = resolveTaskTextForFileUpdatePolicy(task, originalTask);
|
|
47
|
+
return behavior.progress && taskDisallowsFileUpdates(policyTask) ? { ...behavior, progress: false } : behavior;
|
|
48
|
+
}
|
|
49
|
+
export function planChildLaunch(input) {
|
|
50
|
+
const stepCwd = resolveChildCwd(input.runnerCwd, input.stepCwdInput);
|
|
51
|
+
const instructionCwd = input.behaviorCwd ?? stepCwd;
|
|
52
|
+
const readExistenceCwd = input.behaviorCwd ? stepCwd : instructionCwd;
|
|
53
|
+
let behavior = suppressProgressForReadOnlyTask(input.resolvedBehavior ?? resolveStepBehavior(input.agentConfig, input.stepOverrides, input.chainSkills), input.task, input.originalTask);
|
|
54
|
+
const inheritedRelativeParallelOutput = Boolean(input.parallelOutputNamespace && input.stepOverrides.output === undefined && typeof behavior.output === "string" && !path.isAbsolute(behavior.output));
|
|
55
|
+
if (inheritedRelativeParallelOutput && input.parallelOutputNamespace?.taskIndex !== undefined) {
|
|
56
|
+
behavior = {
|
|
57
|
+
...behavior,
|
|
58
|
+
output: path.join(`parallel-${input.parallelOutputNamespace.stepIndex}`, `${input.parallelOutputNamespace.taskIndex}-${input.agentConfig.name}`, behavior.output)
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const namespaceOutputPath = inheritedRelativeParallelOutput && input.parallelOutputNamespace?.taskIndex === undefined;
|
|
62
|
+
const skillNames = behavior.skills === false ? [] : behavior.skills;
|
|
63
|
+
const outputPath = resolveSingleOutputPath(behavior.output, input.runtimeCwd, instructionCwd, input.outputBaseDir);
|
|
64
|
+
return { stepCwd, instructionCwd, readExistenceCwd, behavior, inheritedRelativeParallelOutput, namespaceOutputPath, outputPath, skillNames };
|
|
65
|
+
}
|