@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 @@
1
+ {"version":3,"file":"model-messages.js","sourceRoot":"","sources":["../../src/domain/model-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { invariant } from \"./errors.ts\";\nimport { TOOL_NAME_PATTERN } from \"./model.constants.ts\";\nimport type { BlockRules } from \"./model-messages.types.ts\";\nimport type {\n ModelContentBlock,\n ModelMessage,\n ModelRequest,\n ModelToolSpec,\n} from \"./model.types.ts\";\n\nconst text = (value: unknown) => typeof value === \"string\";\nconst identifier = (value: unknown) =>\n typeof value === \"string\" && value.trim() !== \"\";\n\nconst blockRules: BlockRules = {\n text: { role: \"any\", valid: (block) => text(block.text) },\n \"tool-call\": {\n role: \"assistant\",\n valid: (block) =>\n identifier(block.id) &&\n typeof block.name === \"string\" &&\n TOOL_NAME_PATTERN.test(block.name),\n },\n \"tool-result\": {\n role: \"user\",\n valid: (block) =>\n identifier(block.callId) &&\n text(block.content) &&\n (block.isError === undefined || typeof block.isError === \"boolean\"),\n },\n reasoning: {\n role: \"assistant\",\n valid: (block) => identifier(block.provider) && identifier(block.model),\n },\n};\n\nexport function requestMessages(\n request: ModelRequest,\n): readonly ModelMessage[] {\n invariant(\n (request.prompt === undefined) !== (request.messages === undefined),\n \"Model request requires exactly one of prompt or messages\",\n );\n if (request.messages !== undefined) {\n validateMessages(request.messages);\n return request.messages;\n }\n invariant(\n typeof request.prompt === \"string\" && request.prompt.trim(),\n \"Model prompt must be nonempty text\",\n );\n return [{ role: \"user\", content: [{ type: \"text\", text: request.prompt }] }];\n}\n\nexport function validateMessages(messages: readonly ModelMessage[]): void {\n invariant(\n Array.isArray(messages) && messages.length > 0,\n \"Model messages must be a nonempty array\",\n );\n let pending = new Set<string>();\n for (const message of messages) {\n invariant(\n message !== null &&\n typeof message === \"object\" &&\n (message.role === \"user\" || message.role === \"assistant\") &&\n Array.isArray(message.content) &&\n message.content.length > 0,\n \"Model messages need a user or assistant role and content blocks\",\n );\n const content: readonly ModelContentBlock[] = message.content;\n for (const block of content) validateBlock(block, message.role);\n const results = content.flatMap((block) =>\n block.type === \"tool-result\" ? [block.callId] : [],\n );\n invariant(\n results.length === pending.size &&\n results.every((id) => pending.has(id)) &&\n new Set(results).size === results.length,\n \"Each tool call needs exactly one result in the next user message\",\n );\n pending = new Set(\n content.flatMap((block) =>\n block.type === \"tool-call\" ? [block.id] : [],\n ),\n );\n }\n invariant(\n messages[0]!.role === \"user\" && messages.at(-1)!.role === \"user\",\n \"Model messages must start and end with a user message\",\n );\n}\n\nexport function validateTools(tools: readonly ModelToolSpec[]): void {\n invariant(Array.isArray(tools), \"Model tools must be an array\");\n const names = new Set<string>();\n for (const tool of tools) {\n invariant(\n tool !== null &&\n typeof tool === \"object\" &&\n typeof tool.name === \"string\" &&\n TOOL_NAME_PATTERN.test(tool.name) &&\n !names.has(tool.name),\n \"Model tools need unique names of letters, digits, underscores or hyphens\",\n );\n names.add(tool.name);\n invariant(\n typeof tool.description === \"string\" &&\n tool.inputSchema !== null &&\n typeof tool.inputSchema === \"object\" &&\n !Array.isArray(tool.inputSchema),\n \"Model tools need a description and a JSON Schema object\",\n );\n }\n}\n\nexport function replayable(\n block: ModelContentBlock,\n identity: string,\n model: string,\n): boolean {\n return (\n block.type !== \"reasoning\" ||\n (block.provider === identity && block.model === model)\n );\n}\n\nfunction validateBlock(block: ModelContentBlock, role: ModelMessage[\"role\"]) {\n invariant(\n block !== null &&\n typeof block === \"object\" &&\n Object.hasOwn(blockRules, block.type),\n \"Unsupported model content block\",\n );\n const rule = blockRules[block.type];\n invariant(\n (rule.role === \"any\" || rule.role === role) &&\n rule.valid(block as unknown as Record<string, unknown>),\n `Invalid ${block.type} block in a ${role} message`,\n );\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { ModelContentBlock, ModelMessage } from "./model.types.ts";
2
+ export interface BlockRule {
3
+ readonly role: ModelMessage["role"] | "any";
4
+ valid(block: Readonly<Record<string, unknown>>): boolean;
5
+ }
6
+ export type BlockRules = Readonly<Record<ModelContentBlock["type"], BlockRule>>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model-messages.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-messages.types.js","sourceRoot":"","sources":["../../src/domain/model-messages.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ModelContentBlock, ModelMessage } from \"./model.types.ts\";\n\nexport interface BlockRule {\n readonly role: ModelMessage[\"role\"] | \"any\";\n valid(block: Readonly<Record<string, unknown>>): boolean;\n}\n\nexport type BlockRules = Readonly<Record<ModelContentBlock[\"type\"], BlockRule>>;\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ModelReasoning } from "./model.types.ts";
2
+ export declare const MODEL_REASONING: ReadonlySet<ModelReasoning>;
3
+ export declare const AGENT_MODEL_FIELDS: ReadonlySet<string>;
4
+ export declare const TOOL_NAME_PATTERN: RegExp;
@@ -0,0 +1,16 @@
1
+ export const MODEL_REASONING = new Set([
2
+ "none",
3
+ "minimal",
4
+ "low",
5
+ "medium",
6
+ "high",
7
+ "xhigh",
8
+ "max",
9
+ ]);
10
+ export const AGENT_MODEL_FIELDS = new Set([
11
+ "name",
12
+ "reasoning",
13
+ "maxOutputTokens",
14
+ ]);
15
+ export const TOOL_NAME_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
16
+ //# sourceMappingURL=model.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.constants.js","sourceRoot":"","sources":["../../src/domain/model.constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAgC,IAAI,GAAG,CAAC;IAClE,MAAM;IACN,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;CACN,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IAC7D,MAAM;IACN,WAAW;IACX,iBAAiB;CAClB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,uBAAuB,CAAC","sourcesContent":["import type { ModelReasoning } from \"./model.types.ts\";\n\nexport const MODEL_REASONING: ReadonlySet<ModelReasoning> = new Set([\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n]);\n\nexport const AGENT_MODEL_FIELDS: ReadonlySet<string> = new Set([\n \"name\",\n \"reasoning\",\n \"maxOutputTokens\",\n]);\n\nexport const TOOL_NAME_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;\n"]}
@@ -1,15 +1,72 @@
1
1
  import type { Usage } from "./agent.types.ts";
2
+ export type ModelReasoning = "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
3
+ export interface AgentModel {
4
+ readonly name: string;
5
+ readonly reasoning?: ModelReasoning;
6
+ readonly maxOutputTokens?: number;
7
+ }
8
+ export type ModelSpec = string | AgentModel;
9
+ export interface ModelTextBlock {
10
+ readonly type: "text";
11
+ readonly text: string;
12
+ }
13
+ export interface ModelToolCallBlock {
14
+ readonly type: "tool-call";
15
+ readonly id: string;
16
+ readonly name: string;
17
+ readonly input: unknown;
18
+ }
19
+ export interface ModelToolResultBlock {
20
+ readonly type: "tool-result";
21
+ readonly callId: string;
22
+ readonly content: string;
23
+ readonly isError?: boolean;
24
+ }
25
+ export interface ModelReasoningBlock {
26
+ readonly type: "reasoning";
27
+ readonly provider: string;
28
+ readonly model: string;
29
+ readonly data: unknown;
30
+ }
31
+ export type ModelContentBlock = ModelTextBlock | ModelToolCallBlock | ModelToolResultBlock | ModelReasoningBlock;
32
+ export interface ModelMessage {
33
+ readonly role: "user" | "assistant";
34
+ readonly content: readonly ModelContentBlock[];
35
+ }
36
+ export interface ModelToolSpec {
37
+ readonly name: string;
38
+ readonly description: string;
39
+ readonly inputSchema: Readonly<Record<string, unknown>>;
40
+ }
41
+ export type ModelStopReason = "end" | "tool-calls" | "max-tokens" | "refusal";
2
42
  export interface ModelRequest {
3
- readonly prompt: string;
43
+ readonly model: string;
44
+ readonly prompt?: string;
45
+ readonly messages?: readonly ModelMessage[];
4
46
  readonly system?: string;
47
+ readonly tools?: readonly ModelToolSpec[];
5
48
  readonly maxOutputTokens?: number;
49
+ readonly reasoning?: ModelReasoning;
50
+ readonly cache?: boolean;
6
51
  readonly signal?: AbortSignal;
7
52
  }
8
53
  export interface ModelResult {
9
54
  readonly text: string;
55
+ readonly content?: readonly ModelContentBlock[];
56
+ readonly stopReason?: ModelStopReason;
10
57
  readonly usage?: Usage;
11
58
  }
59
+ export type ModelStreamEvent = {
60
+ readonly type: "text-delta";
61
+ readonly text: string;
62
+ } | {
63
+ readonly type: "result";
64
+ readonly result: ModelResult;
65
+ };
12
66
  export interface ModelProvider {
13
67
  readonly name: string;
14
- generate(request: ModelRequest): Promise<ModelResult>;
68
+ readonly identity?: string;
69
+ validate?(model: AgentModel): void;
70
+ request(request: ModelRequest): Promise<ModelResult>;
71
+ stream?(request: ModelRequest): AsyncIterable<ModelStreamEvent>;
15
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"model.types.js","sourceRoot":"","sources":["../../src/domain/model.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Usage } from \"./agent.types.ts\";\n\nexport interface ModelRequest {\n readonly prompt: string;\n readonly system?: string;\n readonly maxOutputTokens?: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface ModelResult {\n readonly text: string;\n readonly usage?: Usage;\n}\n\nexport interface ModelProvider {\n readonly name: string;\n generate(request: ModelRequest): Promise<ModelResult>;\n}\n"]}
1
+ {"version":3,"file":"model.types.js","sourceRoot":"","sources":["../../src/domain/model.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Usage } from \"./agent.types.ts\";\n\nexport type ModelReasoning =\n \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\nexport interface AgentModel {\n readonly name: string;\n readonly reasoning?: ModelReasoning;\n readonly maxOutputTokens?: number;\n}\n\nexport type ModelSpec = string | AgentModel;\n\nexport interface ModelTextBlock {\n readonly type: \"text\";\n readonly text: string;\n}\n\nexport interface ModelToolCallBlock {\n readonly type: \"tool-call\";\n readonly id: string;\n readonly name: string;\n readonly input: unknown;\n}\n\nexport interface ModelToolResultBlock {\n readonly type: \"tool-result\";\n readonly callId: string;\n readonly content: string;\n readonly isError?: boolean;\n}\n\nexport interface ModelReasoningBlock {\n readonly type: \"reasoning\";\n readonly provider: string;\n readonly model: string;\n readonly data: unknown;\n}\n\nexport type ModelContentBlock =\n | ModelTextBlock\n | ModelToolCallBlock\n | ModelToolResultBlock\n | ModelReasoningBlock;\n\nexport interface ModelMessage {\n readonly role: \"user\" | \"assistant\";\n readonly content: readonly ModelContentBlock[];\n}\n\nexport interface ModelToolSpec {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: Readonly<Record<string, unknown>>;\n}\n\nexport type ModelStopReason = \"end\" | \"tool-calls\" | \"max-tokens\" | \"refusal\";\n\nexport interface ModelRequest {\n readonly model: string;\n readonly prompt?: string;\n readonly messages?: readonly ModelMessage[];\n readonly system?: string;\n readonly tools?: readonly ModelToolSpec[];\n readonly maxOutputTokens?: number;\n readonly reasoning?: ModelReasoning;\n readonly cache?: boolean;\n readonly signal?: AbortSignal;\n}\n\nexport interface ModelResult {\n readonly text: string;\n readonly content?: readonly ModelContentBlock[];\n readonly stopReason?: ModelStopReason;\n readonly usage?: Usage;\n}\n\nexport type ModelStreamEvent =\n | { readonly type: \"text-delta\"; readonly text: string }\n | { readonly type: \"result\"; readonly result: ModelResult };\n\nexport interface ModelProvider {\n readonly name: string;\n readonly identity?: string;\n validate?(model: AgentModel): void;\n request(request: ModelRequest): Promise<ModelResult>;\n stream?(request: ModelRequest): AsyncIterable<ModelStreamEvent>;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { HarnessPermissions, HarnessPermissionsOptions } from "./permissions.types.ts";
2
+ export declare function defineHarnessPermissions(options: HarnessPermissionsOptions): HarnessPermissions;
3
+ export declare function normalizeResourcePath(path: string): string | undefined;
@@ -0,0 +1,92 @@
1
+ import { invariant } from "./errors.js";
2
+ import { glob } from "./glob.js";
3
+ const RULE_FIELDS = new Set(["effect", "tools", "paths", "commands", "reason"]);
4
+ const allowed = Object.freeze({ allowed: true });
5
+ export function defineHarnessPermissions(options) {
6
+ invariant(options !== null &&
7
+ typeof options === "object" &&
8
+ Array.isArray(options.rules), "Permissions require a rules array");
9
+ const fallback = options.default ?? "allow";
10
+ invariant(fallback === "allow" || fallback === "deny", 'Permission default must be "allow" or "deny"');
11
+ const compiled = options.rules.map(compileRule);
12
+ return Object.freeze({
13
+ kind: "permissions",
14
+ rules: Object.freeze(compiled.map(({ rule }) => rule)),
15
+ default: fallback,
16
+ evaluate(tool, resources) {
17
+ const index = compiled.findIndex((entry) => applies(entry, tool, resources));
18
+ const rule = compiled[index]?.rule;
19
+ if (rule?.effect === "allow")
20
+ return allowed;
21
+ if (rule)
22
+ return {
23
+ allowed: false,
24
+ reason: rule.reason ?? `Denied by permission rule ${index + 1}`,
25
+ };
26
+ if (fallback === "allow")
27
+ return allowed;
28
+ return { allowed: false, reason: "Denied by default permissions" };
29
+ },
30
+ });
31
+ }
32
+ export function normalizeResourcePath(path) {
33
+ const segments = [];
34
+ const posix = path.replaceAll("\\", "/");
35
+ if (posix.startsWith("/") || /^[A-Za-z]:\//.test(posix))
36
+ return undefined;
37
+ for (const segment of posix.split("/")) {
38
+ if (segment === "" || segment === ".")
39
+ continue;
40
+ if (segment !== "..") {
41
+ segments.push(segment);
42
+ continue;
43
+ }
44
+ if (!segments.length)
45
+ return undefined;
46
+ segments.pop();
47
+ }
48
+ return segments.join("/");
49
+ }
50
+ function compileRule(rule) {
51
+ invariant(rule !== null &&
52
+ typeof rule === "object" &&
53
+ Object.keys(rule).every((key) => RULE_FIELDS.has(key)), "Permission rules accept effect, tools, paths, commands and reason");
54
+ invariant(rule.effect === "allow" || rule.effect === "deny", 'Permission effect must be "allow" or "deny"');
55
+ invariant(rule.reason === undefined ||
56
+ (typeof rule.reason === "string" && rule.reason.trim()), "Permission reason must be nonempty text");
57
+ return Object.freeze({
58
+ rule: Object.freeze({ ...rule }),
59
+ ...patterns("tools", rule.tools, (value) => glob(value, "text")),
60
+ ...patterns("paths", rule.paths, (value) => glob(value, "path")),
61
+ ...patterns("commands", rule.commands, (value) => glob(value, "text")),
62
+ });
63
+ }
64
+ function patterns(key, values, compile) {
65
+ if (values === undefined)
66
+ return {};
67
+ invariant(Array.isArray(values) &&
68
+ values.length > 0 &&
69
+ values.every((value) => typeof value === "string" && value.trim()), `Permission ${key} must be a nonempty list of patterns`);
70
+ return { [key]: Object.freeze(values.map(compile)) };
71
+ }
72
+ function applies(entry, tool, resources) {
73
+ if (entry.tools && !entry.tools.some((pattern) => pattern.test(tool)))
74
+ return false;
75
+ if (entry.commands) {
76
+ const command = resources.command;
77
+ if (command === undefined)
78
+ return false;
79
+ if (!entry.commands.some((pattern) => pattern.test(command)))
80
+ return false;
81
+ }
82
+ if (!entry.paths)
83
+ return true;
84
+ const paths = (resources.paths ?? []).map(normalizeResourcePath);
85
+ if (!paths.length)
86
+ return false;
87
+ const matches = (path) => path !== undefined && entry.paths.some((pattern) => pattern.test(path));
88
+ return entry.rule.effect === "allow"
89
+ ? paths.every(matches)
90
+ : paths.some(matches);
91
+ }
92
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/domain/permissions.ts"],"names":[],"mappings":"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","sourcesContent":["import { invariant } from \"./errors.ts\";\nimport { glob } from \"./glob.ts\";\nimport type {\n CompiledRule,\n HarnessPermissionRule,\n HarnessPermissions,\n HarnessPermissionsOptions,\n PermissionDecision,\n ToolResources,\n} from \"./permissions.types.ts\";\n\nconst RULE_FIELDS = new Set([\"effect\", \"tools\", \"paths\", \"commands\", \"reason\"]);\nconst allowed: PermissionDecision = Object.freeze({ allowed: true });\n\nexport function defineHarnessPermissions(\n options: HarnessPermissionsOptions,\n): HarnessPermissions {\n invariant(\n options !== null &&\n typeof options === \"object\" &&\n Array.isArray(options.rules),\n \"Permissions require a rules array\",\n );\n const fallback = options.default ?? \"allow\";\n invariant(\n fallback === \"allow\" || fallback === \"deny\",\n 'Permission default must be \"allow\" or \"deny\"',\n );\n const compiled = options.rules.map(compileRule);\n return Object.freeze({\n kind: \"permissions\",\n rules: Object.freeze(compiled.map(({ rule }) => rule)),\n default: fallback,\n evaluate(tool: string, resources: ToolResources): PermissionDecision {\n const index = compiled.findIndex((entry) =>\n applies(entry, tool, resources),\n );\n const rule = compiled[index]?.rule;\n if (rule?.effect === \"allow\") return allowed;\n if (rule)\n return {\n allowed: false,\n reason: rule.reason ?? `Denied by permission rule ${index + 1}`,\n };\n if (fallback === \"allow\") return allowed;\n return { allowed: false, reason: \"Denied by default permissions\" };\n },\n });\n}\n\nexport function normalizeResourcePath(path: string): string | undefined {\n const segments: string[] = [];\n const posix = path.replaceAll(\"\\\\\", \"/\");\n if (posix.startsWith(\"/\") || /^[A-Za-z]:\\//.test(posix)) return undefined;\n for (const segment of posix.split(\"/\")) {\n if (segment === \"\" || segment === \".\") continue;\n if (segment !== \"..\") {\n segments.push(segment);\n continue;\n }\n if (!segments.length) return undefined;\n segments.pop();\n }\n return segments.join(\"/\");\n}\n\nfunction compileRule(rule: HarnessPermissionRule): CompiledRule {\n invariant(\n rule !== null &&\n typeof rule === \"object\" &&\n Object.keys(rule).every((key) => RULE_FIELDS.has(key)),\n \"Permission rules accept effect, tools, paths, commands and reason\",\n );\n invariant(\n rule.effect === \"allow\" || rule.effect === \"deny\",\n 'Permission effect must be \"allow\" or \"deny\"',\n );\n invariant(\n rule.reason === undefined ||\n (typeof rule.reason === \"string\" && rule.reason.trim()),\n \"Permission reason must be nonempty text\",\n );\n return Object.freeze({\n rule: Object.freeze({ ...rule }),\n ...patterns(\"tools\", rule.tools, (value) => glob(value, \"text\")),\n ...patterns(\"paths\", rule.paths, (value) => glob(value, \"path\")),\n ...patterns(\"commands\", rule.commands, (value) => glob(value, \"text\")),\n });\n}\n\nfunction patterns(\n key: \"tools\" | \"paths\" | \"commands\",\n values: readonly string[] | undefined,\n compile: (value: string) => RegExp,\n) {\n if (values === undefined) return {};\n invariant(\n Array.isArray(values) &&\n values.length > 0 &&\n values.every((value) => typeof value === \"string\" && value.trim()),\n `Permission ${key} must be a nonempty list of patterns`,\n );\n return { [key]: Object.freeze(values.map(compile)) };\n}\n\nfunction applies(\n entry: CompiledRule,\n tool: string,\n resources: ToolResources,\n): boolean {\n if (entry.tools && !entry.tools.some((pattern) => pattern.test(tool)))\n return false;\n if (entry.commands) {\n const command = resources.command;\n if (command === undefined) return false;\n if (!entry.commands.some((pattern) => pattern.test(command))) return false;\n }\n if (!entry.paths) return true;\n const paths = (resources.paths ?? []).map(normalizeResourcePath);\n if (!paths.length) return false;\n const matches = (path: string | undefined) =>\n path !== undefined && entry.paths!.some((pattern) => pattern.test(path));\n return entry.rule.effect === \"allow\"\n ? paths.every(matches)\n : paths.some(matches);\n}\n"]}
@@ -0,0 +1,34 @@
1
+ export type PermissionEffect = "allow" | "deny";
2
+ export interface HarnessPermissionRule {
3
+ readonly effect: PermissionEffect;
4
+ readonly tools?: readonly string[];
5
+ readonly paths?: readonly string[];
6
+ readonly commands?: readonly string[];
7
+ readonly reason?: string;
8
+ }
9
+ export interface HarnessPermissionsOptions {
10
+ readonly rules: readonly HarnessPermissionRule[];
11
+ readonly default?: PermissionEffect;
12
+ }
13
+ export interface ToolResources {
14
+ readonly paths?: readonly string[];
15
+ readonly command?: string;
16
+ }
17
+ export type PermissionDecision = {
18
+ readonly allowed: true;
19
+ } | {
20
+ readonly allowed: false;
21
+ readonly reason: string;
22
+ };
23
+ export interface HarnessPermissions {
24
+ readonly kind: "permissions";
25
+ readonly rules: readonly HarnessPermissionRule[];
26
+ readonly default: PermissionEffect;
27
+ evaluate(tool: string, resources: ToolResources): PermissionDecision;
28
+ }
29
+ export interface CompiledRule {
30
+ readonly rule: HarnessPermissionRule;
31
+ readonly tools?: readonly RegExp[];
32
+ readonly paths?: readonly RegExp[];
33
+ readonly commands?: readonly RegExp[];
34
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=permissions.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.types.js","sourceRoot":"","sources":["../../src/domain/permissions.types.ts"],"names":[],"mappings":"","sourcesContent":["export type PermissionEffect = \"allow\" | \"deny\";\n\nexport interface HarnessPermissionRule {\n readonly effect: PermissionEffect;\n readonly tools?: readonly string[];\n readonly paths?: readonly string[];\n readonly commands?: readonly string[];\n readonly reason?: string;\n}\n\nexport interface HarnessPermissionsOptions {\n readonly rules: readonly HarnessPermissionRule[];\n readonly default?: PermissionEffect;\n}\n\nexport interface ToolResources {\n readonly paths?: readonly string[];\n readonly command?: string;\n}\n\nexport type PermissionDecision =\n | { readonly allowed: true }\n | { readonly allowed: false; readonly reason: string };\n\nexport interface HarnessPermissions {\n readonly kind: \"permissions\";\n readonly rules: readonly HarnessPermissionRule[];\n readonly default: PermissionEffect;\n evaluate(tool: string, resources: ToolResources): PermissionDecision;\n}\n\nexport interface CompiledRule {\n readonly rule: HarnessPermissionRule;\n readonly tools?: readonly RegExp[];\n readonly paths?: readonly RegExp[];\n readonly commands?: readonly RegExp[];\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { OutpostError, invariant } from "./errors.js";
2
+ import { validateStandard } from "./standard-schema.js";
2
3
  export class ResponseError extends OutpostError {
3
4
  tag;
4
5
  raw;
@@ -41,8 +42,8 @@ export const response = {
41
42
  const input = JSON.parse(fenced ? fenced[1] : text);
42
43
  if (typeof options.schema === "function")
43
44
  return options.schema(input);
44
- const result = await options.schema["~standard"].validate(input);
45
- if (result.issues)
45
+ const result = await validateStandard(options.schema, input);
46
+ if ("issues" in result)
46
47
  throw new Error(JSON.stringify(result.issues));
47
48
  return result.value;
48
49
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/domain/response.ts"],"names":[],"mappings":"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","sourcesContent":["import { OutpostError, invariant } from \"./errors.ts\";\nimport type {\n JsonResponseOptions,\n ResponseSpec,\n TextResponseOptions,\n} from \"./response.types.ts\";\n\nexport type { ResponseSpec, StandardValidator } from \"./response.types.ts\";\n\nexport class ResponseError extends OutpostError {\n readonly tag: string;\n readonly raw: string | undefined;\n constructor(tag: string, message: string, raw?: string, cause?: unknown) {\n super(\"response\", message, { tag, raw }, cause);\n this.name = \"ResponseError\";\n this.tag = tag;\n this.raw = raw;\n }\n}\n\nfunction content(text: string, tag: string): string {\n const matches = [\n ...text.matchAll(new RegExp(`<${tag}>([\\\\s\\\\S]*?)</${tag}>`, \"g\")),\n ];\n if (!matches.length)\n throw new ResponseError(tag, `No complete <${tag}> response was found`);\n return matches.at(-1)![1]!.trim();\n}\n\nfunction spec<T>(\n tag: string,\n repairs: number,\n parse: (text: string) => Promise<T>,\n): ResponseSpec<T> {\n invariant(\n /^[A-Za-z][A-Za-z0-9_-]*$/.test(tag),\n \"Response tags must be XML-style identifiers\",\n );\n invariant(\n Number.isSafeInteger(repairs) && repairs >= 0,\n \"Response repairs must be a nonnegative integer\",\n );\n return Object.freeze({\n tag,\n repairs,\n async read(text: string) {\n const raw = content(text, tag);\n try {\n return await parse(raw);\n } catch (cause) {\n throw new ResponseError(\n tag,\n `Invalid <${tag}> response: ${cause instanceof Error ? cause.message : String(cause)}`,\n raw,\n cause,\n );\n }\n },\n });\n}\n\nexport const response = {\n text: (options: TextResponseOptions): ResponseSpec<string> =>\n spec(options.tag, options.repairs ?? 0, async (text) => text),\n json: <T>(options: JsonResponseOptions<T>): ResponseSpec<T> =>\n spec(options.tag, options.repairs ?? 0, async (text) => {\n const fenced = text.match(/^```(?:json)?\\s*\\r?\\n([\\s\\S]*?)\\r?\\n```$/i);\n const input: unknown = JSON.parse(fenced ? fenced[1]! : text);\n if (typeof options.schema === \"function\") return options.schema(input);\n const result = await options.schema[\"~standard\"].validate(input);\n if (result.issues) throw new Error(JSON.stringify(result.issues));\n return result.value;\n }),\n};\n"]}
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/domain/response.ts"],"names":[],"mappings":"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","sourcesContent":["import { OutpostError, invariant } from \"./errors.ts\";\nimport { validateStandard } from \"./standard-schema.ts\";\nimport type {\n JsonResponseOptions,\n ResponseSpec,\n TextResponseOptions,\n} from \"./response.types.ts\";\n\nexport type { ResponseSpec, StandardValidator } from \"./response.types.ts\";\n\nexport class ResponseError extends OutpostError {\n readonly tag: string;\n readonly raw: string | undefined;\n constructor(tag: string, message: string, raw?: string, cause?: unknown) {\n super(\"response\", message, { tag, raw }, cause);\n this.name = \"ResponseError\";\n this.tag = tag;\n this.raw = raw;\n }\n}\n\nfunction content(text: string, tag: string): string {\n const matches = [\n ...text.matchAll(new RegExp(`<${tag}>([\\\\s\\\\S]*?)</${tag}>`, \"g\")),\n ];\n if (!matches.length)\n throw new ResponseError(tag, `No complete <${tag}> response was found`);\n return matches.at(-1)![1]!.trim();\n}\n\nfunction spec<T>(\n tag: string,\n repairs: number,\n parse: (text: string) => Promise<T>,\n): ResponseSpec<T> {\n invariant(\n /^[A-Za-z][A-Za-z0-9_-]*$/.test(tag),\n \"Response tags must be XML-style identifiers\",\n );\n invariant(\n Number.isSafeInteger(repairs) && repairs >= 0,\n \"Response repairs must be a nonnegative integer\",\n );\n return Object.freeze({\n tag,\n repairs,\n async read(text: string) {\n const raw = content(text, tag);\n try {\n return await parse(raw);\n } catch (cause) {\n throw new ResponseError(\n tag,\n `Invalid <${tag}> response: ${cause instanceof Error ? cause.message : String(cause)}`,\n raw,\n cause,\n );\n }\n },\n });\n}\n\nexport const response = {\n text: (options: TextResponseOptions): ResponseSpec<string> =>\n spec(options.tag, options.repairs ?? 0, async (text) => text),\n json: <T>(options: JsonResponseOptions<T>): ResponseSpec<T> =>\n spec(options.tag, options.repairs ?? 0, async (text) => {\n const fenced = text.match(/^```(?:json)?\\s*\\r?\\n([\\s\\S]*?)\\r?\\n```$/i);\n const input: unknown = JSON.parse(fenced ? fenced[1]! : text);\n if (typeof options.schema === \"function\") return options.schema(input);\n const result = await validateStandard(options.schema, input);\n if (\"issues\" in result) throw new Error(JSON.stringify(result.issues));\n return result.value;\n }),\n};\n"]}
@@ -27,3 +27,15 @@ export type TextResponseOptions = {
27
27
  tag: string;
28
28
  repairs?: number;
29
29
  };
30
+ export type StandardResult<T> = {
31
+ readonly value: T;
32
+ } | {
33
+ readonly issues: readonly unknown[];
34
+ };
35
+ export interface StandardIssue {
36
+ readonly message?: unknown;
37
+ readonly path?: readonly unknown[];
38
+ }
39
+ export interface StandardPathSegment {
40
+ readonly key?: unknown;
41
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"response.types.js","sourceRoot":"","sources":["../../src/domain/response.types.ts"],"names":[],"mappings":"","sourcesContent":["export interface StandardValidator<T> {\n readonly \"~standard\": {\n readonly validate: (\n input: unknown,\n ) =>\n | { readonly value: T; readonly issues?: undefined }\n | { readonly issues: readonly unknown[] }\n | Promise<\n | { readonly value: T; readonly issues?: undefined }\n | { readonly issues: readonly unknown[] }\n >;\n };\n}\n\nexport interface ResponseSpec<T> {\n readonly tag: string;\n readonly repairs: number;\n read(text: string): Promise<T>;\n}\n\nexport type JsonResponseOptions<T> = {\n tag: string;\n schema: StandardValidator<T> | ((input: unknown) => T | Promise<T>);\n repairs?: number;\n};\n\nexport type TextResponseOptions = { tag: string; repairs?: number };\n"]}
1
+ {"version":3,"file":"response.types.js","sourceRoot":"","sources":["../../src/domain/response.types.ts"],"names":[],"mappings":"","sourcesContent":["export interface StandardValidator<T> {\n readonly \"~standard\": {\n readonly validate: (\n input: unknown,\n ) =>\n | { readonly value: T; readonly issues?: undefined }\n | { readonly issues: readonly unknown[] }\n | Promise<\n | { readonly value: T; readonly issues?: undefined }\n | { readonly issues: readonly unknown[] }\n >;\n };\n}\n\nexport interface ResponseSpec<T> {\n readonly tag: string;\n readonly repairs: number;\n read(text: string): Promise<T>;\n}\n\nexport type JsonResponseOptions<T> = {\n tag: string;\n schema: StandardValidator<T> | ((input: unknown) => T | Promise<T>);\n repairs?: number;\n};\n\nexport type TextResponseOptions = { tag: string; repairs?: number };\n\nexport type StandardResult<T> =\n { readonly value: T } | { readonly issues: readonly unknown[] };\n\nexport interface StandardIssue {\n readonly message?: unknown;\n readonly path?: readonly unknown[];\n}\n\nexport interface StandardPathSegment {\n readonly key?: unknown;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const SKILL_LOADER = "load_skill";
2
+ export declare const SKILL_FIELDS: ReadonlySet<string>;
@@ -0,0 +1,8 @@
1
+ export const SKILL_LOADER = "load_skill";
2
+ export const SKILL_FIELDS = new Set([
3
+ "name",
4
+ "description",
5
+ "instructions",
6
+ "tools",
7
+ ]);
8
+ //# sourceMappingURL=skill.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.constants.js","sourceRoot":"","sources":["../../src/domain/skill.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC;IACvD,MAAM;IACN,aAAa;IACb,cAAc;IACd,OAAO;CACR,CAAC,CAAC","sourcesContent":["export const SKILL_LOADER = \"load_skill\";\n\nexport const SKILL_FIELDS: ReadonlySet<string> = new Set([\n \"name\",\n \"description\",\n \"instructions\",\n \"tools\",\n]);\n"]}
@@ -0,0 +1,8 @@
1
+ import type { ModelMessage } from "./model.types.ts";
2
+ import type { HarnessSkill, HarnessSkillOptions } from "./skill.types.ts";
3
+ import type { HarnessTool } from "./tool.types.ts";
4
+ export declare function defineHarnessSkill(options: HarnessSkillOptions): HarnessSkill;
5
+ export declare function harnessSkills(skills: readonly HarnessSkill[] | undefined): readonly HarnessSkill[];
6
+ export declare function skillCatalog(skills: readonly HarnessSkill[]): string;
7
+ export declare function skillLoader(skills: readonly HarnessSkill[]): HarnessTool;
8
+ export declare function loadedSkills(messages: readonly ModelMessage[]): ReadonlySet<string>;
@@ -0,0 +1,79 @@
1
+ import { invariant } from "./errors.js";
2
+ import { defineHarnessInstructions } from "./instructions.js";
3
+ import { TOOL_NAME_PATTERN } from "./model.constants.js";
4
+ import { SKILL_FIELDS, SKILL_LOADER } from "./skill.constants.js";
5
+ import { defineHarnessTool, harnessTools } from "./tool.js";
6
+ export function defineHarnessSkill(options) {
7
+ invariant(options !== null &&
8
+ typeof options === "object" &&
9
+ Object.keys(options).every((key) => SKILL_FIELDS.has(key)), "Skills accept name, description, instructions and tools");
10
+ invariant(typeof options.name === "string" && TOOL_NAME_PATTERN.test(options.name), "Skill names use 1 to 64 letters, digits, underscores or hyphens");
11
+ invariant(typeof options.description === "string" && options.description.trim(), "Skill description must be nonempty text");
12
+ return Object.freeze({
13
+ kind: "skill",
14
+ name: options.name,
15
+ description: options.description,
16
+ instructions: defineHarnessInstructions(options.instructions),
17
+ tools: harnessTools(options.tools ?? []),
18
+ });
19
+ }
20
+ export function harnessSkills(skills) {
21
+ if (skills === undefined)
22
+ return [];
23
+ invariant(Array.isArray(skills), "Skills must be an array");
24
+ const names = new Set();
25
+ for (const skill of skills) {
26
+ invariant(skill?.kind === "skill", "Declare skills with defineHarnessSkill");
27
+ invariant(!names.has(skill.name), `Duplicate skill name: ${skill.name}`);
28
+ names.add(skill.name);
29
+ }
30
+ return Object.freeze([...skills]);
31
+ }
32
+ export function skillCatalog(skills) {
33
+ return [
34
+ `Skills are available on demand. Call ${SKILL_LOADER} with a skill name to read its instructions and enable its tools before using them:`,
35
+ ...skills.map((skill) => `- ${skill.name}: ${skill.description}`),
36
+ ].join("\n");
37
+ }
38
+ export function skillLoader(skills) {
39
+ const byName = new Map(skills.map((skill) => [skill.name, skill]));
40
+ return defineHarnessTool({
41
+ name: SKILL_LOADER,
42
+ description: "Load a skill listed in the instructions: returns its instructions and enables its tools for the following steps.",
43
+ readOnly: true,
44
+ input: {
45
+ type: "object",
46
+ properties: { name: { enum: skills.map((skill) => skill.name) } },
47
+ required: ["name"],
48
+ additionalProperties: false,
49
+ },
50
+ async execute(input, context) {
51
+ const skill = byName.get(input.name);
52
+ const text = await skill.instructions.resolve({
53
+ sandbox: context.sandbox,
54
+ signal: context.signal,
55
+ model: context.model,
56
+ });
57
+ const tools = skill.tools.map((tool) => tool.name);
58
+ return tools.length
59
+ ? `${text}\n\nTools now available: ${tools.join(", ")}.`
60
+ : text;
61
+ },
62
+ });
63
+ }
64
+ export function loadedSkills(messages) {
65
+ const requested = new Map();
66
+ const loaded = new Set();
67
+ for (const message of messages)
68
+ for (const block of message.content) {
69
+ if (block.type === "tool-call" && block.name === SKILL_LOADER)
70
+ requested.set(block.id, String(block.input?.name));
71
+ if (block.type !== "tool-result" || block.isError)
72
+ continue;
73
+ const name = requested.get(block.callId);
74
+ if (name !== undefined)
75
+ loaded.add(name);
76
+ }
77
+ return loaded;
78
+ }
79
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/domain/skill.ts"],"names":[],"mappings":"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","sourcesContent":["import { invariant } from \"./errors.ts\";\nimport { defineHarnessInstructions } from \"./instructions.ts\";\nimport { TOOL_NAME_PATTERN } from \"./model.constants.ts\";\nimport type { ModelMessage } from \"./model.types.ts\";\nimport { SKILL_FIELDS, SKILL_LOADER } from \"./skill.constants.ts\";\nimport type {\n HarnessSkill,\n HarnessSkillOptions,\n SkillLoaderInput,\n} from \"./skill.types.ts\";\nimport { defineHarnessTool, harnessTools } from \"./tool.ts\";\nimport type { HarnessTool } from \"./tool.types.ts\";\n\nexport function defineHarnessSkill(options: HarnessSkillOptions): HarnessSkill {\n invariant(\n options !== null &&\n typeof options === \"object\" &&\n Object.keys(options).every((key) => SKILL_FIELDS.has(key)),\n \"Skills accept name, description, instructions and tools\",\n );\n invariant(\n typeof options.name === \"string\" && TOOL_NAME_PATTERN.test(options.name),\n \"Skill names use 1 to 64 letters, digits, underscores or hyphens\",\n );\n invariant(\n typeof options.description === \"string\" && options.description.trim(),\n \"Skill description must be nonempty text\",\n );\n return Object.freeze({\n kind: \"skill\",\n name: options.name,\n description: options.description,\n instructions: defineHarnessInstructions(options.instructions),\n tools: harnessTools(options.tools ?? []),\n });\n}\n\nexport function harnessSkills(\n skills: readonly HarnessSkill[] | undefined,\n): readonly HarnessSkill[] {\n if (skills === undefined) return [];\n invariant(Array.isArray(skills), \"Skills must be an array\");\n const names = new Set<string>();\n for (const skill of skills) {\n invariant(\n skill?.kind === \"skill\",\n \"Declare skills with defineHarnessSkill\",\n );\n invariant(!names.has(skill.name), `Duplicate skill name: ${skill.name}`);\n names.add(skill.name);\n }\n return Object.freeze([...skills]);\n}\n\nexport function skillCatalog(skills: readonly HarnessSkill[]): string {\n return [\n `Skills are available on demand. Call ${SKILL_LOADER} with a skill name to read its instructions and enable its tools before using them:`,\n ...skills.map((skill) => `- ${skill.name}: ${skill.description}`),\n ].join(\"\\n\");\n}\n\nexport function skillLoader(skills: readonly HarnessSkill[]): HarnessTool {\n const byName = new Map(skills.map((skill) => [skill.name, skill]));\n return defineHarnessTool({\n name: SKILL_LOADER,\n description:\n \"Load a skill listed in the instructions: returns its instructions and enables its tools for the following steps.\",\n readOnly: true,\n input: {\n type: \"object\",\n properties: { name: { enum: skills.map((skill) => skill.name) } },\n required: [\"name\"],\n additionalProperties: false,\n },\n async execute(input: SkillLoaderInput, context) {\n const skill = byName.get(input.name)!;\n const text = await skill.instructions.resolve({\n sandbox: context.sandbox,\n signal: context.signal,\n model: context.model,\n });\n const tools = skill.tools.map((tool) => tool.name);\n return tools.length\n ? `${text}\\n\\nTools now available: ${tools.join(\", \")}.`\n : text;\n },\n });\n}\n\nexport function loadedSkills(\n messages: readonly ModelMessage[],\n): ReadonlySet<string> {\n const requested = new Map<string, string>();\n const loaded = new Set<string>();\n for (const message of messages)\n for (const block of message.content) {\n if (block.type === \"tool-call\" && block.name === SKILL_LOADER)\n requested.set(\n block.id,\n String((block.input as SkillLoaderInput)?.name),\n );\n if (block.type !== \"tool-result\" || block.isError) continue;\n const name = requested.get(block.callId);\n if (name !== undefined) loaded.add(name);\n }\n return loaded;\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import type { HarnessInstructions, HarnessInstructionSource } from "./harness.types.ts";
2
+ import type { HarnessTool, HarnessToolset } from "./tool.types.ts";
3
+ export interface HarnessSkillOptions {
4
+ readonly name: string;
5
+ readonly description: string;
6
+ readonly instructions: HarnessInstructionSource;
7
+ readonly tools?: readonly (HarnessTool | HarnessToolset)[];
8
+ }
9
+ export interface HarnessSkill {
10
+ readonly kind: "skill";
11
+ readonly name: string;
12
+ readonly description: string;
13
+ readonly instructions: HarnessInstructions;
14
+ readonly tools: readonly HarnessTool[];
15
+ }
16
+ export interface SkillLoaderInput {
17
+ readonly name: string;
18
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skill.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.types.js","sourceRoot":"","sources":["../../src/domain/skill.types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n HarnessInstructions,\n HarnessInstructionSource,\n} from \"./harness.types.ts\";\nimport type { HarnessTool, HarnessToolset } from \"./tool.types.ts\";\n\nexport interface HarnessSkillOptions {\n readonly name: string;\n readonly description: string;\n readonly instructions: HarnessInstructionSource;\n readonly tools?: readonly (HarnessTool | HarnessToolset)[];\n}\n\nexport interface HarnessSkill {\n readonly kind: \"skill\";\n readonly name: string;\n readonly description: string;\n readonly instructions: HarnessInstructions;\n readonly tools: readonly HarnessTool[];\n}\n\nexport interface SkillLoaderInput {\n readonly name: string;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { StandardResult, StandardValidator } from "./response.types.ts";
2
+ import type { JsonSchema, StandardJsonSchema } from "./tool.types.ts";
3
+ export declare function validateStandard<T>(schema: StandardValidator<T>, value: unknown): Promise<StandardResult<T>>;
4
+ export declare function isStandardJsonSchema(value: unknown): value is StandardJsonSchema<unknown>;
5
+ export declare function standardInputSchema(schema: StandardJsonSchema<unknown>): JsonSchema;
6
+ export declare function formatIssues(issues: readonly unknown[]): string;
@@ -0,0 +1,45 @@
1
+ import { invariant } from "./errors.js";
2
+ import { STANDARD_JSON_SCHEMA_TARGET } from "./tool.constants.js";
3
+ export async function validateStandard(schema, value) {
4
+ const result = await schema["~standard"].validate(value);
5
+ if (result.issues)
6
+ return { issues: result.issues };
7
+ return { value: result.value };
8
+ }
9
+ export function isStandardJsonSchema(value) {
10
+ if (value === null || typeof value !== "object" || !("~standard" in value))
11
+ return false;
12
+ const standard = value["~standard"];
13
+ return (typeof standard?.validate === "function" &&
14
+ typeof standard.jsonSchema
15
+ ?.input === "function");
16
+ }
17
+ export function standardInputSchema(schema) {
18
+ const converted = schema["~standard"].jsonSchema.input({
19
+ target: STANDARD_JSON_SCHEMA_TARGET,
20
+ });
21
+ invariant(converted !== null &&
22
+ typeof converted === "object" &&
23
+ !Array.isArray(converted) &&
24
+ converted.type === "object", "Standard schema must convert to a JSON Schema object");
25
+ const { $schema: _dialect, ...portable } = converted;
26
+ return Object.freeze(portable);
27
+ }
28
+ export function formatIssues(issues) {
29
+ return issues
30
+ .map((issue) => {
31
+ if (issue === null || typeof issue !== "object")
32
+ return String(issue);
33
+ const { message, path } = issue;
34
+ const location = Array.isArray(path)
35
+ ? path
36
+ .map((segment) => segment !== null && typeof segment === "object"
37
+ ? String(segment.key)
38
+ : String(segment))
39
+ .join(".")
40
+ : "";
41
+ return `${location ? `${location}: ` : ""}${String(message ?? JSON.stringify(issue))}`;
42
+ })
43
+ .join("; ");
44
+ }
45
+ //# sourceMappingURL=standard-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-schema.js","sourceRoot":"","sources":["../../src/domain/standard-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AASlE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAA4B,EAC5B,KAAc;IAEd,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACpD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAc;IAEd,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAwC,CAAC;IAC3E,OAAO,CACL,OAAO,QAAQ,EAAE,QAAQ,KAAK,UAAU;QACxC,OAAQ,QAAQ,CAAC,UAAkD;YACjE,EAAE,KAAK,KAAK,UAAU,CACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAmC;IAEnC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;QACrD,MAAM,EAAE,2BAA2B;KACpC,CAAC,CAAC;IACH,SAAS,CACP,SAAS,KAAK,IAAI;QAChB,OAAO,SAAS,KAAK,QAAQ;QAC7B,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QACzB,SAAS,CAAC,IAAI,KAAK,QAAQ,EAC7B,sDAAsD,CACvD,CAAC;IACF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,GAAG,SAAS,CAAC;IACrD,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAsB,CAAC;QACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAClC,CAAC,CAAC,IAAI;iBACD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACf,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAC7C,CAAC,CAAC,MAAM,CAAE,OAA+B,CAAC,GAAG,CAAC;gBAC9C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CACpB;iBACA,IAAI,CAAC,GAAG,CAAC;YACd,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IACzF,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC","sourcesContent":["import { invariant } from \"./errors.ts\";\nimport { STANDARD_JSON_SCHEMA_TARGET } from \"./tool.constants.ts\";\nimport type {\n StandardIssue,\n StandardPathSegment,\n StandardResult,\n StandardValidator,\n} from \"./response.types.ts\";\nimport type { JsonSchema, StandardJsonSchema } from \"./tool.types.ts\";\n\nexport async function validateStandard<T>(\n schema: StandardValidator<T>,\n value: unknown,\n): Promise<StandardResult<T>> {\n const result = await schema[\"~standard\"].validate(value);\n if (result.issues) return { issues: result.issues };\n return { value: result.value };\n}\n\nexport function isStandardJsonSchema(\n value: unknown,\n): value is StandardJsonSchema<unknown> {\n if (value === null || typeof value !== \"object\" || !(\"~standard\" in value))\n return false;\n const standard = value[\"~standard\"] as Record<string, unknown> | undefined;\n return (\n typeof standard?.validate === \"function\" &&\n typeof (standard.jsonSchema as Record<string, unknown> | undefined)\n ?.input === \"function\"\n );\n}\n\nexport function standardInputSchema(\n schema: StandardJsonSchema<unknown>,\n): JsonSchema {\n const converted = schema[\"~standard\"].jsonSchema.input({\n target: STANDARD_JSON_SCHEMA_TARGET,\n });\n invariant(\n converted !== null &&\n typeof converted === \"object\" &&\n !Array.isArray(converted) &&\n converted.type === \"object\",\n \"Standard schema must convert to a JSON Schema object\",\n );\n const { $schema: _dialect, ...portable } = converted;\n return Object.freeze(portable);\n}\n\nexport function formatIssues(issues: readonly unknown[]): string {\n return issues\n .map((issue) => {\n if (issue === null || typeof issue !== \"object\") return String(issue);\n const { message, path } = issue as StandardIssue;\n const location = Array.isArray(path)\n ? path\n .map((segment) =>\n segment !== null && typeof segment === \"object\"\n ? String((segment as StandardPathSegment).key)\n : String(segment),\n )\n .join(\".\")\n : \"\";\n return `${location ? `${location}: ` : \"\"}${String(message ?? JSON.stringify(issue))}`;\n })\n .join(\"; \");\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { JsonSchema } from "./tool.types.ts";
2
+ export declare function validateSchemaDefinition(schema: unknown, root?: boolean): void;
3
+ export declare function schemaIssues(schema: JsonSchema, value: unknown, path?: string): readonly string[];