@the-open-engine/zeroshot 6.29.0 → 6.30.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 (347) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/cli/index.js +2 -4
  3. package/lib/agent-cli-provider/adapters/codex.d.ts.map +1 -1
  4. package/lib/agent-cli-provider/adapters/codex.js +0 -1
  5. package/lib/agent-cli-provider/adapters/codex.js.map +1 -1
  6. package/lib/agent-cli-provider/contract-actions.d.ts +1 -1
  7. package/lib/agent-cli-provider/contract-actions.d.ts.map +1 -1
  8. package/lib/agent-cli-provider/contract-actions.js +5 -5
  9. package/lib/agent-cli-provider/contract-actions.js.map +1 -1
  10. package/lib/agent-cli-provider/contract-invoke.d.ts +1 -1
  11. package/lib/agent-cli-provider/contract-invoke.d.ts.map +1 -1
  12. package/lib/agent-cli-provider/contract-invoke.js +2 -2
  13. package/lib/agent-cli-provider/contract-invoke.js.map +1 -1
  14. package/lib/agent-cli-provider/contract-support.d.ts +1 -1
  15. package/lib/agent-cli-provider/contract-support.d.ts.map +1 -1
  16. package/lib/agent-cli-provider/contract-support.js +2 -2
  17. package/lib/agent-cli-provider/contract-support.js.map +1 -1
  18. package/lib/agent-cli-provider/contract.d.ts +1 -0
  19. package/lib/agent-cli-provider/contract.d.ts.map +1 -1
  20. package/lib/agent-cli-provider/contract.js +1 -1
  21. package/lib/agent-cli-provider/contract.js.map +1 -1
  22. package/lib/agent-cli-provider/index.d.ts +1 -1
  23. package/lib/agent-cli-provider/index.d.ts.map +1 -1
  24. package/lib/agent-cli-provider/index.js +2 -1
  25. package/lib/agent-cli-provider/index.js.map +1 -1
  26. package/lib/agent-cli-provider/provider-registry.d.ts +1 -0
  27. package/lib/agent-cli-provider/provider-registry.d.ts.map +1 -1
  28. package/lib/agent-cli-provider/provider-registry.js +4 -0
  29. package/lib/agent-cli-provider/provider-registry.js.map +1 -1
  30. package/lib/agent-cli-provider/single-agent-runtime.d.ts +3 -3
  31. package/lib/agent-cli-provider/single-agent-runtime.d.ts.map +1 -1
  32. package/lib/agent-cli-provider/single-agent-runtime.js +22 -48
  33. package/lib/agent-cli-provider/single-agent-runtime.js.map +1 -1
  34. package/lib/cluster/client.cjs +30 -7
  35. package/lib/cluster/client.d.cts +52 -0
  36. package/lib/cluster/client.d.mts +52 -0
  37. package/lib/cluster/client.d.ts +4 -6
  38. package/lib/cluster/client.mjs +32 -9
  39. package/lib/cluster/connection-state.cjs +25 -0
  40. package/lib/cluster/connection-state.d.cts +13 -0
  41. package/lib/cluster/connection-state.d.mts +13 -0
  42. package/lib/cluster/connection-state.d.ts +13 -0
  43. package/lib/cluster/connection-state.mjs +21 -0
  44. package/lib/{target/hosted-run/contracts.js → cluster/connection-types.cjs} +0 -1
  45. package/lib/cluster/connection-types.d.cts +33 -0
  46. package/lib/cluster/connection-types.d.mts +33 -0
  47. package/lib/cluster/connection-types.d.ts +33 -0
  48. package/lib/cluster/connection-types.mjs +1 -0
  49. package/lib/cluster/connection.cjs +18 -46
  50. package/lib/cluster/connection.d.cts +26 -0
  51. package/lib/cluster/connection.d.mts +26 -0
  52. package/lib/cluster/connection.d.ts +7 -25
  53. package/lib/cluster/connection.mjs +12 -42
  54. package/lib/cluster/errors.cjs +9 -1
  55. package/lib/cluster/errors.d.cts +29 -0
  56. package/lib/cluster/errors.d.mts +29 -0
  57. package/lib/cluster/errors.d.ts +4 -0
  58. package/lib/cluster/errors.mjs +7 -0
  59. package/lib/cluster/frames.d.cts +12 -0
  60. package/lib/cluster/frames.d.mts +12 -0
  61. package/lib/cluster/generated/protocol-schema.d.cts +1 -0
  62. package/lib/cluster/generated/protocol-schema.d.mts +1 -0
  63. package/lib/cluster/generated/protocol.d.cts +781 -0
  64. package/lib/cluster/generated/protocol.d.mts +781 -0
  65. package/lib/cluster/index.cjs +2 -2
  66. package/lib/cluster/index.d.cts +13 -0
  67. package/lib/cluster/index.d.mts +13 -0
  68. package/lib/cluster/index.d.ts +3 -3
  69. package/lib/cluster/index.mjs +2 -2
  70. package/lib/cluster/json-source.cjs +1 -0
  71. package/lib/cluster/json-source.d.cts +5 -0
  72. package/lib/cluster/json-source.d.mts +5 -0
  73. package/lib/cluster/json-source.d.ts +1 -0
  74. package/lib/cluster/json-source.mjs +1 -0
  75. package/lib/cluster/payload-value.cjs +1 -0
  76. package/lib/cluster/payload-value.d.cts +8 -0
  77. package/lib/cluster/payload-value.d.mts +8 -0
  78. package/lib/cluster/payload-value.d.ts +1 -0
  79. package/lib/cluster/payload-value.mjs +1 -0
  80. package/lib/cluster/queue.d.cts +15 -0
  81. package/lib/cluster/queue.d.mts +15 -0
  82. package/lib/cluster/socket.cjs +8 -0
  83. package/lib/cluster/socket.d.cts +13 -0
  84. package/lib/cluster/socket.d.mts +13 -0
  85. package/lib/cluster/socket.d.ts +2 -0
  86. package/lib/cluster/socket.mjs +7 -0
  87. package/lib/cluster/subscriptions.d.cts +73 -0
  88. package/lib/cluster/subscriptions.d.mts +73 -0
  89. package/lib/cluster/subscriptions.d.ts +5 -1
  90. package/lib/cluster/validators.cjs +1 -0
  91. package/lib/cluster/validators.d.cts +7 -0
  92. package/lib/cluster/validators.d.mts +7 -0
  93. package/lib/cluster/validators.d.ts +1 -0
  94. package/lib/cluster/validators.mjs +1 -0
  95. package/lib/cluster-worker/engine-adapter-common.js +37 -0
  96. package/lib/cluster-worker/engine-adapter.js +24 -30
  97. package/lib/cluster-worker/engine-start.js +59 -0
  98. package/lib/cluster-worker/index.js +49 -67
  99. package/lib/cluster-worker/profiles.js +1 -42
  100. package/lib/cluster-worker/runtime-dependencies.js +49 -0
  101. package/lib/cluster-worker/runtime-support.js +2 -34
  102. package/lib/cluster-worker/terminal-normalizer.js +9 -10
  103. package/lib/hosted-session/authority.cjs +61 -0
  104. package/lib/hosted-session/authority.d.cts +3 -0
  105. package/lib/hosted-session/authority.d.mts +3 -0
  106. package/lib/hosted-session/authority.d.ts +3 -0
  107. package/lib/hosted-session/authority.mjs +57 -0
  108. package/lib/hosted-session/coordinator.cjs +78 -51
  109. package/lib/hosted-session/coordinator.d.cts +11 -0
  110. package/lib/hosted-session/coordinator.d.mts +11 -0
  111. package/lib/hosted-session/coordinator.d.ts +4 -2
  112. package/lib/hosted-session/coordinator.mjs +75 -51
  113. package/lib/hosted-session/errors.cjs +25 -0
  114. package/lib/hosted-session/errors.d.cts +10 -0
  115. package/lib/hosted-session/errors.d.mts +10 -0
  116. package/lib/hosted-session/errors.d.ts +10 -0
  117. package/lib/hosted-session/errors.mjs +19 -0
  118. package/lib/hosted-session/index.cjs +4 -1
  119. package/lib/hosted-session/index.d.cts +2 -0
  120. package/lib/hosted-session/index.d.mts +2 -0
  121. package/lib/hosted-session/index.d.ts +2 -2
  122. package/lib/hosted-session/index.mjs +1 -1
  123. package/lib/hosted-session/reconnecting-watch.cjs +131 -0
  124. package/lib/hosted-session/reconnecting-watch.d.cts +13 -0
  125. package/lib/hosted-session/reconnecting-watch.d.mts +13 -0
  126. package/lib/hosted-session/reconnecting-watch.d.ts +13 -0
  127. package/lib/hosted-session/reconnecting-watch.mjs +127 -0
  128. package/lib/hosted-session/types.d.cts +32 -0
  129. package/lib/hosted-session/types.d.mts +32 -0
  130. package/lib/hosted-session/types.d.ts +19 -7
  131. package/lib/hosted-target/access-url.cjs +44 -0
  132. package/lib/hosted-target/access-url.d.cts +2 -0
  133. package/lib/hosted-target/access-url.d.mts +2 -0
  134. package/lib/hosted-target/access-url.d.ts +2 -0
  135. package/lib/hosted-target/access-url.mjs +41 -0
  136. package/lib/hosted-target/adapter-request.cjs +12 -0
  137. package/lib/hosted-target/adapter-request.d.cts +17 -0
  138. package/lib/hosted-target/adapter-request.d.mts +17 -0
  139. package/lib/hosted-target/adapter-request.d.ts +17 -0
  140. package/lib/hosted-target/adapter-request.mjs +9 -0
  141. package/lib/hosted-target/adapter-types.cjs +2 -0
  142. package/lib/hosted-target/adapter-types.d.cts +27 -0
  143. package/lib/hosted-target/adapter-types.d.mts +27 -0
  144. package/lib/hosted-target/adapter-types.d.ts +27 -0
  145. package/lib/hosted-target/adapter-types.mjs +1 -0
  146. package/lib/hosted-target/bounds.cjs +10 -0
  147. package/lib/hosted-target/bounds.d.cts +7 -0
  148. package/lib/hosted-target/bounds.d.mts +7 -0
  149. package/lib/hosted-target/bounds.d.ts +7 -0
  150. package/lib/hosted-target/bounds.mjs +7 -0
  151. package/lib/hosted-target/capsule-error-response.cjs +76 -0
  152. package/lib/hosted-target/capsule-error-response.d.cts +2 -0
  153. package/lib/hosted-target/capsule-error-response.d.mts +2 -0
  154. package/lib/hosted-target/capsule-error-response.d.ts +2 -0
  155. package/lib/hosted-target/capsule-error-response.mjs +73 -0
  156. package/lib/hosted-target/errors.cjs +88 -0
  157. package/lib/hosted-target/errors.d.cts +36 -0
  158. package/lib/hosted-target/errors.d.mts +36 -0
  159. package/lib/hosted-target/errors.d.ts +36 -0
  160. package/lib/hosted-target/errors.mjs +75 -0
  161. package/lib/hosted-target/index.cjs +16 -0
  162. package/lib/hosted-target/index.d.cts +3 -0
  163. package/lib/hosted-target/index.d.mts +3 -0
  164. package/lib/hosted-target/index.d.ts +3 -0
  165. package/lib/hosted-target/index.mjs +2 -0
  166. package/lib/hosted-target/response-validation.cjs +169 -0
  167. package/lib/hosted-target/response-validation.d.cts +5 -0
  168. package/lib/hosted-target/response-validation.d.mts +5 -0
  169. package/lib/hosted-target/response-validation.d.ts +5 -0
  170. package/lib/hosted-target/response-validation.mjs +163 -0
  171. package/lib/hosted-target/retry-executor.cjs +51 -0
  172. package/lib/hosted-target/retry-executor.d.cts +8 -0
  173. package/lib/hosted-target/retry-executor.d.mts +8 -0
  174. package/lib/hosted-target/retry-executor.d.ts +8 -0
  175. package/lib/hosted-target/retry-executor.mjs +48 -0
  176. package/lib/hosted-target/retry.cjs +78 -0
  177. package/lib/hosted-target/retry.d.cts +9 -0
  178. package/lib/hosted-target/retry.d.mts +9 -0
  179. package/lib/hosted-target/retry.d.ts +9 -0
  180. package/lib/hosted-target/retry.mjs +73 -0
  181. package/lib/hosted-target/target-adapter.cjs +10 -0
  182. package/lib/hosted-target/target-adapter.d.cts +3 -0
  183. package/lib/hosted-target/target-adapter.d.mts +3 -0
  184. package/lib/hosted-target/target-adapter.d.ts +3 -0
  185. package/lib/hosted-target/target-adapter.mjs +7 -0
  186. package/lib/hosted-target/types.cjs +4 -0
  187. package/lib/hosted-target/types.d.cts +50 -0
  188. package/lib/hosted-target/types.d.mts +50 -0
  189. package/lib/hosted-target/types.d.ts +50 -0
  190. package/lib/hosted-target/types.mjs +1 -0
  191. package/lib/hosted-target/zero-cloud-v1-adapter.cjs +185 -0
  192. package/lib/hosted-target/zero-cloud-v1-adapter.d.cts +13 -0
  193. package/lib/hosted-target/zero-cloud-v1-adapter.d.mts +13 -0
  194. package/lib/hosted-target/zero-cloud-v1-adapter.d.ts +13 -0
  195. package/lib/hosted-target/zero-cloud-v1-adapter.mjs +181 -0
  196. package/lib/start-cluster.js +3 -3
  197. package/lib/target/bounded-response.cjs +51 -0
  198. package/lib/target/bounded-response.d.cts +1 -0
  199. package/lib/target/bounded-response.d.mts +1 -0
  200. package/lib/target/bounded-response.d.ts +1 -0
  201. package/lib/target/bounded-response.js +51 -0
  202. package/lib/target/bounded-response.mjs +48 -0
  203. package/lib/target/credential-lock.js +1 -3
  204. package/lib/target/credential-store.js +9 -4
  205. package/lib/target/device-flow.cjs +213 -0
  206. package/lib/target/device-flow.d.cts +54 -0
  207. package/lib/target/device-flow.d.mts +54 -0
  208. package/lib/target/device-flow.d.ts +26 -14
  209. package/lib/target/device-flow.js +162 -58
  210. package/lib/target/device-flow.mjs +203 -0
  211. package/lib/target/discovery-errors.cjs +10 -0
  212. package/lib/target/discovery-errors.d.cts +3 -0
  213. package/lib/target/discovery-errors.d.mts +3 -0
  214. package/lib/target/discovery-errors.d.ts +3 -0
  215. package/lib/target/discovery-errors.js +10 -0
  216. package/lib/target/discovery-errors.mjs +6 -0
  217. package/lib/target/discovery-sections.cjs +191 -0
  218. package/lib/target/discovery-sections.d.cts +52 -0
  219. package/lib/target/discovery-sections.d.mts +52 -0
  220. package/lib/target/discovery-sections.d.ts +52 -0
  221. package/lib/target/discovery-sections.js +191 -0
  222. package/lib/target/discovery-sections.mjs +179 -0
  223. package/lib/target/discovery-validation.cjs +109 -0
  224. package/lib/target/discovery-validation.d.cts +28 -0
  225. package/lib/target/discovery-validation.d.mts +28 -0
  226. package/lib/target/discovery-validation.d.ts +28 -0
  227. package/lib/target/discovery-validation.js +109 -0
  228. package/lib/target/discovery-validation.mjs +99 -0
  229. package/lib/target/discovery.cjs +112 -0
  230. package/lib/target/discovery.d.cts +74 -0
  231. package/lib/target/discovery.d.mts +74 -0
  232. package/lib/target/discovery.d.ts +67 -5
  233. package/lib/target/discovery.js +94 -79
  234. package/lib/target/discovery.mjs +105 -0
  235. package/lib/target/index.d.ts +6 -6
  236. package/lib/target/index.js +36 -36
  237. package/lib/target/oauth-http.d.ts +2 -0
  238. package/lib/target/oauth-http.js +25 -0
  239. package/lib/target/refresh-exchange.d.ts +11 -0
  240. package/lib/target/refresh-exchange.js +24 -0
  241. package/lib/target/refresh-revocation.d.ts +8 -0
  242. package/lib/target/refresh-revocation.js +19 -0
  243. package/lib/target/route-template.cjs +85 -0
  244. package/lib/target/route-template.d.cts +7 -0
  245. package/lib/target/route-template.d.mts +7 -0
  246. package/lib/target/route-template.d.ts +7 -0
  247. package/lib/target/route-template.js +85 -0
  248. package/lib/target/route-template.mjs +81 -0
  249. package/lib/target/session-errors.d.ts +4 -0
  250. package/lib/target/session-errors.js +12 -0
  251. package/lib/target/session-verification.d.ts +10 -0
  252. package/lib/target/session-verification.js +42 -0
  253. package/lib/target/target-registry.d.ts +7 -3
  254. package/lib/target/target-registry.js +41 -10
  255. package/lib/target/target-session-manager.d.ts +48 -0
  256. package/lib/target/target-session-manager.js +226 -0
  257. package/lib/target/target-session.d.ts +39 -32
  258. package/lib/target/target-session.js +63 -151
  259. package/lib/target/token-response.cjs +51 -0
  260. package/lib/target/token-response.d.cts +7 -0
  261. package/lib/target/token-response.d.mts +7 -0
  262. package/lib/target/token-response.d.ts +7 -0
  263. package/lib/target/token-response.js +51 -0
  264. package/lib/target/token-response.mjs +48 -0
  265. package/package.json +14 -7
  266. package/protocol/openengine-cluster/v1/worker.schema.json +171 -9
  267. package/scripts/build-cluster.js +23 -3
  268. package/scripts/opcore-introduced-check.js +0 -2
  269. package/src/agent-cli-provider/adapters/codex.ts +0 -1
  270. package/src/agent-cli-provider/contract-actions.ts +9 -5
  271. package/src/agent-cli-provider/contract-invoke.ts +3 -2
  272. package/src/agent-cli-provider/contract-support.ts +12 -6
  273. package/src/agent-cli-provider/contract.ts +6 -1
  274. package/src/agent-cli-provider/index.ts +1 -0
  275. package/src/agent-cli-provider/provider-registry.ts +4 -0
  276. package/src/agent-cli-provider/single-agent-runtime.ts +32 -45
  277. package/src/cluster/client.ts +42 -15
  278. package/src/cluster/connection-state.ts +33 -0
  279. package/src/cluster/connection-types.ts +28 -0
  280. package/src/cluster/connection.ts +37 -68
  281. package/src/cluster/errors.ts +5 -0
  282. package/src/cluster/index.ts +3 -1
  283. package/src/cluster/json-source.ts +1 -0
  284. package/src/cluster/payload-value.ts +1 -0
  285. package/src/cluster/socket.ts +13 -0
  286. package/src/cluster/subscriptions.ts +7 -2
  287. package/src/cluster/validators.ts +1 -0
  288. package/src/cluster/ws.d.ts +1 -1
  289. package/src/hosted-session/authority.ts +77 -0
  290. package/src/hosted-session/coordinator.ts +113 -56
  291. package/src/hosted-session/errors.ts +21 -0
  292. package/src/hosted-session/index.ts +14 -2
  293. package/src/hosted-session/reconnecting-watch.ts +148 -0
  294. package/src/hosted-session/types.ts +22 -8
  295. package/src/hosted-target/access-url.ts +46 -0
  296. package/src/hosted-target/adapter-request.ts +28 -0
  297. package/src/hosted-target/adapter-types.ts +39 -0
  298. package/src/hosted-target/bounds.ts +1 -0
  299. package/src/hosted-target/capsule-error-response.ts +107 -0
  300. package/src/hosted-target/errors.ts +36 -35
  301. package/src/hosted-target/index.ts +10 -23
  302. package/src/hosted-target/response-validation.ts +170 -62
  303. package/src/hosted-target/retry-executor.ts +62 -0
  304. package/src/hosted-target/retry.ts +47 -11
  305. package/src/hosted-target/target-adapter.ts +12 -8
  306. package/src/hosted-target/types.ts +19 -18
  307. package/src/hosted-target/zero-cloud-v1-adapter.ts +229 -316
  308. package/src/isolation-manager.js +1 -16
  309. package/src/target/bounded-response.ts +68 -0
  310. package/src/target/credential-lock.ts +1 -3
  311. package/src/target/credential-store.ts +14 -10
  312. package/src/target/device-flow.ts +209 -85
  313. package/src/target/discovery-errors.ts +6 -0
  314. package/src/target/discovery-sections.ts +251 -0
  315. package/src/target/discovery-validation.ts +144 -0
  316. package/src/target/discovery.ts +163 -97
  317. package/src/target/index.ts +15 -11
  318. package/src/target/oauth-http.ts +27 -0
  319. package/src/target/refresh-exchange.ts +36 -0
  320. package/src/target/refresh-revocation.ts +29 -0
  321. package/src/target/route-template.ts +105 -0
  322. package/src/target/session-errors.ts +9 -0
  323. package/src/target/session-verification.ts +51 -0
  324. package/src/target/target-registry.ts +60 -27
  325. package/src/target/target-session-manager.ts +285 -0
  326. package/src/target/target-session.ts +105 -226
  327. package/src/target/token-response.ts +62 -0
  328. package/docker/zeroshot-oecp/Cargo.toml +0 -12
  329. package/docker/zeroshot-oecp/Dockerfile +0 -65
  330. package/docker/zeroshot-oecp/src/main.rs +0 -32
  331. package/lib/target/bounded-json.d.ts +0 -6
  332. package/lib/target/bounded-json.js +0 -43
  333. package/lib/target/hosted-run/client.d.ts +0 -26
  334. package/lib/target/hosted-run/client.js +0 -158
  335. package/lib/target/hosted-run/commands.d.ts +0 -4
  336. package/lib/target/hosted-run/commands.js +0 -113
  337. package/lib/target/hosted-run/contracts.d.ts +0 -49
  338. package/lib/target/hosted-run/input.d.ts +0 -5
  339. package/lib/target/hosted-run/input.js +0 -200
  340. package/lib/target/hosted-run.d.ts +0 -4
  341. package/lib/target/hosted-run.js +0 -12
  342. package/src/target/bounded-json.ts +0 -48
  343. package/src/target/hosted-run/client.ts +0 -198
  344. package/src/target/hosted-run/commands.ts +0 -140
  345. package/src/target/hosted-run/contracts.ts +0 -53
  346. package/src/target/hosted-run/input.ts +0 -199
  347. package/src/target/hosted-run.ts +0 -8
@@ -2,6 +2,11 @@
2
2
 
3
3
  const { cloneJson } = require('./object-utils');
4
4
  const { inputFromRequest } = require('./engine-input');
5
+ const {
6
+ createAdapterFacade,
7
+ declaredFailureEvent,
8
+ frozenResourceStatus,
9
+ } = require('./engine-adapter-common');
5
10
 
6
11
  const TERMINAL_TOPICS = new Set(['CLUSTER_COMPLETE', 'CLUSTER_FAILED']);
7
12
 
@@ -9,21 +14,20 @@ function messageKey(message) {
9
14
  return message.id ?? `${message.timestamp}:${message.topic}:${message.sender}`;
10
15
  }
11
16
 
17
+ function completionPayload(data) {
18
+ const payload = {};
19
+ if (Object.prototype.hasOwnProperty.call(data, 'result')) payload.result = data.result;
20
+ if (Object.prototype.hasOwnProperty.call(data, 'artifacts')) payload.artifacts = data.artifacts;
21
+ return payload;
22
+ }
23
+
12
24
  function terminalEventFromMessage(message) {
13
25
  const data = message.content?.data || {};
14
26
  if (message.topic === 'CLUSTER_COMPLETE') {
15
- let prSummary = null;
16
- if (typeof data.pr_url === 'string' && data.pr_url) {
17
- const number = Number.isSafeInteger(data.pr_number) ? ` #${data.pr_number}` : '';
18
- prSummary = `Pull request${number} created: ${data.pr_url}`;
19
- }
20
27
  return {
21
28
  type: 'complete',
22
- summary: prSummary || data.reason || message.content?.text,
23
- ...(Object.prototype.hasOwnProperty.call(data, 'result') ? { result: data.result } : {}),
24
- ...(Object.prototype.hasOwnProperty.call(data, 'artifacts')
25
- ? { artifacts: data.artifacts }
26
- : {}),
29
+ summary: data.reason || message.content?.text,
30
+ ...completionPayload(data),
27
31
  };
28
32
  }
29
33
  return {
@@ -133,7 +137,7 @@ class CurrentEngineAdapter {
133
137
  try {
134
138
  this.foldDurableMessages();
135
139
  } catch {
136
- this.resource.onEvent({ type: 'failed', code: 'crash', reason: 'declared_failure' });
140
+ this.resource.onEvent(declaredFailureEvent());
137
141
  }
138
142
  });
139
143
  }
@@ -198,12 +202,12 @@ class CurrentEngineAdapter {
198
202
  foldClusterState(cluster) {
199
203
  if (!cluster) {
200
204
  if (!this.terminalObserved) {
201
- this.resource.onEvent({ type: 'failed', code: 'crash', reason: 'declared_failure' });
205
+ this.resource.onEvent(declaredFailureEvent());
202
206
  }
203
207
  return 'released';
204
208
  }
205
209
  if (!this.terminalObserved && ['failed', 'stopped', 'killed'].includes(cluster.state)) {
206
- this.resource.onEvent({ type: 'failed', code: 'crash', reason: 'declared_failure' });
210
+ this.resource.onEvent(declaredFailureEvent());
207
211
  } else if (cluster.state === 'running') {
208
212
  this.resource.onEvent({ type: 'running' });
209
213
  }
@@ -215,13 +219,11 @@ class CurrentEngineAdapter {
215
219
  this.foldDurableMessages();
216
220
  const cluster = this.orchestrator.getCluster(this.resource.clusterId);
217
221
  if (!cluster && !this.startSettled) {
218
- return Object.freeze({ clusterId: this.resource.clusterId, state: 'starting' });
222
+ return frozenResourceStatus(this.resource, 'starting');
219
223
  }
220
224
  const state = this.foldClusterState(cluster);
221
- if (!cluster) return Object.freeze({ clusterId: this.resource.clusterId, state });
222
- return Object.freeze({
223
- clusterId: this.resource.clusterId,
224
- state,
225
+ if (!cluster) return frozenResourceStatus(this.resource, state);
226
+ return frozenResourceStatus(this.resource, state, {
225
227
  messageCount: cluster.ledger.count({ cluster_id: this.resource.clusterId }),
226
228
  pidAliveDiagnostic: this.orchestrator.getStatus(this.resource.clusterId).isZombie !== true,
227
229
  });
@@ -233,16 +235,16 @@ class CurrentEngineAdapter {
233
235
  this.stopPromise ||= this.stopResource();
234
236
  return this.stopPromise;
235
237
  }
236
-
237
238
  async waitForAllocatedCluster() {
238
239
  let cluster = this.orchestrator.getCluster(this.resource.clusterId);
239
240
  while (!cluster && !this.startSettled && !this.closed) {
240
- await new Promise((resolve) => setTimeout(resolve, 10));
241
+ await new Promise((resolve) => {
242
+ setTimeout(resolve, 10);
243
+ });
241
244
  cluster = this.orchestrator.getCluster(this.resource.clusterId);
242
245
  }
243
246
  return cluster;
244
247
  }
245
-
246
248
  stopAllocatedCluster(cluster = this.orchestrator.getCluster(this.resource.clusterId)) {
247
249
  if (!cluster) return Promise.resolve(false);
248
250
  if (cluster.state === 'stopped' || cluster.state === 'killed') return Promise.resolve(true);
@@ -251,7 +253,6 @@ class CurrentEngineAdapter {
251
253
  .then(() => true);
252
254
  return this.allocatedStopPromise;
253
255
  }
254
-
255
256
  async stopResource() {
256
257
  this.cleanupPromise ||= this.waitForAllocatedCluster()
257
258
  .then((cluster) => this.stopAllocatedCluster(cluster))
@@ -283,14 +284,7 @@ class CurrentEngineAdapter {
283
284
  }
284
285
 
285
286
  function createCurrentEngineAdapter(options = {}) {
286
- const adapter = new CurrentEngineAdapter(options);
287
- return Object.freeze({
288
- start: adapter.start.bind(adapter),
289
- status: adapter.status.bind(adapter),
290
- stop: adapter.stop.bind(adapter),
291
- waitForCleanup: adapter.waitForCleanup.bind(adapter),
292
- close: adapter.close.bind(adapter),
293
- });
287
+ return createAdapterFacade(new CurrentEngineAdapter(options));
294
288
  }
295
289
 
296
290
  module.exports = { createCurrentEngineAdapter, inputFromRequest, terminalEventFromMessage };
@@ -0,0 +1,59 @@
1
+ 'use strict';
2
+
3
+ const { CANCELLED, createArtifactPreparation } = require('./runtime-support');
4
+
5
+ function createEngineStart(runtime, request, clusterId) {
6
+ const prepareArtifacts =
7
+ request.source === 'artifact'
8
+ ? createArtifactPreparation({
9
+ resolver: runtime.artifactResolver,
10
+ artifacts: request.artifacts,
11
+ clusterId,
12
+ getProfile: () => runtime.profile,
13
+ signal: runtime.preparationController.signal,
14
+ reportFailure: runtime.cleanupFailureReporter,
15
+ })
16
+ : null;
17
+ return Promise.resolve(
18
+ runtime.engineAdapter.start({
19
+ request,
20
+ profile: runtime.profile,
21
+ ...(prepareArtifacts ? { prepareArtifacts } : {}),
22
+ clusterId,
23
+ onEvent: runtime.onEngineEvent,
24
+ })
25
+ );
26
+ }
27
+
28
+ function assertEngineResource(resource, request, clusterId) {
29
+ if (resource?.clusterId && resource.clusterId !== clusterId) {
30
+ throw new Error('Engine allocated a cluster with a different id');
31
+ }
32
+ if (request.source === 'artifact' && resource?.artifactsStaged !== true) {
33
+ throw new Error('Engine started without staging artifact input');
34
+ }
35
+ }
36
+
37
+ async function acceptEngineStart(runtime, resource, request, clusterId) {
38
+ if (resource === CANCELLED) {
39
+ if (!runtime.machine.terminalReceipt) await runtime.machine.result();
40
+ return runtime.machine.status();
41
+ }
42
+ assertEngineResource(resource, request, clusterId);
43
+ if (runtime.machine.state === 'starting') runtime.machine.transition('running');
44
+ return runtime.machine.status();
45
+ }
46
+
47
+ async function handleEngineStartFailure(runtime, error) {
48
+ if (runtime.claimTerminalAuthority('engine:start')) {
49
+ runtime.machine.terminal(runtime.failureReceipt('failed', 'crash', 'declared_failure'));
50
+ }
51
+ await runtime.stopEngine();
52
+ if (runtime.terminalAuthority !== 'engine:start' && !runtime.machine.terminalReceipt) {
53
+ await runtime.machine.result();
54
+ return runtime.machine.status();
55
+ }
56
+ throw error;
57
+ }
58
+
59
+ module.exports = { acceptEngineStart, createEngineStart, handleEngineStartFailure };
@@ -1,17 +1,20 @@
1
1
  'use strict';
2
2
 
3
3
  const { validateLegacyShipRequest } = require('./contracts');
4
- const { createCurrentEngineAdapter } = require('./engine-adapter');
5
4
  const { cloneJson, deepFreeze } = require('./object-utils');
6
5
  const { createDeploymentProfileRegistry, DEFAULT_BOUNDS } = require('./profiles');
7
6
  const {
8
7
  CANCELLED,
9
8
  assertIsolatedProfile,
10
- createArtifactPreparation,
11
9
  errorOutcome,
12
10
  resolveRuntimeDependencies,
13
11
  runCancellable,
14
12
  } = require('./runtime-support');
13
+ const {
14
+ acceptEngineStart,
15
+ createEngineStart,
16
+ handleEngineStartFailure,
17
+ } = require('./engine-start');
15
18
  const { releaseEngine, stopEngine } = require('./runtime-engine');
16
19
  const { LegacyWorkerStateMachine } = require('./state-machine');
17
20
  const { createTerminalNormalizer } = require('./terminal-normalizer');
@@ -131,49 +134,14 @@ class LegacyClusterWorkerRuntime {
131
134
  async startEngine(request, clusterId) {
132
135
  this.engineStartAttempted = true;
133
136
  try {
134
- const prepareArtifacts =
135
- request.source === 'artifact'
136
- ? createArtifactPreparation({
137
- resolver: this.artifactResolver,
138
- artifacts: request.artifacts,
139
- clusterId,
140
- getProfile: () => this.profile,
141
- signal: this.preparationController.signal,
142
- reportFailure: this.cleanupFailureReporter,
143
- })
144
- : null;
145
- const engineStart = Promise.resolve(
146
- this.engineAdapter.start({
147
- request,
148
- profile: this.profile,
149
- ...(prepareArtifacts ? { prepareArtifacts } : {}),
150
- clusterId,
151
- onEvent: this.onEngineEvent,
152
- })
153
- );
154
- const resource = await Promise.race([engineStart, this.terminalClaimed]);
155
- if (resource === CANCELLED) {
156
- if (!this.machine.terminalReceipt) await this.machine.result();
157
- return this.machine.status();
158
- }
159
- if (resource?.clusterId && resource.clusterId !== clusterId) {
160
- throw new Error('Engine allocated a cluster with a different id');
161
- }
162
- if (request.source === 'artifact' && resource?.artifactsStaged !== true) {
163
- throw new Error('Engine started without staging artifact input');
164
- }
165
- if (this.machine.state === 'starting') this.machine.transition('running');
166
- return this.machine.status();
137
+ const resource = await Promise.race([
138
+ createEngineStart(this, request, clusterId),
139
+ this.terminalClaimed,
140
+ ]);
141
+ const status = await acceptEngineStart(this, resource, request, clusterId);
142
+ return status;
167
143
  } catch (error) {
168
- if (this.claimTerminalAuthority('engine:start')) {
169
- this.machine.terminal(this.failureReceipt('failed', 'crash', 'declared_failure'));
170
- }
171
- await this.stopEngine();
172
- if (this.terminalAuthority !== 'engine:start' && !this.machine.terminalReceipt) {
173
- await this.machine.result();
174
- return this.machine.status();
175
- }
176
- throw error;
144
+ return handleEngineStartFailure(this, error);
177
145
  }
178
146
  }
179
147
  beginLifecycle() {
@@ -187,7 +155,7 @@ class LegacyClusterWorkerRuntime {
187
155
  this.armExecutionTimeout(this.initialExecutionBound());
188
156
  return clusterId;
189
157
  }
190
- async start(request) {
158
+ claimStartRequest(request) {
191
159
  if (this.startClaimed) throw new Error('Worker facade permits exactly one start');
192
160
  const requestSnapshot = deepFreeze(cloneJson(request));
193
161
  validateLegacyShipRequest(requestSnapshot);
@@ -196,33 +164,43 @@ class LegacyClusterWorkerRuntime {
196
164
  }
197
165
  // Claim synchronously so concurrent calls cannot allocate two resources.
198
166
  this.startClaimed = true;
199
- let clusterId;
167
+ return requestSnapshot;
168
+ }
169
+ resolveStartProfile(request) {
170
+ const profileResolution = this.profileRegistry.resolve(
171
+ request.isolationProfile,
172
+ request.providerProfile,
173
+ Object.freeze({ signal: this.preparationController.signal })
174
+ );
175
+ if (!profileResolution || typeof profileResolution.then !== 'function') {
176
+ this.profile = assertIsolatedProfile(profileResolution, request);
177
+ }
178
+ return profileResolution;
179
+ }
180
+ async handleStartFailure(error) {
181
+ if (this.terminalAuthority !== null) {
182
+ if (!this.machine.terminalReceipt) await this.machine.result();
183
+ return this.machine.status();
184
+ }
185
+ if (!this.machine.clusterId) {
186
+ this.startClaimed = false;
187
+ throw error;
188
+ }
189
+ if (this.claimTerminalAuthority('engine:start-setup')) {
190
+ this.machine.terminal(this.failureReceipt('failed', 'crash', 'declared_failure'));
191
+ }
192
+ throw error;
193
+ }
194
+ async start(request) {
195
+ const requestSnapshot = this.claimStartRequest(request);
200
196
  try {
201
- const profileResolution = this.profileRegistry.resolve(
202
- requestSnapshot.isolationProfile,
203
- requestSnapshot.providerProfile,
204
- Object.freeze({ signal: this.preparationController.signal })
205
- );
206
- if (!profileResolution || typeof profileResolution.then !== 'function') {
207
- this.profile = assertIsolatedProfile(profileResolution, requestSnapshot);
208
- }
209
- clusterId = this.beginLifecycle();
197
+ const profileResolution = this.resolveStartProfile(requestSnapshot);
198
+ const clusterId = this.beginLifecycle();
210
199
  const prepared = await this.prepareStart(requestSnapshot, clusterId, profileResolution);
211
200
  if (prepared === CANCELLED) return this.machine.status();
212
201
  return this.startEngine(requestSnapshot, clusterId);
213
202
  } catch (error) {
214
- if (this.terminalAuthority !== null) {
215
- if (!this.machine.terminalReceipt) await this.machine.result();
216
- return this.machine.status();
217
- }
218
- if (!this.machine.clusterId) {
219
- this.startClaimed = false;
220
- throw error;
221
- }
222
- if (this.machine.clusterId && this.claimTerminalAuthority('engine:start-setup')) {
223
- this.machine.terminal(this.failureReceipt('failed', 'crash', 'declared_failure'));
224
- }
225
- throw error;
203
+ return this.handleStartFailure(error);
226
204
  }
227
205
  }
228
206
  status() {
@@ -283,6 +261,10 @@ class LegacyClusterWorkerRuntime {
283
261
  }
284
262
  }
285
263
 
264
+ function createCurrentEngineAdapter(...args) {
265
+ return require('./engine-adapter').createCurrentEngineAdapter(...args);
266
+ }
267
+
286
268
  function createLegacyClusterWorker(dependencies = {}) {
287
269
  return createWorkerFacade(new LegacyClusterWorkerRuntime(dependencies));
288
270
  }
@@ -24,44 +24,6 @@ const DEFAULT_PROVIDER_PROFILES = Object.freeze({
24
24
  }),
25
25
  });
26
26
 
27
- const HOSTED_CODEX_OPENROUTER_PROFILE = 'provider.codex-openrouter@1';
28
- const HOSTED_CODEX_OPENROUTER_PR_PROFILE = 'provider.codex-openrouter-pr@1';
29
- const DEFAULT_HOSTED_MODEL = 'openai/gpt-5.4';
30
-
31
- function providerProfilesFromEnvironment(environment = process.env) {
32
- if (environment.ZEROSHOT_HOSTED_CODEX_OPENROUTER !== '1') {
33
- return DEFAULT_PROVIDER_PROFILES;
34
- }
35
- const model = environment.ZEROSHOT_HOSTED_MODEL || DEFAULT_HOSTED_MODEL;
36
- const levelOverrides = Object.freeze({
37
- level1: Object.freeze({ model, reasoningEffort: 'medium' }),
38
- level2: Object.freeze({ model, reasoningEffort: 'high' }),
39
- level3: Object.freeze({ model, reasoningEffort: 'xhigh' }),
40
- });
41
- const hostedSettings = {
42
- templateParams: { task_type: 'TASK' },
43
- providerSettings: {
44
- codex: {
45
- defaultLevel: 'level2',
46
- levelOverrides,
47
- },
48
- },
49
- };
50
- return deepFreeze({
51
- ...DEFAULT_PROVIDER_PROFILES,
52
- [HOSTED_CODEX_OPENROUTER_PROFILE]: {
53
- configName: 'base-templates/single-worker',
54
- providerOverride: 'codex',
55
- settings: hostedSettings,
56
- },
57
- [HOSTED_CODEX_OPENROUTER_PR_PROFILE]: {
58
- configName: 'base-templates/worker-validator',
59
- providerOverride: 'codex',
60
- settings: hostedSettings,
61
- },
62
- });
63
- }
64
-
65
27
  function own(map, key) {
66
28
  return Object.prototype.hasOwnProperty.call(map, key) ? map[key] : null;
67
29
  }
@@ -76,7 +38,7 @@ function validateBounds(bounds) {
76
38
 
77
39
  function createDeploymentProfileRegistry(options = {}) {
78
40
  const isolationProfiles = options.isolationProfiles || DEFAULT_ISOLATION_PROFILES;
79
- const providerProfiles = options.providerProfiles || providerProfilesFromEnvironment();
41
+ const providerProfiles = options.providerProfiles || DEFAULT_PROVIDER_PROFILES;
80
42
  const defaultBounds = { ...DEFAULT_BOUNDS, ...(options.bounds || {}) };
81
43
  validateBounds(defaultBounds);
82
44
  const bounds = deepFreeze(defaultBounds);
@@ -115,8 +77,5 @@ module.exports = {
115
77
  DEFAULT_BOUNDS,
116
78
  DEFAULT_ISOLATION_PROFILES,
117
79
  DEFAULT_PROVIDER_PROFILES,
118
- HOSTED_CODEX_OPENROUTER_PROFILE,
119
- HOSTED_CODEX_OPENROUTER_PR_PROFILE,
120
80
  createDeploymentProfileRegistry,
121
- providerProfilesFromEnvironment,
122
81
  };
@@ -0,0 +1,49 @@
1
+ 'use strict';
2
+
3
+ const { randomUUID } = require('crypto');
4
+ const { createDeploymentProfileRegistry } = require('./profiles');
5
+
6
+ const DEPENDENCY_KEYS = new Set([
7
+ 'profileRegistry',
8
+ 'artifactResolver',
9
+ 'artifactReceiptSink',
10
+ 'engineAdapter',
11
+ 'clock',
12
+ 'timers',
13
+ 'idFactory',
14
+ 'cleanupFailureReporter',
15
+ ]);
16
+
17
+ function assertRuntimeDependencies(dependencies) {
18
+ const unknownDependencies = Object.keys(dependencies).filter((key) => !DEPENDENCY_KEYS.has(key));
19
+ if (unknownDependencies.length > 0) {
20
+ throw new Error(`Unsupported worker dependencies: ${unknownDependencies.join(', ')}`);
21
+ }
22
+ if (
23
+ dependencies.cleanupFailureReporter !== undefined &&
24
+ typeof dependencies.cleanupFailureReporter !== 'function'
25
+ ) {
26
+ throw new Error('cleanupFailureReporter must be a function');
27
+ }
28
+ }
29
+
30
+ function applyRuntimeDependencyDefaults(dependencies, defaultCleanupFailureReporter) {
31
+ return {
32
+ profileRegistry: dependencies.profileRegistry || createDeploymentProfileRegistry(),
33
+ artifactResolver: dependencies.artifactResolver || null,
34
+ artifactReceiptSink: dependencies.artifactReceiptSink || null,
35
+ engineAdapter:
36
+ dependencies.engineAdapter || require('./engine-adapter').createCurrentEngineAdapter(),
37
+ clock: dependencies.clock || (() => Date.now()),
38
+ timers: dependencies.timers || { setTimeout, clearTimeout },
39
+ idFactory: dependencies.idFactory || (() => `legacy-worker-${randomUUID()}`),
40
+ cleanupFailureReporter: dependencies.cleanupFailureReporter || defaultCleanupFailureReporter,
41
+ };
42
+ }
43
+
44
+ function resolveRuntimeDependencies(dependencies, defaultCleanupFailureReporter) {
45
+ assertRuntimeDependencies(dependencies);
46
+ return applyRuntimeDependencyDefaults(dependencies, defaultCleanupFailureReporter);
47
+ }
48
+
49
+ module.exports = { resolveRuntimeDependencies };
@@ -1,25 +1,12 @@
1
1
  'use strict';
2
2
 
3
- const { randomUUID } = require('crypto');
4
3
  const { validateArtifactRef, validateWorkerOutcome } = require('./contracts');
5
- const { createCurrentEngineAdapter } = require('./engine-adapter');
6
4
  const { cloneJson, deepFreeze } = require('./object-utils');
7
- const { createDeploymentProfileRegistry } = require('./profiles');
8
5
  const { resolveRunPlan } = require('../run-plan');
6
+ const { resolveRuntimeDependencies: resolveDependencies } = require('./runtime-dependencies');
9
7
 
10
8
  const CANCELLED = Symbol('cancelled');
11
9
 
12
- const DEPENDENCY_KEYS = new Set([
13
- 'profileRegistry',
14
- 'artifactResolver',
15
- 'artifactReceiptSink',
16
- 'engineAdapter',
17
- 'clock',
18
- 'timers',
19
- 'idFactory',
20
- 'cleanupFailureReporter',
21
- ]);
22
-
23
10
  async function stageArtifacts(resolver, artifacts, context) {
24
11
  if (artifacts.length === 0) return deepFreeze({ artifacts: [] });
25
12
  if (context.signal?.aborted) return CANCELLED;
@@ -200,26 +187,7 @@ async function stopEngineWithinBound({ engineAdapter, timers, shutdownMs }) {
200
187
  }
201
188
 
202
189
  function resolveRuntimeDependencies(dependencies) {
203
- const unknownDependencies = Object.keys(dependencies).filter((key) => !DEPENDENCY_KEYS.has(key));
204
- if (unknownDependencies.length > 0) {
205
- throw new Error(`Unsupported worker dependencies: ${unknownDependencies.join(', ')}`);
206
- }
207
- if (
208
- dependencies.cleanupFailureReporter !== undefined &&
209
- typeof dependencies.cleanupFailureReporter !== 'function'
210
- ) {
211
- throw new Error('cleanupFailureReporter must be a function');
212
- }
213
- return {
214
- profileRegistry: dependencies.profileRegistry || createDeploymentProfileRegistry(),
215
- artifactResolver: dependencies.artifactResolver || null,
216
- artifactReceiptSink: dependencies.artifactReceiptSink || null,
217
- engineAdapter: dependencies.engineAdapter || createCurrentEngineAdapter(),
218
- clock: dependencies.clock || (() => Date.now()),
219
- timers: dependencies.timers || { setTimeout, clearTimeout },
220
- idFactory: dependencies.idFactory || (() => `legacy-worker-${randomUUID()}`),
221
- cleanupFailureReporter: dependencies.cleanupFailureReporter || defaultCleanupFailureReporter,
222
- };
190
+ return resolveDependencies(dependencies, defaultCleanupFailureReporter);
223
191
  }
224
192
 
225
193
  function assertProfilePlan(profile) {
@@ -5,17 +5,16 @@ const { cloneJson, deepFreeze } = require('./object-utils');
5
5
  const { collectReceipts } = require('./runtime-support');
6
6
 
7
7
  async function resultFromEvent(event, options) {
8
- let summary;
9
- let status = 'succeeded';
10
- let declaredArtifacts = event.artifacts;
8
+ let result;
9
+ let declaredArtifacts;
11
10
  if (Object.prototype.hasOwnProperty.call(event, 'result')) {
12
11
  validateLegacyShipResult(event.result);
13
- summary = event.result.summary;
14
- status = event.result.status;
12
+ result = event.result;
15
13
  declaredArtifacts = event.result.artifacts;
16
14
  } else {
17
- summary = event.summary;
18
- validateLegacyShipResult({ summary, status, artifacts: [] });
15
+ result = { summary: event.summary, status: 'succeeded', artifacts: [] };
16
+ validateLegacyShipResult(result);
17
+ declaredArtifacts = [];
19
18
  }
20
19
  const artifacts = await collectReceipts(options.artifactReceiptSink, declaredArtifacts, {
21
20
  clusterId: options.machine.clusterId,
@@ -24,9 +23,9 @@ async function resultFromEvent(event, options) {
24
23
  reportCleanupFailure: options.cleanupFailureReporter,
25
24
  });
26
25
  if (artifacts === options.cancelled) return options.cancelled;
27
- const result = { summary, status, artifacts };
28
- validateLegacyShipResult(result);
29
- return result;
26
+ const normalized = { ...result, artifacts };
27
+ validateLegacyShipResult(normalized);
28
+ return normalized;
30
29
  }
31
30
 
32
31
  function createTerminalNormalizer(options) {
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizedAuthority = normalizedAuthority;
4
+ exports.validateHostedAccess = validateHostedAccess;
5
+ const index_js_1 = require("../cluster/index.cjs");
6
+ const LOOPBACK_HOSTS = Object.freeze({
7
+ '127.0.0.1': true,
8
+ '::1': true,
9
+ '[::1]': true,
10
+ });
11
+ function parseCanonicalUrl(value, message, code) {
12
+ try {
13
+ if (/[\u0000-\u0020\u007f]/.test(value))
14
+ throw new TypeError('unsafe URL code point');
15
+ const url = new URL(value);
16
+ if (url.href !== value && url.origin !== value)
17
+ throw new TypeError('non-canonical URL');
18
+ return url;
19
+ }
20
+ catch {
21
+ throw new index_js_1.ClusterConfigError(message, code);
22
+ }
23
+ }
24
+ function hasOriginSuffix(url) {
25
+ return Boolean(url.username ||
26
+ url.password ||
27
+ url.pathname !== '/' ||
28
+ url.search ||
29
+ url.hash);
30
+ }
31
+ function normalizedAuthority(value) {
32
+ const message = 'targetAuthority must be an HTTPS or literal-loopback HTTP origin';
33
+ const url = parseCanonicalUrl(value, message, 'INVALID_TARGET_AUTHORITY');
34
+ const loopbackHttp = url.protocol === 'http:' && LOOPBACK_HOSTS[url.hostname] === true;
35
+ if ((url.protocol !== 'https:' && !loopbackHttp) || hasOriginSuffix(url) ||
36
+ value !== url.origin) {
37
+ throw new index_js_1.ClusterConfigError(message, 'INVALID_TARGET_AUTHORITY');
38
+ }
39
+ return url.origin;
40
+ }
41
+ function accessAuthorityMatches(endpoint, target) {
42
+ const expectedProtocol = target.protocol === 'http:' ? 'ws:' : 'wss:';
43
+ return (endpoint.protocol === expectedProtocol &&
44
+ endpoint.host === target.host &&
45
+ !endpoint.username &&
46
+ !endpoint.password &&
47
+ !endpoint.search &&
48
+ !endpoint.hash);
49
+ }
50
+ function validateHostedAccess(access, targetAuthority) {
51
+ const endpoint = parseCanonicalUrl(access.websocketUrl, 'access endpoint must be an absolute target WebSocket URL', 'INVALID_ACCESS_ENDPOINT');
52
+ if (endpoint.href !== access.websocketUrl ||
53
+ !accessAuthorityMatches(endpoint, new URL(targetAuthority))) {
54
+ throw new index_js_1.ClusterConfigError('access endpoint must remain on the exact target authority', 'INVALID_ACCESS_ENDPOINT');
55
+ }
56
+ if (access.protocol !== 'openengine.cluster/v1' ||
57
+ access.tokenType !== 'Bearer' ||
58
+ access.accessToken.length === 0) {
59
+ throw new index_js_1.ClusterConfigError('access grant does not match the hosted session contract', 'INVALID_ACCESS_GRANT');
60
+ }
61
+ }
@@ -0,0 +1,3 @@
1
+ import type { HostedAccess } from './types.js';
2
+ export declare function normalizedAuthority(value: string): string;
3
+ export declare function validateHostedAccess(access: HostedAccess, targetAuthority: string): void;
@@ -0,0 +1,3 @@
1
+ import type { HostedAccess } from './types.js';
2
+ export declare function normalizedAuthority(value: string): string;
3
+ export declare function validateHostedAccess(access: HostedAccess, targetAuthority: string): void;
@@ -0,0 +1,3 @@
1
+ import type { HostedAccess } from './types.js';
2
+ export declare function normalizedAuthority(value: string): string;
3
+ export declare function validateHostedAccess(access: HostedAccess, targetAuthority: string): void;