@wirebench/engine 2.2.1 → 3.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (566) hide show
  1. package/README.md +134 -1
  2. package/dist/account/schema.d.ts +34 -0
  3. package/dist/account/schema.js +29 -0
  4. package/dist/assert/callback.d.ts +76 -0
  5. package/dist/assert/callback.js +320 -0
  6. package/dist/assert/capture-source.d.ts +50 -0
  7. package/dist/assert/capture-source.js +89 -0
  8. package/dist/assert/check.d.ts +8 -0
  9. package/dist/assert/check.js +18 -0
  10. package/dist/assert/header.d.ts +5 -0
  11. package/dist/assert/header.js +48 -0
  12. package/dist/assert/index.d.ts +2 -2
  13. package/dist/assert/index.js +12 -0
  14. package/dist/assert/match.d.ts +6 -0
  15. package/dist/assert/match.js +13 -4
  16. package/dist/assert/model.d.ts +110 -3
  17. package/dist/assert/model.js +16 -1
  18. package/dist/assert/schema.d.ts +194 -1
  19. package/dist/assert/schema.js +154 -12
  20. package/dist/assert/status-names.d.ts +9 -0
  21. package/dist/assert/status-names.js +27 -0
  22. package/dist/assert/status.d.ts +4 -1
  23. package/dist/assert/status.js +27 -3
  24. package/dist/asyncapi/browser.d.ts +7 -0
  25. package/dist/asyncapi/browser.js +6 -0
  26. package/dist/asyncapi/frame-check-worker-host.d.ts +44 -0
  27. package/dist/asyncapi/frame-check-worker-host.js +175 -0
  28. package/dist/asyncapi/frame-check-worker.d.ts +12 -0
  29. package/dist/asyncapi/frame-check-worker.js +25 -0
  30. package/dist/asyncapi/frame-check.d.ts +25 -0
  31. package/dist/asyncapi/frame-check.js +78 -0
  32. package/dist/asyncapi/import.d.ts +25 -0
  33. package/dist/asyncapi/import.js +34 -0
  34. package/dist/asyncapi/map.d.ts +40 -0
  35. package/dist/asyncapi/map.js +230 -0
  36. package/dist/asyncapi/model.d.ts +84 -0
  37. package/dist/asyncapi/model.js +7 -0
  38. package/dist/asyncapi/normalise-2.d.ts +13 -0
  39. package/dist/asyncapi/normalise-2.js +113 -0
  40. package/dist/asyncapi/normalise-3.d.ts +14 -0
  41. package/dist/asyncapi/normalise-3.js +133 -0
  42. package/dist/asyncapi/parse.d.ts +31 -0
  43. package/dist/asyncapi/parse.js +85 -0
  44. package/dist/asyncapi/read.d.ts +35 -0
  45. package/dist/asyncapi/read.js +186 -0
  46. package/dist/asyncapi/security.d.ts +14 -0
  47. package/dist/asyncapi/security.js +55 -0
  48. package/dist/asyncapi/update.d.ts +53 -0
  49. package/dist/asyncapi/update.js +220 -0
  50. package/dist/errors.d.ts +16 -0
  51. package/dist/errors.js +22 -0
  52. package/dist/grpc/events.d.ts +22 -0
  53. package/dist/grpc/events.js +1 -0
  54. package/dist/grpc/expand.d.ts +1 -1
  55. package/dist/grpc/expand.js +15 -5
  56. package/dist/grpc/files.d.ts +271 -0
  57. package/dist/grpc/files.js +62 -0
  58. package/dist/grpc/model.d.ts +11 -1
  59. package/dist/grpc/module.d.ts +2 -0
  60. package/dist/grpc/module.js +13 -0
  61. package/dist/grpc/run.d.ts +73 -0
  62. package/dist/grpc/run.js +407 -0
  63. package/dist/grpc/script-types.d.ts +8 -0
  64. package/dist/grpc/script-types.js +149 -0
  65. package/dist/grpc/scripting.d.ts +34 -0
  66. package/dist/grpc/scripting.js +147 -0
  67. package/dist/grpc/send-input.d.ts +46 -0
  68. package/dist/grpc/send-input.js +42 -0
  69. package/dist/grpc/send.d.ts +2 -2
  70. package/dist/grpc/status.d.ts +9 -2
  71. package/dist/grpc/status.js +11 -24
  72. package/dist/grpc/storage.d.ts +9 -0
  73. package/dist/grpc/storage.js +167 -0
  74. package/dist/{rest/auth.d.ts → http/auth/apply-auth.d.ts} +4 -4
  75. package/dist/{rest/auth.js → http/auth/apply-auth.js} +1 -1
  76. package/dist/http/auth/apply.d.ts +1 -1
  77. package/dist/{rest → http/auth}/oauth2.d.ts +2 -2
  78. package/dist/{rest → http/auth}/oauth2.js +1 -1
  79. package/dist/http/auth/send-auth.d.ts +57 -0
  80. package/dist/http/auth/send-auth.js +7 -0
  81. package/dist/http/client.js +150 -8
  82. package/dist/http/cookies.d.ts +79 -0
  83. package/dist/http/cookies.js +81 -0
  84. package/dist/http/curl.d.ts +4 -14
  85. package/dist/http/curl.js +4 -154
  86. package/dist/http/decompress.d.ts +7 -0
  87. package/dist/http/decompress.js +23 -1
  88. package/dist/http/document-fetch.d.ts +42 -0
  89. package/dist/http/document-fetch.js +207 -0
  90. package/dist/http/entries.d.ts +27 -0
  91. package/dist/http/entries.js +16 -0
  92. package/dist/http/escape.d.ts +18 -0
  93. package/dist/http/escape.js +30 -0
  94. package/dist/http/fetch-document.d.ts +28 -0
  95. package/dist/{wsdl/fetch.js → http/fetch-document.js} +8 -16
  96. package/dist/http/media-type.d.ts +9 -0
  97. package/dist/http/media-type.js +12 -0
  98. package/dist/http/transcript-cap.d.ts +26 -0
  99. package/dist/http/transcript-cap.js +36 -0
  100. package/dist/http/types.d.ts +59 -0
  101. package/dist/http/webhook-signature.d.ts +81 -0
  102. package/dist/http/webhook-signature.js +227 -0
  103. package/dist/import-detect.d.ts +2 -2
  104. package/dist/import-detect.js +10 -1
  105. package/dist/index.d.ts +207 -55
  106. package/dist/index.js +129 -32
  107. package/dist/json/cursor.d.ts +2 -0
  108. package/dist/json/cursor.js +1 -0
  109. package/dist/json/pointer-range.d.ts +18 -0
  110. package/dist/json/pointer-range.js +157 -0
  111. package/dist/json/schema/model.d.ts +59 -0
  112. package/dist/json/schema/model.js +8 -0
  113. package/dist/json/schema/parse-text.d.ts +16 -0
  114. package/dist/json/schema/parse-text.js +37 -0
  115. package/dist/{rest/openapi → json/schema}/refs.d.ts +2 -2
  116. package/dist/{rest/openapi → json/schema}/refs.js +3 -3
  117. package/dist/{rest/openapi → json/schema}/sample.d.ts +4 -0
  118. package/dist/{rest/openapi → json/schema}/sample.js +2 -2
  119. package/dist/json/schema/source.d.ts +21 -0
  120. package/dist/json/schema/source.js +8 -0
  121. package/dist/json/schema-validate.d.ts +49 -0
  122. package/dist/json/schema-validate.js +557 -0
  123. package/dist/{wss/keystore → keystore}/index.js +1 -1
  124. package/dist/{wss/keystore → keystore}/pem.js +1 -1
  125. package/dist/{wss/keystore → keystore}/pkcs12.js +1 -1
  126. package/dist/project/attachments-cache.d.ts +3 -1
  127. package/dist/{wsdl → project}/cache-naming.js +1 -1
  128. package/dist/project/endpoints.d.ts +18 -8
  129. package/dist/project/endpoints.js +21 -6
  130. package/dist/project/environments.d.ts +7 -5
  131. package/dist/project/history.d.ts +105 -9
  132. package/dist/project/history.js +195 -23
  133. package/dist/project/inherit.d.ts +7 -0
  134. package/dist/project/inherit.js +9 -0
  135. package/dist/project/keystores.d.ts +1 -1
  136. package/dist/project/load-helpers.d.ts +89 -0
  137. package/dist/project/load-helpers.js +177 -0
  138. package/dist/project/load.d.ts +30 -4
  139. package/dist/project/load.js +168 -545
  140. package/dist/project/managed-files.d.ts +36 -0
  141. package/dist/project/managed-files.js +97 -0
  142. package/dist/project/migrate.d.ts +2 -2
  143. package/dist/project/migrate.js +2 -2
  144. package/dist/project/model.d.ts +92 -14
  145. package/dist/project/model.js +50 -4
  146. package/dist/project/paths.d.ts +10 -1
  147. package/dist/project/paths.js +10 -1
  148. package/dist/project/preferences.d.ts +11 -2
  149. package/dist/project/preferences.js +5 -1
  150. package/dist/project/properties.d.ts +31 -17
  151. package/dist/project/properties.js +89 -70
  152. package/dist/project/request-location.d.ts +20 -0
  153. package/dist/project/request-location.js +62 -0
  154. package/dist/project/save.d.ts +12 -2
  155. package/dist/project/save.js +186 -141
  156. package/dist/project/schema-parts.d.ts +337 -0
  157. package/dist/project/schema-parts.js +248 -0
  158. package/dist/project/schema.d.ts +72 -928
  159. package/dist/project/schema.js +17 -466
  160. package/dist/project/sequence-guards.d.ts +43 -0
  161. package/dist/project/sequence-guards.js +109 -0
  162. package/dist/project/serialize-helpers.d.ts +60 -0
  163. package/dist/project/serialize-helpers.js +108 -0
  164. package/dist/project/serialize.d.ts +7 -8
  165. package/dist/project/serialize.js +34 -293
  166. package/dist/protocol/features.d.ts +51 -0
  167. package/dist/protocol/features.js +64 -0
  168. package/dist/protocol/index.d.ts +7 -0
  169. package/dist/protocol/index.js +4 -0
  170. package/dist/protocol/module.d.ts +247 -0
  171. package/dist/protocol/module.js +48 -0
  172. package/dist/protocol/registry.d.ts +42 -0
  173. package/dist/protocol/registry.js +47 -0
  174. package/dist/protocols.d.ts +77 -0
  175. package/dist/protocols.js +40 -0
  176. package/dist/redact/index.d.ts +12 -1
  177. package/dist/redact/index.js +55 -7
  178. package/dist/redact/literal.d.ts +10 -0
  179. package/dist/redact/literal.js +110 -12
  180. package/dist/rest/body.d.ts +2 -10
  181. package/dist/rest/body.js +3 -25
  182. package/dist/rest/browser.d.ts +4 -0
  183. package/dist/rest/browser.js +5 -0
  184. package/dist/rest/contract-check-worker-host.d.ts +36 -0
  185. package/dist/rest/contract-check-worker-host.js +158 -0
  186. package/dist/rest/contract-check-worker.d.ts +7 -0
  187. package/dist/rest/contract-check-worker.js +28 -0
  188. package/dist/rest/contract-check.d.ts +43 -0
  189. package/dist/rest/contract-check.js +217 -0
  190. package/dist/rest/cookie-jar.d.ts +62 -0
  191. package/dist/rest/cookie-jar.js +262 -0
  192. package/dist/rest/cookies.d.ts +6 -22
  193. package/dist/rest/cookies.js +6 -42
  194. package/dist/rest/curl.js +5 -1
  195. package/dist/rest/events.d.ts +12 -0
  196. package/dist/rest/events.js +1 -0
  197. package/dist/rest/expand.d.ts +6 -1
  198. package/dist/rest/expand.js +29 -11
  199. package/dist/rest/files.d.ts +439 -0
  200. package/dist/rest/files.js +107 -0
  201. package/dist/rest/json-form.d.ts +97 -0
  202. package/dist/rest/json-form.js +396 -0
  203. package/dist/rest/model.d.ts +35 -24
  204. package/dist/rest/model.js +6 -9
  205. package/dist/rest/module.d.ts +2 -0
  206. package/dist/rest/module.js +13 -0
  207. package/dist/rest/openapi/cache.d.ts +7 -2
  208. package/dist/rest/openapi/cache.js +2 -2
  209. package/dist/rest/openapi/import.d.ts +11 -16
  210. package/dist/rest/openapi/import.js +6 -2
  211. package/dist/rest/openapi/map.d.ts +38 -1
  212. package/dist/rest/openapi/map.js +151 -41
  213. package/dist/rest/openapi/match.d.ts +20 -0
  214. package/dist/rest/openapi/match.js +117 -0
  215. package/dist/rest/openapi/model.d.ts +33 -45
  216. package/dist/rest/openapi/parse.d.ts +3 -12
  217. package/dist/rest/openapi/parse.js +138 -67
  218. package/dist/rest/openapi/responses.d.ts +23 -0
  219. package/dist/rest/openapi/responses.js +59 -0
  220. package/dist/rest/openapi/runtime-expression.d.ts +69 -0
  221. package/dist/rest/openapi/runtime-expression.js +213 -0
  222. package/dist/rest/openapi/update.d.ts +116 -0
  223. package/dist/rest/openapi/update.js +456 -0
  224. package/dist/rest/postman/map.d.ts +1 -0
  225. package/dist/rest/postman/map.js +66 -4
  226. package/dist/rest/postman/model.d.ts +9 -0
  227. package/dist/rest/postman/parse.js +33 -10
  228. package/dist/rest/response.d.ts +2 -23
  229. package/dist/rest/response.js +3 -75
  230. package/dist/rest/run.d.ts +56 -0
  231. package/dist/rest/run.js +395 -0
  232. package/dist/rest/script-types.d.ts +7 -0
  233. package/dist/rest/script-types.js +83 -0
  234. package/dist/rest/scripting.d.ts +38 -0
  235. package/dist/rest/scripting.js +282 -0
  236. package/dist/rest/send-input.d.ts +54 -0
  237. package/dist/rest/send-input.js +73 -0
  238. package/dist/rest/send.d.ts +77 -4
  239. package/dist/rest/send.js +128 -7
  240. package/dist/rest/sse-transcript.d.ts +25 -0
  241. package/dist/rest/sse-transcript.js +95 -0
  242. package/dist/rest/sse.d.ts +43 -0
  243. package/dist/rest/sse.js +195 -0
  244. package/dist/rest/storage.d.ts +26 -0
  245. package/dist/rest/storage.js +262 -0
  246. package/dist/rest/url.d.ts +10 -4
  247. package/dist/rest/url.js +38 -5
  248. package/dist/run/baseline-update.d.ts +35 -0
  249. package/dist/run/baseline-update.js +97 -0
  250. package/dist/run/baseline.d.ts +42 -0
  251. package/dist/run/baseline.js +93 -0
  252. package/dist/run/context.d.ts +86 -0
  253. package/dist/run/context.js +31 -0
  254. package/dist/run/current-values.d.ts +32 -0
  255. package/dist/run/current-values.js +43 -0
  256. package/dist/run/event-queue.d.ts +14 -0
  257. package/dist/run/event-queue.js +46 -0
  258. package/dist/run/exchange.d.ts +62 -0
  259. package/dist/run/exchange.js +65 -0
  260. package/dist/run/host.d.ts +89 -0
  261. package/dist/run/host.js +1 -0
  262. package/dist/run/index.d.ts +20 -7
  263. package/dist/run/index.js +12 -4
  264. package/dist/run/oauth2-token.d.ts +42 -0
  265. package/dist/run/oauth2-token.js +92 -0
  266. package/dist/run/open.d.ts +12 -0
  267. package/dist/run/open.js +16 -0
  268. package/dist/run/run.d.ts +124 -4
  269. package/dist/run/run.js +293 -134
  270. package/dist/run/scope.d.ts +11 -0
  271. package/dist/run/scope.js +26 -0
  272. package/dist/run/script-support.d.ts +53 -0
  273. package/dist/run/script-support.js +68 -0
  274. package/dist/run/secret-needs.d.ts +11 -4
  275. package/dist/run/secret-needs.js +48 -96
  276. package/dist/run/select.d.ts +34 -25
  277. package/dist/run/select.js +45 -54
  278. package/dist/run/send-helpers.d.ts +93 -0
  279. package/dist/run/send-helpers.js +255 -0
  280. package/dist/run/tree.d.ts +50 -0
  281. package/dist/run/tree.js +54 -0
  282. package/dist/script/api/postman.d.ts +10 -0
  283. package/dist/script/api/postman.js +264 -0
  284. package/dist/script/api/prelude.d.ts +20 -0
  285. package/dist/script/api/prelude.js +215 -0
  286. package/dist/script/apply.d.ts +44 -0
  287. package/dist/script/apply.js +120 -0
  288. package/dist/script/check/host.d.ts +41 -0
  289. package/dist/script/check/host.js +143 -0
  290. package/dist/script/check/service.d.ts +52 -0
  291. package/dist/script/check/service.js +195 -0
  292. package/dist/script/check/worker.d.ts +1 -0
  293. package/dist/script/check/worker.js +40 -0
  294. package/dist/script/index.d.ts +16 -0
  295. package/dist/script/index.js +10 -0
  296. package/dist/script/lookup.d.ts +10 -0
  297. package/dist/script/lookup.js +23 -0
  298. package/dist/script/model.d.ts +82 -0
  299. package/dist/script/model.js +18 -0
  300. package/dist/script/props.d.ts +8 -0
  301. package/dist/script/props.js +28 -0
  302. package/dist/script/request-scripts.d.ts +83 -0
  303. package/dist/script/request-scripts.js +160 -0
  304. package/dist/script/run.d.ts +47 -0
  305. package/dist/script/run.js +146 -0
  306. package/dist/script/sandbox/execute.d.ts +26 -0
  307. package/dist/script/sandbox/execute.js +212 -0
  308. package/dist/script/sandbox/host-api.d.ts +27 -0
  309. package/dist/script/sandbox/host-api.js +101 -0
  310. package/dist/script/sandbox/host.d.ts +18 -0
  311. package/dist/script/sandbox/host.js +172 -0
  312. package/dist/script/sandbox/model.d.ts +69 -0
  313. package/dist/script/sandbox/model.js +24 -0
  314. package/dist/script/sandbox/worker.d.ts +1 -0
  315. package/dist/script/sandbox/worker.js +20 -0
  316. package/dist/script/send.d.ts +27 -0
  317. package/dist/script/send.js +76 -0
  318. package/dist/script/strip.d.ts +5 -0
  319. package/dist/script/strip.js +43 -0
  320. package/dist/script/types/api.d.ts +38 -0
  321. package/dist/script/types/api.js +113 -0
  322. package/dist/script/types/json-schema.d.ts +26 -0
  323. package/dist/script/types/json-schema.js +206 -0
  324. package/dist/secrets/env-names.d.ts +9 -1
  325. package/dist/secrets/env-names.js +17 -1
  326. package/dist/secrets/resolve.d.ts +44 -4
  327. package/dist/secrets/resolve.js +58 -1
  328. package/dist/secrets/scan/apply.d.ts +36 -0
  329. package/dist/secrets/scan/apply.js +194 -0
  330. package/dist/secrets/scan/rules.d.ts +32 -0
  331. package/dist/secrets/scan/rules.js +346 -0
  332. package/dist/secrets/scan/scan.d.ts +6 -0
  333. package/dist/secrets/scan/scan.js +57 -0
  334. package/dist/secrets/scan/walk.d.ts +70 -0
  335. package/dist/secrets/scan/walk.js +156 -0
  336. package/dist/secrets/secret-refs.d.ts +8 -0
  337. package/dist/secrets/secret-refs.js +25 -0
  338. package/dist/secrets/secret-token.d.ts +17 -0
  339. package/dist/secrets/secret-token.js +25 -0
  340. package/dist/sequence/file.d.ts +169 -0
  341. package/dist/sequence/file.js +237 -0
  342. package/dist/sequence/index.d.ts +7 -0
  343. package/dist/sequence/index.js +5 -0
  344. package/dist/sequence/load.d.ts +32 -0
  345. package/dist/sequence/load.js +56 -0
  346. package/dist/sequence/model.d.ts +115 -0
  347. package/dist/sequence/model.js +53 -0
  348. package/dist/sequence/run.d.ts +131 -0
  349. package/dist/sequence/run.js +191 -0
  350. package/dist/sequence/transfer.d.ts +24 -0
  351. package/dist/sequence/transfer.js +75 -0
  352. package/dist/server-api/audit.d.ts +455 -0
  353. package/dist/server-api/audit.js +186 -0
  354. package/dist/server-api/ci-tokens.d.ts +50 -0
  355. package/dist/server-api/ci-tokens.js +35 -0
  356. package/dist/server-api/hooks.d.ts +337 -0
  357. package/dist/server-api/hooks.js +152 -0
  358. package/dist/server-api/identity.d.ts +210 -0
  359. package/dist/server-api/identity.js +115 -0
  360. package/dist/server-api/licensing.d.ts +80 -0
  361. package/dist/server-api/licensing.js +53 -0
  362. package/dist/server-api/live.d.ts +132 -0
  363. package/dist/server-api/live.js +102 -0
  364. package/dist/server-api/meta.d.ts +31 -0
  365. package/dist/server-api/meta.js +21 -0
  366. package/dist/server-api/sync.d.ts +179 -0
  367. package/dist/server-api/sync.js +124 -0
  368. package/dist/server-api/teams.d.ts +306 -0
  369. package/dist/server-api/teams.js +113 -0
  370. package/dist/snapshot/diff.d.ts +30 -0
  371. package/dist/snapshot/diff.js +75 -0
  372. package/dist/snapshot/format.d.ts +17 -0
  373. package/dist/snapshot/format.js +40 -0
  374. package/dist/snapshot/golden-file.d.ts +45 -0
  375. package/dist/snapshot/golden-file.js +173 -0
  376. package/dist/snapshot/ignore.d.ts +14 -0
  377. package/dist/snapshot/ignore.js +79 -0
  378. package/dist/snapshot/index.d.ts +9 -0
  379. package/dist/snapshot/index.js +9 -0
  380. package/dist/snapshot/json-diff.d.ts +3 -0
  381. package/dist/snapshot/json-diff.js +93 -0
  382. package/dist/snapshot/xml-diff.d.ts +10 -0
  383. package/dist/snapshot/xml-diff.js +194 -0
  384. package/dist/soap/auth.d.ts +26 -0
  385. package/dist/soap/auth.js +54 -0
  386. package/dist/soap/curl.d.ts +20 -0
  387. package/dist/soap/curl.js +161 -0
  388. package/dist/soap/expand.d.ts +24 -0
  389. package/dist/soap/expand.js +95 -0
  390. package/dist/soap/files.d.ts +384 -0
  391. package/dist/soap/files.js +114 -0
  392. package/dist/soap/form-request.d.ts +13 -0
  393. package/dist/soap/form-request.js +2 -2
  394. package/dist/soap/generate.d.ts +12 -0
  395. package/dist/{generate.js → soap/generate.js} +4 -4
  396. package/dist/{import.d.ts → soap/import.d.ts} +4 -4
  397. package/dist/{import.js → soap/import.js} +13 -13
  398. package/dist/soap/json-operation.d.ts +35 -0
  399. package/dist/soap/json-operation.js +225 -0
  400. package/dist/soap/legacy-project/env-refs.d.ts +19 -0
  401. package/dist/soap/legacy-project/env-refs.js +105 -0
  402. package/dist/soap/legacy-project/map.d.ts +2 -2
  403. package/dist/soap/legacy-project/map.js +6 -0
  404. package/dist/soap/mime/multipart.d.ts +2 -2
  405. package/dist/soap/mime/multipart.js +2 -5
  406. package/dist/soap/mime/send-pipeline.d.ts +1 -1
  407. package/dist/soap/mime/send-pipeline.js +1 -1
  408. package/dist/soap/mime/types.d.ts +1 -3
  409. package/dist/soap/module.d.ts +2 -0
  410. package/dist/soap/module.js +13 -0
  411. package/dist/soap/namespace-scope.js +1 -1
  412. package/dist/soap/operations.d.ts +12 -0
  413. package/dist/{operations.js → soap/operations.js} +4 -4
  414. package/dist/soap/run.d.ts +70 -0
  415. package/dist/soap/run.js +549 -0
  416. package/dist/soap/script-types.d.ts +65 -0
  417. package/dist/soap/script-types.js +379 -0
  418. package/dist/soap/scripting.d.ts +45 -0
  419. package/dist/soap/scripting.js +221 -0
  420. package/dist/soap/send-input.d.ts +61 -0
  421. package/dist/{send-options.js → soap/send-input.js} +5 -109
  422. package/dist/{send.d.ts → soap/send.d.ts} +1 -1
  423. package/dist/{send.js → soap/send.js} +28 -12
  424. package/dist/soap/storage.d.ts +9 -0
  425. package/dist/soap/storage.js +237 -0
  426. package/dist/soap/transforms.d.ts +3 -12
  427. package/dist/soap/transforms.js +3 -14
  428. package/dist/{types.d.ts → soap/types.d.ts} +34 -84
  429. package/dist/sync/git-cli.d.ts +202 -0
  430. package/dist/sync/git-cli.js +684 -0
  431. package/dist/sync/three-way-merge.d.ts +41 -0
  432. package/dist/sync/three-way-merge.js +85 -0
  433. package/dist/sync/tree-paths.d.ts +34 -0
  434. package/dist/sync/tree-paths.js +131 -0
  435. package/dist/team-secrets/envelope.d.ts +10 -0
  436. package/dist/team-secrets/envelope.js +121 -0
  437. package/dist/team-secrets/errors.d.ts +26 -0
  438. package/dist/team-secrets/errors.js +27 -0
  439. package/dist/team-secrets/index.d.ts +14 -0
  440. package/dist/team-secrets/index.js +8 -0
  441. package/dist/team-secrets/keys.d.ts +52 -0
  442. package/dist/team-secrets/keys.js +158 -0
  443. package/dist/team-secrets/log.d.ts +48 -0
  444. package/dist/team-secrets/log.js +175 -0
  445. package/dist/team-secrets/resolve-conflict.d.ts +7 -0
  446. package/dist/team-secrets/resolve-conflict.js +14 -0
  447. package/dist/team-secrets/schema.d.ts +97 -0
  448. package/dist/team-secrets/schema.js +157 -0
  449. package/dist/team-secrets/sign.d.ts +24 -0
  450. package/dist/team-secrets/sign.js +71 -0
  451. package/dist/team-secrets/vault.d.ts +49 -0
  452. package/dist/team-secrets/vault.js +148 -0
  453. package/dist/validate/wsi/run-message.d.ts +2 -2
  454. package/dist/validate/wsi/run-message.js +1 -1
  455. package/dist/validate/wsi/run-wsdl.d.ts +2 -2
  456. package/dist/validate/wsi/run-wsdl.js +1 -1
  457. package/dist/validate/wsi/types.d.ts +1 -1
  458. package/dist/webhooks/model.d.ts +138 -0
  459. package/dist/webhooks/model.js +150 -0
  460. package/dist/workspace/commit-message.d.ts +1 -1
  461. package/dist/workspace/commit-message.js +6 -1
  462. package/dist/workspace/environments.d.ts +11 -4
  463. package/dist/workspace/environments.js +12 -0
  464. package/dist/workspace/index.d.ts +3 -3
  465. package/dist/workspace/index.js +2 -2
  466. package/dist/workspace/paths.d.ts +5 -2
  467. package/dist/workspace/paths.js +5 -2
  468. package/dist/workspace/schema.d.ts +7 -3
  469. package/dist/workspace/schema.js +24 -3
  470. package/dist/workspace/share.d.ts +30 -11
  471. package/dist/workspace/share.js +32 -6
  472. package/dist/ws/call.d.ts +1 -1
  473. package/dist/ws/call.js +2 -2
  474. package/dist/ws/connect.d.ts +60 -0
  475. package/dist/ws/connect.js +131 -0
  476. package/dist/ws/events.d.ts +17 -0
  477. package/dist/ws/events.js +1 -0
  478. package/dist/ws/expand.d.ts +1 -1
  479. package/dist/ws/expand.js +1 -1
  480. package/dist/ws/files.d.ts +284 -0
  481. package/dist/ws/files.js +71 -0
  482. package/dist/ws/history-entry.d.ts +44 -0
  483. package/dist/ws/history-entry.js +93 -0
  484. package/dist/ws/model.d.ts +44 -3
  485. package/dist/ws/model.js +3 -0
  486. package/dist/ws/module.d.ts +2 -0
  487. package/dist/ws/module.js +11 -0
  488. package/dist/ws/run.d.ts +63 -0
  489. package/dist/ws/run.js +470 -0
  490. package/dist/ws/session.d.ts +18 -0
  491. package/dist/ws/session.js +52 -25
  492. package/dist/ws/storage.d.ts +9 -0
  493. package/dist/ws/storage.js +176 -0
  494. package/dist/ws/transcript.d.ts +3 -4
  495. package/dist/ws/transcript.js +26 -17
  496. package/dist/ws/url.d.ts +1 -1
  497. package/dist/wsdl/cache.js +1 -1
  498. package/dist/wsdl/docs-generator.d.ts +3 -3
  499. package/dist/wsdl/docs-generator.js +1 -1
  500. package/dist/wsdl/export-definition.js +1 -1
  501. package/dist/wsdl/qname.d.ts +2 -5
  502. package/dist/wsdl/resolver.d.ts +4 -11
  503. package/dist/wsdl/resolver.js +3 -3
  504. package/dist/wsdl/update-definition.d.ts +5 -5
  505. package/dist/wsdl/update-definition.js +6 -6
  506. package/dist/wss/apply.js +1 -1
  507. package/dist/{project/wss-configs.d.ts → wss/configs.d.ts} +2 -2
  508. package/dist/{project/wss-configs.js → wss/configs.js} +2 -2
  509. package/dist/wss/incoming/decrypt.d.ts +1 -1
  510. package/dist/wss/incoming/index.js +1 -1
  511. package/dist/wss/incoming/verify.d.ts +1 -1
  512. package/dist/wss/incoming/verify.js +1 -1
  513. package/dist/wss/key-identifiers.js +1 -1
  514. package/dist/wss/model.d.ts +1 -1
  515. package/dist/wss/outgoing/encryption.d.ts +1 -1
  516. package/dist/wss/outgoing/signature.d.ts +1 -1
  517. package/dist/xml/decode.d.ts +15 -0
  518. package/dist/xml/decode.js +22 -0
  519. package/dist/xml/entitize.d.ts +17 -0
  520. package/dist/xml/entitize.js +19 -0
  521. package/dist/xml/index.d.ts +1 -1
  522. package/dist/xml/index.js +1 -1
  523. package/dist/xml/locate.d.ts +39 -0
  524. package/dist/xml/locate.js +117 -0
  525. package/dist/xml/qname.d.ts +12 -0
  526. package/dist/xml/qname.js +8 -0
  527. package/dist/xpath/evaluate-async.d.ts +19 -0
  528. package/dist/xpath/evaluate-async.js +31 -11
  529. package/dist/xpath/evaluate.d.ts +1 -1
  530. package/dist/xpath/namespaces.js +1 -1
  531. package/dist/xpath/worker.d.ts +11 -5
  532. package/dist/xpath/worker.js +24 -7
  533. package/dist/xsd/form-model.d.ts +19 -2
  534. package/dist/xsd/form-model.js +14 -2
  535. package/dist/xsd/json-bridge.d.ts +152 -0
  536. package/dist/xsd/json-bridge.js +1213 -0
  537. package/dist/xsd/locate.d.ts +2 -30
  538. package/dist/xsd/locate.js +1 -109
  539. package/dist/xsd/xml-scan.d.ts +2 -0
  540. package/dist/xsd/xml-scan.js +1 -1
  541. package/dist/xsd/xml-writer.d.ts +2 -0
  542. package/dist/xsd/xml-writer.js +4 -0
  543. package/package.json +12 -1
  544. package/dist/generate.d.ts +0 -12
  545. package/dist/operations.d.ts +0 -12
  546. package/dist/run/effective-auth.d.ts +0 -10
  547. package/dist/run/effective-auth.js +0 -19
  548. package/dist/run/prepare.d.ts +0 -43
  549. package/dist/run/prepare.js +0 -280
  550. package/dist/send-options.d.ts +0 -141
  551. package/dist/wsdl/fetch.d.ts +0 -13
  552. /package/dist/{soap → http}/charset.d.ts +0 -0
  553. /package/dist/{soap → http}/charset.js +0 -0
  554. /package/dist/{wsdl → http}/ref-policy.d.ts +0 -0
  555. /package/dist/{wsdl → http}/ref-policy.js +0 -0
  556. /package/dist/{wss/keystore → keystore}/certificate.d.ts +0 -0
  557. /package/dist/{wss/keystore → keystore}/certificate.js +0 -0
  558. /package/dist/{wss/keystore → keystore}/index.d.ts +0 -0
  559. /package/dist/{wss/keystore → keystore}/model.d.ts +0 -0
  560. /package/dist/{wss/keystore → keystore}/model.js +0 -0
  561. /package/dist/{wss/keystore → keystore}/pem.d.ts +0 -0
  562. /package/dist/{wss/keystore → keystore}/pkcs12.d.ts +0 -0
  563. /package/dist/{wsdl → project}/cache-naming.d.ts +0 -0
  564. /package/dist/{types.js → soap/types.js} +0 -0
  565. /package/dist/{soap → xml}/prefixes.d.ts +0 -0
  566. /package/dist/{soap → xml}/prefixes.js +0 -0
@@ -0,0 +1,101 @@
1
+ /**
2
+ * The host functions a script's API is built on (ADR-0016). Each is a pure function of strings: no
3
+ * handle, object or prototype of the host ever reaches the sandbox, only the strings these return.
4
+ */
5
+ import { createHash, createHmac, randomUUID } from 'node:crypto';
6
+ import { evaluate } from '../../xpath/evaluate.js';
7
+ import { SCRIPT_LIMITS } from './model.js';
8
+ export const HASH_ALGORITHMS = ['md5', 'sha1', 'sha256', 'sha512'];
9
+ export const HMAC_ALGORITHMS = ['sha1', 'sha256', 'sha512'];
10
+ export const DIGEST_ENCODINGS = ['hex', 'base64'];
11
+ /** Thrown into the script (as its message) when a host function is called with something it refuses. */
12
+ export class HostCallError extends Error {
13
+ }
14
+ function oneOf(value, allowed, what) {
15
+ if (allowed.includes(value)) {
16
+ return value;
17
+ }
18
+ throw new HostCallError(`${what} must be one of ${allowed.join(', ')}; got "${value}"`);
19
+ }
20
+ function digestEncoding(value) {
21
+ return value === undefined ? 'hex' : oneOf(value, DIGEST_ENCODINGS, 'encoding');
22
+ }
23
+ export function hash(algorithm, data, encoding) {
24
+ return createHash(oneOf(algorithm, HASH_ALGORITHMS, 'algorithm'))
25
+ .update(data, 'utf8')
26
+ .digest(digestEncoding(encoding));
27
+ }
28
+ export function hmac(algorithm, key, data, encoding) {
29
+ return createHmac(oneOf(algorithm, HMAC_ALGORITHMS, 'algorithm'), key)
30
+ .update(data, 'utf8')
31
+ .digest(digestEncoding(encoding));
32
+ }
33
+ export function uuid() {
34
+ return randomUUID();
35
+ }
36
+ export function base64(text) {
37
+ return Buffer.from(text, 'utf8').toString('base64');
38
+ }
39
+ export function fromBase64(text) {
40
+ return Buffer.from(text, 'base64').toString('utf8');
41
+ }
42
+ export function base64url(text) {
43
+ return Buffer.from(text, 'utf8').toString('base64url');
44
+ }
45
+ export function urlEncode(text) {
46
+ return encodeURIComponent(text);
47
+ }
48
+ /**
49
+ * The strings an XPath expression selects in `xml`, as JSON text: each node's text, or each value.
50
+ * `namespacesJson` is a JSON object of prefix to URI.
51
+ */
52
+ export function xpathStrings(xml, expression, namespacesJson) {
53
+ let namespaces = {};
54
+ try {
55
+ const parsed = JSON.parse(namespacesJson);
56
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
57
+ namespaces = Object.fromEntries(Object.entries(parsed).filter((e) => typeof e[1] === 'string'));
58
+ }
59
+ }
60
+ catch {
61
+ throw new HostCallError('namespaces must be a JSON object');
62
+ }
63
+ const result = evaluate(xml, expression, { language: 'xpath', namespaces });
64
+ switch (result.kind) {
65
+ case 'error':
66
+ throw new HostCallError(result.message);
67
+ case 'empty':
68
+ return '[]';
69
+ default:
70
+ return JSON.stringify(result.items.map((item) => item.text));
71
+ }
72
+ }
73
+ const TRUNCATED_MARK = '… (log cut short)';
74
+ /** Collects `log(...)` lines within the caps; anything past them is dropped and flagged. */
75
+ export class LogCollector {
76
+ lines = [];
77
+ bytes = 0;
78
+ truncated = false;
79
+ add(line) {
80
+ if (this.truncated) {
81
+ return;
82
+ }
83
+ if (this.lines.length >= SCRIPT_LIMITS.logLines) {
84
+ this.truncated = true;
85
+ return;
86
+ }
87
+ const size = Buffer.byteLength(line, 'utf8');
88
+ const room = SCRIPT_LIMITS.logBytes - this.bytes;
89
+ if (size > room) {
90
+ this.lines.push(`${Buffer.from(line, 'utf8').subarray(0, Math.max(0, room)).toString('utf8')}${TRUNCATED_MARK}`);
91
+ this.bytes = SCRIPT_LIMITS.logBytes;
92
+ this.truncated = true;
93
+ return;
94
+ }
95
+ this.lines.push(line);
96
+ this.bytes += size;
97
+ }
98
+ result() {
99
+ return { lines: [...this.lines], truncated: this.truncated };
100
+ }
101
+ }
@@ -0,0 +1,18 @@
1
+ import { type SandboxJob, type SandboxResult } from './model.js';
2
+ /** How many jobs may wait behind the one running before new ones are refused. */
3
+ export declare const SCRIPT_QUEUE_LIMIT = 16;
4
+ export interface ScriptSandboxOptions {
5
+ /** The worker script; tests substitute one. Defaults to the compiled `worker.js`. */
6
+ readonly workerUrl?: URL;
7
+ }
8
+ export interface ScriptSandbox {
9
+ /** Runs one job. Never rejects: every failure is a result. */
10
+ run(job: SandboxJob): Promise<SandboxResult>;
11
+ /** Terminates the worker; jobs still waiting resolve as failed. */
12
+ dispose(): Promise<void>;
13
+ /** Workers started so far (a replaced one counts again). */
14
+ readonly spawned: number;
15
+ }
16
+ /** A job's time limit, clamped to what a request file may ask for. */
17
+ export declare function clampTimeout(timeoutMs: number | undefined): number;
18
+ export declare function createScriptSandbox(options?: ScriptSandboxOptions): ScriptSandbox;
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Script runs off the calling thread (ADR-0016).
3
+ *
4
+ * One long-lived worker runs scripts one at a time, each in a fresh QuickJS runtime with its own
5
+ * time, memory and stack limits. The interpreter's interrupt handler is what normally stops a
6
+ * script at its deadline; as a backstop, a worker that has not answered `SCRIPT_LIMITS.backstopMs`
7
+ * after the deadline is terminated and replaced, and the job ends as `script-timeout`. A worker
8
+ * whose job ran out of time or memory is replaced too, so no runtime state outlives a bad job.
9
+ *
10
+ * The pattern is `rest/contract-check-worker-host.ts`'s. The worker gets an explicit stack size:
11
+ * QuickJS's own stack check must trip before the host thread's stack runs out.
12
+ */
13
+ import { existsSync } from 'node:fs';
14
+ import { fileURLToPath } from 'node:url';
15
+ import { Worker } from 'node:worker_threads';
16
+ import { SCRIPT_LIMITS } from './model.js';
17
+ /** How many jobs may wait behind the one running before new ones are refused. */
18
+ export const SCRIPT_QUEUE_LIMIT = 16;
19
+ /** The worker's stack, in MB: comfortably above the QuickJS stack limit. */
20
+ const WORKER_STACK_MB = 8;
21
+ /** Extra backstop time for the first job on a new worker, which loads the WebAssembly module first. */
22
+ const SPAWN_GRACE_MS = 2_000;
23
+ /**
24
+ * The compiled worker script: the sibling `.js` when running from `dist`, else — running from `src`
25
+ * under vitest — the package's `dist/script/sandbox/worker.js`.
26
+ */
27
+ function defaultWorkerUrl() {
28
+ const sibling = new URL('./worker.js', import.meta.url);
29
+ if (existsSync(fileURLToPath(sibling))) {
30
+ return sibling;
31
+ }
32
+ const fallback = import.meta.url.replace(/\/src\/script\/sandbox\/host\.ts$/, '/dist/script/sandbox/worker.js');
33
+ /* v8 ignore next 3 -- only reachable when the engine package has never been built */
34
+ if (fallback === import.meta.url) {
35
+ throw new Error('script sandbox worker not found: build the engine package first');
36
+ }
37
+ return new URL(fallback);
38
+ }
39
+ const EMPTY_LOG = { lines: [], truncated: false };
40
+ const failed = (code, message) => ({
41
+ ok: false,
42
+ error: { code, message },
43
+ log: EMPTY_LOG,
44
+ });
45
+ /** A job's time limit, clamped to what a request file may ask for. */
46
+ export function clampTimeout(timeoutMs) {
47
+ if (timeoutMs === undefined || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {
48
+ return SCRIPT_LIMITS.defaultTimeoutMs;
49
+ }
50
+ return Math.min(Math.floor(timeoutMs), SCRIPT_LIMITS.maxTimeoutMs);
51
+ }
52
+ export function createScriptSandbox(options = {}) {
53
+ let url = options.workerUrl;
54
+ let worker;
55
+ let spawned = 0;
56
+ let disposed = false;
57
+ let nextId = 0;
58
+ let current;
59
+ let timer;
60
+ const queue = [];
61
+ const finish = (result) => {
62
+ const job = current;
63
+ if (job === undefined)
64
+ return;
65
+ current = undefined;
66
+ if (timer !== undefined)
67
+ clearTimeout(timer);
68
+ timer = undefined;
69
+ job.resolve(result);
70
+ pump();
71
+ };
72
+ /** Drops the current worker without waiting for it; its late answer or exit is then ignored. */
73
+ const discard = () => {
74
+ const dead = worker;
75
+ worker = undefined;
76
+ if (dead !== undefined) {
77
+ dead.removeAllListeners();
78
+ // An 'error' after the listeners are gone would otherwise be an uncaught exception.
79
+ dead.on('error', () => undefined);
80
+ void dead.terminate();
81
+ }
82
+ };
83
+ const spawn = () => {
84
+ url ??= defaultWorkerUrl();
85
+ const next = new Worker(url, { resourceLimits: { stackSizeMb: WORKER_STACK_MB } });
86
+ spawned += 1;
87
+ // The sandbox must never be what keeps the process alive.
88
+ next.unref();
89
+ next.on('message', (answer) => {
90
+ if (current?.id !== answer.id)
91
+ return;
92
+ if (answer.recycle)
93
+ discard();
94
+ finish(answer.result);
95
+ });
96
+ const broken = (why) => {
97
+ if (worker !== next)
98
+ return;
99
+ discard();
100
+ finish(failed('script-error', why));
101
+ };
102
+ next.on('error', (error) => {
103
+ broken(`The script stopped: ${error instanceof Error ? error.message : String(error)}`);
104
+ });
105
+ next.on('exit', () => {
106
+ broken('The script stopped unexpectedly');
107
+ });
108
+ return next;
109
+ };
110
+ function pump() {
111
+ if (current !== undefined || disposed)
112
+ return;
113
+ const job = queue.shift();
114
+ if (job === undefined)
115
+ return;
116
+ current = job;
117
+ const timeoutMs = clampTimeout(job.job.timeoutMs);
118
+ const fresh = worker === undefined;
119
+ try {
120
+ worker ??= spawn();
121
+ worker.postMessage({ id: job.id, job: { ...job.job, timeoutMs } });
122
+ }
123
+ catch (error) {
124
+ discard();
125
+ finish(failed('script-error', `The script could not start: ${error instanceof Error ? error.message : String(error)}`));
126
+ return;
127
+ }
128
+ // The deadline starts when the job reaches the worker, so one stuck script never costs the ones
129
+ // behind it their own time.
130
+ timer = setTimeout(() => {
131
+ discard();
132
+ finish(failed('script-timeout', 'The script ran past its time limit'));
133
+ }, timeoutMs + SCRIPT_LIMITS.backstopMs + (fresh ? SPAWN_GRACE_MS : 0));
134
+ timer.unref?.();
135
+ }
136
+ return {
137
+ run(job) {
138
+ if (disposed)
139
+ return Promise.resolve(failed('script-error', 'The script sandbox was stopped'));
140
+ if (queue.length >= SCRIPT_QUEUE_LIMIT) {
141
+ return Promise.resolve(failed('script-error', 'Too many scripts waiting to run'));
142
+ }
143
+ return new Promise((resolve) => {
144
+ nextId += 1;
145
+ queue.push({ id: nextId, job, resolve });
146
+ pump();
147
+ });
148
+ },
149
+ async dispose() {
150
+ if (disposed)
151
+ return;
152
+ disposed = true;
153
+ const dead = worker;
154
+ worker = undefined;
155
+ if (timer !== undefined)
156
+ clearTimeout(timer);
157
+ timer = undefined;
158
+ const waiting = [...(current !== undefined ? [current] : []), ...queue.splice(0)];
159
+ current = undefined;
160
+ for (const job of waiting)
161
+ job.resolve(failed('script-error', 'The script sandbox was stopped'));
162
+ if (dead !== undefined) {
163
+ dead.removeAllListeners();
164
+ dead.on('error', () => undefined);
165
+ await dead.terminate();
166
+ }
167
+ },
168
+ get spawned() {
169
+ return spawned;
170
+ },
171
+ };
172
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * What a script run in the sandbox is given and what it hands back (ADR-0016).
3
+ *
4
+ * A job is plain data: the code to run, the prelude that installs the API over the host functions,
5
+ * the JSON the API reads (`input`) and the run's limits. The result is plain data too. Nothing
6
+ * crosses the boundary but strings and JSON-shaped values.
7
+ */
8
+ /** The limits every script run is held to (spec §Sandbox). */
9
+ export declare const SCRIPT_LIMITS: {
10
+ /** The default time one script may run, in milliseconds. */
11
+ readonly defaultTimeoutMs: 1000;
12
+ /** The most a request file may allow (`scripts.timeoutMs`). */
13
+ readonly maxTimeoutMs: 10000;
14
+ /** How long past its deadline the host waits before it terminates and replaces the worker. */
15
+ readonly backstopMs: 1000;
16
+ readonly memoryBytes: number;
17
+ readonly stackBytes: number;
18
+ readonly logBytes: number;
19
+ readonly logLines: 1000;
20
+ /** The largest result (`__finish()`'s JSON) a script may hand back. */
21
+ readonly outputBytes: number;
22
+ /** The largest script file (spec §Storage). */
23
+ readonly fileBytes: number;
24
+ };
25
+ /** One run of a script. */
26
+ export interface SandboxJob {
27
+ /**
28
+ * Installs the script's API. It runs before the script, in the same context, and may use the host
29
+ * functions (`__host.*`) and `__input`. It must define `__finish()`, whose return value (JSON-shaped)
30
+ * is the job's `output`.
31
+ */
32
+ readonly prelude: string;
33
+ /** The script, already stripped of types. */
34
+ readonly code: string;
35
+ /** The name errors are reported against, e.g. `Checkout.pre.ts`. */
36
+ readonly filename: string;
37
+ /** JSON-shaped data the prelude reads as `__input`. */
38
+ readonly input: unknown;
39
+ /** Milliseconds the prelude and the script may run together. */
40
+ readonly timeoutMs: number;
41
+ }
42
+ /** Where a script failed, in the script's own file. Lines and columns are 1-based. */
43
+ export interface ScriptPosition {
44
+ readonly line: number;
45
+ readonly column: number;
46
+ }
47
+ export type SandboxErrorCode = 'script-error' | 'script-timeout' | 'script-memory';
48
+ export interface SandboxError {
49
+ readonly code: SandboxErrorCode;
50
+ readonly message: string;
51
+ /** Set when the failure is in the script itself (not the prelude) and its position is known. */
52
+ readonly position?: ScriptPosition;
53
+ }
54
+ export interface SandboxLog {
55
+ /** The text `log(...)` produced, capped (`SCRIPT_LIMITS.logBytes` / `logLines`). */
56
+ readonly lines: readonly string[];
57
+ /** True when lines were dropped or cut short to keep within the caps. */
58
+ readonly truncated: boolean;
59
+ }
60
+ export type SandboxResult = {
61
+ readonly ok: true;
62
+ readonly output: unknown;
63
+ readonly log: SandboxLog;
64
+ } | {
65
+ readonly ok: false;
66
+ readonly error: SandboxError;
67
+ readonly log: SandboxLog;
68
+ readonly output?: unknown;
69
+ };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * What a script run in the sandbox is given and what it hands back (ADR-0016).
3
+ *
4
+ * A job is plain data: the code to run, the prelude that installs the API over the host functions,
5
+ * the JSON the API reads (`input`) and the run's limits. The result is plain data too. Nothing
6
+ * crosses the boundary but strings and JSON-shaped values.
7
+ */
8
+ /** The limits every script run is held to (spec §Sandbox). */
9
+ export const SCRIPT_LIMITS = {
10
+ /** The default time one script may run, in milliseconds. */
11
+ defaultTimeoutMs: 1_000,
12
+ /** The most a request file may allow (`scripts.timeoutMs`). */
13
+ maxTimeoutMs: 10_000,
14
+ /** How long past its deadline the host waits before it terminates and replaces the worker. */
15
+ backstopMs: 1_000,
16
+ memoryBytes: 64 * 1024 * 1024,
17
+ stackBytes: 1024 * 1024,
18
+ logBytes: 64 * 1024,
19
+ logLines: 1_000,
20
+ /** The largest result (`__finish()`'s JSON) a script may hand back. */
21
+ outputBytes: 16 * 1024 * 1024,
22
+ /** The largest script file (spec §Storage). */
23
+ fileBytes: 256 * 1024,
24
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Entry point run inside a `node:worker_threads` Worker by {@link createScriptSandbox}. It loads the
3
+ * QuickJS WebAssembly module once, then runs each job it is sent (`{ id, job }`) in a fresh runtime,
4
+ * one at a time, and answers `{ id, result, recycle }`.
5
+ */
6
+ import { parentPort } from 'node:worker_threads';
7
+ import { newQuickJSWASMModuleFromVariant } from 'quickjs-emscripten-core';
8
+ import { executeJob } from './execute.js';
9
+ /* v8 ignore start -- runs only inside a real worker thread; covered end to end by sandbox.test.ts,
10
+ which coverage instrumentation does not follow across the thread. */
11
+ if (parentPort !== null) {
12
+ const port = parentPort;
13
+ // Messages that arrive while the module loads wait in the port until the listener is attached.
14
+ const module = await newQuickJSWASMModuleFromVariant(import('@jitl/quickjs-wasmfile-release-sync'));
15
+ port.on('message', ({ id, job }) => {
16
+ const { result, recycle } = executeJob(module, job);
17
+ port.postMessage({ id, result, recycle });
18
+ });
19
+ }
20
+ /* v8 ignore stop */
@@ -0,0 +1,27 @@
1
+ import type { KeyValueEntry } from '../http/entries.js';
2
+ import { type GetSecret } from '../secrets/resolve.js';
3
+ import type { HeaderPair } from './model.js';
4
+ /** The placeholders one send's secrets stand behind until its pre-request script has run. */
5
+ export declare class SecretPlaceholders {
6
+ private readonly nonce;
7
+ private readonly byName;
8
+ /** The placeholder for `name`, the same one every time within this send. */
9
+ placeholderFor(name: string): string;
10
+ /** A `secrets` scope that maps each name to its placeholder, for the given names. */
11
+ scopeFor(names: Iterable<string>): Record<string, string>;
12
+ get size(): number;
13
+ /** True when `text` holds one of this send's placeholders: a secret whose value is not in yet. */
14
+ holds(text: string): boolean;
15
+ /**
16
+ * `value` with every placeholder replaced by its secret's value, in every string it holds.
17
+ *
18
+ * @throws WirebenchError `secret-missing` when a secret cannot be read
19
+ */
20
+ restore<T>(value: T, getSecret: GetSecret): Promise<T>;
21
+ }
22
+ /** The enabled rows of a key-value table as header pairs, in order. */
23
+ export declare const pairsOf: (entries: readonly KeyValueEntry[]) => HeaderPair[];
24
+ /** Header pairs as enabled key-value rows. */
25
+ export declare const entriesOf: (pairs: readonly HeaderPair[]) => KeyValueEntry[];
26
+ /** A record's entries as header pairs. */
27
+ export declare const recordPairs: (record: Readonly<Record<string, string>> | undefined) => HeaderPair[];
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Between a prepared send and the script API (spec §What a pre-request script can change, §Secrets).
3
+ *
4
+ * A request with scripts is prepared with every `${secret:…}` in its text replaced by an
5
+ * unguessable placeholder, so a script sees neither the value nor text it could turn into a
6
+ * reference. After the script, the host puts each placeholder back as the secret's value — secrets
7
+ * are substituted raw by every expander, so the value lands exactly as it would have. A placeholder
8
+ * is alphanumeric, so no escaping along the way changes it, and a value a server chose can never
9
+ * name one: the nonce is new for every send.
10
+ *
11
+ * Each protocol's converters between a prepared send and the snapshot a script sees live in its
12
+ * own folder (`<protocol>/scripting.ts`); the helpers at the end of this file are what they share.
13
+ */
14
+ import { randomUUID } from 'node:crypto';
15
+ import { resolveSecretTokens } from '../secrets/resolve.js';
16
+ /** The placeholders one send's secrets stand behind until its pre-request script has run. */
17
+ export class SecretPlaceholders {
18
+ nonce = randomUUID().replace(/-/g, '');
19
+ byName = new Map();
20
+ /** The placeholder for `name`, the same one every time within this send. */
21
+ placeholderFor(name) {
22
+ let placeholder = this.byName.get(name);
23
+ if (placeholder === undefined) {
24
+ placeholder = `wbsec${this.nonce}n${String(this.byName.size)}z`;
25
+ this.byName.set(name, placeholder);
26
+ }
27
+ return placeholder;
28
+ }
29
+ /** A `secrets` scope that maps each name to its placeholder, for the given names. */
30
+ scopeFor(names) {
31
+ const out = {};
32
+ for (const name of names)
33
+ out[name] = this.placeholderFor(name);
34
+ return out;
35
+ }
36
+ get size() {
37
+ return this.byName.size;
38
+ }
39
+ /** True when `text` holds one of this send's placeholders: a secret whose value is not in yet. */
40
+ holds(text) {
41
+ for (const placeholder of this.byName.values()) {
42
+ if (text.includes(placeholder))
43
+ return true;
44
+ }
45
+ return false;
46
+ }
47
+ /**
48
+ * `value` with every placeholder replaced by its secret's value, in every string it holds.
49
+ *
50
+ * @throws WirebenchError `secret-missing` when a secret cannot be read
51
+ */
52
+ async restore(value, getSecret) {
53
+ if (this.byName.size === 0)
54
+ return value;
55
+ const secrets = await resolveSecretTokens(this.byName.keys(), getSecret);
56
+ const replacements = new Map([...this.byName].map(([name, placeholder]) => [placeholder, secrets[name] ?? '']));
57
+ const pattern = new RegExp([...replacements.keys()].join('|'), 'g');
58
+ const walk = (node) => {
59
+ if (typeof node === 'string')
60
+ return node.replace(pattern, (hit) => replacements.get(hit) ?? hit);
61
+ if (Array.isArray(node))
62
+ return node.map(walk);
63
+ if (node !== null && typeof node === 'object') {
64
+ return Object.fromEntries(Object.entries(node).map(([k, v]) => [k, walk(v)]));
65
+ }
66
+ return node;
67
+ };
68
+ return walk(value);
69
+ }
70
+ }
71
+ /** The enabled rows of a key-value table as header pairs, in order. */
72
+ export const pairsOf = (entries) => entries.filter((e) => e.enabled).map((e) => [e.name, e.value]);
73
+ /** Header pairs as enabled key-value rows. */
74
+ export const entriesOf = (pairs) => pairs.map(([name, value]) => ({ name, value, enabled: true }));
75
+ /** A record's entries as header pairs. */
76
+ export const recordPairs = (record) => Object.entries(record ?? {}).map(([name, value]) => [name, value]);
@@ -0,0 +1,5 @@
1
+ /** Thrown when the script is not valid erasable TypeScript; carries Node's message. */
2
+ export declare class StripError extends Error {
3
+ }
4
+ /** The script with its types erased, positions unchanged. */
5
+ export declare function stripTypes(source: string): string;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Turns a TypeScript script into the JavaScript the sandbox runs, by erasing its types.
3
+ *
4
+ * Node's `module.stripTypeScriptTypes` in `strip` mode replaces every type annotation with
5
+ * whitespace, so each remaining character keeps its line and column and a run-time error points at
6
+ * the right place in the file. It handles erasable syntax only; the checker (`erasableSyntaxOnly`)
7
+ * refuses the rest before a script gets here.
8
+ *
9
+ * Node 24 still marks the function experimental and warns on its first use. That one warning is
10
+ * silenced here; any other warning goes through untouched. A test pins the output of a fixture, so a
11
+ * change in a later Node shows up in CI.
12
+ */
13
+ import { stripTypeScriptTypes } from 'node:module';
14
+ let warningSilenced = false;
15
+ function silenceStripWarning() {
16
+ if (warningSilenced) {
17
+ return;
18
+ }
19
+ warningSilenced = true;
20
+ const emit = process.emitWarning.bind(process);
21
+ process.emitWarning = (warning, ...rest) => {
22
+ const text = typeof warning === 'string' ? warning : warning.message;
23
+ const type = typeof rest[0] === 'string' ? rest[0] : rest[0]?.type;
24
+ if ((type === 'ExperimentalWarning' || (warning instanceof Error && warning.name === 'ExperimentalWarning')) &&
25
+ text.includes('stripTypeScriptTypes')) {
26
+ return;
27
+ }
28
+ emit(warning, ...rest);
29
+ };
30
+ }
31
+ /** Thrown when the script is not valid erasable TypeScript; carries Node's message. */
32
+ export class StripError extends Error {
33
+ }
34
+ /** The script with its types erased, positions unchanged. */
35
+ export function stripTypes(source) {
36
+ silenceStripWarning();
37
+ try {
38
+ return stripTypeScriptTypes(source, { mode: 'strip' });
39
+ }
40
+ catch (error) {
41
+ throw new StripError(error instanceof Error ? error.message : String(error));
42
+ }
43
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The static half of a script's types (spec §API): the declarations every script has, followed by
3
+ * the ones its protocol's scripting facet supplies for the phase. Those refer to aliases the
4
+ * generated half defines from the request's contract (`<protocol>/script-types.ts`), and to
5
+ * `WbSecretName`.
6
+ *
7
+ * A script is a global script, not a module: these are ambient declarations, one file per script.
8
+ */
9
+ import type { ProtocolScripting } from '../../protocol/module.js';
10
+ import type { ProtocolRegistry } from '../../protocol/registry.js';
11
+ import type { ScriptPhase } from '../model.js';
12
+ /**
13
+ * The API's declarations for one protocol and phase. `scripting` is the protocol's facet, or its
14
+ * `kind`, looked up in `registry` (the built-in one when absent).
15
+ *
16
+ * @throws WirebenchError `script-unsupported` when a `kind` has no scripting facet
17
+ */
18
+ export declare function apiDeclarations(scripting: ProtocolScripting | string, phase: ScriptPhase, registry?: ProtocolRegistry): string;
19
+ /**
20
+ * Everything a script is checked against: the API, its secret names, and the request's generated types.
21
+ *
22
+ * @throws WirebenchError `script-unsupported` when a `kind` has no scripting facet
23
+ */
24
+ export declare function scriptDeclarations(scripting: ProtocolScripting | string, phase: ScriptPhase, secrets: readonly string[], generated: string, registry?: ProtocolRegistry): string;
25
+ /** `type WbSecretName = ...` for the secrets a request lists (`never` when it lists none). */
26
+ export declare function secretNameType(secrets: readonly string[]): string;
27
+ /** One section of the published API reference: a heading and the declarations it shows. */
28
+ export interface ApiReferenceSection {
29
+ readonly title: string;
30
+ readonly declarations: string;
31
+ }
32
+ /**
33
+ * The API's declarations as the docs site's reference shows them (`pnpm docs:script-api`): what
34
+ * every script has, then the sections of each protocol in `registry` that has a scripting facet.
35
+ * Protocols are ordered by title, not by registration, so the page does not depend on the order a
36
+ * host composed its modules in. The status literal types are described rather than listed.
37
+ */
38
+ export declare function apiReference(registry?: ProtocolRegistry): readonly ApiReferenceSection[];