@xandout/libra-harness 0.1.8

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 (289) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +486 -0
  3. package/dist/agent.d.ts +174 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +575 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/ai-sdk-model.d.ts +26 -0
  8. package/dist/ai-sdk-model.d.ts.map +1 -0
  9. package/dist/ai-sdk-model.js +260 -0
  10. package/dist/ai-sdk-model.js.map +1 -0
  11. package/dist/context.d.ts +75 -0
  12. package/dist/context.d.ts.map +1 -0
  13. package/dist/context.js +2 -0
  14. package/dist/context.js.map +1 -0
  15. package/dist/errors.d.ts +33 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +59 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/extension.d.ts +63 -0
  20. package/dist/extension.d.ts.map +1 -0
  21. package/dist/extension.js +2 -0
  22. package/dist/extension.js.map +1 -0
  23. package/dist/extras/extension-loader.d.ts +205 -0
  24. package/dist/extras/extension-loader.d.ts.map +1 -0
  25. package/dist/extras/extension-loader.js +315 -0
  26. package/dist/extras/extension-loader.js.map +1 -0
  27. package/dist/extras/extensions/auto-steer/extension.d.ts +46 -0
  28. package/dist/extras/extensions/auto-steer/extension.d.ts.map +1 -0
  29. package/dist/extras/extensions/auto-steer/extension.js +52 -0
  30. package/dist/extras/extensions/auto-steer/extension.js.map +1 -0
  31. package/dist/extras/extensions/auto-steer/extension.json +7 -0
  32. package/dist/extras/extensions/auto-steer/index.d.ts +3 -0
  33. package/dist/extras/extensions/auto-steer/index.d.ts.map +1 -0
  34. package/dist/extras/extensions/auto-steer/index.js +2 -0
  35. package/dist/extras/extensions/auto-steer/index.js.map +1 -0
  36. package/dist/extras/extensions/disk-session/extension.d.ts +167 -0
  37. package/dist/extras/extensions/disk-session/extension.d.ts.map +1 -0
  38. package/dist/extras/extensions/disk-session/extension.js +492 -0
  39. package/dist/extras/extensions/disk-session/extension.js.map +1 -0
  40. package/dist/extras/extensions/disk-session/extension.json +6 -0
  41. package/dist/extras/extensions/disk-session/extension.test.d.ts +2 -0
  42. package/dist/extras/extensions/disk-session/extension.test.d.ts.map +1 -0
  43. package/dist/extras/extensions/disk-session/extension.test.js +672 -0
  44. package/dist/extras/extensions/disk-session/extension.test.js.map +1 -0
  45. package/dist/extras/extensions/disk-session/index.d.ts +3 -0
  46. package/dist/extras/extensions/disk-session/index.d.ts.map +1 -0
  47. package/dist/extras/extensions/disk-session/index.js +2 -0
  48. package/dist/extras/extensions/disk-session/index.js.map +1 -0
  49. package/dist/extras/extensions/emoji/extension.d.ts +20 -0
  50. package/dist/extras/extensions/emoji/extension.d.ts.map +1 -0
  51. package/dist/extras/extensions/emoji/extension.js +22 -0
  52. package/dist/extras/extensions/emoji/extension.js.map +1 -0
  53. package/dist/extras/extensions/emoji/extension.json +7 -0
  54. package/dist/extras/extensions/emoji/index.d.ts +3 -0
  55. package/dist/extras/extensions/emoji/index.d.ts.map +1 -0
  56. package/dist/extras/extensions/emoji/index.js +2 -0
  57. package/dist/extras/extensions/emoji/index.js.map +1 -0
  58. package/dist/extras/extensions/filesystem/extension.d.ts +53 -0
  59. package/dist/extras/extensions/filesystem/extension.d.ts.map +1 -0
  60. package/dist/extras/extensions/filesystem/extension.js +350 -0
  61. package/dist/extras/extensions/filesystem/extension.js.map +1 -0
  62. package/dist/extras/extensions/filesystem/extension.json +6 -0
  63. package/dist/extras/extensions/filesystem/extension.test.d.ts +2 -0
  64. package/dist/extras/extensions/filesystem/extension.test.d.ts.map +1 -0
  65. package/dist/extras/extensions/filesystem/extension.test.js +387 -0
  66. package/dist/extras/extensions/filesystem/extension.test.js.map +1 -0
  67. package/dist/extras/extensions/filesystem/index.d.ts +2 -0
  68. package/dist/extras/extensions/filesystem/index.d.ts.map +1 -0
  69. package/dist/extras/extensions/filesystem/index.js +2 -0
  70. package/dist/extras/extensions/filesystem/index.js.map +1 -0
  71. package/dist/extras/extensions/keyword-extractor/extension.d.ts +53 -0
  72. package/dist/extras/extensions/keyword-extractor/extension.d.ts.map +1 -0
  73. package/dist/extras/extensions/keyword-extractor/extension.js +61 -0
  74. package/dist/extras/extensions/keyword-extractor/extension.js.map +1 -0
  75. package/dist/extras/extensions/keyword-extractor/extension.json +6 -0
  76. package/dist/extras/extensions/keyword-extractor/extension.test.d.ts +2 -0
  77. package/dist/extras/extensions/keyword-extractor/extension.test.d.ts.map +1 -0
  78. package/dist/extras/extensions/keyword-extractor/extension.test.js +105 -0
  79. package/dist/extras/extensions/keyword-extractor/extension.test.js.map +1 -0
  80. package/dist/extras/extensions/keyword-extractor/index.d.ts +5 -0
  81. package/dist/extras/extensions/keyword-extractor/index.d.ts.map +1 -0
  82. package/dist/extras/extensions/keyword-extractor/index.js +3 -0
  83. package/dist/extras/extensions/keyword-extractor/index.js.map +1 -0
  84. package/dist/extras/extensions/keyword-extractor/nlp.d.ts +68 -0
  85. package/dist/extras/extensions/keyword-extractor/nlp.d.ts.map +1 -0
  86. package/dist/extras/extensions/keyword-extractor/nlp.js +156 -0
  87. package/dist/extras/extensions/keyword-extractor/nlp.js.map +1 -0
  88. package/dist/extras/extensions/keyword-extractor/nlp.test.d.ts +2 -0
  89. package/dist/extras/extensions/keyword-extractor/nlp.test.d.ts.map +1 -0
  90. package/dist/extras/extensions/keyword-extractor/nlp.test.js +176 -0
  91. package/dist/extras/extensions/keyword-extractor/nlp.test.js.map +1 -0
  92. package/dist/extras/extensions/logger/extension.d.ts +52 -0
  93. package/dist/extras/extensions/logger/extension.d.ts.map +1 -0
  94. package/dist/extras/extensions/logger/extension.js +68 -0
  95. package/dist/extras/extensions/logger/extension.js.map +1 -0
  96. package/dist/extras/extensions/logger/extension.json +7 -0
  97. package/dist/extras/extensions/logger/index.d.ts +3 -0
  98. package/dist/extras/extensions/logger/index.d.ts.map +1 -0
  99. package/dist/extras/extensions/logger/index.js +2 -0
  100. package/dist/extras/extensions/logger/index.js.map +1 -0
  101. package/dist/extras/extensions/mcp/extension.d.ts +63 -0
  102. package/dist/extras/extensions/mcp/extension.d.ts.map +1 -0
  103. package/dist/extras/extensions/mcp/extension.js +437 -0
  104. package/dist/extras/extensions/mcp/extension.js.map +1 -0
  105. package/dist/extras/extensions/mcp/extension.json +7 -0
  106. package/dist/extras/extensions/mcp/extension.test.d.ts +2 -0
  107. package/dist/extras/extensions/mcp/extension.test.d.ts.map +1 -0
  108. package/dist/extras/extensions/mcp/extension.test.js +286 -0
  109. package/dist/extras/extensions/mcp/extension.test.js.map +1 -0
  110. package/dist/extras/extensions/mcp/index.d.ts +3 -0
  111. package/dist/extras/extensions/mcp/index.d.ts.map +1 -0
  112. package/dist/extras/extensions/mcp/index.js +2 -0
  113. package/dist/extras/extensions/mcp/index.js.map +1 -0
  114. package/dist/extras/extensions/mem-session/extension.d.ts +24 -0
  115. package/dist/extras/extensions/mem-session/extension.d.ts.map +1 -0
  116. package/dist/extras/extensions/mem-session/extension.js +49 -0
  117. package/dist/extras/extensions/mem-session/extension.js.map +1 -0
  118. package/dist/extras/extensions/mem-session/extension.json +6 -0
  119. package/dist/extras/extensions/mem-session/index.d.ts +2 -0
  120. package/dist/extras/extensions/mem-session/index.d.ts.map +1 -0
  121. package/dist/extras/extensions/mem-session/index.js +2 -0
  122. package/dist/extras/extensions/mem-session/index.js.map +1 -0
  123. package/dist/extras/extensions/memory/extension.d.ts +54 -0
  124. package/dist/extras/extensions/memory/extension.d.ts.map +1 -0
  125. package/dist/extras/extensions/memory/extension.js +143 -0
  126. package/dist/extras/extensions/memory/extension.js.map +1 -0
  127. package/dist/extras/extensions/memory/extension.json +7 -0
  128. package/dist/extras/extensions/memory/index.d.ts +5 -0
  129. package/dist/extras/extensions/memory/index.d.ts.map +1 -0
  130. package/dist/extras/extensions/memory/index.js +3 -0
  131. package/dist/extras/extensions/memory/index.js.map +1 -0
  132. package/dist/extras/extensions/memory/llm-extractor.d.ts +42 -0
  133. package/dist/extras/extensions/memory/llm-extractor.d.ts.map +1 -0
  134. package/dist/extras/extensions/memory/llm-extractor.js +89 -0
  135. package/dist/extras/extensions/memory/llm-extractor.js.map +1 -0
  136. package/dist/extras/extensions/memory/types.d.ts +142 -0
  137. package/dist/extras/extensions/memory/types.d.ts.map +1 -0
  138. package/dist/extras/extensions/memory/types.js +2 -0
  139. package/dist/extras/extensions/memory/types.js.map +1 -0
  140. package/dist/extras/extensions/otel/extension.d.ts +57 -0
  141. package/dist/extras/extensions/otel/extension.d.ts.map +1 -0
  142. package/dist/extras/extensions/otel/extension.js +253 -0
  143. package/dist/extras/extensions/otel/extension.js.map +1 -0
  144. package/dist/extras/extensions/otel/extension.json +7 -0
  145. package/dist/extras/extensions/otel/extension.test.d.ts +2 -0
  146. package/dist/extras/extensions/otel/extension.test.d.ts.map +1 -0
  147. package/dist/extras/extensions/otel/extension.test.js +399 -0
  148. package/dist/extras/extensions/otel/extension.test.js.map +1 -0
  149. package/dist/extras/extensions/otel/index.d.ts +4 -0
  150. package/dist/extras/extensions/otel/index.d.ts.map +1 -0
  151. package/dist/extras/extensions/otel/index.js +3 -0
  152. package/dist/extras/extensions/otel/index.js.map +1 -0
  153. package/dist/extras/extensions/otel/jsonl-span-exporter.d.ts +60 -0
  154. package/dist/extras/extensions/otel/jsonl-span-exporter.d.ts.map +1 -0
  155. package/dist/extras/extensions/otel/jsonl-span-exporter.js +134 -0
  156. package/dist/extras/extensions/otel/jsonl-span-exporter.js.map +1 -0
  157. package/dist/extras/extensions/scripts/extension.d.ts +180 -0
  158. package/dist/extras/extensions/scripts/extension.d.ts.map +1 -0
  159. package/dist/extras/extensions/scripts/extension.js +618 -0
  160. package/dist/extras/extensions/scripts/extension.js.map +1 -0
  161. package/dist/extras/extensions/scripts/extension.json +7 -0
  162. package/dist/extras/extensions/scripts/extension.test.d.ts +2 -0
  163. package/dist/extras/extensions/scripts/extension.test.d.ts.map +1 -0
  164. package/dist/extras/extensions/scripts/extension.test.js +552 -0
  165. package/dist/extras/extensions/scripts/extension.test.js.map +1 -0
  166. package/dist/extras/extensions/scripts/index.d.ts +3 -0
  167. package/dist/extras/extensions/scripts/index.d.ts.map +1 -0
  168. package/dist/extras/extensions/scripts/index.js +2 -0
  169. package/dist/extras/extensions/scripts/index.js.map +1 -0
  170. package/dist/extras/extensions/skills/extension.d.ts +105 -0
  171. package/dist/extras/extensions/skills/extension.d.ts.map +1 -0
  172. package/dist/extras/extensions/skills/extension.js +419 -0
  173. package/dist/extras/extensions/skills/extension.js.map +1 -0
  174. package/dist/extras/extensions/skills/extension.json +7 -0
  175. package/dist/extras/extensions/skills/extension.test.d.ts +2 -0
  176. package/dist/extras/extensions/skills/extension.test.d.ts.map +1 -0
  177. package/dist/extras/extensions/skills/extension.test.js +184 -0
  178. package/dist/extras/extensions/skills/extension.test.js.map +1 -0
  179. package/dist/extras/extensions/skills/index.d.ts +4 -0
  180. package/dist/extras/extensions/skills/index.d.ts.map +1 -0
  181. package/dist/extras/extensions/skills/index.js +3 -0
  182. package/dist/extras/extensions/skills/index.js.map +1 -0
  183. package/dist/extras/extensions/streaming/extension.d.ts +15 -0
  184. package/dist/extras/extensions/streaming/extension.d.ts.map +1 -0
  185. package/dist/extras/extensions/streaming/extension.js +41 -0
  186. package/dist/extras/extensions/streaming/extension.js.map +1 -0
  187. package/dist/extras/extensions/streaming/extension.json +6 -0
  188. package/dist/extras/extensions/streaming/index.d.ts +2 -0
  189. package/dist/extras/extensions/streaming/index.d.ts.map +1 -0
  190. package/dist/extras/extensions/streaming/index.js +2 -0
  191. package/dist/extras/extensions/streaming/index.js.map +1 -0
  192. package/dist/extras/extensions/structured-output/extension.d.ts +11 -0
  193. package/dist/extras/extensions/structured-output/extension.d.ts.map +1 -0
  194. package/dist/extras/extensions/structured-output/extension.js +102 -0
  195. package/dist/extras/extensions/structured-output/extension.js.map +1 -0
  196. package/dist/extras/extensions/structured-output/extension.json +7 -0
  197. package/dist/extras/extensions/structured-output/index.d.ts +3 -0
  198. package/dist/extras/extensions/structured-output/index.d.ts.map +1 -0
  199. package/dist/extras/extensions/structured-output/index.js +2 -0
  200. package/dist/extras/extensions/structured-output/index.js.map +1 -0
  201. package/dist/extras/extensions/timestamp/extension.d.ts +11 -0
  202. package/dist/extras/extensions/timestamp/extension.d.ts.map +1 -0
  203. package/dist/extras/extensions/timestamp/extension.js +21 -0
  204. package/dist/extras/extensions/timestamp/extension.js.map +1 -0
  205. package/dist/extras/extensions/timestamp/extension.json +6 -0
  206. package/dist/extras/extensions/timestamp/index.d.ts +2 -0
  207. package/dist/extras/extensions/timestamp/index.d.ts.map +1 -0
  208. package/dist/extras/extensions/timestamp/index.js +2 -0
  209. package/dist/extras/extensions/timestamp/index.js.map +1 -0
  210. package/dist/extras/extensions/token-stats/extension.d.ts +50 -0
  211. package/dist/extras/extensions/token-stats/extension.d.ts.map +1 -0
  212. package/dist/extras/extensions/token-stats/extension.js +99 -0
  213. package/dist/extras/extensions/token-stats/extension.js.map +1 -0
  214. package/dist/extras/extensions/token-stats/extension.json +7 -0
  215. package/dist/extras/extensions/token-stats/extension.test.d.ts +2 -0
  216. package/dist/extras/extensions/token-stats/extension.test.d.ts.map +1 -0
  217. package/dist/extras/extensions/token-stats/extension.test.js +197 -0
  218. package/dist/extras/extensions/token-stats/extension.test.js.map +1 -0
  219. package/dist/extras/extensions/token-stats/index.d.ts +3 -0
  220. package/dist/extras/extensions/token-stats/index.d.ts.map +1 -0
  221. package/dist/extras/extensions/token-stats/index.js +2 -0
  222. package/dist/extras/extensions/token-stats/index.js.map +1 -0
  223. package/dist/extras/extensions/tool-buffer/extension.d.ts +89 -0
  224. package/dist/extras/extensions/tool-buffer/extension.d.ts.map +1 -0
  225. package/dist/extras/extensions/tool-buffer/extension.js +182 -0
  226. package/dist/extras/extensions/tool-buffer/extension.js.map +1 -0
  227. package/dist/extras/extensions/tool-buffer/extension.json +7 -0
  228. package/dist/extras/extensions/tool-buffer/extension.test.d.ts +2 -0
  229. package/dist/extras/extensions/tool-buffer/extension.test.d.ts.map +1 -0
  230. package/dist/extras/extensions/tool-buffer/extension.test.js +549 -0
  231. package/dist/extras/extensions/tool-buffer/extension.test.js.map +1 -0
  232. package/dist/extras/extensions/tool-buffer/index.d.ts +3 -0
  233. package/dist/extras/extensions/tool-buffer/index.d.ts.map +1 -0
  234. package/dist/extras/extensions/tool-buffer/index.js +2 -0
  235. package/dist/extras/extensions/tool-buffer/index.js.map +1 -0
  236. package/dist/extras/extensions/weather-tool/extension.d.ts +22 -0
  237. package/dist/extras/extensions/weather-tool/extension.d.ts.map +1 -0
  238. package/dist/extras/extensions/weather-tool/extension.js +33 -0
  239. package/dist/extras/extensions/weather-tool/extension.js.map +1 -0
  240. package/dist/extras/extensions/weather-tool/extension.json +7 -0
  241. package/dist/extras/extensions/weather-tool/index.d.ts +3 -0
  242. package/dist/extras/extensions/weather-tool/index.d.ts.map +1 -0
  243. package/dist/extras/extensions/weather-tool/index.js +2 -0
  244. package/dist/extras/extensions/weather-tool/index.js.map +1 -0
  245. package/dist/extras/models/ai-sdk-resolver.d.ts +15 -0
  246. package/dist/extras/models/ai-sdk-resolver.d.ts.map +1 -0
  247. package/dist/extras/models/ai-sdk-resolver.js +57 -0
  248. package/dist/extras/models/ai-sdk-resolver.js.map +1 -0
  249. package/dist/extras/models/index.d.ts +5 -0
  250. package/dist/extras/models/index.d.ts.map +1 -0
  251. package/dist/extras/models/index.js +3 -0
  252. package/dist/extras/models/index.js.map +1 -0
  253. package/dist/extras/models/routing-model.d.ts +18 -0
  254. package/dist/extras/models/routing-model.d.ts.map +1 -0
  255. package/dist/extras/models/routing-model.js +24 -0
  256. package/dist/extras/models/routing-model.js.map +1 -0
  257. package/dist/extras/openai-provider/index.d.ts +3 -0
  258. package/dist/extras/openai-provider/index.d.ts.map +1 -0
  259. package/dist/extras/openai-provider/index.js +2 -0
  260. package/dist/extras/openai-provider/index.js.map +1 -0
  261. package/dist/extras/openai-provider/server.d.ts +34 -0
  262. package/dist/extras/openai-provider/server.d.ts.map +1 -0
  263. package/dist/extras/openai-provider/server.js +335 -0
  264. package/dist/extras/openai-provider/server.js.map +1 -0
  265. package/dist/handle.d.ts +56 -0
  266. package/dist/handle.d.ts.map +1 -0
  267. package/dist/handle.js +2 -0
  268. package/dist/handle.js.map +1 -0
  269. package/dist/hooks.d.ts +98 -0
  270. package/dist/hooks.d.ts.map +1 -0
  271. package/dist/hooks.js +53 -0
  272. package/dist/hooks.js.map +1 -0
  273. package/dist/index.d.ts +16 -0
  274. package/dist/index.d.ts.map +1 -0
  275. package/dist/index.js +9 -0
  276. package/dist/index.js.map +1 -0
  277. package/dist/model.d.ts +75 -0
  278. package/dist/model.d.ts.map +1 -0
  279. package/dist/model.js +2 -0
  280. package/dist/model.js.map +1 -0
  281. package/dist/tool.d.ts +78 -0
  282. package/dist/tool.d.ts.map +1 -0
  283. package/dist/tool.js +78 -0
  284. package/dist/tool.js.map +1 -0
  285. package/dist/types.d.ts +83 -0
  286. package/dist/types.d.ts.map +1 -0
  287. package/dist/types.js +21 -0
  288. package/dist/types.js.map +1 -0
  289. package/package.json +178 -0
@@ -0,0 +1,56 @@
1
+ import type { AgentResponse } from './context.js';
2
+ /**
3
+ * Controller for a running agent turn.
4
+ *
5
+ * Returned by {@link Agent.run}. The handle is **thenable** — you can
6
+ * `await` it directly to get the final {@link AgentResponse} — but it also
7
+ * exposes discrete controls for steering and halting the turn:
8
+ *
9
+ * ```typescript
10
+ * const handle = agent.run({ message: 'Research this' })
11
+ *
12
+ * // Steer mid-turn (injects a user message before the next LLM iteration)
13
+ * handle.steer('Focus on the financial aspects')
14
+ *
15
+ * // Halt mid-turn (cancels in-flight model calls, stops the loop)
16
+ * handle.halt('user cancelled')
17
+ *
18
+ * // Or just await the result
19
+ * const result = await handle
20
+ * ```
21
+ *
22
+ * Each call to `agent.run()` returns its own independent handle. This means
23
+ * multiple turns can run concurrently without clobbering each other's
24
+ * steering/halting state.
25
+ */
26
+ export interface RunHandle extends PromiseLike<AgentResponse> {
27
+ /** The AbortSignal for this turn. Passed to model calls and tools. */
28
+ readonly signal: AbortSignal;
29
+ /** Whether the turn is still running. */
30
+ readonly isRunning: boolean;
31
+ /**
32
+ * Inject a steering message into the turn.
33
+ *
34
+ * The message is added as a `user` message before the next LLM iteration,
35
+ * allowing the caller to redirect the agent mid-turn. No-op if the turn
36
+ * has already completed.
37
+ */
38
+ steer(message: string): void;
39
+ /**
40
+ * Halt the turn.
41
+ *
42
+ * Aborts any in-flight model call and stops the turn loop. The turn
43
+ * resolves with `finishReason: 'halted'`. No-op if the turn has already
44
+ * completed.
45
+ *
46
+ * **Propagation**: Halting cancels in-flight `fetch` calls to the model
47
+ * and races against running tool executions. Tools that receive the
48
+ * AbortSignal via {@link ToolContext.signal} should check it cooperatively
49
+ * to clean up resources. A tool that ignores the signal may continue
50
+ * running in the background, but the harness will not wait for it.
51
+ */
52
+ halt(reason?: string): void;
53
+ /** The promise that resolves with the final response. */
54
+ readonly done: Promise<AgentResponse>;
55
+ }
56
+ //# sourceMappingURL=handle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,SAAU,SAAQ,WAAW,CAAC,aAAa,CAAC;IAC3D,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACvC"}
package/dist/handle.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=handle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle.js","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ import type { TurnContext } from './context.js';
2
+ import type { ModelRequest, ModelResponse } from './model.js';
3
+ import type { ToolCall, ToolResult } from './types.js';
4
+ /**
5
+ * Lifecycle stages where hooks can participate.
6
+ *
7
+ * The exact set may evolve; these map to the turn execution model:
8
+ *
9
+ * ```
10
+ * beforeTurn → beforeContext → [beforeLLM → afterLLM → (beforeTool → afterTool)*]* → beforeResponse → afterTurn
11
+ *
12
+ * onError fires when any error is thrown during the turn (model error, hook
13
+ * error, etc.). An onError hook can recover by returning
14
+ * `{ skip: true, value: AgentResponse }`.
15
+ * ```
16
+ */
17
+ export type HookName = 'beforeTurn' | 'beforeContext' | 'beforeLLM' | 'afterLLM' | 'beforeTool' | 'afterTool' | 'beforeResponse' | 'afterTurn' | 'onError';
18
+ /**
19
+ * Data passed to a hook handler.
20
+ *
21
+ * `turn` is always present. Other fields are populated depending on the
22
+ * stage so extensions can inspect what they need.
23
+ */
24
+ export interface HookContext {
25
+ /** The mutable turn state. */
26
+ turn: TurnContext;
27
+ /** Populated on beforeLLM/afterLLM. */
28
+ modelRequest?: ModelRequest;
29
+ /** Populated on afterLLM. */
30
+ modelResponse?: ModelResponse;
31
+ /** Populated on beforeTool/afterTool. */
32
+ toolCall?: ToolCall;
33
+ /** Populated on afterTool (and beforeTool if a prior hook set it). */
34
+ toolResult?: ToolResult;
35
+ /** Populated on onError — the error that was thrown. */
36
+ error?: unknown;
37
+ }
38
+ /**
39
+ * What a hook can return.
40
+ *
41
+ * - `skip: true` — short-circuit remaining hooks **and** the default
42
+ * action for this stage. The `value` (if provided) is used as the
43
+ * stage result where applicable.
44
+ * - `value` — stage-specific override (e.g. a {@link ModelResponse} for
45
+ * beforeLLM, a {@link ToolResult} for beforeTool).
46
+ */
47
+ export interface HookResult {
48
+ skip?: boolean;
49
+ value?: unknown;
50
+ }
51
+ /**
52
+ * A hook handler. May mutate the context and/or return a {@link HookResult}.
53
+ */
54
+ export type HookHandler = (ctx: HookContext) => Promise<HookResult | void>;
55
+ /**
56
+ * An entry in the hook registry.
57
+ */
58
+ export interface HookEntry {
59
+ /** Name of the extension that registered this hook (for error reporting). */
60
+ extensionName: string;
61
+ handler: HookHandler;
62
+ /**
63
+ * Priority of the extension that registered this hook. Higher = runs
64
+ * first. Ties are broken by registration order (stable sort).
65
+ * Default: 0.
66
+ */
67
+ priority: number;
68
+ }
69
+ /**
70
+ * Ordered registry of hooks per lifecycle stage.
71
+ *
72
+ * Hooks execute in priority order within each stage (higher priority
73
+ * first), with registration order as the tiebreaker (stable sort).
74
+ * A hook returning `{ skip: true }` short-circuits remaining hooks
75
+ * in that stage.
76
+ */
77
+ export declare class HookRegistry {
78
+ private readonly hooks;
79
+ /**
80
+ * Register a hook at a stage.
81
+ *
82
+ * @param priority Higher = runs first. Ties keep registration order.
83
+ * Default: 0.
84
+ */
85
+ register(stage: HookName, extensionName: string, handler: HookHandler, priority?: number): void;
86
+ /**
87
+ * Get all hooks for a stage, sorted by priority (descending) then
88
+ * registration order (stable). This sort is computed on each call so
89
+ * that hooks registered after an `unregister()` stay correctly
90
+ * ordered.
91
+ */
92
+ entries(stage: HookName): HookEntry[];
93
+ /** Whether any hooks are registered at a stage. */
94
+ has(stage: HookName): boolean;
95
+ /** Remove all hooks registered by an extension (across all stages). */
96
+ unregister(extensionName: string): void;
97
+ }
98
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,QAAQ,GAChB,YAAY,GACZ,eAAe,GACf,WAAW,GACX,UAAU,GACV,YAAY,GACZ,WAAW,GACX,gBAAgB,GAChB,WAAW,GACX,SAAS,CAAC;AAEd;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,uCAAuC;IACvC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,6BAA6B;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,sEAAsE;IACtE,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,6EAA6E;IAC7E,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAE1D;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,SAAI,GAAG,IAAI,CAIzF;IAED;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,EAAE,CAMpC;IAED,mDAAmD;IACnD,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAE5B;IAED,uEAAuE;IACvE,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAStC;CACF"}
package/dist/hooks.js ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Ordered registry of hooks per lifecycle stage.
3
+ *
4
+ * Hooks execute in priority order within each stage (higher priority
5
+ * first), with registration order as the tiebreaker (stable sort).
6
+ * A hook returning `{ skip: true }` short-circuits remaining hooks
7
+ * in that stage.
8
+ */
9
+ export class HookRegistry {
10
+ hooks = new Map();
11
+ /**
12
+ * Register a hook at a stage.
13
+ *
14
+ * @param priority Higher = runs first. Ties keep registration order.
15
+ * Default: 0.
16
+ */
17
+ register(stage, extensionName, handler, priority = 0) {
18
+ const entries = this.hooks.get(stage) ?? [];
19
+ entries.push({ extensionName, handler, priority });
20
+ this.hooks.set(stage, entries);
21
+ }
22
+ /**
23
+ * Get all hooks for a stage, sorted by priority (descending) then
24
+ * registration order (stable). This sort is computed on each call so
25
+ * that hooks registered after an `unregister()` stay correctly
26
+ * ordered.
27
+ */
28
+ entries(stage) {
29
+ const entries = this.hooks.get(stage);
30
+ if (!entries || entries.length <= 1)
31
+ return entries ?? [];
32
+ // Stable sort by priority descending. Array.prototype.sort is
33
+ // stable in V8 (Node 12+) and all modern engines.
34
+ return [...entries].sort((a, b) => b.priority - a.priority);
35
+ }
36
+ /** Whether any hooks are registered at a stage. */
37
+ has(stage) {
38
+ return (this.hooks.get(stage)?.length ?? 0) > 0;
39
+ }
40
+ /** Remove all hooks registered by an extension (across all stages). */
41
+ unregister(extensionName) {
42
+ for (const [stage, entries] of this.hooks) {
43
+ const filtered = entries.filter((e) => e.extensionName !== extensionName);
44
+ if (filtered.length === 0) {
45
+ this.hooks.delete(stage);
46
+ }
47
+ else {
48
+ this.hooks.set(stage, filtered);
49
+ }
50
+ }
51
+ }
52
+ }
53
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAmFA;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IACN,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE1D;;;;;OAKG;IACH,QAAQ,CAAC,KAAe,EAAE,aAAqB,EAAE,OAAoB,EAAE,QAAQ,GAAG,CAAC;QACjF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,KAAe;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,OAAO,IAAI,EAAE,CAAC;QAC1D,8DAA8D;QAC9D,kDAAkD;QAClD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED,mDAAmD;IACnD,GAAG,CAAC,KAAe;QACjB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,uEAAuE;IACvE,UAAU,CAAC,aAAqB;QAC9B,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,aAAa,CAAC,CAAC;YAC1E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ export type { Role, Message, MessageContent, TextContentPart, FileContentPart, FileContentData, ToolCall, ToolResult, ToolDefinition, } from './types.js';
2
+ export { messageContentToText, hasFileContent } from './types.js';
3
+ export { LibraError, ModelError, ToolError, HookError, HaltedError, MaxIterationsError, } from './errors.js';
4
+ export type { Model, ModelRequest, ModelResponse, ModelDelta, FinishReason } from './model.js';
5
+ export { AISdkModel } from './ai-sdk-model.js';
6
+ export type { Tool, ToolContext } from './tool.js';
7
+ export { toToolDefinition, createAgentTool } from './tool.js';
8
+ export type { AgentToolOptions } from './tool.js';
9
+ export type { AgentRequest, AgentResponse, TurnContext, TurnFinishReason } from './context.js';
10
+ export type { HookName, HookContext, HookResult, HookHandler, HookEntry } from './hooks.js';
11
+ export { HookRegistry } from './hooks.js';
12
+ export type { Extension } from './extension.js';
13
+ export { Agent } from './agent.js';
14
+ export type { AgentConfig, ErrorPolicy, ErrorPolicyContext } from './agent.js';
15
+ export type { RunHandle } from './handle.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,IAAI,EACJ,OAAO,EACP,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,QAAQ,EACR,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGlE,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAGlD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAG/F,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAG/E,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { messageContentToText, hasFileContent } from './types.js';
2
+ // Errors
3
+ export { LibraError, ModelError, ToolError, HookError, HaltedError, MaxIterationsError, } from './errors.js';
4
+ export { AISdkModel } from './ai-sdk-model.js';
5
+ export { toToolDefinition, createAgentTool } from './tool.js';
6
+ export { HookRegistry } from './hooks.js';
7
+ // Agent
8
+ export { Agent } from './agent.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAElE,SAAS;AACT,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAQ9D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK1C,QAAQ;AACR,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,75 @@
1
+ import type { Message, ToolDefinition } from './types.js';
2
+ /**
3
+ * A partial output delta from a streaming model call.
4
+ *
5
+ * Emitted via {@link ModelRequest.onDelta} during generation. The core
6
+ * does not interpret these — it simply forwards the callback to the
7
+ * model provider. Extensions can subscribe by setting `onDelta` on
8
+ * `ctx.modelRequest` in a `beforeLLM` hook.
9
+ */
10
+ export interface ModelDelta {
11
+ /** What kind of delta this is. */
12
+ type: 'text' | 'reasoning' | 'tool-input';
13
+ /** The partial content for this delta. */
14
+ content: string;
15
+ /** Tool call ID (only for `tool-input` deltas). */
16
+ toolCallId?: string;
17
+ /** Tool name (only for `tool-input` deltas). */
18
+ toolName?: string;
19
+ }
20
+ /**
21
+ * Request to a model provider.
22
+ *
23
+ * The provider translates this into whatever wire format it speaks.
24
+ * If `onDelta` is provided, the provider should stream partial output
25
+ * via that callback in addition to returning the final {@link ModelResponse}.
26
+ */
27
+ export interface ModelRequest {
28
+ messages: Message[];
29
+ tools?: ToolDefinition[];
30
+ /** System instructions prepended to the conversation. */
31
+ systemPrompt?: string;
32
+ temperature?: number;
33
+ maxTokens?: number;
34
+ signal?: AbortSignal;
35
+ /**
36
+ * Optional callback for streaming deltas.
37
+ *
38
+ * When set, the model provider should use its streaming API and
39
+ * invoke this callback for each text/reasoning/tool-input delta.
40
+ * The final assembled {@link ModelResponse} is still returned.
41
+ */
42
+ onDelta?: (delta: ModelDelta) => void;
43
+ }
44
+ /** Why the model stopped generating. */
45
+ export type FinishReason = 'stop' | 'tool_calls' | 'length' | 'content_filter';
46
+ /** Response from a model provider. */
47
+ export interface ModelResponse {
48
+ /** The assistant message. May contain `toolCalls` when the model requests tools. */
49
+ message: Message;
50
+ finishReason: FinishReason;
51
+ usage?: {
52
+ promptTokens: number;
53
+ completionTokens: number;
54
+ /** Prompt tokens served from the provider's cache (cache read/hit). */
55
+ cachedPromptTokens?: number;
56
+ /** Prompt tokens written to the provider's cache for future reuse. */
57
+ cacheWriteTokens?: number;
58
+ /** Reasoning/thinking tokens if the provider reports them separately. */
59
+ reasoningTokens?: number;
60
+ };
61
+ }
62
+ /**
63
+ * Abstract model interface.
64
+ *
65
+ * Implementations are responsible for translating libra's {@link Message}
66
+ * format to/from their wire format and for surfacing tool-call decisions
67
+ * via {@link Message.toolCalls}.
68
+ *
69
+ * The built-in {@link AISdkModel} wraps any Vercel AI SDK provider. You can
70
+ * also implement this interface directly for custom providers.
71
+ */
72
+ export interface Model {
73
+ generate(request: ModelRequest): Promise<ModelResponse>;
74
+ }
75
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,YAAY,CAAC;IAC1C,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAED,wCAAwC;AACxC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAE/E,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;IAC3B,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,uEAAuE;QACvE,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,sEAAsE;QACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,yEAAyE;QACzE,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACzD"}
package/dist/model.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":""}
package/dist/tool.d.ts ADDED
@@ -0,0 +1,78 @@
1
+ import type { ToolDefinition, ToolResult } from './types.js';
2
+ import type { Agent } from './agent.js';
3
+ /** Context passed to a tool's execute function. */
4
+ export interface ToolContext {
5
+ /** AbortSignal — aborted when the turn is halted. */
6
+ signal: AbortSignal;
7
+ /** Shared turn metadata bag. Extensions may read/write here. */
8
+ metadata: Record<string, unknown>;
9
+ }
10
+ /**
11
+ * A tool the agent can call.
12
+ *
13
+ * `parameters` is a JSON Schema object (OpenAI function parameters format).
14
+ * `execute` receives parsed arguments and a context.
15
+ *
16
+ * Set `external: true` for tools whose calls should be returned to the caller
17
+ * instead of executed internally. When the model calls an external tool, the
18
+ * agent breaks its continuation loop and returns the tool call in the response
19
+ * with `finishReason: 'tool_calls'`. The caller is responsible for executing
20
+ * the tool and sending the result back in a subsequent request.
21
+ */
22
+ export interface Tool {
23
+ name: string;
24
+ description?: string;
25
+ parameters: Record<string, unknown>;
26
+ execute(args: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult>;
27
+ /**
28
+ * When true, the agent does not execute this tool. Instead, the tool call
29
+ * is returned to the caller via `AgentResponse.toolCalls` with
30
+ * `finishReason: 'tool_calls'`. The caller executes the tool and sends
31
+ * the result back as a `tool` message in a follow-up request.
32
+ */
33
+ external?: boolean;
34
+ }
35
+ /** Convert a libra {@link Tool} to an OpenAI-compatible {@link ToolDefinition}. */
36
+ export declare function toToolDefinition(tool: Tool): ToolDefinition;
37
+ /**
38
+ * Options for {@link createAgentTool}.
39
+ */
40
+ export interface AgentToolOptions {
41
+ /** Tool name as seen by the LLM. */
42
+ name: string;
43
+ /** Tool description as seen by the LLM. */
44
+ description: string;
45
+ /** JSON Schema for the tool's single `message` parameter. */
46
+ parameters?: Record<string, unknown>;
47
+ /** System prompt override for the inner agent's turns. */
48
+ systemPrompt?: string;
49
+ /** Max iterations for the inner agent's turns. */
50
+ maxIterations?: number;
51
+ }
52
+ /**
53
+ * Wrap an {@link Agent} as a {@link Tool} so an outer agent can delegate to it.
54
+ *
55
+ * The inner agent runs fully in-process. The outer agent's `AbortSignal` and
56
+ * `metadata` are forwarded to the inner agent's turn, so:
57
+ *
58
+ * - If the outer turn is **halted**, the inner agent is also halted.
59
+ * - The inner agent **shares metadata** with the outer turn (e.g. session ID,
60
+ * trace IDs, user context).
61
+ * - If the inner agent is **halted** (via its own hooks or signal), the tool
62
+ * returns an error result so the outer agent can react.
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const researchTool = createAgentTool(researchAgent, {
67
+ * name: 'research',
68
+ * description: 'Delegate a research question to a research agent',
69
+ * })
70
+ *
71
+ * const outerAgent = new Agent({
72
+ * model,
73
+ * tools: [researchTool],
74
+ * })
75
+ * ```
76
+ */
77
+ export declare function createAgentTool(agent: Agent, options: AgentToolOptions): Tool;
78
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,MAAM,EAAE,WAAW,CAAC;IACpB,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9E;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,cAAc,CAS3D;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CA0C7E"}
package/dist/tool.js ADDED
@@ -0,0 +1,78 @@
1
+ /** Convert a libra {@link Tool} to an OpenAI-compatible {@link ToolDefinition}. */
2
+ export function toToolDefinition(tool) {
3
+ return {
4
+ type: 'function',
5
+ function: {
6
+ name: tool.name,
7
+ description: tool.description,
8
+ parameters: tool.parameters,
9
+ },
10
+ };
11
+ }
12
+ /**
13
+ * Wrap an {@link Agent} as a {@link Tool} so an outer agent can delegate to it.
14
+ *
15
+ * The inner agent runs fully in-process. The outer agent's `AbortSignal` and
16
+ * `metadata` are forwarded to the inner agent's turn, so:
17
+ *
18
+ * - If the outer turn is **halted**, the inner agent is also halted.
19
+ * - The inner agent **shares metadata** with the outer turn (e.g. session ID,
20
+ * trace IDs, user context).
21
+ * - If the inner agent is **halted** (via its own hooks or signal), the tool
22
+ * returns an error result so the outer agent can react.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const researchTool = createAgentTool(researchAgent, {
27
+ * name: 'research',
28
+ * description: 'Delegate a research question to a research agent',
29
+ * })
30
+ *
31
+ * const outerAgent = new Agent({
32
+ * model,
33
+ * tools: [researchTool],
34
+ * })
35
+ * ```
36
+ */
37
+ export function createAgentTool(agent, options) {
38
+ return {
39
+ name: options.name,
40
+ description: options.description,
41
+ parameters: options.parameters ?? {
42
+ type: 'object',
43
+ properties: {
44
+ message: {
45
+ type: 'string',
46
+ description: 'The message to send to the agent.',
47
+ },
48
+ },
49
+ required: ['message'],
50
+ },
51
+ async execute(args, ctx) {
52
+ const message = args.message != null
53
+ ? String(args.message)
54
+ : args.query != null
55
+ ? String(args.query)
56
+ : JSON.stringify(args);
57
+ const result = await agent.run({
58
+ message,
59
+ signal: ctx.signal,
60
+ metadata: ctx.metadata,
61
+ ...(options.systemPrompt && { systemPrompt: options.systemPrompt }),
62
+ ...(options.maxIterations !== undefined && { maxIterations: options.maxIterations }),
63
+ });
64
+ if (result.finishReason === 'halted') {
65
+ return {
66
+ toolCallId: '',
67
+ content: 'Subagent was halted.',
68
+ isError: true,
69
+ };
70
+ }
71
+ return {
72
+ toolCallId: '',
73
+ content: result.message,
74
+ };
75
+ },
76
+ };
77
+ }
78
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAqCA,mFAAmF;AACnF,MAAM,UAAU,gBAAgB,CAAC,IAAU;IACzC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B;KACF,CAAC;AACJ,CAAC;AAkBD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,eAAe,CAAC,KAAY,EAAE,OAAyB;IACrE,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI;YAChC,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mCAAmC;iBACjD;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI;gBAClC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;gBACtB,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI;oBAClB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;oBACpB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC;gBAC7B,OAAO;gBACP,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;gBACnE,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;aACrF,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACrC,OAAO;oBACL,UAAU,EAAE,EAAE;oBACd,OAAO,EAAE,sBAAsB;oBAC/B,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,UAAU,EAAE,EAAE;gBACd,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Core message and content types.
3
+ *
4
+ * These are libra's own types. The model provider translates to/from
5
+ * the wire format of whatever API it targets (OpenAI-compatible, etc.).
6
+ */
7
+ /** A single tool call requested by the model. */
8
+ export interface ToolCall {
9
+ /** Unique id assigned by the model, used to correlate tool results. */
10
+ id: string;
11
+ /** The tool/function name to invoke. */
12
+ name: string;
13
+ /** JSON-encoded arguments string (matches OpenAI tool_call.function.arguments). */
14
+ arguments: string;
15
+ }
16
+ /** The result of executing a tool call. */
17
+ export interface ToolResult {
18
+ /** Correlates with {@link ToolCall.id}. */
19
+ toolCallId: string;
20
+ /** Human/machine readable result content. */
21
+ content: string;
22
+ /** When true, the result represents a failure the model should see as an error. */
23
+ isError?: boolean;
24
+ }
25
+ /** Conversation participant role. */
26
+ export type Role = 'system' | 'user' | 'assistant' | 'tool';
27
+ /** Text content within a multimodal message. */
28
+ export interface TextContentPart {
29
+ type: 'text';
30
+ text: string;
31
+ }
32
+ /** Provider-independent file data. */
33
+ export type FileContentData = {
34
+ type: 'data';
35
+ data: string | Uint8Array;
36
+ } | {
37
+ type: 'url';
38
+ url: string;
39
+ } | {
40
+ type: 'text';
41
+ text: string;
42
+ };
43
+ /** A file attachment, including images, documents, audio, and video. */
44
+ export interface FileContentPart {
45
+ type: 'file';
46
+ mediaType: string;
47
+ filename?: string;
48
+ data: FileContentData;
49
+ }
50
+ /** Message content. Strings remain supported as the text-only shorthand. */
51
+ export type MessageContent = string | Array<TextContentPart | FileContentPart>;
52
+ /** Convert message content to a text representation for logs and text-only extensions. */
53
+ export declare function messageContentToText(content: MessageContent): string;
54
+ /** Whether message content contains at least one file attachment. */
55
+ export declare function hasFileContent(content: MessageContent, mediaTypePrefix?: string): boolean;
56
+ /**
57
+ * A single conversation message.
58
+ *
59
+ * - `assistant` messages may carry `toolCalls` when the model requests tools.
60
+ * - `tool` messages carry a single `toolCallId` linking back to the call
61
+ * and `content` holds the tool result.
62
+ */
63
+ export interface Message {
64
+ role: Role;
65
+ /** Text or multimodal content. For `tool` messages this is the tool result. */
66
+ content: MessageContent;
67
+ /** Present on assistant messages that request tool execution. */
68
+ toolCalls?: ToolCall[];
69
+ /** Present on tool messages — links to the originating tool call id. */
70
+ toolCallId?: string;
71
+ /** Optional tool name for tool messages. */
72
+ name?: string;
73
+ }
74
+ /** JSON Schema describing a tool's parameters (OpenAI function format). */
75
+ export interface ToolDefinition {
76
+ type: 'function';
77
+ function: {
78
+ name: string;
79
+ description?: string;
80
+ parameters: Record<string, unknown>;
81
+ };
82
+ }
83
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iDAAiD;AACjD,MAAM,WAAW,QAAQ;IACvB,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,2CAA2C;AAC3C,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qCAAqC;AACrC,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AAE5D,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,sCAAsC;AACtC,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,wEAAwE;AACxE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,4EAA4E;AAC5E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC,eAAe,GAAG,eAAe,CAAC,CAAC;AAE/E,0FAA0F;AAC1F,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAMpE;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAIzF;AAED;;;;;;GAMG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,+EAA+E;IAC/E,OAAO,EAAE,cAAc,CAAC;IACxB,iEAAiE;IACjE,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CACH"}
package/dist/types.js ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Core message and content types.
3
+ *
4
+ * These are libra's own types. The model provider translates to/from
5
+ * the wire format of whatever API it targets (OpenAI-compatible, etc.).
6
+ */
7
+ /** Convert message content to a text representation for logs and text-only extensions. */
8
+ export function messageContentToText(content) {
9
+ if (typeof content === 'string')
10
+ return content;
11
+ return content.map((part) => {
12
+ if (part.type === 'text')
13
+ return part.text;
14
+ return part.filename ? `[File: ${part.filename} (${part.mediaType})]` : `[File: ${part.mediaType}]`;
15
+ }).join('\n');
16
+ }
17
+ /** Whether message content contains at least one file attachment. */
18
+ export function hasFileContent(content, mediaTypePrefix) {
19
+ return Array.isArray(content) && content.some((part) => part.type === 'file' && (!mediaTypePrefix || part.mediaType.startsWith(mediaTypePrefix)));
20
+ }
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgDH,0FAA0F;AAC1F,MAAM,UAAU,oBAAoB,CAAC,OAAuB;IAC1D,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,SAAS,GAAG,CAAC;IACtG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,OAAuB,EAAE,eAAwB;IAC9E,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACrD,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CACzF,CAAC;AACJ,CAAC"}