external-subagent 0.6.2 → 0.6.4
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/cli/commands/agents.mjs +10 -2
- package/cli/constants.mjs +1 -1
- package/cli/main.mjs +1 -1
- package/cli/rpc.mjs +5 -2
- package/npm/native/darwin-arm64/external-subagent-mcp +0 -0
- package/npm/native/darwin-arm64/external-subagentd +0 -0
- package/npm/native/darwin-arm64/payload.json +4 -4
- package/npm/native/linux-x64/external-subagent-mcp +0 -0
- package/npm/native/linux-x64/external-subagentd +0 -0
- package/npm/native/linux-x64/payload.json +5 -5
- package/package.json +1 -1
- package/schema/external-subagent-public-api.json +622 -91
package/cli/commands/agents.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import { SUBAGENT_IDS } from '../config/schema.mjs';
|
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { CliError } from '../errors.mjs';
|
|
6
6
|
|
|
7
|
-
const INPUT_FIELDS = new Set(['operation', 'subagent', 'through', 'workspace', 'home']);
|
|
7
|
+
const INPUT_FIELDS = new Set(['operation', 'subagent', 'through', 'workspace', 'home', 'probe']);
|
|
8
8
|
|
|
9
9
|
function validateInput(input) {
|
|
10
10
|
if (!input || typeof input !== 'object' || Array.isArray(input)) throw new CliError('INVALID_ARGUMENT', 'subagents input must be an object', 2);
|
|
@@ -71,6 +71,14 @@ export function parseSubagentsArgs(args) {
|
|
|
71
71
|
if (operation === 'probe') return parseProbeArgs(rest);
|
|
72
72
|
if (operation === 'models') return parseModelsArgs(rest);
|
|
73
73
|
if (operation === 'list' && rest.length !== 0) throw new CliError('INVALID_ARGUMENT', 'usage: subagents list', 2);
|
|
74
|
+
if (operation === 'status') {
|
|
75
|
+
// `subagents status [subagent] [--probe]`: --probe asks the daemon to
|
|
76
|
+
// refresh model-catalog evidence before projecting (bounded, no prompts).
|
|
77
|
+
const positional = rest.filter((arg) => arg !== '--probe');
|
|
78
|
+
if (rest.length - positional.length > 1) throw new CliError('INVALID_ARGUMENT', 'usage: subagents status [subagent] [--probe]', 2);
|
|
79
|
+
if (positional.length > 1) throw new CliError('INVALID_ARGUMENT', 'usage: subagents status [subagent] [--probe]', 2);
|
|
80
|
+
return { operation, ...(positional[0] ? { subagent: positional[0] } : {}), ...(rest.includes('--probe') ? { probe: true } : {}) };
|
|
81
|
+
}
|
|
74
82
|
if (operation !== 'list' && rest.length > 1) throw new CliError('INVALID_ARGUMENT', `usage: subagents ${operation} [subagent]`, 2);
|
|
75
83
|
return { operation, ...(rest[0] ? { subagent: rest[0] } : {}) };
|
|
76
84
|
}
|
|
@@ -141,7 +149,7 @@ export async function subagentsCommand(paths, input = {}, options = {}) {
|
|
|
141
149
|
}
|
|
142
150
|
if (operation !== 'status') throw new CliError('INVALID_ARGUMENT', `unsupported subagents operation: ${operation}`, 2);
|
|
143
151
|
if (typeof options.callDaemon !== 'function' || typeof options.socket !== 'string') throw new CliError('INTERNAL_ERROR', 'subagents status requires a daemon connection');
|
|
144
|
-
const status = await options.callDaemon(options.socket, 'status', {});
|
|
152
|
+
const status = await options.callDaemon(options.socket, input.probe === true ? 'status-refresh' : 'status', input.probe === true ? { probe: true } : {});
|
|
145
153
|
const entries = status.subagents ?? status.agents;
|
|
146
154
|
if (!Array.isArray(entries)) throw new CliError('PROTOCOL_ERROR', 'daemon status did not include subagent status');
|
|
147
155
|
const subagents = entries.filter((entry) => input.subagent === undefined || (entry.subagent ?? entry.agent) === input.subagent).map(subagentView);
|
package/cli/constants.mjs
CHANGED
|
@@ -12,7 +12,7 @@ const IS_DEBUG_VARIANT = process.env.EXTERNAL_SUBAGENT_VARIANT === 'debug';
|
|
|
12
12
|
|
|
13
13
|
export const PRODUCT_NAME = IS_DEBUG_VARIANT ? 'external-subagent-debug' : 'external-subagent';
|
|
14
14
|
export const PRODUCT_ID = IS_DEBUG_VARIANT ? 'external_subagent_debug' : 'external_subagent';
|
|
15
|
-
export const VERSION = '0.6.
|
|
15
|
+
export const VERSION = '0.6.4';
|
|
16
16
|
export const LAUNCH_AGENT_LABEL = IS_DEBUG_VARIANT ? 'com.external-subagent-debug.daemon' : 'com.external-subagent.daemon';
|
|
17
17
|
export const DAEMON_BIN_NAME = IS_DEBUG_VARIANT ? 'external-subagent-debugd' : 'external-subagentd';
|
|
18
18
|
export const MCP_BIN_NAME = IS_DEBUG_VARIANT ? 'external-subagent-debug-mcp' : 'external-subagent-mcp';
|
package/cli/main.mjs
CHANGED
|
@@ -24,7 +24,7 @@ import { parseProfileArgs, parseSpawnArgs, prepareSpawnInput, profileCommand } f
|
|
|
24
24
|
const SUPPORTED_PLATFORMS = new Set(['darwin', 'linux', 'win32']);
|
|
25
25
|
|
|
26
26
|
const HELP = `external-subagent ${VERSION}\n\nUsage: external-subagent <command> [options]\n\nCommands:\n help, version Show basic product information\n init [--dry-run] [--resume] [--skip-service-start]\n Install the standalone daemon service only; bind a\n host afterwards with install-plugin or install-mcp\n install-plugin [codex|zcode|dsh] [--dry-run|--uninstall] [--codex-home <path>]\n [--profile <name> [--dsh-home <path>]]\n Install or remove the managed host plugin (MCP + skill);\n the host defaults to codex, --codex-home is codex-only,\n --profile/--dsh-home are dsh-only (the dsh host appends\n one managed mcp-client entry to the profile's\n cordis.patch.yml under $DSH_HOME/profiles)\n install-mcp [--dry-run|--uninstall] [--codex-home <path>]\n Install or remove the direct Codex MCP TOML binding\n status, diagnose Inspect local service and runtime state\n start, stop Bootstrap or boot out the daemon service\n profile list | profile show <name>\n Inspect global spawn profiles (profiles/*.json);\n invalid files are reported as path-based warnings,\n and warned or duplicate files are excluded from the\n available name set\n backup --output <dir> Back up retained product data\n restore --input <dir> Verify and restore product data\n uninstall Release Codex/ZCode/DSH bindings; remove service registration; retain data\n purge --yes Explicitly delete new product data\n`;
|
|
27
|
-
const DAEMON_HELP = ` config get [key] | config set <key> <value>\n subagents list | subagents status [subagent] | subagents probe/models [subagent]\n create/spawn [--profile <name>], wait (one agent_id or a JSON array of up to 16), list, send, respond, cancel, result, close, observe\n Daemon calls accept --json '<object>' or JSON stdin\n list JSON requires repository (workspace is an alias)\n observe JSON requires only agent_id\n`;
|
|
27
|
+
const DAEMON_HELP = ` config get [key] | config set <key> <value>\n subagents list | subagents status [subagent] [--probe] | subagents probe/models [subagent]\n create/spawn [--profile <name>], wait (one agent_id or a JSON array of up to 16), list, send, respond, cancel, result, close, observe\n Daemon calls accept --json '<object>' or JSON stdin\n list JSON requires repository (workspace is an alias)\n observe JSON requires only agent_id\n`;
|
|
28
28
|
|
|
29
29
|
function structuredInput(args, parser) {
|
|
30
30
|
return args.length > 0 && !args[0].startsWith('--') ? parser(args) : parseDaemonInput(args);
|
package/cli/rpc.mjs
CHANGED
|
@@ -38,7 +38,7 @@ export function waitTransportTimeoutMs(waitTime = 290) {
|
|
|
38
38
|
|
|
39
39
|
export function daemonTransportTimeoutMs(command, params = {}) {
|
|
40
40
|
if (command === 'wait') return waitTransportTimeoutMs(params.wait_time);
|
|
41
|
-
if (command === 'agent-probe' || command === 'agent-models') return AGENT_PROBE_TRANSPORT_TIMEOUT_MS;
|
|
41
|
+
if (command === 'agent-probe' || command === 'agent-models' || command === 'status-refresh') return AGENT_PROBE_TRANSPORT_TIMEOUT_MS;
|
|
42
42
|
if (command === 'create' || command === 'spawn') return SPAWN_TRANSPORT_TIMEOUT_MS;
|
|
43
43
|
return 6000;
|
|
44
44
|
}
|
|
@@ -101,6 +101,9 @@ function rejectUnknownFields(command, input, allowed) {
|
|
|
101
101
|
function methodFor(command, input) {
|
|
102
102
|
switch (command) {
|
|
103
103
|
case 'status': return { method: 'system_status' };
|
|
104
|
+
case 'status-refresh':
|
|
105
|
+
rejectUnknownFields('status-refresh', input, new Set(['probe']));
|
|
106
|
+
return { method: 'system_status_refresh', params: { probe: input.probe === true } };
|
|
104
107
|
case 'drain': return { method: 'daemon_begin_drain', ...(input.cancel_active === true ? { params: { cancel_active: true } } : {}) };
|
|
105
108
|
case 'drain-status': return { method: 'daemon_drain_status' };
|
|
106
109
|
case 'drain-abort': return { method: 'daemon_abort_drain' };
|
|
@@ -240,7 +243,7 @@ function publicWaitBody(body) {
|
|
|
240
243
|
|
|
241
244
|
export function projectDaemonResult(command, result) {
|
|
242
245
|
switch (command) {
|
|
243
|
-
case 'status': return result.status;
|
|
246
|
+
case 'status': case 'status-refresh': return result.status;
|
|
244
247
|
case 'drain': case 'drain-status': case 'drain-abort': case 'activate-ready': return result;
|
|
245
248
|
case 'agent-probe': return { evidence: result.evidence, status: result.status };
|
|
246
249
|
case 'agent-models': return result.catalog ?? result;
|
|
Binary file
|
|
Binary file
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"product": "external-subagent",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.4",
|
|
5
5
|
"platform": "darwin-arm64",
|
|
6
6
|
"files": [
|
|
7
7
|
{
|
|
8
8
|
"name": "external-subagentd",
|
|
9
|
-
"bytes":
|
|
9
|
+
"bytes": 10475760,
|
|
10
10
|
"mode": "755",
|
|
11
|
-
"sha256": "
|
|
11
|
+
"sha256": "36397c02758203261b0b5bd6b013e6351dda69a0b1b1f4cc62e00e8375defea5"
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
"name": "external-subagent-mcp",
|
|
15
15
|
"bytes": 935776,
|
|
16
16
|
"mode": "755",
|
|
17
|
-
"sha256": "
|
|
17
|
+
"sha256": "1c3c44601eb14c550e3ea336a2d021e4287944501fdb11d6708c0ae4e1b876db"
|
|
18
18
|
}
|
|
19
19
|
]
|
|
20
20
|
}
|
|
Binary file
|
|
Binary file
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"product": "external-subagent",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.4",
|
|
5
5
|
"platform": "linux-x64",
|
|
6
6
|
"files": [
|
|
7
7
|
{
|
|
8
8
|
"name": "external-subagentd",
|
|
9
|
-
"bytes":
|
|
9
|
+
"bytes": 12086128,
|
|
10
10
|
"mode": "755",
|
|
11
|
-
"sha256": "
|
|
11
|
+
"sha256": "f1626011054612a995f18d86e0249f25c464fe7ca36b4c3a3d5431382e90c76e"
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
"name": "external-subagent-mcp",
|
|
15
|
-
"bytes":
|
|
15
|
+
"bytes": 1025528,
|
|
16
16
|
"mode": "755",
|
|
17
|
-
"sha256": "
|
|
17
|
+
"sha256": "4d502cfd888b493ca3e01ed420e6cb4715d36b9067055359343aecd3765ddf97"
|
|
18
18
|
}
|
|
19
19
|
]
|
|
20
20
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "external-subagent",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"description": "Manage bounded ZCode, DeepSeek Harness (DSH), Codex, and Google Antigravity (agy) subagent tasks through a local MCP service for any local host (Codex, ZCode, or a custom MCP client)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -4,181 +4,586 @@
|
|
|
4
4
|
"title": "external-subagent MCP public API",
|
|
5
5
|
"description": "The intentionally small external_subagent_* wire catalog.",
|
|
6
6
|
"type": "object",
|
|
7
|
-
"required": [
|
|
7
|
+
"required": [
|
|
8
|
+
"tools"
|
|
9
|
+
],
|
|
8
10
|
"properties": {
|
|
9
11
|
"tools": {
|
|
10
12
|
"type": "array",
|
|
11
|
-
"const": [
|
|
13
|
+
"const": [
|
|
14
|
+
"external_subagent_cancel",
|
|
15
|
+
"external_subagent_close",
|
|
16
|
+
"external_subagent_list",
|
|
17
|
+
"external_subagent_observe",
|
|
18
|
+
"external_subagent_wait",
|
|
19
|
+
"external_subagent_respond",
|
|
20
|
+
"external_subagent_result",
|
|
21
|
+
"external_subagent_send",
|
|
22
|
+
"external_subagent_spawn",
|
|
23
|
+
"external_subagent_status"
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"permission_mode": {
|
|
27
|
+
"enum": [
|
|
28
|
+
"build",
|
|
29
|
+
"edit",
|
|
30
|
+
"plan",
|
|
31
|
+
"yolo"
|
|
32
|
+
],
|
|
33
|
+
"default": "build"
|
|
12
34
|
},
|
|
13
|
-
"permission_mode": { "enum": ["build", "edit", "plan", "yolo"], "default": "build" },
|
|
14
35
|
"subagent_status": {
|
|
15
36
|
"type": "object",
|
|
16
|
-
"required": [
|
|
37
|
+
"required": [
|
|
38
|
+
"subagent",
|
|
39
|
+
"configured",
|
|
40
|
+
"enabled",
|
|
41
|
+
"spawn_supported",
|
|
42
|
+
"permission_modes",
|
|
43
|
+
"model_selection",
|
|
44
|
+
"effort_selection",
|
|
45
|
+
"local",
|
|
46
|
+
"auth",
|
|
47
|
+
"hi"
|
|
48
|
+
],
|
|
17
49
|
"properties": {
|
|
18
|
-
"subagent": {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
50
|
+
"subagent": {
|
|
51
|
+
"enum": [
|
|
52
|
+
"zcode",
|
|
53
|
+
"dsh",
|
|
54
|
+
"codex",
|
|
55
|
+
"agy"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
"configured": {
|
|
59
|
+
"type": "boolean"
|
|
60
|
+
},
|
|
61
|
+
"enabled": {
|
|
62
|
+
"type": "boolean"
|
|
63
|
+
},
|
|
64
|
+
"spawn_supported": {
|
|
65
|
+
"type": "boolean"
|
|
66
|
+
},
|
|
22
67
|
"permission_modes": {
|
|
23
68
|
"type": "array",
|
|
24
|
-
"items": {
|
|
69
|
+
"items": {
|
|
70
|
+
"enum": [
|
|
71
|
+
"build",
|
|
72
|
+
"edit",
|
|
73
|
+
"plan",
|
|
74
|
+
"yolo"
|
|
75
|
+
]
|
|
76
|
+
},
|
|
25
77
|
"uniqueItems": true
|
|
26
78
|
},
|
|
27
79
|
"model_selection": {
|
|
28
80
|
"type": "object",
|
|
29
|
-
"required": [
|
|
81
|
+
"required": [
|
|
82
|
+
"supported",
|
|
83
|
+
"mode"
|
|
84
|
+
],
|
|
30
85
|
"properties": {
|
|
31
|
-
"supported": {
|
|
32
|
-
|
|
86
|
+
"supported": {
|
|
87
|
+
"type": "boolean"
|
|
88
|
+
},
|
|
89
|
+
"mode": {
|
|
90
|
+
"enum": [
|
|
91
|
+
"native_only",
|
|
92
|
+
"catalog_token"
|
|
93
|
+
]
|
|
94
|
+
}
|
|
33
95
|
},
|
|
34
96
|
"additionalProperties": false
|
|
35
97
|
},
|
|
36
98
|
"effort_selection": {
|
|
37
99
|
"type": "object",
|
|
38
100
|
"description": "Reasoning-effort steering capability. codex admits only its closed set; zcode and dsh pass a bounded [a-z0-9_] token through to the runtime.",
|
|
39
|
-
"required": [
|
|
101
|
+
"required": [
|
|
102
|
+
"supported",
|
|
103
|
+
"mode"
|
|
104
|
+
],
|
|
40
105
|
"properties": {
|
|
41
|
-
"supported": {
|
|
42
|
-
|
|
106
|
+
"supported": {
|
|
107
|
+
"type": "boolean"
|
|
108
|
+
},
|
|
109
|
+
"mode": {
|
|
110
|
+
"enum": [
|
|
111
|
+
"closed_set",
|
|
112
|
+
"passthrough_token"
|
|
113
|
+
]
|
|
114
|
+
}
|
|
43
115
|
},
|
|
44
116
|
"additionalProperties": false
|
|
45
117
|
},
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
118
|
+
"models": {
|
|
119
|
+
"$ref": "#/properties/subagent_models_status"
|
|
120
|
+
},
|
|
121
|
+
"local": {
|
|
122
|
+
"$ref": "#/properties/subagent_scope_status"
|
|
123
|
+
},
|
|
124
|
+
"auth": {
|
|
125
|
+
"$ref": "#/properties/subagent_scope_status"
|
|
126
|
+
},
|
|
127
|
+
"hi": {
|
|
128
|
+
"$ref": "#/properties/subagent_scope_status"
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"additionalProperties": false
|
|
132
|
+
},
|
|
133
|
+
"subagent_models_status": {
|
|
134
|
+
"type": "object",
|
|
135
|
+
"description": "Passive projection of recorded model-catalog evidence. Present only when discovery ever ran (status probe=true or an explicit models call); never discovered means the field is absent. Recorded evidence whose config revision no longer matches degrades to supported=false with reason stale_config_revision.",
|
|
136
|
+
"required": [
|
|
137
|
+
"supported",
|
|
138
|
+
"tokens",
|
|
139
|
+
"source",
|
|
140
|
+
"checked_at_ms"
|
|
141
|
+
],
|
|
142
|
+
"properties": {
|
|
143
|
+
"supported": {
|
|
144
|
+
"type": "boolean"
|
|
145
|
+
},
|
|
146
|
+
"tokens": {
|
|
147
|
+
"type": "array",
|
|
148
|
+
"description": "Model selection tokens usable verbatim in spawn model (zcode provider/model, dsh provider:model, codex model id, agy bare slug). Empty when supported is false.",
|
|
149
|
+
"items": {
|
|
150
|
+
"type": "string"
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
"source": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"description": "Evidence source label, e.g. zcode_session_create_settings, codex_app_server_model_list, dsh_acp_models_list, agy_models_list."
|
|
156
|
+
},
|
|
157
|
+
"version": {
|
|
158
|
+
"type": "string",
|
|
159
|
+
"description": "Runtime version observed at discovery time; omitted when unknown."
|
|
160
|
+
},
|
|
161
|
+
"checked_at_ms": {
|
|
162
|
+
"type": "integer",
|
|
163
|
+
"description": "Epoch milliseconds when the evidence was recorded."
|
|
164
|
+
},
|
|
165
|
+
"reason": {
|
|
166
|
+
"type": "string",
|
|
167
|
+
"description": "Bounded degradation reason (stale_config_revision, auth_required, model_catalog_empty, transport, ...); omitted on success."
|
|
168
|
+
}
|
|
49
169
|
},
|
|
50
170
|
"additionalProperties": false
|
|
51
171
|
},
|
|
52
172
|
"subagent_scope_status": {
|
|
53
173
|
"type": "object",
|
|
54
174
|
"description": "Readiness conclusion only. Probe evidence (scope paths, version, checked_at_ms, reason) stays on the daemon RPC view for the CLI diagnose owner.",
|
|
55
|
-
"required": [
|
|
175
|
+
"required": [
|
|
176
|
+
"state"
|
|
177
|
+
],
|
|
56
178
|
"properties": {
|
|
57
|
-
"state": {
|
|
179
|
+
"state": {
|
|
180
|
+
"enum": [
|
|
181
|
+
"READY",
|
|
182
|
+
"DEGRADED",
|
|
183
|
+
"UNAVAILABLE",
|
|
184
|
+
"UNKNOWN"
|
|
185
|
+
]
|
|
186
|
+
}
|
|
58
187
|
},
|
|
59
188
|
"additionalProperties": false
|
|
60
189
|
},
|
|
61
190
|
"spawn": {
|
|
62
191
|
"type": "object",
|
|
63
192
|
"description": "Start one durable subagent in an absolute repository workspace, returning after establishing the new session.",
|
|
64
|
-
"required": [
|
|
193
|
+
"required": [
|
|
194
|
+
"repository",
|
|
195
|
+
"prompt"
|
|
196
|
+
],
|
|
65
197
|
"properties": {
|
|
66
|
-
"profile": {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
"
|
|
72
|
-
|
|
73
|
-
|
|
198
|
+
"profile": {
|
|
199
|
+
"type": "string",
|
|
200
|
+
"minLength": 1,
|
|
201
|
+
"description": "Profile name referencing a JSON preset in profiles/*.json. Mutually exclusive with subagent, permission_mode, model, and effort."
|
|
202
|
+
},
|
|
203
|
+
"subagent": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"minLength": 1,
|
|
206
|
+
"description": "Subagent route key; omission uses configured default_subagent or returns subagent_required. Null is invalid; dsh production spawn requires its enabled + spawn_supported + pinned-runtime configuration."
|
|
207
|
+
},
|
|
208
|
+
"repository": {
|
|
209
|
+
"type": "string",
|
|
210
|
+
"minLength": 1
|
|
211
|
+
},
|
|
212
|
+
"permission_mode": {
|
|
213
|
+
"$ref": "#/properties/permission_mode",
|
|
214
|
+
"description": "codex supports build/edit (workspace-write), plan (read-only), and yolo (danger-full-access), always with approvalPolicy=never; agy supports only build (--mode accept-edits) and yolo (--dangerously-skip-permissions)."
|
|
215
|
+
},
|
|
216
|
+
"prompt": {
|
|
217
|
+
"type": "string",
|
|
218
|
+
"minLength": 1
|
|
219
|
+
},
|
|
220
|
+
"model": {
|
|
221
|
+
"type": "string",
|
|
222
|
+
"minLength": 1,
|
|
223
|
+
"description": "Task model. dsh requires provider:model, split at the first colon (the model side may contain further colons; a missing colon or an empty side is rejected before any task). codex uses its own model id; zcode requires an explicit provider/model token from the spawn request or a named profile, and rejects a bare token, an omitted model, and agents.zcode.default_model at admission. agy uses a bare model slug with no ':' or '/' separator or whitespace; admission validates only that shape and the daemon does not verify catalog membership, so an unknown slug fails loudly at session start when the agy CLI rejects it. Omission falls back to the configured default_model for dsh and agy, then to the provider-native model; codex requires an explicit model or agents.codex.default_model; zcode and codex never fall back to a provider default."
|
|
224
|
+
},
|
|
225
|
+
"effort": {
|
|
226
|
+
"type": "string",
|
|
227
|
+
"minLength": 1,
|
|
228
|
+
"maxLength": 24,
|
|
229
|
+
"pattern": "^[a-z0-9_]+$",
|
|
230
|
+
"description": "Reasoning-effort token: 1..24 bytes of [a-z0-9_]. codex admits only low, medium, high or xhigh; agy admits only low, medium, high or max; zcode and dsh pass the bounded token through. Omission keeps the runtime default."
|
|
231
|
+
},
|
|
232
|
+
"write_manifest": {
|
|
233
|
+
"type": "array",
|
|
234
|
+
"items": {
|
|
235
|
+
"type": "string",
|
|
236
|
+
"minLength": 1
|
|
237
|
+
},
|
|
238
|
+
"description": "codex requires an empty or omitted write_manifest; non-empty input returns codex_write_manifest_unsupported before task creation. agy likewise requires an empty or omitted write_manifest; non-empty input returns agy_write_manifest_unsupported before task creation. dsh admits a non-empty manifest in build through the guarded manifest-build composition (workspace-write sandbox, only tool-fs writable, out-of-manifest paths rejected as FS_WRITE_MANIFEST_DENIED), at most 256 entries; an explicit [\".\"] keeps the existing build composition. plan requires an empty manifest for every subagent."
|
|
239
|
+
}
|
|
74
240
|
},
|
|
75
241
|
"allOf": [
|
|
76
|
-
{
|
|
77
|
-
"
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
|
|
242
|
+
{
|
|
243
|
+
"if": {
|
|
244
|
+
"required": [
|
|
245
|
+
"subagent"
|
|
246
|
+
],
|
|
247
|
+
"properties": {
|
|
248
|
+
"subagent": {
|
|
249
|
+
"const": "codex"
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
"then": {
|
|
254
|
+
"properties": {
|
|
255
|
+
"write_manifest": {
|
|
256
|
+
"maxItems": 0
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"if": {
|
|
263
|
+
"required": [
|
|
264
|
+
"subagent"
|
|
265
|
+
],
|
|
266
|
+
"properties": {
|
|
267
|
+
"subagent": {
|
|
268
|
+
"const": "dsh"
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
"then": {
|
|
273
|
+
"properties": {
|
|
274
|
+
"write_manifest": {
|
|
275
|
+
"maxItems": 256
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"if": {
|
|
282
|
+
"required": [
|
|
283
|
+
"subagent"
|
|
284
|
+
],
|
|
285
|
+
"properties": {
|
|
286
|
+
"subagent": {
|
|
287
|
+
"const": "agy"
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
"then": {
|
|
292
|
+
"properties": {
|
|
293
|
+
"permission_mode": {
|
|
294
|
+
"enum": [
|
|
295
|
+
"build",
|
|
296
|
+
"yolo"
|
|
297
|
+
]
|
|
298
|
+
},
|
|
299
|
+
"model": {
|
|
300
|
+
"type": "string",
|
|
301
|
+
"minLength": 1,
|
|
302
|
+
"maxLength": 512,
|
|
303
|
+
"pattern": "^[^:/\\s]+$"
|
|
304
|
+
},
|
|
305
|
+
"effort": {
|
|
306
|
+
"enum": [
|
|
307
|
+
"low",
|
|
308
|
+
"medium",
|
|
309
|
+
"high",
|
|
310
|
+
"max"
|
|
311
|
+
]
|
|
312
|
+
},
|
|
313
|
+
"write_manifest": {
|
|
314
|
+
"maxItems": 0
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"if": {
|
|
321
|
+
"required": [
|
|
322
|
+
"permission_mode"
|
|
323
|
+
],
|
|
324
|
+
"properties": {
|
|
325
|
+
"permission_mode": {
|
|
326
|
+
"const": "plan"
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"then": {
|
|
331
|
+
"properties": {
|
|
332
|
+
"write_manifest": {
|
|
333
|
+
"maxItems": 0
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
89
338
|
],
|
|
90
339
|
"additionalProperties": false
|
|
91
340
|
},
|
|
92
341
|
"list": {
|
|
93
342
|
"type": "object",
|
|
94
|
-
"required": [
|
|
343
|
+
"required": [
|
|
344
|
+
"repository"
|
|
345
|
+
],
|
|
95
346
|
"properties": {
|
|
96
|
-
"subagent": {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
"
|
|
101
|
-
|
|
347
|
+
"subagent": {
|
|
348
|
+
"type": "string",
|
|
349
|
+
"minLength": 1
|
|
350
|
+
},
|
|
351
|
+
"repository": {
|
|
352
|
+
"type": "string",
|
|
353
|
+
"minLength": 1
|
|
354
|
+
},
|
|
355
|
+
"phase": {
|
|
356
|
+
"type": [
|
|
357
|
+
"string",
|
|
358
|
+
"null"
|
|
359
|
+
],
|
|
360
|
+
"default": null
|
|
361
|
+
},
|
|
362
|
+
"outcome": {
|
|
363
|
+
"type": [
|
|
364
|
+
"string",
|
|
365
|
+
"null"
|
|
366
|
+
],
|
|
367
|
+
"default": null
|
|
368
|
+
},
|
|
369
|
+
"cursor": {
|
|
370
|
+
"type": [
|
|
371
|
+
"string",
|
|
372
|
+
"null"
|
|
373
|
+
],
|
|
374
|
+
"default": null
|
|
375
|
+
},
|
|
376
|
+
"limit": {
|
|
377
|
+
"type": "integer",
|
|
378
|
+
"minimum": 1,
|
|
379
|
+
"maximum": 100,
|
|
380
|
+
"default": 100
|
|
381
|
+
}
|
|
102
382
|
},
|
|
103
383
|
"additionalProperties": false
|
|
104
384
|
},
|
|
105
385
|
"wait": {
|
|
106
386
|
"type": "object",
|
|
107
387
|
"description": "agent_id accepts one agent id (number) or a list of 1..=16 ids. A single id returns the single wait object described below. A list blocks until every listed agent is terminal OR any one of them raises an actionable pending request, then returns a FLAT object: one key per distinct agent id carrying that agent's ordinary wait object (a repeated id is awaited once like any other), plus one \"error\" key mapping problematic ids to markers - duplicated for ids repeated in the input and unknown_agent for ids that do not exist; the remaining ids are still awaited normally. Recommended parallel pattern: spawn every subagent first, then call wait once with all ids. In list mode message_id is not supported (pass it only with a scalar id), every element carries message_receipt=null, and each element's timed_out flag follows the same shared deadline. Wait up to 290 seconds by default. Returns early only when an actionable pending request exists (permission requests need allow/deny; user-input requests carry the full embedded question and need answer with non-empty content) or the terminal result is available; ordinary progress, message receipts, already-responded and unsupported requests never wake it, and its timeout still returns timed_out=true. When the embedded result page carries next_offset=null it is the whole final result and no further result call is needed; otherwise continue reading with external_subagent_result from next_offset. A failed terminal result also carries failure_message: usually the daemon's bounded single-line JSON failure detail, but an early fail_claim row may be plain text, so treat it as an opaque bounded string and attempt JSON parsing defensively (null when the task has no persisted detail or the outcome is not a failure). Read failure_message before falling back to daemon logs or sqlite. The pending_requests projection stays capped at 100 records while the wake decision scans the full pending set, and the request that woke the wait is always part of the returned projection so its request_id can be answered directly. activity carries the text tail incrementally: each wait returns only the text appended since the previous wait (an empty tail means nothing new), every byte is delivered by wait at most once, and latest_text_truncated flags the case where undelivered bytes rolled out of the bounded window so this response degraded to the whole window (on the terminal response, bytes repeating the embedded result page verbatim are stripped so they are not shipped twice), tool calls started in the last 60 seconds, and telemetry status; activity also exposes last_activity_age_ms (null before any activity) and model_request_active; additionally in_flight_tool_count counts tracked in-flight tool calls (scheduled or started without a matching result, error or permission resolution; 0 when there is no snapshot or the adapter has no per-call lifecycle tracking, such as codex) and oldest_in_flight_tool_age_ms is the age since the oldest tracked in-flight call first appeared (null when none is tracked); use external_subagent_observe only when these liveness signals suggest a meaningless loop or a stuck command, to inspect recent tool-call detail.Wait up to 290 seconds by default. Returns early only when an actionable pending request exists (permission requests need allow/deny; user-input requests carry the full embedded question and need answer with non-empty content) or the terminal result is available; ordinary progress, message receipts, already-responded and unsupported requests never wake it, and its timeout still returns timed_out=true. When the embedded result page carries next_offset=null it is the whole final result and no further result call is needed; otherwise continue reading with external_subagent_result from next_offset. A failed terminal result also carries failure_message: usually the daemon's bounded single-line JSON failure detail, but an early fail_claim row may be plain text, so treat it as an opaque bounded string and attempt JSON parsing defensively (null when the task has no persisted detail or the outcome is not a failure). Read failure_message before falling back to daemon logs or sqlite. The pending_requests projection stays capped at 100 records while the wake decision scans the full pending set, and the request that woke the wait is always part of the returned projection so its request_id can be answered directly. activity carries the text tail incrementally: each wait returns only the text appended since the previous wait (an empty tail means nothing new), every byte is delivered by wait at most once, and latest_text_truncated flags the case where undelivered bytes rolled out of the bounded window so this response degraded to the whole window (on the terminal response, bytes repeating the embedded result page verbatim are stripped so they are not shipped twice), tool calls started in the last 60 seconds, and telemetry status; activity also exposes last_activity_age_ms (null before any activity) and model_request_active; additionally in_flight_tool_count counts tracked in-flight tool calls (scheduled or started without a matching result, error or permission resolution; 0 when there is no snapshot or the adapter has no per-call lifecycle tracking, such as codex) and oldest_in_flight_tool_age_ms is the age since the oldest tracked in-flight call first appeared (null when none is tracked); use external_subagent_observe only when these liveness signals suggest a meaningless loop or a stuck command, to inspect recent tool-call detail.",
|
|
108
|
-
"required": [
|
|
388
|
+
"required": [
|
|
389
|
+
"agent_id"
|
|
390
|
+
],
|
|
109
391
|
"properties": {
|
|
110
392
|
"agent_id": {
|
|
111
393
|
"anyOf": [
|
|
112
|
-
{
|
|
113
|
-
|
|
394
|
+
{
|
|
395
|
+
"type": "integer",
|
|
396
|
+
"minimum": 10000000,
|
|
397
|
+
"maximum": 99999999
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"type": "array",
|
|
401
|
+
"minItems": 1,
|
|
402
|
+
"maxItems": 16,
|
|
403
|
+
"items": {
|
|
404
|
+
"type": "integer",
|
|
405
|
+
"minimum": 10000000,
|
|
406
|
+
"maximum": 99999999
|
|
407
|
+
}
|
|
408
|
+
}
|
|
114
409
|
],
|
|
115
410
|
"description": "One agent id (scalar response) or a list of 1..=16 ids awaited together (response is an object keyed by agent id, each value the ordinary wait output or {\"error\":\"duplicated\"}/{\"error\":\"unknown_agent\"})."
|
|
116
411
|
},
|
|
117
|
-
"wait_time": {
|
|
118
|
-
|
|
412
|
+
"wait_time": {
|
|
413
|
+
"type": "integer",
|
|
414
|
+
"minimum": 0,
|
|
415
|
+
"maximum": 299,
|
|
416
|
+
"default": 290
|
|
417
|
+
},
|
|
418
|
+
"message_id": {
|
|
419
|
+
"type": [
|
|
420
|
+
"string",
|
|
421
|
+
"null"
|
|
422
|
+
],
|
|
423
|
+
"description": "Only supported with a scalar agent_id."
|
|
424
|
+
}
|
|
119
425
|
},
|
|
120
426
|
"additionalProperties": false
|
|
121
427
|
},
|
|
122
428
|
"observe": {
|
|
123
429
|
"description": "Read captured task observations for zcode, dsh, codex or agy. zcode and dsh expose at most 200 Unicode characters of public reasoning; codex and agy reasoning is null. Coverage reports capture gaps and unsupported history truthfully.",
|
|
124
430
|
"type": "object",
|
|
125
|
-
"required": [
|
|
431
|
+
"required": [
|
|
432
|
+
"agent_id"
|
|
433
|
+
],
|
|
126
434
|
"properties": {
|
|
127
|
-
"agent_id": {
|
|
435
|
+
"agent_id": {
|
|
436
|
+
"type": "integer",
|
|
437
|
+
"minimum": 10000000,
|
|
438
|
+
"maximum": 99999999
|
|
439
|
+
}
|
|
128
440
|
},
|
|
129
441
|
"additionalProperties": false
|
|
130
442
|
},
|
|
131
443
|
"result": {
|
|
132
444
|
"type": "object",
|
|
133
445
|
"description": "Pages bounded terminal task-owned text with the offset and limit continuation contract. Questions from user-input requests are embedded in full in wait projections, not paged here.",
|
|
134
|
-
"required": [
|
|
446
|
+
"required": [
|
|
447
|
+
"agent_id"
|
|
448
|
+
],
|
|
135
449
|
"properties": {
|
|
136
|
-
"agent_id": {
|
|
137
|
-
|
|
138
|
-
|
|
450
|
+
"agent_id": {
|
|
451
|
+
"type": "integer",
|
|
452
|
+
"minimum": 10000000,
|
|
453
|
+
"maximum": 99999999
|
|
454
|
+
},
|
|
455
|
+
"offset": {
|
|
456
|
+
"type": "integer",
|
|
457
|
+
"minimum": 0,
|
|
458
|
+
"default": 0
|
|
459
|
+
},
|
|
460
|
+
"limit": {
|
|
461
|
+
"type": "integer",
|
|
462
|
+
"minimum": 1,
|
|
463
|
+
"maximum": 262144,
|
|
464
|
+
"default": 262144
|
|
465
|
+
}
|
|
139
466
|
},
|
|
140
467
|
"additionalProperties": false
|
|
141
468
|
},
|
|
142
469
|
"result_projection": {
|
|
143
470
|
"type": "object",
|
|
144
|
-
"required": [
|
|
471
|
+
"required": [
|
|
472
|
+
"outcome",
|
|
473
|
+
"final_text",
|
|
474
|
+
"partial",
|
|
475
|
+
"offset",
|
|
476
|
+
"total_bytes",
|
|
477
|
+
"next_offset",
|
|
478
|
+
"reason_code",
|
|
479
|
+
"failure_message"
|
|
480
|
+
],
|
|
145
481
|
"properties": {
|
|
146
|
-
"outcome": {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
482
|
+
"outcome": {
|
|
483
|
+
"enum": [
|
|
484
|
+
"COMPLETED",
|
|
485
|
+
"FAILED",
|
|
486
|
+
"CANCELLED",
|
|
487
|
+
"TIMED_OUT",
|
|
488
|
+
"RUNTIME_LOST",
|
|
489
|
+
"RESULT_INVALID"
|
|
490
|
+
]
|
|
491
|
+
},
|
|
492
|
+
"final_text": {
|
|
493
|
+
"type": "string"
|
|
494
|
+
},
|
|
495
|
+
"partial": {
|
|
496
|
+
"type": "boolean"
|
|
497
|
+
},
|
|
498
|
+
"offset": {
|
|
499
|
+
"type": "integer",
|
|
500
|
+
"minimum": 0
|
|
501
|
+
},
|
|
502
|
+
"total_bytes": {
|
|
503
|
+
"type": "integer",
|
|
504
|
+
"minimum": 0
|
|
505
|
+
},
|
|
506
|
+
"next_offset": {
|
|
507
|
+
"type": [
|
|
508
|
+
"integer",
|
|
509
|
+
"null"
|
|
510
|
+
],
|
|
511
|
+
"minimum": 0
|
|
512
|
+
},
|
|
513
|
+
"reason_code": {
|
|
514
|
+
"type": [
|
|
515
|
+
"string",
|
|
516
|
+
"null"
|
|
517
|
+
]
|
|
518
|
+
},
|
|
519
|
+
"failure_message": {
|
|
520
|
+
"type": [
|
|
521
|
+
"string",
|
|
522
|
+
"null"
|
|
523
|
+
]
|
|
524
|
+
}
|
|
154
525
|
},
|
|
155
526
|
"additionalProperties": false
|
|
156
527
|
},
|
|
157
528
|
"question_projection": {
|
|
158
529
|
"type": "object",
|
|
159
530
|
"description": "Embedded question of an answerable user-input request in the wait projection's pending_requests entries; wait is the only retrieval surface, so a question beyond the embed cap is marked truncated instead of paged.",
|
|
160
|
-
"required": [
|
|
531
|
+
"required": [
|
|
532
|
+
"text",
|
|
533
|
+
"truncated"
|
|
534
|
+
],
|
|
161
535
|
"properties": {
|
|
162
|
-
"text": {
|
|
163
|
-
|
|
536
|
+
"text": {
|
|
537
|
+
"type": "string"
|
|
538
|
+
},
|
|
539
|
+
"truncated": {
|
|
540
|
+
"type": "boolean"
|
|
541
|
+
}
|
|
164
542
|
},
|
|
165
543
|
"additionalProperties": false
|
|
166
544
|
},
|
|
167
545
|
"error_projection": {
|
|
168
546
|
"type": "object",
|
|
169
|
-
"required": [
|
|
547
|
+
"required": [
|
|
548
|
+
"error"
|
|
549
|
+
],
|
|
170
550
|
"properties": {
|
|
171
551
|
"error": {
|
|
172
552
|
"type": "object",
|
|
173
|
-
"required": [
|
|
553
|
+
"required": [
|
|
554
|
+
"code",
|
|
555
|
+
"message"
|
|
556
|
+
],
|
|
174
557
|
"properties": {
|
|
175
|
-
"code": {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
"
|
|
180
|
-
|
|
181
|
-
|
|
558
|
+
"code": {
|
|
559
|
+
"type": "string",
|
|
560
|
+
"minLength": 1
|
|
561
|
+
},
|
|
562
|
+
"message": {
|
|
563
|
+
"type": "string",
|
|
564
|
+
"minLength": 1
|
|
565
|
+
},
|
|
566
|
+
"component": {
|
|
567
|
+
"type": "string",
|
|
568
|
+
"minLength": 1
|
|
569
|
+
},
|
|
570
|
+
"operation": {
|
|
571
|
+
"type": "string",
|
|
572
|
+
"minLength": 1
|
|
573
|
+
},
|
|
574
|
+
"request_id": {
|
|
575
|
+
"type": "string",
|
|
576
|
+
"minLength": 1
|
|
577
|
+
},
|
|
578
|
+
"agent_id": {
|
|
579
|
+
"type": "integer",
|
|
580
|
+
"minimum": 10000000,
|
|
581
|
+
"maximum": 99999999
|
|
582
|
+
},
|
|
583
|
+
"prompt_count": {
|
|
584
|
+
"type": "integer",
|
|
585
|
+
"minimum": 0
|
|
586
|
+
}
|
|
182
587
|
},
|
|
183
588
|
"additionalProperties": false
|
|
184
589
|
}
|
|
@@ -189,16 +594,142 @@
|
|
|
189
594
|
"type": "object",
|
|
190
595
|
"additionalProperties": false,
|
|
191
596
|
"properties": {
|
|
192
|
-
"external_subagent_status": {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
597
|
+
"external_subagent_status": {
|
|
598
|
+
"input": [
|
|
599
|
+
"probe"
|
|
600
|
+
],
|
|
601
|
+
"output": [
|
|
602
|
+
"mcp_version",
|
|
603
|
+
"components",
|
|
604
|
+
"capabilities",
|
|
605
|
+
"subagents"
|
|
606
|
+
]
|
|
607
|
+
},
|
|
608
|
+
"external_subagent_spawn": {
|
|
609
|
+
"input": [
|
|
610
|
+
"profile",
|
|
611
|
+
"subagent",
|
|
612
|
+
"repository",
|
|
613
|
+
"permission_mode",
|
|
614
|
+
"prompt",
|
|
615
|
+
"model",
|
|
616
|
+
"effort",
|
|
617
|
+
"write_manifest"
|
|
618
|
+
],
|
|
619
|
+
"output": [
|
|
620
|
+
"agent_id",
|
|
621
|
+
"status",
|
|
622
|
+
"session_id",
|
|
623
|
+
"instruction"
|
|
624
|
+
],
|
|
625
|
+
"idempotent": false
|
|
626
|
+
},
|
|
627
|
+
"external_subagent_wait": {
|
|
628
|
+
"input": [
|
|
629
|
+
"agent_id",
|
|
630
|
+
"wait_time",
|
|
631
|
+
"message_id"
|
|
632
|
+
],
|
|
633
|
+
"output": [
|
|
634
|
+
"task",
|
|
635
|
+
"pending_requests",
|
|
636
|
+
"activity",
|
|
637
|
+
"result",
|
|
638
|
+
"timed_out",
|
|
639
|
+
"message_receipt"
|
|
640
|
+
],
|
|
641
|
+
"output_many": "<agent_id> keys, \"error\" only when an id was duplicated or unknown",
|
|
642
|
+
"agent_id_forms": "scalar or array of 1..=16",
|
|
643
|
+
"parallel_note": "spawn all subagents first, then wait once with the full id list"
|
|
644
|
+
},
|
|
645
|
+
"external_subagent_observe": {
|
|
646
|
+
"input": [
|
|
647
|
+
"agent_id"
|
|
648
|
+
],
|
|
649
|
+
"output": [
|
|
650
|
+
"tools",
|
|
651
|
+
"reasoning",
|
|
652
|
+
"coverage"
|
|
653
|
+
],
|
|
654
|
+
"idempotent": true
|
|
655
|
+
},
|
|
656
|
+
"external_subagent_list": {
|
|
657
|
+
"input": [
|
|
658
|
+
"subagent",
|
|
659
|
+
"repository",
|
|
660
|
+
"phase",
|
|
661
|
+
"outcome",
|
|
662
|
+
"cursor",
|
|
663
|
+
"limit"
|
|
664
|
+
],
|
|
665
|
+
"output": [
|
|
666
|
+
"tasks",
|
|
667
|
+
"next_cursor"
|
|
668
|
+
]
|
|
669
|
+
},
|
|
670
|
+
"external_subagent_send": {
|
|
671
|
+
"input": [
|
|
672
|
+
"agent_id",
|
|
673
|
+
"message_id",
|
|
674
|
+
"mode",
|
|
675
|
+
"content"
|
|
676
|
+
],
|
|
677
|
+
"required": [
|
|
678
|
+
"agent_id",
|
|
679
|
+
"mode",
|
|
680
|
+
"content"
|
|
681
|
+
],
|
|
682
|
+
"mode": [
|
|
683
|
+
"queue",
|
|
684
|
+
"steer"
|
|
685
|
+
],
|
|
686
|
+
"output": [
|
|
687
|
+
"message_id",
|
|
688
|
+
"disposition"
|
|
689
|
+
]
|
|
690
|
+
},
|
|
691
|
+
"external_subagent_respond": {
|
|
692
|
+
"input": [
|
|
693
|
+
"agent_id",
|
|
694
|
+
"request_id",
|
|
695
|
+
"decision",
|
|
696
|
+
"content"
|
|
697
|
+
],
|
|
698
|
+
"output": [
|
|
699
|
+
"disposition",
|
|
700
|
+
"requested_decision",
|
|
701
|
+
"effective_decision",
|
|
702
|
+
"policy_overrode",
|
|
703
|
+
"policy_reason_code"
|
|
704
|
+
]
|
|
705
|
+
},
|
|
706
|
+
"external_subagent_cancel": {
|
|
707
|
+
"input": [
|
|
708
|
+
"agent_id"
|
|
709
|
+
],
|
|
710
|
+
"output": [
|
|
711
|
+
"task"
|
|
712
|
+
]
|
|
713
|
+
},
|
|
714
|
+
"external_subagent_result": {
|
|
715
|
+
"input": [
|
|
716
|
+
"agent_id",
|
|
717
|
+
"offset",
|
|
718
|
+
"limit"
|
|
719
|
+
],
|
|
720
|
+
"output": [
|
|
721
|
+
"task",
|
|
722
|
+
"result"
|
|
723
|
+
]
|
|
724
|
+
},
|
|
725
|
+
"external_subagent_close": {
|
|
726
|
+
"input": [
|
|
727
|
+
"agent_id"
|
|
728
|
+
],
|
|
729
|
+
"output": [
|
|
730
|
+
"task"
|
|
731
|
+
]
|
|
732
|
+
}
|
|
202
733
|
}
|
|
203
734
|
}
|
|
204
735
|
},
|