@elie-laloum/outpost 4.2.0 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +13 -11
  3. package/SECURITY.md +2 -0
  4. package/dist/adapters/agents/antigravity-adapter.d.ts +3 -0
  5. package/dist/adapters/agents/antigravity-adapter.js +39 -0
  6. package/dist/adapters/agents/antigravity-adapter.js.map +1 -0
  7. package/dist/adapters/agents/antigravity-authentication.d.ts +2 -0
  8. package/dist/adapters/agents/antigravity-authentication.js +27 -0
  9. package/dist/adapters/agents/antigravity-authentication.js.map +1 -0
  10. package/dist/adapters/agents/antigravity-diagnostics.d.ts +1 -0
  11. package/dist/adapters/agents/antigravity-diagnostics.js +6 -0
  12. package/dist/adapters/agents/antigravity-diagnostics.js.map +1 -0
  13. package/dist/adapters/agents/antigravity-events.d.ts +2 -0
  14. package/dist/adapters/agents/antigravity-events.js +66 -0
  15. package/dist/adapters/agents/antigravity-events.js.map +1 -0
  16. package/dist/adapters/agents/antigravity-request.d.ts +5 -0
  17. package/dist/adapters/agents/antigravity-request.js +29 -0
  18. package/dist/adapters/agents/antigravity-request.js.map +1 -0
  19. package/dist/adapters/agents/antigravity.types.d.ts +7 -0
  20. package/dist/adapters/agents/antigravity.types.js +2 -0
  21. package/dist/adapters/agents/antigravity.types.js.map +1 -0
  22. package/dist/adapters/agents/authentication.constants.d.ts +23 -0
  23. package/dist/adapters/agents/authentication.constants.js +13 -0
  24. package/dist/adapters/agents/authentication.constants.js.map +1 -0
  25. package/dist/adapters/agents/authentication.d.ts +11 -0
  26. package/dist/adapters/agents/authentication.js +75 -0
  27. package/dist/adapters/agents/authentication.js.map +1 -0
  28. package/dist/adapters/agents/authentication.types.d.ts +20 -0
  29. package/dist/adapters/agents/authentication.types.js +2 -0
  30. package/dist/adapters/agents/authentication.types.js.map +1 -0
  31. package/dist/adapters/agents/claude-adapter.d.ts +2 -2
  32. package/dist/adapters/agents/claude-adapter.js +32 -2
  33. package/dist/adapters/agents/claude-adapter.js.map +1 -1
  34. package/dist/adapters/agents/claude-authentication.d.ts +2 -0
  35. package/dist/adapters/agents/claude-authentication.js +34 -0
  36. package/dist/adapters/agents/claude-authentication.js.map +1 -0
  37. package/dist/adapters/agents/claude-request.d.ts +2 -2
  38. package/dist/adapters/agents/claude-request.js +3 -3
  39. package/dist/adapters/agents/claude-request.js.map +1 -1
  40. package/dist/adapters/agents/cli-diagnostics.constants.d.ts +6 -6
  41. package/dist/adapters/agents/cli-diagnostics.constants.js +6 -6
  42. package/dist/adapters/agents/cli-diagnostics.constants.js.map +1 -1
  43. package/dist/adapters/agents/cli-diagnostics.d.ts +1 -0
  44. package/dist/adapters/agents/cli-diagnostics.js +11 -0
  45. package/dist/adapters/agents/cli-diagnostics.js.map +1 -1
  46. package/dist/adapters/agents/codex-adapter.d.ts +2 -2
  47. package/dist/adapters/agents/codex-adapter.js +19 -1
  48. package/dist/adapters/agents/codex-adapter.js.map +1 -1
  49. package/dist/adapters/agents/codex-authentication.d.ts +3 -0
  50. package/dist/adapters/agents/codex-authentication.js +47 -0
  51. package/dist/adapters/agents/codex-authentication.js.map +1 -0
  52. package/dist/adapters/agents/codex-provider.d.ts +2 -2
  53. package/dist/adapters/agents/codex-provider.js +1 -1
  54. package/dist/adapters/agents/codex-provider.js.map +1 -1
  55. package/dist/adapters/agents/codex-request.d.ts +2 -2
  56. package/dist/adapters/agents/codex-request.js +3 -3
  57. package/dist/adapters/agents/codex-request.js.map +1 -1
  58. package/dist/adapters/agents/copilot-adapter.d.ts +3 -0
  59. package/dist/adapters/agents/copilot-adapter.js +39 -0
  60. package/dist/adapters/agents/copilot-adapter.js.map +1 -0
  61. package/dist/adapters/agents/copilot-authentication.d.ts +2 -0
  62. package/dist/adapters/agents/copilot-authentication.js +45 -0
  63. package/dist/adapters/agents/copilot-authentication.js.map +1 -0
  64. package/dist/adapters/agents/copilot-diagnostics.d.ts +1 -0
  65. package/dist/adapters/agents/copilot-diagnostics.js +6 -0
  66. package/dist/adapters/agents/copilot-diagnostics.js.map +1 -0
  67. package/dist/adapters/agents/copilot-events.d.ts +2 -0
  68. package/dist/adapters/agents/copilot-events.js +50 -0
  69. package/dist/adapters/agents/copilot-events.js.map +1 -0
  70. package/dist/adapters/agents/copilot-request.d.ts +5 -0
  71. package/dist/adapters/agents/copilot-request.js +19 -0
  72. package/dist/adapters/agents/copilot-request.js.map +1 -0
  73. package/dist/adapters/agents/copilot.types.d.ts +6 -0
  74. package/dist/adapters/agents/copilot.types.js +2 -0
  75. package/dist/adapters/agents/copilot.types.js.map +1 -0
  76. package/dist/adapters/agents/event-decoder.d.ts +2 -2
  77. package/dist/adapters/agents/event-decoder.js +6 -5
  78. package/dist/adapters/agents/event-decoder.js.map +1 -1
  79. package/dist/adapters/agents/kimi-adapter.d.ts +3 -0
  80. package/dist/adapters/agents/kimi-adapter.js +35 -0
  81. package/dist/adapters/agents/kimi-adapter.js.map +1 -0
  82. package/dist/adapters/agents/kimi-authentication.d.ts +2 -0
  83. package/dist/adapters/agents/kimi-authentication.js +48 -0
  84. package/dist/adapters/agents/kimi-authentication.js.map +1 -0
  85. package/dist/adapters/agents/kimi-diagnostics.d.ts +1 -0
  86. package/dist/adapters/agents/kimi-diagnostics.js +6 -0
  87. package/dist/adapters/agents/kimi-diagnostics.js.map +1 -0
  88. package/dist/adapters/agents/kimi-events.d.ts +2 -0
  89. package/dist/adapters/agents/kimi-events.js +51 -0
  90. package/dist/adapters/agents/kimi-events.js.map +1 -0
  91. package/dist/adapters/agents/kimi-request.d.ts +5 -0
  92. package/dist/adapters/agents/kimi-request.js +28 -0
  93. package/dist/adapters/agents/kimi-request.js.map +1 -0
  94. package/dist/adapters/agents/kimi.types.d.ts +6 -0
  95. package/dist/adapters/agents/kimi.types.js +2 -0
  96. package/dist/adapters/agents/kimi.types.js.map +1 -0
  97. package/dist/adapters/agents/model-support.constants.d.ts +8 -0
  98. package/dist/adapters/agents/model-support.constants.js +28 -0
  99. package/dist/adapters/agents/model-support.constants.js.map +1 -0
  100. package/dist/adapters/agents/model-support.d.ts +4 -0
  101. package/dist/adapters/agents/model-support.js +11 -0
  102. package/dist/adapters/agents/model-support.js.map +1 -0
  103. package/dist/adapters/agents/protocol-fixtures.constants.d.ts +2 -2
  104. package/dist/adapters/agents/protocol-fixtures.constants.js +135 -9
  105. package/dist/adapters/agents/protocol-fixtures.constants.js.map +1 -1
  106. package/dist/adapters/agents/protocol-fixtures.types.d.ts +1 -0
  107. package/dist/adapters/agents/protocol-fixtures.types.js.map +1 -1
  108. package/dist/adapters/agents/protocol.d.ts +1 -0
  109. package/dist/adapters/agents/protocol.js +9 -0
  110. package/dist/adapters/agents/protocol.js.map +1 -1
  111. package/dist/adapters/agents/settings.types.d.ts +11 -3
  112. package/dist/adapters/agents/settings.types.js.map +1 -1
  113. package/dist/adapters/models/anthropic-model-provider.constants.d.ts +3 -0
  114. package/dist/adapters/models/anthropic-model-provider.constants.js +17 -0
  115. package/dist/adapters/models/anthropic-model-provider.constants.js.map +1 -0
  116. package/dist/adapters/models/anthropic-model-provider.d.ts +3 -0
  117. package/dist/adapters/models/anthropic-model-provider.js +31 -0
  118. package/dist/adapters/models/anthropic-model-provider.js.map +1 -0
  119. package/dist/adapters/models/anthropic-model-provider.types.d.ts +7 -0
  120. package/dist/adapters/models/anthropic-model-provider.types.js +2 -0
  121. package/dist/adapters/models/anthropic-model-provider.types.js.map +1 -0
  122. package/dist/adapters/models/anthropic-request.d.ts +4 -0
  123. package/dist/adapters/models/anthropic-request.js +81 -0
  124. package/dist/adapters/models/anthropic-request.js.map +1 -0
  125. package/dist/adapters/models/anthropic-response.d.ts +3 -0
  126. package/dist/adapters/models/anthropic-response.js +55 -0
  127. package/dist/adapters/models/anthropic-response.js.map +1 -0
  128. package/dist/adapters/models/anthropic-stream.d.ts +2 -0
  129. package/dist/adapters/models/anthropic-stream.js +96 -0
  130. package/dist/adapters/models/anthropic-stream.js.map +1 -0
  131. package/dist/adapters/models/http-provider.d.ts +3 -0
  132. package/dist/adapters/models/http-provider.js +113 -0
  133. package/dist/adapters/models/http-provider.js.map +1 -0
  134. package/dist/adapters/models/{openai-http.js → model-http.js} +1 -1
  135. package/dist/adapters/models/model-http.js.map +1 -0
  136. package/dist/adapters/models/model-protocol.types.d.ts +41 -0
  137. package/dist/adapters/models/model-protocol.types.js +2 -0
  138. package/dist/adapters/models/model-protocol.types.js.map +1 -0
  139. package/dist/adapters/models/model-request.d.ts +2 -0
  140. package/dist/adapters/models/model-request.js +18 -0
  141. package/dist/adapters/models/model-request.js.map +1 -0
  142. package/dist/adapters/models/model-response.d.ts +7 -0
  143. package/dist/adapters/models/model-response.js +41 -0
  144. package/dist/adapters/models/model-response.js.map +1 -0
  145. package/dist/adapters/models/{openai-compatible.constants.js → model.constants.js} +6 -1
  146. package/dist/adapters/models/model.constants.js.map +1 -0
  147. package/dist/adapters/models/openai-chat-stream.d.ts +2 -0
  148. package/dist/adapters/models/openai-chat-stream.js +66 -0
  149. package/dist/adapters/models/openai-chat-stream.js.map +1 -0
  150. package/dist/adapters/models/openai-chat.d.ts +4 -0
  151. package/dist/adapters/models/openai-chat.js +108 -0
  152. package/dist/adapters/models/openai-chat.js.map +1 -0
  153. package/dist/adapters/models/openai-model-provider.d.ts +3 -0
  154. package/dist/adapters/models/openai-model-provider.js +13 -0
  155. package/dist/adapters/models/openai-model-provider.js.map +1 -0
  156. package/dist/adapters/models/openai-model-provider.types.d.ts +4 -0
  157. package/dist/adapters/models/openai-model-provider.types.js +2 -0
  158. package/dist/adapters/models/openai-model-provider.types.js.map +1 -0
  159. package/dist/adapters/models/openai-protocols.d.ts +2 -0
  160. package/dist/adapters/models/openai-protocols.js +22 -0
  161. package/dist/adapters/models/openai-protocols.js.map +1 -0
  162. package/dist/adapters/models/openai-responses-stream.d.ts +2 -0
  163. package/dist/adapters/models/openai-responses-stream.js +35 -0
  164. package/dist/adapters/models/openai-responses-stream.js.map +1 -0
  165. package/dist/adapters/models/openai-responses.d.ts +4 -0
  166. package/dist/adapters/models/openai-responses.js +107 -0
  167. package/dist/adapters/models/openai-responses.js.map +1 -0
  168. package/dist/adapters/models/openai-usage.d.ts +3 -0
  169. package/dist/adapters/models/openai-usage.js +20 -0
  170. package/dist/adapters/models/openai-usage.js.map +1 -0
  171. package/dist/adapters/models/stop-reasons.constants.d.ts +4 -0
  172. package/dist/adapters/models/stop-reasons.constants.js +19 -0
  173. package/dist/adapters/models/stop-reasons.constants.js.map +1 -0
  174. package/dist/adapters/models/stream-events.d.ts +3 -0
  175. package/dist/adapters/models/stream-events.js +22 -0
  176. package/dist/adapters/models/stream-events.js.map +1 -0
  177. package/dist/adapters/tools/edit-tools.d.ts +2 -0
  178. package/dist/adapters/tools/edit-tools.js +84 -0
  179. package/dist/adapters/tools/edit-tools.js.map +1 -0
  180. package/dist/adapters/tools/file-tools.d.ts +2 -0
  181. package/dist/adapters/tools/file-tools.js +97 -0
  182. package/dist/adapters/tools/file-tools.js.map +1 -0
  183. package/dist/adapters/tools/git-tools.d.ts +2 -0
  184. package/dist/adapters/tools/git-tools.js +54 -0
  185. package/dist/adapters/tools/git-tools.js.map +1 -0
  186. package/dist/adapters/tools/sandbox-files.d.ts +10 -0
  187. package/dist/adapters/tools/sandbox-files.js +60 -0
  188. package/dist/adapters/tools/sandbox-files.js.map +1 -0
  189. package/dist/adapters/tools/search-tools.d.ts +2 -0
  190. package/dist/adapters/tools/search-tools.js +65 -0
  191. package/dist/adapters/tools/search-tools.js.map +1 -0
  192. package/dist/adapters/tools/shell-tools.d.ts +3 -0
  193. package/dist/adapters/tools/shell-tools.js +38 -0
  194. package/dist/adapters/tools/shell-tools.js.map +1 -0
  195. package/dist/adapters/tools/tools.constants.d.ts +11 -0
  196. package/dist/adapters/tools/tools.constants.js +17 -0
  197. package/dist/adapters/tools/tools.constants.js.map +1 -0
  198. package/dist/adapters/tools/tools.types.d.ts +41 -0
  199. package/dist/adapters/tools/tools.types.js +2 -0
  200. package/dist/adapters/tools/tools.types.js.map +1 -0
  201. package/dist/application/activity-watchdog.js +15 -2
  202. package/dist/application/activity-watchdog.js.map +1 -1
  203. package/dist/application/agent-authentication.d.ts +4 -0
  204. package/dist/application/agent-authentication.js +32 -0
  205. package/dist/application/agent-authentication.js.map +1 -0
  206. package/dist/application/agent-bootstrap.constants.d.ts +2 -5
  207. package/dist/application/agent-bootstrap.constants.js +29 -4
  208. package/dist/application/agent-bootstrap.constants.js.map +1 -1
  209. package/dist/application/agent-bootstrap.d.ts +2 -2
  210. package/dist/application/agent-bootstrap.js +35 -12
  211. package/dist/application/agent-bootstrap.js.map +1 -1
  212. package/dist/application/agent-bootstrap.types.d.ts +20 -0
  213. package/dist/application/agent-bootstrap.types.js +2 -0
  214. package/dist/application/agent-bootstrap.types.js.map +1 -0
  215. package/dist/application/agent-storage.d.ts +3 -2
  216. package/dist/application/agent-storage.js +9 -2
  217. package/dist/application/agent-storage.js.map +1 -1
  218. package/dist/application/agent-turn.d.ts +3 -3
  219. package/dist/application/agent-turn.js +7 -1
  220. package/dist/application/agent-turn.js.map +1 -1
  221. package/dist/application/attach.js +1 -0
  222. package/dist/application/attach.js.map +1 -1
  223. package/dist/application/credential-installer.constants.d.ts +1 -0
  224. package/dist/application/credential-installer.constants.js +22 -0
  225. package/dist/application/credential-installer.constants.js.map +1 -0
  226. package/dist/application/custom-turn.d.ts +5 -0
  227. package/dist/application/custom-turn.js +190 -0
  228. package/dist/application/custom-turn.js.map +1 -0
  229. package/dist/application/dispatch-observation.d.ts +3 -0
  230. package/dist/application/dispatch-observation.js +51 -0
  231. package/dist/application/dispatch-observation.js.map +1 -0
  232. package/dist/application/dispatch-observation.types.d.ts +5 -0
  233. package/dist/application/dispatch-observation.types.js +2 -0
  234. package/dist/application/dispatch-observation.types.js.map +1 -0
  235. package/dist/application/dispatch-validation.d.ts +2 -2
  236. package/dist/application/dispatch-validation.js.map +1 -1
  237. package/dist/application/dispatch.js +8 -3
  238. package/dist/application/dispatch.js.map +1 -1
  239. package/dist/application/doctor-agent.constants.d.ts +2 -8
  240. package/dist/application/doctor-agent.constants.js +40 -6
  241. package/dist/application/doctor-agent.constants.js.map +1 -1
  242. package/dist/application/doctor-agent.d.ts +2 -1
  243. package/dist/application/doctor-agent.js +11 -3
  244. package/dist/application/doctor-agent.js.map +1 -1
  245. package/dist/application/doctor-image.js +7 -9
  246. package/dist/application/doctor-image.js.map +1 -1
  247. package/dist/application/doctor-protocol.js +6 -6
  248. package/dist/application/doctor-protocol.js.map +1 -1
  249. package/dist/application/doctor-protocol.types.d.ts +1 -1
  250. package/dist/application/doctor-protocol.types.js.map +1 -1
  251. package/dist/application/doctor-sandbox.js +6 -9
  252. package/dist/application/doctor-sandbox.js.map +1 -1
  253. package/dist/application/doctor-sandbox.types.d.ts +2 -2
  254. package/dist/application/doctor-sandbox.types.js.map +1 -1
  255. package/dist/application/doctor.constants.d.ts +1 -1
  256. package/dist/application/doctor.constants.js +1 -1
  257. package/dist/application/doctor.constants.js.map +1 -1
  258. package/dist/application/doctor.js +12 -13
  259. package/dist/application/doctor.js.map +1 -1
  260. package/dist/application/doctor.types.d.ts +12 -4
  261. package/dist/application/doctor.types.js.map +1 -1
  262. package/dist/application/execution.d.ts +2 -2
  263. package/dist/application/execution.js +1 -1
  264. package/dist/application/execution.js.map +1 -1
  265. package/dist/application/execution.types.d.ts +9 -2
  266. package/dist/application/execution.types.js.map +1 -1
  267. package/dist/application/harness-context.d.ts +2 -0
  268. package/dist/application/harness-context.js +54 -0
  269. package/dist/application/harness-context.js.map +1 -0
  270. package/dist/application/harness-history.d.ts +3 -0
  271. package/dist/application/harness-history.js +17 -0
  272. package/dist/application/harness-history.js.map +1 -0
  273. package/dist/application/harness-hooks.d.ts +9 -0
  274. package/dist/application/harness-hooks.js +90 -0
  275. package/dist/application/harness-hooks.js.map +1 -0
  276. package/dist/application/harness-loop.d.ts +2 -0
  277. package/dist/application/harness-loop.js +132 -0
  278. package/dist/application/harness-loop.js.map +1 -0
  279. package/dist/application/harness.types.d.ts +55 -0
  280. package/dist/application/harness.types.js +2 -0
  281. package/dist/application/harness.types.js.map +1 -0
  282. package/dist/application/lifecycle.constants.d.ts +1 -1
  283. package/dist/application/lifecycle.constants.js +1 -1
  284. package/dist/application/lifecycle.constants.js.map +1 -1
  285. package/dist/application/outpost.types.d.ts +6 -7
  286. package/dist/application/outpost.types.js.map +1 -1
  287. package/dist/application/recovery-retention.js +65 -24
  288. package/dist/application/recovery-retention.js.map +1 -1
  289. package/dist/application/remote-download.js +1 -1
  290. package/dist/application/remote-download.js.map +1 -1
  291. package/dist/application/sandbox-agents.js +14 -5
  292. package/dist/application/sandbox-agents.js.map +1 -1
  293. package/dist/application/sandbox-attach.js +5 -2
  294. package/dist/application/sandbox-attach.js.map +1 -1
  295. package/dist/application/sandbox-dispatch.js +3 -5
  296. package/dist/application/sandbox-dispatch.js.map +1 -1
  297. package/dist/application/sandbox-provision.js +13 -10
  298. package/dist/application/sandbox-provision.js.map +1 -1
  299. package/dist/application/sandbox-session.types.d.ts +13 -8
  300. package/dist/application/sandbox-session.types.js.map +1 -1
  301. package/dist/application/sandbox.js +6 -3
  302. package/dist/application/sandbox.js.map +1 -1
  303. package/dist/application/speculation.js +1 -1
  304. package/dist/application/speculation.js.map +1 -1
  305. package/dist/application/speculation.types.d.ts +3 -3
  306. package/dist/application/speculation.types.js.map +1 -1
  307. package/dist/application/startup-recovery.js +1 -1
  308. package/dist/application/startup-recovery.js.map +1 -1
  309. package/dist/application/storage-reservation.js +9 -2
  310. package/dist/application/storage-reservation.js.map +1 -1
  311. package/dist/application/tasks.types.d.ts +2 -2
  312. package/dist/application/tasks.types.js.map +1 -1
  313. package/dist/application/tool-execution.d.ts +3 -0
  314. package/dist/application/tool-execution.js +211 -0
  315. package/dist/application/tool-execution.js.map +1 -0
  316. package/dist/cli/commands.js +4 -2
  317. package/dist/cli/commands.js.map +1 -1
  318. package/dist/cli/doctor-command.js +11 -7
  319. package/dist/cli/doctor-command.js.map +1 -1
  320. package/dist/cli/init-authentication.d.ts +4 -1
  321. package/dist/cli/init-authentication.js +28 -34
  322. package/dist/cli/init-authentication.js.map +1 -1
  323. package/dist/cli/init-command.js +6 -6
  324. package/dist/cli/init-command.js.map +1 -1
  325. package/dist/cli/main.constants.d.ts +54 -17
  326. package/dist/cli/main.constants.js +74 -12
  327. package/dist/cli/main.constants.js.map +1 -1
  328. package/dist/cli/recovery-command.js +1 -1
  329. package/dist/cli/recovery-command.js.map +1 -1
  330. package/dist/cli/scaffold-files.js +6 -5
  331. package/dist/cli/scaffold-files.js.map +1 -1
  332. package/dist/cli/scaffold-validation.js +26 -16
  333. package/dist/cli/scaffold-validation.js.map +1 -1
  334. package/dist/cli/scaffold.constants.d.ts +0 -1
  335. package/dist/cli/scaffold.constants.js +5 -2
  336. package/dist/cli/scaffold.constants.js.map +1 -1
  337. package/dist/cli/scaffold.js +8 -4
  338. package/dist/cli/scaffold.js.map +1 -1
  339. package/dist/cli/scaffold.types.d.ts +9 -3
  340. package/dist/cli/scaffold.types.js.map +1 -1
  341. package/dist/cli/starters.js +8 -10
  342. package/dist/cli/starters.js.map +1 -1
  343. package/dist/domain/agent-model.d.ts +3 -0
  344. package/dist/domain/agent-model.js +22 -0
  345. package/dist/domain/agent-model.js.map +1 -0
  346. package/dist/domain/agent.d.ts +4 -0
  347. package/dist/domain/agent.js +32 -0
  348. package/dist/domain/agent.js.map +1 -0
  349. package/dist/domain/agent.types.d.ts +105 -2
  350. package/dist/domain/agent.types.js.map +1 -1
  351. package/dist/domain/authentication.constants.d.ts +3 -0
  352. package/dist/domain/authentication.constants.js +11 -0
  353. package/dist/domain/authentication.constants.js.map +1 -0
  354. package/dist/domain/authentication.d.ts +3 -0
  355. package/dist/domain/authentication.js +22 -0
  356. package/dist/domain/authentication.js.map +1 -0
  357. package/dist/domain/authentication.types.d.ts +5 -0
  358. package/dist/domain/authentication.types.js +2 -0
  359. package/dist/domain/authentication.types.js.map +1 -0
  360. package/dist/domain/context.constants.d.ts +7 -0
  361. package/dist/domain/context.constants.js +8 -0
  362. package/dist/domain/context.constants.js.map +1 -0
  363. package/dist/domain/context.d.ts +4 -0
  364. package/dist/domain/context.js +81 -0
  365. package/dist/domain/context.js.map +1 -0
  366. package/dist/domain/context.types.d.ts +26 -0
  367. package/dist/domain/context.types.js +2 -0
  368. package/dist/domain/context.types.js.map +1 -0
  369. package/dist/domain/dispatch-telemetry.types.d.ts +12 -0
  370. package/dist/domain/dispatch-telemetry.types.js +2 -0
  371. package/dist/domain/dispatch-telemetry.types.js.map +1 -0
  372. package/dist/domain/errors.types.d.ts +1 -1
  373. package/dist/domain/errors.types.js.map +1 -1
  374. package/dist/domain/glob.d.ts +2 -0
  375. package/dist/domain/glob.js +25 -0
  376. package/dist/domain/glob.js.map +1 -0
  377. package/dist/domain/glob.types.d.ts +1 -0
  378. package/dist/domain/glob.types.js +2 -0
  379. package/dist/domain/glob.types.js.map +1 -0
  380. package/dist/domain/harness.constants.d.ts +11 -0
  381. package/dist/domain/harness.constants.js +24 -0
  382. package/dist/domain/harness.constants.js.map +1 -0
  383. package/dist/domain/harness.d.ts +2 -0
  384. package/dist/domain/harness.js +89 -0
  385. package/dist/domain/harness.js.map +1 -0
  386. package/dist/domain/harness.types.d.ts +60 -0
  387. package/dist/domain/harness.types.js +2 -0
  388. package/dist/domain/harness.types.js.map +1 -0
  389. package/dist/domain/hook.constants.d.ts +3 -0
  390. package/dist/domain/hook.constants.js +10 -0
  391. package/dist/domain/hook.constants.js.map +1 -0
  392. package/dist/domain/hook.d.ts +3 -0
  393. package/dist/domain/hook.js +25 -0
  394. package/dist/domain/hook.js.map +1 -0
  395. package/dist/domain/hook.types.d.ts +66 -0
  396. package/dist/domain/hook.types.js +2 -0
  397. package/dist/domain/hook.types.js.map +1 -0
  398. package/dist/domain/instructions.d.ts +3 -0
  399. package/dist/domain/instructions.js +25 -0
  400. package/dist/domain/instructions.js.map +1 -0
  401. package/dist/domain/model-messages.d.ts +5 -0
  402. package/dist/domain/model-messages.js +81 -0
  403. package/dist/domain/model-messages.js.map +1 -0
  404. package/dist/domain/model-messages.types.d.ts +6 -0
  405. package/dist/domain/model-messages.types.js +2 -0
  406. package/dist/domain/model-messages.types.js.map +1 -0
  407. package/dist/domain/model.constants.d.ts +4 -0
  408. package/dist/domain/model.constants.js +16 -0
  409. package/dist/domain/model.constants.js.map +1 -0
  410. package/dist/domain/model.types.d.ts +59 -2
  411. package/dist/domain/model.types.js.map +1 -1
  412. package/dist/domain/permissions.d.ts +3 -0
  413. package/dist/domain/permissions.js +92 -0
  414. package/dist/domain/permissions.js.map +1 -0
  415. package/dist/domain/permissions.types.d.ts +34 -0
  416. package/dist/domain/permissions.types.js +2 -0
  417. package/dist/domain/permissions.types.js.map +1 -0
  418. package/dist/domain/response.js +3 -2
  419. package/dist/domain/response.js.map +1 -1
  420. package/dist/domain/response.types.d.ts +12 -0
  421. package/dist/domain/response.types.js.map +1 -1
  422. package/dist/domain/skill.constants.d.ts +2 -0
  423. package/dist/domain/skill.constants.js +8 -0
  424. package/dist/domain/skill.constants.js.map +1 -0
  425. package/dist/domain/skill.d.ts +8 -0
  426. package/dist/domain/skill.js +79 -0
  427. package/dist/domain/skill.js.map +1 -0
  428. package/dist/domain/skill.types.d.ts +18 -0
  429. package/dist/domain/skill.types.js +2 -0
  430. package/dist/domain/skill.types.js.map +1 -0
  431. package/dist/domain/standard-schema.d.ts +6 -0
  432. package/dist/domain/standard-schema.js +45 -0
  433. package/dist/domain/standard-schema.js.map +1 -0
  434. package/dist/domain/tool-schema.d.ts +3 -0
  435. package/dist/domain/tool-schema.js +109 -0
  436. package/dist/domain/tool-schema.js.map +1 -0
  437. package/dist/domain/tool.constants.d.ts +4 -0
  438. package/dist/domain/tool.constants.js +36 -0
  439. package/dist/domain/tool.constants.js.map +1 -0
  440. package/dist/domain/tool.d.ts +4 -0
  441. package/dist/domain/tool.js +66 -0
  442. package/dist/domain/tool.js.map +1 -0
  443. package/dist/domain/tool.types.d.ts +62 -0
  444. package/dist/domain/tool.types.js +2 -0
  445. package/dist/domain/tool.types.js.map +1 -0
  446. package/dist/domain/transcript.d.ts +4 -0
  447. package/dist/domain/transcript.js +48 -0
  448. package/dist/domain/transcript.js.map +1 -0
  449. package/dist/domain/transcript.types.d.ts +15 -0
  450. package/dist/domain/transcript.types.js +2 -0
  451. package/dist/domain/transcript.types.js.map +1 -0
  452. package/dist/domain/workflow/workflow-state.js +13 -6
  453. package/dist/domain/workflow/workflow-state.js.map +1 -1
  454. package/dist/domain/workflow.d.ts +1 -1
  455. package/dist/domain/workflow.js.map +1 -1
  456. package/dist/domain/workflow.types.d.ts +4 -0
  457. package/dist/domain/workflow.types.js.map +1 -1
  458. package/dist/index.d.ts +35 -13
  459. package/dist/index.js +19 -6
  460. package/dist/index.js.map +1 -1
  461. package/dist/infrastructure/conversations/harness-store.d.ts +3 -0
  462. package/dist/infrastructure/conversations/harness-store.js +27 -0
  463. package/dist/infrastructure/conversations/harness-store.js.map +1 -0
  464. package/dist/infrastructure/conversations/harness-transcript.d.ts +2 -0
  465. package/dist/infrastructure/conversations/harness-transcript.js +50 -0
  466. package/dist/infrastructure/conversations/harness-transcript.js.map +1 -0
  467. package/dist/infrastructure/conversations/harness-transcript.types.d.ts +18 -0
  468. package/dist/infrastructure/conversations/harness-transcript.types.js +2 -0
  469. package/dist/infrastructure/conversations/harness-transcript.types.js.map +1 -0
  470. package/dist/infrastructure/conversations.d.ts +4 -1
  471. package/dist/infrastructure/conversations.js +3 -0
  472. package/dist/infrastructure/conversations.js.map +1 -1
  473. package/dist/infrastructure/conversations.types.d.ts +1 -0
  474. package/dist/infrastructure/conversations.types.js.map +1 -1
  475. package/dist/infrastructure/custom-reporter.d.ts +2 -0
  476. package/dist/infrastructure/custom-reporter.js +33 -0
  477. package/dist/infrastructure/custom-reporter.js.map +1 -0
  478. package/dist/infrastructure/custom-reporter.types.d.ts +13 -0
  479. package/dist/infrastructure/custom-reporter.types.js +2 -0
  480. package/dist/infrastructure/custom-reporter.types.js.map +1 -0
  481. package/dist/infrastructure/git/git.constants.d.ts +1 -1
  482. package/dist/infrastructure/git/git.constants.js +2 -0
  483. package/dist/infrastructure/git/git.constants.js.map +1 -1
  484. package/dist/infrastructure/host-credentials.constants.d.ts +1 -0
  485. package/dist/infrastructure/host-credentials.constants.js +2 -0
  486. package/dist/infrastructure/host-credentials.constants.js.map +1 -0
  487. package/dist/infrastructure/host-credentials.d.ts +4 -0
  488. package/dist/infrastructure/host-credentials.js +89 -0
  489. package/dist/infrastructure/host-credentials.js.map +1 -0
  490. package/dist/infrastructure/inspection-path.js +4 -3
  491. package/dist/infrastructure/inspection-path.js.map +1 -1
  492. package/dist/infrastructure/journal.constants.d.ts +1 -0
  493. package/dist/infrastructure/journal.constants.js +2 -0
  494. package/dist/infrastructure/journal.constants.js.map +1 -0
  495. package/dist/infrastructure/journal.js +7 -71
  496. package/dist/infrastructure/journal.js.map +1 -1
  497. package/dist/infrastructure/journal.types.d.ts +0 -2
  498. package/dist/infrastructure/journal.types.js.map +1 -1
  499. package/dist/infrastructure/local-transport.js +9 -4
  500. package/dist/infrastructure/local-transport.js.map +1 -1
  501. package/dist/infrastructure/opentelemetry-dispatch.d.ts +6 -0
  502. package/dist/infrastructure/opentelemetry-dispatch.js +70 -0
  503. package/dist/infrastructure/opentelemetry-dispatch.js.map +1 -0
  504. package/dist/infrastructure/opentelemetry.constants.d.ts +3 -0
  505. package/dist/infrastructure/opentelemetry.constants.js +3 -0
  506. package/dist/infrastructure/opentelemetry.constants.js.map +1 -1
  507. package/dist/infrastructure/opentelemetry.js +4 -0
  508. package/dist/infrastructure/opentelemetry.js.map +1 -1
  509. package/dist/infrastructure/opentelemetry.types.d.ts +3 -3
  510. package/dist/infrastructure/opentelemetry.types.js.map +1 -1
  511. package/dist/infrastructure/reporter.js +27 -2
  512. package/dist/infrastructure/reporter.js.map +1 -1
  513. package/dist/infrastructure/repository-transport.constants.d.ts +1 -0
  514. package/dist/infrastructure/repository-transport.constants.js +2 -0
  515. package/dist/infrastructure/repository-transport.constants.js.map +1 -0
  516. package/dist/infrastructure/repository-transport.d.ts +2 -0
  517. package/dist/infrastructure/repository-transport.js +9 -0
  518. package/dist/infrastructure/repository-transport.js.map +1 -0
  519. package/dist/infrastructure/resource-activity-inspection.js +22 -26
  520. package/dist/infrastructure/resource-activity-inspection.js.map +1 -1
  521. package/dist/infrastructure/resource-activity.constants.d.ts +0 -1
  522. package/dist/infrastructure/resource-activity.constants.js +0 -1
  523. package/dist/infrastructure/resource-activity.constants.js.map +1 -1
  524. package/dist/infrastructure/resource-activity.js +22 -85
  525. package/dist/infrastructure/resource-activity.js.map +1 -1
  526. package/dist/infrastructure/resource-activity.types.d.ts +2 -2
  527. package/dist/infrastructure/resource-activity.types.js.map +1 -1
  528. package/dist/infrastructure/settings.d.ts +1 -1
  529. package/dist/infrastructure/settings.js +3 -3
  530. package/dist/infrastructure/settings.js.map +1 -1
  531. package/dist/infrastructure/sse.d.ts +2 -0
  532. package/dist/infrastructure/sse.js +64 -0
  533. package/dist/infrastructure/sse.js.map +1 -0
  534. package/dist/infrastructure/sse.types.d.ts +4 -0
  535. package/dist/infrastructure/sse.types.js +2 -0
  536. package/dist/infrastructure/sse.types.js.map +1 -0
  537. package/dist/infrastructure/storage-inventory.constants.js +1 -0
  538. package/dist/infrastructure/storage-inventory.constants.js.map +1 -1
  539. package/dist/infrastructure/storage-inventory.types.d.ts +1 -1
  540. package/dist/infrastructure/storage-inventory.types.js.map +1 -1
  541. package/dist/infrastructure/storage-reservations.types.d.ts +0 -8
  542. package/dist/infrastructure/storage-reservations.types.js.map +1 -1
  543. package/dist/infrastructure/transport-conversations.d.ts +2 -2
  544. package/dist/infrastructure/transport-conversations.js +8 -1
  545. package/dist/infrastructure/transport-conversations.js.map +1 -1
  546. package/dist/infrastructure/transport-journal.js +2 -1
  547. package/dist/infrastructure/transport-journal.js.map +1 -1
  548. package/dist/infrastructure/transport-reservations.d.ts +1 -1
  549. package/dist/infrastructure/transport-reservations.js +14 -8
  550. package/dist/infrastructure/transport-reservations.js.map +1 -1
  551. package/dist/providers/agents.d.ts +9 -4
  552. package/dist/providers/agents.js +6 -3
  553. package/dist/providers/agents.js.map +1 -1
  554. package/dist/providers/daytona.d.ts +1 -1
  555. package/dist/providers/daytona.js +1 -1
  556. package/dist/providers/daytona.js.map +1 -1
  557. package/dist/providers/docker.d.ts +1 -1
  558. package/dist/providers/docker.js +1 -1
  559. package/dist/providers/docker.js.map +1 -1
  560. package/dist/providers/factories.d.ts +2 -2
  561. package/dist/providers/factories.js +3 -3
  562. package/dist/providers/factories.js.map +1 -1
  563. package/dist/providers/firecracker.d.ts +1 -1
  564. package/dist/providers/firecracker.js +1 -1
  565. package/dist/providers/firecracker.js.map +1 -1
  566. package/dist/providers/local.d.ts +1 -1
  567. package/dist/providers/local.js +1 -1
  568. package/dist/providers/local.js.map +1 -1
  569. package/dist/providers/podman.d.ts +1 -1
  570. package/dist/providers/podman.js +1 -1
  571. package/dist/providers/podman.js.map +1 -1
  572. package/dist/providers/vercel.d.ts +1 -1
  573. package/dist/providers/vercel.js +1 -1
  574. package/dist/providers/vercel.js.map +1 -1
  575. package/dist/providers/versions.constants.d.ts +3 -1
  576. package/dist/providers/versions.constants.js +3 -1
  577. package/dist/providers/versions.constants.js.map +1 -1
  578. package/package.json +3 -3
  579. package/dist/adapters/agents/gemini-adapter.d.ts +0 -3
  580. package/dist/adapters/agents/gemini-adapter.js +0 -15
  581. package/dist/adapters/agents/gemini-adapter.js.map +0 -1
  582. package/dist/adapters/agents/gemini-diagnostics.d.ts +0 -2
  583. package/dist/adapters/agents/gemini-diagnostics.js +0 -15
  584. package/dist/adapters/agents/gemini-diagnostics.js.map +0 -1
  585. package/dist/adapters/agents/gemini-events.d.ts +0 -2
  586. package/dist/adapters/agents/gemini-events.js +0 -50
  587. package/dist/adapters/agents/gemini-events.js.map +0 -1
  588. package/dist/adapters/agents/gemini-request.d.ts +0 -4
  589. package/dist/adapters/agents/gemini-request.js +0 -23
  590. package/dist/adapters/agents/gemini-request.js.map +0 -1
  591. package/dist/adapters/agents/gemini.types.d.ts +0 -6
  592. package/dist/adapters/agents/gemini.types.js +0 -2
  593. package/dist/adapters/agents/gemini.types.js.map +0 -1
  594. package/dist/adapters/models/openai-compatible.constants.js.map +0 -1
  595. package/dist/adapters/models/openai-compatible.d.ts +0 -3
  596. package/dist/adapters/models/openai-compatible.js +0 -78
  597. package/dist/adapters/models/openai-compatible.js.map +0 -1
  598. package/dist/adapters/models/openai-compatible.types.d.ts +0 -14
  599. package/dist/adapters/models/openai-compatible.types.js +0 -2
  600. package/dist/adapters/models/openai-compatible.types.js.map +0 -1
  601. package/dist/adapters/models/openai-http.js.map +0 -1
  602. package/dist/adapters/models/openai-request.d.ts +0 -4
  603. package/dist/adapters/models/openai-request.js +0 -46
  604. package/dist/adapters/models/openai-request.js.map +0 -1
  605. package/dist/adapters/models/openai-response.d.ts +0 -3
  606. package/dist/adapters/models/openai-response.js +0 -65
  607. package/dist/adapters/models/openai-response.js.map +0 -1
  608. package/dist/cli/init-authentication.constants.d.ts +0 -13
  609. package/dist/cli/init-authentication.constants.js +0 -10
  610. package/dist/cli/init-authentication.constants.js.map +0 -1
  611. package/dist/infrastructure/artifact-store.d.ts +0 -3
  612. package/dist/infrastructure/artifact-store.js +0 -110
  613. package/dist/infrastructure/artifact-store.js.map +0 -1
  614. package/dist/infrastructure/artifact-store.types.d.ts +0 -6
  615. package/dist/infrastructure/artifact-store.types.js +0 -2
  616. package/dist/infrastructure/artifact-store.types.js.map +0 -1
  617. package/dist/infrastructure/journal-retention.constants.d.ts +0 -4
  618. package/dist/infrastructure/journal-retention.constants.js +0 -5
  619. package/dist/infrastructure/journal-retention.constants.js.map +0 -1
  620. package/dist/infrastructure/journal-retention.d.ts +0 -2
  621. package/dist/infrastructure/journal-retention.js +0 -51
  622. package/dist/infrastructure/journal-retention.js.map +0 -1
  623. package/dist/infrastructure/storage-mutation-lock.constants.d.ts +0 -5
  624. package/dist/infrastructure/storage-mutation-lock.constants.js +0 -6
  625. package/dist/infrastructure/storage-mutation-lock.constants.js.map +0 -1
  626. package/dist/infrastructure/storage-mutation-lock.d.ts +0 -1
  627. package/dist/infrastructure/storage-mutation-lock.js +0 -21
  628. package/dist/infrastructure/storage-mutation-lock.js.map +0 -1
  629. package/dist/infrastructure/storage-reservations.constants.d.ts +0 -4
  630. package/dist/infrastructure/storage-reservations.constants.js +0 -5
  631. package/dist/infrastructure/storage-reservations.constants.js.map +0 -1
  632. package/dist/infrastructure/storage-reservations.d.ts +0 -2
  633. package/dist/infrastructure/storage-reservations.js +0 -150
  634. package/dist/infrastructure/storage-reservations.js.map +0 -1
  635. package/dist/infrastructure/workflow-checkpoint.d.ts +0 -3
  636. package/dist/infrastructure/workflow-checkpoint.js +0 -84
  637. package/dist/infrastructure/workflow-checkpoint.js.map +0 -1
  638. package/dist/infrastructure/workflow-checkpoint.types.d.ts +0 -6
  639. package/dist/infrastructure/workflow-checkpoint.types.js +0 -2
  640. package/dist/infrastructure/workflow-checkpoint.types.js.map +0 -1
  641. /package/dist/adapters/models/{openai-http.d.ts → model-http.d.ts} +0 -0
  642. /package/dist/adapters/models/{openai-compatible.constants.d.ts → model.constants.d.ts} +0 -0
@@ -0,0 +1,26 @@
1
+ import type { AgentModel, ModelMessage } from "./model.types.ts";
2
+ export interface HarnessContextInput {
3
+ readonly messages: readonly ModelMessage[];
4
+ readonly step: number;
5
+ readonly model: AgentModel;
6
+ readonly signal: AbortSignal;
7
+ summarize(messages: readonly ModelMessage[]): Promise<string>;
8
+ }
9
+ export type HarnessContextResult = readonly ModelMessage[] | undefined;
10
+ export interface HarnessContextStrategyOptions {
11
+ readonly name: string;
12
+ compact(input: HarnessContextInput): HarnessContextResult | Promise<HarnessContextResult>;
13
+ }
14
+ export interface HarnessContextStrategy {
15
+ readonly kind: "context";
16
+ readonly name: string;
17
+ compact(input: HarnessContextInput): Promise<HarnessContextResult>;
18
+ }
19
+ export interface TruncateToolResultsOptions {
20
+ readonly keepRecent?: number;
21
+ readonly maxCharacters?: number;
22
+ }
23
+ export interface SummarizeHistoryOptions {
24
+ readonly triggerCharacters?: number;
25
+ readonly keepRecentMessages?: number;
26
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.types.js","sourceRoot":"","sources":["../../src/domain/context.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentModel, ModelMessage } from \"./model.types.ts\";\n\nexport interface HarnessContextInput {\n readonly messages: readonly ModelMessage[];\n readonly step: number;\n readonly model: AgentModel;\n readonly signal: AbortSignal;\n summarize(messages: readonly ModelMessage[]): Promise<string>;\n}\n\nexport type HarnessContextResult = readonly ModelMessage[] | undefined;\n\nexport interface HarnessContextStrategyOptions {\n readonly name: string;\n compact(\n input: HarnessContextInput,\n ): HarnessContextResult | Promise<HarnessContextResult>;\n}\n\nexport interface HarnessContextStrategy {\n readonly kind: \"context\";\n readonly name: string;\n compact(input: HarnessContextInput): Promise<HarnessContextResult>;\n}\n\nexport interface TruncateToolResultsOptions {\n readonly keepRecent?: number;\n readonly maxCharacters?: number;\n}\n\nexport interface SummarizeHistoryOptions {\n readonly triggerCharacters?: number;\n readonly keepRecentMessages?: number;\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type { Usage } from "./agent.types.ts";
2
+ export interface DispatchTelemetryOutcome {
3
+ readonly status: "done" | "failed" | "cancelled";
4
+ readonly usage: Usage;
5
+ readonly completed?: boolean;
6
+ }
7
+ export interface DispatchTelemetrySession {
8
+ finish(outcome: DispatchTelemetryOutcome): void;
9
+ }
10
+ export interface DispatchTelemetry {
11
+ startDispatch(): DispatchTelemetrySession;
12
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dispatch-telemetry.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-telemetry.types.js","sourceRoot":"","sources":["../../src/domain/dispatch-telemetry.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Usage } from \"./agent.types.ts\";\n\nexport interface DispatchTelemetryOutcome {\n readonly status: \"done\" | \"failed\" | \"cancelled\";\n readonly usage: Usage;\n readonly completed?: boolean;\n}\n\nexport interface DispatchTelemetrySession {\n finish(outcome: DispatchTelemetryOutcome): void;\n}\n\nexport interface DispatchTelemetry {\n startDispatch(): DispatchTelemetrySession;\n}\n"]}
@@ -1 +1 @@
1
- export type FaultCode = "configuration" | "process" | "timeout" | "aborted" | "workspace" | "conflict" | "prompt" | "response" | "session" | "provider";
1
+ export type FaultCode = "configuration" | "process" | "timeout" | "aborted" | "workspace" | "conflict" | "prompt" | "response" | "session" | "provider" | "limit";
@@ -1 +1 @@
1
- {"version":3,"file":"errors.types.js","sourceRoot":"","sources":["../../src/domain/errors.types.ts"],"names":[],"mappings":"","sourcesContent":["export type FaultCode =\n | \"configuration\"\n | \"process\"\n | \"timeout\"\n | \"aborted\"\n | \"workspace\"\n | \"conflict\"\n | \"prompt\"\n | \"response\"\n | \"session\"\n | \"provider\";\n"]}
1
+ {"version":3,"file":"errors.types.js","sourceRoot":"","sources":["../../src/domain/errors.types.ts"],"names":[],"mappings":"","sourcesContent":["export type FaultCode =\n | \"configuration\"\n | \"process\"\n | \"timeout\"\n | \"aborted\"\n | \"workspace\"\n | \"conflict\"\n | \"prompt\"\n | \"response\"\n | \"session\"\n | \"provider\"\n | \"limit\";\n"]}
@@ -0,0 +1,2 @@
1
+ import type { GlobMode } from "./glob.types.ts";
2
+ export declare function glob(pattern: string, mode: GlobMode): RegExp;
@@ -0,0 +1,25 @@
1
+ const stars = {
2
+ path: "[^/]*",
3
+ text: "[^]*",
4
+ };
5
+ const tokens = {
6
+ "*": (mode) => stars[mode],
7
+ "?": () => "[^/]",
8
+ };
9
+ export function glob(pattern, mode) {
10
+ let source = "";
11
+ for (let index = 0; index < pattern.length; index++) {
12
+ const character = pattern[index];
13
+ if (character === "*" && pattern[index + 1] === "*") {
14
+ const directory = pattern[index + 2] === "/";
15
+ source += directory ? "(?:[^]*/)?" : "[^]*";
16
+ index += directory ? 2 : 1;
17
+ continue;
18
+ }
19
+ source +=
20
+ tokens[character]?.(mode) ??
21
+ character.replace(/[.+^${}()|[\]\\]/g, "\\$&");
22
+ }
23
+ return new RegExp(`^${source}$`);
24
+ }
25
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/domain/glob.ts"],"names":[],"mappings":"AAEA,MAAM,KAAK,GAAuC;IAChD,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,MAAM,GAAyD;IACnE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;IAC1B,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM;CAClB,CAAC;AAEF,MAAM,UAAU,IAAI,CAAC,OAAe,EAAE,IAAc;IAClD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAE,CAAC;QAClC,IAAI,SAAS,KAAK,GAAG,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;YAC7C,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;YAC5C,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,MAAM;YACJ,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC;gBACzB,SAAS,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import type { GlobMode } from \"./glob.types.ts\";\n\nconst stars: Readonly<Record<GlobMode, string>> = {\n path: \"[^/]*\",\n text: \"[^]*\",\n};\n\nconst tokens: Readonly<Record<string, (mode: GlobMode) => string>> = {\n \"*\": (mode) => stars[mode],\n \"?\": () => \"[^/]\",\n};\n\nexport function glob(pattern: string, mode: GlobMode): RegExp {\n let source = \"\";\n for (let index = 0; index < pattern.length; index++) {\n const character = pattern[index]!;\n if (character === \"*\" && pattern[index + 1] === \"*\") {\n const directory = pattern[index + 2] === \"/\";\n source += directory ? \"(?:[^]*/)?\" : \"[^]*\";\n index += directory ? 2 : 1;\n continue;\n }\n source +=\n tokens[character]?.(mode) ??\n character.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n return new RegExp(`^${source}$`);\n}\n"]}
@@ -0,0 +1 @@
1
+ export type GlobMode = "path" | "text";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=glob.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.types.js","sourceRoot":"","sources":["../../src/domain/glob.types.ts"],"names":[],"mappings":"","sourcesContent":["export type GlobMode = \"path\" | \"text\";\n"]}
@@ -0,0 +1,11 @@
1
+ export declare const HARNESS_DEFAULTS: {
2
+ readonly maxSteps: 100;
3
+ readonly concurrency: 4;
4
+ readonly toolDeadlineMs: 300000;
5
+ readonly onError: "return-to-model";
6
+ readonly cache: true;
7
+ };
8
+ export declare const HARNESS_FIELDS: ReadonlySet<string>;
9
+ export declare const TOOL_RESULT_CHARACTERS = 100000;
10
+ export declare const TOOL_PREVIEW_CHARACTERS = 2000;
11
+ export declare const USAGE_FIELDS: string[];
@@ -0,0 +1,24 @@
1
+ export const HARNESS_DEFAULTS = {
2
+ maxSteps: 100,
3
+ concurrency: 4,
4
+ toolDeadlineMs: 300_000,
5
+ onError: "return-to-model",
6
+ cache: true,
7
+ };
8
+ export const HARNESS_FIELDS = new Set([
9
+ "modelProvider",
10
+ "instructions",
11
+ "tools",
12
+ "limits",
13
+ "toolExecution",
14
+ "hooks",
15
+ "permissions",
16
+ "context",
17
+ "conversations",
18
+ "skills",
19
+ "cache",
20
+ ]);
21
+ export const TOOL_RESULT_CHARACTERS = 100_000;
22
+ export const TOOL_PREVIEW_CHARACTERS = 2_000;
23
+ export const USAGE_FIELDS = ["input", "cached", "cacheCreated", "output"];
24
+ //# sourceMappingURL=harness.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.constants.js","sourceRoot":"","sources":["../../src/domain/harness.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,GAAG;IACb,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,OAAO;IACvB,OAAO,EAAE,iBAAiB;IAC1B,KAAK,EAAE,IAAI;CACH,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IACzD,eAAe;IACf,cAAc;IACd,OAAO;IACP,QAAQ;IACR,eAAe;IACf,OAAO;IACP,aAAa;IACb,SAAS;IACT,eAAe;IACf,QAAQ;IACR,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAE9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAE7C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC","sourcesContent":["export const HARNESS_DEFAULTS = {\n maxSteps: 100,\n concurrency: 4,\n toolDeadlineMs: 300_000,\n onError: \"return-to-model\",\n cache: true,\n} as const;\n\nexport const HARNESS_FIELDS: ReadonlySet<string> = new Set([\n \"modelProvider\",\n \"instructions\",\n \"tools\",\n \"limits\",\n \"toolExecution\",\n \"hooks\",\n \"permissions\",\n \"context\",\n \"conversations\",\n \"skills\",\n \"cache\",\n]);\n\nexport const TOOL_RESULT_CHARACTERS = 100_000;\n\nexport const TOOL_PREVIEW_CHARACTERS = 2_000;\n\nexport const USAGE_FIELDS = [\"input\", \"cached\", \"cacheCreated\", \"output\"];\n"]}
@@ -0,0 +1,2 @@
1
+ import type { Harness, HarnessOptions } from "./harness.types.ts";
2
+ export declare function harness(options: HarnessOptions): Harness;
@@ -0,0 +1,89 @@
1
+ import { invariant, positive } from "./errors.js";
2
+ import { HARNESS_DEFAULTS, HARNESS_FIELDS, USAGE_FIELDS, } from "./harness.constants.js";
3
+ import { harnessHooks } from "./hook.js";
4
+ import { defineHarnessInstructions, harnessInstructions, } from "./instructions.js";
5
+ import { harnessSkills, skillCatalog, skillLoader } from "./skill.js";
6
+ import { harnessTools } from "./tool.js";
7
+ export function harness(options) {
8
+ invariant(options !== null && typeof options === "object", "Harness options must be an object");
9
+ invariant(!("run" in options), "harness() no longer accepts run; declare tools, instructions and limits");
10
+ const unsupported = Object.keys(options).filter((key) => !HARNESS_FIELDS.has(key));
11
+ invariant(unsupported.length === 0, `Unsupported harness option: ${unsupported.join(", ")}`);
12
+ invariant(typeof options.modelProvider?.request === "function", "Custom harness requires a model provider");
13
+ invariant(options.modelProvider.validate === undefined ||
14
+ typeof options.modelProvider.validate === "function", "Model provider validate must be a function");
15
+ invariant(options.cache === undefined || typeof options.cache === "boolean", "Harness cache must be boolean");
16
+ invariant(options.permissions === undefined ||
17
+ options.permissions?.kind === "permissions", "Declare permissions with defineHarnessPermissions");
18
+ invariant(options.context === undefined || options.context?.kind === "context", "Declare context strategies with defineHarnessContextStrategy");
19
+ invariant(options.conversations === undefined ||
20
+ options.conversations === false ||
21
+ conversationStore(options.conversations), "Harness conversations must be a conversation store or false");
22
+ const skills = harnessSkills(options.skills);
23
+ return Object.freeze({
24
+ kind: "custom",
25
+ modelProvider: options.modelProvider,
26
+ instructions: Object.freeze([
27
+ ...harnessInstructions(options.instructions),
28
+ ...(skills.length
29
+ ? [defineHarnessInstructions(skillCatalog(skills))]
30
+ : []),
31
+ ]),
32
+ tools: harnessTools([
33
+ ...(options.tools ?? []),
34
+ ...skills.flatMap((skill) => skill.tools),
35
+ ...(skills.length ? [skillLoader(skills)] : []),
36
+ ]),
37
+ skills,
38
+ limits: limits(options.limits ?? {}),
39
+ toolExecution: toolExecution(options.toolExecution ?? {}),
40
+ hooks: harnessHooks(options.hooks),
41
+ ...(options.permissions ? { permissions: options.permissions } : {}),
42
+ ...(options.context ? { context: options.context } : {}),
43
+ ...(options.conversations === undefined
44
+ ? {}
45
+ : { conversations: options.conversations }),
46
+ cache: options.cache ?? HARNESS_DEFAULTS.cache,
47
+ });
48
+ }
49
+ function limits(value) {
50
+ invariant(value !== null && typeof value === "object", "Harness limits must be an object");
51
+ const maxSteps = positive(value.maxSteps ?? HARNESS_DEFAULTS.maxSteps, "Harness maxSteps");
52
+ if (value.maxToolCalls !== undefined)
53
+ positive(value.maxToolCalls, "Harness maxToolCalls");
54
+ if (value.usage !== undefined) {
55
+ invariant(value.usage !== null &&
56
+ typeof value.usage === "object" &&
57
+ Object.keys(value.usage).every((key) => USAGE_FIELDS.includes(key)), "Harness usage limits accept input, cached, cacheCreated and output");
58
+ for (const limit of Object.values(value.usage))
59
+ invariant(Number.isSafeInteger(limit) && limit >= 0, "Harness usage limits must be nonnegative integers");
60
+ }
61
+ return Object.freeze({
62
+ maxSteps,
63
+ ...(value.maxToolCalls === undefined
64
+ ? {}
65
+ : { maxToolCalls: value.maxToolCalls }),
66
+ ...(value.usage === undefined
67
+ ? {}
68
+ : { usage: Object.freeze({ ...value.usage }) }),
69
+ });
70
+ }
71
+ function toolExecution(value) {
72
+ invariant(value !== null && typeof value === "object", "Harness toolExecution must be an object");
73
+ invariant(value.onError === undefined ||
74
+ value.onError === "return-to-model" ||
75
+ value.onError === "fail", 'Tool onError must be "return-to-model" or "fail"');
76
+ return Object.freeze({
77
+ concurrency: positive(value.concurrency ?? HARNESS_DEFAULTS.concurrency, "Tool concurrency"),
78
+ deadlineMs: positive(value.deadlineMs ?? HARNESS_DEFAULTS.toolDeadlineMs, "Tool deadlineMs"),
79
+ onError: value.onError ?? HARNESS_DEFAULTS.onError,
80
+ });
81
+ }
82
+ function conversationStore(value) {
83
+ return (value !== null &&
84
+ typeof value === "object" &&
85
+ typeof value.locate === "function" &&
86
+ typeof value.capture === "function" &&
87
+ typeof value.restore === "function");
88
+ }
89
+ //# sourceMappingURL=harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/domain/harness.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,MAAM,wBAAwB,CAAC;AAQhC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,UAAU,OAAO,CAAC,OAAuB;IAC7C,SAAS,CACP,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAC/C,mCAAmC,CACpC,CAAC;IACF,SAAS,CACP,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,EACnB,yEAAyE,CAC1E,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAC7C,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAClC,CAAC;IACF,SAAS,CACP,WAAW,CAAC,MAAM,KAAK,CAAC,EACxB,+BAA+B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxD,CAAC;IACF,SAAS,CACP,OAAO,OAAO,CAAC,aAAa,EAAE,OAAO,KAAK,UAAU,EACpD,0CAA0C,CAC3C,CAAC;IACF,SAAS,CACP,OAAO,CAAC,aAAa,CAAC,QAAQ,KAAK,SAAS;QAC1C,OAAO,OAAO,CAAC,aAAa,CAAC,QAAQ,KAAK,UAAU,EACtD,4CAA4C,CAC7C,CAAC;IACF,SAAS,CACP,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,SAAS,EACjE,+BAA+B,CAChC,CAAC;IACF,SAAS,CACP,OAAO,CAAC,WAAW,KAAK,SAAS;QAC/B,OAAO,CAAC,WAAW,EAAE,IAAI,KAAK,aAAa,EAC7C,mDAAmD,CACpD,CAAC;IACF,SAAS,CACP,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,IAAI,KAAK,SAAS,EACpE,8DAA8D,CAC/D,CAAC;IACF,SAAS,CACP,OAAO,CAAC,aAAa,KAAK,SAAS;QACjC,OAAO,CAAC,aAAa,KAAK,KAAK;QAC/B,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC,EAC1C,6DAA6D,CAC9D,CAAC;IACF,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,QAAQ;QACd,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC;YAC1B,GAAG,mBAAmB,CAAC,OAAO,CAAC,YAAY,CAAC;YAC5C,GAAG,CAAC,MAAM,CAAC,MAAM;gBACf,CAAC,CAAC,CAAC,yBAAyB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;gBACnD,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QACF,KAAK,EAAE,YAAY,CAAC;YAClB,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YACxB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;YACzC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC;QACF,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QACpC,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;QACzD,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC;QAClC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;YACrC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;QAC7C,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,gBAAgB,CAAC,KAAK;KAC/C,CAAC,CAAC;AACL,CAAC;AAED,SAAS,MAAM,CAAC,KAAoB;IAClC,SAAS,CACP,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAC3C,kCAAkC,CACnC,CAAC;IACF,MAAM,QAAQ,GAAG,QAAQ,CACvB,KAAK,CAAC,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,EAC3C,kBAAkB,CACnB,CAAC;IACF,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;QAClC,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;IACvD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,SAAS,CACP,KAAK,CAAC,KAAK,KAAK,IAAI;YAClB,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EACrE,oEAAoE,CACrE,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YAC5C,SAAS,CACP,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EACzC,mDAAmD,CACpD,CAAC;IACN,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,QAAQ;QACR,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS;YAClC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS;YAC3B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;KAClD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CACpB,KAA2B;IAE3B,SAAS,CACP,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAC3C,yCAAyC,CAC1C,CAAC;IACF,SAAS,CACP,KAAK,CAAC,OAAO,KAAK,SAAS;QACzB,KAAK,CAAC,OAAO,KAAK,iBAAiB;QACnC,KAAK,CAAC,OAAO,KAAK,MAAM,EAC1B,kDAAkD,CACnD,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,WAAW,EAAE,QAAQ,CACnB,KAAK,CAAC,WAAW,IAAI,gBAAgB,CAAC,WAAW,EACjD,kBAAkB,CACnB;QACD,UAAU,EAAE,QAAQ,CAClB,KAAK,CAAC,UAAU,IAAI,gBAAgB,CAAC,cAAc,EACnD,iBAAiB,CAClB;QACD,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,gBAAgB,CAAC,OAAO;KACnD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAwB;IACjD,OAAO,CACL,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,CAAC,MAAM,KAAK,UAAU;QAClC,OAAO,KAAK,CAAC,OAAO,KAAK,UAAU;QACnC,OAAO,KAAK,CAAC,OAAO,KAAK,UAAU,CACpC,CAAC;AACJ,CAAC","sourcesContent":["import type { ConversationStore } from \"./conversation.types.ts\";\nimport { invariant, positive } from \"./errors.ts\";\nimport {\n HARNESS_DEFAULTS,\n HARNESS_FIELDS,\n USAGE_FIELDS,\n} from \"./harness.constants.ts\";\nimport type {\n Harness,\n HarnessOptions,\n HarnessLimits,\n HarnessToolExecution,\n ResolvedHarnessLimits,\n} from \"./harness.types.ts\";\nimport { harnessHooks } from \"./hook.ts\";\nimport {\n defineHarnessInstructions,\n harnessInstructions,\n} from \"./instructions.ts\";\nimport { harnessSkills, skillCatalog, skillLoader } from \"./skill.ts\";\nimport { harnessTools } from \"./tool.ts\";\n\nexport function harness(options: HarnessOptions): Harness {\n invariant(\n options !== null && typeof options === \"object\",\n \"Harness options must be an object\",\n );\n invariant(\n !(\"run\" in options),\n \"harness() no longer accepts run; declare tools, instructions and limits\",\n );\n const unsupported = Object.keys(options).filter(\n (key) => !HARNESS_FIELDS.has(key),\n );\n invariant(\n unsupported.length === 0,\n `Unsupported harness option: ${unsupported.join(\", \")}`,\n );\n invariant(\n typeof options.modelProvider?.request === \"function\",\n \"Custom harness requires a model provider\",\n );\n invariant(\n options.modelProvider.validate === undefined ||\n typeof options.modelProvider.validate === \"function\",\n \"Model provider validate must be a function\",\n );\n invariant(\n options.cache === undefined || typeof options.cache === \"boolean\",\n \"Harness cache must be boolean\",\n );\n invariant(\n options.permissions === undefined ||\n options.permissions?.kind === \"permissions\",\n \"Declare permissions with defineHarnessPermissions\",\n );\n invariant(\n options.context === undefined || options.context?.kind === \"context\",\n \"Declare context strategies with defineHarnessContextStrategy\",\n );\n invariant(\n options.conversations === undefined ||\n options.conversations === false ||\n conversationStore(options.conversations),\n \"Harness conversations must be a conversation store or false\",\n );\n const skills = harnessSkills(options.skills);\n return Object.freeze({\n kind: \"custom\",\n modelProvider: options.modelProvider,\n instructions: Object.freeze([\n ...harnessInstructions(options.instructions),\n ...(skills.length\n ? [defineHarnessInstructions(skillCatalog(skills))]\n : []),\n ]),\n tools: harnessTools([\n ...(options.tools ?? []),\n ...skills.flatMap((skill) => skill.tools),\n ...(skills.length ? [skillLoader(skills)] : []),\n ]),\n skills,\n limits: limits(options.limits ?? {}),\n toolExecution: toolExecution(options.toolExecution ?? {}),\n hooks: harnessHooks(options.hooks),\n ...(options.permissions ? { permissions: options.permissions } : {}),\n ...(options.context ? { context: options.context } : {}),\n ...(options.conversations === undefined\n ? {}\n : { conversations: options.conversations }),\n cache: options.cache ?? HARNESS_DEFAULTS.cache,\n });\n}\n\nfunction limits(value: HarnessLimits): ResolvedHarnessLimits {\n invariant(\n value !== null && typeof value === \"object\",\n \"Harness limits must be an object\",\n );\n const maxSteps = positive(\n value.maxSteps ?? HARNESS_DEFAULTS.maxSteps,\n \"Harness maxSteps\",\n );\n if (value.maxToolCalls !== undefined)\n positive(value.maxToolCalls, \"Harness maxToolCalls\");\n if (value.usage !== undefined) {\n invariant(\n value.usage !== null &&\n typeof value.usage === \"object\" &&\n Object.keys(value.usage).every((key) => USAGE_FIELDS.includes(key)),\n \"Harness usage limits accept input, cached, cacheCreated and output\",\n );\n for (const limit of Object.values(value.usage))\n invariant(\n Number.isSafeInteger(limit) && limit >= 0,\n \"Harness usage limits must be nonnegative integers\",\n );\n }\n return Object.freeze({\n maxSteps,\n ...(value.maxToolCalls === undefined\n ? {}\n : { maxToolCalls: value.maxToolCalls }),\n ...(value.usage === undefined\n ? {}\n : { usage: Object.freeze({ ...value.usage }) }),\n });\n}\n\nfunction toolExecution(\n value: HarnessToolExecution,\n): Required<HarnessToolExecution> {\n invariant(\n value !== null && typeof value === \"object\",\n \"Harness toolExecution must be an object\",\n );\n invariant(\n value.onError === undefined ||\n value.onError === \"return-to-model\" ||\n value.onError === \"fail\",\n 'Tool onError must be \"return-to-model\" or \"fail\"',\n );\n return Object.freeze({\n concurrency: positive(\n value.concurrency ?? HARNESS_DEFAULTS.concurrency,\n \"Tool concurrency\",\n ),\n deadlineMs: positive(\n value.deadlineMs ?? HARNESS_DEFAULTS.toolDeadlineMs,\n \"Tool deadlineMs\",\n ),\n onError: value.onError ?? HARNESS_DEFAULTS.onError,\n });\n}\n\nfunction conversationStore(value: ConversationStore): boolean {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof value.locate === \"function\" &&\n typeof value.capture === \"function\" &&\n typeof value.restore === \"function\"\n );\n}\n"]}
@@ -0,0 +1,60 @@
1
+ import type { Usage } from "./agent.types.ts";
2
+ import type { HarnessContextStrategy } from "./context.types.ts";
3
+ import type { ConversationStore } from "./conversation.types.ts";
4
+ import type { HarnessHook } from "./hook.types.ts";
5
+ import type { AgentModel, ModelProvider } from "./model.types.ts";
6
+ import type { HarnessPermissions } from "./permissions.types.ts";
7
+ import type { HarnessSkill } from "./skill.types.ts";
8
+ import type { SandboxLease } from "./sandbox.types.ts";
9
+ import type { HarnessTool, HarnessToolset } from "./tool.types.ts";
10
+ export interface HarnessInstructionContext {
11
+ readonly sandbox: SandboxLease;
12
+ readonly signal: AbortSignal;
13
+ readonly model: AgentModel;
14
+ }
15
+ export type HarnessInstructionSource = string | ((context: HarnessInstructionContext) => string | Promise<string>);
16
+ export interface HarnessInstructions {
17
+ readonly kind: "instructions";
18
+ resolve(context: HarnessInstructionContext): Promise<string>;
19
+ }
20
+ export type HarnessInstructionsOption = string | HarnessInstructions | readonly (string | HarnessInstructions)[];
21
+ export interface HarnessLimits {
22
+ readonly maxSteps?: number;
23
+ readonly maxToolCalls?: number;
24
+ readonly usage?: Partial<Usage>;
25
+ }
26
+ export interface ResolvedHarnessLimits extends HarnessLimits {
27
+ readonly maxSteps: number;
28
+ }
29
+ export interface HarnessToolExecution {
30
+ readonly concurrency?: number;
31
+ readonly deadlineMs?: number;
32
+ readonly onError?: "return-to-model" | "fail";
33
+ }
34
+ export interface HarnessOptions {
35
+ readonly modelProvider: ModelProvider;
36
+ readonly instructions?: HarnessInstructionsOption;
37
+ readonly tools?: readonly (HarnessTool | HarnessToolset)[];
38
+ readonly limits?: HarnessLimits;
39
+ readonly toolExecution?: HarnessToolExecution;
40
+ readonly hooks?: readonly HarnessHook[];
41
+ readonly permissions?: HarnessPermissions;
42
+ readonly context?: HarnessContextStrategy;
43
+ readonly conversations?: ConversationStore | false;
44
+ readonly skills?: readonly HarnessSkill[];
45
+ readonly cache?: boolean;
46
+ }
47
+ export interface Harness {
48
+ readonly kind: "custom";
49
+ readonly modelProvider: ModelProvider;
50
+ readonly instructions: readonly HarnessInstructions[];
51
+ readonly tools: readonly HarnessTool[];
52
+ readonly limits: ResolvedHarnessLimits;
53
+ readonly toolExecution: Required<HarnessToolExecution>;
54
+ readonly hooks: readonly HarnessHook[];
55
+ readonly permissions?: HarnessPermissions;
56
+ readonly context?: HarnessContextStrategy;
57
+ readonly conversations?: ConversationStore | false;
58
+ readonly skills: readonly HarnessSkill[];
59
+ readonly cache: boolean;
60
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=harness.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.types.js","sourceRoot":"","sources":["../../src/domain/harness.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Usage } from \"./agent.types.ts\";\nimport type { HarnessContextStrategy } from \"./context.types.ts\";\nimport type { ConversationStore } from \"./conversation.types.ts\";\nimport type { HarnessHook } from \"./hook.types.ts\";\nimport type { AgentModel, ModelProvider } from \"./model.types.ts\";\nimport type { HarnessPermissions } from \"./permissions.types.ts\";\nimport type { HarnessSkill } from \"./skill.types.ts\";\nimport type { SandboxLease } from \"./sandbox.types.ts\";\nimport type { HarnessTool, HarnessToolset } from \"./tool.types.ts\";\n\nexport interface HarnessInstructionContext {\n readonly sandbox: SandboxLease;\n readonly signal: AbortSignal;\n readonly model: AgentModel;\n}\n\nexport type HarnessInstructionSource =\n string | ((context: HarnessInstructionContext) => string | Promise<string>);\n\nexport interface HarnessInstructions {\n readonly kind: \"instructions\";\n resolve(context: HarnessInstructionContext): Promise<string>;\n}\n\nexport type HarnessInstructionsOption =\n string | HarnessInstructions | readonly (string | HarnessInstructions)[];\n\nexport interface HarnessLimits {\n readonly maxSteps?: number;\n readonly maxToolCalls?: number;\n readonly usage?: Partial<Usage>;\n}\n\nexport interface ResolvedHarnessLimits extends HarnessLimits {\n readonly maxSteps: number;\n}\n\nexport interface HarnessToolExecution {\n readonly concurrency?: number;\n readonly deadlineMs?: number;\n readonly onError?: \"return-to-model\" | \"fail\";\n}\n\nexport interface HarnessOptions {\n readonly modelProvider: ModelProvider;\n readonly instructions?: HarnessInstructionsOption;\n readonly tools?: readonly (HarnessTool | HarnessToolset)[];\n readonly limits?: HarnessLimits;\n readonly toolExecution?: HarnessToolExecution;\n readonly hooks?: readonly HarnessHook[];\n readonly permissions?: HarnessPermissions;\n readonly context?: HarnessContextStrategy;\n readonly conversations?: ConversationStore | false;\n readonly skills?: readonly HarnessSkill[];\n readonly cache?: boolean;\n}\n\nexport interface Harness {\n readonly kind: \"custom\";\n readonly modelProvider: ModelProvider;\n readonly instructions: readonly HarnessInstructions[];\n readonly tools: readonly HarnessTool[];\n readonly limits: ResolvedHarnessLimits;\n readonly toolExecution: Required<HarnessToolExecution>;\n readonly hooks: readonly HarnessHook[];\n readonly permissions?: HarnessPermissions;\n readonly context?: HarnessContextStrategy;\n readonly conversations?: ConversationStore | false;\n readonly skills: readonly HarnessSkill[];\n readonly cache: boolean;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { HarnessHookPhase } from "./hook.types.ts";
2
+ export declare const HOOK_PHASES: ReadonlySet<HarnessHookPhase>;
3
+ export declare const HOOK_FIELDS: ReadonlySet<string>;
@@ -0,0 +1,10 @@
1
+ export const HOOK_PHASES = new Set([
2
+ "session-start",
3
+ "before-model",
4
+ "after-model",
5
+ "before-tool",
6
+ "after-tool",
7
+ "stop",
8
+ ]);
9
+ export const HOOK_FIELDS = new Set(["on", "name", "run"]);
10
+ //# sourceMappingURL=hook.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.constants.js","sourceRoot":"","sources":["../../src/domain/hook.constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAkC,IAAI,GAAG,CAAC;IAChE,eAAe;IACf,cAAc;IACd,aAAa;IACb,aAAa;IACb,YAAY;IACZ,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC","sourcesContent":["import type { HarnessHookPhase } from \"./hook.types.ts\";\n\nexport const HOOK_PHASES: ReadonlySet<HarnessHookPhase> = new Set([\n \"session-start\",\n \"before-model\",\n \"after-model\",\n \"before-tool\",\n \"after-tool\",\n \"stop\",\n]);\n\nexport const HOOK_FIELDS: ReadonlySet<string> = new Set([\"on\", \"name\", \"run\"]);\n"]}
@@ -0,0 +1,3 @@
1
+ import type { HarnessHook, HarnessHookOptions, HarnessHookPhase } from "./hook.types.ts";
2
+ export declare function defineHarnessHook<Phase extends HarnessHookPhase>(options: HarnessHookOptions<Phase>): HarnessHook<Phase>;
3
+ export declare function harnessHooks(hooks: readonly HarnessHook[] | undefined): readonly HarnessHook[];
@@ -0,0 +1,25 @@
1
+ import { invariant } from "./errors.js";
2
+ import { HOOK_FIELDS, HOOK_PHASES } from "./hook.constants.js";
3
+ export function defineHarnessHook(options) {
4
+ invariant(options !== null && typeof options === "object", "Hook options must be an object");
5
+ invariant(Object.keys(options).every((key) => HOOK_FIELDS.has(key)), "Unsupported hook option");
6
+ invariant(HOOK_PHASES.has(options.on), `Hook phase must be one of ${[...HOOK_PHASES].join(", ")}`);
7
+ invariant(typeof options.run === "function", "Hook run must be a function");
8
+ invariant(options.name === undefined ||
9
+ (typeof options.name === "string" && options.name.trim()), "Hook name must be nonempty text");
10
+ return Object.freeze({
11
+ kind: "hook",
12
+ on: options.on,
13
+ name: options.name ?? options.on,
14
+ run: (input) => options.run(input),
15
+ });
16
+ }
17
+ export function harnessHooks(hooks) {
18
+ if (hooks === undefined)
19
+ return [];
20
+ invariant(Array.isArray(hooks), "Hooks must be an array");
21
+ for (const hook of hooks)
22
+ invariant(hook?.kind === "hook", "Declare hooks with defineHarnessHook");
23
+ return Object.freeze([...hooks]);
24
+ }
25
+ //# sourceMappingURL=hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/domain/hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQ/D,MAAM,UAAU,iBAAiB,CAC/B,OAAkC;IAElC,SAAS,CACP,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAC/C,gCAAgC,CACjC,CAAC;IACF,SAAS,CACP,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EACzD,yBAAyB,CAC1B,CAAC;IACF,SAAS,CACP,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAC3B,6BAA6B,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3D,CAAC;IACF,SAAS,CAAC,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU,EAAE,6BAA6B,CAAC,CAAC;IAC5E,SAAS,CACP,OAAO,CAAC,IAAI,KAAK,SAAS;QACxB,CAAC,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAC3D,iCAAiC,CAClC,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE;QAChC,GAAG,EAAE,CAAC,KAA8B,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;KAC5D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,KAAyC;IAEzC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC1D,KAAK,MAAM,IAAI,IAAI,KAAK;QACtB,SAAS,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,sCAAsC,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import { invariant } from \"./errors.ts\";\nimport { HOOK_FIELDS, HOOK_PHASES } from \"./hook.constants.ts\";\nimport type {\n HarnessHook,\n HarnessHookInput,\n HarnessHookOptions,\n HarnessHookPhase,\n} from \"./hook.types.ts\";\n\nexport function defineHarnessHook<Phase extends HarnessHookPhase>(\n options: HarnessHookOptions<Phase>,\n): HarnessHook<Phase> {\n invariant(\n options !== null && typeof options === \"object\",\n \"Hook options must be an object\",\n );\n invariant(\n Object.keys(options).every((key) => HOOK_FIELDS.has(key)),\n \"Unsupported hook option\",\n );\n invariant(\n HOOK_PHASES.has(options.on),\n `Hook phase must be one of ${[...HOOK_PHASES].join(\", \")}`,\n );\n invariant(typeof options.run === \"function\", \"Hook run must be a function\");\n invariant(\n options.name === undefined ||\n (typeof options.name === \"string\" && options.name.trim()),\n \"Hook name must be nonempty text\",\n );\n return Object.freeze({\n kind: \"hook\",\n on: options.on,\n name: options.name ?? options.on,\n run: (input: HarnessHookInput<Phase>) => options.run(input),\n });\n}\n\nexport function harnessHooks(\n hooks: readonly HarnessHook[] | undefined,\n): readonly HarnessHook[] {\n if (hooks === undefined) return [];\n invariant(Array.isArray(hooks), \"Hooks must be an array\");\n for (const hook of hooks)\n invariant(hook?.kind === \"hook\", \"Declare hooks with defineHarnessHook\");\n return Object.freeze([...hooks]);\n}\n"]}
@@ -0,0 +1,66 @@
1
+ import type { AgentModel, ModelMessage, ModelResult, ModelToolCallBlock } from "./model.types.ts";
2
+ import type { SandboxLease } from "./sandbox.types.ts";
3
+ import type { ToolOutput } from "./tool.types.ts";
4
+ export type HarnessHookPhase = "session-start" | "before-model" | "after-model" | "before-tool" | "after-tool" | "stop";
5
+ export interface HarnessHookContext {
6
+ readonly sandbox: SandboxLease;
7
+ readonly signal: AbortSignal;
8
+ readonly model: AgentModel;
9
+ readonly step: number;
10
+ }
11
+ export interface HarnessToolResultView {
12
+ readonly content: string;
13
+ readonly isError: boolean;
14
+ }
15
+ export interface HarnessHookEvents {
16
+ readonly "session-start": {
17
+ readonly prompt: string;
18
+ };
19
+ readonly "before-model": {
20
+ readonly messages: readonly ModelMessage[];
21
+ };
22
+ readonly "after-model": {
23
+ readonly result: ModelResult;
24
+ };
25
+ readonly "before-tool": {
26
+ readonly call: ModelToolCallBlock;
27
+ };
28
+ readonly "after-tool": {
29
+ readonly call: ModelToolCallBlock;
30
+ readonly result: HarnessToolResultView;
31
+ };
32
+ readonly stop: {
33
+ readonly text: string;
34
+ };
35
+ }
36
+ export interface HarnessHookDecisions {
37
+ readonly "session-start": {
38
+ readonly instructions: string;
39
+ };
40
+ readonly "before-model": never;
41
+ readonly "after-model": never;
42
+ readonly "before-tool": {
43
+ readonly deny: string;
44
+ } | {
45
+ readonly input: unknown;
46
+ };
47
+ readonly "after-tool": {
48
+ readonly result: ToolOutput;
49
+ };
50
+ readonly stop: {
51
+ readonly continue: string;
52
+ };
53
+ }
54
+ export type HarnessHookInput<Phase extends HarnessHookPhase> = HarnessHookEvents[Phase] & HarnessHookContext;
55
+ export type HarnessHookResult<Phase extends HarnessHookPhase> = HarnessHookDecisions[Phase] | undefined | void;
56
+ export interface HarnessHookOptions<Phase extends HarnessHookPhase> {
57
+ readonly on: Phase;
58
+ readonly name?: string;
59
+ run(input: HarnessHookInput<Phase>): HarnessHookResult<Phase> | Promise<HarnessHookResult<Phase>>;
60
+ }
61
+ export interface HarnessHook<Phase extends HarnessHookPhase = HarnessHookPhase> {
62
+ readonly kind: "hook";
63
+ readonly on: Phase;
64
+ readonly name: string;
65
+ run(input: HarnessHookInput<Phase>): HarnessHookResult<Phase> | Promise<HarnessHookResult<Phase>>;
66
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hook.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.types.js","sourceRoot":"","sources":["../../src/domain/hook.types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n AgentModel,\n ModelMessage,\n ModelResult,\n ModelToolCallBlock,\n} from \"./model.types.ts\";\nimport type { SandboxLease } from \"./sandbox.types.ts\";\nimport type { ToolOutput } from \"./tool.types.ts\";\n\nexport type HarnessHookPhase =\n | \"session-start\"\n | \"before-model\"\n | \"after-model\"\n | \"before-tool\"\n | \"after-tool\"\n | \"stop\";\n\nexport interface HarnessHookContext {\n readonly sandbox: SandboxLease;\n readonly signal: AbortSignal;\n readonly model: AgentModel;\n readonly step: number;\n}\n\nexport interface HarnessToolResultView {\n readonly content: string;\n readonly isError: boolean;\n}\n\nexport interface HarnessHookEvents {\n readonly \"session-start\": { readonly prompt: string };\n readonly \"before-model\": { readonly messages: readonly ModelMessage[] };\n readonly \"after-model\": { readonly result: ModelResult };\n readonly \"before-tool\": { readonly call: ModelToolCallBlock };\n readonly \"after-tool\": {\n readonly call: ModelToolCallBlock;\n readonly result: HarnessToolResultView;\n };\n readonly stop: { readonly text: string };\n}\n\nexport interface HarnessHookDecisions {\n readonly \"session-start\": { readonly instructions: string };\n readonly \"before-model\": never;\n readonly \"after-model\": never;\n readonly \"before-tool\":\n { readonly deny: string } | { readonly input: unknown };\n readonly \"after-tool\": { readonly result: ToolOutput };\n readonly stop: { readonly continue: string };\n}\n\nexport type HarnessHookInput<Phase extends HarnessHookPhase> =\n HarnessHookEvents[Phase] & HarnessHookContext;\n\nexport type HarnessHookResult<Phase extends HarnessHookPhase> =\n HarnessHookDecisions[Phase] | undefined | void;\n\nexport interface HarnessHookOptions<Phase extends HarnessHookPhase> {\n readonly on: Phase;\n readonly name?: string;\n run(\n input: HarnessHookInput<Phase>,\n ): HarnessHookResult<Phase> | Promise<HarnessHookResult<Phase>>;\n}\n\nexport interface HarnessHook<\n Phase extends HarnessHookPhase = HarnessHookPhase,\n> {\n readonly kind: \"hook\";\n readonly on: Phase;\n readonly name: string;\n run(\n input: HarnessHookInput<Phase>,\n ): HarnessHookResult<Phase> | Promise<HarnessHookResult<Phase>>;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { HarnessInstructions, HarnessInstructionSource, HarnessInstructionsOption } from "./harness.types.ts";
2
+ export declare function defineHarnessInstructions(source: HarnessInstructionSource): HarnessInstructions;
3
+ export declare function harnessInstructions(option: HarnessInstructionsOption | undefined): readonly HarnessInstructions[];
@@ -0,0 +1,25 @@
1
+ import { invariant } from "./errors.js";
2
+ export function defineHarnessInstructions(source) {
3
+ invariant(typeof source === "function" ||
4
+ (typeof source === "string" && source.trim()), "Instructions must be nonempty text or a function");
5
+ return Object.freeze({
6
+ kind: "instructions",
7
+ async resolve(context) {
8
+ const text = typeof source === "string" ? source : await source(context);
9
+ invariant(typeof text === "string", "Instructions must resolve to text");
10
+ return text;
11
+ },
12
+ });
13
+ }
14
+ export function harnessInstructions(option) {
15
+ if (option === undefined)
16
+ return [];
17
+ const entries = Array.isArray(option) ? option : [option];
18
+ return Object.freeze(entries.map((entry) => {
19
+ if (typeof entry === "string")
20
+ return defineHarnessInstructions(entry);
21
+ invariant(entry?.kind === "instructions", "Declare instructions as text or with defineHarnessInstructions");
22
+ return entry;
23
+ }));
24
+ }
25
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/domain/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQxC,MAAM,UAAU,yBAAyB,CACvC,MAAgC;IAEhC,SAAS,CACP,OAAO,MAAM,KAAK,UAAU;QAC1B,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,EAC/C,kDAAkD,CACnD,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,cAAc;QACpB,KAAK,CAAC,OAAO,CAAC,OAAkC;YAC9C,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACzE,SAAS,CAAC,OAAO,IAAI,KAAK,QAAQ,EAAE,mCAAmC,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAA6C;IAE7C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,MAAM,CAClB,OAAO,CAAC,GAAG,CAAC,CAAC,KAAmC,EAAE,EAAE;QAClD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,yBAAyB,CAAC,KAAK,CAAC,CAAC;QACvE,SAAS,CACP,KAAK,EAAE,IAAI,KAAK,cAAc,EAC9B,gEAAgE,CACjE,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CACH,CAAC;AACJ,CAAC","sourcesContent":["import { invariant } from \"./errors.ts\";\nimport type {\n HarnessInstructionContext,\n HarnessInstructions,\n HarnessInstructionSource,\n HarnessInstructionsOption,\n} from \"./harness.types.ts\";\n\nexport function defineHarnessInstructions(\n source: HarnessInstructionSource,\n): HarnessInstructions {\n invariant(\n typeof source === \"function\" ||\n (typeof source === \"string\" && source.trim()),\n \"Instructions must be nonempty text or a function\",\n );\n return Object.freeze({\n kind: \"instructions\",\n async resolve(context: HarnessInstructionContext) {\n const text = typeof source === \"string\" ? source : await source(context);\n invariant(typeof text === \"string\", \"Instructions must resolve to text\");\n return text;\n },\n });\n}\n\nexport function harnessInstructions(\n option: HarnessInstructionsOption | undefined,\n): readonly HarnessInstructions[] {\n if (option === undefined) return [];\n const entries = Array.isArray(option) ? option : [option];\n return Object.freeze(\n entries.map((entry: string | HarnessInstructions) => {\n if (typeof entry === \"string\") return defineHarnessInstructions(entry);\n invariant(\n entry?.kind === \"instructions\",\n \"Declare instructions as text or with defineHarnessInstructions\",\n );\n return entry;\n }),\n );\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { ModelContentBlock, ModelMessage, ModelRequest, ModelToolSpec } from "./model.types.ts";
2
+ export declare function requestMessages(request: ModelRequest): readonly ModelMessage[];
3
+ export declare function validateMessages(messages: readonly ModelMessage[]): void;
4
+ export declare function validateTools(tools: readonly ModelToolSpec[]): void;
5
+ export declare function replayable(block: ModelContentBlock, identity: string, model: string): boolean;
@@ -0,0 +1,81 @@
1
+ import { invariant } from "./errors.js";
2
+ import { TOOL_NAME_PATTERN } from "./model.constants.js";
3
+ const text = (value) => typeof value === "string";
4
+ const identifier = (value) => typeof value === "string" && value.trim() !== "";
5
+ const blockRules = {
6
+ text: { role: "any", valid: (block) => text(block.text) },
7
+ "tool-call": {
8
+ role: "assistant",
9
+ valid: (block) => identifier(block.id) &&
10
+ typeof block.name === "string" &&
11
+ TOOL_NAME_PATTERN.test(block.name),
12
+ },
13
+ "tool-result": {
14
+ role: "user",
15
+ valid: (block) => identifier(block.callId) &&
16
+ text(block.content) &&
17
+ (block.isError === undefined || typeof block.isError === "boolean"),
18
+ },
19
+ reasoning: {
20
+ role: "assistant",
21
+ valid: (block) => identifier(block.provider) && identifier(block.model),
22
+ },
23
+ };
24
+ export function requestMessages(request) {
25
+ invariant((request.prompt === undefined) !== (request.messages === undefined), "Model request requires exactly one of prompt or messages");
26
+ if (request.messages !== undefined) {
27
+ validateMessages(request.messages);
28
+ return request.messages;
29
+ }
30
+ invariant(typeof request.prompt === "string" && request.prompt.trim(), "Model prompt must be nonempty text");
31
+ return [{ role: "user", content: [{ type: "text", text: request.prompt }] }];
32
+ }
33
+ export function validateMessages(messages) {
34
+ invariant(Array.isArray(messages) && messages.length > 0, "Model messages must be a nonempty array");
35
+ let pending = new Set();
36
+ for (const message of messages) {
37
+ invariant(message !== null &&
38
+ typeof message === "object" &&
39
+ (message.role === "user" || message.role === "assistant") &&
40
+ Array.isArray(message.content) &&
41
+ message.content.length > 0, "Model messages need a user or assistant role and content blocks");
42
+ const content = message.content;
43
+ for (const block of content)
44
+ validateBlock(block, message.role);
45
+ const results = content.flatMap((block) => block.type === "tool-result" ? [block.callId] : []);
46
+ invariant(results.length === pending.size &&
47
+ results.every((id) => pending.has(id)) &&
48
+ new Set(results).size === results.length, "Each tool call needs exactly one result in the next user message");
49
+ pending = new Set(content.flatMap((block) => block.type === "tool-call" ? [block.id] : []));
50
+ }
51
+ invariant(messages[0].role === "user" && messages.at(-1).role === "user", "Model messages must start and end with a user message");
52
+ }
53
+ export function validateTools(tools) {
54
+ invariant(Array.isArray(tools), "Model tools must be an array");
55
+ const names = new Set();
56
+ for (const tool of tools) {
57
+ invariant(tool !== null &&
58
+ typeof tool === "object" &&
59
+ typeof tool.name === "string" &&
60
+ TOOL_NAME_PATTERN.test(tool.name) &&
61
+ !names.has(tool.name), "Model tools need unique names of letters, digits, underscores or hyphens");
62
+ names.add(tool.name);
63
+ invariant(typeof tool.description === "string" &&
64
+ tool.inputSchema !== null &&
65
+ typeof tool.inputSchema === "object" &&
66
+ !Array.isArray(tool.inputSchema), "Model tools need a description and a JSON Schema object");
67
+ }
68
+ }
69
+ export function replayable(block, identity, model) {
70
+ return (block.type !== "reasoning" ||
71
+ (block.provider === identity && block.model === model));
72
+ }
73
+ function validateBlock(block, role) {
74
+ invariant(block !== null &&
75
+ typeof block === "object" &&
76
+ Object.hasOwn(blockRules, block.type), "Unsupported model content block");
77
+ const rule = blockRules[block.type];
78
+ invariant((rule.role === "any" || rule.role === role) &&
79
+ rule.valid(block), `Invalid ${block.type} block in a ${role} message`);
80
+ }
81
+ //# sourceMappingURL=model-messages.js.map