@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,15 +1,120 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
2
3
|
import * as os from "node:os";
|
|
3
4
|
import * as path from "node:path";
|
|
4
|
-
import {
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
6
|
+
import { DM_CODING_AGENT_PACKAGE_ROOT_ENV } from "../../shared/utils.js";
|
|
5
7
|
export const STRUCTURED_OUTPUT_SCHEMA_ENV = "DM_SUBAGENT_STRUCTURED_OUTPUT_SCHEMA";
|
|
6
8
|
export const STRUCTURED_OUTPUT_CAPTURE_ENV = "DM_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE";
|
|
9
|
+
export const STRUCTURED_OUTPUT_ACCEPTANCE_CAPTURE_ENV = "DM_SUBAGENT_STRUCTURED_OUTPUT_ACCEPTANCE_CAPTURE";
|
|
10
|
+
export const MISSING_STRUCTURED_OUTPUT_CALL_ERROR = "Missing structured_output call; this step has outputSchema and must finish by calling structured_output.";
|
|
11
|
+
const SCHEMA_MAP_KEYWORDS = ["properties", "patternProperties", "$defs", "definitions", "dependentSchemas"];
|
|
12
|
+
const SCHEMA_SINGLE_KEYWORDS = ["additionalItems", "additionalProperties", "contains", "not", "propertyNames", "if", "then", "else", "unevaluatedItems", "unevaluatedProperties", "contentSchema"];
|
|
13
|
+
const SCHEMA_ARRAY_KEYWORDS = ["allOf", "anyOf", "oneOf", "prefixItems"];
|
|
14
|
+
function rewriteLocalJsonPointerRefs(schema, pointerPrefix, inheritsWrapperResource = true) {
|
|
15
|
+
if (typeof schema === "boolean" || !schema || typeof schema !== "object" || Array.isArray(schema))
|
|
16
|
+
return schema;
|
|
17
|
+
const source = schema;
|
|
18
|
+
const rewritten = { ...source };
|
|
19
|
+
const sharesWrapperResource = inheritsWrapperResource && typeof source.$id !== "string";
|
|
20
|
+
if (sharesWrapperResource) {
|
|
21
|
+
for (const keyword of ["$ref", "$dynamicRef", "$recursiveRef"]) {
|
|
22
|
+
const ref = source[keyword];
|
|
23
|
+
if (ref === "#")
|
|
24
|
+
rewritten[keyword] = pointerPrefix;
|
|
25
|
+
else if (typeof ref === "string" && ref.startsWith("#/"))
|
|
26
|
+
rewritten[keyword] = `${pointerPrefix}${ref.slice(1)}`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
for (const keyword of SCHEMA_MAP_KEYWORDS) {
|
|
30
|
+
const entries = source[keyword];
|
|
31
|
+
if (!entries || typeof entries !== "object" || Array.isArray(entries))
|
|
32
|
+
continue;
|
|
33
|
+
rewritten[keyword] = Object.fromEntries(Object.entries(entries).map(([name, nested]) => [
|
|
34
|
+
name,
|
|
35
|
+
rewriteLocalJsonPointerRefs(nested, pointerPrefix, sharesWrapperResource)
|
|
36
|
+
]));
|
|
37
|
+
}
|
|
38
|
+
const items = source.items;
|
|
39
|
+
if (Array.isArray(items))
|
|
40
|
+
rewritten.items = items.map((nested) => rewriteLocalJsonPointerRefs(nested, pointerPrefix, sharesWrapperResource));
|
|
41
|
+
else if (items !== undefined)
|
|
42
|
+
rewritten.items = rewriteLocalJsonPointerRefs(items, pointerPrefix, sharesWrapperResource);
|
|
43
|
+
for (const keyword of SCHEMA_SINGLE_KEYWORDS) {
|
|
44
|
+
if (source[keyword] !== undefined)
|
|
45
|
+
rewritten[keyword] = rewriteLocalJsonPointerRefs(source[keyword], pointerPrefix, sharesWrapperResource);
|
|
46
|
+
}
|
|
47
|
+
for (const keyword of SCHEMA_ARRAY_KEYWORDS) {
|
|
48
|
+
if (Array.isArray(source[keyword]))
|
|
49
|
+
rewritten[keyword] = source[keyword].map((nested) => rewriteLocalJsonPointerRefs(nested, pointerPrefix, sharesWrapperResource));
|
|
50
|
+
}
|
|
51
|
+
const dependencies = source.dependencies;
|
|
52
|
+
if (dependencies && typeof dependencies === "object" && !Array.isArray(dependencies)) {
|
|
53
|
+
rewritten.dependencies = Object.fromEntries(Object.entries(dependencies).map(([name, nested]) => [
|
|
54
|
+
name,
|
|
55
|
+
Array.isArray(nested) ? nested : rewriteLocalJsonPointerRefs(nested, pointerPrefix, sharesWrapperResource)
|
|
56
|
+
]));
|
|
57
|
+
}
|
|
58
|
+
return rewritten;
|
|
59
|
+
}
|
|
60
|
+
export function createStructuredOutputToolParameters(schema, options = {}) {
|
|
61
|
+
return {
|
|
62
|
+
type: "object",
|
|
63
|
+
properties: {
|
|
64
|
+
value: rewriteLocalJsonPointerRefs(schema, "#/properties/value"),
|
|
65
|
+
...options.acceptanceReport ? { acceptanceReport: { type: "object" } } : {}
|
|
66
|
+
},
|
|
67
|
+
required: ["value"],
|
|
68
|
+
additionalProperties: false
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
let cachedCompile;
|
|
72
|
+
export async function resolveCompileFromPackageRoot(packageRoot) {
|
|
73
|
+
const requireFromRoot = createRequire(path.join(packageRoot, "package.json"));
|
|
74
|
+
const resolved = requireFromRoot.resolve("typebox/compile");
|
|
75
|
+
const mod = await import(pathToFileURL(resolved).href);
|
|
76
|
+
return typeof mod.Compile === "function" ? mod.Compile : undefined;
|
|
77
|
+
}
|
|
78
|
+
async function importCompile() {
|
|
79
|
+
const failures = [];
|
|
80
|
+
try {
|
|
81
|
+
const mod = await import("typebox/compile");
|
|
82
|
+
if (typeof mod.Compile === "function")
|
|
83
|
+
return mod.Compile;
|
|
84
|
+
failures.push("typebox/compile did not export a Compile function");
|
|
85
|
+
} catch (error) {
|
|
86
|
+
failures.push(`direct import failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
87
|
+
}
|
|
88
|
+
const packageRoot = process.env[DM_CODING_AGENT_PACKAGE_ROOT_ENV];
|
|
89
|
+
if (packageRoot) {
|
|
90
|
+
try {
|
|
91
|
+
const compile = await resolveCompileFromPackageRoot(packageRoot);
|
|
92
|
+
if (compile)
|
|
93
|
+
return compile;
|
|
94
|
+
failures.push("DM package root typebox/compile did not export a Compile function");
|
|
95
|
+
} catch (error) {
|
|
96
|
+
failures.push(`DM package root import failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
97
|
+
}
|
|
98
|
+
} else {
|
|
99
|
+
failures.push(`${DM_CODING_AGENT_PACKAGE_ROOT_ENV} is not set`);
|
|
100
|
+
}
|
|
101
|
+
throw new Error(`Cannot load typebox/compile for structured output validation (${failures.join("; ")})`);
|
|
102
|
+
}
|
|
103
|
+
function loadCompile() {
|
|
104
|
+
if (!cachedCompile) {
|
|
105
|
+
cachedCompile = importCompile().catch((error) => {
|
|
106
|
+
cachedCompile = undefined;
|
|
107
|
+
throw error;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return cachedCompile;
|
|
111
|
+
}
|
|
7
112
|
export function assertJsonSchemaObject(schema, label = "outputSchema") {
|
|
8
113
|
if (!schema || typeof schema !== "object" || Array.isArray(schema)) {
|
|
9
114
|
throw new Error(`${label} must be a JSON Schema object.`);
|
|
10
115
|
}
|
|
11
116
|
}
|
|
12
|
-
export function createStructuredOutputRuntime(schema, baseDir) {
|
|
117
|
+
export function createStructuredOutputRuntime(schema, baseDir, options = {}) {
|
|
13
118
|
assertJsonSchemaObject(schema);
|
|
14
119
|
const rootDir = baseDir ?? os.tmpdir();
|
|
15
120
|
fs.mkdirSync(rootDir, { recursive: true });
|
|
@@ -17,12 +122,13 @@ export function createStructuredOutputRuntime(schema, baseDir) {
|
|
|
17
122
|
const schemaPath = path.join(dir, "schema.json");
|
|
18
123
|
const outputPath = path.join(dir, "output.json");
|
|
19
124
|
fs.writeFileSync(schemaPath, JSON.stringify(schema), { mode: 384 });
|
|
20
|
-
return { schema, schemaPath, outputPath };
|
|
125
|
+
return { schema, schemaPath, outputPath, ...options.captureAcceptanceReport ? { acceptanceReportPath: path.join(dir, "acceptance-report.json") } : {} };
|
|
21
126
|
}
|
|
22
|
-
export function validateStructuredOutputValue(schema, value) {
|
|
127
|
+
export async function validateStructuredOutputValue(schema, value) {
|
|
128
|
+
const compile = await loadCompile();
|
|
23
129
|
let validator;
|
|
24
130
|
try {
|
|
25
|
-
validator =
|
|
131
|
+
validator = compile(schema);
|
|
26
132
|
} catch (error) {
|
|
27
133
|
return { status: "invalid", message: `invalid outputSchema: ${error instanceof Error ? error.message : String(error)}` };
|
|
28
134
|
}
|
|
@@ -34,9 +140,9 @@ export function validateStructuredOutputValue(schema, value) {
|
|
|
34
140
|
});
|
|
35
141
|
return { status: "invalid", message: errors.join("; ") || "schema validation failed" };
|
|
36
142
|
}
|
|
37
|
-
export function readStructuredOutput(runtime) {
|
|
143
|
+
export async function readStructuredOutput(runtime) {
|
|
38
144
|
if (!fs.existsSync(runtime.outputPath)) {
|
|
39
|
-
return { error:
|
|
145
|
+
return { error: MISSING_STRUCTURED_OUTPUT_CALL_ERROR };
|
|
40
146
|
}
|
|
41
147
|
let value;
|
|
42
148
|
try {
|
|
@@ -44,11 +150,24 @@ export function readStructuredOutput(runtime) {
|
|
|
44
150
|
} catch (error) {
|
|
45
151
|
return { error: `Failed to read structured output: ${error instanceof Error ? error.message : String(error)}` };
|
|
46
152
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
153
|
+
try {
|
|
154
|
+
const validation = await validateStructuredOutputValue(runtime.schema, value);
|
|
155
|
+
if (validation.status === "invalid")
|
|
156
|
+
return { error: `Structured output validation failed: ${validation.message}` };
|
|
157
|
+
} catch (error) {
|
|
158
|
+
return { error: `Failed to validate structured output: ${error instanceof Error ? error.message : String(error)}` };
|
|
159
|
+
}
|
|
50
160
|
return { value };
|
|
51
161
|
}
|
|
162
|
+
export function readStructuredOutputAcceptanceReport(runtime) {
|
|
163
|
+
if (!runtime.acceptanceReportPath || !fs.existsSync(runtime.acceptanceReportPath))
|
|
164
|
+
return {};
|
|
165
|
+
try {
|
|
166
|
+
return { value: JSON.parse(fs.readFileSync(runtime.acceptanceReportPath, "utf-8")) };
|
|
167
|
+
} catch (error) {
|
|
168
|
+
return { error: `Failed to read structured output acceptance report: ${error instanceof Error ? error.message : String(error)}` };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
52
171
|
export function cleanupStructuredOutputRuntime(runtime) {
|
|
53
172
|
if (!runtime)
|
|
54
173
|
return;
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import { isToolTimeoutExempt } from "./tool-timeout.js";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { previewDisplayText } from "../../shared/display-text.js";
|
|
1
4
|
const CONTROL_EVENT_TYPES = ["active_long_running", "needs_attention"];
|
|
2
5
|
const CONTROL_NOTIFICATION_CHANNELS = ["event", "async", "intercom"];
|
|
3
6
|
const DEFAULT_NOTIFY_ON = ["active_long_running", "needs_attention"];
|
|
4
7
|
export const DEFAULT_CONTROL_CONFIG = {
|
|
5
8
|
enabled: true,
|
|
6
9
|
needsAttentionAfterMs: 60000,
|
|
10
|
+
needsAttentionAfterMsIsExplicit: false,
|
|
7
11
|
activeNoticeAfterMs: 240000,
|
|
8
12
|
failedToolAttemptsBeforeAttention: 3,
|
|
9
13
|
notifyOn: DEFAULT_NOTIFY_ON,
|
|
@@ -27,7 +31,10 @@ function parseControlList(value, allowed) {
|
|
|
27
31
|
}
|
|
28
32
|
export function resolveControlConfig(globalConfig, override) {
|
|
29
33
|
const enabled = override?.enabled ?? globalConfig?.enabled ?? DEFAULT_CONTROL_CONFIG.enabled;
|
|
30
|
-
const
|
|
34
|
+
const overrideNeedsAttentionAfterMs = parsePositiveInt(override?.needsAttentionAfterMs);
|
|
35
|
+
const globalNeedsAttentionAfterMs = parsePositiveInt(globalConfig?.needsAttentionAfterMs);
|
|
36
|
+
const needsAttentionAfterMs = overrideNeedsAttentionAfterMs ?? globalNeedsAttentionAfterMs ?? DEFAULT_CONTROL_CONFIG.needsAttentionAfterMs;
|
|
37
|
+
const needsAttentionAfterMsIsExplicit = overrideNeedsAttentionAfterMs !== undefined || globalNeedsAttentionAfterMs !== undefined;
|
|
31
38
|
const activeNoticeAfterMs = parsePositiveInt(override?.activeNoticeAfterMs) ?? parsePositiveInt(globalConfig?.activeNoticeAfterMs) ?? DEFAULT_CONTROL_CONFIG.activeNoticeAfterMs;
|
|
32
39
|
const activeNoticeAfterTurns = parsePositiveInt(override?.activeNoticeAfterTurns) ?? parsePositiveInt(globalConfig?.activeNoticeAfterTurns);
|
|
33
40
|
const activeNoticeAfterTokens = parsePositiveInt(override?.activeNoticeAfterTokens) ?? parsePositiveInt(globalConfig?.activeNoticeAfterTokens);
|
|
@@ -37,6 +44,7 @@ export function resolveControlConfig(globalConfig, override) {
|
|
|
37
44
|
return {
|
|
38
45
|
enabled,
|
|
39
46
|
needsAttentionAfterMs,
|
|
47
|
+
needsAttentionAfterMsIsExplicit,
|
|
40
48
|
activeNoticeAfterMs,
|
|
41
49
|
activeNoticeAfterTurns,
|
|
42
50
|
activeNoticeAfterTokens,
|
|
@@ -45,13 +53,36 @@ export function resolveControlConfig(globalConfig, override) {
|
|
|
45
53
|
notifyChannels: [...notifyChannels]
|
|
46
54
|
};
|
|
47
55
|
}
|
|
56
|
+
function scaledNeedsAttentionAfterMs(config, thinking) {
|
|
57
|
+
if (config.needsAttentionAfterMsIsExplicit !== false)
|
|
58
|
+
return config.needsAttentionAfterMs;
|
|
59
|
+
switch (thinking) {
|
|
60
|
+
case "medium":
|
|
61
|
+
return config.needsAttentionAfterMs * 2;
|
|
62
|
+
case "high":
|
|
63
|
+
return config.needsAttentionAfterMs * 5;
|
|
64
|
+
case "xhigh":
|
|
65
|
+
case "max":
|
|
66
|
+
return config.needsAttentionAfterMs * 10;
|
|
67
|
+
default:
|
|
68
|
+
return config.needsAttentionAfterMs;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
48
71
|
export function deriveActivityState(input) {
|
|
49
|
-
if (!input.config.enabled)
|
|
72
|
+
if (!input.config.enabled || input.currentTool)
|
|
50
73
|
return;
|
|
51
74
|
const now = input.now ?? Date.now();
|
|
52
75
|
const lastActivity = input.lastActivityAt ?? input.startedAt;
|
|
53
76
|
const ageMs = Math.max(0, now - lastActivity);
|
|
54
|
-
return ageMs > input.config.
|
|
77
|
+
return ageMs > scaledNeedsAttentionAfterMs(input.config, input.thinking) ? "needs_attention" : undefined;
|
|
78
|
+
}
|
|
79
|
+
export function shouldEmitOpenToolAttention(input) {
|
|
80
|
+
if (!input.config.enabled || !input.currentTool || input.currentToolStartedAt === undefined)
|
|
81
|
+
return false;
|
|
82
|
+
if (isToolTimeoutExempt(input.currentTool))
|
|
83
|
+
return false;
|
|
84
|
+
const now = input.now ?? Date.now();
|
|
85
|
+
return Math.max(0, now - input.currentToolStartedAt) >= input.config.activeNoticeAfterMs;
|
|
55
86
|
}
|
|
56
87
|
export function buildControlEvent(input) {
|
|
57
88
|
const ts = input.ts ?? Date.now();
|
|
@@ -76,7 +107,11 @@ export function buildControlEvent(input) {
|
|
|
76
107
|
...input.currentToolDurationMs !== undefined ? { currentToolDurationMs: input.currentToolDurationMs } : {},
|
|
77
108
|
...input.currentPath ? { currentPath: input.currentPath } : {},
|
|
78
109
|
...elapsedMs !== undefined ? { elapsedMs } : {},
|
|
79
|
-
...input.recentFailureSummary ? { recentFailureSummary: input.recentFailureSummary } : {}
|
|
110
|
+
...input.recentFailureSummary ? { recentFailureSummary: input.recentFailureSummary } : {},
|
|
111
|
+
...input.workflowKey ? { workflowKey: input.workflowKey } : {},
|
|
112
|
+
...input.phase ? { phase: input.phase } : {},
|
|
113
|
+
...input.label ? { label: input.label } : {},
|
|
114
|
+
...input.taskPreview ? { taskPreview: previewDisplayText(input.taskPreview, 160) } : {}
|
|
80
115
|
};
|
|
81
116
|
}
|
|
82
117
|
export function shouldNotifyControlEvent(config, event) {
|
|
@@ -84,7 +119,8 @@ export function shouldNotifyControlEvent(config, event) {
|
|
|
84
119
|
}
|
|
85
120
|
export function controlNotificationKey(event, childIntercomTarget) {
|
|
86
121
|
const childKey = childIntercomTarget ?? (event.index !== undefined ? `${event.runId}:${event.index}` : event.runId);
|
|
87
|
-
|
|
122
|
+
const contextHash = createHash("sha256").update(formatControlNudge(event)).digest("hex").slice(0, 8);
|
|
123
|
+
return `${childKey}:${event.type}:${event.reason ?? "idle"}:${contextHash}`;
|
|
88
124
|
}
|
|
89
125
|
export function claimControlNotification(config, event, seenKeys, childIntercomTarget) {
|
|
90
126
|
if (!shouldNotifyControlEvent(config, event))
|
|
@@ -111,6 +147,18 @@ function formatLongRunningFacts(event) {
|
|
|
111
147
|
facts.push(`path ${event.currentPath}`);
|
|
112
148
|
return facts.length > 0 ? facts.join(" | ") : undefined;
|
|
113
149
|
}
|
|
150
|
+
export function formatControlNudge(event) {
|
|
151
|
+
const scope = event.label ?? event.phase ?? event.workflowKey ?? event.taskPreview;
|
|
152
|
+
if (event.recentFailureSummary)
|
|
153
|
+
return previewDisplayText(`Resolve the recent failure${scope ? ` for ${scope}` : ""}: ${event.recentFailureSummary}. Report the smallest next step or ask for a decision.`, 160);
|
|
154
|
+
if (event.currentTool || event.currentPath) {
|
|
155
|
+
const current = [event.currentTool ? `tool ${event.currentTool}` : undefined, event.currentPath ? `path ${event.currentPath}` : undefined].filter(Boolean).join(" at ");
|
|
156
|
+
return previewDisplayText(`Check ${current}${scope ? ` for ${scope}` : ""}. Report the smallest next step or ask for a decision.`, 160);
|
|
157
|
+
}
|
|
158
|
+
if (scope)
|
|
159
|
+
return previewDisplayText(`Continue ${scope}. Report the smallest next step or ask for a decision.`, 160);
|
|
160
|
+
return "What are you blocked on? Reply with the smallest next step or ask for a decision.";
|
|
161
|
+
}
|
|
114
162
|
export function formatControlNoticeMessage(event, childIntercomTarget) {
|
|
115
163
|
const runTarget = event.runId;
|
|
116
164
|
if (event.reason === "completion_guard") {
|
|
@@ -123,8 +171,9 @@ export function formatControlNoticeMessage(event, childIntercomTarget) {
|
|
|
123
171
|
].filter((line) => Boolean(line)).join(`
|
|
124
172
|
`);
|
|
125
173
|
}
|
|
126
|
-
const nudgeMessage =
|
|
127
|
-
const
|
|
174
|
+
const nudgeMessage = formatControlNudge(event);
|
|
175
|
+
const steerCommand = `subagent({ action: "steer", id: "${runTarget}", ${event.index !== undefined ? `index: ${event.index}, ` : ""}message: ${JSON.stringify(nudgeMessage)} })`;
|
|
176
|
+
const nestedResumeCommand = `subagent({ action: "resume", id: "${runTarget}", message: ${JSON.stringify(nudgeMessage)} })`;
|
|
128
177
|
if (event.type === "active_long_running") {
|
|
129
178
|
const facts = formatLongRunningFacts(event);
|
|
130
179
|
return [
|
|
@@ -132,21 +181,27 @@ export function formatControlNoticeMessage(event, childIntercomTarget) {
|
|
|
132
181
|
`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : ""}`,
|
|
133
182
|
`Signal: ${event.message}`,
|
|
134
183
|
facts ? `Facts: ${facts}` : undefined,
|
|
135
|
-
"Hint: Inspect status
|
|
136
|
-
`
|
|
184
|
+
"Hint: Inspect status first. Use steer for a top-level live async child, routed resume for a live nested child, or resume to revive a paused/completed/failed child.",
|
|
185
|
+
`Top-level live async nudge: ${steerCommand}`,
|
|
186
|
+
`Routed live nested nudge: ${nestedResumeCommand}`,
|
|
137
187
|
childIntercomTarget ? `Direct intercom target: ${childIntercomTarget}` : undefined,
|
|
138
188
|
`Status: subagent({ action: "status", id: "${runTarget}" })`,
|
|
139
189
|
`Interrupt: subagent({ action: "interrupt", id: "${runTarget}" })`
|
|
140
190
|
].filter((line) => Boolean(line)).join(`
|
|
141
191
|
`);
|
|
142
192
|
}
|
|
193
|
+
const supervisorHint = event.reason === "supervisor_request" ? "Supervisor request: reply to the pending request. If subagent_supervisor pending is empty, check intercom pending because an external intercom tool may own the request." : undefined;
|
|
194
|
+
const facts = formatLongRunningFacts(event);
|
|
143
195
|
return [
|
|
144
196
|
`Subagent needs attention: ${event.agent}`,
|
|
145
197
|
`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : ""}`,
|
|
146
198
|
`Signal: ${event.message}`,
|
|
199
|
+
facts ? `Facts: ${facts}` : undefined,
|
|
147
200
|
event.recentFailureSummary ? `Recent failures: ${event.recentFailureSummary}` : undefined,
|
|
148
|
-
|
|
149
|
-
|
|
201
|
+
supervisorHint,
|
|
202
|
+
"Hint: Inspect status first unless the run is clearly blocked. Use steer for a top-level live async child, routed resume for a live nested child, or resume to revive a paused/completed/failed child.",
|
|
203
|
+
`Top-level live async nudge: ${steerCommand}`,
|
|
204
|
+
`Routed live nested nudge: ${nestedResumeCommand}`,
|
|
150
205
|
childIntercomTarget ? `Direct intercom target: ${childIntercomTarget}` : undefined,
|
|
151
206
|
`Status: subagent({ action: "status", id: "${runTarget}" })`,
|
|
152
207
|
`Interrupt: subagent({ action: "interrupt", id: "${runTarget}" })`
|