@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,71 @@
1
+ /**
2
+ * Signatures over team-secrets files (§4): Ed25519 over the canonical JSON (keys sorted at every depth, no
3
+ * whitespace, `undefined` dropped) of the document without its `signature` field. YAML formatting, key
4
+ * order in the file and line endings therefore never change what was signed.
5
+ */
6
+ import { sign, verify } from 'node:crypto';
7
+ import { base64url, fromBase64url, signingPrivateKey, signingPublicKey } from './keys.js';
8
+ import { teamSecretsError } from './errors.js';
9
+ /**
10
+ * Canonical JSON of `value`: object keys sorted at every depth, no whitespace, `undefined` values (object
11
+ * fields only, never array elements) dropped. Only JSON's own shapes are accepted — `null`, booleans,
12
+ * strings, finite numbers, arrays, and plain objects (prototype `Object.prototype` or `null`) — so a
13
+ * `Date`, `Map`, `Set`, class instance, function, symbol, `NaN` or `±Infinity` throws rather than silently
14
+ * signing something that would not round-trip through YAML the same way twice. `-0` is written as `0`
15
+ * (`JSON.stringify` already does this, and YAML has no distinct negative zero), which is deliberate, not
16
+ * an oversight.
17
+ *
18
+ * @throws WirebenchError `team-secrets-not-canonical`
19
+ */
20
+ export function canonicalJson(value) {
21
+ if (value === null) {
22
+ return 'null';
23
+ }
24
+ if (typeof value === 'boolean' || typeof value === 'string') {
25
+ return JSON.stringify(value);
26
+ }
27
+ if (typeof value === 'number') {
28
+ if (!Number.isFinite(value)) {
29
+ throw teamSecretsError('team-secrets-not-canonical', { reason: 'non-finite number' });
30
+ }
31
+ return JSON.stringify(value);
32
+ }
33
+ if (Array.isArray(value)) {
34
+ return `[${value.map((item) => canonicalJson(item)).join(',')}]`;
35
+ }
36
+ if (typeof value === 'object') {
37
+ const prototype = Object.getPrototypeOf(value);
38
+ if (prototype !== Object.prototype && prototype !== null) {
39
+ throw teamSecretsError('team-secrets-not-canonical', { reason: 'not a plain object' });
40
+ }
41
+ const entries = Object.entries(value)
42
+ .filter(([, item]) => item !== undefined)
43
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
44
+ return `{${entries.map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`).join(',')}}`;
45
+ }
46
+ // undefined, function, symbol, bigint — none of them are a JSON value.
47
+ throw teamSecretsError('team-secrets-not-canonical', { reason: `unsupported type ${typeof value}` });
48
+ }
49
+ /** A shallow copy of `doc` without its `signature` field. */
50
+ export function withoutSignature(doc) {
51
+ const copy = { ...doc };
52
+ delete copy['signature'];
53
+ return copy;
54
+ }
55
+ function signedBytes(doc) {
56
+ return Buffer.from(canonicalJson(withoutSignature(doc)), 'utf8');
57
+ }
58
+ /** `doc` with a fresh `signature` by `keys`; an existing signature is replaced. */
59
+ export function signDocument(doc, keys) {
60
+ const signature = base64url(sign(null, signedBytes(doc), signingPrivateKey(keys)));
61
+ return { ...withoutSignature(doc), signature };
62
+ }
63
+ /** Whether `doc.signature` is `signingKey`'s signature over the rest of `doc`. Never throws. */
64
+ export function verifyDocument(doc, signingKey) {
65
+ try {
66
+ return verify(null, signedBytes(doc), signingPublicKey(signingKey), fromBase64url(doc.signature));
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ }
@@ -0,0 +1,49 @@
1
+ import type { MachineKeys } from './keys.js';
2
+ import type { AccessState, KeyInfo } from './log.js';
3
+ import { type SecretKey, type VaultEntryFile } from './schema.js';
4
+ /** A new value (§3.3): fresh data key, wrapped for `recipients`, signed by `signer`, dated `at`. */
5
+ export declare function buildVaultEntry(input: {
6
+ readonly secret: SecretKey;
7
+ readonly label: string;
8
+ readonly value: string;
9
+ readonly recipients: readonly KeyInfo[];
10
+ readonly signer: MachineKeys;
11
+ readonly at: string;
12
+ }): VaultEntryFile;
13
+ /** The same value under a fresh data key for `recipients` only (§3.6); the value time is kept. */
14
+ export declare function sealVaultEntry(entry: VaultEntryFile, value: string, recipients: readonly KeyInfo[], signer: MachineKeys): VaultEntryFile;
15
+ /** Every approved key the log has a verified request for. */
16
+ export declare function approvedRecipients(state: AccessState): KeyInfo[];
17
+ export type VaultVerdict = 'trusted' | 'wrong-id' | 'not-approved' | 'bad-signature';
18
+ /** §6: trusted only when it sits under its own id and an approved key signed it. */
19
+ export declare function verifyVaultEntry(entry: VaultEntryFile, fileId: string, state: AccessState): VaultVerdict;
20
+ /** The value, when `entry` is wrapped for `me` and opens; `undefined` otherwise. */
21
+ export declare function openVaultEntry(entry: VaultEntryFile, me: MachineKeys): string | undefined;
22
+ /**
23
+ * §3.4 healing: `entry` with a wrap added for each approved key it lacks, under the same data key, re-signed
24
+ * by `me`. `undefined` when nothing is missing or `me` cannot open the data key. Never removes a wrap.
25
+ * Callers heal trusted entries only.
26
+ */
27
+ export declare function healVaultEntry(entry: VaultEntryFile, state: AccessState, me: MachineKeys): VaultEntryFile | undefined;
28
+ /** Plan decision 6: the entry still carries a wrap for a key the log no longer approves. */
29
+ export declare function wrapsUnapprovedKey(entry: VaultEntryFile, state: AccessState): boolean;
30
+ export interface RotateMark {
31
+ readonly entryId: string;
32
+ readonly label: string;
33
+ readonly secret: SecretKey;
34
+ /** The names on the removed keys that could read this value. */
35
+ readonly removedNames: string[];
36
+ }
37
+ /**
38
+ * §3.6: a value set at or before a removal was readable by the removed key (plan decision 5), so it is marked
39
+ * until it changes. Pass trusted entries only, keyed by id.
40
+ */
41
+ export declare function rotateMarks(values: ReadonlyMap<string, VaultEntryFile>, state: AccessState): RotateMark[];
42
+ /**
43
+ * {@link rotateMarks} for removals given by name and time: a machine that remembers a removal it saw keeps its
44
+ * marks even after the removed key's request file is gone from the tree.
45
+ */
46
+ export declare function rotateMarksFor(values: ReadonlyMap<string, VaultEntryFile>, removals: readonly {
47
+ readonly at: string;
48
+ readonly name: string;
49
+ }[]): RotateMark[];
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Vault entries (§2, §3.3–§3.6): build one for the approved keys, verify it against the replayed log,
3
+ * open it with this machine's key, seal it again with a fresh data key (removal, late re-encryption), heal
4
+ * it with wraps for keys approved since, and say which values a removed key could read. Pure.
5
+ *
6
+ * Wrapping a data key for a recipient can fail with `team-secrets-bad-key` (a malformed or low-order
7
+ * key, e.g. from a corrupted key request that still passed schema validation). One bad recipient must
8
+ * never stop the others: it is skipped, and its absence from `wraps` is the only report a caller needs —
9
+ * a recipient that was supposed to be able to read the value but has no wrap for it simply cannot.
10
+ */
11
+ import { decryptValue, encryptValue, newDataKey, unwrapDataKey, wrapDataKey } from './envelope.js';
12
+ import { WirebenchError } from '../errors.js';
13
+ import { vaultEntryId } from './schema.js';
14
+ import { signDocument, verifyDocument, withoutSignature } from './sign.js';
15
+ /** `wrapDataKey(dataKey, recipient.encryptionKey)`, or `undefined` for a recipient whose key is bad. */
16
+ function tryWrap(dataKey, recipient) {
17
+ try {
18
+ return wrapDataKey(dataKey, recipient.encryptionKey);
19
+ }
20
+ catch (error) {
21
+ if (error instanceof WirebenchError && error.code === 'team-secrets-bad-key') {
22
+ return undefined;
23
+ }
24
+ throw error;
25
+ }
26
+ }
27
+ function seal(body, value, recipients, signer) {
28
+ const dataKey = newDataKey();
29
+ const wraps = {};
30
+ for (const recipient of recipients) {
31
+ const wrap = tryWrap(dataKey, recipient);
32
+ if (wrap !== undefined) {
33
+ wraps[recipient.keyId] = wrap;
34
+ }
35
+ }
36
+ return signDocument({
37
+ version: 1,
38
+ secret: body.secret,
39
+ label: body.label,
40
+ cipher: encryptValue(value, dataKey, vaultEntryId(body.secret)),
41
+ wraps,
42
+ updatedAt: body.updatedAt,
43
+ updatedBy: signer.keyId,
44
+ }, signer);
45
+ }
46
+ /** A new value (§3.3): fresh data key, wrapped for `recipients`, signed by `signer`, dated `at`. */
47
+ export function buildVaultEntry(input) {
48
+ return seal({ secret: input.secret, label: input.label, updatedAt: input.at }, input.value, input.recipients, input.signer);
49
+ }
50
+ /** The same value under a fresh data key for `recipients` only (§3.6); the value time is kept. */
51
+ export function sealVaultEntry(entry, value, recipients, signer) {
52
+ return seal(entry, value, recipients, signer);
53
+ }
54
+ /** Every approved key the log has a verified request for. */
55
+ export function approvedRecipients(state) {
56
+ return [...state.approved].flatMap((keyId) => {
57
+ const info = state.keys.get(keyId);
58
+ return info === undefined ? [] : [info];
59
+ });
60
+ }
61
+ /** §6: trusted only when it sits under its own id and an approved key signed it. */
62
+ export function verifyVaultEntry(entry, fileId, state) {
63
+ if (vaultEntryId(entry.secret) !== fileId) {
64
+ return 'wrong-id';
65
+ }
66
+ if (!state.approved.has(entry.updatedBy)) {
67
+ return 'not-approved';
68
+ }
69
+ const signer = state.keys.get(entry.updatedBy);
70
+ if (signer === undefined) {
71
+ // Approved, but the log never saw a verified key request for it — there is no signature to check.
72
+ return 'not-approved';
73
+ }
74
+ return verifyDocument(entry, signer.signingKey) ? 'trusted' : 'bad-signature';
75
+ }
76
+ /** The value, when `entry` is wrapped for `me` and opens; `undefined` otherwise. */
77
+ export function openVaultEntry(entry, me) {
78
+ const wrap = entry.wraps[me.keyId];
79
+ if (wrap === undefined) {
80
+ return undefined;
81
+ }
82
+ try {
83
+ return decryptValue(entry.cipher, unwrapDataKey(wrap, me), vaultEntryId(entry.secret));
84
+ }
85
+ catch {
86
+ return undefined;
87
+ }
88
+ }
89
+ /**
90
+ * §3.4 healing: `entry` with a wrap added for each approved key it lacks, under the same data key, re-signed
91
+ * by `me`. `undefined` when nothing is missing or `me` cannot open the data key. Never removes a wrap.
92
+ * Callers heal trusted entries only.
93
+ */
94
+ export function healVaultEntry(entry, state, me) {
95
+ const missing = approvedRecipients(state).filter((recipient) => entry.wraps[recipient.keyId] === undefined);
96
+ const mine = entry.wraps[me.keyId];
97
+ if (missing.length === 0 || mine === undefined) {
98
+ return undefined;
99
+ }
100
+ let dataKey;
101
+ try {
102
+ dataKey = unwrapDataKey(mine, me);
103
+ }
104
+ catch {
105
+ return undefined;
106
+ }
107
+ const wraps = { ...entry.wraps };
108
+ let added = false;
109
+ for (const recipient of missing) {
110
+ const wrap = tryWrap(dataKey, recipient);
111
+ if (wrap !== undefined) {
112
+ wraps[recipient.keyId] = wrap;
113
+ added = true;
114
+ }
115
+ }
116
+ if (!added) {
117
+ // Every missing recipient had a bad key, so healing would produce nothing but a re-signed copy of
118
+ // the same wraps — machines would re-sign and commit this forever with no progress.
119
+ return undefined;
120
+ }
121
+ return signDocument({ ...withoutSignature(entry), wraps, updatedBy: me.keyId }, me);
122
+ }
123
+ /** Plan decision 6: the entry still carries a wrap for a key the log no longer approves. */
124
+ export function wrapsUnapprovedKey(entry, state) {
125
+ return Object.keys(entry.wraps).some((keyId) => !state.approved.has(keyId));
126
+ }
127
+ /**
128
+ * §3.6: a value set at or before a removal was readable by the removed key (plan decision 5), so it is marked
129
+ * until it changes. Pass trusted entries only, keyed by id.
130
+ */
131
+ export function rotateMarks(values, state) {
132
+ return rotateMarksFor(values, state.removed.map((removal) => ({ at: removal.at, name: state.keys.get(removal.keyId)?.name ?? removal.keyId })));
133
+ }
134
+ /**
135
+ * {@link rotateMarks} for removals given by name and time: a machine that remembers a removal it saw keeps its
136
+ * marks even after the removed key's request file is gone from the tree.
137
+ */
138
+ export function rotateMarksFor(values, removals) {
139
+ const marks = [];
140
+ for (const [entryId, entry] of values) {
141
+ const setAt = Date.parse(entry.updatedAt);
142
+ const names = removals.filter((removal) => setAt <= Date.parse(removal.at)).map((removal) => removal.name);
143
+ if (names.length > 0) {
144
+ marks.push({ entryId, label: entry.label, secret: entry.secret, removedNames: [...new Set(names)] });
145
+ }
146
+ }
147
+ return marks;
148
+ }
@@ -5,7 +5,7 @@
5
5
  * wire — both halves of it. The report shape is the same {@link WsiReport}, so a single renderer
6
6
  * (and a single HTML export) serves both.
7
7
  */
8
- import type { SoapExchange } from '../../types.js';
8
+ import type { SoapExchange } from '../../soap/types.js';
9
9
  import type { WsdlDefinition } from '../../wsdl/model.js';
10
10
  import type { OperationRef } from '../../soap/request-builder.js';
11
11
  import type { WsiMessageBinding, WsiMessageContext, WsiMessageDirection, WsiReport } from './types.js';
@@ -41,7 +41,7 @@ export declare function wsiMessageContext(exchange: SoapExchange, options: RunMe
41
41
  export declare function runMessageAssertions(exchange: SoapExchange, options: RunMessageAssertionsOptions): WsiReport;
42
42
  /**
43
43
  * Derives the {@link WsiMessageBinding} one operation implies, so a caller holding an
44
- * `ImportResult` does not have to walk the model itself. Returns `undefined` when the binding is
44
+ * `WsdlImportResult` does not have to walk the model itself. Returns `undefined` when the binding is
45
45
  * not a SOAP binding, or has no such operation.
46
46
  *
47
47
  * @param definition the merged description
@@ -162,7 +162,7 @@ export function runMessageAssertions(exchange, options) {
162
162
  }
163
163
  /**
164
164
  * Derives the {@link WsiMessageBinding} one operation implies, so a caller holding an
165
- * `ImportResult` does not have to walk the model itself. Returns `undefined` when the binding is
165
+ * `WsdlImportResult` does not have to walk the model itself. Returns `undefined` when the binding is
166
166
  * not a SOAP binding, or has no such operation.
167
167
  *
168
168
  * @param definition the merged description
@@ -6,7 +6,7 @@ import type { DefinitionBundle } from '../../wsdl/resolver.js';
6
6
  import type { SchemaSet } from '../../xsd/schema-set.js';
7
7
  import type { ValidationProblem } from '../types.js';
8
8
  import type { WsiReport, WsiWsdlContext } from './types.js';
9
- /** What {@link wsiWsdlContext} needs: exactly the interesting half of an `ImportResult`. */
9
+ /** What {@link wsiWsdlContext} needs: exactly the interesting half of a `WsdlImportResult`. */
10
10
  export interface WsiWsdlContextInput {
11
11
  readonly definition: WsdlDefinition;
12
12
  readonly bundle: DefinitionBundle;
@@ -15,7 +15,7 @@ export interface WsiWsdlContextInput {
15
15
  /**
16
16
  * Builds the context the assertions run against, indexing the bundle's documents by location.
17
17
  *
18
- * @param input the parsed definition, its bundle and its schema set (an `ImportResult` fits)
18
+ * @param input the parsed definition, its bundle and its schema set (a `WsdlImportResult` fits)
19
19
  */
20
20
  export declare function wsiWsdlContext(input: WsiWsdlContextInput): WsiWsdlContext;
21
21
  /** Options accepted by {@link runWsdlAssertions}. */
@@ -6,7 +6,7 @@ import { isNotApplicable } from './types.js';
6
6
  /**
7
7
  * Builds the context the assertions run against, indexing the bundle's documents by location.
8
8
  *
9
- * @param input the parsed definition, its bundle and its schema set (an `ImportResult` fits)
9
+ * @param input the parsed definition, its bundle and its schema set (a `WsdlImportResult` fits)
10
10
  */
11
11
  export function wsiWsdlContext(input) {
12
12
  const documents = new Map();
@@ -10,7 +10,7 @@
10
10
  * licence); the rest of every assertion's description is a paraphrase.
11
11
  */
12
12
  import type { Document, Element } from '@xmldom/xmldom';
13
- import type { SoapExchange } from '../../types.js';
13
+ import type { SoapExchange } from '../../soap/types.js';
14
14
  import type { WsdlDefinition } from '../../wsdl/model.js';
15
15
  import type { DefinitionBundle } from '../../wsdl/resolver.js';
16
16
  import type { SchemaSet } from '../../xsd/schema-set.js';
@@ -0,0 +1,138 @@
1
+ /**
2
+ * A project's webhook collection: outbound requests that play a provider calling the user's own
3
+ * receiver (spec `2026-09-28-wirebench-openapi-webhooks-import-design.md` §4). Items are ordinary
4
+ * REST requests; the collection and its folders carry a *target* where an API carries a base URL.
5
+ */
6
+ import { WirebenchError } from '../errors.js';
7
+ import type { AuthConfig, CreateOptions } from '../project/model.js';
8
+ import type { RestFolder, RestRequestDef } from '../rest/model.js';
9
+ import type { SignatureScheme } from '../http/webhook-signature.js';
10
+ /** The link from an imported item back to the OpenAPI entry it came from. */
11
+ export type HookLink = {
12
+ readonly kind: 'webhook';
13
+ readonly name: string;
14
+ } | {
15
+ readonly kind: 'callback';
16
+ /** The parent operation's contract key, e.g. `post /subscriptions`. */
17
+ readonly operation: string;
18
+ readonly name: string;
19
+ /** The callback's path-item key, verbatim, e.g. `{$request.body#/callbackUrl}`. */
20
+ readonly expression: string;
21
+ };
22
+ /**
23
+ * How the webhook collection, a folder or an item signs what it sends (spec §5.1). Absent means
24
+ * inherit: the item, then the nearest folder, then the collection; nothing set anywhere is `none`.
25
+ */
26
+ export type WebhookSigning = {
27
+ readonly mode: 'none';
28
+ } | {
29
+ readonly mode: 'sign';
30
+ readonly scheme: SignatureScheme;
31
+ /** Opaque reference into the OS-keychain-backed secret store. Never a secret value. */
32
+ readonly secretRef?: string;
33
+ /** The name CI supplies this secret under: `WIREBENCH_SECRET_<name>`. Not a secret; committed. */
34
+ readonly secretEnv?: string;
35
+ };
36
+ /** The signing an item sends with, and where it was set. */
37
+ export interface EffectiveSigning {
38
+ readonly signing: WebhookSigning;
39
+ readonly from: 'item' | 'folder' | 'collection' | 'default';
40
+ /** The item's or the folder's name; absent for the collection and the default. */
41
+ readonly fromName?: string;
42
+ }
43
+ /** A folder of the webhook collection: a REST folder that may override the target. */
44
+ export interface WebhookFolder extends Omit<RestFolder, 'folders'> {
45
+ /** Overrides the inherited target for everything inside; the nearest folder that sets one wins. */
46
+ readonly target?: string;
47
+ /** Overrides the inherited signing for everything inside. */
48
+ readonly signing?: WebhookSigning;
49
+ /** Set on a group imported from an API's definition: that API, so its update can find the group. */
50
+ readonly source?: {
51
+ readonly apiId: string;
52
+ };
53
+ readonly folders: readonly WebhookFolder[];
54
+ }
55
+ /** One project's webhook collection. */
56
+ export interface WebhookCollection {
57
+ /** Where items are sent; may contain `${…}` properties. */
58
+ readonly target: string;
59
+ /** What items (and folders) whose auth is `inherit` end up using. */
60
+ readonly auth?: AuthConfig;
61
+ /** Overrides the inherited signing for everything inside. */
62
+ readonly signing?: WebhookSigning;
63
+ readonly folders: readonly WebhookFolder[];
64
+ readonly requests: readonly RestRequestDef[];
65
+ }
66
+ /** The target a new collection starts with. */
67
+ export declare const DEFAULT_WEBHOOK_TARGET = "${webhookTarget}";
68
+ /** The project property a new collection seeds, empty, when the project has none by that name. */
69
+ export declare const WEBHOOK_TARGET_PROPERTY = "webhookTarget";
70
+ /** Prefix of the id the desktop gives a project's collection on the wire: `webhooks:<projectId>`. */
71
+ export declare const WEBHOOKS_COLLECTION_PREFIX = "webhooks:";
72
+ export interface CreateWebhookCollectionInput {
73
+ readonly target?: string;
74
+ readonly auth?: AuthConfig;
75
+ readonly signing?: WebhookSigning;
76
+ readonly folders?: readonly WebhookFolder[];
77
+ readonly requests?: readonly RestRequestDef[];
78
+ }
79
+ /** Creates an empty collection aimed at {@link DEFAULT_WEBHOOK_TARGET}. */
80
+ export declare function createWebhookCollection(input?: CreateWebhookCollectionInput): WebhookCollection;
81
+ export interface CreateWebhookFolderInput extends CreateOptions {
82
+ readonly slug?: string;
83
+ readonly description?: string;
84
+ readonly auth?: AuthConfig;
85
+ readonly target?: string;
86
+ readonly signing?: WebhookSigning;
87
+ readonly source?: {
88
+ readonly apiId: string;
89
+ };
90
+ readonly folders?: readonly WebhookFolder[];
91
+ readonly requests?: readonly RestRequestDef[];
92
+ }
93
+ /** Creates a webhook folder. */
94
+ export declare function createWebhookFolder(name: string, input?: CreateWebhookFolderInput): WebhookFolder;
95
+ type Tree = Pick<WebhookCollection, 'folders' | 'requests'>;
96
+ /** Every request of the collection, root first, then each folder depth-first. */
97
+ export declare function webhookRequests(tree: Tree): RestRequestDef[];
98
+ /** Every folder of the collection, depth-first. */
99
+ export declare function webhookFolders(tree: Tree): WebhookFolder[];
100
+ /** The request with `id`, and the folders from the root down to it. */
101
+ export declare function webhookPath(tree: Tree, id: string): {
102
+ readonly request: RestRequestDef;
103
+ readonly chain: readonly WebhookFolder[];
104
+ } | undefined;
105
+ /** The request with `id`, anywhere in the collection. */
106
+ export declare function findWebhookRequest(tree: Tree, id: string): RestRequestDef | undefined;
107
+ /** The target an item under `chain` (root → leaf folders) is sent to, before property expansion. */
108
+ export declare function effectiveTarget(collection: Pick<WebhookCollection, 'target'>, chain: readonly WebhookFolder[]): string;
109
+ /**
110
+ * The signing `request`, under `chain` (root → leaf folders), is sent with: its own, else the
111
+ * nearest folder's, else the collection's, else none. Takes the request itself so a caller holding
112
+ * an edited copy (the desktop's draft) resolves what will actually be sent.
113
+ */
114
+ export declare function signingAlong(collection: Pick<WebhookCollection, 'signing'>, chain: readonly WebhookFolder[], request: RestRequestDef): EffectiveSigning;
115
+ /** The signing request `requestId` is sent with (spec §5.1); none for an id the collection lacks. */
116
+ export declare function effectiveSigning(collection: WebhookCollection, requestId: string): EffectiveSigning;
117
+ /** `the item “Paid”`, `the folder “Orders”`, `the Webhooks collection`. */
118
+ export declare function signingSourceLabel(effective: EffectiveSigning): string;
119
+ /**
120
+ * The ref a run's `GetSecret` is asked for. With only a CI name, a pseudo-ref whose declared name
121
+ * is that CI name, so `WIREBENCH_SECRET_<secretEnv>` is read first (`envVariablesFor`).
122
+ */
123
+ export declare function signingSecretRef(signing: Extract<WebhookSigning, {
124
+ mode: 'sign';
125
+ }>): string | undefined;
126
+ /**
127
+ * Refuses a webhook item's target that cannot be sent to, once it is expanded: an empty one (unless
128
+ * the item's own URL is absolute) and one that is not `http(s)`. A target still holding a reference
129
+ * nothing resolved is left to the unresolved list, which already refuses the send and names it.
130
+ *
131
+ * @throws WirebenchError `webhook-target-missing` | `webhook-target-invalid`
132
+ */
133
+ export declare function assertWebhookTarget(baseUrl: string, url: string, unresolved: boolean): void;
134
+ /** The refusal when signing is set but its secret is not: a send never goes out unsigned (§5.2). */
135
+ export declare function signingSecretMissing(effective: EffectiveSigning, ref?: string): WirebenchError;
136
+ /** The key *Update definition* matches an imported item by: kind, name, method — never the URL. */
137
+ export declare function hookKey(link: HookLink, method: string): string;
138
+ export {};
@@ -0,0 +1,150 @@
1
+ /**
2
+ * A project's webhook collection: outbound requests that play a provider calling the user's own
3
+ * receiver (spec `2026-09-28-wirebench-openapi-webhooks-import-design.md` §4). Items are ordinary
4
+ * REST requests; the collection and its folders carry a *target* where an API carries a base URL.
5
+ */
6
+ import { WirebenchError } from '../errors.js';
7
+ import { generateId } from '../project/model.js';
8
+ import { slugify } from '../project/paths.js';
9
+ import { SIGNING_PSEUDO_REF_PREFIX } from '../secrets/env-names.js';
10
+ /** The target a new collection starts with. */
11
+ export const DEFAULT_WEBHOOK_TARGET = '${webhookTarget}';
12
+ /** The project property a new collection seeds, empty, when the project has none by that name. */
13
+ export const WEBHOOK_TARGET_PROPERTY = 'webhookTarget';
14
+ /** Prefix of the id the desktop gives a project's collection on the wire: `webhooks:<projectId>`. */
15
+ export const WEBHOOKS_COLLECTION_PREFIX = 'webhooks:';
16
+ /** Creates an empty collection aimed at {@link DEFAULT_WEBHOOK_TARGET}. */
17
+ export function createWebhookCollection(input = {}) {
18
+ return {
19
+ target: input.target ?? DEFAULT_WEBHOOK_TARGET,
20
+ ...(input.auth !== undefined ? { auth: input.auth } : {}),
21
+ ...(input.signing !== undefined ? { signing: input.signing } : {}),
22
+ folders: input.folders ?? [],
23
+ requests: input.requests ?? [],
24
+ };
25
+ }
26
+ /** Creates a webhook folder. */
27
+ export function createWebhookFolder(name, input = {}) {
28
+ return {
29
+ id: input.id ?? (input.newId ?? generateId)(),
30
+ name,
31
+ slug: input.slug ?? slugify(name),
32
+ order: input.order ?? 0,
33
+ ...(input.description !== undefined ? { description: input.description } : {}),
34
+ ...(input.auth !== undefined ? { auth: input.auth } : {}),
35
+ ...(input.target !== undefined ? { target: input.target } : {}),
36
+ ...(input.signing !== undefined ? { signing: input.signing } : {}),
37
+ ...(input.source !== undefined ? { source: { apiId: input.source.apiId } } : {}),
38
+ folders: input.folders ?? [],
39
+ requests: input.requests ?? [],
40
+ };
41
+ }
42
+ /** Every request of the collection, root first, then each folder depth-first. */
43
+ export function webhookRequests(tree) {
44
+ return [...tree.requests, ...tree.folders.flatMap((folder) => webhookRequests(folder))];
45
+ }
46
+ /** Every folder of the collection, depth-first. */
47
+ export function webhookFolders(tree) {
48
+ return tree.folders.flatMap((folder) => [folder, ...webhookFolders(folder)]);
49
+ }
50
+ /** The request with `id`, and the folders from the root down to it. */
51
+ export function webhookPath(tree, id) {
52
+ const request = tree.requests.find((candidate) => candidate.id === id);
53
+ if (request !== undefined)
54
+ return { request, chain: [] };
55
+ for (const folder of tree.folders) {
56
+ const found = webhookPath(folder, id);
57
+ if (found !== undefined)
58
+ return { request: found.request, chain: [folder, ...found.chain] };
59
+ }
60
+ return undefined;
61
+ }
62
+ /** The request with `id`, anywhere in the collection. */
63
+ export function findWebhookRequest(tree, id) {
64
+ return webhookPath(tree, id)?.request;
65
+ }
66
+ /** The target an item under `chain` (root → leaf folders) is sent to, before property expansion. */
67
+ export function effectiveTarget(collection, chain) {
68
+ for (let index = chain.length - 1; index >= 0; index -= 1) {
69
+ const target = chain[index]?.target;
70
+ if (target !== undefined)
71
+ return target;
72
+ }
73
+ return collection.target;
74
+ }
75
+ const NO_SIGNING = { signing: { mode: 'none' }, from: 'default' };
76
+ /**
77
+ * The signing `request`, under `chain` (root → leaf folders), is sent with: its own, else the
78
+ * nearest folder's, else the collection's, else none. Takes the request itself so a caller holding
79
+ * an edited copy (the desktop's draft) resolves what will actually be sent.
80
+ */
81
+ export function signingAlong(collection, chain, request) {
82
+ if (request.signing !== undefined)
83
+ return { signing: request.signing, from: 'item', fromName: request.name };
84
+ for (let index = chain.length - 1; index >= 0; index -= 1) {
85
+ const folder = chain[index];
86
+ if (folder.signing !== undefined)
87
+ return { signing: folder.signing, from: 'folder', fromName: folder.name };
88
+ }
89
+ return collection.signing !== undefined ? { signing: collection.signing, from: 'collection' } : NO_SIGNING;
90
+ }
91
+ /** The signing request `requestId` is sent with (spec §5.1); none for an id the collection lacks. */
92
+ export function effectiveSigning(collection, requestId) {
93
+ const path = webhookPath(collection, requestId);
94
+ return path === undefined ? NO_SIGNING : signingAlong(collection, path.chain, path.request);
95
+ }
96
+ /** `the item “Paid”`, `the folder “Orders”`, `the Webhooks collection`. */
97
+ export function signingSourceLabel(effective) {
98
+ switch (effective.from) {
99
+ case 'item':
100
+ return `the item “${effective.fromName ?? ''}”`;
101
+ case 'folder':
102
+ return `the folder “${effective.fromName ?? ''}”`;
103
+ default:
104
+ return 'the Webhooks collection';
105
+ }
106
+ }
107
+ /**
108
+ * The ref a run's `GetSecret` is asked for. With only a CI name, a pseudo-ref whose declared name
109
+ * is that CI name, so `WIREBENCH_SECRET_<secretEnv>` is read first (`envVariablesFor`).
110
+ */
111
+ export function signingSecretRef(signing) {
112
+ if (signing.secretRef !== undefined && signing.secretRef !== '')
113
+ return signing.secretRef;
114
+ return signing.secretEnv !== undefined ? `${SIGNING_PSEUDO_REF_PREFIX}${signing.secretEnv}` : undefined;
115
+ }
116
+ const ABSOLUTE_HTTP = /^https?:\/\//i;
117
+ /**
118
+ * Refuses a webhook item's target that cannot be sent to, once it is expanded: an empty one (unless
119
+ * the item's own URL is absolute) and one that is not `http(s)`. A target still holding a reference
120
+ * nothing resolved is left to the unresolved list, which already refuses the send and names it.
121
+ *
122
+ * @throws WirebenchError `webhook-target-missing` | `webhook-target-invalid`
123
+ */
124
+ export function assertWebhookTarget(baseUrl, url, unresolved) {
125
+ if (baseUrl.trim() === '') {
126
+ if (!ABSOLUTE_HTTP.test(url)) {
127
+ throw new WirebenchError('webhook-target-missing', 'Set the Webhooks target');
128
+ }
129
+ return;
130
+ }
131
+ if (!ABSOLUTE_HTTP.test(baseUrl) && !(unresolved && baseUrl.includes('${'))) {
132
+ throw new WirebenchError('webhook-target-invalid', 'The Webhooks target must start with http:// or https://');
133
+ }
134
+ }
135
+ /** The refusal when signing is set but its secret is not: a send never goes out unsigned (§5.2). */
136
+ export function signingSecretMissing(effective, ref) {
137
+ return new WirebenchError('webhook-signing-secret', `Signing is set on ${signingSourceLabel(effective)} but its secret is not set`, {
138
+ details: {
139
+ from: effective.from,
140
+ ...(effective.fromName !== undefined ? { fromName: effective.fromName } : {}),
141
+ // The CLI names the variable to set from this (`explainMissingSecret`).
142
+ ...(ref !== undefined ? { ref } : {}),
143
+ },
144
+ });
145
+ }
146
+ /** The key *Update definition* matches an imported item by: kind, name, method — never the URL. */
147
+ export function hookKey(link, method) {
148
+ const verb = method.toLowerCase();
149
+ return link.kind === 'webhook' ? `webhook ${link.name} ${verb}` : `callback ${link.operation} ${link.name} ${verb}`;
150
+ }
@@ -8,7 +8,7 @@
8
8
  * with `node:path`, which would emit `\` on Windows and break every pattern below.
9
9
  */
10
10
  /** What kind of entity a tree path belongs to. */
11
- export type TreeEntityKind = 'workspace' | 'environment' | 'project' | 'interface' | 'request' | 'project-environment' | 'wss' | 'keystores' | 'attachment' | 'definition' | 'other';
11
+ export type TreeEntityKind = 'workspace' | 'environment' | 'project' | 'interface' | 'request' | 'project-environment' | 'wss' | 'keystores' | 'attachment' | 'definition' | 'team-secrets' | 'other';
12
12
  /**
13
13
  * The entity a tree path belongs to. `key` identifies the entity itself (as opposed to the file):
14
14
  * a request's `.request.yaml` and `.xml` share one key, as do every file under one interface's
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import { WSS_DIR, REQUEST_SUFFIX } from '../project/paths.js';
11
11
  import { KEYSTORES_PATH } from '../project/serialize.js';
12
- import { WORKSPACE_ENVIRONMENTS_DIR, WORKSPACE_MANIFEST, WORKSPACE_PROJECTS_DIR } from './paths.js';
12
+ import { TEAM_SECRETS_DIR, WORKSPACE_ENVIRONMENTS_DIR, WORKSPACE_MANIFEST, WORKSPACE_PROJECTS_DIR } from './paths.js';
13
13
  /** Last `/`-separated segment of a path. */
14
14
  function basename(path) {
15
15
  const index = path.lastIndexOf('/');
@@ -89,6 +89,10 @@ export function describeTreePath(relativePath) {
89
89
  const rest = projectMatch[2] ?? '';
90
90
  return describeProjectPath(projectSlug, rest, relativePath);
91
91
  }
92
+ const teamSecretsMatch = new RegExp(`^${TEAM_SECRETS_DIR}/(?:keys|access|values)/([^/]+)\\.yaml$`).exec(relativePath);
93
+ if (teamSecretsMatch !== null) {
94
+ return { kind: 'team-secrets', name: teamSecretsMatch[1] ?? basename(relativePath), key: relativePath };
95
+ }
92
96
  return { kind: 'other', name: basename(relativePath), key: relativePath };
93
97
  }
94
98
  /** Human-facing label for one entity kind, singular. */
@@ -103,6 +107,7 @@ const LABELS = {
103
107
  keystores: 'keystores',
104
108
  attachment: 'attachment',
105
109
  definition: 'definition',
110
+ 'team-secrets': 'team secrets file',
106
111
  other: 'file',
107
112
  };
108
113
  /** Kinds whose label does not take a plain `s` suffix when the count isn't 1. */