@humain/terminal 0.1.0 → 0.2.1

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 (220) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/bundle/chunks/{anthropic-messages-XULXUBIG.js → anthropic-messages-QFCEKGI3.js} +1 -1
  3. package/dist/bundle/chunks/{azure-openai-responses-JEG2XOYC.js → azure-openai-responses-G4ZMHV37.js} +1 -1
  4. package/dist/bundle/chunks/chunk-7T6XCLJF.js +22 -0
  5. package/dist/bundle/chunks/chunk-D6HHRSB5.js +103 -0
  6. package/dist/bundle/chunks/chunk-EY4DWHQU.js +2 -0
  7. package/dist/bundle/chunks/{chunk-RM336IEI.js → chunk-I47ZWR55.js} +486 -509
  8. package/dist/bundle/chunks/{chunk-JUPSJTFQ.js → chunk-K4JAZYQH.js} +1 -1
  9. package/dist/bundle/chunks/{chunk-HPPQHK3J.js → chunk-KKIB2TVR.js} +1 -1
  10. package/dist/bundle/chunks/chunk-LI2YVPWP.js +2 -0
  11. package/dist/bundle/chunks/{chunk-BZQ53VGE.js → chunk-XSR434CO.js} +1 -1
  12. package/dist/bundle/chunks/compat-QCV26HNS.js +2 -0
  13. package/dist/bundle/chunks/dist-PRPIUY3U.js +2 -0
  14. package/dist/bundle/chunks/esm-E7UVEYTO.js +4 -0
  15. package/dist/bundle/chunks/{extract-TRW5FBY6.js → extract-CTIFQZDJ.js} +15 -14
  16. package/dist/bundle/chunks/{google-generative-ai-OX6VSCA6.js → google-generative-ai-RSUU4MWO.js} +1 -1
  17. package/dist/bundle/chunks/{google-vertex-GW76GSS2.js → google-vertex-CKQPOITO.js} +1 -1
  18. package/dist/bundle/chunks/host-WP3MVKS2.js +2 -0
  19. package/dist/bundle/chunks/{node-KOIP55YZ.js → node-NF43OPII.js} +1 -1
  20. package/dist/bundle/chunks/{node-XY3CBY3C.js → node-UMFM7CDZ.js} +1 -1
  21. package/dist/bundle/chunks/{openai-codex-responses-NPLWP6ZC.js → openai-codex-responses-S34V5ZSD.js} +1 -1
  22. package/dist/bundle/chunks/{openai-completions-OT2GTJKC.js → openai-completions-T2IGVUEI.js} +1 -1
  23. package/dist/bundle/chunks/{openai-responses-5A6CR7GI.js → openai-responses-GYZODCT3.js} +1 -1
  24. package/dist/bundle/chunks/readability-LAGF34IB.js +3 -0
  25. package/dist/bundle/chunks/turndown.cjs-HRMZVRUL.js +2 -0
  26. package/dist/bundle/cli.js +1 -1
  27. package/dist/bundle/index.js +1 -1
  28. package/dist/bundle/rpc-entry.js +1 -1
  29. package/dist/cli.js +1 -5
  30. package/dist/core/agent-session.js +2 -2
  31. package/dist/core/agent-session.js.map +1 -1
  32. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  33. package/dist/core/tools/file-mutation-queue.js +21 -8
  34. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  35. package/dist/core/tools/subagent-env.d.ts +18 -0
  36. package/dist/core/tools/subagent-env.d.ts.map +1 -0
  37. package/dist/core/tools/subagent-env.js +43 -0
  38. package/dist/core/tools/subagent-env.js.map +1 -0
  39. package/dist/core/tools/subagent-scheduler.d.ts +31 -0
  40. package/dist/core/tools/subagent-scheduler.d.ts.map +1 -0
  41. package/dist/core/tools/subagent-scheduler.js +203 -0
  42. package/dist/core/tools/subagent-scheduler.js.map +1 -0
  43. package/dist/core/tools/subagent.d.ts +83 -3
  44. package/dist/core/tools/subagent.d.ts.map +1 -1
  45. package/dist/core/tools/subagent.js +214 -76
  46. package/dist/core/tools/subagent.js.map +1 -1
  47. package/dist/humain/index.d.ts.map +1 -1
  48. package/dist/humain/index.js +2 -0
  49. package/dist/humain/index.js.map +1 -1
  50. package/dist/humain/mcp-adapter/vendor/CHANGELOG.md +78 -0
  51. package/dist/humain/mcp-adapter/vendor/README.md +125 -19
  52. package/dist/humain/mcp-adapter/vendor/agent-plugin-loader.ts +69 -30
  53. package/dist/humain/mcp-adapter/vendor/agent-plugin-provenance.ts +36 -0
  54. package/dist/humain/mcp-adapter/vendor/claude-plugin-loader.ts +365 -0
  55. package/dist/humain/mcp-adapter/vendor/commands.ts +13 -15
  56. package/dist/humain/mcp-adapter/vendor/config.ts +198 -30
  57. package/dist/humain/mcp-adapter/vendor/consent-manager.ts +40 -9
  58. package/dist/humain/mcp-adapter/vendor/direct-tool-surface.ts +250 -0
  59. package/dist/humain/mcp-adapter/vendor/direct-tools.ts +9 -228
  60. package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-loader.js +74 -32
  61. package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-loader.js.map +1 -1
  62. package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-provenance.d.ts +1 -0
  63. package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-provenance.js +31 -0
  64. package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-provenance.js.map +1 -0
  65. package/dist/humain/mcp-adapter/vendor/dist/claude-plugin-loader.d.ts +9 -0
  66. package/dist/humain/mcp-adapter/vendor/dist/claude-plugin-loader.js +362 -0
  67. package/dist/humain/mcp-adapter/vendor/dist/claude-plugin-loader.js.map +1 -0
  68. package/dist/humain/mcp-adapter/vendor/dist/config.d.ts +3 -1
  69. package/dist/humain/mcp-adapter/vendor/dist/config.js +189 -27
  70. package/dist/humain/mcp-adapter/vendor/dist/config.js.map +1 -1
  71. package/dist/humain/mcp-adapter/vendor/dist/metadata-cache.js +7 -16
  72. package/dist/humain/mcp-adapter/vendor/dist/metadata-cache.js.map +1 -1
  73. package/dist/humain/mcp-adapter/vendor/dist/package-mcp-loader.js +5 -17
  74. package/dist/humain/mcp-adapter/vendor/dist/package-mcp-loader.js.map +1 -1
  75. package/dist/humain/mcp-adapter/vendor/dist/types.d.ts +30 -4
  76. package/dist/humain/mcp-adapter/vendor/dist/types.js +26 -0
  77. package/dist/humain/mcp-adapter/vendor/dist/types.js.map +1 -1
  78. package/dist/humain/mcp-adapter/vendor/dist/utils.d.ts +6 -0
  79. package/dist/humain/mcp-adapter/vendor/dist/utils.js +65 -6
  80. package/dist/humain/mcp-adapter/vendor/dist/utils.js.map +1 -1
  81. package/dist/humain/mcp-adapter/vendor/host-html-template.ts +20 -19
  82. package/dist/humain/mcp-adapter/vendor/http-ca.ts +84 -0
  83. package/dist/humain/mcp-adapter/vendor/index.bundle.mjs +37102 -15103
  84. package/dist/humain/mcp-adapter/vendor/index.ts +828 -164
  85. package/dist/humain/mcp-adapter/vendor/init.ts +48 -10
  86. package/dist/humain/mcp-adapter/vendor/lazy-loader.ts +7 -0
  87. package/dist/humain/mcp-adapter/vendor/mcp-auth-fetch.ts +113 -0
  88. package/dist/humain/mcp-adapter/vendor/mcp-auth-flow.ts +256 -77
  89. package/dist/humain/mcp-adapter/vendor/mcp-auth.ts +316 -54
  90. package/dist/humain/mcp-adapter/vendor/mcp-code.ts +45 -18
  91. package/dist/humain/mcp-adapter/vendor/mcp-install.ts +60 -0
  92. package/dist/humain/mcp-adapter/vendor/mcp-oauth-provider.ts +70 -6
  93. package/dist/humain/mcp-adapter/vendor/mcp-output-guard.ts +53 -42
  94. package/dist/humain/mcp-adapter/vendor/mcp-panel-theme.ts +105 -0
  95. package/dist/humain/mcp-adapter/vendor/mcp-panel.ts +366 -331
  96. package/dist/humain/mcp-adapter/vendor/mcp-references.ts +9 -14
  97. package/dist/humain/mcp-adapter/vendor/mcp-script-worker.mjs +3 -1
  98. package/dist/humain/mcp-adapter/vendor/mcp-setup-panel.ts +383 -341
  99. package/dist/humain/mcp-adapter/vendor/mcp-status.ts +5 -0
  100. package/dist/humain/mcp-adapter/vendor/metadata-cache.ts +7 -16
  101. package/dist/humain/mcp-adapter/vendor/namespace-tools.ts +61 -3
  102. package/dist/humain/mcp-adapter/vendor/oauth.ts +6 -2
  103. package/dist/humain/mcp-adapter/vendor/package-mcp-loader.ts +5 -17
  104. package/dist/humain/mcp-adapter/vendor/package.json +13 -3
  105. package/dist/humain/mcp-adapter/vendor/prompts.ts +35 -3
  106. package/dist/humain/mcp-adapter/vendor/proxy-modes.ts +108 -7
  107. package/dist/humain/mcp-adapter/vendor/runtime-owner.ts +16 -1
  108. package/dist/humain/mcp-adapter/vendor/sampling-handler.ts +9 -32
  109. package/dist/humain/mcp-adapter/vendor/sandbox-proxy-template.ts +20 -93
  110. package/dist/humain/mcp-adapter/vendor/server-manager.ts +227 -40
  111. package/dist/humain/mcp-adapter/vendor/session-approvals.ts +187 -0
  112. package/dist/humain/mcp-adapter/vendor/skills/mcp-scripting/SKILL.md +9 -1
  113. package/dist/humain/mcp-adapter/vendor/state.ts +10 -1
  114. package/dist/humain/mcp-adapter/vendor/tool-approval.ts +10 -22
  115. package/dist/humain/mcp-adapter/vendor/tool-metadata.ts +14 -0
  116. package/dist/humain/mcp-adapter/vendor/types.ts +57 -4
  117. package/dist/humain/mcp-adapter/vendor/ui-server.ts +36 -28
  118. package/dist/humain/mcp-adapter/vendor/utils.ts +64 -6
  119. package/dist/humain/node-http.d.ts +3 -0
  120. package/dist/humain/node-http.d.ts.map +1 -0
  121. package/dist/humain/node-http.js +119 -0
  122. package/dist/humain/node-http.js.map +1 -0
  123. package/dist/humain/node-provider.d.ts +4 -0
  124. package/dist/humain/node-provider.d.ts.map +1 -0
  125. package/dist/humain/node-provider.js +359 -0
  126. package/dist/humain/node-provider.js.map +1 -0
  127. package/dist/humain/web-access/vendor/abortable.d.ts +3 -0
  128. package/dist/humain/web-access/vendor/abortable.d.ts.map +1 -0
  129. package/dist/humain/web-access/vendor/abortable.js +22 -0
  130. package/dist/humain/web-access/vendor/abortable.js.map +1 -0
  131. package/dist/humain/web-access/vendor/crawl4ai.d.ts +9 -0
  132. package/dist/humain/web-access/vendor/crawl4ai.d.ts.map +1 -0
  133. package/dist/humain/web-access/vendor/crawl4ai.js +187 -0
  134. package/dist/humain/web-access/vendor/crawl4ai.js.map +1 -0
  135. package/dist/humain/web-access/vendor/credential-source.d.ts.map +1 -1
  136. package/dist/humain/web-access/vendor/credential-source.js +1 -0
  137. package/dist/humain/web-access/vendor/credential-source.js.map +1 -1
  138. package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
  139. package/dist/humain/web-access/vendor/curator-page.js +20 -2
  140. package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
  141. package/dist/humain/web-access/vendor/curator-run.d.ts +11 -0
  142. package/dist/humain/web-access/vendor/curator-run.d.ts.map +1 -0
  143. package/dist/humain/web-access/vendor/curator-run.js +38 -0
  144. package/dist/humain/web-access/vendor/curator-run.js.map +1 -0
  145. package/dist/humain/web-access/vendor/curator-server.d.ts +1 -0
  146. package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
  147. package/dist/humain/web-access/vendor/curator-server.js +2 -0
  148. package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
  149. package/dist/humain/web-access/vendor/duckduckgo.d.ts.map +1 -1
  150. package/dist/humain/web-access/vendor/duckduckgo.js +1 -1
  151. package/dist/humain/web-access/vendor/duckduckgo.js.map +1 -1
  152. package/dist/humain/web-access/vendor/extract.d.ts +1 -1
  153. package/dist/humain/web-access/vendor/extract.d.ts.map +1 -1
  154. package/dist/humain/web-access/vendor/extract.js +58 -11
  155. package/dist/humain/web-access/vendor/extract.js.map +1 -1
  156. package/dist/humain/web-access/vendor/fetch-params.js +1 -1
  157. package/dist/humain/web-access/vendor/fetch-params.js.map +1 -1
  158. package/dist/humain/web-access/vendor/gemini-search.d.ts +2 -2
  159. package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
  160. package/dist/humain/web-access/vendor/gemini-search.js +12 -5
  161. package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
  162. package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
  163. package/dist/humain/web-access/vendor/index.js +23 -19
  164. package/dist/humain/web-access/vendor/index.js.map +1 -1
  165. package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -1
  166. package/dist/humain/web-access/vendor/openai-search.js +40 -14
  167. package/dist/humain/web-access/vendor/openai-search.js.map +1 -1
  168. package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -1
  169. package/dist/humain/web-access/vendor/page-query.js +6 -2
  170. package/dist/humain/web-access/vendor/page-query.js.map +1 -1
  171. package/dist/humain/web-access/vendor/query-rewrite.d.ts.map +1 -1
  172. package/dist/humain/web-access/vendor/query-rewrite.js +6 -2
  173. package/dist/humain/web-access/vendor/query-rewrite.js.map +1 -1
  174. package/dist/humain/web-access/vendor/serpapi.d.ts +4 -0
  175. package/dist/humain/web-access/vendor/serpapi.d.ts.map +1 -0
  176. package/dist/humain/web-access/vendor/serpapi.js +215 -0
  177. package/dist/humain/web-access/vendor/serpapi.js.map +1 -0
  178. package/dist/humain/web-access/vendor/ssrf-protection.d.ts.map +1 -1
  179. package/dist/humain/web-access/vendor/ssrf-protection.js +5 -1
  180. package/dist/humain/web-access/vendor/ssrf-protection.js.map +1 -1
  181. package/dist/humain/web-access/vendor/storage.d.ts.map +1 -1
  182. package/dist/humain/web-access/vendor/storage.js +9 -0
  183. package/dist/humain/web-access/vendor/storage.js.map +1 -1
  184. package/dist/humain/web-access/vendor/summary-review.d.ts +1 -1
  185. package/dist/humain/web-access/vendor/summary-review.d.ts.map +1 -1
  186. package/dist/humain/web-access/vendor/summary-review.js +35 -24
  187. package/dist/humain/web-access/vendor/summary-review.js.map +1 -1
  188. package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
  189. package/dist/humain/web-access/vendor/utils.js +5 -3
  190. package/dist/humain/web-access/vendor/utils.js.map +1 -1
  191. package/dist/index.js +1 -51
  192. package/dist/main.d.ts.map +1 -1
  193. package/dist/main.js +16 -0
  194. package/dist/main.js.map +1 -1
  195. package/dist/modes/interactive/components/login-dialog.d.ts +7 -2
  196. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  197. package/dist/modes/interactive/components/login-dialog.js +46 -21
  198. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  199. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  200. package/dist/modes/interactive/interactive-mode.js +10 -13
  201. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  202. package/dist/modes/json-event.d.ts +8 -0
  203. package/dist/modes/json-event.d.ts.map +1 -1
  204. package/dist/modes/json-event.js +17 -0
  205. package/dist/modes/json-event.js.map +1 -1
  206. package/dist/modes/print-mode.d.ts.map +1 -1
  207. package/dist/modes/print-mode.js +3 -2
  208. package/dist/modes/print-mode.js.map +1 -1
  209. package/docs/environment-variables.md +8 -0
  210. package/docs/humain-terminal.md +6 -0
  211. package/docs/json.md +16 -0
  212. package/docs/providers.md +19 -1
  213. package/npm-shrinkwrap.json +6 -6
  214. package/package.json +2 -2
  215. package/src/humain/mcp-adapter/UPSTREAM.md +56 -7
  216. package/src/humain/mcp-adapter/upstream.json +6 -4
  217. package/src/humain/mcp-adapter/vendor/CHANGELOG.md +78 -0
  218. package/src/humain/web-access/UPSTREAM.md +18 -8
  219. package/src/humain/web-access/upstream.json +6 -5
  220. package/dist/bundle/chunks/chunk-2LC3S3VV.js +0 -105
@@ -1 +1 @@
1
- {"version":3,"file":"file-mutation-queue.d.ts","sourceRoot":"","sources":["../../../src/core/tools/file-mutation-queue.ts"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA6BjG"}
1
+ {"version":3,"file":"file-mutation-queue.d.ts","sourceRoot":"","sources":["../../../src/core/tools/file-mutation-queue.ts"],"names":[],"mappings":"AAgDA;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA6BjG"}
@@ -1,7 +1,20 @@
1
1
  import { realpath } from "node:fs/promises";
2
2
  import { resolve } from "node:path";
3
- const fileMutationQueues = new Map();
4
- let registrationQueue = Promise.resolve();
3
+ // The MCP adapter bundle inlines this module, so module-local state would hand
4
+ // vendored MCP tools a second queue and stop serializing them against edit,
5
+ // write and subagent. Share one state object across every module instance, the
6
+ // same way theme.ts shares the active theme.
7
+ const FILE_MUTATION_QUEUE_KEY = Symbol.for("humain-terminal:file-mutation-queue");
8
+ const globalScope = globalThis;
9
+ // Both fields have to be shared: a per-instance registration queue would let two
10
+ // instances read the same tail before either wrote, and both would then run.
11
+ if (!globalScope[FILE_MUTATION_QUEUE_KEY]) {
12
+ globalScope[FILE_MUTATION_QUEUE_KEY] = {
13
+ queues: new Map(),
14
+ registration: Promise.resolve(),
15
+ };
16
+ }
17
+ const state = globalScope[FILE_MUTATION_QUEUE_KEY];
5
18
  function isMissingPathError(error) {
6
19
  return (typeof error === "object" &&
7
20
  error !== null &&
@@ -25,18 +38,18 @@ async function getMutationQueueKey(filePath) {
25
38
  * Operations for different files still run in parallel.
26
39
  */
27
40
  export async function withFileMutationQueue(filePath, fn) {
28
- const registration = registrationQueue.then(async () => {
41
+ const registration = state.registration.then(async () => {
29
42
  const key = await getMutationQueueKey(filePath);
30
- const currentQueue = fileMutationQueues.get(key) ?? Promise.resolve();
43
+ const currentQueue = state.queues.get(key) ?? Promise.resolve();
31
44
  let releaseNext;
32
45
  const nextQueue = new Promise((resolveQueue) => {
33
46
  releaseNext = resolveQueue;
34
47
  });
35
48
  const chainedQueue = currentQueue.then(() => nextQueue);
36
- fileMutationQueues.set(key, chainedQueue);
49
+ state.queues.set(key, chainedQueue);
37
50
  return { key, currentQueue, chainedQueue, releaseNext };
38
51
  });
39
- registrationQueue = registration.then(() => undefined, () => undefined);
52
+ state.registration = registration.then(() => undefined, () => undefined);
40
53
  const { key, currentQueue, chainedQueue, releaseNext } = await registration;
41
54
  await currentQueue;
42
55
  try {
@@ -44,8 +57,8 @@ export async function withFileMutationQueue(filePath, fn) {
44
57
  }
45
58
  finally {
46
59
  releaseNext();
47
- if (fileMutationQueues.get(key) === chainedQueue) {
48
- fileMutationQueues.delete(key);
60
+ if (state.queues.get(key) === chainedQueue) {
61
+ state.queues.delete(key);
49
62
  }
50
63
  }
51
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file-mutation-queue.js","sourceRoot":"","sources":["../../../src/core/tools/file-mutation-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAyB,CAAC;AAC5D,IAAI,iBAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;AAE1C,SAAS,kBAAkB,CAAC,KAAc;IACzC,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CACrD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC;QACJ,OAAO,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,YAAY,CAAC;QACrB,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAI,QAAgB,EAAE,EAAoB;IACpF,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QACtD,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAEtE,IAAI,WAAwB,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,OAAO,CAAO,CAAC,YAAY,EAAE,EAAE;YACpD,WAAW,GAAG,YAAY,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACxD,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAE1C,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IACH,iBAAiB,GAAG,YAAY,CAAC,IAAI,CACpC,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CACf,CAAC;IAEF,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,YAAY,CAAC;IAC5E,MAAM,YAAY,CAAC;IACnB,IAAI,CAAC;QACJ,OAAO,MAAM,EAAE,EAAE,CAAC;IACnB,CAAC;YAAS,CAAC;QACV,WAAW,EAAE,CAAC;QACd,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,YAAY,EAAE,CAAC;YAClD,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACF,CAAC;AACF,CAAC","sourcesContent":["import { realpath } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nconst fileMutationQueues = new Map<string, Promise<void>>();\nlet registrationQueue = Promise.resolve();\n\nfunction isMissingPathError(error: unknown): boolean {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n\t);\n}\n\nasync function getMutationQueueKey(filePath: string): Promise<string> {\n\tconst resolvedPath = resolve(filePath);\n\ttry {\n\t\treturn await realpath(resolvedPath);\n\t} catch (error) {\n\t\tif (isMissingPathError(error)) {\n\t\t\treturn resolvedPath;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\n/**\n * Serialize file mutation operations targeting the same file.\n * Operations for different files still run in parallel.\n */\nexport async function withFileMutationQueue<T>(filePath: string, fn: () => Promise<T>): Promise<T> {\n\tconst registration = registrationQueue.then(async () => {\n\t\tconst key = await getMutationQueueKey(filePath);\n\t\tconst currentQueue = fileMutationQueues.get(key) ?? Promise.resolve();\n\n\t\tlet releaseNext!: () => void;\n\t\tconst nextQueue = new Promise<void>((resolveQueue) => {\n\t\t\treleaseNext = resolveQueue;\n\t\t});\n\t\tconst chainedQueue = currentQueue.then(() => nextQueue);\n\t\tfileMutationQueues.set(key, chainedQueue);\n\n\t\treturn { key, currentQueue, chainedQueue, releaseNext };\n\t});\n\tregistrationQueue = registration.then(\n\t\t() => undefined,\n\t\t() => undefined,\n\t);\n\n\tconst { key, currentQueue, chainedQueue, releaseNext } = await registration;\n\tawait currentQueue;\n\ttry {\n\t\treturn await fn();\n\t} finally {\n\t\treleaseNext();\n\t\tif (fileMutationQueues.get(key) === chainedQueue) {\n\t\t\tfileMutationQueues.delete(key);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"file-mutation-queue.js","sourceRoot":"","sources":["../../../src/core/tools/file-mutation-queue.ts"],"names":[],"mappings":"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","sourcesContent":["import { realpath } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\n// The MCP adapter bundle inlines this module, so module-local state would hand\n// vendored MCP tools a second queue and stop serializing them against edit,\n// write and subagent. Share one state object across every module instance, the\n// same way theme.ts shares the active theme.\nconst FILE_MUTATION_QUEUE_KEY = Symbol.for(\"humain-terminal:file-mutation-queue\");\n\ninterface FileMutationQueueState {\n\t/** Pending tail of the mutation chain, keyed by resolved path. */\n\tqueues: Map<string, Promise<void>>;\n\t/** Serializes the read-modify-write of `queues` across the realpath await. */\n\tregistration: Promise<void>;\n}\n\nconst globalScope = globalThis as Record<symbol, unknown>;\n// Both fields have to be shared: a per-instance registration queue would let two\n// instances read the same tail before either wrote, and both would then run.\nif (!globalScope[FILE_MUTATION_QUEUE_KEY]) {\n\tglobalScope[FILE_MUTATION_QUEUE_KEY] = {\n\t\tqueues: new Map<string, Promise<void>>(),\n\t\tregistration: Promise.resolve(),\n\t} satisfies FileMutationQueueState;\n}\nconst state = globalScope[FILE_MUTATION_QUEUE_KEY] as FileMutationQueueState;\n\nfunction isMissingPathError(error: unknown): boolean {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n\t);\n}\n\nasync function getMutationQueueKey(filePath: string): Promise<string> {\n\tconst resolvedPath = resolve(filePath);\n\ttry {\n\t\treturn await realpath(resolvedPath);\n\t} catch (error) {\n\t\tif (isMissingPathError(error)) {\n\t\t\treturn resolvedPath;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\n/**\n * Serialize file mutation operations targeting the same file.\n * Operations for different files still run in parallel.\n */\nexport async function withFileMutationQueue<T>(filePath: string, fn: () => Promise<T>): Promise<T> {\n\tconst registration = state.registration.then(async () => {\n\t\tconst key = await getMutationQueueKey(filePath);\n\t\tconst currentQueue = state.queues.get(key) ?? Promise.resolve();\n\n\t\tlet releaseNext!: () => void;\n\t\tconst nextQueue = new Promise<void>((resolveQueue) => {\n\t\t\treleaseNext = resolveQueue;\n\t\t});\n\t\tconst chainedQueue = currentQueue.then(() => nextQueue);\n\t\tstate.queues.set(key, chainedQueue);\n\n\t\treturn { key, currentQueue, chainedQueue, releaseNext };\n\t});\n\tstate.registration = registration.then(\n\t\t() => undefined,\n\t\t() => undefined,\n\t);\n\n\tconst { key, currentQueue, chainedQueue, releaseNext } = await registration;\n\tawait currentQueue;\n\ttry {\n\t\treturn await fn();\n\t} finally {\n\t\treleaseNext();\n\t\tif (state.queues.get(key) === chainedQueue) {\n\t\t\tstate.queues.delete(key);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Every process.env read the subagent tool performs lives here so the
3
+ * envelope (depth, concurrency, task count) and child identity have one
4
+ * definition. Children inherit these through spawn env.
5
+ */
6
+ export declare const SUBAGENT_DEPTH_ENV = "HUMAIN_TERMINAL_SUBAGENT_DEPTH";
7
+ export declare const SUBAGENT_MAX_DEPTH_ENV = "HUMAIN_TERMINAL_SUBAGENT_MAX_DEPTH";
8
+ export declare const SUBAGENT_MAX_CONCURRENCY_ENV = "HUMAIN_TERMINAL_SUBAGENT_MAX_CONCURRENCY";
9
+ export declare const SUBAGENT_MAX_TASKS_ENV = "HUMAIN_TERMINAL_SUBAGENT_MAX_TASKS";
10
+ export declare const TASK_ID_ENV = "HUMAIN_TERMINAL_TASK_ID";
11
+ export declare const PARENT_TASK_ID_ENV = "HUMAIN_TERMINAL_PARENT_TASK_ID";
12
+ export declare const TASK_BASE_REVISION_ENV = "HUMAIN_TERMINAL_TASK_BASE_REVISION";
13
+ export declare function currentSubagentDepth(env?: NodeJS.ProcessEnv): number;
14
+ export declare function maxSubagentDepth(env?: NodeJS.ProcessEnv): number;
15
+ export declare function maxSubagentConcurrency(env?: NodeJS.ProcessEnv): number;
16
+ export declare function maxParallelTasks(env?: NodeJS.ProcessEnv): number;
17
+ export declare function currentTaskId(env?: NodeJS.ProcessEnv): string | undefined;
18
+ //# sourceMappingURL=subagent-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-env.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent-env.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AACnE,eAAO,MAAM,sBAAsB,uCAAuC,CAAC;AAC3E,eAAO,MAAM,4BAA4B,6CAA6C,CAAC;AACvF,eAAO,MAAM,sBAAsB,uCAAuC,CAAC;AAC3E,eAAO,MAAM,WAAW,4BAA4B,CAAC;AACrD,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AACnE,eAAO,MAAM,sBAAsB,uCAAuC,CAAC;AAgB3E,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAGjF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE7E;AAED,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAEnF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE7E;AAED,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAGtF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Every process.env read the subagent tool performs lives here so the
3
+ * envelope (depth, concurrency, task count) and child identity have one
4
+ * definition. Children inherit these through spawn env.
5
+ */
6
+ export const SUBAGENT_DEPTH_ENV = "HUMAIN_TERMINAL_SUBAGENT_DEPTH";
7
+ export const SUBAGENT_MAX_DEPTH_ENV = "HUMAIN_TERMINAL_SUBAGENT_MAX_DEPTH";
8
+ export const SUBAGENT_MAX_CONCURRENCY_ENV = "HUMAIN_TERMINAL_SUBAGENT_MAX_CONCURRENCY";
9
+ export const SUBAGENT_MAX_TASKS_ENV = "HUMAIN_TERMINAL_SUBAGENT_MAX_TASKS";
10
+ export const TASK_ID_ENV = "HUMAIN_TERMINAL_TASK_ID";
11
+ export const PARENT_TASK_ID_ENV = "HUMAIN_TERMINAL_PARENT_TASK_ID";
12
+ export const TASK_BASE_REVISION_ENV = "HUMAIN_TERMINAL_TASK_BASE_REVISION";
13
+ const DEFAULT_MAX_DEPTH = 1;
14
+ const DEFAULT_MAX_CONCURRENCY = 4;
15
+ const DEFAULT_MAX_TASKS = 8;
16
+ // ponytail: hard ceilings; a policy layer may lower these, never raise them.
17
+ const CEILING_DEPTH = 3;
18
+ const CEILING_CONCURRENCY = 8;
19
+ const CEILING_TASKS = 16;
20
+ function clampedInt(raw, fallback, min, max) {
21
+ const n = Number(raw);
22
+ if (raw === undefined || raw.trim() === "" || !Number.isFinite(n))
23
+ return fallback;
24
+ return Math.min(max, Math.max(min, Math.floor(n)));
25
+ }
26
+ export function currentSubagentDepth(env = process.env) {
27
+ const raw = Number(env[SUBAGENT_DEPTH_ENV] ?? "0");
28
+ return Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : 0;
29
+ }
30
+ export function maxSubagentDepth(env = process.env) {
31
+ return clampedInt(env[SUBAGENT_MAX_DEPTH_ENV], DEFAULT_MAX_DEPTH, 1, CEILING_DEPTH);
32
+ }
33
+ export function maxSubagentConcurrency(env = process.env) {
34
+ return clampedInt(env[SUBAGENT_MAX_CONCURRENCY_ENV], DEFAULT_MAX_CONCURRENCY, 1, CEILING_CONCURRENCY);
35
+ }
36
+ export function maxParallelTasks(env = process.env) {
37
+ return clampedInt(env[SUBAGENT_MAX_TASKS_ENV], DEFAULT_MAX_TASKS, 1, CEILING_TASKS);
38
+ }
39
+ export function currentTaskId(env = process.env) {
40
+ const raw = env[TASK_ID_ENV]?.trim();
41
+ return raw ? raw : undefined;
42
+ }
43
+ //# sourceMappingURL=subagent-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-env.js","sourceRoot":"","sources":["../../../src/core/tools/subagent-env.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,gCAAgC,CAAC;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,oCAAoC,CAAC;AAC3E,MAAM,CAAC,MAAM,4BAA4B,GAAG,0CAA0C,CAAC;AACvF,MAAM,CAAC,MAAM,sBAAsB,GAAG,oCAAoC,CAAC;AAC3E,MAAM,CAAC,MAAM,WAAW,GAAG,yBAAyB,CAAC;AACrD,MAAM,CAAC,MAAM,kBAAkB,GAAG,gCAAgC,CAAC;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,oCAAoC,CAAC;AAE3E,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAClC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,6EAA6E;AAC7E,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,SAAS,UAAU,CAAC,GAAuB,EAAE,QAAgB,EAAE,GAAW,EAAE,GAAW;IACtF,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACnF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;IACxE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;IACpE,OAAO,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;IAC1E,OAAO,UAAU,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,uBAAuB,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;IACpE,OAAO,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;IACjE,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;IACrC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9B,CAAC","sourcesContent":["/**\n * Every process.env read the subagent tool performs lives here so the\n * envelope (depth, concurrency, task count) and child identity have one\n * definition. Children inherit these through spawn env.\n */\nexport const SUBAGENT_DEPTH_ENV = \"HUMAIN_TERMINAL_SUBAGENT_DEPTH\";\nexport const SUBAGENT_MAX_DEPTH_ENV = \"HUMAIN_TERMINAL_SUBAGENT_MAX_DEPTH\";\nexport const SUBAGENT_MAX_CONCURRENCY_ENV = \"HUMAIN_TERMINAL_SUBAGENT_MAX_CONCURRENCY\";\nexport const SUBAGENT_MAX_TASKS_ENV = \"HUMAIN_TERMINAL_SUBAGENT_MAX_TASKS\";\nexport const TASK_ID_ENV = \"HUMAIN_TERMINAL_TASK_ID\";\nexport const PARENT_TASK_ID_ENV = \"HUMAIN_TERMINAL_PARENT_TASK_ID\";\nexport const TASK_BASE_REVISION_ENV = \"HUMAIN_TERMINAL_TASK_BASE_REVISION\";\n\nconst DEFAULT_MAX_DEPTH = 1;\nconst DEFAULT_MAX_CONCURRENCY = 4;\nconst DEFAULT_MAX_TASKS = 8;\n// ponytail: hard ceilings; a policy layer may lower these, never raise them.\nconst CEILING_DEPTH = 3;\nconst CEILING_CONCURRENCY = 8;\nconst CEILING_TASKS = 16;\n\nfunction clampedInt(raw: string | undefined, fallback: number, min: number, max: number): number {\n\tconst n = Number(raw);\n\tif (raw === undefined || raw.trim() === \"\" || !Number.isFinite(n)) return fallback;\n\treturn Math.min(max, Math.max(min, Math.floor(n)));\n}\n\nexport function currentSubagentDepth(env: NodeJS.ProcessEnv = process.env): number {\n\tconst raw = Number(env[SUBAGENT_DEPTH_ENV] ?? \"0\");\n\treturn Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : 0;\n}\n\nexport function maxSubagentDepth(env: NodeJS.ProcessEnv = process.env): number {\n\treturn clampedInt(env[SUBAGENT_MAX_DEPTH_ENV], DEFAULT_MAX_DEPTH, 1, CEILING_DEPTH);\n}\n\nexport function maxSubagentConcurrency(env: NodeJS.ProcessEnv = process.env): number {\n\treturn clampedInt(env[SUBAGENT_MAX_CONCURRENCY_ENV], DEFAULT_MAX_CONCURRENCY, 1, CEILING_CONCURRENCY);\n}\n\nexport function maxParallelTasks(env: NodeJS.ProcessEnv = process.env): number {\n\treturn clampedInt(env[SUBAGENT_MAX_TASKS_ENV], DEFAULT_MAX_TASKS, 1, CEILING_TASKS);\n}\n\nexport function currentTaskId(env: NodeJS.ProcessEnv = process.env): string | undefined {\n\tconst raw = env[TASK_ID_ENV]?.trim();\n\treturn raw ? raw : undefined;\n}\n"]}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Pure scheduling for the subagent tool's parallel mode. No I/O, no spawn.
3
+ * Explicit `dependsOn` edges gate start and propagate failure as a skip.
4
+ * Implicit owner-path edges only order siblings; they never skip.
5
+ */
6
+ export interface SchedulableTask {
7
+ id: string;
8
+ dependsOn?: string[];
9
+ ownerPaths?: string[];
10
+ }
11
+ export type DagEvent = {
12
+ type: "wait";
13
+ id: string;
14
+ reason: "concurrency";
15
+ } | {
16
+ type: "serialize";
17
+ id: string;
18
+ after: string[];
19
+ } | {
20
+ type: "start";
21
+ id: string;
22
+ } | {
23
+ type: "skip";
24
+ id: string;
25
+ failedDependency: string;
26
+ };
27
+ export declare function validateTaskGraph(tasks: SchedulableTask[]): string | null;
28
+ export declare function ownerPathsOverlap(a: string[] | undefined, b: string[] | undefined): boolean;
29
+ export declare function implicitSerializationEdges(tasks: SchedulableTask[]): Map<string, string[]>;
30
+ export declare function runDag<TIn extends SchedulableTask, TOut>(tasks: TIn[], concurrency: number, run: (task: TIn, index: number) => Promise<TOut>, isFailed: (result: TOut) => boolean, skip: (task: TIn, index: number, failedDependency: string) => TOut, onEvent?: (event: DagEvent) => void, signal?: AbortSignal, onAbort?: (task: TIn, index: number) => TOut): Promise<TOut[]>;
31
+ //# sourceMappingURL=subagent-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-scheduler.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent-scheduler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,MAAM,QAAQ,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,GAAG,IAAI,CA8BzE;AAUD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAK3F;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAU1F;AAED,wBAAsB,MAAM,CAAC,GAAG,SAAS,eAAe,EAAE,IAAI,EAC7D,KAAK,EAAE,GAAG,EAAE,EACZ,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAChD,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,KAAK,OAAO,EACnC,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,KAAK,IAAI,EAClE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACnC,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAC1C,OAAO,CAAC,IAAI,EAAE,CAAC,CAwIjB"}
@@ -0,0 +1,203 @@
1
+ export function validateTaskGraph(tasks) {
2
+ const ids = new Set();
3
+ for (const t of tasks) {
4
+ if (ids.has(t.id))
5
+ return `duplicate task id "${t.id}"`;
6
+ ids.add(t.id);
7
+ }
8
+ for (const t of tasks) {
9
+ for (const dep of t.dependsOn ?? []) {
10
+ if (dep === t.id)
11
+ return `task "${t.id}" depends on itself`;
12
+ if (!ids.has(dep))
13
+ return `task "${t.id}" has unknown dependency "${dep}"`;
14
+ }
15
+ }
16
+ // Kahn's algorithm; anything left with in-degree > 0 is on a cycle.
17
+ const indegree = new Map(tasks.map((t) => [t.id, t.dependsOn?.length ?? 0]));
18
+ const dependents = new Map();
19
+ for (const t of tasks)
20
+ for (const dep of t.dependsOn ?? [])
21
+ dependents.set(dep, [...(dependents.get(dep) ?? []), t.id]);
22
+ const queue = tasks.filter((t) => (indegree.get(t.id) ?? 0) === 0).map((t) => t.id);
23
+ let visited = 0;
24
+ while (queue.length) {
25
+ const id = queue.shift();
26
+ visited++;
27
+ for (const next of dependents.get(id) ?? []) {
28
+ const d = (indegree.get(next) ?? 0) - 1;
29
+ indegree.set(next, d);
30
+ if (d === 0)
31
+ queue.push(next);
32
+ }
33
+ }
34
+ if (visited !== tasks.length)
35
+ return "task graph contains a dependency cycle";
36
+ return null;
37
+ }
38
+ function normalizePath(p) {
39
+ return p.replace(/\\/g, "/").replace(/^\.\//, "").replace(/\/+$/, "");
40
+ }
41
+ function pathCovers(a, b) {
42
+ return a === b || b.startsWith(`${a}/`) || a.startsWith(`${b}/`);
43
+ }
44
+ export function ownerPathsOverlap(a, b) {
45
+ if (!a?.length || !b?.length)
46
+ return false;
47
+ const na = a.map(normalizePath);
48
+ const nb = b.map(normalizePath);
49
+ return na.some((x) => nb.some((y) => pathCovers(x, y)));
50
+ }
51
+ export function implicitSerializationEdges(tasks) {
52
+ const edges = new Map();
53
+ for (let i = 0; i < tasks.length; i++) {
54
+ const after = [];
55
+ for (let j = 0; j < i; j++) {
56
+ if (ownerPathsOverlap(tasks[i].ownerPaths, tasks[j].ownerPaths))
57
+ after.push(tasks[j].id);
58
+ }
59
+ edges.set(tasks[i].id, after);
60
+ }
61
+ return edges;
62
+ }
63
+ export async function runDag(tasks, concurrency, run, isFailed, skip, onEvent, signal, onAbort) {
64
+ if (tasks.length === 0)
65
+ return [];
66
+ const graphError = validateTaskGraph(tasks);
67
+ if (graphError)
68
+ return Promise.reject(new Error(graphError));
69
+ const limit = Math.max(1, Math.min(concurrency, tasks.length));
70
+ const results = new Array(tasks.length);
71
+ const serialAfter = implicitSerializationEdges(tasks);
72
+ const done = new Set();
73
+ const failed = new Set();
74
+ const started = new Set();
75
+ const waitedOnCap = new Set();
76
+ const serializedAnnounced = new Set();
77
+ let running = 0;
78
+ const failedExplicitDep = (t) => (t.dependsOn ?? []).find((d) => failed.has(d));
79
+ const blockedBy = (t) => [...(t.dependsOn ?? []), ...(serialAfter.get(t.id) ?? [])].filter((d) => !done.has(d));
80
+ return new Promise((resolve, reject) => {
81
+ let settled = false;
82
+ const settle = (index, result) => {
83
+ results[index] = result;
84
+ const id = tasks[index].id;
85
+ done.add(id);
86
+ if (isFailed(result))
87
+ failed.add(id);
88
+ };
89
+ const safeEvent = (event) => {
90
+ try {
91
+ onEvent?.(event);
92
+ }
93
+ catch {
94
+ /* observer errors never affect scheduling */
95
+ }
96
+ };
97
+ /** Returns false when the promise was rejected and pumping must stop. */
98
+ const safeSettleWith = (index, produce) => {
99
+ try {
100
+ settle(index, produce());
101
+ return true;
102
+ }
103
+ catch (err) {
104
+ if (!settled) {
105
+ settled = true;
106
+ reject(err instanceof Error ? err : new Error(String(err)));
107
+ }
108
+ return false;
109
+ }
110
+ };
111
+ const pump = () => {
112
+ let startedOrSettledThisPass = false;
113
+ let progress = true;
114
+ while (progress) {
115
+ progress = false;
116
+ // 0. Abort short-circuits everything not yet started.
117
+ if (signal?.aborted) {
118
+ for (let i = 0; i < tasks.length; i++) {
119
+ const t = tasks[i];
120
+ if (started.has(t.id) || done.has(t.id))
121
+ continue;
122
+ started.add(t.id);
123
+ if (!safeSettleWith(i, () => (onAbort ? onAbort(t, i) : skip(t, i, "aborted"))))
124
+ return;
125
+ startedOrSettledThisPass = true;
126
+ }
127
+ }
128
+ // 1. Skip dependents of failed tasks, to a fixed point.
129
+ let skipped = true;
130
+ while (skipped) {
131
+ skipped = false;
132
+ for (let i = 0; i < tasks.length; i++) {
133
+ const t = tasks[i];
134
+ if (started.has(t.id) || done.has(t.id))
135
+ continue;
136
+ const dep = failedExplicitDep(t);
137
+ if (dep) {
138
+ safeEvent({ type: "skip", id: t.id, failedDependency: dep });
139
+ started.add(t.id);
140
+ if (!safeSettleWith(i, () => skip(t, i, dep)))
141
+ return;
142
+ startedOrSettledThisPass = true;
143
+ progress = true;
144
+ skipped = true;
145
+ }
146
+ }
147
+ }
148
+ // 2. Start ready tasks up to the cap.
149
+ for (let i = 0; i < tasks.length; i++) {
150
+ const t = tasks[i];
151
+ if (started.has(t.id) || done.has(t.id))
152
+ continue;
153
+ const blockers = blockedBy(t);
154
+ if (blockers.length) {
155
+ const serial = (serialAfter.get(t.id) ?? []).filter((d) => !done.has(d));
156
+ if (serial.length && !serializedAnnounced.has(t.id)) {
157
+ serializedAnnounced.add(t.id);
158
+ safeEvent({ type: "serialize", id: t.id, after: serial });
159
+ }
160
+ continue;
161
+ }
162
+ if (running >= limit) {
163
+ if (!waitedOnCap.has(t.id)) {
164
+ waitedOnCap.add(t.id);
165
+ safeEvent({ type: "wait", id: t.id, reason: "concurrency" });
166
+ }
167
+ continue;
168
+ }
169
+ started.add(t.id);
170
+ running++;
171
+ startedOrSettledThisPass = true;
172
+ progress = true;
173
+ safeEvent({ type: "start", id: t.id });
174
+ run(t, i).then((r) => {
175
+ running--;
176
+ settle(i, r);
177
+ pump();
178
+ }, (err) => {
179
+ running--;
180
+ if (!safeSettleWith(i, () => skip(t, i, err instanceof Error ? err.message : String(err))))
181
+ return;
182
+ pump();
183
+ });
184
+ }
185
+ }
186
+ if (done.size === tasks.length) {
187
+ if (!settled) {
188
+ settled = true;
189
+ resolve(results);
190
+ }
191
+ return;
192
+ }
193
+ if (running === 0 && !startedOrSettledThisPass) {
194
+ if (!settled) {
195
+ settled = true;
196
+ reject(new Error("task graph stalled: no runnable task remains"));
197
+ }
198
+ }
199
+ };
200
+ pump();
201
+ });
202
+ }
203
+ //# sourceMappingURL=subagent-scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-scheduler.js","sourceRoot":"","sources":["../../../src/core/tools/subagent-scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure scheduling for the subagent tool's parallel mode. No I/O, no spawn.\n * Explicit `dependsOn` edges gate start and propagate failure as a skip.\n * Implicit owner-path edges only order siblings; they never skip.\n */\nexport interface SchedulableTask {\n\tid: string;\n\tdependsOn?: string[];\n\townerPaths?: string[];\n}\n\nexport type DagEvent =\n\t| { type: \"wait\"; id: string; reason: \"concurrency\" }\n\t| { type: \"serialize\"; id: string; after: string[] }\n\t| { type: \"start\"; id: string }\n\t| { type: \"skip\"; id: string; failedDependency: string };\n\nexport function validateTaskGraph(tasks: SchedulableTask[]): string | null {\n\tconst ids = new Set<string>();\n\tfor (const t of tasks) {\n\t\tif (ids.has(t.id)) return `duplicate task id \"${t.id}\"`;\n\t\tids.add(t.id);\n\t}\n\tfor (const t of tasks) {\n\t\tfor (const dep of t.dependsOn ?? []) {\n\t\t\tif (dep === t.id) return `task \"${t.id}\" depends on itself`;\n\t\t\tif (!ids.has(dep)) return `task \"${t.id}\" has unknown dependency \"${dep}\"`;\n\t\t}\n\t}\n\t// Kahn's algorithm; anything left with in-degree > 0 is on a cycle.\n\tconst indegree = new Map<string, number>(tasks.map((t) => [t.id, t.dependsOn?.length ?? 0]));\n\tconst dependents = new Map<string, string[]>();\n\tfor (const t of tasks)\n\t\tfor (const dep of t.dependsOn ?? []) dependents.set(dep, [...(dependents.get(dep) ?? []), t.id]);\n\tconst queue = tasks.filter((t) => (indegree.get(t.id) ?? 0) === 0).map((t) => t.id);\n\tlet visited = 0;\n\twhile (queue.length) {\n\t\tconst id = queue.shift() as string;\n\t\tvisited++;\n\t\tfor (const next of dependents.get(id) ?? []) {\n\t\t\tconst d = (indegree.get(next) ?? 0) - 1;\n\t\t\tindegree.set(next, d);\n\t\t\tif (d === 0) queue.push(next);\n\t\t}\n\t}\n\tif (visited !== tasks.length) return \"task graph contains a dependency cycle\";\n\treturn null;\n}\n\nfunction normalizePath(p: string): string {\n\treturn p.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\").replace(/\\/+$/, \"\");\n}\n\nfunction pathCovers(a: string, b: string): boolean {\n\treturn a === b || b.startsWith(`${a}/`) || a.startsWith(`${b}/`);\n}\n\nexport function ownerPathsOverlap(a: string[] | undefined, b: string[] | undefined): boolean {\n\tif (!a?.length || !b?.length) return false;\n\tconst na = a.map(normalizePath);\n\tconst nb = b.map(normalizePath);\n\treturn na.some((x) => nb.some((y) => pathCovers(x, y)));\n}\n\nexport function implicitSerializationEdges(tasks: SchedulableTask[]): Map<string, string[]> {\n\tconst edges = new Map<string, string[]>();\n\tfor (let i = 0; i < tasks.length; i++) {\n\t\tconst after: string[] = [];\n\t\tfor (let j = 0; j < i; j++) {\n\t\t\tif (ownerPathsOverlap(tasks[i].ownerPaths, tasks[j].ownerPaths)) after.push(tasks[j].id);\n\t\t}\n\t\tedges.set(tasks[i].id, after);\n\t}\n\treturn edges;\n}\n\nexport async function runDag<TIn extends SchedulableTask, TOut>(\n\ttasks: TIn[],\n\tconcurrency: number,\n\trun: (task: TIn, index: number) => Promise<TOut>,\n\tisFailed: (result: TOut) => boolean,\n\tskip: (task: TIn, index: number, failedDependency: string) => TOut,\n\tonEvent?: (event: DagEvent) => void,\n\tsignal?: AbortSignal,\n\tonAbort?: (task: TIn, index: number) => TOut,\n): Promise<TOut[]> {\n\tif (tasks.length === 0) return [];\n\tconst graphError = validateTaskGraph(tasks);\n\tif (graphError) return Promise.reject(new Error(graphError));\n\tconst limit = Math.max(1, Math.min(concurrency, tasks.length));\n\tconst results: TOut[] = new Array(tasks.length);\n\tconst serialAfter = implicitSerializationEdges(tasks);\n\tconst done = new Set<string>();\n\tconst failed = new Set<string>();\n\tconst started = new Set<string>();\n\tconst waitedOnCap = new Set<string>();\n\tconst serializedAnnounced = new Set<string>();\n\tlet running = 0;\n\n\tconst failedExplicitDep = (t: TIn): string | undefined => (t.dependsOn ?? []).find((d) => failed.has(d));\n\tconst blockedBy = (t: TIn): string[] =>\n\t\t[...(t.dependsOn ?? []), ...(serialAfter.get(t.id) ?? [])].filter((d) => !done.has(d));\n\n\treturn new Promise<TOut[]>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tconst settle = (index: number, result: TOut) => {\n\t\t\tresults[index] = result;\n\t\t\tconst id = tasks[index].id;\n\t\t\tdone.add(id);\n\t\t\tif (isFailed(result)) failed.add(id);\n\t\t};\n\t\tconst safeEvent = (event: DagEvent) => {\n\t\t\ttry {\n\t\t\t\tonEvent?.(event);\n\t\t\t} catch {\n\t\t\t\t/* observer errors never affect scheduling */\n\t\t\t}\n\t\t};\n\t\t/** Returns false when the promise was rejected and pumping must stop. */\n\t\tconst safeSettleWith = (index: number, produce: () => TOut): boolean => {\n\t\t\ttry {\n\t\t\t\tsettle(index, produce());\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(err instanceof Error ? err : new Error(String(err)));\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\n\t\tconst pump = () => {\n\t\t\tlet startedOrSettledThisPass = false;\n\t\t\tlet progress = true;\n\t\t\twhile (progress) {\n\t\t\t\tprogress = false;\n\t\t\t\t// 0. Abort short-circuits everything not yet started.\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tfor (let i = 0; i < tasks.length; i++) {\n\t\t\t\t\t\tconst t = tasks[i];\n\t\t\t\t\t\tif (started.has(t.id) || done.has(t.id)) continue;\n\t\t\t\t\t\tstarted.add(t.id);\n\t\t\t\t\t\tif (!safeSettleWith(i, () => (onAbort ? onAbort(t, i) : skip(t, i, \"aborted\")))) return;\n\t\t\t\t\t\tstartedOrSettledThisPass = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 1. Skip dependents of failed tasks, to a fixed point.\n\t\t\t\tlet skipped = true;\n\t\t\t\twhile (skipped) {\n\t\t\t\t\tskipped = false;\n\t\t\t\t\tfor (let i = 0; i < tasks.length; i++) {\n\t\t\t\t\t\tconst t = tasks[i];\n\t\t\t\t\t\tif (started.has(t.id) || done.has(t.id)) continue;\n\t\t\t\t\t\tconst dep = failedExplicitDep(t);\n\t\t\t\t\t\tif (dep) {\n\t\t\t\t\t\t\tsafeEvent({ type: \"skip\", id: t.id, failedDependency: dep });\n\t\t\t\t\t\t\tstarted.add(t.id);\n\t\t\t\t\t\t\tif (!safeSettleWith(i, () => skip(t, i, dep))) return;\n\t\t\t\t\t\t\tstartedOrSettledThisPass = true;\n\t\t\t\t\t\t\tprogress = true;\n\t\t\t\t\t\t\tskipped = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 2. Start ready tasks up to the cap.\n\t\t\t\tfor (let i = 0; i < tasks.length; i++) {\n\t\t\t\t\tconst t = tasks[i];\n\t\t\t\t\tif (started.has(t.id) || done.has(t.id)) continue;\n\t\t\t\t\tconst blockers = blockedBy(t);\n\t\t\t\t\tif (blockers.length) {\n\t\t\t\t\t\tconst serial = (serialAfter.get(t.id) ?? []).filter((d) => !done.has(d));\n\t\t\t\t\t\tif (serial.length && !serializedAnnounced.has(t.id)) {\n\t\t\t\t\t\t\tserializedAnnounced.add(t.id);\n\t\t\t\t\t\t\tsafeEvent({ type: \"serialize\", id: t.id, after: serial });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (running >= limit) {\n\t\t\t\t\t\tif (!waitedOnCap.has(t.id)) {\n\t\t\t\t\t\t\twaitedOnCap.add(t.id);\n\t\t\t\t\t\t\tsafeEvent({ type: \"wait\", id: t.id, reason: \"concurrency\" });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstarted.add(t.id);\n\t\t\t\t\trunning++;\n\t\t\t\t\tstartedOrSettledThisPass = true;\n\t\t\t\t\tprogress = true;\n\t\t\t\t\tsafeEvent({ type: \"start\", id: t.id });\n\t\t\t\t\trun(t, i).then(\n\t\t\t\t\t\t(r) => {\n\t\t\t\t\t\t\trunning--;\n\t\t\t\t\t\t\tsettle(i, r);\n\t\t\t\t\t\t\tpump();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(err) => {\n\t\t\t\t\t\t\trunning--;\n\t\t\t\t\t\t\tif (!safeSettleWith(i, () => skip(t, i, err instanceof Error ? err.message : String(err)))) return;\n\t\t\t\t\t\t\tpump();\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (done.size === tasks.length) {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tresolve(results);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (running === 0 && !startedOrSettledThisPass) {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(new Error(\"task graph stalled: no runnable task remains\"));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tpump();\n\t});\n}\n"]}
@@ -14,9 +14,8 @@
14
14
  import type { Message } from "@earendil-works/pi-ai";
15
15
  import { Type } from "typebox";
16
16
  import type { ToolDefinition } from "../extensions/types.ts";
17
+ export { SUBAGENT_DEPTH_ENV } from "./subagent-env.ts";
17
18
  import { type SubagentIsolation, type SubagentMergeOutcome } from "./subagent-worktree.ts";
18
- /** Children must not delegate further: depth 0 = top-level agent, depth >= 1 = subagent. */
19
- export declare const SUBAGENT_DEPTH_ENV = "HUMAIN_TERMINAL_SUBAGENT_DEPTH";
20
19
  export type AgentScope = "user" | "project" | "both";
21
20
  export interface AgentConfig {
22
21
  name: string;
@@ -45,6 +44,14 @@ export interface SubagentSingleResult {
45
44
  agent: string;
46
45
  agentSource: "user" | "project" | "unknown";
47
46
  task: string;
47
+ /** Stable id for this child; defaults to `${toolCallId}-${childIndex}`. */
48
+ taskId: string;
49
+ /** The task id of the process that spawned this child, or its tool call id at depth 0. */
50
+ parentTaskId?: string;
51
+ /** Depth the child runs at (parent depth + 1). */
52
+ depth: number;
53
+ thinking?: string;
54
+ attempt?: number;
48
55
  exitCode: number;
49
56
  messages: Message[];
50
57
  stderr: string;
@@ -58,28 +65,102 @@ export interface SubagentSingleResult {
58
65
  mergeOutcome?: SubagentMergeOutcome;
59
66
  changedFiles?: string[];
60
67
  patchPath?: string;
68
+ baseRevision?: string;
61
69
  }
70
+ export type SubagentTaskEvent = {
71
+ type: "schedule";
72
+ taskId: string;
73
+ dependsOn: string[];
74
+ ownerPaths: string[];
75
+ baseRevision?: string;
76
+ at: number;
77
+ } | {
78
+ type: "wait";
79
+ taskId: string;
80
+ reason: "concurrency";
81
+ at: number;
82
+ } | {
83
+ type: "serialize";
84
+ taskId: string;
85
+ after: string[];
86
+ at: number;
87
+ } | {
88
+ type: "start";
89
+ taskId: string;
90
+ attempt: number;
91
+ at: number;
92
+ } | {
93
+ type: "complete";
94
+ taskId: string;
95
+ attempt: number;
96
+ at: number;
97
+ } | {
98
+ type: "fail";
99
+ taskId: string;
100
+ attempt: number;
101
+ reason: string;
102
+ at: number;
103
+ } | {
104
+ type: "escalate";
105
+ taskId: string;
106
+ fromAttempt: number;
107
+ toAttempt: number;
108
+ model?: string;
109
+ thinking?: string;
110
+ at: number;
111
+ } | {
112
+ type: "skip";
113
+ taskId: string;
114
+ failedDependency: string;
115
+ at: number;
116
+ };
62
117
  export interface SubagentDetails {
63
118
  mode: "single" | "parallel" | "chain";
64
119
  agentScope: AgentScope;
65
120
  projectAgentsDir: string | null;
66
121
  results: SubagentSingleResult[];
122
+ taskEvents?: SubagentTaskEvent[];
123
+ }
124
+ export declare function renderTaskWithContext(task: string, context?: TaskContext): string;
125
+ /** Bounded context handed to a child. Strings are rendered verbatim into the child's task text; callers must not pass untrusted multi-line content. */
126
+ export interface TaskContext {
127
+ files?: string[];
128
+ acceptance?: string[];
129
+ baseRevision?: string;
67
130
  }
68
131
  declare const SubagentParams: Type.TObject<{
69
132
  agent: Type.TOptional<Type.TString>;
70
133
  task: Type.TOptional<Type.TString>;
71
134
  model: Type.TOptional<Type.TString>;
135
+ thinking: Type.TOptional<Type.TUnsafe<"high" | "low" | "max" | "medium" | "minimal" | "off" | "xhigh">>;
72
136
  tasks: Type.TOptional<Type.TArray<Type.TObject<{
73
137
  agent: Type.TString;
74
138
  task: Type.TString;
139
+ id: Type.TOptional<Type.TString>;
140
+ thinking: Type.TOptional<Type.TUnsafe<"high" | "low" | "max" | "medium" | "minimal" | "off" | "xhigh">>;
75
141
  model: Type.TOptional<Type.TString>;
76
142
  cwd: Type.TOptional<Type.TString>;
77
143
  isolation: Type.TOptional<Type.TUnsafe<"shared" | "worktree">>;
144
+ dependsOn: Type.TOptional<Type.TArray<Type.TString>>;
145
+ ownerPaths: Type.TOptional<Type.TArray<Type.TString>>;
146
+ onFailure: Type.TOptional<Type.TObject<{
147
+ retryWith: Type.TOptional<Type.TObject<{
148
+ model: Type.TOptional<Type.TString>;
149
+ thinking: Type.TOptional<Type.TUnsafe<"high" | "low" | "max" | "medium" | "minimal" | "off" | "xhigh">>;
150
+ }>>;
151
+ maxAttempts: Type.TOptional<Type.TInteger>;
152
+ }>>;
153
+ context: Type.TOptional<Type.TObject<{
154
+ files: Type.TOptional<Type.TArray<Type.TString>>;
155
+ acceptance: Type.TOptional<Type.TArray<Type.TString>>;
156
+ baseRevision: Type.TOptional<Type.TString>;
157
+ }>>;
78
158
  }>>>;
79
159
  chain: Type.TOptional<Type.TArray<Type.TObject<{
80
160
  agent: Type.TString;
81
161
  task: Type.TString;
82
162
  model: Type.TOptional<Type.TString>;
163
+ thinking: Type.TOptional<Type.TUnsafe<"high" | "low" | "max" | "medium" | "minimal" | "off" | "xhigh">>;
83
164
  cwd: Type.TOptional<Type.TString>;
84
165
  }>>>;
85
166
  agentScope: Type.TOptional<Type.TUnsafe<"both" | "project" | "user">>;
@@ -89,5 +170,4 @@ declare const SubagentParams: Type.TObject<{
89
170
  }>;
90
171
  export declare function createSubagentToolDefinition(cwd: string): ToolDefinition<typeof SubagentParams, SubagentDetails>;
91
172
  export declare function createSubagentTool(cwd: string): import("@earendil-works/pi-agent-core").AgentTool<any, SubagentDetails>;
92
- export {};
93
173
  //# sourceMappingURL=subagent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAO,OAAO,EAAS,MAAM,uBAAuB,CAAC;AAGjE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI/B,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG/E,OAAO,EAGN,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAEzB,MAAM,wBAAwB,CAAC;AAQhC,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AAUnE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAyED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,oBAAoB,CAmBnF;AAoGD,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,iBAAiB,CAAC;IAC7B,uBAAuB,CAAC,EAAE,gBAAgB,CAAC;IAC3C,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,oBAAoB,EAAE,CAAC;CAChC;AA0YD,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;EAqBlB,CAAC;AAEH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,cAAc,EAAE,eAAe,CAAC,CAopBhH;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,2EAE7C"}
1
+ {"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent.ts"],"names":[],"mappings":"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"}