@the-open-engine/zeroshot 6.30.2 → 6.31.0

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 (318) hide show
  1. package/lib/agent-cli-provider/adapters/acp.d.ts.map +1 -1
  2. package/lib/agent-cli-provider/adapters/acp.js +7 -11
  3. package/lib/agent-cli-provider/adapters/acp.js.map +1 -1
  4. package/lib/agent-cli-provider/adapters/omp-policy.d.ts +4 -0
  5. package/lib/agent-cli-provider/adapters/omp-policy.d.ts.map +1 -0
  6. package/lib/agent-cli-provider/adapters/omp-policy.js +47 -0
  7. package/lib/agent-cli-provider/adapters/omp-policy.js.map +1 -0
  8. package/lib/agent-cli-provider/adapters/omp.d.ts.map +1 -1
  9. package/lib/agent-cli-provider/adapters/omp.js +8 -158
  10. package/lib/agent-cli-provider/adapters/omp.js.map +1 -1
  11. package/lib/agent-cli-provider/adapters/pi.d.ts.map +1 -1
  12. package/lib/agent-cli-provider/adapters/pi.js +12 -124
  13. package/lib/agent-cli-provider/adapters/pi.js.map +1 -1
  14. package/lib/agent-cli-provider/assistant-stream.d.ts +27 -0
  15. package/lib/agent-cli-provider/assistant-stream.d.ts.map +1 -0
  16. package/lib/agent-cli-provider/assistant-stream.js +119 -0
  17. package/lib/agent-cli-provider/assistant-stream.js.map +1 -0
  18. package/lib/agent-cli-provider/contract-actions.d.ts.map +1 -1
  19. package/lib/agent-cli-provider/contract-actions.js +42 -1
  20. package/lib/agent-cli-provider/contract-actions.js.map +1 -1
  21. package/lib/agent-cli-provider/contract-invoke.d.ts.map +1 -1
  22. package/lib/agent-cli-provider/contract-invoke.js +68 -38
  23. package/lib/agent-cli-provider/contract-invoke.js.map +1 -1
  24. package/lib/agent-cli-provider/contract-support.d.ts +5 -6
  25. package/lib/agent-cli-provider/contract-support.d.ts.map +1 -1
  26. package/lib/agent-cli-provider/contract-support.js +99 -6
  27. package/lib/agent-cli-provider/contract-support.js.map +1 -1
  28. package/lib/agent-cli-provider/index.d.ts +8 -6
  29. package/lib/agent-cli-provider/index.d.ts.map +1 -1
  30. package/lib/agent-cli-provider/index.js +34 -10
  31. package/lib/agent-cli-provider/index.js.map +1 -1
  32. package/lib/agent-cli-provider/omp/auth-policy.d.ts +31 -0
  33. package/lib/agent-cli-provider/omp/auth-policy.d.ts.map +1 -0
  34. package/lib/agent-cli-provider/omp/auth-policy.js +98 -0
  35. package/lib/agent-cli-provider/omp/auth-policy.js.map +1 -0
  36. package/lib/agent-cli-provider/{omp-release.d.ts → omp/release.d.ts} +1 -1
  37. package/lib/agent-cli-provider/omp/release.d.ts.map +1 -0
  38. package/lib/agent-cli-provider/{omp-release.js → omp/release.js} +1 -1
  39. package/lib/agent-cli-provider/omp/release.js.map +1 -0
  40. package/lib/agent-cli-provider/{omp-rpc-bounds.d.ts → omp/rpc-bounds.d.ts} +1 -1
  41. package/lib/agent-cli-provider/omp/rpc-bounds.d.ts.map +1 -0
  42. package/lib/agent-cli-provider/{omp-rpc-bounds.js → omp/rpc-bounds.js} +1 -1
  43. package/lib/agent-cli-provider/omp/rpc-bounds.js.map +1 -0
  44. package/lib/agent-cli-provider/omp/rpc-driver-channel.d.ts +19 -0
  45. package/lib/agent-cli-provider/omp/rpc-driver-channel.d.ts.map +1 -0
  46. package/lib/agent-cli-provider/omp/rpc-driver-channel.js +109 -0
  47. package/lib/agent-cli-provider/omp/rpc-driver-channel.js.map +1 -0
  48. package/lib/agent-cli-provider/omp/rpc-driver-dispatch.d.ts +27 -0
  49. package/lib/agent-cli-provider/omp/rpc-driver-dispatch.d.ts.map +1 -0
  50. package/lib/agent-cli-provider/omp/rpc-driver-dispatch.js +135 -0
  51. package/lib/agent-cli-provider/omp/rpc-driver-dispatch.js.map +1 -0
  52. package/lib/agent-cli-provider/omp/rpc-driver-runner.d.ts +3 -0
  53. package/lib/agent-cli-provider/omp/rpc-driver-runner.d.ts.map +1 -0
  54. package/lib/agent-cli-provider/omp/rpc-driver-runner.js +205 -0
  55. package/lib/agent-cli-provider/omp/rpc-driver-runner.js.map +1 -0
  56. package/lib/agent-cli-provider/omp/rpc-driver-state.d.ts +80 -0
  57. package/lib/agent-cli-provider/omp/rpc-driver-state.d.ts.map +1 -0
  58. package/lib/agent-cli-provider/omp/rpc-driver-state.js +86 -0
  59. package/lib/agent-cli-provider/omp/rpc-driver-state.js.map +1 -0
  60. package/lib/agent-cli-provider/omp/rpc-driver.d.ts +3 -0
  61. package/lib/agent-cli-provider/omp/rpc-driver.d.ts.map +1 -0
  62. package/lib/agent-cli-provider/omp/rpc-driver.js +6 -0
  63. package/lib/agent-cli-provider/omp/rpc-driver.js.map +1 -0
  64. package/lib/agent-cli-provider/omp/rpc-event-lines.d.ts +8 -0
  65. package/lib/agent-cli-provider/omp/rpc-event-lines.d.ts.map +1 -0
  66. package/lib/agent-cli-provider/omp/rpc-event-lines.js +59 -0
  67. package/lib/agent-cli-provider/omp/rpc-event-lines.js.map +1 -0
  68. package/lib/agent-cli-provider/omp/rpc-events.d.ts +16 -0
  69. package/lib/agent-cli-provider/omp/rpc-events.d.ts.map +1 -0
  70. package/lib/agent-cli-provider/omp/rpc-events.js +115 -0
  71. package/lib/agent-cli-provider/omp/rpc-events.js.map +1 -0
  72. package/lib/agent-cli-provider/{omp-rpc-protocol.d.ts → omp/rpc-protocol-contract.d.ts} +1 -13
  73. package/lib/agent-cli-provider/omp/rpc-protocol-contract.d.ts.map +1 -0
  74. package/lib/agent-cli-provider/omp/rpc-protocol-contract.js +54 -0
  75. package/lib/agent-cli-provider/omp/rpc-protocol-contract.js.map +1 -0
  76. package/lib/agent-cli-provider/omp/rpc-protocol.d.ts +15 -0
  77. package/lib/agent-cli-provider/omp/rpc-protocol.d.ts.map +1 -0
  78. package/lib/agent-cli-provider/omp/rpc-protocol.js +208 -0
  79. package/lib/agent-cli-provider/omp/rpc-protocol.js.map +1 -0
  80. package/lib/agent-cli-provider/{omp-rpc-session.d.ts → omp/rpc-session.d.ts} +1 -1
  81. package/lib/agent-cli-provider/omp/rpc-session.d.ts.map +1 -0
  82. package/lib/agent-cli-provider/{omp-rpc-session.js → omp/rpc-session.js} +1 -1
  83. package/lib/agent-cli-provider/omp/rpc-session.js.map +1 -0
  84. package/lib/agent-cli-provider/omp/sdk-contract.d.ts +34 -0
  85. package/lib/agent-cli-provider/omp/sdk-contract.d.ts.map +1 -0
  86. package/lib/agent-cli-provider/omp/sdk-contract.js +81 -0
  87. package/lib/agent-cli-provider/omp/sdk-contract.js.map +1 -0
  88. package/lib/agent-cli-provider/omp/sdk-process-credentials.d.ts +6 -0
  89. package/lib/agent-cli-provider/omp/sdk-process-credentials.d.ts.map +1 -0
  90. package/lib/agent-cli-provider/omp/sdk-process-credentials.js +44 -0
  91. package/lib/agent-cli-provider/omp/sdk-process-credentials.js.map +1 -0
  92. package/lib/agent-cli-provider/omp/sdk-process-error.d.ts +5 -0
  93. package/lib/agent-cli-provider/omp/sdk-process-error.d.ts.map +1 -0
  94. package/lib/agent-cli-provider/omp/sdk-process-error.js +13 -0
  95. package/lib/agent-cli-provider/omp/sdk-process-error.js.map +1 -0
  96. package/lib/agent-cli-provider/omp/sdk-process-io.d.ts +18 -0
  97. package/lib/agent-cli-provider/omp/sdk-process-io.d.ts.map +1 -0
  98. package/lib/agent-cli-provider/omp/sdk-process-io.js +80 -0
  99. package/lib/agent-cli-provider/omp/sdk-process-io.js.map +1 -0
  100. package/lib/agent-cli-provider/omp/sdk-process-private-runtime.d.ts +51 -0
  101. package/lib/agent-cli-provider/omp/sdk-process-private-runtime.d.ts.map +1 -0
  102. package/lib/agent-cli-provider/omp/sdk-process-private-runtime.js +154 -0
  103. package/lib/agent-cli-provider/omp/sdk-process-private-runtime.js.map +1 -0
  104. package/lib/agent-cli-provider/omp/sdk-process-result.d.ts +26 -0
  105. package/lib/agent-cli-provider/omp/sdk-process-result.d.ts.map +1 -0
  106. package/lib/agent-cli-provider/omp/sdk-process-result.js +117 -0
  107. package/lib/agent-cli-provider/omp/sdk-process-result.js.map +1 -0
  108. package/lib/agent-cli-provider/omp/sdk-process-runner.d.ts +7 -0
  109. package/lib/agent-cli-provider/omp/sdk-process-runner.d.ts.map +1 -0
  110. package/lib/agent-cli-provider/omp/sdk-process-runner.js +204 -0
  111. package/lib/agent-cli-provider/omp/sdk-process-runner.js.map +1 -0
  112. package/lib/agent-cli-provider/omp/sdk-protocol-collector.d.ts +3 -0
  113. package/lib/agent-cli-provider/omp/sdk-protocol-collector.d.ts.map +1 -0
  114. package/lib/agent-cli-provider/omp/sdk-protocol-collector.js +145 -0
  115. package/lib/agent-cli-provider/omp/sdk-protocol-collector.js.map +1 -0
  116. package/lib/agent-cli-provider/omp/sdk-protocol-frame.d.ts +4 -0
  117. package/lib/agent-cli-provider/omp/sdk-protocol-frame.d.ts.map +1 -0
  118. package/lib/agent-cli-provider/omp/sdk-protocol-frame.js +183 -0
  119. package/lib/agent-cli-provider/omp/sdk-protocol-frame.js.map +1 -0
  120. package/lib/agent-cli-provider/omp/sdk-protocol-request.d.ts +8 -0
  121. package/lib/agent-cli-provider/omp/sdk-protocol-request.d.ts.map +1 -0
  122. package/lib/agent-cli-provider/omp/sdk-protocol-request.js +170 -0
  123. package/lib/agent-cli-provider/omp/sdk-protocol-request.js.map +1 -0
  124. package/lib/agent-cli-provider/omp/sdk-protocol-result.d.ts +5 -0
  125. package/lib/agent-cli-provider/omp/sdk-protocol-result.d.ts.map +1 -0
  126. package/lib/agent-cli-provider/omp/sdk-protocol-result.js +74 -0
  127. package/lib/agent-cli-provider/omp/sdk-protocol-result.js.map +1 -0
  128. package/lib/agent-cli-provider/omp/sdk-protocol-types.d.ts +94 -0
  129. package/lib/agent-cli-provider/omp/sdk-protocol-types.d.ts.map +1 -0
  130. package/lib/agent-cli-provider/omp/sdk-protocol-types.js +54 -0
  131. package/lib/agent-cli-provider/omp/sdk-protocol-types.js.map +1 -0
  132. package/lib/agent-cli-provider/omp/sdk-protocol-value.d.ts +18 -0
  133. package/lib/agent-cli-provider/omp/sdk-protocol-value.d.ts.map +1 -0
  134. package/lib/agent-cli-provider/omp/sdk-protocol-value.js +229 -0
  135. package/lib/agent-cli-provider/omp/sdk-protocol-value.js.map +1 -0
  136. package/lib/agent-cli-provider/omp/sdk-protocol.d.ts +7 -0
  137. package/lib/agent-cli-provider/omp/sdk-protocol.d.ts.map +1 -0
  138. package/lib/agent-cli-provider/omp/sdk-protocol.js +28 -0
  139. package/lib/agent-cli-provider/omp/sdk-protocol.js.map +1 -0
  140. package/lib/agent-cli-provider/omp/sdk-runtime.d.ts +29 -0
  141. package/lib/agent-cli-provider/omp/sdk-runtime.d.ts.map +1 -0
  142. package/lib/agent-cli-provider/omp/sdk-runtime.js +110 -0
  143. package/lib/agent-cli-provider/omp/sdk-runtime.js.map +1 -0
  144. package/lib/agent-cli-provider/omp/sdk-settings-auth.d.ts +3 -0
  145. package/lib/agent-cli-provider/omp/sdk-settings-auth.d.ts.map +1 -0
  146. package/lib/agent-cli-provider/omp/sdk-settings-auth.js +86 -0
  147. package/lib/agent-cli-provider/omp/sdk-settings-auth.js.map +1 -0
  148. package/lib/agent-cli-provider/omp/sdk-settings-constants.d.ts +26 -0
  149. package/lib/agent-cli-provider/omp/sdk-settings-constants.d.ts.map +1 -0
  150. package/lib/agent-cli-provider/omp/sdk-settings-constants.js +148 -0
  151. package/lib/agent-cli-provider/omp/sdk-settings-constants.js.map +1 -0
  152. package/lib/agent-cli-provider/omp/sdk-settings-model-fields.d.ts +5 -0
  153. package/lib/agent-cli-provider/omp/sdk-settings-model-fields.d.ts.map +1 -0
  154. package/lib/agent-cli-provider/omp/sdk-settings-model-fields.js +198 -0
  155. package/lib/agent-cli-provider/omp/sdk-settings-model-fields.js.map +1 -0
  156. package/lib/agent-cli-provider/omp/sdk-settings-model.d.ts +4 -0
  157. package/lib/agent-cli-provider/omp/sdk-settings-model.d.ts.map +1 -0
  158. package/lib/agent-cli-provider/omp/sdk-settings-model.js +163 -0
  159. package/lib/agent-cli-provider/omp/sdk-settings-model.js.map +1 -0
  160. package/lib/agent-cli-provider/omp/sdk-settings-normalize.d.ts +18 -0
  161. package/lib/agent-cli-provider/omp/sdk-settings-normalize.d.ts.map +1 -0
  162. package/lib/agent-cli-provider/omp/sdk-settings-normalize.js +148 -0
  163. package/lib/agent-cli-provider/omp/sdk-settings-normalize.js.map +1 -0
  164. package/lib/agent-cli-provider/omp/sdk-settings-selector.d.ts +3 -0
  165. package/lib/agent-cli-provider/omp/sdk-settings-selector.d.ts.map +1 -0
  166. package/lib/agent-cli-provider/omp/sdk-settings-selector.js +22 -0
  167. package/lib/agent-cli-provider/omp/sdk-settings-selector.js.map +1 -0
  168. package/lib/agent-cli-provider/omp/sdk-settings-types.d.ts +68 -0
  169. package/lib/agent-cli-provider/omp/sdk-settings-types.d.ts.map +1 -0
  170. package/lib/agent-cli-provider/omp/sdk-settings-types.js +19 -0
  171. package/lib/agent-cli-provider/omp/sdk-settings-types.js.map +1 -0
  172. package/lib/agent-cli-provider/omp/sdk-settings-values.d.ts +14 -0
  173. package/lib/agent-cli-provider/omp/sdk-settings-values.d.ts.map +1 -0
  174. package/lib/agent-cli-provider/omp/sdk-settings-values.js +112 -0
  175. package/lib/agent-cli-provider/omp/sdk-settings-values.js.map +1 -0
  176. package/lib/agent-cli-provider/omp/sdk-settings.d.ts +5 -0
  177. package/lib/agent-cli-provider/omp/sdk-settings.d.ts.map +1 -0
  178. package/lib/agent-cli-provider/omp/sdk-settings.js +16 -0
  179. package/lib/agent-cli-provider/omp/sdk-settings.js.map +1 -0
  180. package/lib/agent-cli-provider/omp/sdk-sidecar-context.d.ts +11 -0
  181. package/lib/agent-cli-provider/omp/sdk-sidecar-context.d.ts.map +1 -0
  182. package/lib/agent-cli-provider/omp/sdk-sidecar-context.js +171 -0
  183. package/lib/agent-cli-provider/omp/sdk-sidecar-context.js.map +1 -0
  184. package/lib/agent-cli-provider/omp/sdk-sidecar-credentials.d.ts +5 -0
  185. package/lib/agent-cli-provider/omp/sdk-sidecar-credentials.d.ts.map +1 -0
  186. package/lib/agent-cli-provider/omp/sdk-sidecar-credentials.js +94 -0
  187. package/lib/agent-cli-provider/omp/sdk-sidecar-credentials.js.map +1 -0
  188. package/lib/agent-cli-provider/omp/sdk-sidecar-execute.d.ts +5 -0
  189. package/lib/agent-cli-provider/omp/sdk-sidecar-execute.d.ts.map +1 -0
  190. package/lib/agent-cli-provider/omp/sdk-sidecar-execute.js +175 -0
  191. package/lib/agent-cli-provider/omp/sdk-sidecar-execute.js.map +1 -0
  192. package/lib/agent-cli-provider/omp/sdk-sidecar-output.d.ts +5 -0
  193. package/lib/agent-cli-provider/omp/sdk-sidecar-output.d.ts.map +1 -0
  194. package/lib/agent-cli-provider/omp/sdk-sidecar-output.js +216 -0
  195. package/lib/agent-cli-provider/omp/sdk-sidecar-output.js.map +1 -0
  196. package/lib/agent-cli-provider/omp/sdk-sidecar-runtime.d.ts +11 -0
  197. package/lib/agent-cli-provider/omp/sdk-sidecar-runtime.d.ts.map +1 -0
  198. package/lib/agent-cli-provider/omp/sdk-sidecar-runtime.js +265 -0
  199. package/lib/agent-cli-provider/omp/sdk-sidecar-runtime.js.map +1 -0
  200. package/lib/agent-cli-provider/omp/sdk-sidecar-types.d.ts +148 -0
  201. package/lib/agent-cli-provider/omp/sdk-sidecar-types.d.ts.map +1 -0
  202. package/lib/agent-cli-provider/omp/sdk-sidecar-types.js +84 -0
  203. package/lib/agent-cli-provider/omp/sdk-sidecar-types.js.map +1 -0
  204. package/lib/agent-cli-provider/omp/sdk-sidecar.d.ts +4 -0
  205. package/lib/agent-cli-provider/omp/sdk-sidecar.d.ts.map +1 -0
  206. package/lib/agent-cli-provider/omp/sdk-sidecar.js +9 -0
  207. package/lib/agent-cli-provider/omp/sdk-sidecar.js.map +1 -0
  208. package/lib/agent-cli-provider/process-runner.d.ts +1 -0
  209. package/lib/agent-cli-provider/process-runner.d.ts.map +1 -1
  210. package/lib/agent-cli-provider/process-runner.js +19 -6
  211. package/lib/agent-cli-provider/process-runner.js.map +1 -1
  212. package/lib/agent-cli-provider/provider-registry.d.ts +18 -4
  213. package/lib/agent-cli-provider/provider-registry.d.ts.map +1 -1
  214. package/lib/agent-cli-provider/provider-registry.js +21 -7
  215. package/lib/agent-cli-provider/provider-registry.js.map +1 -1
  216. package/lib/agent-cli-provider/single-agent-runtime.d.ts +10 -1
  217. package/lib/agent-cli-provider/single-agent-runtime.d.ts.map +1 -1
  218. package/lib/agent-cli-provider/single-agent-runtime.js +378 -11
  219. package/lib/agent-cli-provider/single-agent-runtime.js.map +1 -1
  220. package/lib/agent-cli-provider/types.d.ts +110 -2
  221. package/lib/agent-cli-provider/types.d.ts.map +1 -1
  222. package/lib/agent-cli-provider/types.js.map +1 -1
  223. package/npm-shrinkwrap.json +18116 -0
  224. package/package.json +16 -3
  225. package/scripts/omp/bun-ffi.d.ts +28 -0
  226. package/scripts/omp/host-supervisor-cleanup.ts +100 -0
  227. package/scripts/omp/host-supervisor-launch.ts +38 -0
  228. package/scripts/omp/host-supervisor-native.ts +181 -0
  229. package/scripts/omp/host-supervisor-tracker.ts +258 -0
  230. package/scripts/omp/host-supervisor.ts +298 -0
  231. package/scripts/omp/promise-gate.ts +13 -0
  232. package/scripts/omp/runtime-identities.js +283 -0
  233. package/scripts/omp/runtime-lock.js +232 -0
  234. package/scripts/omp/runtime-release.js +105 -0
  235. package/scripts/omp/runtime.js +33 -0
  236. package/scripts/omp/sidecar.ts +124 -0
  237. package/scripts/opcore-introduced-check.js +5 -0
  238. package/scripts/release-preflight.js +19 -0
  239. package/src/agent-cli-provider/adapters/acp.ts +18 -17
  240. package/src/agent-cli-provider/adapters/omp-policy.ts +45 -0
  241. package/src/agent-cli-provider/adapters/omp.ts +9 -155
  242. package/src/agent-cli-provider/adapters/pi.ts +15 -145
  243. package/src/agent-cli-provider/assistant-stream.ts +155 -0
  244. package/src/agent-cli-provider/contract-actions.ts +14 -2
  245. package/src/agent-cli-provider/contract-invoke.ts +77 -40
  246. package/src/agent-cli-provider/contract-support.ts +83 -12
  247. package/src/agent-cli-provider/index.ts +60 -5
  248. package/src/agent-cli-provider/omp/auth-policy.ts +126 -0
  249. package/src/agent-cli-provider/omp/rpc-driver-channel.ts +144 -0
  250. package/src/agent-cli-provider/omp/rpc-driver-dispatch.ts +177 -0
  251. package/src/agent-cli-provider/omp/rpc-driver-runner.ts +199 -0
  252. package/src/agent-cli-provider/omp/rpc-driver-state.ts +165 -0
  253. package/src/agent-cli-provider/omp/rpc-driver.ts +8 -0
  254. package/src/agent-cli-provider/omp/rpc-event-lines.ts +58 -0
  255. package/src/agent-cli-provider/omp/rpc-events.ts +154 -0
  256. package/src/agent-cli-provider/omp/rpc-protocol-contract.ts +77 -0
  257. package/src/agent-cli-provider/{omp-rpc-protocol.ts → omp/rpc-protocol.ts} +9 -111
  258. package/src/agent-cli-provider/omp/sdk-contract.ts +123 -0
  259. package/src/agent-cli-provider/omp/sdk-process-credentials.ts +55 -0
  260. package/src/agent-cli-provider/omp/sdk-process-error.ts +9 -0
  261. package/src/agent-cli-provider/omp/sdk-process-io.ts +92 -0
  262. package/src/agent-cli-provider/omp/sdk-process-private-runtime.ts +249 -0
  263. package/src/agent-cli-provider/omp/sdk-process-result.ts +181 -0
  264. package/src/agent-cli-provider/omp/sdk-process-runner.ts +281 -0
  265. package/src/agent-cli-provider/omp/sdk-protocol-collector.ts +140 -0
  266. package/src/agent-cli-provider/omp/sdk-protocol-frame.ts +260 -0
  267. package/src/agent-cli-provider/omp/sdk-protocol-request.ts +181 -0
  268. package/src/agent-cli-provider/omp/sdk-protocol-result.ts +80 -0
  269. package/src/agent-cli-provider/omp/sdk-protocol-types.ts +156 -0
  270. package/src/agent-cli-provider/omp/sdk-protocol-value.ts +234 -0
  271. package/src/agent-cli-provider/omp/sdk-protocol.ts +46 -0
  272. package/src/agent-cli-provider/omp/sdk-runtime.ts +159 -0
  273. package/src/agent-cli-provider/omp/sdk-settings-auth.ts +78 -0
  274. package/src/agent-cli-provider/omp/sdk-settings-constants.ts +147 -0
  275. package/src/agent-cli-provider/omp/sdk-settings-model-fields.ts +233 -0
  276. package/src/agent-cli-provider/omp/sdk-settings-model.ts +238 -0
  277. package/src/agent-cli-provider/omp/sdk-settings-normalize.ts +242 -0
  278. package/src/agent-cli-provider/omp/sdk-settings-selector.ts +28 -0
  279. package/src/agent-cli-provider/omp/sdk-settings-types.ts +88 -0
  280. package/src/agent-cli-provider/omp/sdk-settings-values.ts +118 -0
  281. package/src/agent-cli-provider/omp/sdk-settings.ts +33 -0
  282. package/src/agent-cli-provider/omp/sdk-sidecar-context.ts +199 -0
  283. package/src/agent-cli-provider/omp/sdk-sidecar-credentials.ts +100 -0
  284. package/src/agent-cli-provider/omp/sdk-sidecar-execute.ts +201 -0
  285. package/src/agent-cli-provider/omp/sdk-sidecar-output.ts +235 -0
  286. package/src/agent-cli-provider/omp/sdk-sidecar-runtime.ts +244 -0
  287. package/src/agent-cli-provider/omp/sdk-sidecar-types.ts +173 -0
  288. package/src/agent-cli-provider/omp/sdk-sidecar.ts +3 -0
  289. package/src/agent-cli-provider/process-runner.ts +22 -8
  290. package/src/agent-cli-provider/provider-registry.ts +29 -10
  291. package/src/agent-cli-provider/single-agent-runtime.ts +444 -18
  292. package/src/agent-cli-provider/types.ts +131 -3
  293. package/src/command-cleanup-ownership.js +15 -0
  294. package/task-lib/omp-sdk-runtime.js +8 -0
  295. package/task-lib/runner.js +121 -40
  296. package/task-lib/sdk-watcher.js +154 -0
  297. package/lib/agent-cli-provider/omp-release.d.ts.map +0 -1
  298. package/lib/agent-cli-provider/omp-release.js.map +0 -1
  299. package/lib/agent-cli-provider/omp-rpc-bounds.d.ts.map +0 -1
  300. package/lib/agent-cli-provider/omp-rpc-bounds.js.map +0 -1
  301. package/lib/agent-cli-provider/omp-rpc-driver.d.ts +0 -40
  302. package/lib/agent-cli-provider/omp-rpc-driver.d.ts.map +0 -1
  303. package/lib/agent-cli-provider/omp-rpc-driver.js +0 -519
  304. package/lib/agent-cli-provider/omp-rpc-driver.js.map +0 -1
  305. package/lib/agent-cli-provider/omp-rpc-events.d.ts +0 -28
  306. package/lib/agent-cli-provider/omp-rpc-events.d.ts.map +0 -1
  307. package/lib/agent-cli-provider/omp-rpc-events.js +0 -264
  308. package/lib/agent-cli-provider/omp-rpc-events.js.map +0 -1
  309. package/lib/agent-cli-provider/omp-rpc-protocol.d.ts.map +0 -1
  310. package/lib/agent-cli-provider/omp-rpc-protocol.js +0 -272
  311. package/lib/agent-cli-provider/omp-rpc-protocol.js.map +0 -1
  312. package/lib/agent-cli-provider/omp-rpc-session.d.ts.map +0 -1
  313. package/lib/agent-cli-provider/omp-rpc-session.js.map +0 -1
  314. package/src/agent-cli-provider/omp-rpc-driver.ts +0 -639
  315. package/src/agent-cli-provider/omp-rpc-events.ts +0 -318
  316. /package/src/agent-cli-provider/{omp-release.ts → omp/release.ts} +0 -0
  317. /package/src/agent-cli-provider/{omp-rpc-bounds.ts → omp/rpc-bounds.ts} +0 -0
  318. /package/src/agent-cli-provider/{omp-rpc-session.ts → omp/rpc-session.ts} +0 -0
@@ -0,0 +1,147 @@
1
+ import { OMP_SDK_REASONING_EFFORTS } from './sdk-settings-types';
2
+
3
+ export const LEVELS = ['level1', 'level2', 'level3'] as const;
4
+ export const EFFORTS = OMP_SDK_REASONING_EFFORTS;
5
+ export const APIS = [
6
+ 'openai-completions',
7
+ 'openai-responses',
8
+ 'openai-codex-responses',
9
+ 'azure-openai-responses',
10
+ 'anthropic-messages',
11
+ 'bedrock-converse-stream',
12
+ 'google-generative-ai',
13
+ 'google-gemini-cli',
14
+ 'google-vertex',
15
+ ] as const;
16
+ export const INPUT_TYPES = ['text', 'image'] as const;
17
+ export const THINKING_MODES = [
18
+ 'effort',
19
+ 'budget',
20
+ 'google-level',
21
+ 'anthropic-adaptive',
22
+ 'anthropic-budget-effort',
23
+ ] as const;
24
+ export const COMPAT_FIELDS = new Set([
25
+ 'supportsStore',
26
+ 'supportsDeveloperRole',
27
+ 'supportsMultipleSystemMessages',
28
+ 'supportsReasoningEffort',
29
+ 'reasoningEffortMap',
30
+ 'maxTokensField',
31
+ 'supportsUsageInStreaming',
32
+ 'requiresToolResultName',
33
+ 'requiresMistralToolIds',
34
+ 'requiresAssistantAfterToolResult',
35
+ 'requiresThinkingAsText',
36
+ 'reasoningContentField',
37
+ 'requiresReasoningContentForToolCalls',
38
+ 'allowsSyntheticReasoningContentForToolCalls',
39
+ 'requiresAssistantContentForToolCalls',
40
+ 'supportsToolChoice',
41
+ 'supportsForcedToolChoice',
42
+ 'disableReasoningOnForcedToolChoice',
43
+ 'disableReasoningOnToolChoice',
44
+ 'thinkingFormat',
45
+ 'openRouterRouting',
46
+ 'vercelGatewayRouting',
47
+ 'cacheControlFormat',
48
+ 'supportsStrictMode',
49
+ 'toolStrictMode',
50
+ 'streamIdleTimeoutMs',
51
+ 'supportsLongPromptCacheRetention',
52
+ 'supportsReasoningParams',
53
+ 'alwaysSendMaxTokens',
54
+ 'strictResponsesPairing',
55
+ 'supportsImageDetailOriginal',
56
+ 'supportsEagerToolInputStreaming',
57
+ 'allowAnthropicHeaderOverrides',
58
+ 'requiresToolResultId',
59
+ 'replayUnsignedThinking',
60
+ 'promptCacheMode',
61
+ 'promptCacheMinimumTokens',
62
+ 'promptCacheMaximumCheckpoints',
63
+ 'whenThinking',
64
+ 'extraBody',
65
+ ]);
66
+ export const COMPAT_STRING_ENUMS = {
67
+ maxTokensField: ['max_completion_tokens', 'max_tokens'],
68
+ reasoningContentField: ['reasoning_content', 'reasoning', 'reasoning_text'],
69
+ thinkingFormat: ['openai', 'openrouter', 'zai', 'qwen', 'qwen-chat-template'],
70
+ cacheControlFormat: ['anthropic'],
71
+ toolStrictMode: ['all_strict', 'none'],
72
+ promptCacheMode: ['none', 'automatic', 'explicit'],
73
+ } as const;
74
+ export const COMPAT_NUMBER_FIELDS = new Set([
75
+ 'streamIdleTimeoutMs',
76
+ 'promptCacheMinimumTokens',
77
+ 'promptCacheMaximumCheckpoints',
78
+ ]);
79
+ export const COMPAT_RECORD_FIELDS = new Set([
80
+ 'reasoningEffortMap',
81
+ 'openRouterRouting',
82
+ 'vercelGatewayRouting',
83
+ ]);
84
+ export const PROVIDER_FIELDS = new Set([
85
+ 'baseUrl',
86
+ 'apiKey',
87
+ 'api',
88
+ 'headers',
89
+ 'compat',
90
+ 'remoteCompaction',
91
+ 'authHeader',
92
+ 'auth',
93
+ 'discovery',
94
+ 'models',
95
+ 'modelOverrides',
96
+ 'disableStrictTools',
97
+ 'transport',
98
+ ]);
99
+ export const MODEL_FIELDS = new Set([
100
+ 'id',
101
+ 'name',
102
+ 'api',
103
+ 'baseUrl',
104
+ 'reasoning',
105
+ 'thinking',
106
+ 'input',
107
+ 'supportsTools',
108
+ 'cost',
109
+ 'premiumMultiplier',
110
+ 'contextWindow',
111
+ 'maxTokens',
112
+ 'omitMaxOutputTokens',
113
+ 'headers',
114
+ 'compat',
115
+ 'contextPromotionTarget',
116
+ 'compactionModel',
117
+ 'remoteCompaction',
118
+ ]);
119
+ export const MODEL_OVERRIDE_FIELDS = new Set(
120
+ [...MODEL_FIELDS].filter((field) => field !== 'id' && field !== 'api' && field !== 'baseUrl')
121
+ );
122
+ export const THINKING_FIELDS = new Set([
123
+ 'mode',
124
+ 'efforts',
125
+ 'defaultLevel',
126
+ 'effortMap',
127
+ 'supportsDisplay',
128
+ 'minLevel',
129
+ 'maxLevel',
130
+ 'levels',
131
+ ]);
132
+ export const COST_FIELDS = new Set(['input', 'output', 'cacheRead', 'cacheWrite']);
133
+ export const TOP_LEVEL_FIELDS = new Set([
134
+ 'transport',
135
+ 'minLevel',
136
+ 'defaultLevel',
137
+ 'maxLevel',
138
+ 'levelOverrides',
139
+ 'modelsConfig',
140
+ 'auth',
141
+ 'tools',
142
+ 'nestedAgents',
143
+ 'mcp',
144
+ ]);
145
+ export const ENV_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
146
+ export const PROVIDER_ID = /^[a-z0-9][a-z0-9._-]*$/;
147
+ export const MODEL_COMPONENT = /^\S+$/;
@@ -0,0 +1,233 @@
1
+ import { invalidField } from '../contract-errors';
2
+ import { isRecord } from '../json';
3
+ import {
4
+ APIS,
5
+ COMPAT_FIELDS,
6
+ COMPAT_NUMBER_FIELDS,
7
+ COMPAT_RECORD_FIELDS,
8
+ COMPAT_STRING_ENUMS,
9
+ COST_FIELDS,
10
+ EFFORTS,
11
+ INPUT_TYPES,
12
+ MODEL_FIELDS,
13
+ MODEL_OVERRIDE_FIELDS,
14
+ MODEL_COMPONENT,
15
+ THINKING_FIELDS,
16
+ THINKING_MODES,
17
+ } from './sdk-settings-constants';
18
+ import type { OmpModelDefinition } from './sdk-settings-types';
19
+ import {
20
+ booleanValue,
21
+ emptyHeaders,
22
+ enumValue,
23
+ nonEmptyString,
24
+ nonNegativeNumber,
25
+ rejectUnknown,
26
+ safeUrl,
27
+ } from './sdk-settings-values';
28
+
29
+ export function normalizeModelDefinition(value: unknown, field: string): OmpModelDefinition {
30
+ if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
31
+ rejectUnknown(value, MODEL_FIELDS, field);
32
+ if (typeof value.id !== 'string' || value.id.length === 0 || !MODEL_COMPONENT.test(value.id)) {
33
+ invalidField(`${field}.id`, 'Custom model id must be a non-empty string without whitespace.');
34
+ }
35
+ const result: { [field: string]: unknown; id: string } = { id: value.id };
36
+ copyModelFields(value, result, field, true);
37
+ return result;
38
+ }
39
+
40
+ export function normalizeModelOverride(value: unknown, field: string): Record<string, unknown> {
41
+ if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
42
+ rejectUnknown(value, MODEL_OVERRIDE_FIELDS, field);
43
+ const result: Record<string, unknown> = {};
44
+ copyModelFields(value, result, field, false);
45
+ return result;
46
+ }
47
+
48
+ function copyModelFields(
49
+ value: Record<string, unknown>,
50
+ result: Record<string, unknown>,
51
+ field: string,
52
+ allowApiAndBaseUrl: boolean
53
+ ): void {
54
+ if (value.name !== undefined) result.name = nonEmptyString(value.name, `${field}.name`);
55
+ if (allowApiAndBaseUrl && value.api !== undefined) {
56
+ result.api = enumValue(value.api, APIS, `${field}.api`);
57
+ }
58
+ if (allowApiAndBaseUrl && value.baseUrl !== undefined) {
59
+ result.baseUrl = safeUrl(value.baseUrl, `${field}.baseUrl`);
60
+ }
61
+ for (const key of ['reasoning', 'supportsTools', 'omitMaxOutputTokens'] as const) {
62
+ if (value[key] !== undefined) result[key] = booleanValue(value[key], `${field}.${key}`);
63
+ }
64
+ for (const key of ['premiumMultiplier', 'contextWindow', 'maxTokens'] as const) {
65
+ if (value[key] !== undefined) {
66
+ result[key] = nonNegativeNumber(value[key], `${field}.${key}`);
67
+ }
68
+ }
69
+ for (const key of ['contextPromotionTarget', 'compactionModel'] as const) {
70
+ if (value[key] !== undefined) result[key] = nonEmptyString(value[key], `${field}.${key}`);
71
+ }
72
+ if (value.input !== undefined) {
73
+ if (!Array.isArray(value.input) || value.input.length === 0) {
74
+ invalidField(`${field}.input`, 'input must be a non-empty text/image array.');
75
+ }
76
+ result.input = value.input.map((item, index) =>
77
+ enumValue(item, INPUT_TYPES, `${field}.input[${index}]`)
78
+ );
79
+ }
80
+ if (value.thinking !== undefined) {
81
+ result.thinking = normalizeThinking(value.thinking, `${field}.thinking`);
82
+ }
83
+ if (value.cost !== undefined) {
84
+ result.cost = normalizeCost(value.cost, `${field}.cost`, allowApiAndBaseUrl);
85
+ }
86
+ if (value.headers !== undefined) result.headers = emptyHeaders(value.headers, `${field}.headers`);
87
+ if (value.compat !== undefined) result.compat = normalizeCompat(value.compat, `${field}.compat`);
88
+ if (value.remoteCompaction !== undefined) {
89
+ invalidField(`${field}.remoteCompaction`, 'Remote compaction config is not accepted.');
90
+ }
91
+ }
92
+
93
+ function normalizeThinking(value: unknown, field: string): Record<string, unknown> {
94
+ if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
95
+ rejectUnknown(value, THINKING_FIELDS, field);
96
+ const result: Record<string, unknown> = {
97
+ mode: enumValue(value.mode, THINKING_MODES, `${field}.mode`),
98
+ };
99
+ for (const key of ['efforts', 'levels'] as const) {
100
+ if (value[key] !== undefined) {
101
+ if (!Array.isArray(value[key]) || value[key].length === 0) {
102
+ invalidField(`${field}.${key}`, `${key} must be a non-empty effort array.`);
103
+ }
104
+ result[key] = value[key].map((item, index) =>
105
+ enumValue(item, EFFORTS, `${field}.${key}[${index}]`)
106
+ );
107
+ }
108
+ }
109
+ for (const key of ['defaultLevel', 'minLevel', 'maxLevel'] as const) {
110
+ if (value[key] !== undefined) {
111
+ result[key] = enumValue(value[key], EFFORTS, `${field}.${key}`);
112
+ }
113
+ }
114
+ if (value.supportsDisplay !== undefined) {
115
+ result.supportsDisplay = booleanValue(value.supportsDisplay, `${field}.supportsDisplay`);
116
+ }
117
+ if (value.effortMap !== undefined) {
118
+ result.effortMap = normalizeEffortMap(value.effortMap, `${field}.effortMap`);
119
+ }
120
+ const hasEfforts = result.efforts !== undefined || result.levels !== undefined;
121
+ if (!hasEfforts && (result.minLevel === undefined || result.maxLevel === undefined)) {
122
+ invalidField(field, 'thinking requires efforts, levels, or both minLevel and maxLevel.');
123
+ }
124
+ return result;
125
+ }
126
+
127
+ function normalizeEffortMap(value: unknown, field: string): Record<string, string> {
128
+ if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
129
+ rejectUnknown(value, new Set(EFFORTS), field);
130
+ const result: Record<string, string> = {};
131
+ for (const [effort, mapped] of Object.entries(value)) {
132
+ result[effort] = nonEmptyString(mapped, `${field}.${effort}`);
133
+ }
134
+ return result;
135
+ }
136
+
137
+ function normalizeCost(
138
+ value: unknown,
139
+ field: string,
140
+ requireAllFields: boolean
141
+ ): Record<string, number> {
142
+ if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
143
+ rejectUnknown(value, COST_FIELDS, field);
144
+ if (requireAllFields) {
145
+ const missing = [...COST_FIELDS].find((key) => value[key] === undefined);
146
+ if (missing !== undefined) {
147
+ invalidField(`${field}.${missing}`, `${field}.${missing} is required.`);
148
+ }
149
+ }
150
+ const result: Record<string, number> = {};
151
+ for (const key of COST_FIELDS) {
152
+ if (value[key] !== undefined) {
153
+ result[key] = nonNegativeNumber(value[key], `${field}.${key}`);
154
+ }
155
+ }
156
+ return result;
157
+ }
158
+
159
+ export function normalizeCompat(
160
+ value: unknown,
161
+ field: string,
162
+ allowWhenThinking = true
163
+ ): Record<string, unknown> {
164
+ if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
165
+ rejectUnknown(value, COMPAT_FIELDS, field);
166
+ if (Object.prototype.hasOwnProperty.call(value, 'extraBody')) {
167
+ invalidField(
168
+ `${field}.extraBody`,
169
+ 'Arbitrary request bodies may contain persisted secrets and are not accepted.'
170
+ );
171
+ }
172
+ const result: Record<string, unknown> = {};
173
+ for (const [key, item] of Object.entries(value)) {
174
+ if (key === 'whenThinking') {
175
+ if (!allowWhenThinking) {
176
+ invalidField(
177
+ `${field}.whenThinking`,
178
+ 'Nested compat.whenThinking is not a native OMP field.'
179
+ );
180
+ }
181
+ result[key] = normalizeCompat(item, `${field}.whenThinking`, false);
182
+ continue;
183
+ }
184
+ if (COMPAT_RECORD_FIELDS.has(key)) {
185
+ result[key] =
186
+ key === 'reasoningEffortMap'
187
+ ? normalizeEffortMap(item, `${field}.${key}`)
188
+ : normalizeRouting(item, `${field}.${key}`);
189
+ continue;
190
+ }
191
+ if (COMPAT_NUMBER_FIELDS.has(key)) {
192
+ result[key] = nonNegativeNumber(item, `${field}.${key}`);
193
+ continue;
194
+ }
195
+ if (key === 'maxTokensField') {
196
+ result[key] = enumValue(item, COMPAT_STRING_ENUMS.maxTokensField, `${field}.${key}`);
197
+ continue;
198
+ }
199
+ if (key === 'reasoningContentField') {
200
+ result[key] = enumValue(item, COMPAT_STRING_ENUMS.reasoningContentField, `${field}.${key}`);
201
+ continue;
202
+ }
203
+ if (key === 'thinkingFormat') {
204
+ result[key] = enumValue(item, COMPAT_STRING_ENUMS.thinkingFormat, `${field}.${key}`);
205
+ continue;
206
+ }
207
+ if (key === 'cacheControlFormat') {
208
+ result[key] = enumValue(item, COMPAT_STRING_ENUMS.cacheControlFormat, `${field}.${key}`);
209
+ continue;
210
+ }
211
+ if (key === 'toolStrictMode') {
212
+ result[key] = enumValue(item, COMPAT_STRING_ENUMS.toolStrictMode, `${field}.${key}`);
213
+ continue;
214
+ }
215
+ if (key === 'promptCacheMode') {
216
+ result[key] = enumValue(item, COMPAT_STRING_ENUMS.promptCacheMode, `${field}.${key}`);
217
+ continue;
218
+ }
219
+ result[key] = booleanValue(item, `${field}.${key}`);
220
+ }
221
+ return result;
222
+ }
223
+
224
+ function normalizeRouting(value: unknown, field: string): Record<string, readonly string[]> {
225
+ if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
226
+ rejectUnknown(value, new Set(['only', 'order']), field);
227
+ const result: Record<string, readonly string[]> = {};
228
+ for (const [key, item] of Object.entries(value)) {
229
+ if (!Array.isArray(item)) invalidField(`${field}.${key}`, `${field}.${key} must be an array.`);
230
+ result[key] = item.map((entry, index) => nonEmptyString(entry, `${field}.${key}[${index}]`));
231
+ }
232
+ return result;
233
+ }
@@ -0,0 +1,238 @@
1
+ import { invalidField } from '../contract-errors';
2
+ import { isRecord } from '../json';
3
+ import { APIS, ENV_NAME, LEVELS, MODEL_COMPONENT, PROVIDER_FIELDS } from './sdk-settings-constants';
4
+ import {
5
+ normalizeCompat,
6
+ normalizeModelDefinition,
7
+ normalizeModelOverride,
8
+ } from './sdk-settings-model-fields';
9
+ import { parseExactOmpModelSelector } from './sdk-settings-selector';
10
+ import type {
11
+ OmpModelsConfig,
12
+ OmpModelLevel,
13
+ OmpLevelOverride,
14
+ OmpProviderConfig,
15
+ OmpSdkAuth,
16
+ } from './sdk-settings-types';
17
+ import {
18
+ assertProviderId,
19
+ booleanValue,
20
+ emptyHeaders,
21
+ enumValue,
22
+ rejectUnknown,
23
+ safeUrl,
24
+ } from './sdk-settings-values';
25
+
26
+ export function normalizeModelsConfig(value: unknown, auth?: OmpSdkAuth): OmpModelsConfig {
27
+ if (!isRecord(value)) {
28
+ invalidField('providerSettings.omp.modelsConfig', 'OMP modelsConfig must be an object.');
29
+ }
30
+ rejectUnknown(value, new Set(['providers']), 'providerSettings.omp.modelsConfig');
31
+ const providerInput = value.providers ?? {};
32
+ if (!isRecord(providerInput)) {
33
+ invalidField(
34
+ 'providerSettings.omp.modelsConfig.providers',
35
+ 'OMP modelsConfig.providers must be an object.'
36
+ );
37
+ }
38
+ const providers: Record<string, OmpProviderConfig> = {};
39
+ for (const [provider, config] of Object.entries(providerInput)) {
40
+ const field = `providerSettings.omp.modelsConfig.providers.${provider}`;
41
+ assertProviderId(provider, field);
42
+ providers[provider] = normalizeProviderConfig(provider, config, auth, field);
43
+ }
44
+ return { providers };
45
+ }
46
+
47
+ function normalizeProviderConfig(
48
+ provider: string,
49
+ value: unknown,
50
+ auth: OmpSdkAuth | undefined,
51
+ field: string
52
+ ): OmpProviderConfig {
53
+ if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
54
+ rejectUnknown(value, PROVIDER_FIELDS, field);
55
+ const result: Record<string, unknown> = {};
56
+
57
+ if (value.baseUrl !== undefined) result.baseUrl = safeUrl(value.baseUrl, `${field}.baseUrl`);
58
+ if (value.api !== undefined) result.api = enumValue(value.api, APIS, `${field}.api`);
59
+ if (value.auth !== undefined) {
60
+ const providerAuth = enumValue(
61
+ value.auth,
62
+ ['apiKey', 'none', 'oauth'] as const,
63
+ `${field}.auth`
64
+ );
65
+ if (providerAuth === 'oauth') {
66
+ invalidField(
67
+ `${field}.auth`,
68
+ 'Custom provider OAuth would read ambient state and is not accepted.'
69
+ );
70
+ }
71
+ result.auth = providerAuth;
72
+ }
73
+ if (value.transport !== undefined) {
74
+ invalidField(
75
+ `${field}.transport`,
76
+ 'Command/gateway-backed custom provider transports are not accepted.'
77
+ );
78
+ }
79
+ if (value.discovery !== undefined) {
80
+ invalidField(`${field}.discovery`, 'Dynamic custom provider discovery is not accepted.');
81
+ }
82
+ if (value.remoteCompaction !== undefined) {
83
+ invalidField(`${field}.remoteCompaction`, 'Remote compaction config is not accepted.');
84
+ }
85
+ if (value.headers !== undefined) result.headers = emptyHeaders(value.headers, `${field}.headers`);
86
+ if (value.compat !== undefined) result.compat = normalizeCompat(value.compat, `${field}.compat`);
87
+ if (value.authHeader !== undefined) {
88
+ result.authHeader = booleanValue(value.authHeader, `${field}.authHeader`);
89
+ }
90
+ if (value.disableStrictTools !== undefined) {
91
+ result.disableStrictTools = booleanValue(
92
+ value.disableStrictTools,
93
+ `${field}.disableStrictTools`
94
+ );
95
+ }
96
+
97
+ if (value.models !== undefined) {
98
+ if (!Array.isArray(value.models) || value.models.length === 0) {
99
+ invalidField(`${field}.models`, 'Custom provider models must be a non-empty array.');
100
+ }
101
+ const models = value.models.map((model, index) =>
102
+ normalizeModelDefinition(model, `${field}.models[${index}]`)
103
+ );
104
+ result.models = models;
105
+ if (result.baseUrl === undefined) {
106
+ invalidField(`${field}.baseUrl`, 'baseUrl is required when defining custom models.');
107
+ }
108
+ const hasProviderApi = result.api !== undefined;
109
+ const seenModelIds = new Set<string>();
110
+ for (const { id: modelId } of models) {
111
+ if (seenModelIds.has(modelId)) {
112
+ invalidField(`${field}.models`, `Custom model id ${modelId} is duplicated.`);
113
+ }
114
+ seenModelIds.add(modelId);
115
+ }
116
+ if (!hasProviderApi && models.some((model) => model.api === undefined)) {
117
+ invalidField(
118
+ `${field}.api`,
119
+ 'api is required at provider or every model when defining custom models.'
120
+ );
121
+ }
122
+ }
123
+
124
+ if (value.modelOverrides !== undefined) {
125
+ if (!isRecord(value.modelOverrides)) {
126
+ invalidField(`${field}.modelOverrides`, 'modelOverrides must be an object.');
127
+ }
128
+ const overrides: Record<string, unknown> = {};
129
+ for (const [model, override] of Object.entries(value.modelOverrides)) {
130
+ if (model.length === 0 || !MODEL_COMPONENT.test(model)) {
131
+ invalidField(`${field}.modelOverrides`, 'modelOverrides keys must be non-empty model IDs.');
132
+ }
133
+ overrides[model] = normalizeModelOverride(override, `${field}.modelOverrides.${model}`);
134
+ }
135
+ result.modelOverrides = overrides;
136
+ }
137
+
138
+ const credentialEnv = auth?.mode === 'environment' ? auth.credentials[provider]?.env : undefined;
139
+ if (value.apiKey !== undefined) {
140
+ if (typeof value.apiKey !== 'string' || !ENV_NAME.test(value.apiKey)) {
141
+ invalidField(
142
+ `${field}.apiKey`,
143
+ 'apiKey must be an environment variable name; literals and command-backed values are forbidden.'
144
+ );
145
+ }
146
+ if (auth?.mode === 'environment' && credentialEnv === undefined) {
147
+ invalidField(
148
+ `${field}.apiKey`,
149
+ 'apiKey must match a declared environment credential reference for this provider.'
150
+ );
151
+ }
152
+ if (credentialEnv !== undefined && value.apiKey !== credentialEnv) {
153
+ invalidField(
154
+ `${field}.apiKey`,
155
+ 'apiKey must match the declared environment credential reference.'
156
+ );
157
+ }
158
+ if (auth !== undefined && auth.mode !== 'environment') {
159
+ invalidField(`${field}.apiKey`, `${auth.mode} auth forbids provider apiKey configuration.`);
160
+ }
161
+ result.apiKey = value.apiKey;
162
+ } else if (value.models !== undefined && result.auth !== 'none') {
163
+ if (auth?.mode === 'environment' && credentialEnv !== undefined) {
164
+ result.apiKey = credentialEnv;
165
+ } else if (auth !== undefined) {
166
+ invalidField(
167
+ `${field}.apiKey`,
168
+ 'Authenticated custom models require an environment credential reference; broker and omp-home custom-provider credentials cannot be materialized safely.'
169
+ );
170
+ }
171
+ }
172
+ if (auth?.mode === 'none' && result.auth !== 'none') {
173
+ invalidField(
174
+ `${field}.auth`,
175
+ 'Keyless settings require custom providers to declare auth: none.'
176
+ );
177
+ }
178
+ return result;
179
+ }
180
+
181
+ export function validateSelectedProviderAuth(
182
+ levels: Readonly<Record<OmpModelLevel, OmpLevelOverride>>,
183
+ modelsConfig: OmpModelsConfig,
184
+ auth: OmpSdkAuth
185
+ ): void {
186
+ const selectors = LEVELS.map((level) => parseExactOmpModelSelector(levels[level].model));
187
+ const providers = new Set(selectors.map(({ provider }) => provider));
188
+ for (const { provider, model } of selectors) {
189
+ const configuredModels = modelsConfig.providers[provider]?.models;
190
+ if (
191
+ Array.isArray(configuredModels) &&
192
+ !configuredModels.some((configured) => isRecord(configured) && configured.id === model)
193
+ ) {
194
+ invalidField(
195
+ `providerSettings.omp.levelOverrides`,
196
+ `Selected custom model ${provider}/${model} is not declared in modelsConfig.`
197
+ );
198
+ }
199
+ }
200
+ if (auth.mode === 'environment') {
201
+ for (const provider of providers) {
202
+ const custom = modelsConfig.providers[provider];
203
+ if (custom?.auth === 'none') {
204
+ invalidField(
205
+ `providerSettings.omp.auth.mode`,
206
+ `Selected keyless provider ${provider} requires auth mode none.`
207
+ );
208
+ }
209
+ if (auth.credentials[provider] === undefined) {
210
+ invalidField(
211
+ `providerSettings.omp.auth.credentials.${provider}`,
212
+ `Environment auth is missing a credential reference for selected provider ${provider}.`
213
+ );
214
+ }
215
+ }
216
+ }
217
+ if (auth.mode === 'none') {
218
+ for (const provider of providers) {
219
+ const custom = modelsConfig.providers[provider];
220
+ if (custom !== undefined && custom.auth !== 'none') {
221
+ invalidField(
222
+ `providerSettings.omp.modelsConfig.providers.${provider}.auth`,
223
+ `Selected custom provider ${provider} must declare auth: none for keyless execution.`
224
+ );
225
+ }
226
+ }
227
+ }
228
+ if (auth.mode === 'broker') {
229
+ for (const provider of providers) {
230
+ if (modelsConfig.providers[provider]?.models !== undefined) {
231
+ invalidField(
232
+ `providerSettings.omp.modelsConfig.providers.${provider}`,
233
+ 'Broker auth cannot safely satisfy OMP custom-provider apiKey config; use environment auth.'
234
+ );
235
+ }
236
+ }
237
+ }
238
+ }