@wirebench/engine 2.2.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -14,9 +14,8 @@
14
14
  * `Endpoint` object of their own, so neither of the first two branches
15
15
  * carries one.
16
16
  */
17
- import type { Endpoint, Environment, Interface, Project, PropertyMap, RequestDef } from '../project/model.js';
17
+ import type { Endpoint, Environment, Interface, Project, PropertyMap, SoapRequestDef } from '../project/model.js';
18
18
  import type { BaseUrlSource, EndpointSource } from '../project/environments.js';
19
- import type { RestApi } from '../rest/model.js';
20
19
  import type { PropertyScopes } from '../project/properties.js';
21
20
  import type { Workspace, WorkspaceEnvironment } from './model.js';
22
21
  /**
@@ -25,6 +24,11 @@ import type { Workspace, WorkspaceEnvironment } from './model.js';
25
24
  * is `undefined`).
26
25
  */
27
26
  export declare function linkedEnvironment(project: Project, workspaceEnv: WorkspaceEnvironment | undefined): Environment | undefined;
27
+ /**
28
+ * `workspace` with `environmentId` as its active environment, or with none active when it is
29
+ * `undefined`: resolution under a chosen environment without touching the workspace's own.
30
+ */
31
+ export declare function withActiveEnvironment(workspace: Workspace, environmentId: string | undefined): Workspace;
28
32
  /**
29
33
  * Builds the {@link PropertyScopes} for expanding properties against `project` as opened inside
30
34
  * `workspace`. `env` merges the active workspace environment's properties with the linked
@@ -54,7 +58,7 @@ export declare function resolveWorkspaceEndpoint(input: {
54
58
  readonly project: Project;
55
59
  readonly projectSlug: string;
56
60
  readonly iface: Interface;
57
- readonly request: Pick<RequestDef, 'endpointId' | 'endpointUrl'>;
61
+ readonly request: Pick<SoapRequestDef, 'endpointId' | 'endpointUrl'>;
58
62
  }): {
59
63
  url: string | undefined;
60
64
  source: EndpointSource;
@@ -72,7 +76,10 @@ export declare function resolveWorkspaceApiBaseUrl(input: {
72
76
  readonly workspace: Workspace;
73
77
  readonly project: Project;
74
78
  readonly projectSlug: string;
75
- readonly api: Pick<RestApi, 'slug' | 'baseUrl'>;
79
+ readonly api: {
80
+ readonly slug: string;
81
+ readonly baseUrl: string;
82
+ };
76
83
  }): {
77
84
  url: string;
78
85
  source: BaseUrlSource;
@@ -27,6 +27,18 @@ export function linkedEnvironment(project, workspaceEnv) {
27
27
  }
28
28
  return project.environments.find((environment) => environment.slug === workspaceEnv.slug);
29
29
  }
30
+ /**
31
+ * `workspace` with `environmentId` as its active environment, or with none active when it is
32
+ * `undefined`: resolution under a chosen environment without touching the workspace's own.
33
+ */
34
+ export function withActiveEnvironment(workspace, environmentId) {
35
+ if (environmentId !== undefined) {
36
+ return { ...workspace, activeEnvironmentId: environmentId };
37
+ }
38
+ const copy = { ...workspace };
39
+ delete copy.activeEnvironmentId;
40
+ return copy;
41
+ }
30
42
  /** Finds `workspace`'s active environment (per `activeEnvironmentId`), or `undefined` when none is active. */
31
43
  function activeWorkspaceEnvironment(workspace) {
32
44
  if (workspace.activeEnvironmentId === undefined) {
@@ -9,7 +9,7 @@ export { WORKSPACE_FORMAT_VERSION, createWorkspace, createWorkspaceEnvironment }
9
9
  export type { Workspace, WorkspaceEnvironment, WorkspaceProjectRef } from './model.js';
10
10
  export { parseWorkspaceFile, workspaceEnvironmentFileSchema, workspaceManifestSchema, workspaceProjectRefSchema, workspaceLocalStateSchema, workspaceShareSchema, } from './schema.js';
11
11
  export type { WorkspaceEnvironmentFile, WorkspaceManifestFile, WorkspaceProjectRefFile } from './schema.js';
12
- export { WORKSPACES_DIR, WORKSPACE_ENVIRONMENTS_DIR, WORKSPACE_MANIFEST, WORKSPACE_PROJECTS_DIR, WORKSPACE_STATE_FILE, WORKSPACE_TREE_DIR, WORKSPACE_JOINING_DIR, GIT_ATTRIBUTES_FILE, GIT_ATTRIBUTES, workspaceDir, workspaceEnvironmentFile, workspaceManifestFile, workspaceProjectDir, workspaceTreeDir, assertPathSegment, } from './paths.js';
12
+ export { WORKSPACES_DIR, WORKSPACE_ENVIRONMENTS_DIR, WORKSPACE_MANIFEST, WORKSPACE_PROJECTS_DIR, WORKSPACE_STATE_FILE, WORKSPACE_TREE_DIR, WORKSPACE_JOINING_DIR, GIT_ATTRIBUTES_FILE, GIT_ATTRIBUTES, TEAM_SECRETS_DIR, workspaceDir, workspaceEnvironmentFile, workspaceManifestFile, workspaceProjectDir, workspaceTreeDir, assertPathSegment, } from './paths.js';
13
13
  export { workspaceFiles } from './serialize.js';
14
14
  export type { WorkspaceFiles } from './serialize.js';
15
15
  export { loadWorkspace } from './load.js';
@@ -20,8 +20,8 @@ export { migrateWorkspace } from './migrate.js';
20
20
  export type { MigratedWorkspaceManifest } from './migrate.js';
21
21
  export { WORKSPACE_LOCAL_FILE, EMPTY_LOCAL_STATE, loadLocalState, saveLocalState } from './local-state.js';
22
22
  export type { WorkspaceLocalState, LocalStateOptions } from './local-state.js';
23
- export { WORKSPACE_SHARE_FILE, DEFAULT_GIT_SHARE_SETTINGS, loadShare, saveShare, deleteShare } from './share.js';
24
- export type { ShareKind, GitShareSettings, WorkspaceShare, ShareOptions } from './share.js';
23
+ export { WORKSPACE_SHARE_FILE, DEFAULT_GIT_SHARE_SETTINGS, DEFAULT_SYNC_SETTINGS, loadShare, saveShare, deleteShare, shareSyncSettings, } from './share.js';
24
+ export type { ShareKind, GitShareSettings, ServerShareSettings, SyncSettings, WorkspaceShare, ShareOptions, } from './share.js';
25
25
  export { reidentifyProject } from './reidentify.js';
26
26
  export { resolveWorkspaceApiBaseUrl, linkedEnvironment, resolveWorkspaceEndpoint, resolveWorkspaceScopes, } from './environments.js';
27
27
  export { commitMessage, describeTreePath } from './commit-message.js';
@@ -7,13 +7,13 @@
7
7
  */
8
8
  export { WORKSPACE_FORMAT_VERSION, createWorkspace, createWorkspaceEnvironment } from './model.js';
9
9
  export { parseWorkspaceFile, workspaceEnvironmentFileSchema, workspaceManifestSchema, workspaceProjectRefSchema, workspaceLocalStateSchema, workspaceShareSchema, } from './schema.js';
10
- export { WORKSPACES_DIR, WORKSPACE_ENVIRONMENTS_DIR, WORKSPACE_MANIFEST, WORKSPACE_PROJECTS_DIR, WORKSPACE_STATE_FILE, WORKSPACE_TREE_DIR, WORKSPACE_JOINING_DIR, GIT_ATTRIBUTES_FILE, GIT_ATTRIBUTES, workspaceDir, workspaceEnvironmentFile, workspaceManifestFile, workspaceProjectDir, workspaceTreeDir, assertPathSegment, } from './paths.js';
10
+ export { WORKSPACES_DIR, WORKSPACE_ENVIRONMENTS_DIR, WORKSPACE_MANIFEST, WORKSPACE_PROJECTS_DIR, WORKSPACE_STATE_FILE, WORKSPACE_TREE_DIR, WORKSPACE_JOINING_DIR, GIT_ATTRIBUTES_FILE, GIT_ATTRIBUTES, TEAM_SECRETS_DIR, workspaceDir, workspaceEnvironmentFile, workspaceManifestFile, workspaceProjectDir, workspaceTreeDir, assertPathSegment, } from './paths.js';
11
11
  export { workspaceFiles } from './serialize.js';
12
12
  export { loadWorkspace } from './load.js';
13
13
  export { saveWorkspace } from './save.js';
14
14
  export { migrateWorkspace } from './migrate.js';
15
15
  export { WORKSPACE_LOCAL_FILE, EMPTY_LOCAL_STATE, loadLocalState, saveLocalState } from './local-state.js';
16
- export { WORKSPACE_SHARE_FILE, DEFAULT_GIT_SHARE_SETTINGS, loadShare, saveShare, deleteShare } from './share.js';
16
+ export { WORKSPACE_SHARE_FILE, DEFAULT_GIT_SHARE_SETTINGS, DEFAULT_SYNC_SETTINGS, loadShare, saveShare, deleteShare, shareSyncSettings, } from './share.js';
17
17
  export { reidentifyProject } from './reidentify.js';
18
18
  export { resolveWorkspaceApiBaseUrl, linkedEnvironment, resolveWorkspaceEndpoint, resolveWorkspaceScopes, } from './environments.js';
19
19
  export { commitMessage, describeTreePath } from './commit-message.js';
@@ -32,13 +32,16 @@ export declare const WORKSPACE_TREE_DIR = "tree";
32
32
  export declare const WORKSPACE_JOINING_DIR = ".joining";
33
33
  /** File name of the tree's own `.gitattributes`, written on share and on join if missing. */
34
34
  export declare const GIT_ATTRIBUTES_FILE = ".gitattributes";
35
+ /** Directory at the tree root holding team secrets: key requests, the access log and the vault (team-secrets §4). */
36
+ export declare const TEAM_SECRETS_DIR = "team-secrets";
35
37
  /**
36
38
  * Contents of {@link GIT_ATTRIBUTES_FILE}: normalises line endings, and leaves bytes alone where
37
39
  * they must stay exact — attachments, and the definition caches of interfaces and APIs, which keep
38
40
  * each document as fetched (a WSDL's manifest records its SHA-256, so a CRLF definition normalised
39
- * by git fails that check on the other side, which then re-fetches and rewrites the cache).
41
+ * by git fails that check on the other side, which then re-fetches and rewrites the cache). A vault
42
+ * entry is never text-merged: two concurrent changes are a conflict the sync settles whole.
40
43
  */
41
- export declare const GIT_ATTRIBUTES = "* text=auto eol=lf\n*.yaml text\n*.xml text\n*.wsdl text\n*.xsd text\nprojects/*/attachments/** -text\nprojects/*/interfaces/*/definition/** -text\nprojects/*/apis/*/definition/** -text\n";
44
+ export declare const GIT_ATTRIBUTES = "* text=auto eol=lf\n*.yaml text\n*.xml text\n*.wsdl text\n*.xsd text\nprojects/*/attachments/** -text\nprojects/*/interfaces/*/definition/** -text\nprojects/*/apis/*/definition/** -text\nteam-secrets/values/** -merge\n";
42
45
  /** Absolute path of a workspace's own directory, given the app's user-data root and the workspace id. */
43
46
  export declare function workspaceDir(userDataDir: string, workspaceId: string): string;
44
47
  /** Absolute path of a workspace's manifest. */
@@ -50,13 +50,16 @@ export const WORKSPACE_TREE_DIR = 'tree';
50
50
  export const WORKSPACE_JOINING_DIR = '.joining';
51
51
  /** File name of the tree's own `.gitattributes`, written on share and on join if missing. */
52
52
  export const GIT_ATTRIBUTES_FILE = '.gitattributes';
53
+ /** Directory at the tree root holding team secrets: key requests, the access log and the vault (team-secrets §4). */
54
+ export const TEAM_SECRETS_DIR = 'team-secrets';
53
55
  /**
54
56
  * Contents of {@link GIT_ATTRIBUTES_FILE}: normalises line endings, and leaves bytes alone where
55
57
  * they must stay exact — attachments, and the definition caches of interfaces and APIs, which keep
56
58
  * each document as fetched (a WSDL's manifest records its SHA-256, so a CRLF definition normalised
57
- * by git fails that check on the other side, which then re-fetches and rewrites the cache).
59
+ * by git fails that check on the other side, which then re-fetches and rewrites the cache). A vault
60
+ * entry is never text-merged: two concurrent changes are a conflict the sync settles whole.
58
61
  */
59
- export const GIT_ATTRIBUTES = '* text=auto eol=lf\n*.yaml text\n*.xml text\n*.wsdl text\n*.xsd text\nprojects/*/attachments/** -text\nprojects/*/interfaces/*/definition/** -text\nprojects/*/apis/*/definition/** -text\n';
62
+ export const GIT_ATTRIBUTES = '* text=auto eol=lf\n*.yaml text\n*.xml text\n*.wsdl text\n*.xsd text\nprojects/*/attachments/** -text\nprojects/*/interfaces/*/definition/** -text\nprojects/*/apis/*/definition/** -text\nteam-secrets/values/** -merge\n';
60
63
  /** Absolute path of a workspace's own directory, given the app's user-data root and the workspace id. */
61
64
  export function workspaceDir(userDataDir, workspaceId) {
62
65
  return join(userDataDir, WORKSPACES_DIR, workspaceId);
@@ -55,15 +55,15 @@ export declare const workspaceLocalStateSchema: z.ZodObject<{
55
55
  }, z.core.$strip>;
56
56
  /**
57
57
  * `share.yaml`: absent means a local workspace. `path`, when set, must be absolute — it is only
58
- * ever written from a native folder picker. `kind: 'git'` requires `git`; `kind: 'server'`
59
- * requires `server`.
58
+ * ever written from a native folder picker — and a server share has none, because its tree is
59
+ * always the managed `tree/`. `kind: 'git'` requires `git`; `kind: 'server'` requires `server`.
60
60
  */
61
61
  export declare const workspaceShareSchema: z.ZodObject<{
62
62
  version: z.ZodLiteral<1>;
63
63
  kind: z.ZodEnum<{
64
64
  server: "server";
65
- folder: "folder";
66
65
  git: "git";
66
+ folder: "folder";
67
67
  }>;
68
68
  path: z.ZodOptional<z.ZodString>;
69
69
  git: z.ZodOptional<z.ZodObject<{
@@ -76,6 +76,10 @@ export declare const workspaceShareSchema: z.ZodObject<{
76
76
  server: z.ZodOptional<z.ZodObject<{
77
77
  url: z.ZodString;
78
78
  workspaceId: z.ZodString;
79
+ teamName: z.ZodOptional<z.ZodString>;
80
+ autoFetchSeconds: z.ZodDefault<z.ZodNumber>;
81
+ commitOnSave: z.ZodDefault<z.ZodBoolean>;
82
+ pushOnSave: z.ZodDefault<z.ZodBoolean>;
79
83
  }, z.core.$strip>>;
80
84
  }, z.core.$strip>;
81
85
  /** The manifest document as persisted. */
@@ -10,6 +10,7 @@
10
10
  import { isAbsolute } from 'node:path';
11
11
  import { z } from 'zod';
12
12
  import { WorkspaceError } from '../errors.js';
13
+ import { TEAMS_ID_PATTERN } from '../server-api/teams.js';
13
14
  import { WORKSPACE_FORMAT_VERSION } from './model.js';
14
15
  const nonEmpty = z.string().min(1);
15
16
  const propertyMapSchema = z.record(z.string(), z.string());
@@ -70,10 +71,26 @@ const gitShareSettingsSchema = z.object({
70
71
  commitOnSave: z.boolean(),
71
72
  pushOnSave: z.boolean(),
72
73
  });
74
+ /** An http(s) origin and nothing more: what the desktop's `normalizeServerUrl` returns (`URL.origin`). */
75
+ const SERVER_ORIGIN_PATTERN = /^https?:\/\/[^/?#]+$/;
76
+ /**
77
+ * `share.yaml`'s `server` block (server-sync spec §4.1). The three sync settings default to the
78
+ * values in `DEFAULT_SYNC_SETTINGS` (`share.ts`, which imports this file, so they are literals
79
+ * here; a test pins that the two agree). `workspaceId` is the server's ULID and equals
80
+ * `workspace.yaml`'s id; `teamName` is for display only.
81
+ */
82
+ const serverShareSettingsSchema = z.object({
83
+ url: z.string().regex(SERVER_ORIGIN_PATTERN, 'url must be an http(s) origin, with no path'),
84
+ workspaceId: z.string().regex(TEAMS_ID_PATTERN, 'workspaceId must be a ULID'),
85
+ teamName: nonEmpty.optional(),
86
+ autoFetchSeconds: z.number().int().min(0).default(60),
87
+ commitOnSave: z.boolean().default(true),
88
+ pushOnSave: z.boolean().default(true),
89
+ });
73
90
  /**
74
91
  * `share.yaml`: absent means a local workspace. `path`, when set, must be absolute — it is only
75
- * ever written from a native folder picker. `kind: 'git'` requires `git`; `kind: 'server'`
76
- * requires `server`.
92
+ * ever written from a native folder picker — and a server share has none, because its tree is
93
+ * always the managed `tree/`. `kind: 'git'` requires `git`; `kind: 'server'` requires `server`.
77
94
  */
78
95
  export const workspaceShareSchema = z
79
96
  .object({
@@ -84,7 +101,7 @@ export const workspaceShareSchema = z
84
101
  .optional()
85
102
  .refine((value) => value === undefined || isAbsolute(value), { message: 'path must be absolute' }),
86
103
  git: gitShareSettingsSchema.optional(),
87
- server: z.object({ url: nonEmpty, workspaceId: nonEmpty }).optional(),
104
+ server: serverShareSettingsSchema.optional(),
88
105
  })
89
106
  .refine((value) => value.kind !== 'git' || value.git !== undefined, {
90
107
  message: 'kind: git requires a git block',
@@ -93,6 +110,10 @@ export const workspaceShareSchema = z
93
110
  .refine((value) => value.kind !== 'server' || value.server !== undefined, {
94
111
  message: 'kind: server requires a server block',
95
112
  path: ['server'],
113
+ })
114
+ .refine((value) => value.kind !== 'server' || value.path === undefined, {
115
+ message: 'kind: server always uses the managed tree, so it takes no path',
116
+ path: ['path'],
96
117
  });
97
118
  /**
98
119
  * Validates `value` against `schema`, raising
@@ -12,38 +12,57 @@ import type { FsLike } from '../project/fs.js';
12
12
  export declare const WORKSPACE_SHARE_FILE = "share.yaml";
13
13
  /** How a workspace's tree is shared. */
14
14
  export type ShareKind = 'folder' | 'git' | 'server';
15
- /** Git-specific share settings, all required once `kind: 'git'` is set (`remote` may still be unset). */
16
- export interface GitShareSettings {
17
- readonly remote?: string;
18
- readonly branch: string;
15
+ /**
16
+ * The settings `SyncService` and the Sync panel read, whatever carries the sync: how often to
17
+ * fetch, and whether a save commits and pushes (server-sync spec §5.2).
18
+ */
19
+ export interface SyncSettings {
19
20
  readonly autoFetchSeconds: number;
20
21
  readonly commitOnSave: boolean;
21
22
  readonly pushOnSave: boolean;
22
23
  }
24
+ /** Defaults a freshly shared git or server workspace is given. */
25
+ export declare const DEFAULT_SYNC_SETTINGS: SyncSettings;
26
+ /** Git-specific share settings, all required once `kind: 'git'` is set (`remote` may still be unset). */
27
+ export interface GitShareSettings extends SyncSettings {
28
+ readonly remote?: string;
29
+ readonly branch: string;
30
+ }
23
31
  /** Defaults a freshly-shared git workspace is given. */
24
32
  export declare const DEFAULT_GIT_SHARE_SETTINGS: GitShareSettings;
33
+ /** Wirebench Server share settings (server-sync spec §4.1). */
34
+ export interface ServerShareSettings extends SyncSettings {
35
+ /** An http(s) origin, no path — written through the desktop's normalizeServerUrl. */
36
+ readonly url: string;
37
+ /** A ULID (TEAMS_ID_PATTERN); equals workspace.yaml's id. */
38
+ readonly workspaceId: string;
39
+ /** The team's name when shared or joined; display only. */
40
+ readonly teamName?: string;
41
+ }
25
42
  /** `share.yaml`, as loaded (or about to be saved). */
26
43
  export interface WorkspaceShare {
27
44
  readonly version: 1;
28
45
  readonly kind: ShareKind;
29
- /** Absolute path to an externally managed clone/folder; absent means the managed `tree/`. */
46
+ /** Absolute path to an externally managed clone/folder; absent means the managed `tree/`. Never set for `server`. */
30
47
  readonly path?: string;
31
48
  readonly git?: GitShareSettings;
32
- readonly server?: {
33
- readonly url: string;
34
- readonly workspaceId: string;
35
- };
49
+ readonly server?: ServerShareSettings;
36
50
  }
37
51
  /** Options shared by {@link loadShare}, {@link saveShare} and {@link deleteShare}. */
38
52
  export interface ShareOptions {
39
53
  readonly fs?: FsLike;
40
54
  }
55
+ /**
56
+ * The sync settings of a git or server share, undefined for a folder share. Only the three shared
57
+ * fields are returned, so a caller cannot come to depend on one kind's extras.
58
+ */
59
+ export declare function shareSyncSettings(share: WorkspaceShare): SyncSettings | undefined;
41
60
  /**
42
61
  * Reads `<dir>/share.yaml`. `undefined` when the file does not exist (a local workspace).
43
62
  *
44
63
  * @throws WorkspaceError `workspace-file-invalid` when the file exists but is not valid YAML or
45
- * does not match {@link workspaceShareSchema} (e.g. a relative `path`, or `kind: 'git'` with no
46
- * `git` block).
64
+ * does not match {@link workspaceShareSchema} (e.g. a relative `path`, `kind: 'git'` with no
65
+ * `git` block, or a server block whose `workspaceId` is not a ULID).
47
66
  */
48
67
  export declare function loadShare(dir: string, options?: ShareOptions): Promise<WorkspaceShare | undefined>;
49
68
  /** Writes `share` to `<dir>/share.yaml` atomically. */
@@ -15,13 +15,28 @@ import { compact, stringifyYaml } from '../project/yaml.js';
15
15
  import { parseWorkspaceFile, workspaceShareSchema } from './schema.js';
16
16
  /** File name of a workspace's share settings, directly under its app-data folder. */
17
17
  export const WORKSPACE_SHARE_FILE = 'share.yaml';
18
- /** Defaults a freshly-shared git workspace is given. */
19
- export const DEFAULT_GIT_SHARE_SETTINGS = {
20
- branch: 'main',
18
+ /** Defaults a freshly shared git or server workspace is given. */
19
+ export const DEFAULT_SYNC_SETTINGS = {
21
20
  autoFetchSeconds: 60,
22
21
  commitOnSave: true,
23
22
  pushOnSave: true,
24
23
  };
24
+ /** Defaults a freshly-shared git workspace is given. */
25
+ export const DEFAULT_GIT_SHARE_SETTINGS = {
26
+ ...DEFAULT_SYNC_SETTINGS,
27
+ branch: 'main',
28
+ };
29
+ /**
30
+ * The sync settings of a git or server share, undefined for a folder share. Only the three shared
31
+ * fields are returned, so a caller cannot come to depend on one kind's extras.
32
+ */
33
+ export function shareSyncSettings(share) {
34
+ const block = share.kind === 'git' ? share.git : share.kind === 'server' ? share.server : undefined;
35
+ if (block === undefined) {
36
+ return undefined;
37
+ }
38
+ return { autoFetchSeconds: block.autoFetchSeconds, commitOnSave: block.commitOnSave, pushOnSave: block.pushOnSave };
39
+ }
25
40
  function shareFile(dir) {
26
41
  return join(dir, WORKSPACE_SHARE_FILE);
27
42
  }
@@ -29,8 +44,8 @@ function shareFile(dir) {
29
44
  * Reads `<dir>/share.yaml`. `undefined` when the file does not exist (a local workspace).
30
45
  *
31
46
  * @throws WorkspaceError `workspace-file-invalid` when the file exists but is not valid YAML or
32
- * does not match {@link workspaceShareSchema} (e.g. a relative `path`, or `kind: 'git'` with no
33
- * `git` block).
47
+ * does not match {@link workspaceShareSchema} (e.g. a relative `path`, `kind: 'git'` with no
48
+ * `git` block, or a server block whose `workspaceId` is not a ULID).
34
49
  */
35
50
  export async function loadShare(dir, options) {
36
51
  const fs = options?.fs ?? nodeFs;
@@ -68,7 +83,18 @@ export async function loadShare(dir, options) {
68
83
  },
69
84
  }
70
85
  : {}),
71
- ...(parsed.server !== undefined ? { server: parsed.server } : {}),
86
+ ...(parsed.server !== undefined
87
+ ? {
88
+ server: {
89
+ url: parsed.server.url,
90
+ workspaceId: parsed.server.workspaceId,
91
+ autoFetchSeconds: parsed.server.autoFetchSeconds,
92
+ commitOnSave: parsed.server.commitOnSave,
93
+ pushOnSave: parsed.server.pushOnSave,
94
+ ...(parsed.server.teamName !== undefined ? { teamName: parsed.server.teamName } : {}),
95
+ },
96
+ }
97
+ : {}),
72
98
  };
73
99
  }
74
100
  /** Writes `share` to `<dir>/share.yaml` atomically. */
package/dist/ws/call.d.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  * lands in the URL's query string, exactly where REST puts it — `resolveWsUrl` appends it after
10
10
  * the request's own query rows.
11
11
  */
12
- import type { SendAuth } from '../types.js';
12
+ import type { SendAuth } from '../http/auth/send-auth.js';
13
13
  import type { ProxyOptions, TlsOptions } from '../http/types.js';
14
14
  import type { WsSessionOptions } from './session.js';
15
15
  import type { WsCallInput } from './expand.js';
package/dist/ws/call.js CHANGED
@@ -9,7 +9,7 @@
9
9
  * lands in the URL's query string, exactly where REST puts it — `resolveWsUrl` appends it after
10
10
  * the request's own query rows.
11
11
  */
12
- import { applyAuth } from '../rest/auth.js';
12
+ import { applyAuth } from '../http/auth/apply-auth.js';
13
13
  import { WsError } from '../errors.js';
14
14
  import { resolveWsUrl } from './url.js';
15
15
  /**
@@ -63,7 +63,7 @@ function authHeadersAndQuery(auth) {
63
63
  throw new WsError('ws-auth-unsupported', 'NTLM authenticates a connection over several HTTP round trips, which a single WebSocket handshake cannot do. Use Basic, Bearer, an API key, or OAuth2 instead.', { details: { type: auth.type } });
64
64
  }
65
65
  if (auth.type === 'basic') {
66
- // `rest/auth.ts`'s `applyAuth` deliberately leaves Basic to the HTTP transport's challenge
66
+ // `http/auth/apply-auth.ts`'s `applyAuth` deliberately leaves Basic to the HTTP transport's challenge
67
67
  // flow, because a REST send can retry after a 401. A WebSocket handshake gets exactly one
68
68
  // request, so there is no challenge to wait for: the header goes straight on, same as REST's
69
69
  // "preemptive" Basic.
@@ -0,0 +1,60 @@
1
+ import { WebSocket, type Dispatcher } from 'undici';
2
+ import type { ProxyOptions, TlsOptions } from '../http/types.js';
3
+ /** Options for {@link connectWebSocket}: the TLS and proxy settings an HTTP call to the same server gets. */
4
+ export interface ConnectOptions {
5
+ readonly tls?: TlsOptions;
6
+ readonly proxy?: ProxyOptions;
7
+ }
8
+ /** A socket from {@link connectWebSocket}, and what to call once finished with it. */
9
+ export interface ConnectedWebSocket {
10
+ /** undici's WHATWG `WebSocket`, already connecting. */
11
+ readonly socket: WebSocket;
12
+ /**
13
+ * The HTTP status that refused the upgrade (e.g. `404` from a server without the endpoint), once the
14
+ * socket has failed without opening. `undefined` for an opened socket and for a network or TLS
15
+ * failure.
16
+ *
17
+ * The WHATWG API reports every refusal as the same bare `error`, so this is the only way a caller can
18
+ * tell "this server has no such endpoint" from "try again later". Two sockets opened to the same URL
19
+ * at the same moment could read each other's status; the live client keeps one socket per server.
20
+ */
21
+ refusedStatus(): number | undefined;
22
+ /**
23
+ * Closes the socket with `1000` if it is still connecting or open, and releases a dispatcher this
24
+ * call built. Idempotent (the same promise every time), and it never rejects.
25
+ */
26
+ dispose(): Promise<void>;
27
+ }
28
+ /** The transport options a WebSocket handshake's dispatcher is built from. */
29
+ export interface WsTransportOptions {
30
+ readonly tls?: TlsOptions;
31
+ readonly proxy?: ProxyOptions;
32
+ readonly localAddress?: string;
33
+ }
34
+ /** A handshake's dispatcher, and whether the caller owns (and so must close) it. */
35
+ export interface WsDispatcher {
36
+ readonly dispatcher: Dispatcher;
37
+ readonly owned: boolean;
38
+ }
39
+ /**
40
+ * The dispatcher for one WebSocket handshake. It is shared by `openWsSession` and
41
+ * {@link connectWebSocket}, so the two can never reach a server differently.
42
+ *
43
+ * Why a proxied socket owns its own `ProxyAgent`: `createDispatcher({ proxy })` does not CONNECT-tunnel
44
+ * a WebSocket handshake. undici rewrites `ws:`/`wss:` to `http:`/`https:` before it dispatches, and
45
+ * `ProxyAgent` tunnels `http:` only when it is built with `proxyTunnel: true`.
46
+ *
47
+ * When an unproxied socket owns its dispatcher: only when it asked for TLS or bind-address options.
48
+ * With neither, `createDispatcher` hands back the shared keep-alive agent, which the caller must never
49
+ * close.
50
+ *
51
+ * Not part of the package's public surface: `index.ts` does not re-export it.
52
+ */
53
+ export declare function wsDispatcher(options: WsTransportOptions): WsDispatcher;
54
+ /**
55
+ * Opens `url` (`ws:` or `wss:`) through a dispatcher built from `options`.
56
+ *
57
+ * @throws WsError `ws-bad-options` for a URL or an option the constructor refuses. When it throws,
58
+ * nothing is left subscribed or open.
59
+ */
60
+ export declare function connectWebSocket(url: string, options?: ConnectOptions): ConnectedWebSocket;
@@ -0,0 +1,131 @@
1
+ /**
2
+ * A bare WebSocket with Wirebench's transport options (live-updates spec §5.2, R5), for a caller that
3
+ * speaks its own protocol over it: the desktop's live-updates client.
4
+ *
5
+ * Why not the WHATWG constructor: it takes no TLS or proxy options. A server trusted through
6
+ * Wirebench's CA bundle, or reached through the configured proxy, would then work over HTTP but never
7
+ * over the socket. undici's `WebSocket` takes a `dispatcher` instead, built here by
8
+ * {@link wsDispatcher}, the same function `openWsSession` uses.
9
+ *
10
+ * How it differs from `openWsSession`:
11
+ * - it records no frames and writes no History;
12
+ * - the socket is returned as is, and the caller owns its events;
13
+ * - the handshake carries no `Origin` and no credentials, so whatever authenticates the socket
14
+ * travels in its first message (§6).
15
+ */
16
+ import diagnosticsChannel from 'node:diagnostics_channel';
17
+ import { ProxyAgent, WebSocket } from 'undici';
18
+ import { WsError } from '../errors.js';
19
+ import { createDispatcher, proxyAgentOptionsFor } from '../http/client.js';
20
+ /**
21
+ * The dispatcher for one WebSocket handshake. It is shared by `openWsSession` and
22
+ * {@link connectWebSocket}, so the two can never reach a server differently.
23
+ *
24
+ * Why a proxied socket owns its own `ProxyAgent`: `createDispatcher({ proxy })` does not CONNECT-tunnel
25
+ * a WebSocket handshake. undici rewrites `ws:`/`wss:` to `http:`/`https:` before it dispatches, and
26
+ * `ProxyAgent` tunnels `http:` only when it is built with `proxyTunnel: true`.
27
+ *
28
+ * When an unproxied socket owns its dispatcher: only when it asked for TLS or bind-address options.
29
+ * With neither, `createDispatcher` hands back the shared keep-alive agent, which the caller must never
30
+ * close.
31
+ *
32
+ * Not part of the package's public surface: `index.ts` does not re-export it.
33
+ */
34
+ export function wsDispatcher(options) {
35
+ const connect = {
36
+ ...(options.tls !== undefined ? { tls: options.tls } : {}),
37
+ ...(options.localAddress !== undefined ? { localAddress: options.localAddress } : {}),
38
+ };
39
+ if (options.proxy !== undefined) {
40
+ const agent = new ProxyAgent(proxyAgentOptionsFor(options.proxy, connect, false, { proxyTunnel: true }));
41
+ return { dispatcher: agent, owned: true };
42
+ }
43
+ return {
44
+ dispatcher: createDispatcher(connect),
45
+ owned: options.tls !== undefined || options.localAddress !== undefined,
46
+ };
47
+ }
48
+ /**
49
+ * The status in `message` (an `undici:request:headers` payload) when it answers this socket's own
50
+ * upgrade request: the request asked for `websocket`, and its origin, path and query are the socket's.
51
+ * undici hands a `101` to `onUpgrade` and never publishes it here, so any status seen here is a
52
+ * refusal.
53
+ */
54
+ function refusalStatusFor(message, httpOrigin, pathAndSearch) {
55
+ const m = message;
56
+ if (m.request?.upgrade !== 'websocket' || m.request.path !== pathAndSearch)
57
+ return undefined;
58
+ const origin = typeof m.request.origin === 'string'
59
+ ? m.request.origin
60
+ : m.request.origin instanceof URL
61
+ ? m.request.origin.origin
62
+ : undefined;
63
+ if (origin !== httpOrigin)
64
+ return undefined;
65
+ return typeof m.response?.statusCode === 'number' ? m.response.statusCode : undefined;
66
+ }
67
+ /**
68
+ * Opens `url` (`ws:` or `wss:`) through a dispatcher built from `options`.
69
+ *
70
+ * @throws WsError `ws-bad-options` for a URL or an option the constructor refuses. When it throws,
71
+ * nothing is left subscribed or open.
72
+ */
73
+ export function connectWebSocket(url, options = {}) {
74
+ let target;
75
+ try {
76
+ target = new URL(url);
77
+ }
78
+ catch (err) {
79
+ throw new WsError('ws-bad-options', `"${url}" is not a valid URL`, { cause: err, details: { url } });
80
+ }
81
+ const httpOrigin = `${target.protocol === 'wss:' ? 'https:' : 'http:'}//${target.host}`;
82
+ const pathAndSearch = `${target.pathname}${target.search}`;
83
+ let refused;
84
+ const onResponseHeaders = (message) => {
85
+ refused ??= refusalStatusFor(message, httpOrigin, pathAndSearch);
86
+ };
87
+ const stopWatching = () => {
88
+ diagnosticsChannel.unsubscribe('undici:request:headers', onResponseHeaders);
89
+ };
90
+ let transport;
91
+ let socket;
92
+ try {
93
+ transport = wsDispatcher(options);
94
+ // Subscribed before the socket exists: undici starts the handshake inside the constructor.
95
+ diagnosticsChannel.subscribe('undici:request:headers', onResponseHeaders);
96
+ socket = new WebSocket(url, { dispatcher: transport.dispatcher });
97
+ }
98
+ catch (err) {
99
+ stopWatching();
100
+ if (transport?.owned === true)
101
+ void transport.dispatcher.close().catch(() => undefined);
102
+ const reason = err instanceof Error ? err.message : String(err);
103
+ throw new WsError('ws-bad-options', `The WebSocket options for "${url}" are invalid: ${reason}`, {
104
+ cause: err,
105
+ details: { url },
106
+ });
107
+ }
108
+ // The handshake has an answer once any of these fires; nothing later can be this socket's refusal.
109
+ socket.addEventListener('open', stopWatching, { once: true });
110
+ socket.addEventListener('error', stopWatching, { once: true });
111
+ socket.addEventListener('close', stopWatching, { once: true });
112
+ const { dispatcher, owned } = transport;
113
+ const ws = socket;
114
+ let disposed;
115
+ return {
116
+ socket: ws,
117
+ refusedStatus: () => refused,
118
+ dispose() {
119
+ disposed ??= (async () => {
120
+ stopWatching();
121
+ // On a connecting socket this fails the handshake and aborts its request, so the graceful
122
+ // dispatcher close below has nothing in flight to wait for.
123
+ if (ws.readyState === WebSocket.CONNECTING || ws.readyState === WebSocket.OPEN)
124
+ ws.close(1000);
125
+ if (owned)
126
+ await dispatcher.close().catch(() => undefined);
127
+ })();
128
+ return disposed;
129
+ },
130
+ };
131
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * What a WebSocket session reports while it runs (spec §3.2): the handshake once the server has
3
+ * switched protocols, each frame sent or received, and the session closed.
4
+ */
5
+ import type { WsFrame, WsHandshake } from './model.js';
6
+ export type WsLiveEvent = {
7
+ readonly protocol: 'websocket';
8
+ readonly kind: 'handshake';
9
+ readonly handshake: WsHandshake;
10
+ } | {
11
+ readonly protocol: 'websocket';
12
+ readonly kind: 'frame';
13
+ readonly frame: WsFrame;
14
+ } | {
15
+ readonly protocol: 'websocket';
16
+ readonly kind: 'closed';
17
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -10,7 +10,7 @@
10
10
  * string escaping — applies only to a message, never to a header, query row or the URL.
11
11
  */
12
12
  import type { PropertyScopes, UnresolvedRef } from '../project/properties.js';
13
- import type { KeyValueEntry } from '../rest/model.js';
13
+ import type { KeyValueEntry } from '../http/entries.js';
14
14
  import type { WsRequestDef } from './model.js';
15
15
  /** Input to {@link expandWsInput}: the parts of a saved request an open call needs. */
16
16
  export interface WsCallInput {
package/dist/ws/expand.js CHANGED
@@ -10,7 +10,7 @@
10
10
  * string escaping — applies only to a message, never to a header, query row or the URL.
11
11
  */
12
12
  import { expand } from '../project/properties.js';
13
- import { escapeForLanguage } from '../rest/body.js';
13
+ import { escapeForLanguage } from '../http/escape.js';
14
14
  function runRows(rows, run) {
15
15
  return rows.map((row) => ({ ...row, name: run(row.name), value: run(row.value) }));
16
16
  }