@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,71 @@
1
+
2
+ //#region src/agent-runners/budget.ts
3
+ /**
4
+ * S11 — Budget hierarchy.
5
+ *
6
+ * Budget flows: manifest default → caller _budget_override (only narrowing) →
7
+ * parent remaining is hard upper bound.
8
+ */
9
+ const MAX_ROUNDS_HARD_CAP = 50;
10
+ const DEFAULT_MAX_ROUNDS = 6;
11
+ const DEFAULT_TOTAL_TOKENS = 8e4;
12
+ function resolveBudget(opts) {
13
+ const warnings = [];
14
+ let maxRounds = opts.manifest?.maxRounds ?? DEFAULT_MAX_ROUNDS;
15
+ let totalTokens = opts.manifest?.totalTokens ?? DEFAULT_TOTAL_TOKENS;
16
+ if (maxRounds > MAX_ROUNDS_HARD_CAP) throw new Error(`BUDGET_INVALID: max_rounds ${maxRounds} exceeds hard cap ${MAX_ROUNDS_HARD_CAP}`);
17
+ if (opts.callerOverride) {
18
+ const ov = opts.callerOverride;
19
+ if (ov.maxRounds != null) {
20
+ if (ov.maxRounds < 0) throw new Error("BUDGET_INVALID: negative max_rounds");
21
+ if (ov.maxRounds <= maxRounds) maxRounds = ov.maxRounds;
22
+ else warnings.push({
23
+ code: "BUDGET_OVERRIDE_CLAMPED",
24
+ message: `Requested max_rounds ${ov.maxRounds} clamped to manifest ${maxRounds}`
25
+ });
26
+ }
27
+ if (ov.totalTokens != null) {
28
+ if (ov.totalTokens < 0) throw new Error("BUDGET_INVALID: negative total_tokens");
29
+ if (ov.totalTokens <= totalTokens) totalTokens = ov.totalTokens;
30
+ else warnings.push({
31
+ code: "BUDGET_OVERRIDE_CLAMPED",
32
+ message: `Requested total_tokens ${ov.totalTokens} clamped to manifest ${totalTokens}`
33
+ });
34
+ }
35
+ }
36
+ if (opts.parentRemaining != null && opts.parentRemaining < totalTokens) totalTokens = opts.parentRemaining;
37
+ return {
38
+ maxRounds,
39
+ totalTokens,
40
+ warnings
41
+ };
42
+ }
43
+ function createBudgetTracker(budget) {
44
+ const ac = new AbortController();
45
+ let used = 0;
46
+ return {
47
+ maxTokens: budget.totalTokens,
48
+ maxRounds: budget.maxRounds,
49
+ get used() {
50
+ return used;
51
+ },
52
+ get remaining() {
53
+ return budget.totalTokens - used;
54
+ },
55
+ signal: ac.signal,
56
+ consumeTokens(tokens) {
57
+ used += tokens;
58
+ if (used >= budget.totalTokens) ac.abort();
59
+ },
60
+ isExhausted() {
61
+ return used >= budget.totalTokens;
62
+ }
63
+ };
64
+ }
65
+
66
+ //#endregion
67
+ exports.DEFAULT_MAX_ROUNDS = DEFAULT_MAX_ROUNDS;
68
+ exports.DEFAULT_TOTAL_TOKENS = DEFAULT_TOTAL_TOKENS;
69
+ exports.MAX_ROUNDS_HARD_CAP = MAX_ROUNDS_HARD_CAP;
70
+ exports.createBudgetTracker = createBudgetTracker;
71
+ exports.resolveBudget = resolveBudget;
@@ -0,0 +1,40 @@
1
+ //#region src/agent-runners/budget.d.ts
2
+ /**
3
+ * S11 — Budget hierarchy.
4
+ *
5
+ * Budget flows: manifest default → caller _budget_override (only narrowing) →
6
+ * parent remaining is hard upper bound.
7
+ */
8
+ declare const MAX_ROUNDS_HARD_CAP = 50;
9
+ declare const DEFAULT_MAX_ROUNDS = 6;
10
+ declare const DEFAULT_TOTAL_TOKENS = 80000;
11
+ interface BudgetConfig {
12
+ maxRounds?: number;
13
+ totalTokens?: number;
14
+ }
15
+ interface ResolvedBudget {
16
+ maxRounds: number;
17
+ totalTokens: number;
18
+ warnings: Array<{
19
+ code: string;
20
+ message: string;
21
+ }>;
22
+ }
23
+ declare function resolveBudget(opts: {
24
+ manifest?: BudgetConfig;
25
+ callerOverride?: BudgetConfig;
26
+ parentRemaining?: number;
27
+ }): ResolvedBudget;
28
+ interface BudgetTracker {
29
+ readonly maxTokens: number;
30
+ readonly maxRounds: number;
31
+ readonly used: number;
32
+ readonly remaining: number;
33
+ readonly signal: AbortSignal;
34
+ consumeTokens(tokens: number): void;
35
+ isExhausted(): boolean;
36
+ }
37
+ declare function createBudgetTracker(budget: ResolvedBudget): BudgetTracker;
38
+ //#endregion
39
+ export { BudgetConfig, BudgetTracker, DEFAULT_MAX_ROUNDS, DEFAULT_TOTAL_TOKENS, MAX_ROUNDS_HARD_CAP, ResolvedBudget, createBudgetTracker, resolveBudget };
40
+ //# sourceMappingURL=budget.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.cts","names":[],"sources":["../../src/agent-runners/budget.ts"],"mappings":";;AAOA;;;;;cAAa,mBAAA;AAAA,cACA,kBAAA;AAAA,cACA,oBAAA;AAAA,UAEI,YAAA;EACf,SAAA;EACA,WAAA;AAAA;AAAA,UAGe,cAAA;EACf,SAAA;EACA,WAAA;EACA,QAAA,EAAU,KAAA;IAAQ,IAAA;IAAc,OAAA;EAAA;AAAA;AAAA,iBAGlB,aAAA,CAAc,IAAA;EAC5B,QAAA,GAAW,YAAA;EACX,cAAA,GAAiB,YAAA;EACjB,eAAA;AAAA,IACE,cAAA;AAAA,UAmDa,aAAA;EAAA,SACN,SAAA;EAAA,SACA,SAAA;EAAA,SACA,IAAA;EAAA,SACA,SAAA;EAAA,SACA,MAAA,EAAQ,WAAA;EACjB,aAAA,CAAc,MAAA;EACd,WAAA;AAAA;AAAA,iBAGc,mBAAA,CAAoB,MAAA,EAAQ,cAAA,GAAiB,aAAA"}
@@ -0,0 +1,40 @@
1
+ //#region src/agent-runners/budget.d.ts
2
+ /**
3
+ * S11 — Budget hierarchy.
4
+ *
5
+ * Budget flows: manifest default → caller _budget_override (only narrowing) →
6
+ * parent remaining is hard upper bound.
7
+ */
8
+ declare const MAX_ROUNDS_HARD_CAP = 50;
9
+ declare const DEFAULT_MAX_ROUNDS = 6;
10
+ declare const DEFAULT_TOTAL_TOKENS = 80000;
11
+ interface BudgetConfig {
12
+ maxRounds?: number;
13
+ totalTokens?: number;
14
+ }
15
+ interface ResolvedBudget {
16
+ maxRounds: number;
17
+ totalTokens: number;
18
+ warnings: Array<{
19
+ code: string;
20
+ message: string;
21
+ }>;
22
+ }
23
+ declare function resolveBudget(opts: {
24
+ manifest?: BudgetConfig;
25
+ callerOverride?: BudgetConfig;
26
+ parentRemaining?: number;
27
+ }): ResolvedBudget;
28
+ interface BudgetTracker {
29
+ readonly maxTokens: number;
30
+ readonly maxRounds: number;
31
+ readonly used: number;
32
+ readonly remaining: number;
33
+ readonly signal: AbortSignal;
34
+ consumeTokens(tokens: number): void;
35
+ isExhausted(): boolean;
36
+ }
37
+ declare function createBudgetTracker(budget: ResolvedBudget): BudgetTracker;
38
+ //#endregion
39
+ export { BudgetConfig, BudgetTracker, DEFAULT_MAX_ROUNDS, DEFAULT_TOTAL_TOKENS, MAX_ROUNDS_HARD_CAP, ResolvedBudget, createBudgetTracker, resolveBudget };
40
+ //# sourceMappingURL=budget.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.mts","names":[],"sources":["../../src/agent-runners/budget.ts"],"mappings":";;AAOA;;;;;cAAa,mBAAA;AAAA,cACA,kBAAA;AAAA,cACA,oBAAA;AAAA,UAEI,YAAA;EACf,SAAA;EACA,WAAA;AAAA;AAAA,UAGe,cAAA;EACf,SAAA;EACA,WAAA;EACA,QAAA,EAAU,KAAA;IAAQ,IAAA;IAAc,OAAA;EAAA;AAAA;AAAA,iBAGlB,aAAA,CAAc,IAAA;EAC5B,QAAA,GAAW,YAAA;EACX,cAAA,GAAiB,YAAA;EACjB,eAAA;AAAA,IACE,cAAA;AAAA,UAmDa,aAAA;EAAA,SACN,SAAA;EAAA,SACA,SAAA;EAAA,SACA,IAAA;EAAA,SACA,SAAA;EAAA,SACA,MAAA,EAAQ,WAAA;EACjB,aAAA,CAAc,MAAA;EACd,WAAA;AAAA;AAAA,iBAGc,mBAAA,CAAoB,MAAA,EAAQ,cAAA,GAAiB,aAAA"}
@@ -0,0 +1,67 @@
1
+ //#region src/agent-runners/budget.ts
2
+ /**
3
+ * S11 — Budget hierarchy.
4
+ *
5
+ * Budget flows: manifest default → caller _budget_override (only narrowing) →
6
+ * parent remaining is hard upper bound.
7
+ */
8
+ const MAX_ROUNDS_HARD_CAP = 50;
9
+ const DEFAULT_MAX_ROUNDS = 6;
10
+ const DEFAULT_TOTAL_TOKENS = 8e4;
11
+ function resolveBudget(opts) {
12
+ const warnings = [];
13
+ let maxRounds = opts.manifest?.maxRounds ?? DEFAULT_MAX_ROUNDS;
14
+ let totalTokens = opts.manifest?.totalTokens ?? DEFAULT_TOTAL_TOKENS;
15
+ if (maxRounds > MAX_ROUNDS_HARD_CAP) throw new Error(`BUDGET_INVALID: max_rounds ${maxRounds} exceeds hard cap ${MAX_ROUNDS_HARD_CAP}`);
16
+ if (opts.callerOverride) {
17
+ const ov = opts.callerOverride;
18
+ if (ov.maxRounds != null) {
19
+ if (ov.maxRounds < 0) throw new Error("BUDGET_INVALID: negative max_rounds");
20
+ if (ov.maxRounds <= maxRounds) maxRounds = ov.maxRounds;
21
+ else warnings.push({
22
+ code: "BUDGET_OVERRIDE_CLAMPED",
23
+ message: `Requested max_rounds ${ov.maxRounds} clamped to manifest ${maxRounds}`
24
+ });
25
+ }
26
+ if (ov.totalTokens != null) {
27
+ if (ov.totalTokens < 0) throw new Error("BUDGET_INVALID: negative total_tokens");
28
+ if (ov.totalTokens <= totalTokens) totalTokens = ov.totalTokens;
29
+ else warnings.push({
30
+ code: "BUDGET_OVERRIDE_CLAMPED",
31
+ message: `Requested total_tokens ${ov.totalTokens} clamped to manifest ${totalTokens}`
32
+ });
33
+ }
34
+ }
35
+ if (opts.parentRemaining != null && opts.parentRemaining < totalTokens) totalTokens = opts.parentRemaining;
36
+ return {
37
+ maxRounds,
38
+ totalTokens,
39
+ warnings
40
+ };
41
+ }
42
+ function createBudgetTracker(budget) {
43
+ const ac = new AbortController();
44
+ let used = 0;
45
+ return {
46
+ maxTokens: budget.totalTokens,
47
+ maxRounds: budget.maxRounds,
48
+ get used() {
49
+ return used;
50
+ },
51
+ get remaining() {
52
+ return budget.totalTokens - used;
53
+ },
54
+ signal: ac.signal,
55
+ consumeTokens(tokens) {
56
+ used += tokens;
57
+ if (used >= budget.totalTokens) ac.abort();
58
+ },
59
+ isExhausted() {
60
+ return used >= budget.totalTokens;
61
+ }
62
+ };
63
+ }
64
+
65
+ //#endregion
66
+ export { DEFAULT_MAX_ROUNDS, DEFAULT_TOTAL_TOKENS, MAX_ROUNDS_HARD_CAP, createBudgetTracker, resolveBudget };
67
+ //# sourceMappingURL=budget.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.mjs","names":[],"sources":["../../src/agent-runners/budget.ts"],"sourcesContent":["/**\n * S11 — Budget hierarchy.\n *\n * Budget flows: manifest default → caller _budget_override (only narrowing) →\n * parent remaining is hard upper bound.\n */\n\nexport const MAX_ROUNDS_HARD_CAP = 50;\nexport const DEFAULT_MAX_ROUNDS = 6;\nexport const DEFAULT_TOTAL_TOKENS = 80_000;\n\nexport interface BudgetConfig {\n maxRounds?: number;\n totalTokens?: number;\n}\n\nexport interface ResolvedBudget {\n maxRounds: number;\n totalTokens: number;\n warnings: Array<{ code: string; message: string }>;\n}\n\nexport function resolveBudget(opts: {\n manifest?: BudgetConfig;\n callerOverride?: BudgetConfig;\n parentRemaining?: number;\n}): ResolvedBudget {\n const warnings: Array<{ code: string; message: string }> = [];\n\n let maxRounds = opts.manifest?.maxRounds ?? DEFAULT_MAX_ROUNDS;\n let totalTokens = opts.manifest?.totalTokens ?? DEFAULT_TOTAL_TOKENS;\n\n if (maxRounds > MAX_ROUNDS_HARD_CAP) {\n throw new Error(\n `BUDGET_INVALID: max_rounds ${maxRounds} exceeds hard cap ${MAX_ROUNDS_HARD_CAP}`,\n );\n }\n\n if (opts.callerOverride) {\n const ov = opts.callerOverride;\n\n if (ov.maxRounds != null) {\n if (ov.maxRounds < 0) {\n throw new Error(\"BUDGET_INVALID: negative max_rounds\");\n }\n if (ov.maxRounds <= maxRounds) {\n maxRounds = ov.maxRounds;\n } else {\n warnings.push({\n code: \"BUDGET_OVERRIDE_CLAMPED\",\n message: `Requested max_rounds ${ov.maxRounds} clamped to manifest ${maxRounds}`,\n });\n }\n }\n\n if (ov.totalTokens != null) {\n if (ov.totalTokens < 0) {\n throw new Error(\"BUDGET_INVALID: negative total_tokens\");\n }\n if (ov.totalTokens <= totalTokens) {\n totalTokens = ov.totalTokens;\n } else {\n warnings.push({\n code: \"BUDGET_OVERRIDE_CLAMPED\",\n message: `Requested total_tokens ${ov.totalTokens} clamped to manifest ${totalTokens}`,\n });\n }\n }\n }\n\n if (opts.parentRemaining != null && opts.parentRemaining < totalTokens) {\n totalTokens = opts.parentRemaining;\n }\n\n return { maxRounds, totalTokens, warnings };\n}\n\nexport interface BudgetTracker {\n readonly maxTokens: number;\n readonly maxRounds: number;\n readonly used: number;\n readonly remaining: number;\n readonly signal: AbortSignal;\n consumeTokens(tokens: number): void;\n isExhausted(): boolean;\n}\n\nexport function createBudgetTracker(budget: ResolvedBudget): BudgetTracker {\n const ac = new AbortController();\n let used = 0;\n\n return {\n maxTokens: budget.totalTokens,\n maxRounds: budget.maxRounds,\n get used() {\n return used;\n },\n get remaining() {\n return budget.totalTokens - used;\n },\n signal: ac.signal,\n consumeTokens(tokens: number) {\n used += tokens;\n if (used >= budget.totalTokens) {\n ac.abort();\n }\n },\n isExhausted() {\n return used >= budget.totalTokens;\n },\n };\n}\n"],"mappings":";;;;;;;AAOA,MAAa,sBAAsB;AACnC,MAAa,qBAAqB;AAClC,MAAa,uBAAuB;AAapC,SAAgB,cAAc,MAIX;CACjB,MAAM,WAAqD,EAAE;CAE7D,IAAI,YAAY,KAAK,UAAU,aAAa;CAC5C,IAAI,cAAc,KAAK,UAAU,eAAe;AAEhD,KAAI,YAAY,oBACd,OAAM,IAAI,MACR,8BAA8B,UAAU,oBAAoB,sBAC7D;AAGH,KAAI,KAAK,gBAAgB;EACvB,MAAM,KAAK,KAAK;AAEhB,MAAI,GAAG,aAAa,MAAM;AACxB,OAAI,GAAG,YAAY,EACjB,OAAM,IAAI,MAAM,sCAAsC;AAExD,OAAI,GAAG,aAAa,UAClB,aAAY,GAAG;OAEf,UAAS,KAAK;IACZ,MAAM;IACN,SAAS,wBAAwB,GAAG,UAAU,uBAAuB;IACtE,CAAC;;AAIN,MAAI,GAAG,eAAe,MAAM;AAC1B,OAAI,GAAG,cAAc,EACnB,OAAM,IAAI,MAAM,wCAAwC;AAE1D,OAAI,GAAG,eAAe,YACpB,eAAc,GAAG;OAEjB,UAAS,KAAK;IACZ,MAAM;IACN,SAAS,0BAA0B,GAAG,YAAY,uBAAuB;IAC1E,CAAC;;;AAKR,KAAI,KAAK,mBAAmB,QAAQ,KAAK,kBAAkB,YACzD,eAAc,KAAK;AAGrB,QAAO;EAAE;EAAW;EAAa;EAAU;;AAa7C,SAAgB,oBAAoB,QAAuC;CACzE,MAAM,KAAK,IAAI,iBAAiB;CAChC,IAAI,OAAO;AAEX,QAAO;EACL,WAAW,OAAO;EAClB,WAAW,OAAO;EAClB,IAAI,OAAO;AACT,UAAO;;EAET,IAAI,YAAY;AACd,UAAO,OAAO,cAAc;;EAE9B,QAAQ,GAAG;EACX,cAAc,QAAgB;AAC5B,WAAQ;AACR,OAAI,QAAQ,OAAO,YACjB,IAAG,OAAO;;EAGd,cAAc;AACZ,UAAO,QAAQ,OAAO;;EAEzB"}
@@ -0,0 +1,61 @@
1
+ const require_scoped_afs = require('../program/scoped-afs.cjs');
2
+ require('../program/session-hierarchy.cjs');
3
+ let ufo = require("ufo");
4
+ let _aigne_afs_agent = require("@aigne/afs-agent");
5
+
6
+ //#region src/agent-runners/code-runner.ts
7
+ const DEFAULT_CODE_AGENT_MOUNT = "/modules/code-agent";
8
+ const VALID_ENGINES = new Set([
9
+ "auto",
10
+ "claude-sdk",
11
+ "claude-cli",
12
+ "codex",
13
+ "queryFn"
14
+ ]);
15
+ function errorEnvelope(code, message) {
16
+ return {
17
+ success: false,
18
+ error: {
19
+ code,
20
+ message
21
+ }
22
+ };
23
+ }
24
+ const codeRunner = async (input, context) => {
25
+ const { manifest } = context;
26
+ const codeBlock = manifest.code;
27
+ if (!codeBlock || typeof codeBlock.engine !== "string" || codeBlock.engine.length === 0) return errorEnvelope("CODE_ENGINE_MISSING", "manifest.code.engine is required for type: code agents");
28
+ if (!VALID_ENGINES.has(codeBlock.engine)) return errorEnvelope("CODE_ENGINE_UNKNOWN", `Unknown code engine "${codeBlock.engine}" — expected one of: ${[...VALID_ENGINES].join(", ")}`);
29
+ const chain = context.chain ?? [];
30
+ (0, _aigne_afs_agent.checkSpawnDepth)(chain, manifest.maxSpawnDepth);
31
+ const { session: sessionId, parentSession } = require_scoped_afs.resolveChildSession(context.afs, context, _aigne_afs_agent.deriveChildSession);
32
+ const inputKey = manifest.inputKey ?? "message";
33
+ const prompt = String(input[inputKey] ?? "");
34
+ if (!prompt) return errorEnvelope("CODE_INPUT_MISSING", `input["${inputKey}"] is required`);
35
+ const queryPath = (0, ufo.joinURL)(codeBlock.mount ?? DEFAULT_CODE_AGENT_MOUNT, "/.actions/query");
36
+ const execArgs = { prompt };
37
+ if (codeBlock.command) execArgs.command = codeBlock.command;
38
+ for (const [key, value] of Object.entries(input)) {
39
+ if (key === inputKey) continue;
40
+ if (key.startsWith("_")) continue;
41
+ if (key in execArgs) continue;
42
+ execArgs[key] = value;
43
+ }
44
+ try {
45
+ const result = await context.afs.exec(queryPath, execArgs, {});
46
+ const data = result.data ?? {};
47
+ const meta = data._meta && typeof data._meta === "object" ? data._meta : {};
48
+ meta.session = sessionId;
49
+ meta.parent_session = parentSession;
50
+ meta.chain = [...chain, sessionId ?? "root"];
51
+ meta.engine = codeBlock.engine;
52
+ data._meta = meta;
53
+ result.data = data;
54
+ return result;
55
+ } catch (err) {
56
+ return errorEnvelope("CODE_RUN_FAILED", err instanceof Error ? err.message : String(err));
57
+ }
58
+ };
59
+
60
+ //#endregion
61
+ exports.codeRunner = codeRunner;
@@ -0,0 +1,61 @@
1
+ import { resolveChildSession } from "../program/scoped-afs.mjs";
2
+ import { checkSpawnDepth, deriveChildSession } from "../program/session-hierarchy.mjs";
3
+ import { joinURL } from "ufo";
4
+
5
+ //#region src/agent-runners/code-runner.ts
6
+ const DEFAULT_CODE_AGENT_MOUNT = "/modules/code-agent";
7
+ const VALID_ENGINES = new Set([
8
+ "auto",
9
+ "claude-sdk",
10
+ "claude-cli",
11
+ "codex",
12
+ "queryFn"
13
+ ]);
14
+ function errorEnvelope(code, message) {
15
+ return {
16
+ success: false,
17
+ error: {
18
+ code,
19
+ message
20
+ }
21
+ };
22
+ }
23
+ const codeRunner = async (input, context) => {
24
+ const { manifest } = context;
25
+ const codeBlock = manifest.code;
26
+ if (!codeBlock || typeof codeBlock.engine !== "string" || codeBlock.engine.length === 0) return errorEnvelope("CODE_ENGINE_MISSING", "manifest.code.engine is required for type: code agents");
27
+ if (!VALID_ENGINES.has(codeBlock.engine)) return errorEnvelope("CODE_ENGINE_UNKNOWN", `Unknown code engine "${codeBlock.engine}" — expected one of: ${[...VALID_ENGINES].join(", ")}`);
28
+ const chain = context.chain ?? [];
29
+ checkSpawnDepth(chain, manifest.maxSpawnDepth);
30
+ const { session: sessionId, parentSession } = resolveChildSession(context.afs, context, deriveChildSession);
31
+ const inputKey = manifest.inputKey ?? "message";
32
+ const prompt = String(input[inputKey] ?? "");
33
+ if (!prompt) return errorEnvelope("CODE_INPUT_MISSING", `input["${inputKey}"] is required`);
34
+ const queryPath = joinURL(codeBlock.mount ?? DEFAULT_CODE_AGENT_MOUNT, "/.actions/query");
35
+ const execArgs = { prompt };
36
+ if (codeBlock.command) execArgs.command = codeBlock.command;
37
+ for (const [key, value] of Object.entries(input)) {
38
+ if (key === inputKey) continue;
39
+ if (key.startsWith("_")) continue;
40
+ if (key in execArgs) continue;
41
+ execArgs[key] = value;
42
+ }
43
+ try {
44
+ const result = await context.afs.exec(queryPath, execArgs, {});
45
+ const data = result.data ?? {};
46
+ const meta = data._meta && typeof data._meta === "object" ? data._meta : {};
47
+ meta.session = sessionId;
48
+ meta.parent_session = parentSession;
49
+ meta.chain = [...chain, sessionId ?? "root"];
50
+ meta.engine = codeBlock.engine;
51
+ data._meta = meta;
52
+ result.data = data;
53
+ return result;
54
+ } catch (err) {
55
+ return errorEnvelope("CODE_RUN_FAILED", err instanceof Error ? err.message : String(err));
56
+ }
57
+ };
58
+
59
+ //#endregion
60
+ export { codeRunner };
61
+ //# sourceMappingURL=code-runner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-runner.mjs","names":[],"sources":["../../src/agent-runners/code-runner.ts"],"sourcesContent":["/**\n * Phase C1 — `code` agent runner.\n *\n * A thin wrapper that dispatches `type: code` agents to a mounted\n * `@aigne/afs-code-agent` provider via AFS-only I/O. The runner owns nothing\n * of its own: session / budget / tool projection all come from the scope\n * handed in by `projectForChild`, so the same path-based contract that\n * governs the AI, ASH, team, and orchestrator runners applies here too.\n *\n * Why so little code?\n * - The code-agent provider already exposes `/.actions/query` (stateless\n * one-shot) and `/sessions/.actions/create` (session-scoped). Re-binding\n * prompts and streaming results is the provider's job, not the runner's.\n * - Scope-first session derivation is handled by `resolveChildSession`,\n * shared with the four sibling runners. When the caller layered a\n * `projectForChild` scope on top of `ctx.afs`, its exec middleware\n * (budget, hooks) automatically runs around `ctx.afs.exec`.\n * - Phase 2 plugs a sandbox provider in *between* this runner and the\n * underlying engine (mount replacement, no runner change required).\n *\n * Unknown engine values emerge in two places: manifest parse (zod enum) and\n * runtime (when a synthetic manifest bypasses the parser). The runner guards\n * the runtime path explicitly so `CODE_ENGINE_UNKNOWN` is never silently\n * forwarded as an empty prompt.\n */\n\nimport type { AFSExecResult } from \"@aigne/afs\";\nimport { joinURL } from \"ufo\";\nimport type { RunnerContext } from \"../program/agent-runner-registry.js\";\nimport { resolveChildSession } from \"../program/scoped-afs.js\";\nimport { checkSpawnDepth, deriveChildSession } from \"../program/session-hierarchy.js\";\n\nconst DEFAULT_CODE_AGENT_MOUNT = \"/modules/code-agent\";\nconst VALID_ENGINES = new Set([\"auto\", \"claude-sdk\", \"claude-cli\", \"codex\", \"queryFn\"]);\n\ninterface CodeManifestBlock {\n engine?: string;\n mount?: string;\n command?: string;\n}\n\nfunction errorEnvelope(code: string, message: string): AFSExecResult {\n return { success: false, error: { code, message } };\n}\n\nexport const codeRunner = async (\n input: Record<string, unknown>,\n context: RunnerContext,\n): Promise<AFSExecResult> => {\n const { manifest } = context;\n const codeBlock = (manifest as { code?: CodeManifestBlock }).code;\n\n if (!codeBlock || typeof codeBlock.engine !== \"string\" || codeBlock.engine.length === 0) {\n return errorEnvelope(\n \"CODE_ENGINE_MISSING\",\n \"manifest.code.engine is required for type: code agents\",\n );\n }\n\n if (!VALID_ENGINES.has(codeBlock.engine)) {\n return errorEnvelope(\n \"CODE_ENGINE_UNKNOWN\",\n `Unknown code engine \"${codeBlock.engine}\" — expected one of: ${[...VALID_ENGINES].join(\", \")}`,\n );\n }\n\n const chain = context.chain ?? [];\n checkSpawnDepth(chain, manifest.maxSpawnDepth);\n\n const { session: sessionId, parentSession } = resolveChildSession(\n context.afs,\n context,\n deriveChildSession,\n );\n\n const inputKey = manifest.inputKey ?? \"message\";\n const prompt = String(input[inputKey] ?? \"\");\n if (!prompt) {\n return errorEnvelope(\"CODE_INPUT_MISSING\", `input[\"${inputKey}\"] is required`);\n }\n\n const mount = codeBlock.mount ?? DEFAULT_CODE_AGENT_MOUNT;\n const queryPath = joinURL(mount, \"/.actions/query\");\n\n // Only forward fields the provider understands. Environment variables\n // and internal context flags (`_chain`, `_parent_session`, etc.) must\n // not cross the provider boundary — `env-whitelist.ts` is the single\n // authority for env vars (C1 only wires through; full allowlist\n // enforcement lands in P6+).\n const execArgs: Record<string, unknown> = { prompt };\n if (codeBlock.command) execArgs.command = codeBlock.command;\n\n // Forward user-supplied scalars that aren't reserved. Mirrors `aiRunner`'s\n // pass-through behaviour so callers can hand meta fields (e.g. `priority`,\n // `cwd`) to the provider without inventing a new manifest knob.\n for (const [key, value] of Object.entries(input)) {\n if (key === inputKey) continue;\n if (key.startsWith(\"_\")) continue;\n if (key in execArgs) continue;\n execArgs[key] = value;\n }\n\n try {\n const result = await context.afs.exec!(queryPath, execArgs, {});\n const data = ((result as { data?: Record<string, unknown> }).data ?? {}) as Record<\n string,\n unknown\n >;\n const meta = (data._meta && typeof data._meta === \"object\" ? data._meta : {}) as Record<\n string,\n unknown\n >;\n meta.session = sessionId;\n meta.parent_session = parentSession;\n meta.chain = [...chain, sessionId ?? \"root\"];\n meta.engine = codeBlock.engine;\n data._meta = meta;\n (result as { data?: Record<string, unknown> }).data = data;\n return result;\n } catch (err) {\n // Provider / transport failures collapse to an error envelope so the\n // parent never sees an uncaught throw (Data-loss contract).\n const message = err instanceof Error ? err.message : String(err);\n return errorEnvelope(\"CODE_RUN_FAILED\", message);\n }\n};\n"],"mappings":";;;;;AAgCA,MAAM,2BAA2B;AACjC,MAAM,gBAAgB,IAAI,IAAI;CAAC;CAAQ;CAAc;CAAc;CAAS;CAAU,CAAC;AAQvF,SAAS,cAAc,MAAc,SAAgC;AACnE,QAAO;EAAE,SAAS;EAAO,OAAO;GAAE;GAAM;GAAS;EAAE;;AAGrD,MAAa,aAAa,OACxB,OACA,YAC2B;CAC3B,MAAM,EAAE,aAAa;CACrB,MAAM,YAAa,SAA0C;AAE7D,KAAI,CAAC,aAAa,OAAO,UAAU,WAAW,YAAY,UAAU,OAAO,WAAW,EACpF,QAAO,cACL,uBACA,yDACD;AAGH,KAAI,CAAC,cAAc,IAAI,UAAU,OAAO,CACtC,QAAO,cACL,uBACA,wBAAwB,UAAU,OAAO,uBAAuB,CAAC,GAAG,cAAc,CAAC,KAAK,KAAK,GAC9F;CAGH,MAAM,QAAQ,QAAQ,SAAS,EAAE;AACjC,iBAAgB,OAAO,SAAS,cAAc;CAE9C,MAAM,EAAE,SAAS,WAAW,kBAAkB,oBAC5C,QAAQ,KACR,SACA,mBACD;CAED,MAAM,WAAW,SAAS,YAAY;CACtC,MAAM,SAAS,OAAO,MAAM,aAAa,GAAG;AAC5C,KAAI,CAAC,OACH,QAAO,cAAc,sBAAsB,UAAU,SAAS,gBAAgB;CAIhF,MAAM,YAAY,QADJ,UAAU,SAAS,0BACA,kBAAkB;CAOnD,MAAM,WAAoC,EAAE,QAAQ;AACpD,KAAI,UAAU,QAAS,UAAS,UAAU,UAAU;AAKpD,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,EAAE;AAChD,MAAI,QAAQ,SAAU;AACtB,MAAI,IAAI,WAAW,IAAI,CAAE;AACzB,MAAI,OAAO,SAAU;AACrB,WAAS,OAAO;;AAGlB,KAAI;EACF,MAAM,SAAS,MAAM,QAAQ,IAAI,KAAM,WAAW,UAAU,EAAE,CAAC;EAC/D,MAAM,OAAS,OAA8C,QAAQ,EAAE;EAIvE,MAAM,OAAQ,KAAK,SAAS,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,EAAE;AAI5E,OAAK,UAAU;AACf,OAAK,iBAAiB;AACtB,OAAK,QAAQ,CAAC,GAAG,OAAO,aAAa,OAAO;AAC5C,OAAK,SAAS,UAAU;AACxB,OAAK,QAAQ;AACb,EAAC,OAA8C,OAAO;AACtD,SAAO;UACA,KAAK;AAIZ,SAAO,cAAc,mBADL,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,CAChB"}
@@ -0,0 +1,36 @@
1
+
2
+ //#region src/agent-runners/env-whitelist.ts
3
+ function resolveEnv(whitelist) {
4
+ if (!whitelist?.length) return Object.freeze({});
5
+ const allowed = new Set(whitelist);
6
+ return new Proxy(Object.create(null), {
7
+ get(_target, prop) {
8
+ if (typeof prop !== "string") return void 0;
9
+ if (!allowed.has(prop)) return void 0;
10
+ return process.env[prop];
11
+ },
12
+ has(_target, prop) {
13
+ return typeof prop === "string" && allowed.has(prop);
14
+ },
15
+ ownKeys() {
16
+ return [...allowed];
17
+ },
18
+ getOwnPropertyDescriptor(_target, prop) {
19
+ if (typeof prop !== "string" || !allowed.has(prop)) return void 0;
20
+ return {
21
+ configurable: true,
22
+ enumerable: true,
23
+ value: process.env[prop]
24
+ };
25
+ },
26
+ set() {
27
+ return false;
28
+ },
29
+ deleteProperty() {
30
+ return false;
31
+ }
32
+ });
33
+ }
34
+
35
+ //#endregion
36
+ exports.resolveEnv = resolveEnv;
@@ -0,0 +1,5 @@
1
+ //#region src/agent-runners/env-whitelist.d.ts
2
+ declare function resolveEnv(whitelist: string[] | undefined): Record<string, string | undefined>;
3
+ //#endregion
4
+ export { resolveEnv };
5
+ //# sourceMappingURL=env-whitelist.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-whitelist.d.cts","names":[],"sources":["../../src/agent-runners/env-whitelist.ts"],"mappings":";iBAAgB,UAAA,CAAW,SAAA,yBAAkC,MAAA"}
@@ -0,0 +1,5 @@
1
+ //#region src/agent-runners/env-whitelist.d.ts
2
+ declare function resolveEnv(whitelist: string[] | undefined): Record<string, string | undefined>;
3
+ //#endregion
4
+ export { resolveEnv };
5
+ //# sourceMappingURL=env-whitelist.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-whitelist.d.mts","names":[],"sources":["../../src/agent-runners/env-whitelist.ts"],"mappings":";iBAAgB,UAAA,CAAW,SAAA,yBAAkC,MAAA"}
@@ -0,0 +1,36 @@
1
+ //#region src/agent-runners/env-whitelist.ts
2
+ function resolveEnv(whitelist) {
3
+ if (!whitelist?.length) return Object.freeze({});
4
+ const allowed = new Set(whitelist);
5
+ return new Proxy(Object.create(null), {
6
+ get(_target, prop) {
7
+ if (typeof prop !== "string") return void 0;
8
+ if (!allowed.has(prop)) return void 0;
9
+ return process.env[prop];
10
+ },
11
+ has(_target, prop) {
12
+ return typeof prop === "string" && allowed.has(prop);
13
+ },
14
+ ownKeys() {
15
+ return [...allowed];
16
+ },
17
+ getOwnPropertyDescriptor(_target, prop) {
18
+ if (typeof prop !== "string" || !allowed.has(prop)) return void 0;
19
+ return {
20
+ configurable: true,
21
+ enumerable: true,
22
+ value: process.env[prop]
23
+ };
24
+ },
25
+ set() {
26
+ return false;
27
+ },
28
+ deleteProperty() {
29
+ return false;
30
+ }
31
+ });
32
+ }
33
+
34
+ //#endregion
35
+ export { resolveEnv };
36
+ //# sourceMappingURL=env-whitelist.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-whitelist.mjs","names":[],"sources":["../../src/agent-runners/env-whitelist.ts"],"sourcesContent":["export function resolveEnv(whitelist: string[] | undefined): Record<string, string | undefined> {\n if (!whitelist?.length) return Object.freeze({});\n\n const allowed = new Set(whitelist);\n return new Proxy(Object.create(null), {\n get(_target, prop: string) {\n if (typeof prop !== \"string\") return undefined;\n if (!allowed.has(prop)) return undefined;\n return process.env[prop];\n },\n has(_target, prop: string) {\n return typeof prop === \"string\" && allowed.has(prop);\n },\n ownKeys() {\n return [...allowed];\n },\n getOwnPropertyDescriptor(_target, prop: string) {\n if (typeof prop !== \"string\" || !allowed.has(prop)) return undefined;\n return { configurable: true, enumerable: true, value: process.env[prop] };\n },\n set() {\n return false;\n },\n deleteProperty() {\n return false;\n },\n });\n}\n"],"mappings":";AAAA,SAAgB,WAAW,WAAqE;AAC9F,KAAI,CAAC,WAAW,OAAQ,QAAO,OAAO,OAAO,EAAE,CAAC;CAEhD,MAAM,UAAU,IAAI,IAAI,UAAU;AAClC,QAAO,IAAI,MAAM,OAAO,OAAO,KAAK,EAAE;EACpC,IAAI,SAAS,MAAc;AACzB,OAAI,OAAO,SAAS,SAAU,QAAO;AACrC,OAAI,CAAC,QAAQ,IAAI,KAAK,CAAE,QAAO;AAC/B,UAAO,QAAQ,IAAI;;EAErB,IAAI,SAAS,MAAc;AACzB,UAAO,OAAO,SAAS,YAAY,QAAQ,IAAI,KAAK;;EAEtD,UAAU;AACR,UAAO,CAAC,GAAG,QAAQ;;EAErB,yBAAyB,SAAS,MAAc;AAC9C,OAAI,OAAO,SAAS,YAAY,CAAC,QAAQ,IAAI,KAAK,CAAE,QAAO;AAC3D,UAAO;IAAE,cAAc;IAAM,YAAY;IAAM,OAAO,QAAQ,IAAI;IAAO;;EAE3E,MAAM;AACJ,UAAO;;EAET,iBAAiB;AACf,UAAO;;EAEV,CAAC"}
@@ -0,0 +1,47 @@
1
+ let ufo = require("ufo");
2
+
3
+ //#region src/agent-runners/guide-rails.ts
4
+ function decideFromPayload(data) {
5
+ if (!data || typeof data !== "object") return { abort: false };
6
+ const d = data;
7
+ if (d.abort === true) return {
8
+ abort: true,
9
+ reason: typeof d.reason === "string" ? d.reason : void 0
10
+ };
11
+ if ("output" in d) return {
12
+ abort: false,
13
+ output: d.output
14
+ };
15
+ return { abort: false };
16
+ }
17
+ async function runGuideRails(afs, guideRailPaths, input, output, opts) {
18
+ let current = output;
19
+ let rewritten = false;
20
+ for (const rawPath of guideRailPaths) {
21
+ const path = rawPath.startsWith("/") ? rawPath : (0, ufo.joinURL)(opts.mountPath, rawPath);
22
+ try {
23
+ const res = await afs.exec(path, {
24
+ input,
25
+ output: current
26
+ }, {});
27
+ const decision = decideFromPayload(res?.data ?? res);
28
+ if (decision.abort) return decision;
29
+ if (decision.output !== void 0) {
30
+ current = decision.output;
31
+ rewritten = true;
32
+ }
33
+ } catch (err) {
34
+ return {
35
+ abort: true,
36
+ reason: `GuideRail "${rawPath}" raised: ${err instanceof Error ? err.message : String(err)}`
37
+ };
38
+ }
39
+ }
40
+ return rewritten ? {
41
+ abort: false,
42
+ output: current
43
+ } : { abort: false };
44
+ }
45
+
46
+ //#endregion
47
+ exports.runGuideRails = runGuideRails;
@@ -0,0 +1,16 @@
1
+ import { AFSRoot } from "@aigne/afs";
2
+
3
+ //#region src/agent-runners/guide-rails.d.ts
4
+ interface GuideRailResult {
5
+ abort: boolean;
6
+ reason?: string;
7
+ /** When set, rail requested the output be replaced with this value. */
8
+ output?: unknown;
9
+ }
10
+ interface RunGuideRailsOptions {
11
+ mountPath: string;
12
+ }
13
+ declare function runGuideRails(afs: AFSRoot, guideRailPaths: readonly string[], input: Record<string, unknown>, output: unknown, opts: RunGuideRailsOptions): Promise<GuideRailResult>;
14
+ //#endregion
15
+ export { GuideRailResult, RunGuideRailsOptions, runGuideRails };
16
+ //# sourceMappingURL=guide-rails.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide-rails.d.cts","names":[],"sources":["../../src/agent-runners/guide-rails.ts"],"mappings":";;;UAGiB,eAAA;EACf,KAAA;EACA,MAAA;EAF8B;EAI9B,MAAA;AAAA;AAAA,UAGe,oBAAA;EACf,SAAA;AAAA;AAAA,iBAaoB,aAAA,CACpB,GAAA,EAAK,OAAA,EACL,cAAA,qBACA,KAAA,EAAO,MAAA,mBACP,MAAA,WACA,IAAA,EAAM,oBAAA,GACL,OAAA,CAAQ,eAAA"}
@@ -0,0 +1,16 @@
1
+ import { AFSRoot } from "@aigne/afs";
2
+
3
+ //#region src/agent-runners/guide-rails.d.ts
4
+ interface GuideRailResult {
5
+ abort: boolean;
6
+ reason?: string;
7
+ /** When set, rail requested the output be replaced with this value. */
8
+ output?: unknown;
9
+ }
10
+ interface RunGuideRailsOptions {
11
+ mountPath: string;
12
+ }
13
+ declare function runGuideRails(afs: AFSRoot, guideRailPaths: readonly string[], input: Record<string, unknown>, output: unknown, opts: RunGuideRailsOptions): Promise<GuideRailResult>;
14
+ //#endregion
15
+ export { GuideRailResult, RunGuideRailsOptions, runGuideRails };
16
+ //# sourceMappingURL=guide-rails.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide-rails.d.mts","names":[],"sources":["../../src/agent-runners/guide-rails.ts"],"mappings":";;;UAGiB,eAAA;EACf,KAAA;EACA,MAAA;EAF8B;EAI9B,MAAA;AAAA;AAAA,UAGe,oBAAA;EACf,SAAA;AAAA;AAAA,iBAaoB,aAAA,CACpB,GAAA,EAAK,OAAA,EACL,cAAA,qBACA,KAAA,EAAO,MAAA,mBACP,MAAA,WACA,IAAA,EAAM,oBAAA,GACL,OAAA,CAAQ,eAAA"}
@@ -0,0 +1,48 @@
1
+ import { joinURL } from "ufo";
2
+
3
+ //#region src/agent-runners/guide-rails.ts
4
+ function decideFromPayload(data) {
5
+ if (!data || typeof data !== "object") return { abort: false };
6
+ const d = data;
7
+ if (d.abort === true) return {
8
+ abort: true,
9
+ reason: typeof d.reason === "string" ? d.reason : void 0
10
+ };
11
+ if ("output" in d) return {
12
+ abort: false,
13
+ output: d.output
14
+ };
15
+ return { abort: false };
16
+ }
17
+ async function runGuideRails(afs, guideRailPaths, input, output, opts) {
18
+ let current = output;
19
+ let rewritten = false;
20
+ for (const rawPath of guideRailPaths) {
21
+ const path = rawPath.startsWith("/") ? rawPath : joinURL(opts.mountPath, rawPath);
22
+ try {
23
+ const res = await afs.exec(path, {
24
+ input,
25
+ output: current
26
+ }, {});
27
+ const decision = decideFromPayload(res?.data ?? res);
28
+ if (decision.abort) return decision;
29
+ if (decision.output !== void 0) {
30
+ current = decision.output;
31
+ rewritten = true;
32
+ }
33
+ } catch (err) {
34
+ return {
35
+ abort: true,
36
+ reason: `GuideRail "${rawPath}" raised: ${err instanceof Error ? err.message : String(err)}`
37
+ };
38
+ }
39
+ }
40
+ return rewritten ? {
41
+ abort: false,
42
+ output: current
43
+ } : { abort: false };
44
+ }
45
+
46
+ //#endregion
47
+ export { runGuideRails };
48
+ //# sourceMappingURL=guide-rails.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide-rails.mjs","names":[],"sources":["../../src/agent-runners/guide-rails.ts"],"sourcesContent":["import type { AFSRoot } from \"@aigne/afs\";\nimport { joinURL } from \"ufo\";\n\nexport interface GuideRailResult {\n abort: boolean;\n reason?: string;\n /** When set, rail requested the output be replaced with this value. */\n output?: unknown;\n}\n\nexport interface RunGuideRailsOptions {\n mountPath: string;\n}\n\nfunction decideFromPayload(data: unknown): GuideRailResult {\n if (!data || typeof data !== \"object\") return { abort: false };\n const d = data as Record<string, unknown>;\n if (d.abort === true) {\n return { abort: true, reason: typeof d.reason === \"string\" ? d.reason : undefined };\n }\n if (\"output\" in d) return { abort: false, output: d.output };\n return { abort: false };\n}\n\nexport async function runGuideRails(\n afs: AFSRoot,\n guideRailPaths: readonly string[],\n input: Record<string, unknown>,\n output: unknown,\n opts: RunGuideRailsOptions,\n): Promise<GuideRailResult> {\n let current = output;\n let rewritten = false;\n for (const rawPath of guideRailPaths) {\n const path = rawPath.startsWith(\"/\") ? rawPath : joinURL(opts.mountPath, rawPath);\n try {\n const res = await afs.exec!(path, { input, output: current }, {});\n const envelope = res as { data?: unknown } | undefined;\n const decision = decideFromPayload(envelope?.data ?? res);\n if (decision.abort) return decision;\n if (decision.output !== undefined) {\n current = decision.output;\n rewritten = true;\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { abort: true, reason: `GuideRail \"${rawPath}\" raised: ${message}` };\n }\n }\n return rewritten ? { abort: false, output: current } : { abort: false };\n}\n"],"mappings":";;;AAcA,SAAS,kBAAkB,MAAgC;AACzD,KAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO,EAAE,OAAO,OAAO;CAC9D,MAAM,IAAI;AACV,KAAI,EAAE,UAAU,KACd,QAAO;EAAE,OAAO;EAAM,QAAQ,OAAO,EAAE,WAAW,WAAW,EAAE,SAAS;EAAW;AAErF,KAAI,YAAY,EAAG,QAAO;EAAE,OAAO;EAAO,QAAQ,EAAE;EAAQ;AAC5D,QAAO,EAAE,OAAO,OAAO;;AAGzB,eAAsB,cACpB,KACA,gBACA,OACA,QACA,MAC0B;CAC1B,IAAI,UAAU;CACd,IAAI,YAAY;AAChB,MAAK,MAAM,WAAW,gBAAgB;EACpC,MAAM,OAAO,QAAQ,WAAW,IAAI,GAAG,UAAU,QAAQ,KAAK,WAAW,QAAQ;AACjF,MAAI;GACF,MAAM,MAAM,MAAM,IAAI,KAAM,MAAM;IAAE;IAAO,QAAQ;IAAS,EAAE,EAAE,CAAC;GAEjE,MAAM,WAAW,kBADA,KAC4B,QAAQ,IAAI;AACzD,OAAI,SAAS,MAAO,QAAO;AAC3B,OAAI,SAAS,WAAW,QAAW;AACjC,cAAU,SAAS;AACnB,gBAAY;;WAEP,KAAK;AAEZ,UAAO;IAAE,OAAO;IAAM,QAAQ,cAAc,QAAQ,YADpC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;IACW;;;AAG/E,QAAO,YAAY;EAAE,OAAO;EAAO,QAAQ;EAAS,GAAG,EAAE,OAAO,OAAO"}