open-multi-agent-kit 0.95.1 → 0.96.0

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.
Files changed (306) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +16 -1
  3. package/dist/approvals/approval-receipt-store.d.ts +18 -0
  4. package/dist/approvals/approval-receipt-store.d.ts.map +1 -0
  5. package/dist/approvals/approval-receipt-store.js +194 -0
  6. package/dist/approvals/approval-receipt-store.js.map +1 -0
  7. package/dist/approvals/approval-receipt.d.ts +43 -0
  8. package/dist/approvals/approval-receipt.d.ts.map +1 -0
  9. package/dist/approvals/approval-receipt.js +208 -0
  10. package/dist/approvals/approval-receipt.js.map +1 -0
  11. package/dist/approvals/approval-verifier.d.ts +17 -0
  12. package/dist/approvals/approval-verifier.d.ts.map +1 -0
  13. package/dist/approvals/approval-verifier.js +23 -0
  14. package/dist/approvals/approval-verifier.js.map +1 -0
  15. package/dist/approvals/plannotator-approval-bridge.d.ts +58 -0
  16. package/dist/approvals/plannotator-approval-bridge.d.ts.map +1 -0
  17. package/dist/approvals/plannotator-approval-bridge.js +169 -0
  18. package/dist/approvals/plannotator-approval-bridge.js.map +1 -0
  19. package/dist/cli/args.d.ts.map +1 -1
  20. package/dist/cli/args.js +2 -0
  21. package/dist/cli/args.js.map +1 -1
  22. package/dist/commands/package-doctor-cli.d.ts +13 -0
  23. package/dist/commands/package-doctor-cli.d.ts.map +1 -0
  24. package/dist/commands/package-doctor-cli.js +80 -0
  25. package/dist/commands/package-doctor-cli.js.map +1 -0
  26. package/dist/commands/router-feedback-cli.d.ts +11 -0
  27. package/dist/commands/router-feedback-cli.d.ts.map +1 -0
  28. package/dist/commands/router-feedback-cli.js +99 -0
  29. package/dist/commands/router-feedback-cli.js.map +1 -0
  30. package/dist/commands/stats-cli.d.ts +20 -0
  31. package/dist/commands/stats-cli.d.ts.map +1 -0
  32. package/dist/commands/stats-cli.js +99 -0
  33. package/dist/commands/stats-cli.js.map +1 -0
  34. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  35. package/dist/core/agent-session-runtime.js +4 -1
  36. package/dist/core/agent-session-runtime.js.map +1 -1
  37. package/dist/core/agent-session.d.ts +99 -31
  38. package/dist/core/agent-session.d.ts.map +1 -1
  39. package/dist/core/agent-session.js +624 -216
  40. package/dist/core/agent-session.js.map +1 -1
  41. package/dist/core/bash-executor.d.ts.map +1 -1
  42. package/dist/core/bash-executor.js +8 -2
  43. package/dist/core/bash-executor.js.map +1 -1
  44. package/dist/core/compaction/transaction.d.ts +9 -0
  45. package/dist/core/compaction/transaction.d.ts.map +1 -1
  46. package/dist/core/compaction/transaction.js +17 -2
  47. package/dist/core/compaction/transaction.js.map +1 -1
  48. package/dist/core/context-budget-governor-v2.d.ts +1 -1
  49. package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
  50. package/dist/core/context-budget-governor-v2.js +1 -1
  51. package/dist/core/context-budget-governor-v2.js.map +1 -1
  52. package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
  53. package/dist/core/context-budget-system-prompt.js +18 -2
  54. package/dist/core/context-budget-system-prompt.js.map +1 -1
  55. package/dist/core/context-budget-v2-cache-disk.d.ts +109 -0
  56. package/dist/core/context-budget-v2-cache-disk.d.ts.map +1 -0
  57. package/dist/core/context-budget-v2-cache-disk.js +343 -0
  58. package/dist/core/context-budget-v2-cache-disk.js.map +1 -0
  59. package/dist/core/context-budget-v2-cache-keys.d.ts +22 -0
  60. package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -1
  61. package/dist/core/context-budget-v2-cache-keys.js +4 -4
  62. package/dist/core/context-budget-v2-cache-keys.js.map +1 -1
  63. package/dist/core/context-budget-v2-cache.d.ts +1 -0
  64. package/dist/core/context-budget-v2-cache.d.ts.map +1 -1
  65. package/dist/core/context-budget-v2-cache.js +1 -0
  66. package/dist/core/context-budget-v2-cache.js.map +1 -1
  67. package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
  68. package/dist/core/context-budget-v2-planner.js +17 -14
  69. package/dist/core/context-budget-v2-planner.js.map +1 -1
  70. package/dist/core/context-budget-v2-types.d.ts +1 -0
  71. package/dist/core/context-budget-v2-types.d.ts.map +1 -1
  72. package/dist/core/context-budget-v2-types.js.map +1 -1
  73. package/dist/core/extensions/loader.d.ts.map +1 -1
  74. package/dist/core/extensions/loader.js +45 -22
  75. package/dist/core/extensions/loader.js.map +1 -1
  76. package/dist/core/extensions/types.d.ts +4 -0
  77. package/dist/core/extensions/types.d.ts.map +1 -1
  78. package/dist/core/extensions/types.js.map +1 -1
  79. package/dist/core/mcp/client.d.ts +105 -0
  80. package/dist/core/mcp/client.d.ts.map +1 -0
  81. package/dist/core/mcp/client.js +198 -0
  82. package/dist/core/mcp/client.js.map +1 -0
  83. package/dist/core/mcp/config.d.ts +23 -0
  84. package/dist/core/mcp/config.d.ts.map +1 -0
  85. package/dist/core/mcp/config.js +89 -0
  86. package/dist/core/mcp/config.js.map +1 -0
  87. package/dist/core/mcp/index.d.ts +15 -0
  88. package/dist/core/mcp/index.d.ts.map +1 -0
  89. package/dist/core/mcp/index.js +15 -0
  90. package/dist/core/mcp/index.js.map +1 -0
  91. package/dist/core/mcp/manager.d.ts +84 -0
  92. package/dist/core/mcp/manager.d.ts.map +1 -0
  93. package/dist/core/mcp/manager.js +173 -0
  94. package/dist/core/mcp/manager.js.map +1 -0
  95. package/dist/core/mcp/protocol.d.ts +59 -0
  96. package/dist/core/mcp/protocol.d.ts.map +1 -0
  97. package/dist/core/mcp/protocol.js +103 -0
  98. package/dist/core/mcp/protocol.js.map +1 -0
  99. package/dist/core/mcp/stdio-transport.d.ts +63 -0
  100. package/dist/core/mcp/stdio-transport.d.ts.map +1 -0
  101. package/dist/core/mcp/stdio-transport.js +132 -0
  102. package/dist/core/mcp/stdio-transport.js.map +1 -0
  103. package/dist/core/mcp/tools.d.ts +47 -0
  104. package/dist/core/mcp/tools.d.ts.map +1 -0
  105. package/dist/core/mcp/tools.js +102 -0
  106. package/dist/core/mcp/tools.js.map +1 -0
  107. package/dist/core/package-archive.d.ts +3 -0
  108. package/dist/core/package-archive.d.ts.map +1 -0
  109. package/dist/core/package-archive.js +161 -0
  110. package/dist/core/package-archive.js.map +1 -0
  111. package/dist/core/package-doctor-source-scan.d.ts +13 -0
  112. package/dist/core/package-doctor-source-scan.d.ts.map +1 -0
  113. package/dist/core/package-doctor-source-scan.js +124 -0
  114. package/dist/core/package-doctor-source-scan.js.map +1 -0
  115. package/dist/core/package-doctor.d.ts +41 -0
  116. package/dist/core/package-doctor.d.ts.map +1 -0
  117. package/dist/core/package-doctor.js +145 -0
  118. package/dist/core/package-doctor.js.map +1 -0
  119. package/dist/core/package-manager.d.ts +10 -1
  120. package/dist/core/package-manager.d.ts.map +1 -1
  121. package/dist/core/package-manager.js +175 -42
  122. package/dist/core/package-manager.js.map +1 -1
  123. package/dist/core/package-manifest.d.ts +26 -0
  124. package/dist/core/package-manifest.d.ts.map +1 -0
  125. package/dist/core/package-manifest.js +85 -0
  126. package/dist/core/package-manifest.js.map +1 -0
  127. package/dist/core/pi-compat.d.ts +5 -0
  128. package/dist/core/pi-compat.d.ts.map +1 -0
  129. package/dist/core/pi-compat.js +18 -0
  130. package/dist/core/pi-compat.js.map +1 -0
  131. package/dist/core/provider-resilience.d.ts +7 -0
  132. package/dist/core/provider-resilience.d.ts.map +1 -1
  133. package/dist/core/provider-resilience.js +11 -0
  134. package/dist/core/provider-resilience.js.map +1 -1
  135. package/dist/core/reasoning-router-bias.d.ts +10 -14
  136. package/dist/core/reasoning-router-bias.d.ts.map +1 -1
  137. package/dist/core/reasoning-router-bias.js +22 -15
  138. package/dist/core/reasoning-router-bias.js.map +1 -1
  139. package/dist/core/reasoning-router-v4.d.ts +9 -1
  140. package/dist/core/reasoning-router-v4.d.ts.map +1 -1
  141. package/dist/core/reasoning-router-v4.js +20 -5
  142. package/dist/core/reasoning-router-v4.js.map +1 -1
  143. package/dist/core/redaction.d.ts +2 -5
  144. package/dist/core/redaction.d.ts.map +1 -1
  145. package/dist/core/redaction.js +14 -1
  146. package/dist/core/redaction.js.map +1 -1
  147. package/dist/core/repository-learning-scope.d.ts +10 -0
  148. package/dist/core/repository-learning-scope.d.ts.map +1 -0
  149. package/dist/core/repository-learning-scope.js +42 -0
  150. package/dist/core/repository-learning-scope.js.map +1 -0
  151. package/dist/core/resource-loader.d.ts.map +1 -1
  152. package/dist/core/resource-loader.js +16 -1
  153. package/dist/core/resource-loader.js.map +1 -1
  154. package/dist/core/router-feedback-collector.d.ts +2 -1
  155. package/dist/core/router-feedback-collector.d.ts.map +1 -1
  156. package/dist/core/router-feedback-collector.js +2 -2
  157. package/dist/core/router-feedback-collector.js.map +1 -1
  158. package/dist/core/runtime-provenance.d.ts +54 -0
  159. package/dist/core/runtime-provenance.d.ts.map +1 -0
  160. package/dist/core/runtime-provenance.js +115 -0
  161. package/dist/core/runtime-provenance.js.map +1 -0
  162. package/dist/core/sandbox/backend.d.ts.map +1 -1
  163. package/dist/core/sandbox/backend.js +39 -21
  164. package/dist/core/sandbox/backend.js.map +1 -1
  165. package/dist/core/sandbox/default-policy.d.ts +4 -5
  166. package/dist/core/sandbox/default-policy.d.ts.map +1 -1
  167. package/dist/core/sandbox/default-policy.js +9 -11
  168. package/dist/core/sandbox/default-policy.js.map +1 -1
  169. package/dist/core/session-bash-runtime.d.ts +4 -4
  170. package/dist/core/session-bash-runtime.d.ts.map +1 -1
  171. package/dist/core/session-bash-runtime.js +6 -5
  172. package/dist/core/session-bash-runtime.js.map +1 -1
  173. package/dist/core/session-compaction-service.d.ts.map +1 -1
  174. package/dist/core/session-compaction-service.js +7 -7
  175. package/dist/core/session-compaction-service.js.map +1 -1
  176. package/dist/core/session-manager.d.ts +4 -1
  177. package/dist/core/session-manager.d.ts.map +1 -1
  178. package/dist/core/session-manager.js +47 -7
  179. package/dist/core/session-manager.js.map +1 -1
  180. package/dist/core/settings-manager.d.ts +7 -4
  181. package/dist/core/settings-manager.d.ts.map +1 -1
  182. package/dist/core/settings-manager.js +11 -3
  183. package/dist/core/settings-manager.js.map +1 -1
  184. package/dist/core/subagent-orchestration.d.ts.map +1 -1
  185. package/dist/core/subagent-orchestration.js +4 -2
  186. package/dist/core/subagent-orchestration.js.map +1 -1
  187. package/dist/core/system-prompt.d.ts +9 -1
  188. package/dist/core/system-prompt.d.ts.map +1 -1
  189. package/dist/core/system-prompt.js +10 -4
  190. package/dist/core/system-prompt.js.map +1 -1
  191. package/dist/core/tools/bash.d.ts +2 -2
  192. package/dist/core/tools/bash.d.ts.map +1 -1
  193. package/dist/core/tools/bash.js +2 -1
  194. package/dist/core/tools/bash.js.map +1 -1
  195. package/dist/core/tools/diagnostics.d.ts.map +1 -1
  196. package/dist/core/tools/diagnostics.js +8 -2
  197. package/dist/core/tools/diagnostics.js.map +1 -1
  198. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  199. package/dist/core/tools/tool-definition-wrapper.js +15 -0
  200. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  201. package/dist/core/turn-metrics.d.ts +135 -0
  202. package/dist/core/turn-metrics.d.ts.map +1 -0
  203. package/dist/core/turn-metrics.js +261 -0
  204. package/dist/core/turn-metrics.js.map +1 -0
  205. package/dist/core/verified-bash-runtime.d.ts.map +1 -1
  206. package/dist/core/verified-bash-runtime.js +10 -4
  207. package/dist/core/verified-bash-runtime.js.map +1 -1
  208. package/dist/guardrails/evidence-protocol.d.ts +10 -0
  209. package/dist/guardrails/evidence-protocol.d.ts.map +1 -0
  210. package/dist/guardrails/evidence-protocol.js +34 -0
  211. package/dist/guardrails/evidence-protocol.js.map +1 -0
  212. package/dist/guardrails/evidence-system.d.ts +3 -1
  213. package/dist/guardrails/evidence-system.d.ts.map +1 -1
  214. package/dist/guardrails/evidence-system.js +22 -14
  215. package/dist/guardrails/evidence-system.js.map +1 -1
  216. package/dist/guardrails/replay-ledger-lock-owner.d.ts +7 -0
  217. package/dist/guardrails/replay-ledger-lock-owner.d.ts.map +1 -1
  218. package/dist/guardrails/replay-ledger-lock-owner.js +42 -1
  219. package/dist/guardrails/replay-ledger-lock-owner.js.map +1 -1
  220. package/dist/guardrails/replay-payload-hash.d.ts +6 -0
  221. package/dist/guardrails/replay-payload-hash.d.ts.map +1 -0
  222. package/dist/guardrails/replay-payload-hash.js +24 -0
  223. package/dist/guardrails/replay-payload-hash.js.map +1 -0
  224. package/dist/index.d.ts +8 -2
  225. package/dist/index.d.ts.map +1 -1
  226. package/dist/index.js +7 -1
  227. package/dist/index.js.map +1 -1
  228. package/dist/main.d.ts.map +1 -1
  229. package/dist/main.js +18 -0
  230. package/dist/main.js.map +1 -1
  231. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
  232. package/dist/modes/interactive/components/control-panel-layout.js +2 -2
  233. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
  234. package/dist/modes/interactive/components/footer.d.ts +3 -0
  235. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  236. package/dist/modes/interactive/components/footer.js +40 -12
  237. package/dist/modes/interactive/components/footer.js.map +1 -1
  238. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  239. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  240. package/dist/modes/interactive/components/settings-selector.js +10 -0
  241. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  242. package/dist/modes/interactive/components/status-sidebar.d.ts +14 -2
  243. package/dist/modes/interactive/components/status-sidebar.d.ts.map +1 -1
  244. package/dist/modes/interactive/components/status-sidebar.js +106 -19
  245. package/dist/modes/interactive/components/status-sidebar.js.map +1 -1
  246. package/dist/modes/interactive/interactive-mode.d.ts +10 -1
  247. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  248. package/dist/modes/interactive/interactive-mode.js +104 -17
  249. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  250. package/dist/modes/interactive/theme/dark.json +1 -1
  251. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  252. package/dist/modes/interactive/theme/theme.js +1 -0
  253. package/dist/modes/interactive/theme/theme.js.map +1 -1
  254. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  255. package/dist/modes/rpc/rpc-mode.js +1 -1
  256. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  257. package/dist/types/evidence.d.ts +11 -3
  258. package/dist/types/evidence.d.ts.map +1 -1
  259. package/dist/types/evidence.js.map +1 -1
  260. package/docs/book-to-skill.md +79 -0
  261. package/docs/compaction.md +35 -3
  262. package/docs/containerization.md +14 -2
  263. package/docs/docs.json +16 -0
  264. package/docs/environment-variables.md +1 -1
  265. package/docs/extensions.md +75 -16
  266. package/docs/index.md +3 -0
  267. package/docs/mcp.md +97 -0
  268. package/docs/metrics.md +87 -0
  269. package/docs/models.md +12 -0
  270. package/docs/packages.md +25 -4
  271. package/docs/provider-resilience.md +37 -56
  272. package/docs/providers.md +5 -1
  273. package/docs/run-protocol.md +72 -0
  274. package/docs/sdk.md +40 -6
  275. package/docs/sessions.md +6 -0
  276. package/docs/settings.md +10 -7
  277. package/docs/skills.md +9 -1
  278. package/docs/usage.md +14 -4
  279. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  280. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  281. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  282. package/examples/extensions/gondolin/package-lock.json +2 -2
  283. package/examples/extensions/gondolin/package.json +1 -1
  284. package/examples/extensions/plannotator-approval-bridge.ts +83 -0
  285. package/examples/extensions/sandbox/package-lock.json +2 -2
  286. package/examples/extensions/sandbox/package.json +1 -1
  287. package/examples/extensions/subagent/README.md +21 -11
  288. package/examples/extensions/subagent/adaptive-agent-runtime.ts +9 -3
  289. package/examples/extensions/subagent/agents/planner.md +0 -2
  290. package/examples/extensions/subagent/agents/reviewer.md +0 -2
  291. package/examples/extensions/subagent/agents/scout.md +0 -2
  292. package/examples/extensions/subagent/agents/worker.md +0 -1
  293. package/examples/extensions/subagent/agents.test.ts +9 -0
  294. package/examples/extensions/subagent/agents.ts +11 -4
  295. package/examples/extensions/subagent/deadline-budget.test.ts +32 -0
  296. package/examples/extensions/subagent/deadline-budget.ts +25 -1
  297. package/examples/extensions/subagent/fixtures/fake-omk-json.mjs +10 -0
  298. package/examples/extensions/subagent/index.ts +234 -55
  299. package/examples/extensions/subagent/subagent-execution-policy.test.ts +27 -0
  300. package/examples/extensions/subagent/subagent-extension-smoke.test.ts +167 -2
  301. package/examples/extensions/subagent/workflow-graph.test.ts +80 -0
  302. package/examples/extensions/subagent/workflow-graph.ts +89 -0
  303. package/examples/extensions/with-deps/package-lock.json +2 -2
  304. package/examples/extensions/with-deps/package.json +1 -1
  305. package/npm-shrinkwrap.json +275 -439
  306. package/package.json +11 -8
@@ -5,8 +5,11 @@ Delegate tasks to specialized subagents with isolated context windows.
5
5
  ## Features
6
6
 
7
7
  - **Isolated context**: Each subagent runs in a separate `omk` process
8
+ - **Session model inheritance**: Agents without `model` use the parent session's currently selected model; an explicit `model` pins the child
8
9
  - **Streaming output**: See tool calls and progress as they happen
9
10
  - **Parallel streaming**: All parallel tasks stream updates simultaneously
11
+ - **Validated task graphs**: Dependency DAGs fail closed on duplicate/unknown/cyclic nodes and execute in deterministic parallel waves
12
+ - **Explicit handoffs**: Graph nodes receive only declared dependency output and only when their task includes `{dependencies}`
10
13
  - **Markdown rendering**: Final output rendered with proper formatting (expanded view)
11
14
  - **Usage tracking**: Shows turns, tokens, cost, and context usage per agent
12
15
  - **Abort support**: Ctrl+C propagates to the entire detached subagent process tree
@@ -14,6 +17,7 @@ Delegate tasks to specialized subagents with isolated context windows.
14
17
  - **Checkpoint resume**: A cutoff resumes only the unfinished shard with bounded prior evidence
15
18
  - **Cutoff learning**: Completion/cutoff history is persisted per provider and model under the agent state directory
16
19
  - **Bounded cost**: At most 3 semantic shards and 1 resume across the whole logical task by default
20
+ - **Ultra execution**: Removes task-count, concurrency, internal deadline, and outer tool-timeout caps; Ctrl+C cancellation still propagates
17
21
 
18
22
  ## Structure
19
23
 
@@ -49,7 +53,7 @@ mkdir -p ~/.omk/agent/extensions/subagent
49
53
  src="$(pwd)/packages/coding-agent/examples/extensions/subagent"
50
54
  for f in index.ts agents.ts agent-capability-router.ts capabilities.ts domain-profiles.ts \
51
55
  adaptive-agent-runtime.ts adaptive-result.ts checkpoint-runtime.ts deadline-budget.ts \
52
- deadline-profile-store.ts managed-process.ts subagent-runtime-types.ts; do
56
+ deadline-profile-store.ts managed-process.ts subagent-runtime-types.ts workflow-graph.ts; do
53
57
  ln -sf "$src/$f" ~/.omk/agent/extensions/subagent/$f
54
58
  done
55
59
 
@@ -107,15 +111,18 @@ Use a chain: first have scout find the read tool, then have planner suggest impr
107
111
  | Mode | Parameter | Description |
108
112
  |------|-----------|-------------|
109
113
  | Single | `{ agent, task }` | One logical task; the runtime may split it into bounded semantic shards |
110
- | Parallel | `{ tasks: [...] }` | Multiple logical tasks run concurrently (max 8, 4 concurrent) |
114
+ | Parallel | `{ tasks: [...] }` | Multiple logical tasks; non-Ultra allows max 8 and 4 concurrent, while Ultra starts all requested tasks concurrently |
111
115
  | Chain | `{ chain: [...] }` | Sequential with `{previous}` placeholder and a fair deadline share per remaining step |
116
+ | Graph | `{ graph: [{ id, agent, task, dependsOn? }] }` | Validated dependency DAG; ready nodes run in parallel waves, and any failed wave blocks downstream nodes |
117
+
118
+ Graph nodes opt in to dependency output by placing `{dependencies}` in `task`. The runtime injects only outputs named in that node's `dependsOn`; without the placeholder, no prior output is appended. Each dependency handoff is capped at 16 KiB. This keeps large or unrelated context from leaking across nodes.
112
119
 
113
120
  Optional execution controls:
114
121
 
115
122
  | Parameter | Default | Description |
116
123
  |-----------|---------|-------------|
117
- | `executionBudgetMs` | `840000` | Internal hard budget, leaving 60 seconds before a configured 900000 ms tool timeout |
118
- | `maxResumeAttempts` | `1` | Retries only the active unfinished shard; accepted range is 0-2 |
124
+ | `executionBudgetMs` | `840000` | Non-Ultra internal hard budget; when explicitly supplied it also bounds Ultra execution, otherwise Ultra is unbounded |
125
+ | `maxResumeAttempts` | `1` | Retries only the active unfinished shard; accepted range is 0-2 and ignored by unbounded Ultra execution |
119
126
 
120
127
  ## Output Display
121
128
 
@@ -152,12 +159,13 @@ Agents are markdown files with YAML frontmatter:
152
159
  name: my-agent
153
160
  description: What this agent does
154
161
  tools: read, grep, find, ls
155
- model: claude-haiku-4-5
156
162
  ---
157
163
 
158
164
  System prompt for the agent goes here.
159
165
  ```
160
166
 
167
+ `model` is optional. Omit it to inherit the model currently selected in the parent session; set it only when the agent must be pinned to a specific model.
168
+
161
169
  **Locations:**
162
170
  - `~/.omk/agent/agents/*.md` - User-level (always loaded)
163
171
  - `.omk/agents/*.md` - Project-level (only with `agentScope: "project"` or `"both"`)
@@ -168,10 +176,10 @@ Project agents override user agents with the same name when `agentScope: "both"`
168
176
 
169
177
  | Agent | Purpose | Model | Tools |
170
178
  |-------|---------|-------|-------|
171
- | `scout` | Fast codebase recon | Haiku | read, grep, find, ls, bash |
172
- | `planner` | Implementation plans | Sonnet | read, grep, find, ls |
173
- | `reviewer` | Code review | Sonnet | read, grep, find, ls, bash |
174
- | `worker` | General-purpose | Sonnet | (all default) |
179
+ | `scout` | Fast codebase recon | Parent session | read, grep, find, ls, bash |
180
+ | `planner` | Implementation plans | Parent session | read, grep, find, ls |
181
+ | `reviewer` | Code review | Parent session | read, grep, find, ls, bash |
182
+ | `worker` | General-purpose | Parent session | (all default) |
175
183
 
176
184
  ## Workflow Prompts
177
185
 
@@ -186,8 +194,10 @@ Project agents override user agents with the same name when `agentScope: "both"`
186
194
  - **Exit code != 0**: Tool returns error with stderr/output
187
195
  - **stopReason "error"**: LLM error propagated with error message
188
196
  - **stopReason "aborted"**: User abort (Ctrl+C) terminates and reaps the subprocess tree
189
- - **stopReason "deadline"**: Internal cutoff returns elapsed/deadline/checkpoint/resume metadata instead of reaching the outer tool timeout
197
+ - **stopReason "deadline"**: Outside Ultra, an internal cutoff returns elapsed/deadline/checkpoint/resume metadata instead of reaching the outer tool timeout
198
+ - **Ultra**: No scheduler or attempt deadline is armed; provider, network, OS, and explicit caller cancellation still apply
190
199
  - **Chain mode**: Stops at first failing step, reports which step failed, and preserves completed earlier steps
200
+ - **Graph mode**: Rejects malformed graphs before spawn; a failed wave prevents all downstream starts and preserves completed node evidence
191
201
  - **Duplicate prevention**: A cutoff with no new checkpoint or streamed evidence is not retried
192
202
 
193
203
  ## Limitations
@@ -195,6 +205,6 @@ Project agents override user agents with the same name when `agentScope: "both"`
195
205
  - Output truncated to last 10 items in collapsed view (expand to see all)
196
206
  - Parallel model-visible output is capped at 50 KB per task; full results remain in tool details
197
207
  - Agents discovered fresh on each invocation (allows editing mid-session)
198
- - Parallel mode limited to 8 tasks, 4 concurrent
208
+ - Outside Ultra, parallel mode is limited to 8 tasks and 4 concurrent processes; Ultra has no extension-imposed count or concurrency cap and can consume substantial host/provider resources
199
209
  - Automatic semantic pre-sharding requires an explicit numbered/checklist action list; indivisible prose is checkpointed and resumed as one shard
200
210
  - Checkpoints are best-effort child artifacts plus runtime-captured stream evidence; workspace side effects remain the source of truth after a cutoff
@@ -73,8 +73,8 @@ export async function runAdaptiveAgent(options: RunAdaptiveAgentOptions): Promis
73
73
  const startedAtMs = Date.now();
74
74
  let identity = parseProviderModel(options.model);
75
75
  let profile = await options.profileStore.profileFor(identity.provider, identity.model);
76
- const initialCutoff = cutoffFor(profile, options, remainingExecutionMs(options.budget));
77
76
  const demand = estimateTaskDemand(options.logicalTask);
77
+ const initialCutoff = cutoffFor(profile, options, remainingExecutionMs(options.budget), demand.predictedMs);
78
78
  const shards = planTaskShards(options.logicalTask, demand, {
79
79
  attemptCutoffMs: initialCutoff,
80
80
  maxTaskShards: options.budget.maxTaskShards,
@@ -109,7 +109,7 @@ export async function runAdaptiveAgent(options: RunAdaptiveAgentOptions): Promis
109
109
  let checkpoint: typeof lastCheckpoint;
110
110
  while (true) {
111
111
  const pendingShards = shards.length - completedShardIds.length;
112
- const recommended = cutoffFor(profile, options, remainingExecutionMs(taskBudget));
112
+ const recommended = cutoffFor(profile, options, remainingExecutionMs(taskBudget), demand.predictedMs);
113
113
  const allocation = allocateAttemptBudget({
114
114
  budget: taskBudget,
115
115
  pendingSequentialTasks: 1,
@@ -231,10 +231,16 @@ export async function runAdaptiveAgent(options: RunAdaptiveAgentOptions): Promis
231
231
  return aggregate;
232
232
  }
233
233
 
234
- function cutoffFor(profile: DeadlineProfile | undefined, options: RunAdaptiveAgentOptions, maximumMs: number): number {
234
+ function cutoffFor(
235
+ profile: DeadlineProfile | undefined,
236
+ options: RunAdaptiveAgentOptions,
237
+ maximumMs: number,
238
+ predictedMs: number,
239
+ ): number {
235
240
  return recommendAttemptCutoff(profile, {
236
241
  fallbackMs: options.policy.fallbackAttemptMs,
237
242
  minimumMs: Math.min(options.policy.minimumAttemptMs, maximumMs),
238
243
  maximumMs: Math.max(1, maximumMs),
244
+ predictedMs,
239
245
  });
240
246
  }
@@ -1,8 +1,6 @@
1
1
  ---
2
2
  name: planner
3
3
  description: Creates implementation plans from context and requirements
4
- tools: read, grep, find, ls
5
- model: claude-sonnet-4-5
6
4
  ---
7
5
 
8
6
  You are a planning specialist. You receive context (from a scout) and requirements, then produce a clear implementation plan.
@@ -1,8 +1,6 @@
1
1
  ---
2
2
  name: reviewer
3
3
  description: Code review specialist for quality and security analysis
4
- tools: read, grep, find, ls, bash
5
- model: claude-sonnet-4-5
6
4
  ---
7
5
 
8
6
  You are a senior code reviewer. Analyze code for quality, security, and maintainability.
@@ -1,8 +1,6 @@
1
1
  ---
2
2
  name: scout
3
3
  description: Fast codebase recon that returns compressed context for handoff to other agents
4
- tools: read, grep, find, ls, bash
5
- model: claude-haiku-4-5
6
4
  ---
7
5
 
8
6
  You are a scout. Quickly investigate a codebase and return structured findings that another agent can use without re-reading everything.
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: worker
3
3
  description: General-purpose subagent with full capabilities, isolated context
4
- model: claude-sonnet-4-5
5
4
  ---
6
5
 
7
6
  You are a worker agent with full capabilities. You operate in an isolated context window to handle delegated tasks without polluting the main conversation.
@@ -84,3 +84,12 @@ describe("parseEnforceFlag coercion (via discoverAgents)", () => {
84
84
  }
85
85
  });
86
86
  });
87
+
88
+ describe("bundled agent model delegation", () => {
89
+ it("omits model pins so bundled agents inherit the parent session model", () => {
90
+ for (const name of ["scout", "planner", "reviewer", "worker"]) {
91
+ const source = fs.readFileSync(path.join(import.meta.dirname, "agents", `${name}.md`), "utf8");
92
+ expect(source, `${name} must not pin a model`).not.toMatch(/^model:/m);
93
+ }
94
+ });
95
+ });
@@ -78,10 +78,17 @@ function loadAgentsFromDir(dir: string, source: "user" | "project"): AgentConfig
78
78
  continue;
79
79
  }
80
80
 
81
- const tools = frontmatter.tools
82
- ?.split(",")
83
- .map((t: string) => t.trim())
84
- .filter(Boolean);
81
+ const rawTools = frontmatter.tools as unknown;
82
+ // ponytail: frontmatter `tools:` is either a CSV string or a YAML map ({read: true}) — accept both
83
+ const tools =
84
+ typeof rawTools === "string"
85
+ ? rawTools
86
+ .split(",")
87
+ .map((t: string) => t.trim())
88
+ .filter(Boolean)
89
+ : rawTools && typeof rawTools === "object"
90
+ ? Object.keys(rawTools)
91
+ : undefined;
85
92
 
86
93
  const capabilities = parseCapabilities(frontmatter);
87
94
  const enforceCapabilities = parseEnforceFlag(frontmatter.enforceCapabilities);
@@ -132,4 +132,36 @@ describe("provider/model deadline learning", () => {
132
132
  expect(recommendAttemptCutoff(codex, { fallbackMs: 600_000, minimumMs: 1, maximumMs: 800_000 })).toBe(180_000);
133
133
  expect(recommendAttemptCutoff(anthropic, { fallbackMs: 600_000, minimumMs: 1, maximumMs: 800_000 })).toBe(60_000);
134
134
  });
135
+
136
+ it("does not let a short probe collapse a larger task to the minimum cutoff", () => {
137
+ const db = updateDeadlineProfiles(undefined, {
138
+ provider: "openai-codex",
139
+ model: "gpt-5.6",
140
+ outcome: "completed",
141
+ elapsedMs: 10_000,
142
+ estimatedTokens: 10,
143
+ workUnits: 1,
144
+ });
145
+ const profile = getDeadlineProfile(db, "openai-codex", "gpt-5.6");
146
+ const demand = estimateTaskDemand(
147
+ [
148
+ "Review the release candidate:",
149
+ "1. Inspect the manifest.",
150
+ "2. Verify fixture hashes.",
151
+ "3. Run formatter checks.",
152
+ "4. Run parity tests.",
153
+ "5. Review production diffs.",
154
+ "6. Report the verdict.",
155
+ ].join("\n"),
156
+ );
157
+
158
+ expect(
159
+ recommendAttemptCutoff(profile, {
160
+ fallbackMs: 600_000,
161
+ minimumMs: 30_000,
162
+ maximumMs: 800_000,
163
+ predictedMs: demand.predictedMs,
164
+ }),
165
+ ).toBe(demand.predictedMs);
166
+ });
135
167
  });
@@ -1,5 +1,27 @@
1
1
  export type DeadlineSampleOutcome = "completed" | "cutoff" | "aborted" | "failed";
2
2
 
3
+ export interface SubagentExecutionPolicy {
4
+ readonly unbounded: boolean;
5
+ readonly maxParallelTasks: number | undefined;
6
+ readonly concurrency: number;
7
+ }
8
+
9
+ export function resolveSubagentExecutionPolicy(
10
+ thinkingLevel: string | undefined,
11
+ parallelTaskCount: number,
12
+ executionBudgetExplicit = false,
13
+ ): SubagentExecutionPolicy {
14
+ const taskCount = Math.max(1, Math.floor(parallelTaskCount));
15
+ if (thinkingLevel === "ultra") {
16
+ return { unbounded: !executionBudgetExplicit, maxParallelTasks: undefined, concurrency: taskCount };
17
+ }
18
+ return { unbounded: false, maxParallelTasks: 8, concurrency: Math.min(4, taskCount) };
19
+ }
20
+
21
+ export function exceedsParallelTaskLimit(policy: SubagentExecutionPolicy, taskCount: number): boolean {
22
+ return policy.maxParallelTasks !== undefined && taskCount > policy.maxParallelTasks;
23
+ }
24
+
3
25
  export interface TaskDemand {
4
26
  readonly estimatedTokens: number;
5
27
  readonly workUnits: number;
@@ -78,6 +100,7 @@ interface RecommendCutoffOptions {
78
100
  readonly fallbackMs: number;
79
101
  readonly minimumMs: number;
80
102
  readonly maximumMs: number;
103
+ readonly predictedMs?: number;
81
104
  }
82
105
 
83
106
  const EXPLICIT_ACTION_LINE = /^\s*(?:\d+[.)]|\[[ xX]\])\s+(.+?)\s*$/;
@@ -216,7 +239,8 @@ export function recommendAttemptCutoff(profile: DeadlineProfile | undefined, opt
216
239
  const candidates = [options.fallbackMs];
217
240
  if (completed !== undefined) candidates.push(Math.round(completed * 1.5));
218
241
  if (cutoff !== undefined) candidates.push(Math.round(cutoff * 0.75));
219
- return Math.max(options.minimumMs, Math.min(options.maximumMs, ...candidates));
242
+ const recommendedMs = Math.max(options.predictedMs ?? 0, Math.min(...candidates));
243
+ return Math.max(options.minimumMs, Math.min(options.maximumMs, recommendedMs));
220
244
  }
221
245
 
222
246
  function extractActionUnit(line: string): string | undefined {
@@ -1,5 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ const expectedModel = process.env.OMK_EXPECTED_MODEL;
4
+ if (expectedModel) {
5
+ const modelIndex = process.argv.indexOf("--model");
6
+ const actualModel = modelIndex === -1 ? undefined : process.argv[modelIndex + 1];
7
+ if (actualModel !== expectedModel) {
8
+ process.stderr.write(`expected --model ${expectedModel}, received ${actualModel ?? "none"}\n`);
9
+ process.exit(2);
10
+ }
11
+ }
12
+
3
13
  process.stdout.write(
4
14
  `${JSON.stringify({
5
15
  type: "message_end",