openhorse 0.2.18 → 0.2.21
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/dist/agents/coordinator.d.ts.map +1 -1
- package/dist/agents/fork.d.ts.map +1 -1
- package/dist/agents/fork.js +0 -1
- package/dist/agents/fork.js.map +1 -1
- package/dist/agents/worker-pool.d.ts.map +1 -1
- package/dist/agents/worker-pool.js +3 -1
- package/dist/agents/worker-pool.js.map +1 -1
- package/dist/cli.js +3 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +13 -28
- package/dist/commands/index.js.map +1 -1
- package/dist/core/checkpoint.d.ts.map +1 -1
- package/dist/core/checkpoint.js +3 -0
- package/dist/core/checkpoint.js.map +1 -1
- package/dist/framework/prompt.d.ts.map +1 -1
- package/dist/framework/prompt.js +16 -0
- package/dist/framework/prompt.js.map +1 -1
- package/dist/framework/query.d.ts.map +1 -1
- package/dist/framework/query.js +0 -7
- package/dist/framework/query.js.map +1 -1
- package/dist/harness/context-harness.d.ts.map +1 -1
- package/dist/harness/context-harness.js +6 -1
- package/dist/harness/context-harness.js.map +1 -1
- package/dist/harness/ledger.d.ts +1 -0
- package/dist/harness/ledger.d.ts.map +1 -1
- package/dist/harness/ledger.js +8 -0
- package/dist/harness/ledger.js.map +1 -1
- package/dist/harness/safety.d.ts +2 -0
- package/dist/harness/safety.d.ts.map +1 -1
- package/dist/harness/safety.js +27 -3
- package/dist/harness/safety.js.map +1 -1
- package/dist/init.d.ts +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +1 -1
- package/dist/init.js.map +1 -1
- package/dist/ink-ui/components/Markdown.d.ts +1 -1
- package/dist/ink-ui/components/Markdown.d.ts.map +1 -1
- package/dist/ink-ui/components/Markdown.js +1 -1
- package/dist/ink-ui/components/Markdown.js.map +1 -1
- package/dist/ink-ui/runtime/grapheme.d.ts +9 -8
- package/dist/ink-ui/runtime/grapheme.d.ts.map +1 -1
- package/dist/ink-ui/runtime/grapheme.js +14 -60
- package/dist/ink-ui/runtime/grapheme.js.map +1 -1
- package/dist/ink-ui/runtime/input-buffer.d.ts +9 -31
- package/dist/ink-ui/runtime/input-buffer.d.ts.map +1 -1
- package/dist/ink-ui/runtime/input-buffer.js +15 -162
- package/dist/ink-ui/runtime/input-buffer.js.map +1 -1
- package/dist/ink-ui/runtime/native-cursor.js +0 -25
- package/dist/ink-ui/runtime/native-cursor.js.map +1 -1
- package/dist/ink-ui/runtime/prompt-layout.d.ts +9 -29
- package/dist/ink-ui/runtime/prompt-layout.d.ts.map +1 -1
- package/dist/ink-ui/runtime/prompt-layout.js +18 -166
- package/dist/ink-ui/runtime/prompt-layout.js.map +1 -1
- package/dist/ink-ui/runtime/transcript-state.d.ts.map +1 -1
- package/dist/ink-ui/runtime/transcript-state.js +2 -0
- package/dist/ink-ui/runtime/transcript-state.js.map +1 -1
- package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
- package/dist/ink-ui/screens/ReplScreen.js +11 -0
- package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
- package/dist/memory/entrypoint.js +1 -1
- package/dist/memory/entrypoint.js.map +1 -1
- package/dist/memory/storage.js +1 -1
- package/dist/memory/storage.js.map +1 -1
- package/dist/memory/store.d.ts +1 -0
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +9 -0
- package/dist/memory/store.js.map +1 -1
- package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
- package/dist/runtime/agent-runtime-controller.js +15 -0
- package/dist/runtime/agent-runtime-controller.js.map +1 -1
- package/dist/runtime/agent-runtime-protocol.d.ts +4 -1
- package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
- package/dist/runtime/agent-runtime-protocol.js +6 -0
- package/dist/runtime/agent-runtime-protocol.js.map +1 -1
- package/dist/runtime/chat-controller.d.ts +27 -0
- package/dist/runtime/chat-controller.d.ts.map +1 -1
- package/dist/runtime/chat-controller.js +148 -5
- package/dist/runtime/chat-controller.js.map +1 -1
- package/dist/runtime/composer/buffer.d.ts +43 -0
- package/dist/runtime/composer/buffer.d.ts.map +1 -0
- package/dist/runtime/composer/buffer.js +176 -0
- package/dist/runtime/composer/buffer.js.map +1 -0
- package/dist/runtime/composer/grapheme.d.ts +19 -0
- package/dist/runtime/composer/grapheme.d.ts.map +1 -0
- package/dist/runtime/composer/grapheme.js +73 -0
- package/dist/runtime/composer/grapheme.js.map +1 -0
- package/dist/runtime/composer/history.d.ts +39 -0
- package/dist/runtime/composer/history.d.ts.map +1 -0
- package/dist/runtime/composer/history.js +91 -0
- package/dist/runtime/composer/history.js.map +1 -0
- package/dist/runtime/composer/layout.d.ts +40 -0
- package/dist/runtime/composer/layout.d.ts.map +1 -0
- package/dist/runtime/composer/layout.js +174 -0
- package/dist/runtime/composer/layout.js.map +1 -0
- package/dist/runtime/rich-text/ansi-parser.d.ts +31 -0
- package/dist/runtime/rich-text/ansi-parser.d.ts.map +1 -0
- package/dist/runtime/rich-text/ansi-parser.js +272 -0
- package/dist/runtime/rich-text/ansi-parser.js.map +1 -0
- package/dist/runtime/rich-text/layout.d.ts +21 -0
- package/dist/runtime/rich-text/layout.d.ts.map +1 -0
- package/dist/runtime/rich-text/layout.js +327 -0
- package/dist/runtime/rich-text/layout.js.map +1 -0
- package/dist/runtime/rich-text/markdown-parser.d.ts +17 -0
- package/dist/runtime/rich-text/markdown-parser.d.ts.map +1 -0
- package/dist/runtime/rich-text/markdown-parser.js +211 -0
- package/dist/runtime/rich-text/markdown-parser.js.map +1 -0
- package/dist/runtime/rich-text/sanitizer.d.ts +18 -0
- package/dist/runtime/rich-text/sanitizer.d.ts.map +1 -0
- package/dist/runtime/rich-text/sanitizer.js +32 -0
- package/dist/runtime/rich-text/sanitizer.js.map +1 -0
- package/dist/runtime/rich-text/types.d.ts +59 -0
- package/dist/runtime/rich-text/types.d.ts.map +1 -0
- package/dist/runtime/rich-text/types.js +17 -0
- package/dist/runtime/rich-text/types.js.map +1 -0
- package/dist/runtime/subagents/budget.d.ts +118 -0
- package/dist/runtime/subagents/budget.d.ts.map +1 -0
- package/dist/runtime/subagents/budget.js +173 -0
- package/dist/runtime/subagents/budget.js.map +1 -0
- package/dist/runtime/subagents/child-executor-guard.d.ts +60 -0
- package/dist/runtime/subagents/child-executor-guard.d.ts.map +1 -0
- package/dist/runtime/subagents/child-executor-guard.js +219 -0
- package/dist/runtime/subagents/child-executor-guard.js.map +1 -0
- package/dist/runtime/subagents/context-builder.d.ts +34 -0
- package/dist/runtime/subagents/context-builder.d.ts.map +1 -0
- package/dist/runtime/subagents/context-builder.js +99 -0
- package/dist/runtime/subagents/context-builder.js.map +1 -0
- package/dist/runtime/subagents/index.d.ts +21 -0
- package/dist/runtime/subagents/index.d.ts.map +1 -0
- package/dist/runtime/subagents/index.js +62 -0
- package/dist/runtime/subagents/index.js.map +1 -0
- package/dist/runtime/subagents/policy.d.ts +68 -0
- package/dist/runtime/subagents/policy.d.ts.map +1 -0
- package/dist/runtime/subagents/policy.js +230 -0
- package/dist/runtime/subagents/policy.js.map +1 -0
- package/dist/runtime/subagents/presets.d.ts +44 -0
- package/dist/runtime/subagents/presets.d.ts.map +1 -0
- package/dist/runtime/subagents/presets.js +148 -0
- package/dist/runtime/subagents/presets.js.map +1 -0
- package/dist/runtime/subagents/production.d.ts +44 -0
- package/dist/runtime/subagents/production.d.ts.map +1 -0
- package/dist/runtime/subagents/production.js +118 -0
- package/dist/runtime/subagents/production.js.map +1 -0
- package/dist/runtime/subagents/provider-gate.d.ts +99 -0
- package/dist/runtime/subagents/provider-gate.d.ts.map +1 -0
- package/dist/runtime/subagents/provider-gate.js +186 -0
- package/dist/runtime/subagents/provider-gate.js.map +1 -0
- package/dist/runtime/subagents/result-parser.d.ts +40 -0
- package/dist/runtime/subagents/result-parser.d.ts.map +1 -0
- package/dist/runtime/subagents/result-parser.js +226 -0
- package/dist/runtime/subagents/result-parser.js.map +1 -0
- package/dist/runtime/subagents/runner.d.ts +53 -0
- package/dist/runtime/subagents/runner.d.ts.map +1 -0
- package/dist/runtime/subagents/runner.js +172 -0
- package/dist/runtime/subagents/runner.js.map +1 -0
- package/dist/runtime/subagents/runtime-integration.d.ts +73 -0
- package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -0
- package/dist/runtime/subagents/runtime-integration.js +148 -0
- package/dist/runtime/subagents/runtime-integration.js.map +1 -0
- package/dist/runtime/subagents/supervisor.d.ts +79 -0
- package/dist/runtime/subagents/supervisor.d.ts.map +1 -0
- package/dist/runtime/subagents/supervisor.js +301 -0
- package/dist/runtime/subagents/supervisor.js.map +1 -0
- package/dist/runtime/subagents/tool.d.ts +38 -0
- package/dist/runtime/subagents/tool.d.ts.map +1 -0
- package/dist/runtime/subagents/tool.js +171 -0
- package/dist/runtime/subagents/tool.js.map +1 -0
- package/dist/runtime/subagents/types.d.ts +150 -0
- package/dist/runtime/subagents/types.d.ts.map +1 -0
- package/dist/runtime/subagents/types.js +52 -0
- package/dist/runtime/subagents/types.js.map +1 -0
- package/dist/runtime/ui-events.d.ts +5 -0
- package/dist/runtime/ui-events.d.ts.map +1 -1
- package/dist/runtime/ui-events.js.map +1 -1
- package/dist/runtime/ui-view-model.d.ts +35 -1
- package/dist/runtime/ui-view-model.d.ts.map +1 -1
- package/dist/runtime/ui-view-model.js +32 -1
- package/dist/runtime/ui-view-model.js.map +1 -1
- package/dist/sdk/query.d.ts.map +1 -1
- package/dist/sdk/query.js +0 -1
- package/dist/sdk/query.js.map +1 -1
- package/dist/services/auto-fix/autoFixHook.d.ts.map +1 -1
- package/dist/services/auto-fix/autoFixHook.js +3 -2
- package/dist/services/auto-fix/autoFixHook.js.map +1 -1
- package/dist/services/auto-fix/autoFixRunner.d.ts +2 -2
- package/dist/services/auto-fix/autoFixRunner.d.ts.map +1 -1
- package/dist/services/auto-fix/autoFixRunner.js +2 -2
- package/dist/services/auto-fix/autoFixRunner.js.map +1 -1
- package/dist/services/compact/auto-compact.js +3 -3
- package/dist/services/compact/auto-compact.js.map +1 -1
- package/dist/services/compact/summary-generator.d.ts.map +1 -1
- package/dist/services/compact/summary-generator.js +0 -1
- package/dist/services/compact/summary-generator.js.map +1 -1
- package/dist/services/concurrent-sessions.d.ts.map +1 -1
- package/dist/services/concurrent-sessions.js +3 -0
- package/dist/services/concurrent-sessions.js.map +1 -1
- package/dist/services/config.d.ts +11 -4
- package/dist/services/config.d.ts.map +1 -1
- package/dist/services/config.js +45 -4
- package/dist/services/config.js.map +1 -1
- package/dist/services/doctor.d.ts.map +1 -1
- package/dist/services/doctor.js +1 -1
- package/dist/services/doctor.js.map +1 -1
- package/dist/services/global-config.d.ts +23 -1
- package/dist/services/global-config.d.ts.map +1 -1
- package/dist/services/global-config.js +3 -0
- package/dist/services/global-config.js.map +1 -1
- package/dist/services/llm.d.ts.map +1 -1
- package/dist/services/llm.js +9 -1
- package/dist/services/llm.js.map +1 -1
- package/dist/services/mcp/transports.d.ts +2 -0
- package/dist/services/mcp/transports.d.ts.map +1 -1
- package/dist/services/mcp/transports.js +23 -2
- package/dist/services/mcp/transports.js.map +1 -1
- package/dist/services/memory.d.ts.map +1 -1
- package/dist/services/memory.js.map +1 -1
- package/dist/services/model-context.d.ts.map +1 -1
- package/dist/services/model-context.js +7 -1
- package/dist/services/model-context.js.map +1 -1
- package/dist/services/session-memory/sessionMemory.js +1 -1
- package/dist/services/session-memory/sessionMemory.js.map +1 -1
- package/dist/services/session-storage.d.ts +1 -1
- package/dist/services/session-storage.d.ts.map +1 -1
- package/dist/services/session-storage.js +49 -5
- package/dist/services/session-storage.js.map +1 -1
- package/dist/services/task-manager.d.ts +2 -0
- package/dist/services/task-manager.d.ts.map +1 -1
- package/dist/services/task-manager.js +13 -0
- package/dist/services/task-manager.js.map +1 -1
- package/dist/services/usage-state.d.ts.map +1 -1
- package/dist/services/usage-state.js +3 -0
- package/dist/services/usage-state.js.map +1 -1
- package/dist/skills/loader.d.ts +1 -1
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +1 -1
- package/dist/skills/loader.js.map +1 -1
- package/dist/skills/registry.d.ts +1 -1
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +1 -1
- package/dist/skills/registry.js.map +1 -1
- package/dist/terminal-ui/launch.d.ts +18 -3
- package/dist/terminal-ui/launch.d.ts.map +1 -1
- package/dist/terminal-ui/launch.js +21 -4
- package/dist/terminal-ui/launch.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/lsp.js.map +1 -1
- package/dist/tools/mcp.d.ts +1 -0
- package/dist/tools/mcp.d.ts.map +1 -1
- package/dist/tools/mcp.js +19 -4
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/web.js +3 -3
- package/dist/tools/web.js.map +1 -1
- package/dist/tui-core/frame.d.ts +13 -1
- package/dist/tui-core/frame.d.ts.map +1 -1
- package/dist/tui-core/frame.js +61 -8
- package/dist/tui-core/frame.js.map +1 -1
- package/dist/tui-core/style.d.ts +87 -0
- package/dist/tui-core/style.d.ts.map +1 -0
- package/dist/tui-core/style.js +248 -0
- package/dist/tui-core/style.js.map +1 -0
- package/dist/tui-core/terminal-writer.d.ts.map +1 -1
- package/dist/tui-core/terminal-writer.js +16 -3
- package/dist/tui-core/terminal-writer.js.map +1 -1
- package/dist/tui-ui/inline-surface.d.ts +134 -0
- package/dist/tui-ui/inline-surface.d.ts.map +1 -0
- package/dist/tui-ui/inline-surface.js +364 -0
- package/dist/tui-ui/inline-surface.js.map +1 -0
- package/dist/tui-ui/launch.d.ts.map +1 -1
- package/dist/tui-ui/launch.js +251 -64
- package/dist/tui-ui/launch.js.map +1 -1
- package/dist/tui-ui/layout.js +31 -2
- package/dist/tui-ui/layout.js.map +1 -1
- package/dist/tui-ui/render-scheduler.d.ts +37 -0
- package/dist/tui-ui/render-scheduler.d.ts.map +1 -0
- package/dist/tui-ui/render-scheduler.js +118 -0
- package/dist/tui-ui/render-scheduler.js.map +1 -0
- package/dist/tui-ui/runner.d.ts +13 -0
- package/dist/tui-ui/runner.d.ts.map +1 -1
- package/dist/tui-ui/runner.js +60 -11
- package/dist/tui-ui/runner.js.map +1 -1
- package/dist/tui-ui/state.d.ts +33 -3
- package/dist/tui-ui/state.d.ts.map +1 -1
- package/dist/tui-ui/state.js +138 -25
- package/dist/tui-ui/state.js.map +1 -1
- package/dist/tui-ui/transcript-cache.d.ts +33 -0
- package/dist/tui-ui/transcript-cache.d.ts.map +1 -0
- package/dist/tui-ui/transcript-cache.js +67 -0
- package/dist/tui-ui/transcript-cache.js.map +1 -0
- package/dist/ui/box.d.ts.map +1 -1
- package/dist/ui/box.js +0 -11
- package/dist/ui/box.js.map +1 -1
- package/dist/ui/command-panel.d.ts.map +1 -1
- package/dist/ui/command-panel.js +1 -3
- package/dist/ui/command-panel.js.map +1 -1
- package/dist/ui/file-completion.js +1 -1
- package/dist/ui/file-completion.js.map +1 -1
- package/dist/ui/markdown.d.ts.map +1 -1
- package/dist/ui/markdown.js +1 -2
- package/dist/ui/markdown.js.map +1 -1
- package/dist/ui/multiline-input.d.ts.map +1 -1
- package/dist/ui/multiline-input.js +1 -2
- package/dist/ui/multiline-input.js.map +1 -1
- package/dist/ui/progress.d.ts.map +1 -1
- package/dist/ui/progress.js +0 -3
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/status-bar.d.ts.map +1 -1
- package/dist/ui/status-bar.js +0 -1
- package/dist/ui/status-bar.js.map +1 -1
- package/dist/ui/stream-markdown.d.ts +3 -0
- package/dist/ui/stream-markdown.d.ts.map +1 -1
- package/dist/ui/stream-markdown.js +0 -6
- package/dist/ui/stream-markdown.js.map +1 -1
- package/dist/ui/tool-preview.d.ts.map +1 -1
- package/dist/ui/tool-preview.js +0 -1
- package/dist/ui/tool-preview.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli-dbg.js +0 -717
- package/dist/cli-debug.d.ts +0 -7
- package/dist/cli-debug.d.ts.map +0 -1
- package/dist/cli-debug.js +0 -717
- package/dist/cli-debug.js.map +0 -1
- package/dist/cli-debug2.d.ts +0 -7
- package/dist/cli-debug2.d.ts.map +0 -1
- package/dist/cli-debug2.js +0 -717
- package/dist/cli-debug2.js.map +0 -1
- package/dist/cli-debug3.d.ts +0 -7
- package/dist/cli-debug3.d.ts.map +0 -1
- package/dist/cli-debug3.js +0 -719
- package/dist/cli-debug3.js.map +0 -1
- package/dist/cli-ink.d.ts +0 -8
- package/dist/cli-ink.d.ts.map +0 -1
- package/dist/cli-ink.js +0 -32
- package/dist/cli-ink.js.map +0 -1
- package/dist/cli-patch.js +0 -716
- package/dist/cli-test.js +0 -726
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Turn-level integration: build the runtime-bound `subtask` tool for a root turn.
|
|
4
|
+
*
|
|
5
|
+
* This is the bridge between {@link AgentChatController} and the subagent
|
|
6
|
+
* runtime. It resolves the child tool set from the global runtime tools, builds
|
|
7
|
+
* the production executeQuery, the budget ledger, the provider gate and the
|
|
8
|
+
* Supervisor, and returns the `subtask` OpenHorseTool to merge into the root
|
|
9
|
+
* turn's tool list. Returns null when subagents are off or the LLM is absent,
|
|
10
|
+
* so the root loop is unchanged.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.runSubtaskBatch = void 0;
|
|
14
|
+
exports.createSubagentBundleForTurn = createSubagentBundleForTurn;
|
|
15
|
+
exports.createSubagentToolForTurn = createSubagentToolForTurn;
|
|
16
|
+
exports.deriveRootLlmConfig = deriveRootLlmConfig;
|
|
17
|
+
const budget_1 = require("./budget");
|
|
18
|
+
const provider_gate_1 = require("./provider-gate");
|
|
19
|
+
const production_1 = require("./production");
|
|
20
|
+
const supervisor_1 = require("./supervisor");
|
|
21
|
+
Object.defineProperty(exports, "runSubtaskBatch", { enumerable: true, get: function () { return supervisor_1.runSubtaskBatch; } });
|
|
22
|
+
const tool_1 = require("./tool");
|
|
23
|
+
const presets_1 = require("./presets");
|
|
24
|
+
const child_executor_guard_1 = require("./child-executor-guard");
|
|
25
|
+
/**
|
|
26
|
+
* Lazy accessor for the runtime tool pool.
|
|
27
|
+
*
|
|
28
|
+
* Importing `../../tools` at module top-level creates a circular dependency:
|
|
29
|
+
* subagents barrel → runtime-integration → tools/index → web → config → subagents/types
|
|
30
|
+
* When `tools/index` loads before `web.ts` finishes, `WEB_TOOLS` is still
|
|
31
|
+
* `undefined` and `...WEB_TOOLS` throws "not iterable". Deferring the import
|
|
32
|
+
* to call-time breaks the cycle because by then all modules have initialized.
|
|
33
|
+
*/
|
|
34
|
+
function lazyRuntimeTools() {
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
36
|
+
const tools = require('../../tools');
|
|
37
|
+
return { executeTool: tools.executeTool, getRuntimeTools: tools.getRuntimeTools };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build the `subtask` tool for a root turn, or null if disabled.
|
|
41
|
+
*
|
|
42
|
+
* Returns a bundle: the tool to merge into the root turn's tool list, plus an
|
|
43
|
+
* accessor for the aggregate child usage so the root loop can fold child cost
|
|
44
|
+
* into its loop stats and `/cost`. The bundle is null when subagents are off.
|
|
45
|
+
*/
|
|
46
|
+
function createSubagentBundleForTurn(inputs) {
|
|
47
|
+
const { config, cwd, rootLlmConfig, abortSignal, onSubtaskEvent } = inputs;
|
|
48
|
+
if (config.mode === 'off')
|
|
49
|
+
return null;
|
|
50
|
+
if (!rootLlmConfig.apiKey)
|
|
51
|
+
return null;
|
|
52
|
+
// Resolve child tools: all v0.2.20 roles share the read-only allowlist, so
|
|
53
|
+
// filter once for 'research'. Assert no forbidden tool slips in as a
|
|
54
|
+
// defense-in-depth check (the allowlist already excludes them, but this
|
|
55
|
+
// catches future regressions).
|
|
56
|
+
const { executeTool, getRuntimeTools } = lazyRuntimeTools();
|
|
57
|
+
const runtimeTools = getRuntimeTools();
|
|
58
|
+
const availableNames = runtimeTools.map(t => t.name);
|
|
59
|
+
const allowedNames = new Set((0, presets_1.filterToolsForRole)(availableNames, 'research', runtimeTools));
|
|
60
|
+
const childTools = runtimeTools.filter(t => allowedNames.has(t.name));
|
|
61
|
+
(0, presets_1.assertNoForbiddenTools)(childTools.map(t => t.name));
|
|
62
|
+
// Defense-in-depth: map tool name -> definition so the executor can re-verify
|
|
63
|
+
// isReadOnly() on every call. A tool that is not read-only must never execute
|
|
64
|
+
// in a child context, regardless of what the allowlist says at construction.
|
|
65
|
+
const childToolByName = new Map();
|
|
66
|
+
for (const t of childTools)
|
|
67
|
+
childToolByName.set(t.name, t);
|
|
68
|
+
// R3: scope holder lets the supervisor set the current packet's scope
|
|
69
|
+
// before each child runs, so the turn-level guard enforces per-packet
|
|
70
|
+
// containment without rebuilding the executor.
|
|
71
|
+
const scopeHolder = new child_executor_guard_1.ScopeHolder();
|
|
72
|
+
const unguardedExecutor = async (name, args, signal) => {
|
|
73
|
+
if (!allowedNames.has(name)) {
|
|
74
|
+
return JSON.stringify({ success: false, error: `Tool ${name} is not available to subagents.` });
|
|
75
|
+
}
|
|
76
|
+
// Re-verify read-only at execution time: catches tools whose isReadOnly()
|
|
77
|
+
// returns false (mutating MCP actions, future regressions).
|
|
78
|
+
const tool = childToolByName.get(name);
|
|
79
|
+
if (!tool || tool.isReadOnly?.(args) !== true) {
|
|
80
|
+
return JSON.stringify({ success: false, error: `Tool ${name} is not read-only and cannot run in a subagent.` });
|
|
81
|
+
}
|
|
82
|
+
const toolContext = { cwd, config: { name: 'openhorse-subagent', mode: 'subagent' }, abortSignal: signal };
|
|
83
|
+
return executeTool(name, args, signal, toolContext);
|
|
84
|
+
};
|
|
85
|
+
const childToolExecutor = (0, child_executor_guard_1.createChildToolExecutorGuard)(unguardedExecutor, {
|
|
86
|
+
rootCwd: cwd,
|
|
87
|
+
scopeHolder,
|
|
88
|
+
});
|
|
89
|
+
const providerGate = new provider_gate_1.SubagentProviderGate({ maxConcurrent: config.maxParallel });
|
|
90
|
+
const budget = new budget_1.SubagentBudgetLedger((0, budget_1.budgetLimitsFromConfig)({
|
|
91
|
+
maxModelRequestsPerTurn: config.maxModelRequestsPerTurn,
|
|
92
|
+
maxModelRequestsPerTask: config.maxModelRequestsPerTask,
|
|
93
|
+
maxToolCallsPerTask: config.maxToolCallsPerTask,
|
|
94
|
+
timeoutMs: config.timeoutMs,
|
|
95
|
+
}));
|
|
96
|
+
// R6: turn-level task counter persists across `subtask` calls so multiple
|
|
97
|
+
// calls in one root turn cannot exceed `maxTasksPerTurn`.
|
|
98
|
+
const turnTaskState = new budget_1.TurnTaskState();
|
|
99
|
+
const executeQuery = (0, production_1.createProductionExecuteQuery)({
|
|
100
|
+
rootConfig: rootLlmConfig,
|
|
101
|
+
providerGate,
|
|
102
|
+
maxTurnsPerTask: config.maxTurnsPerTask,
|
|
103
|
+
});
|
|
104
|
+
const supervisorDeps = {
|
|
105
|
+
config,
|
|
106
|
+
cwd,
|
|
107
|
+
budget,
|
|
108
|
+
providerGate,
|
|
109
|
+
executeQuery,
|
|
110
|
+
toolSet: { tools: childTools, toolExecutor: childToolExecutor },
|
|
111
|
+
scopeHolder,
|
|
112
|
+
turnTaskState,
|
|
113
|
+
hasPendingPermission: inputs.hasPendingPermission,
|
|
114
|
+
onChildUsage: inputs.onChildUsage,
|
|
115
|
+
parentAbortSignal: abortSignal,
|
|
116
|
+
rootObjectiveSummary: inputs.rootObjectiveSummary,
|
|
117
|
+
modelLabel: inputs.modelLabel,
|
|
118
|
+
onEvent: onSubtaskEvent,
|
|
119
|
+
onSubtaskResult: inputs.onSubtaskResult,
|
|
120
|
+
};
|
|
121
|
+
const tool = (0, tool_1.createSubtaskTool)(supervisorDeps);
|
|
122
|
+
return {
|
|
123
|
+
tool,
|
|
124
|
+
/** Read-only accessor for the reconciled aggregate child usage this turn. */
|
|
125
|
+
getAggregateUsage: () => budget.aggregateUsage(),
|
|
126
|
+
/** Number of subtasks that ran (reconciled) this turn. */
|
|
127
|
+
getSubtaskCount: () => budget.reconciledTaskCount(),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Backwards-compatible wrapper returning only the tool. Prefer
|
|
132
|
+
* {@link createSubagentBundleForTurn} when the root loop needs to fold child
|
|
133
|
+
* usage into its stats.
|
|
134
|
+
*/
|
|
135
|
+
function createSubagentToolForTurn(inputs) {
|
|
136
|
+
const bundle = createSubagentBundleForTurn(inputs);
|
|
137
|
+
return bundle ? bundle.tool : null;
|
|
138
|
+
}
|
|
139
|
+
/** Derive the root LLM config slice from the runtime config. */
|
|
140
|
+
function deriveRootLlmConfig(config) {
|
|
141
|
+
return {
|
|
142
|
+
apiKey: config.apiKey,
|
|
143
|
+
baseUrl: config.apiBaseUrl,
|
|
144
|
+
model: config.model,
|
|
145
|
+
fallbackModel: config.fallbackModel,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=runtime-integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-integration.js","sourceRoot":"","sources":["../../../src/runtime/subagents/runtime-integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SubagentSupervisor: orchestrates a batch of child subtasks.
|
|
3
|
+
*
|
|
4
|
+
* Owns the task/batch ID space, the state machine, the concurrency queue and
|
|
5
|
+
* ordered aggregation. It is the single place that decides when children start,
|
|
6
|
+
* how they are bounded, and how their results are folded back to the root.
|
|
7
|
+
*
|
|
8
|
+
* The supervisor does NOT own LLM state, tool execution, permission policy or
|
|
9
|
+
* transcript storage. It composes the policy gate, the budget ledger, the
|
|
10
|
+
* provider gate and the runner, and emits renderer-independent lifecycle
|
|
11
|
+
* events that the root loop forwards to terminal/Ink/TUI.
|
|
12
|
+
*/
|
|
13
|
+
import { SubagentBudgetLedger, TurnTaskState } from './budget';
|
|
14
|
+
import { type PolicyRejectReason } from './policy';
|
|
15
|
+
import { SubagentProviderGate } from './provider-gate';
|
|
16
|
+
import { type ExecuteChildQuery, type ChildToolSet } from './runner';
|
|
17
|
+
import type { ScopeHolder } from './child-executor-guard';
|
|
18
|
+
import { type RuntimeSubtaskEvent, type SubagentConfig, type SubtaskBatchResult, type SubtaskRequest, type SubtaskResult } from './types';
|
|
19
|
+
export interface SubagentSupervisorDeps {
|
|
20
|
+
config: SubagentConfig;
|
|
21
|
+
cwd: string;
|
|
22
|
+
budget: SubagentBudgetLedger;
|
|
23
|
+
providerGate: SubagentProviderGate;
|
|
24
|
+
/** Injectable query binding shared with the runner (tests mock this). */
|
|
25
|
+
executeQuery: ExecuteChildQuery;
|
|
26
|
+
/** Filtered, child-safe tool set (already passed through presets). */
|
|
27
|
+
toolSet: ChildToolSet;
|
|
28
|
+
/**
|
|
29
|
+
* R3: mutable scope holder. The supervisor sets the current packet's
|
|
30
|
+
* canonical scope before running it, so the turn-level executor guard can
|
|
31
|
+
* enforce per-packet containment. Optional: when absent, only root
|
|
32
|
+
* containment is enforced.
|
|
33
|
+
*/
|
|
34
|
+
scopeHolder?: ScopeHolder;
|
|
35
|
+
/**
|
|
36
|
+
* R6: turn-level task counter. Persists across `subtask` calls so multiple
|
|
37
|
+
* calls in one root turn cannot exceed `maxTasksPerTurn`. When absent, the
|
|
38
|
+
* supervisor falls back to a per-batch counter (weaker; logged).
|
|
39
|
+
*/
|
|
40
|
+
turnTaskState?: TurnTaskState;
|
|
41
|
+
/**
|
|
42
|
+
* R6: live permission state from the root runtime. Returns true when a
|
|
43
|
+
* permission request is awaiting user decision. When absent, defaults to
|
|
44
|
+
* false (no pending permission) - the root loop should inject the real
|
|
45
|
+
* state to prevent background auto-approval bypass.
|
|
46
|
+
*/
|
|
47
|
+
hasPendingPermission?: () => boolean;
|
|
48
|
+
/**
|
|
49
|
+
* R6: called with each child's observed usage (never clamped) so the root
|
|
50
|
+
* loop can record it into its shared CostTracker. Fires for every terminal
|
|
51
|
+
* state (completed/failed/cancelled/timed_out), so partial usage before a
|
|
52
|
+
* failure is still accounted.
|
|
53
|
+
*/
|
|
54
|
+
onChildUsage?: (taskId: string, role: import('./types').SubagentRole, usage: import('./types').SubtaskUsage, modelLabel?: string) => void;
|
|
55
|
+
/** Parent turn abort signal; propagated to every child. */
|
|
56
|
+
parentAbortSignal?: AbortSignal;
|
|
57
|
+
/** Read-only context forwarded to each child. */
|
|
58
|
+
rootObjectiveSummary?: string;
|
|
59
|
+
modelLabel?: string;
|
|
60
|
+
/** Lifecycle event sink (runtime event + trace). */
|
|
61
|
+
onEvent?: (event: RuntimeSubtaskEvent) => void;
|
|
62
|
+
/** Called once per task with its final SubtaskResult (for artifact persistence). */
|
|
63
|
+
onSubtaskResult?: (result: SubtaskResult, batchId: string) => void;
|
|
64
|
+
}
|
|
65
|
+
export interface RunBatchOutcome {
|
|
66
|
+
result: SubtaskBatchResult;
|
|
67
|
+
/** Whether policy rejected the entire batch before any child ran. */
|
|
68
|
+
rejected: boolean;
|
|
69
|
+
rejectReason?: PolicyRejectReason;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Run a batch of subtasks. Returns a {@link SubtaskBatchResult} whose results
|
|
73
|
+
* are always in request order, regardless of completion order.
|
|
74
|
+
*
|
|
75
|
+
* Never throws: policy rejection, child failures, timeouts and cancels are
|
|
76
|
+
* all normalized into result entries.
|
|
77
|
+
*/
|
|
78
|
+
export declare function runSubtaskBatch(request: SubtaskRequest, deps: SubagentSupervisorDeps): Promise<RunBatchOutcome>;
|
|
79
|
+
//# sourceMappingURL=supervisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/runtime/subagents/supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAA6C,KAAK,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAc,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAA2B,MAAM,UAAU,CAAC;AAC1G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EAEvB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,oBAAoB,CAAC;IAC7B,YAAY,EAAE,oBAAoB,CAAC;IACnC,yEAAyE;IACzE,YAAY,EAAE,iBAAiB,CAAC;IAChC,sEAAsE;IACtE,OAAO,EAAE,YAAY,CAAC;IACtB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAC;IACrC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1I,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC,iDAAiD;IACjD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC/C,oFAAoF;IACpF,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpE;AAeD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,qEAAqE;IACrE,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAyG1B"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SubagentSupervisor: orchestrates a batch of child subtasks.
|
|
4
|
+
*
|
|
5
|
+
* Owns the task/batch ID space, the state machine, the concurrency queue and
|
|
6
|
+
* ordered aggregation. It is the single place that decides when children start,
|
|
7
|
+
* how they are bounded, and how their results are folded back to the root.
|
|
8
|
+
*
|
|
9
|
+
* The supervisor does NOT own LLM state, tool execution, permission policy or
|
|
10
|
+
* transcript storage. It composes the policy gate, the budget ledger, the
|
|
11
|
+
* provider gate and the runner, and emits renderer-independent lifecycle
|
|
12
|
+
* events that the root loop forwards to terminal/Ink/TUI.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.runSubtaskBatch = runSubtaskBatch;
|
|
16
|
+
const policy_1 = require("./policy");
|
|
17
|
+
const runner_1 = require("./runner");
|
|
18
|
+
const types_1 = require("./types");
|
|
19
|
+
let batchCounter = 0;
|
|
20
|
+
let taskCounter = 0;
|
|
21
|
+
function nextBatchId() {
|
|
22
|
+
batchCounter += 1;
|
|
23
|
+
return `batch-${batchCounter}`;
|
|
24
|
+
}
|
|
25
|
+
function nextTaskId() {
|
|
26
|
+
taskCounter += 1;
|
|
27
|
+
return `task-${taskCounter}`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Run a batch of subtasks. Returns a {@link SubtaskBatchResult} whose results
|
|
31
|
+
* are always in request order, regardless of completion order.
|
|
32
|
+
*
|
|
33
|
+
* Never throws: policy rejection, child failures, timeouts and cancels are
|
|
34
|
+
* all normalized into result entries.
|
|
35
|
+
*/
|
|
36
|
+
async function runSubtaskBatch(request, deps) {
|
|
37
|
+
const policyCtx = {
|
|
38
|
+
depth: 0,
|
|
39
|
+
cwd: deps.cwd,
|
|
40
|
+
config: deps.config,
|
|
41
|
+
rootObjective: deps.rootObjectiveSummary ?? '',
|
|
42
|
+
// R6: turn-level counter persists across `subtask` calls so multiple
|
|
43
|
+
// calls in one root turn cannot exceed `maxTasksPerTurn`.
|
|
44
|
+
tasksStartedThisTurn: deps.turnTaskState?.tasksStarted() ?? 0,
|
|
45
|
+
runningChildren: deps.providerGate.activeCount(),
|
|
46
|
+
// R6: live permission state from the root runtime, not a hardcoded false.
|
|
47
|
+
hasPendingPermission: deps.hasPendingPermission ? deps.hasPendingPermission() : false,
|
|
48
|
+
parentAborted: Boolean(deps.parentAbortSignal?.aborted),
|
|
49
|
+
remainingModelRequests: deps.budget.availableModelRequests(),
|
|
50
|
+
providerCanReserve: (count) => deps.providerGate.canReserve(count),
|
|
51
|
+
};
|
|
52
|
+
const verdict = (0, policy_1.evaluateSubtaskPolicy)(request, policyCtx);
|
|
53
|
+
if (!verdict.allowed) {
|
|
54
|
+
const batchId = nextBatchId();
|
|
55
|
+
const results = request.tasks.map(packet => {
|
|
56
|
+
const result = buildRejectedResult(packet, verdict.reason);
|
|
57
|
+
// R7: finalize (trace/artifact/usage) exactly once even for rejected tasks.
|
|
58
|
+
finalizeTask(deps, batchId, result.id, packet, result);
|
|
59
|
+
return result;
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
result: { batchId, results, aggregateUsage: (0, types_1.sumSubtaskUsage)([]) },
|
|
63
|
+
rejected: true,
|
|
64
|
+
rejectReason: verdict.reason,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// R6: account for the accepted tasks in the turn-level counter so the
|
|
68
|
+
// next `subtask` call in the same turn sees the updated total.
|
|
69
|
+
deps.turnTaskState?.addStarted(request.tasks.length);
|
|
70
|
+
const batchId = nextBatchId();
|
|
71
|
+
const tasks = request.tasks;
|
|
72
|
+
const taskIds = tasks.map(() => nextTaskId());
|
|
73
|
+
// Reserve a fair share per task: the per-task cap, but no more than an even
|
|
74
|
+
// slice of the turn budget. This lets a 3-task batch fit when the turn limit
|
|
75
|
+
// is smaller than 3x the per-task cap, while the per-task cap still binds at
|
|
76
|
+
// reconcile time. Reserving the full per-task cap for every task would
|
|
77
|
+
// reject batches that would actually fit once real usage is known.
|
|
78
|
+
const reservePerTask = Math.max(1, Math.min(deps.config.maxModelRequestsPerTask, Math.floor(deps.config.maxModelRequestsPerTurn / tasks.length)));
|
|
79
|
+
// Reserve budget for every task up front; abort the batch if any reserve fails.
|
|
80
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
81
|
+
const reserved = deps.budget.reserve(taskIds[i], reservePerTask);
|
|
82
|
+
if (!reserved) {
|
|
83
|
+
// Release what we reserved and reject the rest.
|
|
84
|
+
for (let j = 0; j <= i; j++)
|
|
85
|
+
deps.budget.release(taskIds[j]);
|
|
86
|
+
const results = tasks.map((packet, i) => {
|
|
87
|
+
const result = buildRejectedResult(packet, 'budget_exhausted', taskIds[i]);
|
|
88
|
+
// R7: finalize rejected tasks too.
|
|
89
|
+
finalizeTask(deps, batchId, result.id, packet, result);
|
|
90
|
+
return result;
|
|
91
|
+
});
|
|
92
|
+
return {
|
|
93
|
+
result: { batchId, results, aggregateUsage: (0, types_1.sumSubtaskUsage)([]) },
|
|
94
|
+
rejected: true,
|
|
95
|
+
rejectReason: 'budget_exhausted',
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
emit(deps, {
|
|
99
|
+
batchId, taskId: taskIds[i], role: tasks[i].role, state: 'queued',
|
|
100
|
+
objective: tasks[i].objective,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
const runnerDeps = (i) => ({
|
|
104
|
+
cwd: deps.cwd,
|
|
105
|
+
canonicalScopePaths: verdict.canonicalScope.get(i),
|
|
106
|
+
toolSet: deps.toolSet,
|
|
107
|
+
executeQuery: deps.executeQuery,
|
|
108
|
+
timeoutMs: deps.config.timeoutMs,
|
|
109
|
+
parentAbortSignal: deps.parentAbortSignal,
|
|
110
|
+
rootObjectiveSummary: deps.rootObjectiveSummary,
|
|
111
|
+
modelLabel: deps.modelLabel,
|
|
112
|
+
});
|
|
113
|
+
let outcomes;
|
|
114
|
+
if (request.execution === 'parallel') {
|
|
115
|
+
outcomes = await runParallel(tasks, taskIds, batchId, deps, runnerDeps);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
outcomes = await runSerial(tasks, taskIds, batchId, deps, runnerDeps);
|
|
119
|
+
}
|
|
120
|
+
// Reconcile budget for each task with its real usage.
|
|
121
|
+
for (const outcome of outcomes) {
|
|
122
|
+
deps.budget.reconcile(outcome.result.id, outcome.result.usage);
|
|
123
|
+
}
|
|
124
|
+
const results = outcomes.map(o => o.result);
|
|
125
|
+
const aggregateUsage = (0, types_1.sumSubtaskUsage)(results.map(r => r.usage));
|
|
126
|
+
return {
|
|
127
|
+
result: { batchId, results, aggregateUsage },
|
|
128
|
+
rejected: false,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async function runParallel(tasks, taskIds, batchId, deps, runnerDeps) {
|
|
132
|
+
// Launch each child; the provider gate bounds actual concurrency. Collect
|
|
133
|
+
// by index so the final order matches the request order.
|
|
134
|
+
// allSettled guarantees every task is accounted for even if a future
|
|
135
|
+
// refactor breaks the "runOne never throws" contract.
|
|
136
|
+
const slots = tasks.map((task, i) => runOne(task, taskIds[i], batchId, i, deps, runnerDeps(i)));
|
|
137
|
+
const settled = await Promise.allSettled(slots);
|
|
138
|
+
return settled.map((s, i) => {
|
|
139
|
+
if (s.status === 'fulfilled')
|
|
140
|
+
return s.value;
|
|
141
|
+
// Defensive: construct a failed result for any slot that threw unexpectedly.
|
|
142
|
+
const task = tasks[i];
|
|
143
|
+
const result = {
|
|
144
|
+
id: taskIds[i],
|
|
145
|
+
role: task.role,
|
|
146
|
+
status: 'failed',
|
|
147
|
+
summary: 'Unexpected runner error.',
|
|
148
|
+
findings: [],
|
|
149
|
+
files: [],
|
|
150
|
+
commands: [],
|
|
151
|
+
verification: [],
|
|
152
|
+
risks: ['runner threw unexpectedly'],
|
|
153
|
+
usage: { modelRequests: 0, toolCalls: 0, promptTokens: 0, completionTokens: 0, durationMs: 0 },
|
|
154
|
+
};
|
|
155
|
+
finalizeTask(deps, batchId, taskIds[i], task, result);
|
|
156
|
+
return { result, parentCancelled: false };
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
async function runSerial(tasks, taskIds, batchId, deps, runnerDeps) {
|
|
160
|
+
const outcomes = [];
|
|
161
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
162
|
+
if (deps.parentAbortSignal?.aborted) {
|
|
163
|
+
// Mark remaining as cancelled without running them.
|
|
164
|
+
// R7: finalize each cancelled result (trace/artifact/usage) exactly
|
|
165
|
+
// once, same as a ran task, so resume sees the cancelled state.
|
|
166
|
+
for (let j = i; j < tasks.length; j++) {
|
|
167
|
+
const cancelled = cancelledResult(taskIds[j], tasks[j]);
|
|
168
|
+
finalizeTask(deps, batchId, taskIds[j], tasks[j], cancelled);
|
|
169
|
+
outcomes.push({
|
|
170
|
+
result: cancelled,
|
|
171
|
+
parentCancelled: true,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
const outcome = await runOne(tasks[i], taskIds[i], batchId, i, deps, runnerDeps(i));
|
|
177
|
+
outcomes.push(outcome);
|
|
178
|
+
}
|
|
179
|
+
return outcomes;
|
|
180
|
+
}
|
|
181
|
+
async function runOne(task, taskId, batchId, _index, deps, runnerDeps) {
|
|
182
|
+
// R4: pass the parent abort signal so a queued waiter is removed and
|
|
183
|
+
// rejected when the user hits Ctrl+C, instead of hanging until a slot
|
|
184
|
+
// frees. A rejected acquire yields a cancelled result, not a hung batch.
|
|
185
|
+
try {
|
|
186
|
+
await deps.providerGate.acquire(deps.parentAbortSignal);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// AcquireAbortedError: parent aborted while queued. Treat as cancelled.
|
|
190
|
+
// R7: finalize the cancelled result so trace/artifact/usage are recorded
|
|
191
|
+
// exactly once, same as any other terminal state.
|
|
192
|
+
const cancelled = cancelledResult(taskId, task);
|
|
193
|
+
finalizeTask(deps, batchId, taskId, task, cancelled);
|
|
194
|
+
return { result: cancelled, parentCancelled: true };
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
// R3: set the current packet's canonical scope so the executor guard
|
|
198
|
+
// enforces per-packet containment. Cleared in finally.
|
|
199
|
+
if (deps.scopeHolder) {
|
|
200
|
+
deps.scopeHolder.setScope(runnerDeps.canonicalScopePaths ?? []);
|
|
201
|
+
}
|
|
202
|
+
emit(deps, { batchId, taskId, role: task.role, state: 'running', objective: task.objective });
|
|
203
|
+
const outcome = await (0, runner_1.runSubtask)(task, runnerDeps, taskId);
|
|
204
|
+
// R7: single finalize path - terminal event + result callback + usage
|
|
205
|
+
// callback all happen here, exactly once, with errors isolated so a
|
|
206
|
+
// throwing sink cannot reject the batch or corrupt sibling aggregation.
|
|
207
|
+
finalizeTask(deps, batchId, taskId, task, outcome.result);
|
|
208
|
+
return outcome;
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
deps.providerGate.release();
|
|
212
|
+
deps.scopeHolder?.clear();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* R7: finalize exactly once per task. Emits the terminal lifecycle event,
|
|
217
|
+
* persists the result (artifact), and reports observed usage to the root
|
|
218
|
+
* CostTracker. Sink errors (event/trace/artifact/usage) are isolated into
|
|
219
|
+
* diagnostics: they must NOT change the child's business terminal state or
|
|
220
|
+
* reject the batch, so a failing sink cannot corrupt sibling aggregation.
|
|
221
|
+
*/
|
|
222
|
+
function finalizeTask(deps, batchId, taskId, task, result) {
|
|
223
|
+
// Terminal lifecycle event - isolated.
|
|
224
|
+
try {
|
|
225
|
+
emit(deps, {
|
|
226
|
+
batchId, taskId, role: task.role,
|
|
227
|
+
state: toEventState(result.status),
|
|
228
|
+
objective: task.objective,
|
|
229
|
+
summary: result.summary,
|
|
230
|
+
durationMs: result.usage.durationMs,
|
|
231
|
+
usage: result.usage,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
// Sink failure must not affect the result.
|
|
236
|
+
}
|
|
237
|
+
// Persist the structured result for trace/resume durability - isolated.
|
|
238
|
+
try {
|
|
239
|
+
deps.onSubtaskResult?.(result, batchId);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// An artifact/trace sink throwing cannot reject the batch.
|
|
243
|
+
}
|
|
244
|
+
// Report observed usage (never clamped) to the root CostTracker - isolated.
|
|
245
|
+
try {
|
|
246
|
+
deps.onChildUsage?.(taskId, task.role, result.usage, deps.modelLabel);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// CostTracker failure must not affect the result.
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function toEventState(status) {
|
|
253
|
+
switch (status) {
|
|
254
|
+
case 'completed': return 'completed';
|
|
255
|
+
case 'failed': return 'failed';
|
|
256
|
+
case 'cancelled': return 'cancelled';
|
|
257
|
+
case 'timed_out': return 'timed_out';
|
|
258
|
+
case 'rejected': return 'rejected';
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/** Build a rejected result (does not emit - finalizeTask handles that). */
|
|
262
|
+
function buildRejectedResult(packet, reason, taskId) {
|
|
263
|
+
const id = taskId ?? nextTaskId();
|
|
264
|
+
return {
|
|
265
|
+
id,
|
|
266
|
+
role: packet.role,
|
|
267
|
+
status: 'rejected',
|
|
268
|
+
summary: `Rejected by policy: ${reason}`,
|
|
269
|
+
findings: [],
|
|
270
|
+
files: [],
|
|
271
|
+
commands: [],
|
|
272
|
+
verification: [],
|
|
273
|
+
risks: [`policy rejected: ${reason}`],
|
|
274
|
+
usage: { modelRequests: 0, toolCalls: 0, promptTokens: 0, completionTokens: 0, durationMs: 0 },
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
function cancelledResult(taskId, packet) {
|
|
278
|
+
return {
|
|
279
|
+
id: taskId,
|
|
280
|
+
role: packet.role,
|
|
281
|
+
status: 'cancelled',
|
|
282
|
+
summary: 'Cancelled: parent turn aborted before this task started.',
|
|
283
|
+
findings: [],
|
|
284
|
+
files: [],
|
|
285
|
+
commands: [],
|
|
286
|
+
verification: [],
|
|
287
|
+
risks: ['parent turn aborted'],
|
|
288
|
+
usage: { modelRequests: 0, toolCalls: 0, promptTokens: 0, completionTokens: 0, durationMs: 0 },
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
function emit(deps, event) {
|
|
292
|
+
// R7: an event sink throwing must never reject the batch or corrupt
|
|
293
|
+
// sibling aggregation - isolate it as a diagnostic.
|
|
294
|
+
try {
|
|
295
|
+
deps.onEvent?.(event);
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
// Event sink failure is best-effort; the result is unaffected.
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../../src/runtime/subagents/supervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createSubtaskTool: the runtime-bound `subtask` tool factory.
|
|
3
|
+
*
|
|
4
|
+
* Unlike global stateless tools, this tool is created per root turn and bound
|
|
5
|
+
* to a {@link SubagentSupervisor}. It is the only way the root Agent can
|
|
6
|
+
* request child investigations; children themselves never receive it (the
|
|
7
|
+
* preset allowlist strips `subtask`), so delegation depth is structurally 1.
|
|
8
|
+
*
|
|
9
|
+
* The tool is read-only orchestration: it never writes, and its result is the
|
|
10
|
+
* structured batch summary the root Agent consumes to continue its own work.
|
|
11
|
+
*/
|
|
12
|
+
import { type OpenHorseTool } from '../../framework/tool';
|
|
13
|
+
import { type SubagentSupervisorDeps } from './supervisor';
|
|
14
|
+
import type { SubtaskRequest } from './types';
|
|
15
|
+
/** Coerce model-provided args into a validated SubtaskRequest. */
|
|
16
|
+
export declare function coerceSubtaskRequest(args: Record<string, unknown>): SubtaskRequest | null;
|
|
17
|
+
/**
|
|
18
|
+
* Create the runtime-bound `subtask` tool. The supervisor is captured in the
|
|
19
|
+
* closure so the tool is stateless from the scheduler's perspective.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createSubtaskTool(supervisorDeps: SubagentSupervisorDeps): OpenHorseTool;
|
|
22
|
+
/** Produce a compact, model-facing summary of a batch result. */
|
|
23
|
+
export declare function summarizeBatchForModel(batch: {
|
|
24
|
+
batchId: string;
|
|
25
|
+
results: Array<{
|
|
26
|
+
role: string;
|
|
27
|
+
status: string;
|
|
28
|
+
summary: string;
|
|
29
|
+
findings: unknown[];
|
|
30
|
+
risks: string[];
|
|
31
|
+
}>;
|
|
32
|
+
aggregateUsage: {
|
|
33
|
+
modelRequests: number;
|
|
34
|
+
toolCalls: number;
|
|
35
|
+
durationMs: number;
|
|
36
|
+
};
|
|
37
|
+
}): string;
|
|
38
|
+
//# sourceMappingURL=tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/runtime/subagents/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAa,KAAK,aAAa,EAA4B,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EAA+B,cAAc,EAAE,MAAM,SAAS,CAAC;AAyC3E,kEAAkE;AAClE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,GAAG,IAAI,CA4BzF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,sBAAsB,GAAG,aAAa,CA4DvF;AAED,iEAAiE;AACjE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAAC,cAAc,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAWpQ"}
|