@aigne/agent-runtime 1.12.0-beta.5

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 (234) hide show
  1. package/LICENSE.md +26 -0
  2. package/README.md +79 -0
  3. package/dist/agent-runners/ai-runner.cjs +133 -0
  4. package/dist/agent-runners/ai-runner.d.cts +33 -0
  5. package/dist/agent-runners/ai-runner.d.cts.map +1 -0
  6. package/dist/agent-runners/ai-runner.d.mts +33 -0
  7. package/dist/agent-runners/ai-runner.d.mts.map +1 -0
  8. package/dist/agent-runners/ai-runner.mjs +134 -0
  9. package/dist/agent-runners/ai-runner.mjs.map +1 -0
  10. package/dist/agent-runners/ash-runner.cjs +272 -0
  11. package/dist/agent-runners/ash-runner.d.cts +30 -0
  12. package/dist/agent-runners/ash-runner.d.cts.map +1 -0
  13. package/dist/agent-runners/ash-runner.d.mts +30 -0
  14. package/dist/agent-runners/ash-runner.d.mts.map +1 -0
  15. package/dist/agent-runners/ash-runner.mjs +273 -0
  16. package/dist/agent-runners/ash-runner.mjs.map +1 -0
  17. package/dist/agent-runners/budget.cjs +71 -0
  18. package/dist/agent-runners/budget.d.cts +40 -0
  19. package/dist/agent-runners/budget.d.cts.map +1 -0
  20. package/dist/agent-runners/budget.d.mts +40 -0
  21. package/dist/agent-runners/budget.d.mts.map +1 -0
  22. package/dist/agent-runners/budget.mjs +67 -0
  23. package/dist/agent-runners/budget.mjs.map +1 -0
  24. package/dist/agent-runners/code-runner.cjs +61 -0
  25. package/dist/agent-runners/code-runner.mjs +61 -0
  26. package/dist/agent-runners/code-runner.mjs.map +1 -0
  27. package/dist/agent-runners/env-whitelist.cjs +36 -0
  28. package/dist/agent-runners/env-whitelist.d.cts +5 -0
  29. package/dist/agent-runners/env-whitelist.d.cts.map +1 -0
  30. package/dist/agent-runners/env-whitelist.d.mts +5 -0
  31. package/dist/agent-runners/env-whitelist.d.mts.map +1 -0
  32. package/dist/agent-runners/env-whitelist.mjs +36 -0
  33. package/dist/agent-runners/env-whitelist.mjs.map +1 -0
  34. package/dist/agent-runners/guide-rails.cjs +47 -0
  35. package/dist/agent-runners/guide-rails.d.cts +16 -0
  36. package/dist/agent-runners/guide-rails.d.cts.map +1 -0
  37. package/dist/agent-runners/guide-rails.d.mts +16 -0
  38. package/dist/agent-runners/guide-rails.d.mts.map +1 -0
  39. package/dist/agent-runners/guide-rails.mjs +48 -0
  40. package/dist/agent-runners/guide-rails.mjs.map +1 -0
  41. package/dist/agent-runners/hook-channel.cjs +55 -0
  42. package/dist/agent-runners/hook-channel.d.cts +38 -0
  43. package/dist/agent-runners/hook-channel.d.cts.map +1 -0
  44. package/dist/agent-runners/hook-channel.d.mts +38 -0
  45. package/dist/agent-runners/hook-channel.d.mts.map +1 -0
  46. package/dist/agent-runners/hook-channel.mjs +55 -0
  47. package/dist/agent-runners/hook-channel.mjs.map +1 -0
  48. package/dist/agent-runners/hooks.cjs +107 -0
  49. package/dist/agent-runners/hooks.d.cts +41 -0
  50. package/dist/agent-runners/hooks.d.cts.map +1 -0
  51. package/dist/agent-runners/hooks.d.mts +41 -0
  52. package/dist/agent-runners/hooks.d.mts.map +1 -0
  53. package/dist/agent-runners/hooks.mjs +107 -0
  54. package/dist/agent-runners/hooks.mjs.map +1 -0
  55. package/dist/agent-runners/memory-afs.cjs +342 -0
  56. package/dist/agent-runners/memory-afs.d.cts +221 -0
  57. package/dist/agent-runners/memory-afs.d.cts.map +1 -0
  58. package/dist/agent-runners/memory-afs.d.mts +221 -0
  59. package/dist/agent-runners/memory-afs.d.mts.map +1 -0
  60. package/dist/agent-runners/memory-afs.mjs +326 -0
  61. package/dist/agent-runners/memory-afs.mjs.map +1 -0
  62. package/dist/agent-runners/memory-archive.cjs +263 -0
  63. package/dist/agent-runners/memory-archive.d.cts +47 -0
  64. package/dist/agent-runners/memory-archive.d.cts.map +1 -0
  65. package/dist/agent-runners/memory-archive.d.mts +47 -0
  66. package/dist/agent-runners/memory-archive.d.mts.map +1 -0
  67. package/dist/agent-runners/memory-archive.mjs +257 -0
  68. package/dist/agent-runners/memory-archive.mjs.map +1 -0
  69. package/dist/agent-runners/orchestrator-runner.cjs +302 -0
  70. package/dist/agent-runners/orchestrator-runner.d.cts +23 -0
  71. package/dist/agent-runners/orchestrator-runner.d.cts.map +1 -0
  72. package/dist/agent-runners/orchestrator-runner.d.mts +23 -0
  73. package/dist/agent-runners/orchestrator-runner.d.mts.map +1 -0
  74. package/dist/agent-runners/orchestrator-runner.mjs +303 -0
  75. package/dist/agent-runners/orchestrator-runner.mjs.map +1 -0
  76. package/dist/agent-runners/orchestrator-state.cjs +68 -0
  77. package/dist/agent-runners/orchestrator-state.d.cts +23 -0
  78. package/dist/agent-runners/orchestrator-state.d.cts.map +1 -0
  79. package/dist/agent-runners/orchestrator-state.d.mts +23 -0
  80. package/dist/agent-runners/orchestrator-state.d.mts.map +1 -0
  81. package/dist/agent-runners/orchestrator-state.mjs +65 -0
  82. package/dist/agent-runners/orchestrator-state.mjs.map +1 -0
  83. package/dist/agent-runners/retry.cjs +30 -0
  84. package/dist/agent-runners/retry.d.cts +13 -0
  85. package/dist/agent-runners/retry.d.cts.map +1 -0
  86. package/dist/agent-runners/retry.d.mts +13 -0
  87. package/dist/agent-runners/retry.d.mts.map +1 -0
  88. package/dist/agent-runners/retry.mjs +30 -0
  89. package/dist/agent-runners/retry.mjs.map +1 -0
  90. package/dist/agent-runners/scratchpad-afs.cjs +276 -0
  91. package/dist/agent-runners/scratchpad-afs.d.cts +103 -0
  92. package/dist/agent-runners/scratchpad-afs.d.cts.map +1 -0
  93. package/dist/agent-runners/scratchpad-afs.d.mts +103 -0
  94. package/dist/agent-runners/scratchpad-afs.d.mts.map +1 -0
  95. package/dist/agent-runners/scratchpad-afs.mjs +271 -0
  96. package/dist/agent-runners/scratchpad-afs.mjs.map +1 -0
  97. package/dist/agent-runners/stream-router.cjs +72 -0
  98. package/dist/agent-runners/stream-router.d.cts +22 -0
  99. package/dist/agent-runners/stream-router.d.cts.map +1 -0
  100. package/dist/agent-runners/stream-router.d.mts +22 -0
  101. package/dist/agent-runners/stream-router.d.mts.map +1 -0
  102. package/dist/agent-runners/stream-router.mjs +72 -0
  103. package/dist/agent-runners/stream-router.mjs.map +1 -0
  104. package/dist/agent-runners/system-prompt.cjs +35 -0
  105. package/dist/agent-runners/system-prompt.d.cts +17 -0
  106. package/dist/agent-runners/system-prompt.d.cts.map +1 -0
  107. package/dist/agent-runners/system-prompt.d.mts +17 -0
  108. package/dist/agent-runners/system-prompt.d.mts.map +1 -0
  109. package/dist/agent-runners/system-prompt.mjs +34 -0
  110. package/dist/agent-runners/system-prompt.mjs.map +1 -0
  111. package/dist/agent-runners/team-modes/aggregates.cjs +36 -0
  112. package/dist/agent-runners/team-modes/aggregates.mjs +35 -0
  113. package/dist/agent-runners/team-modes/aggregates.mjs.map +1 -0
  114. package/dist/agent-runners/team-modes/iterate.cjs +46 -0
  115. package/dist/agent-runners/team-modes/iterate.mjs +47 -0
  116. package/dist/agent-runners/team-modes/iterate.mjs.map +1 -0
  117. package/dist/agent-runners/team-modes/parallel.cjs +59 -0
  118. package/dist/agent-runners/team-modes/parallel.mjs +60 -0
  119. package/dist/agent-runners/team-modes/parallel.mjs.map +1 -0
  120. package/dist/agent-runners/team-modes/reflection.cjs +155 -0
  121. package/dist/agent-runners/team-modes/reflection.mjs +156 -0
  122. package/dist/agent-runners/team-modes/reflection.mjs.map +1 -0
  123. package/dist/agent-runners/team-modes/sequential.cjs +63 -0
  124. package/dist/agent-runners/team-modes/sequential.mjs +64 -0
  125. package/dist/agent-runners/team-modes/sequential.mjs.map +1 -0
  126. package/dist/agent-runners/team-modes/utils.cjs +39 -0
  127. package/dist/agent-runners/team-modes/utils.mjs +36 -0
  128. package/dist/agent-runners/team-modes/utils.mjs.map +1 -0
  129. package/dist/agent-runners/team-runner.cjs +277 -0
  130. package/dist/agent-runners/team-runner.d.cts +34 -0
  131. package/dist/agent-runners/team-runner.d.cts.map +1 -0
  132. package/dist/agent-runners/team-runner.d.mts +34 -0
  133. package/dist/agent-runners/team-runner.d.mts.map +1 -0
  134. package/dist/agent-runners/team-runner.mjs +278 -0
  135. package/dist/agent-runners/team-runner.mjs.map +1 -0
  136. package/dist/agent-runners/template-context.cjs +32 -0
  137. package/dist/agent-runners/template-context.d.cts +43 -0
  138. package/dist/agent-runners/template-context.d.cts.map +1 -0
  139. package/dist/agent-runners/template-context.d.mts +43 -0
  140. package/dist/agent-runners/template-context.d.mts.map +1 -0
  141. package/dist/agent-runners/template-context.mjs +33 -0
  142. package/dist/agent-runners/template-context.mjs.map +1 -0
  143. package/dist/index.cjs +123 -0
  144. package/dist/index.d.cts +29 -0
  145. package/dist/index.d.mts +29 -0
  146. package/dist/index.mjs +29 -0
  147. package/dist/program/agent-action.cjs +496 -0
  148. package/dist/program/agent-action.d.cts +42 -0
  149. package/dist/program/agent-action.d.cts.map +1 -0
  150. package/dist/program/agent-action.d.mts +42 -0
  151. package/dist/program/agent-action.d.mts.map +1 -0
  152. package/dist/program/agent-action.mjs +497 -0
  153. package/dist/program/agent-action.mjs.map +1 -0
  154. package/dist/program/agent-messages-tools.cjs +137 -0
  155. package/dist/program/agent-messages-tools.d.cts +59 -0
  156. package/dist/program/agent-messages-tools.d.cts.map +1 -0
  157. package/dist/program/agent-messages-tools.d.mts +59 -0
  158. package/dist/program/agent-messages-tools.d.mts.map +1 -0
  159. package/dist/program/agent-messages-tools.mjs +130 -0
  160. package/dist/program/agent-messages-tools.mjs.map +1 -0
  161. package/dist/program/agent-runner-registry.cjs +314 -0
  162. package/dist/program/agent-runner-registry.d.cts +52 -0
  163. package/dist/program/agent-runner-registry.d.cts.map +1 -0
  164. package/dist/program/agent-runner-registry.d.mts +52 -0
  165. package/dist/program/agent-runner-registry.d.mts.map +1 -0
  166. package/dist/program/agent-runner-registry.mjs +313 -0
  167. package/dist/program/agent-runner-registry.mjs.map +1 -0
  168. package/dist/program/agent-subscribe.cjs +72 -0
  169. package/dist/program/agent-subscribe.d.cts +18 -0
  170. package/dist/program/agent-subscribe.d.cts.map +1 -0
  171. package/dist/program/agent-subscribe.d.mts +18 -0
  172. package/dist/program/agent-subscribe.d.mts.map +1 -0
  173. package/dist/program/agent-subscribe.mjs +73 -0
  174. package/dist/program/agent-subscribe.mjs.map +1 -0
  175. package/dist/program/agent-tools.cjs +135 -0
  176. package/dist/program/agent-tools.d.cts +35 -0
  177. package/dist/program/agent-tools.d.cts.map +1 -0
  178. package/dist/program/agent-tools.d.mts +35 -0
  179. package/dist/program/agent-tools.d.mts.map +1 -0
  180. package/dist/program/agent-tools.mjs +136 -0
  181. package/dist/program/agent-tools.mjs.map +1 -0
  182. package/dist/program/manifest-nesting.cjs +57 -0
  183. package/dist/program/manifest-nesting.d.cts +13 -0
  184. package/dist/program/manifest-nesting.d.cts.map +1 -0
  185. package/dist/program/manifest-nesting.d.mts +13 -0
  186. package/dist/program/manifest-nesting.d.mts.map +1 -0
  187. package/dist/program/manifest-nesting.mjs +57 -0
  188. package/dist/program/manifest-nesting.mjs.map +1 -0
  189. package/dist/program/result-contract.cjs +55 -0
  190. package/dist/program/result-contract.d.cts +23 -0
  191. package/dist/program/result-contract.d.cts.map +1 -0
  192. package/dist/program/result-contract.d.mts +23 -0
  193. package/dist/program/result-contract.d.mts.map +1 -0
  194. package/dist/program/result-contract.mjs +51 -0
  195. package/dist/program/result-contract.mjs.map +1 -0
  196. package/dist/program/runner-error.cjs +71 -0
  197. package/dist/program/runner-error.d.cts +25 -0
  198. package/dist/program/runner-error.d.cts.map +1 -0
  199. package/dist/program/runner-error.d.mts +25 -0
  200. package/dist/program/runner-error.d.mts.map +1 -0
  201. package/dist/program/runner-error.mjs +72 -0
  202. package/dist/program/runner-error.mjs.map +1 -0
  203. package/dist/program/scoped-afs.cjs +538 -0
  204. package/dist/program/scoped-afs.d.cts +245 -0
  205. package/dist/program/scoped-afs.d.cts.map +1 -0
  206. package/dist/program/scoped-afs.d.mts +245 -0
  207. package/dist/program/scoped-afs.d.mts.map +1 -0
  208. package/dist/program/scoped-afs.mjs +531 -0
  209. package/dist/program/scoped-afs.mjs.map +1 -0
  210. package/dist/program/session-hierarchy.cjs +1 -0
  211. package/dist/program/session-hierarchy.d.cts +2 -0
  212. package/dist/program/session-hierarchy.d.mts +2 -0
  213. package/dist/program/session-hierarchy.mjs +3 -0
  214. package/dist/program/tool-discovery/ash-frontmatter.cjs +83 -0
  215. package/dist/program/tool-discovery/ash-frontmatter.d.cts +21 -0
  216. package/dist/program/tool-discovery/ash-frontmatter.d.cts.map +1 -0
  217. package/dist/program/tool-discovery/ash-frontmatter.d.mts +21 -0
  218. package/dist/program/tool-discovery/ash-frontmatter.d.mts.map +1 -0
  219. package/dist/program/tool-discovery/ash-frontmatter.mjs +84 -0
  220. package/dist/program/tool-discovery/ash-frontmatter.mjs.map +1 -0
  221. package/dist/program/tool-discovery/dot-path-resolver.cjs +60 -0
  222. package/dist/program/tool-discovery/dot-path-resolver.mjs +61 -0
  223. package/dist/program/tool-discovery/dot-path-resolver.mjs.map +1 -0
  224. package/dist/program/tool-discovery/skill-gate.cjs +36 -0
  225. package/dist/program/tool-discovery/skill-gate.d.cts +10 -0
  226. package/dist/program/tool-discovery/skill-gate.d.cts.map +1 -0
  227. package/dist/program/tool-discovery/skill-gate.d.mts +10 -0
  228. package/dist/program/tool-discovery/skill-gate.d.mts.map +1 -0
  229. package/dist/program/tool-discovery/skill-gate.mjs +35 -0
  230. package/dist/program/tool-discovery/skill-gate.mjs.map +1 -0
  231. package/dist/providers/basic/ash/dist/index.cjs +1809 -0
  232. package/dist/providers/basic/ash/dist/index.mjs +1807 -0
  233. package/dist/providers/basic/ash/dist/index.mjs.map +1 -0
  234. package/package.json +67 -0
@@ -0,0 +1,51 @@
1
+ //#region src/program/result-contract.ts
2
+ /**
3
+ * S8 — Result contract utilities.
4
+ *
5
+ * stripSubAgentMeta: separates _meta from a sub-agent result so the parent
6
+ * LLM only sees the result value, while _meta flows through onToolProgress.
7
+ *
8
+ * sanitizeScratchPath: removes absolute filesystem prefixes, keeping only the
9
+ * AFS-relative portion.
10
+ *
11
+ * sanitizeMetaEnv: redacts env var values, keeping only names.
12
+ */
13
+ function stripSubAgentMeta(data) {
14
+ if (!data || typeof data !== "object" || !("_meta" in data)) return {
15
+ result: data,
16
+ meta: null
17
+ };
18
+ const d = data;
19
+ return {
20
+ result: d.result !== void 0 ? d.result : null,
21
+ meta: d._meta ?? null
22
+ };
23
+ }
24
+ function isSubAgentResult(data) {
25
+ return !!data && typeof data === "object" && "_meta" in data;
26
+ }
27
+ function sanitizeScratchPath(raw) {
28
+ if (raw.startsWith("/instance/") || raw.startsWith("/modules/")) return raw;
29
+ for (const marker of ["/instance/", "/modules/"]) {
30
+ const idx = raw.indexOf(marker);
31
+ if (idx >= 0) return raw.slice(idx);
32
+ }
33
+ return "[redacted]";
34
+ }
35
+ function sanitizeMetaEnv(env) {
36
+ const safe = {};
37
+ for (const key of Object.keys(env)) safe[key] = "[redacted]";
38
+ return safe;
39
+ }
40
+ function isJsonSafe(value) {
41
+ try {
42
+ JSON.stringify(value);
43
+ return true;
44
+ } catch {
45
+ return false;
46
+ }
47
+ }
48
+
49
+ //#endregion
50
+ export { isJsonSafe, isSubAgentResult, sanitizeMetaEnv, sanitizeScratchPath, stripSubAgentMeta };
51
+ //# sourceMappingURL=result-contract.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-contract.mjs","names":[],"sources":["../../src/program/result-contract.ts"],"sourcesContent":["/**\n * S8 — Result contract utilities.\n *\n * stripSubAgentMeta: separates _meta from a sub-agent result so the parent\n * LLM only sees the result value, while _meta flows through onToolProgress.\n *\n * sanitizeScratchPath: removes absolute filesystem prefixes, keeping only the\n * AFS-relative portion.\n *\n * sanitizeMetaEnv: redacts env var values, keeping only names.\n */\n\nexport function stripSubAgentMeta(data: unknown): {\n result: unknown;\n meta: Record<string, unknown> | null;\n} {\n if (!data || typeof data !== \"object\" || !(\"_meta\" in (data as Record<string, unknown>))) {\n return { result: data, meta: null };\n }\n const d = data as Record<string, unknown>;\n return {\n result: d.result !== undefined ? d.result : null,\n meta: (d._meta as Record<string, unknown>) ?? null,\n };\n}\n\nexport function isSubAgentResult(data: unknown): boolean {\n return !!data && typeof data === \"object\" && \"_meta\" in (data as Record<string, unknown>);\n}\n\nexport function sanitizeScratchPath(raw: string): string {\n if (raw.startsWith(\"/instance/\") || raw.startsWith(\"/modules/\")) return raw;\n for (const marker of [\"/instance/\", \"/modules/\"]) {\n const idx = raw.indexOf(marker);\n if (idx >= 0) return raw.slice(idx);\n }\n return \"[redacted]\";\n}\n\nexport function sanitizeMetaEnv(env: Record<string, unknown>): Record<string, string> {\n const safe: Record<string, string> = {};\n for (const key of Object.keys(env)) {\n safe[key] = \"[redacted]\";\n }\n return safe;\n}\n\nexport function isJsonSafe(value: unknown): boolean {\n try {\n JSON.stringify(value);\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":";;;;;;;;;;;;AAYA,SAAgB,kBAAkB,MAGhC;AACA,KAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,EAAE,WAAY,MACrD,QAAO;EAAE,QAAQ;EAAM,MAAM;EAAM;CAErC,MAAM,IAAI;AACV,QAAO;EACL,QAAQ,EAAE,WAAW,SAAY,EAAE,SAAS;EAC5C,MAAO,EAAE,SAAqC;EAC/C;;AAGH,SAAgB,iBAAiB,MAAwB;AACvD,QAAO,CAAC,CAAC,QAAQ,OAAO,SAAS,YAAY,WAAY;;AAG3D,SAAgB,oBAAoB,KAAqB;AACvD,KAAI,IAAI,WAAW,aAAa,IAAI,IAAI,WAAW,YAAY,CAAE,QAAO;AACxE,MAAK,MAAM,UAAU,CAAC,cAAc,YAAY,EAAE;EAChD,MAAM,MAAM,IAAI,QAAQ,OAAO;AAC/B,MAAI,OAAO,EAAG,QAAO,IAAI,MAAM,IAAI;;AAErC,QAAO;;AAGT,SAAgB,gBAAgB,KAAsD;CACpF,MAAM,OAA+B,EAAE;AACvC,MAAK,MAAM,OAAO,OAAO,KAAK,IAAI,CAChC,MAAK,OAAO;AAEd,QAAO;;AAGT,SAAgB,WAAW,OAAyB;AAClD,KAAI;AACF,OAAK,UAAU,MAAM;AACrB,SAAO;SACD;AACN,SAAO"}
@@ -0,0 +1,71 @@
1
+ const require_result_contract = require('./result-contract.cjs');
2
+
3
+ //#region src/program/runner-error.ts
4
+ /**
5
+ * B2 — Normalize runner error shapes into `{ code, message, ...details }`.
6
+ *
7
+ * Runners surface failures two ways:
8
+ * 1. Return `{ success: false, error }` — structured shape varies per runner
9
+ * 2. Throw an Error — message often carries a `CODE: description` prefix
10
+ *
11
+ * Downstream consumers (MCP, LLM tool shim, E2E harness) expect:
12
+ * - `code`: SCREAMING_SNAKE string
13
+ * - `message`: human-readable string
14
+ * - extra JSON-safe detail fields preserved (member, path, depth, max, …)
15
+ */
16
+ const MAX_MESSAGE_LENGTH = 2048;
17
+ const STRUCTURED_CODE_RE = /^([A-Z][A-Z0-9_]{2,63}):\s*/;
18
+ function truncate(s) {
19
+ return s.length > MAX_MESSAGE_LENGTH ? `${s.slice(0, MAX_MESSAGE_LENGTH - 1)}…` : s;
20
+ }
21
+ function extractCodeFromMessage(message) {
22
+ const m = STRUCTURED_CODE_RE.exec(message);
23
+ return m ? m[1] : "RUNNER_ERROR";
24
+ }
25
+ function normalizeFromString(raw) {
26
+ return {
27
+ code: extractCodeFromMessage(raw),
28
+ message: truncate(raw)
29
+ };
30
+ }
31
+ function attachDepthAndMax(err, message) {
32
+ if (err.code !== "MAX_SPAWN_DEPTH_EXCEEDED") return err;
33
+ const depthMatch = message.match(/depth (\d+)/);
34
+ const maxMatch = message.match(/max (\d+)/);
35
+ if (depthMatch) err.depth = Number(depthMatch[1]);
36
+ if (maxMatch) err.max = Number(maxMatch[1]);
37
+ return err;
38
+ }
39
+ function normalizeFromErrorInstance(err) {
40
+ return attachDepthAndMax(normalizeFromString(err.message), err.message);
41
+ }
42
+ function normalizeFromObject(obj) {
43
+ const rawCode = obj.code;
44
+ const rawMsg = obj.message;
45
+ const out = {
46
+ code: typeof rawCode === "string" && STRUCTURED_CODE_RE.test(`${rawCode}:`) ? rawCode : "RUNNER_ERROR",
47
+ message: typeof rawMsg === "string" && rawMsg.length > 0 ? truncate(rawMsg) : "(no message)"
48
+ };
49
+ for (const [k, v] of Object.entries(obj)) {
50
+ if (k === "code" || k === "message") continue;
51
+ if (typeof v === "function" || typeof v === "symbol") continue;
52
+ if (!require_result_contract.isJsonSafe(v)) continue;
53
+ out[k] = v;
54
+ }
55
+ return out;
56
+ }
57
+ /**
58
+ * Coerce any error-ish value into the normalized shape.
59
+ */
60
+ function normalizeRunnerError(err) {
61
+ if (err instanceof Error) return normalizeFromErrorInstance(err);
62
+ if (typeof err === "string") return normalizeFromString(err);
63
+ if (err && typeof err === "object") return normalizeFromObject(err);
64
+ return {
65
+ code: "RUNNER_ERROR",
66
+ message: "Unknown error"
67
+ };
68
+ }
69
+
70
+ //#endregion
71
+ exports.normalizeRunnerError = normalizeRunnerError;
@@ -0,0 +1,25 @@
1
+ //#region src/program/runner-error.d.ts
2
+ /**
3
+ * B2 — Normalize runner error shapes into `{ code, message, ...details }`.
4
+ *
5
+ * Runners surface failures two ways:
6
+ * 1. Return `{ success: false, error }` — structured shape varies per runner
7
+ * 2. Throw an Error — message often carries a `CODE: description` prefix
8
+ *
9
+ * Downstream consumers (MCP, LLM tool shim, E2E harness) expect:
10
+ * - `code`: SCREAMING_SNAKE string
11
+ * - `message`: human-readable string
12
+ * - extra JSON-safe detail fields preserved (member, path, depth, max, …)
13
+ */
14
+ interface NormalizedRunnerError {
15
+ code: string;
16
+ message: string;
17
+ [key: string]: unknown;
18
+ }
19
+ /**
20
+ * Coerce any error-ish value into the normalized shape.
21
+ */
22
+ declare function normalizeRunnerError(err: unknown): NormalizedRunnerError;
23
+ //#endregion
24
+ export { NormalizedRunnerError, normalizeRunnerError };
25
+ //# sourceMappingURL=runner-error.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-error.d.cts","names":[],"sources":["../../src/program/runner-error.ts"],"mappings":";;AAmBA;;;;;;;;;AAyDA;;UAzDiB,qBAAA;EACf,IAAA;EACA,OAAA;EAAA,CACC,GAAA;AAAA;;;;iBAsDa,oBAAA,CAAqB,GAAA,YAAe,qBAAA"}
@@ -0,0 +1,25 @@
1
+ //#region src/program/runner-error.d.ts
2
+ /**
3
+ * B2 — Normalize runner error shapes into `{ code, message, ...details }`.
4
+ *
5
+ * Runners surface failures two ways:
6
+ * 1. Return `{ success: false, error }` — structured shape varies per runner
7
+ * 2. Throw an Error — message often carries a `CODE: description` prefix
8
+ *
9
+ * Downstream consumers (MCP, LLM tool shim, E2E harness) expect:
10
+ * - `code`: SCREAMING_SNAKE string
11
+ * - `message`: human-readable string
12
+ * - extra JSON-safe detail fields preserved (member, path, depth, max, …)
13
+ */
14
+ interface NormalizedRunnerError {
15
+ code: string;
16
+ message: string;
17
+ [key: string]: unknown;
18
+ }
19
+ /**
20
+ * Coerce any error-ish value into the normalized shape.
21
+ */
22
+ declare function normalizeRunnerError(err: unknown): NormalizedRunnerError;
23
+ //#endregion
24
+ export { NormalizedRunnerError, normalizeRunnerError };
25
+ //# sourceMappingURL=runner-error.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-error.d.mts","names":[],"sources":["../../src/program/runner-error.ts"],"mappings":";;AAmBA;;;;;;;;;AAyDA;;UAzDiB,qBAAA;EACf,IAAA;EACA,OAAA;EAAA,CACC,GAAA;AAAA;;;;iBAsDa,oBAAA,CAAqB,GAAA,YAAe,qBAAA"}
@@ -0,0 +1,72 @@
1
+ import { isJsonSafe } from "./result-contract.mjs";
2
+
3
+ //#region src/program/runner-error.ts
4
+ /**
5
+ * B2 — Normalize runner error shapes into `{ code, message, ...details }`.
6
+ *
7
+ * Runners surface failures two ways:
8
+ * 1. Return `{ success: false, error }` — structured shape varies per runner
9
+ * 2. Throw an Error — message often carries a `CODE: description` prefix
10
+ *
11
+ * Downstream consumers (MCP, LLM tool shim, E2E harness) expect:
12
+ * - `code`: SCREAMING_SNAKE string
13
+ * - `message`: human-readable string
14
+ * - extra JSON-safe detail fields preserved (member, path, depth, max, …)
15
+ */
16
+ const MAX_MESSAGE_LENGTH = 2048;
17
+ const STRUCTURED_CODE_RE = /^([A-Z][A-Z0-9_]{2,63}):\s*/;
18
+ function truncate(s) {
19
+ return s.length > MAX_MESSAGE_LENGTH ? `${s.slice(0, MAX_MESSAGE_LENGTH - 1)}…` : s;
20
+ }
21
+ function extractCodeFromMessage(message) {
22
+ const m = STRUCTURED_CODE_RE.exec(message);
23
+ return m ? m[1] : "RUNNER_ERROR";
24
+ }
25
+ function normalizeFromString(raw) {
26
+ return {
27
+ code: extractCodeFromMessage(raw),
28
+ message: truncate(raw)
29
+ };
30
+ }
31
+ function attachDepthAndMax(err, message) {
32
+ if (err.code !== "MAX_SPAWN_DEPTH_EXCEEDED") return err;
33
+ const depthMatch = message.match(/depth (\d+)/);
34
+ const maxMatch = message.match(/max (\d+)/);
35
+ if (depthMatch) err.depth = Number(depthMatch[1]);
36
+ if (maxMatch) err.max = Number(maxMatch[1]);
37
+ return err;
38
+ }
39
+ function normalizeFromErrorInstance(err) {
40
+ return attachDepthAndMax(normalizeFromString(err.message), err.message);
41
+ }
42
+ function normalizeFromObject(obj) {
43
+ const rawCode = obj.code;
44
+ const rawMsg = obj.message;
45
+ const out = {
46
+ code: typeof rawCode === "string" && STRUCTURED_CODE_RE.test(`${rawCode}:`) ? rawCode : "RUNNER_ERROR",
47
+ message: typeof rawMsg === "string" && rawMsg.length > 0 ? truncate(rawMsg) : "(no message)"
48
+ };
49
+ for (const [k, v] of Object.entries(obj)) {
50
+ if (k === "code" || k === "message") continue;
51
+ if (typeof v === "function" || typeof v === "symbol") continue;
52
+ if (!isJsonSafe(v)) continue;
53
+ out[k] = v;
54
+ }
55
+ return out;
56
+ }
57
+ /**
58
+ * Coerce any error-ish value into the normalized shape.
59
+ */
60
+ function normalizeRunnerError(err) {
61
+ if (err instanceof Error) return normalizeFromErrorInstance(err);
62
+ if (typeof err === "string") return normalizeFromString(err);
63
+ if (err && typeof err === "object") return normalizeFromObject(err);
64
+ return {
65
+ code: "RUNNER_ERROR",
66
+ message: "Unknown error"
67
+ };
68
+ }
69
+
70
+ //#endregion
71
+ export { normalizeRunnerError };
72
+ //# sourceMappingURL=runner-error.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-error.mjs","names":[],"sources":["../../src/program/runner-error.ts"],"sourcesContent":["/**\n * B2 — Normalize runner error shapes into `{ code, message, ...details }`.\n *\n * Runners surface failures two ways:\n * 1. Return `{ success: false, error }` — structured shape varies per runner\n * 2. Throw an Error — message often carries a `CODE: description` prefix\n *\n * Downstream consumers (MCP, LLM tool shim, E2E harness) expect:\n * - `code`: SCREAMING_SNAKE string\n * - `message`: human-readable string\n * - extra JSON-safe detail fields preserved (member, path, depth, max, …)\n */\n\nimport { isJsonSafe } from \"./result-contract.js\";\n\nconst MAX_MESSAGE_LENGTH = 2048;\n// A code looks like SCREAMING_SNAKE at start of string, terminated by \":\".\nconst STRUCTURED_CODE_RE = /^([A-Z][A-Z0-9_]{2,63}):\\s*/;\n\nexport interface NormalizedRunnerError {\n code: string;\n message: string;\n [key: string]: unknown;\n}\n\nfunction truncate(s: string): string {\n return s.length > MAX_MESSAGE_LENGTH ? `${s.slice(0, MAX_MESSAGE_LENGTH - 1)}…` : s;\n}\n\nfunction extractCodeFromMessage(message: string): string {\n const m = STRUCTURED_CODE_RE.exec(message);\n return m ? m[1]! : \"RUNNER_ERROR\";\n}\n\nfunction normalizeFromString(raw: string): NormalizedRunnerError {\n return { code: extractCodeFromMessage(raw), message: truncate(raw) };\n}\n\nfunction attachDepthAndMax(err: NormalizedRunnerError, message: string): NormalizedRunnerError {\n if (err.code !== \"MAX_SPAWN_DEPTH_EXCEEDED\") return err;\n const depthMatch = message.match(/depth (\\d+)/);\n const maxMatch = message.match(/max (\\d+)/);\n if (depthMatch) err.depth = Number(depthMatch[1]);\n if (maxMatch) err.max = Number(maxMatch[1]);\n return err;\n}\n\nfunction normalizeFromErrorInstance(err: Error): NormalizedRunnerError {\n const shaped = normalizeFromString(err.message);\n return attachDepthAndMax(shaped, err.message);\n}\n\nfunction normalizeFromObject(obj: Record<string, unknown>): NormalizedRunnerError {\n const rawCode = obj.code;\n const rawMsg = obj.message;\n\n const code =\n typeof rawCode === \"string\" && STRUCTURED_CODE_RE.test(`${rawCode}:`)\n ? rawCode\n : \"RUNNER_ERROR\";\n const message =\n typeof rawMsg === \"string\" && rawMsg.length > 0 ? truncate(rawMsg) : \"(no message)\";\n\n const out: NormalizedRunnerError = { code, message };\n for (const [k, v] of Object.entries(obj)) {\n if (k === \"code\" || k === \"message\") continue;\n if (typeof v === \"function\" || typeof v === \"symbol\") continue;\n if (!isJsonSafe(v)) continue;\n out[k] = v;\n }\n return out;\n}\n\n/**\n * Coerce any error-ish value into the normalized shape.\n */\nexport function normalizeRunnerError(err: unknown): NormalizedRunnerError {\n if (err instanceof Error) return normalizeFromErrorInstance(err);\n if (typeof err === \"string\") return normalizeFromString(err);\n if (err && typeof err === \"object\") return normalizeFromObject(err as Record<string, unknown>);\n return { code: \"RUNNER_ERROR\", message: \"Unknown error\" };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,MAAM,qBAAqB;AAE3B,MAAM,qBAAqB;AAQ3B,SAAS,SAAS,GAAmB;AACnC,QAAO,EAAE,SAAS,qBAAqB,GAAG,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAAC,KAAK;;AAGpF,SAAS,uBAAuB,SAAyB;CACvD,MAAM,IAAI,mBAAmB,KAAK,QAAQ;AAC1C,QAAO,IAAI,EAAE,KAAM;;AAGrB,SAAS,oBAAoB,KAAoC;AAC/D,QAAO;EAAE,MAAM,uBAAuB,IAAI;EAAE,SAAS,SAAS,IAAI;EAAE;;AAGtE,SAAS,kBAAkB,KAA4B,SAAwC;AAC7F,KAAI,IAAI,SAAS,2BAA4B,QAAO;CACpD,MAAM,aAAa,QAAQ,MAAM,cAAc;CAC/C,MAAM,WAAW,QAAQ,MAAM,YAAY;AAC3C,KAAI,WAAY,KAAI,QAAQ,OAAO,WAAW,GAAG;AACjD,KAAI,SAAU,KAAI,MAAM,OAAO,SAAS,GAAG;AAC3C,QAAO;;AAGT,SAAS,2BAA2B,KAAmC;AAErE,QAAO,kBADQ,oBAAoB,IAAI,QAAQ,EACd,IAAI,QAAQ;;AAG/C,SAAS,oBAAoB,KAAqD;CAChF,MAAM,UAAU,IAAI;CACpB,MAAM,SAAS,IAAI;CASnB,MAAM,MAA6B;EAAE,MANnC,OAAO,YAAY,YAAY,mBAAmB,KAAK,GAAG,QAAQ,GAAG,GACjE,UACA;EAIqC,SAFzC,OAAO,WAAW,YAAY,OAAO,SAAS,IAAI,SAAS,OAAO,GAAG;EAEnB;AACpD,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,IAAI,EAAE;AACxC,MAAI,MAAM,UAAU,MAAM,UAAW;AACrC,MAAI,OAAO,MAAM,cAAc,OAAO,MAAM,SAAU;AACtD,MAAI,CAAC,WAAW,EAAE,CAAE;AACpB,MAAI,KAAK;;AAEX,QAAO;;;;;AAMT,SAAgB,qBAAqB,KAAqC;AACxE,KAAI,eAAe,MAAO,QAAO,2BAA2B,IAAI;AAChE,KAAI,OAAO,QAAQ,SAAU,QAAO,oBAAoB,IAAI;AAC5D,KAAI,OAAO,OAAO,QAAQ,SAAU,QAAO,oBAAoB,IAA+B;AAC9F,QAAO;EAAE,MAAM;EAAgB,SAAS;EAAiB"}