@the-open-engine/zeroshot 6.30.1 → 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
@@ -1,639 +0,0 @@
1
- import { spawn } from 'node:child_process';
2
- import { omitProcessControlEnv, omitUnsafeProviderEnv } from './env-safety';
3
- import {
4
- DEFAULT_OMP_RPC_DECODER_LIMITS,
5
- OmpRpcFrameDecoder,
6
- OmpRpcProtocolError,
7
- assertNoPreNegotiationRpcChunk,
8
- encodeOmpRpcCommand,
9
- type OmpRpcCommand,
10
- type OmpRpcInboundFrame,
11
- } from './omp-rpc-protocol';
12
- import { createOmpRpcEventState, normalizeOmpRpcFrame } from './omp-rpc-events';
13
- import {
14
- MAX_LIFETIME_REQUEST_IDS,
15
- MAX_PENDING_REQUESTS,
16
- MAX_STDERR_TAIL_BYTES,
17
- } from './omp-rpc-bounds';
18
- import { getArray, getBoolean, getNumber, getOptionalString, getRecord, getString } from './json';
19
- import type { OmpSessionLaunch } from './omp-rpc-session';
20
- import type { CommandSpec, OutputEvent } from './types';
21
-
22
- export interface OmpRpcSpawnEvidence {
23
- readonly pid: number;
24
- readonly processGroupId: number | null;
25
- readonly terminationStrategy: 'process-group' | 'process-tree';
26
- }
27
-
28
- export interface OmpRpcSessionEvidence {
29
- readonly phase: 'ready' | 'terminal';
30
- readonly sessionId: string | null;
31
- readonly sessionFile: string | null;
32
- readonly selectedProvider: string;
33
- readonly selectedModel: string;
34
- readonly thinkingLevel: string;
35
- }
36
-
37
- export interface OmpRpcTaskRequest {
38
- readonly commandSpec: CommandSpec;
39
- readonly prompt: string;
40
- readonly expectedVersion: string;
41
- readonly session: OmpSessionLaunch;
42
- readonly signal: AbortSignal;
43
- readonly timeoutMs: number;
44
- readonly abortGraceMs: number;
45
- readonly exitGraceMs: number;
46
- }
47
-
48
- export interface OmpRpcTaskHooks {
49
- readonly onSpawn: (evidence: OmpRpcSpawnEvidence) => Promise<void>;
50
- readonly onEvent: (event: OutputEvent) => Promise<void>;
51
- readonly onSession: (evidence: OmpRpcSessionEvidence) => Promise<void>;
52
- }
53
-
54
- export interface OmpRpcTaskResult {
55
- readonly events: readonly OutputEvent[];
56
- readonly text: string;
57
- readonly session: OmpRpcSessionEvidence;
58
- readonly stopReason: string;
59
- readonly exitCode: number | null;
60
- readonly signal: string | null;
61
- }
62
-
63
- const UNKNOWN_SESSION_EVIDENCE: Omit<OmpRpcSessionEvidence, 'phase'> = {
64
- sessionId: null,
65
- sessionFile: null,
66
- selectedProvider: '',
67
- selectedModel: '',
68
- thinkingLevel: '',
69
- };
70
-
71
- type UiResponder = (id: string) => OmpRpcCommand;
72
-
73
- // extension_ui_request method table (docs/rpc.md "Extension UI Sub-Protocol"). Zeroshot has no
74
- // interactive host surface, so every method resolves to a cancelled/no-op response instead of
75
- // blocking the child indefinitely.
76
- const UI_RESPONDERS: Readonly<Record<string, UiResponder>> = {
77
- confirm: (id) => ({ type: 'extension_ui_response', id, confirmed: false, cancelled: true }),
78
- select: (id) => ({ type: 'extension_ui_response', id, cancelled: true }),
79
- input: (id) => ({ type: 'extension_ui_response', id, cancelled: true }),
80
- editor: (id) => ({ type: 'extension_ui_response', id, cancelled: true }),
81
- open_url: (id) => ({ type: 'extension_ui_response', id, cancelled: true }),
82
- notify: (id) => ({ type: 'extension_ui_response', id, cancelled: false }),
83
- setStatus: (id) => ({ type: 'extension_ui_response', id, cancelled: false }),
84
- setWidget: (id) => ({ type: 'extension_ui_response', id, cancelled: false }),
85
- setTitle: (id) => ({ type: 'extension_ui_response', id, cancelled: false }),
86
- set_editor_text: (id) => ({ type: 'extension_ui_response', id, cancelled: false }),
87
- cancel: (id) => ({ type: 'extension_ui_response', id, cancelled: false }),
88
- };
89
-
90
- class OmpRpcTaskFailure extends Error {
91
- readonly stopReason: string;
92
-
93
- constructor(stopReason: string, message: string) {
94
- super(message);
95
- this.name = 'OmpRpcTaskFailure';
96
- this.stopReason = stopReason;
97
- }
98
- }
99
-
100
- interface PendingCommand {
101
- readonly resolve: (frame: Record<string, unknown>) => void;
102
- readonly reject: (error: Error) => void;
103
- }
104
-
105
- interface DriverState {
106
- readonly decoder: OmpRpcFrameDecoder;
107
- readonly eventState: ReturnType<typeof createOmpRpcEventState>;
108
- readonly pending: Map<string, PendingCommand>;
109
- readonly lifetimeRequestIds: Set<string>;
110
- queuedFrames: number;
111
- readonly events: OutputEvent[];
112
- readonly textParts: string[];
113
- stderrTail: string;
114
- negotiatedV2: boolean;
115
- readyReceived: boolean;
116
- promptSent: boolean;
117
- terminal: boolean;
118
- settled: boolean;
119
- abortStopReason: string | null;
120
- pendingStopReason: string | null;
121
- terminationStarted: boolean;
122
- sessionEvidence: Omit<OmpRpcSessionEvidence, 'phase'>;
123
- processExit: { exitCode: number | null; signal: string | null } | null;
124
- chain: Promise<void>;
125
- }
126
-
127
- function createDriverState(): DriverState {
128
- return {
129
- decoder: new OmpRpcFrameDecoder(DEFAULT_OMP_RPC_DECODER_LIMITS),
130
- eventState: createOmpRpcEventState(),
131
- pending: new Map(),
132
- lifetimeRequestIds: new Set(),
133
- queuedFrames: 0,
134
- events: [],
135
- textParts: [],
136
- stderrTail: '',
137
- negotiatedV2: false,
138
- readyReceived: false,
139
- promptSent: false,
140
- terminal: false,
141
- settled: false,
142
- abortStopReason: null,
143
- pendingStopReason: null,
144
- terminationStarted: false,
145
- sessionEvidence: UNKNOWN_SESSION_EVIDENCE,
146
- processExit: null,
147
- chain: Promise.resolve(),
148
- };
149
- }
150
-
151
- // eslint-disable-next-line max-lines-per-function
152
- export function runOmpRpcTask(
153
- request: OmpRpcTaskRequest,
154
- hooks: OmpRpcTaskHooks
155
- ): Promise<OmpRpcTaskResult> {
156
- return new Promise<OmpRpcTaskResult>((resolvePromise, rejectPromise) => {
157
- const { commandSpec } = request;
158
- const state = createDriverState();
159
- const child = spawn(commandSpec.binary, [...commandSpec.args], {
160
- shell: false,
161
- stdio: ['pipe', 'pipe', 'pipe'],
162
- ...(commandSpec.cwd === undefined ? {} : { cwd: commandSpec.cwd }),
163
- detached: process.platform !== 'win32',
164
- windowsHide: true,
165
- env: { ...omitProcessControlEnv(process.env), ...omitUnsafeProviderEnv(commandSpec.env) },
166
- });
167
-
168
- // Gated on the 'spawn' event (fires only once the OS has actually created the process and
169
- // assigned a real pid), not called synchronously right after spawn(): when the binary is
170
- // missing, `child.pid` is still undefined at this point and the eventual 'error' event is
171
- // what surfaces the failure. Synthesizing spawn evidence for a pid that was never real (e.g.
172
- // a placeholder) would let ownership-based termination signal an unrelated, potentially
173
- // privileged PID once that placeholder is treated as an owned process/group id. No stdin
174
- // write happens before this resolves (negotiateAndPrompt awaits it), so spawn evidence stays
175
- // durable before the prompt is written, and is simply never reported when spawn never
176
- // succeeds.
177
- const spawnHookPromise: Promise<void> = new Promise<void>((resolveSpawnHook) => {
178
- child.once('spawn', () => {
179
- const pid = child.pid;
180
- // Node guarantees a defined pid once 'spawn' fires; this is a defensive narrowing only.
181
- if (pid === undefined) {
182
- failPermanently('spawn-hook-failed', 'Process spawned without a pid.');
183
- resolveSpawnHook();
184
- return;
185
- }
186
- hooks
187
- .onSpawn({
188
- pid,
189
- processGroupId: process.platform === 'win32' ? null : pid,
190
- terminationStrategy: process.platform === 'win32' ? 'process-tree' : 'process-group',
191
- })
192
- .then(resolveSpawnHook, (error: unknown) => {
193
- failPermanently(
194
- 'spawn-hook-failed',
195
- error instanceof Error ? error.message : String(error)
196
- );
197
- resolveSpawnHook();
198
- });
199
- });
200
- });
201
-
202
- let abortTimer: NodeJS.Timeout | undefined;
203
- let timeoutTimer: NodeJS.Timeout | undefined;
204
-
205
- function clearTimers(): void {
206
- if (abortTimer !== undefined) clearTimeout(abortTimer);
207
- if (timeoutTimer !== undefined) clearTimeout(timeoutTimer);
208
- }
209
-
210
- function deriveStopReason(): string {
211
- const lastResult = [...state.events].reverse().find((event) => event.type === 'result');
212
- if (lastResult && lastResult.type === 'result' && lastResult.success === false) {
213
- return 'turn-failed';
214
- }
215
- return 'completed';
216
- }
217
-
218
- function finish(stopReason: string): void {
219
- if (state.settled) return;
220
- state.settled = true;
221
- clearTimers();
222
- resolvePromise({
223
- events: state.events,
224
- text: state.textParts.join(''),
225
- session: { ...state.sessionEvidence, phase: 'terminal' },
226
- stopReason,
227
- exitCode: state.processExit?.exitCode ?? null,
228
- signal: state.processExit?.signal ?? null,
229
- });
230
- }
231
-
232
- function pushEvent(event: OutputEvent): void {
233
- state.events.push(event);
234
- if (event.type === 'text') state.textParts.push(event.text);
235
- void hooks.onEvent(event).catch(() => {});
236
- }
237
-
238
- // A child that exits *on a signal* leaves child.exitCode null and reports the signal name in
239
- // child.signalCode instead, so exitCode alone is not a terminal check. Both must be consulted
240
- // before any kill(): once the child has been reaped its pid — and therefore the negative pid
241
- // captured here as a process-group id — can be reused by an unrelated process group, and
242
- // signalling that group would terminate a process this driver never owned.
243
- function hasExited(): boolean {
244
- return child.exitCode !== null || child.signalCode !== null;
245
- }
246
-
247
- function terminateOwnedBoundary(): void {
248
- if (state.terminationStarted || child.pid === undefined || hasExited()) return;
249
- state.terminationStarted = true;
250
- const pid = child.pid;
251
- try {
252
- if (process.platform === 'win32') child.kill('SIGTERM');
253
- else process.kill(-pid, 'SIGTERM');
254
- } catch {
255
- // Process may already be gone.
256
- }
257
- setTimeout(() => {
258
- if (hasExited()) return;
259
- try {
260
- if (process.platform === 'win32') child.kill('SIGKILL');
261
- else process.kill(-pid, 'SIGKILL');
262
- } catch {
263
- // Process may already be gone.
264
- }
265
- }, request.exitGraceMs);
266
- }
267
-
268
- function failPermanently(stopReason: string, message: string): void {
269
- if (state.terminal) return;
270
- state.terminal = true;
271
- state.pendingStopReason = stopReason;
272
- pushEvent({ type: 'result', success: false, result: null, error: `${stopReason}: ${message}` });
273
- terminateOwnedBoundary();
274
- }
275
-
276
- function registerLifetimeId(id: string): boolean {
277
- if (state.lifetimeRequestIds.has(id)) return true;
278
- if (state.lifetimeRequestIds.size >= MAX_LIFETIME_REQUEST_IDS) return false;
279
- state.lifetimeRequestIds.add(id);
280
- return true;
281
- }
282
-
283
- function writeFrame(frame: OmpRpcCommand): void {
284
- if (child.stdin.destroyed) return;
285
- try {
286
- child.stdin.write(
287
- encodeOmpRpcCommand(frame, DEFAULT_OMP_RPC_DECODER_LIMITS.maxPhysicalFrameBytes)
288
- );
289
- } catch {
290
- // Stdin already closed; the close handler settles the task.
291
- }
292
- }
293
-
294
- function sendCommand(command: OmpRpcCommand): Promise<Record<string, unknown>> {
295
- const id = command.id ?? '';
296
- if (!registerLifetimeId(id)) {
297
- return Promise.reject(
298
- new OmpRpcTaskFailure('lifetime-request-id-exceeded', `command id "${id}" exceeds the lifetime request-id bound.`)
299
- );
300
- }
301
- if (state.pending.size >= MAX_PENDING_REQUESTS) {
302
- return Promise.reject(
303
- new OmpRpcTaskFailure('pending-request-exceeded', 'too many concurrent outbound RPC commands are awaiting a response.')
304
- );
305
- }
306
- return new Promise<Record<string, unknown>>((resolve, reject) => {
307
- state.pending.set(id, { resolve, reject });
308
- writeFrame(command);
309
- });
310
- }
311
-
312
- function assertSuccessfulResponse(response: Record<string, unknown>, command: string, id: string): void {
313
- if (getString(response, 'command') !== command || getString(response, 'id') !== id) {
314
- throw new OmpRpcTaskFailure('malformed-response', `Expected a ${command} response with id "${id}".`);
315
- }
316
- if (getBoolean(response, 'success') !== true) {
317
- throw new OmpRpcTaskFailure('unsafe-config', getString(response, 'error') ?? `${command} was rejected.`);
318
- }
319
- }
320
-
321
- function handleResponse(frame: OmpRpcInboundFrame): void {
322
- const id = getOptionalString(frame, 'id');
323
- if (!id) return;
324
- const command = state.pending.get(id);
325
- if (command === undefined) return;
326
- state.pending.delete(id);
327
- command.resolve(frame);
328
- }
329
-
330
- function handleExtensionUiRequest(frame: OmpRpcInboundFrame): void {
331
- const id = getString(frame, 'id');
332
- const method = getString(frame, 'method');
333
- if (id === null || method === null) {
334
- throw new OmpRpcTaskFailure('malformed-extension-ui-request', 'extension_ui_request is missing id/method.');
335
- }
336
- if (!registerLifetimeId(id)) {
337
- throw new OmpRpcTaskFailure(
338
- 'lifetime-request-id-exceeded',
339
- `extension_ui_request id "${id}" exceeds the lifetime request-id bound.`
340
- );
341
- }
342
- const responder = UI_RESPONDERS[method];
343
- if (responder === undefined) {
344
- throw new OmpRpcTaskFailure('unsupported-ui-method', `extension_ui_request used unsupported method "${method}".`);
345
- }
346
- writeFrame(responder(id));
347
- }
348
-
349
- function handleHostToolCall(frame: OmpRpcInboundFrame): void {
350
- const id = getString(frame, 'id');
351
- if (id === null) throw new OmpRpcTaskFailure('malformed-host-tool-call', 'host_tool_call is missing id.');
352
- if (!registerLifetimeId(id)) {
353
- throw new OmpRpcTaskFailure(
354
- 'lifetime-request-id-exceeded',
355
- `host_tool_call id "${id}" exceeds the lifetime request-id bound.`
356
- );
357
- }
358
- writeFrame({
359
- type: 'host_tool_result',
360
- id,
361
- isError: true,
362
- result: { content: [{ type: 'text', text: 'Zeroshot declares no host tools' }] },
363
- });
364
- }
365
-
366
- function handleHostUriRequest(frame: OmpRpcInboundFrame): void {
367
- const id = getString(frame, 'id');
368
- if (id === null) throw new OmpRpcTaskFailure('malformed-host-uri-request', 'host_uri_request is missing id.');
369
- if (!registerLifetimeId(id)) {
370
- throw new OmpRpcTaskFailure(
371
- 'lifetime-request-id-exceeded',
372
- `host_uri_request id "${id}" exceeds the lifetime request-id bound.`
373
- );
374
- }
375
- writeFrame({ type: 'host_uri_result', id, isError: true, error: 'Zeroshot declares no host URI schemes' });
376
- }
377
-
378
- function handlePromptResultFrame(frame: OmpRpcInboundFrame): void {
379
- if (getString(frame, 'id') !== 'zs-2') return;
380
- const agentInvoked = getBoolean(frame, 'agentInvoked') ?? false;
381
- if (agentInvoked) return; // agent_end is authoritative for the invoked path.
382
- // Do not set state.terminal here: the enqueue() .catch() handler calls failPermanently(),
383
- // which owns that transition and no-ops if it's already true (see negotiateAndPrompt()).
384
- throw new OmpRpcTaskFailure(
385
- 'local-only-prompt',
386
- 'OMP resolved the prompt without invoking the agent (no agent turn).'
387
- );
388
- }
389
-
390
- function handleAgentEnd(): void {
391
- if (state.terminal) return;
392
- state.terminal = true;
393
- state.pendingStopReason = deriveStopReason();
394
- // Graceful shutdown: close stdin so OMP exits on its own (docs/rpc.md: "When stdin closes
395
- // ... the process exits with code 0"). Only escalate to SIGTERM/SIGKILL if that stalls.
396
- child.stdin?.end();
397
- setTimeout(() => terminateOwnedBoundary(), request.exitGraceMs);
398
- }
399
-
400
- function emitNormalized(frame: OmpRpcInboundFrame): void {
401
- for (const event of normalizeOmpRpcFrame(frame, state.eventState)) pushEvent(event);
402
- }
403
-
404
- function dispatchReadyFrame(frame: OmpRpcInboundFrame): void {
405
- state.readyReceived = true;
406
- if (frame.type !== 'ready') {
407
- throw new OmpRpcTaskFailure('unsupported-protocol', `Expected an initial ready frame, got "${frame.type}".`);
408
- }
409
- const supportedVersions = getArray(frame, 'supportedProtocolVersions');
410
- if (!supportedVersions.includes(2)) {
411
- throw new OmpRpcTaskFailure(
412
- 'unsupported-protocol',
413
- `OMP ready frame did not advertise protocol v2 (supportedProtocolVersions=${JSON.stringify(supportedVersions)}).`
414
- );
415
- }
416
- const maxFrameBytes = getNumber(frame, 'maxFrameBytes');
417
- const maxReassembledFrameBytes = getNumber(frame, 'maxReassembledFrameBytes');
418
- if (
419
- maxFrameBytes === null ||
420
- maxFrameBytes > DEFAULT_OMP_RPC_DECODER_LIMITS.maxPhysicalFrameBytes ||
421
- maxReassembledFrameBytes === null ||
422
- maxReassembledFrameBytes > DEFAULT_OMP_RPC_DECODER_LIMITS.maxReassembledFrameBytes
423
- ) {
424
- throw new OmpRpcTaskFailure(
425
- 'unsupported-limits',
426
- `OMP ready frame advertised limits above the pinned decoder caps (maxFrameBytes=${String(maxFrameBytes)}, maxReassembledFrameBytes=${String(maxReassembledFrameBytes)}).`
427
- );
428
- }
429
- negotiateAndPrompt().catch((error: unknown) => {
430
- if (error instanceof OmpRpcProtocolError) failPermanently(error.code, error.message);
431
- else if (error instanceof OmpRpcTaskFailure) failPermanently(error.stopReason, error.message);
432
- else failPermanently('driver-error', error instanceof Error ? error.message : String(error));
433
- });
434
- }
435
-
436
- async function negotiateAndPrompt(): Promise<void> {
437
- // Every stdin write is ordered after onSpawn resolves (spawn evidence must be durable
438
- // before the prompt is written, so a detached watcher crash after spawn is still owned).
439
- await spawnHookPromise;
440
- if (state.settled) return;
441
- const negotiateResponse = await sendCommand({ id: 'zs-1', type: 'negotiate_protocol', protocolVersion: 2 });
442
- assertSuccessfulResponse(negotiateResponse, 'negotiate_protocol', 'zs-1');
443
- state.negotiatedV2 = true;
444
-
445
- const stateResponse = await sendCommand({ id: 'zs-state', type: 'get_state' }).catch(() => null);
446
- state.sessionEvidence = sessionEvidenceFromState(stateResponse);
447
- await hooks.onSession({ ...state.sessionEvidence, phase: 'ready' });
448
-
449
- state.promptSent = true;
450
- const ack = await sendCommand({ id: 'zs-2', type: 'prompt', message: request.prompt });
451
- assertSuccessfulResponse(ack, 'prompt', 'zs-2');
452
- const data = getRecord(ack, 'data');
453
- const agentInvoked = data ? getBoolean(data, 'agentInvoked') : null;
454
- if (agentInvoked === false) {
455
- // Do not set state.terminal here: failPermanently() (invoked by this function's
456
- // .catch() handler) owns that transition and no-ops if it's already true, which would
457
- // skip pushEvent/terminateOwnedBoundary and hang the task forever.
458
- throw new OmpRpcTaskFailure(
459
- 'local-only-prompt',
460
- 'OMP resolved the prompt without invoking the agent (no agent turn).'
461
- );
462
- }
463
- // agentInvoked true or omitted: completion is driven entirely by later frame dispatch
464
- // (agent_end / a delayed prompt_result), not by this function returning.
465
- }
466
-
467
- // Present on both the get_state response's `data` and a `session_info_update` event frame per
468
- // docs/rpc.md; either may carry only a subset, so callers merge this onto prior evidence
469
- // rather than replacing it wholesale.
470
- function sessionFieldsFromRecord(
471
- record: Record<string, unknown>
472
- ): Partial<Pick<OmpRpcSessionEvidence, 'sessionId' | 'sessionFile'>> {
473
- const sessionId = getString(record, 'sessionId');
474
- const sessionFile = getString(record, 'sessionFile');
475
- return {
476
- ...(sessionId !== null ? { sessionId } : {}),
477
- ...(sessionFile !== null ? { sessionFile } : {}),
478
- };
479
- }
480
-
481
- function sessionEvidenceFromState(
482
- stateResponse: Record<string, unknown> | null
483
- ): Omit<OmpRpcSessionEvidence, 'phase'> {
484
- if (stateResponse === null || getBoolean(stateResponse, 'success') !== true) return UNKNOWN_SESSION_EVIDENCE;
485
- const data = getRecord(stateResponse, 'data');
486
- const model = data ? getRecord(data, 'model') : null;
487
- return {
488
- ...UNKNOWN_SESSION_EVIDENCE,
489
- ...(data ? sessionFieldsFromRecord(data) : {}),
490
- selectedProvider: (model ? getString(model, 'provider') : null) ?? '',
491
- selectedModel: (model ? getString(model, 'id') : null) ?? '',
492
- thinkingLevel: (data ? getString(data, 'thinkingLevel') : null) ?? '',
493
- };
494
- }
495
-
496
- // session_info_update is a builtin slash-command side channel (docs/rpc.md) that can carry a
497
- // later-observed sessionId/sessionFile than the initial get_state snapshot. Returning the
498
- // hooks.onSession() promise (rather than fire-and-forget) lets a persistence failure surface
499
- // through the same enqueue()/state.chain .catch() -> failPermanently() path as every other
500
- // dispatch failure, instead of being silently swallowed.
501
- function handleSessionInfoUpdate(frame: OmpRpcInboundFrame): Promise<void> | void {
502
- const updates = sessionFieldsFromRecord(frame);
503
- if (Object.keys(updates).length === 0) return;
504
- state.sessionEvidence = { ...state.sessionEvidence, ...updates };
505
- return hooks.onSession({ ...state.sessionEvidence, phase: 'ready' });
506
- }
507
-
508
- function dispatchFrame(frame: OmpRpcInboundFrame): void | Promise<void> {
509
- if (state.terminal) return; // Frames after the terminal frame are dropped.
510
- if (!state.readyReceived) {
511
- dispatchReadyFrame(frame);
512
- return;
513
- }
514
- assertNoPreNegotiationRpcChunk(frame.type, state.negotiatedV2);
515
- switch (frame.type) {
516
- case 'response':
517
- handleResponse(frame);
518
- return;
519
- case 'extension_ui_request':
520
- handleExtensionUiRequest(frame);
521
- return;
522
- case 'host_tool_call':
523
- handleHostToolCall(frame);
524
- return;
525
- case 'host_uri_request':
526
- handleHostUriRequest(frame);
527
- return;
528
- case 'host_tool_cancel':
529
- case 'host_uri_cancel':
530
- return; // No long-running host operation is ever started, so nothing to cancel.
531
- case 'extension_error':
532
- throw new OmpRpcTaskFailure(
533
- 'extension-error',
534
- getString(frame, 'error') ?? 'OMP extension runner reported an error.'
535
- );
536
- case 'prompt_result':
537
- handlePromptResultFrame(frame);
538
- return;
539
- case 'agent_end':
540
- handleAgentEnd();
541
- return;
542
- case 'session_info_update':
543
- return handleSessionInfoUpdate(frame);
544
- default:
545
- if (state.promptSent) emitNormalized(frame);
546
- }
547
- }
548
-
549
- function enqueue(frame: OmpRpcInboundFrame): void {
550
- // Bounded before anything is queued: a single stdout chunk can decode to an
551
- // attacker-controlled number of frames (each individually within the decoder's per-frame
552
- // caps), and dispatch is asynchronous (chained via state.chain), so without this check a
553
- // burst could queue unbounded work before any of it is actually processed.
554
- if (state.queuedFrames >= MAX_PENDING_REQUESTS) {
555
- failPermanently(
556
- 'pending-request-exceeded',
557
- `More than ${MAX_PENDING_REQUESTS} RPC frames are queued awaiting dispatch.`
558
- );
559
- return;
560
- }
561
- state.queuedFrames += 1;
562
- state.chain = state.chain
563
- .then(() => dispatchFrame(frame))
564
- .catch((error: unknown) => {
565
- if (error instanceof OmpRpcProtocolError) failPermanently(error.code, error.message);
566
- else if (error instanceof OmpRpcTaskFailure) failPermanently(error.stopReason, error.message);
567
- else failPermanently('driver-error', error instanceof Error ? error.message : String(error));
568
- })
569
- .finally(() => {
570
- state.queuedFrames -= 1;
571
- });
572
- }
573
-
574
- child.stdout?.on('data', (chunk: Buffer) => {
575
- let frames: readonly OmpRpcInboundFrame[];
576
- try {
577
- frames = state.decoder.push(chunk, state.negotiatedV2);
578
- } catch (error) {
579
- if (error instanceof OmpRpcProtocolError) failPermanently(error.code, error.message);
580
- else failPermanently('decoder-error', error instanceof Error ? error.message : String(error));
581
- return;
582
- }
583
- for (const frame of frames) enqueue(frame);
584
- });
585
-
586
- child.stderr?.on('data', (chunk: Buffer) => {
587
- state.stderrTail = (state.stderrTail + chunk.toString('utf8')).slice(-MAX_STDERR_TAIL_BYTES);
588
- });
589
-
590
- child.once('error', (error) => {
591
- if (state.settled) return;
592
- state.settled = true;
593
- clearTimers();
594
- rejectPromise(error);
595
- });
596
-
597
- child.once('close', (exitCode, signal) => {
598
- state.processExit = { exitCode, signal: signal ?? null };
599
- for (const command of state.pending.values()) {
600
- command.reject(new OmpRpcTaskFailure('process-closed', 'child process ended before a response arrived.'));
601
- }
602
- state.pending.clear();
603
- if (state.terminal) {
604
- // Outcome already decided (agent_end / a permanent failure); the process has now actually
605
- // exited, so resolve with the real exitCode/signal.
606
- finish(state.pendingStopReason ?? deriveStopReason());
607
- return;
608
- }
609
- state.terminal = true;
610
- let detail: string;
611
- try {
612
- state.decoder.finish();
613
- detail = `OMP process exited (code=${exitCode ?? 'null'}, signal=${signal ?? 'null'}) before a terminal RPC frame arrived.`;
614
- } catch (error) {
615
- detail = error instanceof OmpRpcProtocolError ? error.message : String(error);
616
- }
617
- if (state.stderrTail) detail += ` stderr: ${state.stderrTail}`;
618
- const stopReason = state.abortStopReason ?? 'stream-ended-before-terminal';
619
- pushEvent({ type: 'result', success: false, result: null, error: `${stopReason}: ${detail}` });
620
- finish(stopReason);
621
- });
622
-
623
- function beginAbort(stopReason: string): void {
624
- if (state.settled || state.terminal || state.abortStopReason !== null) return;
625
- state.abortStopReason = stopReason;
626
- writeFrame({ id: 'zs-abort', type: 'abort' });
627
- abortTimer = setTimeout(() => {
628
- if (!state.terminal) terminateOwnedBoundary();
629
- }, request.abortGraceMs);
630
- }
631
-
632
- if (request.signal.aborted) {
633
- beginAbort('cancelled');
634
- } else {
635
- request.signal.addEventListener('abort', () => beginAbort('cancelled'), { once: true });
636
- }
637
- timeoutTimer = setTimeout(() => beginAbort('timeout'), request.timeoutMs);
638
- });
639
- }