@vellumai/cli 0.11.6 → 0.11.7-staging.2

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 (807) hide show
  1. package/AGENTS.md +3 -1
  2. package/knip.json +1 -0
  3. package/node_modules/@vellumai/avatar-manifest/package.json +18 -0
  4. package/node_modules/@vellumai/avatar-manifest/src/__tests__/manifest.test.ts +173 -0
  5. package/node_modules/@vellumai/avatar-manifest/src/__tests__/read.test.ts +114 -0
  6. package/node_modules/@vellumai/avatar-manifest/src/index.ts +29 -0
  7. package/node_modules/@vellumai/avatar-manifest/src/layout.ts +18 -0
  8. package/node_modules/@vellumai/avatar-manifest/src/manifest.ts +156 -0
  9. package/node_modules/@vellumai/avatar-manifest/src/read.ts +109 -0
  10. package/node_modules/@vellumai/avatar-manifest/tsconfig.json +20 -0
  11. package/node_modules/@vellumai/environments/package.json +2 -1
  12. package/node_modules/@vellumai/environments/src/shell.test.ts +56 -0
  13. package/node_modules/@vellumai/environments/src/shell.ts +65 -0
  14. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/package.json +18 -0
  15. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/src/__tests__/manifest.test.ts +173 -0
  16. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/src/__tests__/read.test.ts +114 -0
  17. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/src/index.ts +29 -0
  18. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/src/layout.ts +18 -0
  19. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/src/manifest.ts +156 -0
  20. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/src/read.ts +109 -0
  21. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/tsconfig.json +20 -0
  22. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/environments/package.json +2 -1
  23. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/environments/src/shell.test.ts +56 -0
  24. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/environments/src/shell.ts +65 -0
  25. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/LICENSE +21 -0
  26. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/README.md +208 -0
  27. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/index.cjs +33 -0
  28. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/index.d.cts +4 -0
  29. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/index.d.ts +4 -0
  30. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/index.js +4 -0
  31. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/locales/index.cjs +17 -0
  32. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/locales/index.d.cts +1 -0
  33. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/locales/index.d.ts +1 -0
  34. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/locales/index.js +1 -0
  35. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/locales/package.json +6 -0
  36. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/mini/index.cjs +32 -0
  37. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/mini/index.d.cts +3 -0
  38. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/mini/index.d.ts +3 -0
  39. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/mini/index.js +3 -0
  40. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/mini/package.json +6 -0
  41. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/package.json +135 -0
  42. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/index.ts +4 -0
  43. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/locales/index.ts +1 -0
  44. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/mini/index.ts +3 -0
  45. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/ZodError.ts +330 -0
  46. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/datetime.ts +58 -0
  47. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/discriminatedUnion.ts +80 -0
  48. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/index.ts +59 -0
  49. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/ipv4.ts +57 -0
  50. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/object.ts +69 -0
  51. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/primitives.ts +162 -0
  52. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/realworld.ts +63 -0
  53. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/string.ts +55 -0
  54. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/union.ts +80 -0
  55. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/errors.ts +13 -0
  56. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/external.ts +6 -0
  57. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/helpers/enumUtil.ts +17 -0
  58. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/helpers/errorUtil.ts +8 -0
  59. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/helpers/parseUtil.ts +176 -0
  60. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/helpers/partialUtil.ts +34 -0
  61. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/helpers/typeAliases.ts +2 -0
  62. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/helpers/util.ts +224 -0
  63. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/index.ts +4 -0
  64. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/locales/en.ts +124 -0
  65. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/standard-schema.ts +113 -0
  66. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/Mocker.ts +54 -0
  67. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/all-errors.test.ts +157 -0
  68. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/anyunknown.test.ts +28 -0
  69. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/array.test.ts +71 -0
  70. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/async-parsing.test.ts +388 -0
  71. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/async-refinements.test.ts +46 -0
  72. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/base.test.ts +29 -0
  73. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/bigint.test.ts +55 -0
  74. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/branded.test.ts +53 -0
  75. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/catch.test.ts +220 -0
  76. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/coerce.test.ts +133 -0
  77. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/complex.test.ts +70 -0
  78. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/custom.test.ts +31 -0
  79. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/date.test.ts +32 -0
  80. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/deepmasking.test.ts +186 -0
  81. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/default.test.ts +112 -0
  82. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/description.test.ts +33 -0
  83. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/discriminated-unions.test.ts +315 -0
  84. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/enum.test.ts +80 -0
  85. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/error.test.ts +551 -0
  86. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/firstparty.test.ts +87 -0
  87. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/firstpartyschematypes.test.ts +21 -0
  88. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/function.test.ts +261 -0
  89. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/generics.test.ts +48 -0
  90. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/instanceof.test.ts +37 -0
  91. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/intersection.test.ts +110 -0
  92. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/language-server.source.ts +76 -0
  93. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/language-server.test.ts +207 -0
  94. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/literal.test.ts +36 -0
  95. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/map.test.ts +110 -0
  96. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/masking.test.ts +4 -0
  97. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/mocker.test.ts +19 -0
  98. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/nan.test.ts +24 -0
  99. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/nativeEnum.test.ts +87 -0
  100. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/nullable.test.ts +42 -0
  101. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/number.test.ts +176 -0
  102. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/object-augmentation.test.ts +29 -0
  103. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/object-in-es5-env.test.ts +29 -0
  104. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/object.test.ts +434 -0
  105. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/optional.test.ts +42 -0
  106. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/parseUtil.test.ts +23 -0
  107. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/parser.test.ts +41 -0
  108. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/partials.test.ts +243 -0
  109. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/pickomit.test.ts +111 -0
  110. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/pipeline.test.ts +29 -0
  111. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/preprocess.test.ts +186 -0
  112. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/primitive.test.ts +440 -0
  113. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/promise.test.ts +90 -0
  114. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/readonly.test.ts +194 -0
  115. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/record.test.ts +171 -0
  116. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/recursive.test.ts +197 -0
  117. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/refine.test.ts +313 -0
  118. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/safeparse.test.ts +27 -0
  119. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/set.test.ts +142 -0
  120. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/standard-schema.test.ts +83 -0
  121. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/string.test.ts +916 -0
  122. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/transformer.test.ts +233 -0
  123. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/tuple.test.ts +90 -0
  124. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/unions.test.ts +57 -0
  125. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/validations.test.ts +133 -0
  126. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/void.test.ts +15 -0
  127. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/types.ts +5138 -0
  128. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/checks.ts +32 -0
  129. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/coerce.ts +27 -0
  130. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/compat.ts +70 -0
  131. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/errors.ts +82 -0
  132. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/external.ts +51 -0
  133. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/from-json-schema.ts +643 -0
  134. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/index.ts +5 -0
  135. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/iso.ts +90 -0
  136. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/parse.ts +82 -0
  137. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/schemas.ts +2409 -0
  138. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/anyunknown.test.ts +26 -0
  139. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/apply.test.ts +59 -0
  140. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/array.test.ts +264 -0
  141. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/assignability.test.ts +210 -0
  142. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/async-parsing.test.ts +381 -0
  143. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/async-refinements.test.ts +68 -0
  144. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/base.test.ts +7 -0
  145. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/bigint.test.ts +54 -0
  146. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/brand.test.ts +106 -0
  147. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/catch.test.ts +276 -0
  148. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/coalesce.test.ts +20 -0
  149. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +573 -0
  150. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/codec.test.ts +562 -0
  151. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/coerce.test.ts +160 -0
  152. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/continuability.test.ts +374 -0
  153. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/custom.test.ts +40 -0
  154. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/date.test.ts +62 -0
  155. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/datetime.test.ts +302 -0
  156. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/default.test.ts +365 -0
  157. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/describe-meta-checks.test.ts +27 -0
  158. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/description.test.ts +32 -0
  159. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +661 -0
  160. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/enum.test.ts +285 -0
  161. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +595 -0
  162. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/error.test.ts +711 -0
  163. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/file.test.ts +96 -0
  164. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/firstparty.test.ts +179 -0
  165. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/fix-json-issue.test.ts +26 -0
  166. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +734 -0
  167. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/function.test.ts +360 -0
  168. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/generics.test.ts +72 -0
  169. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/hash.test.ts +68 -0
  170. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/index.test.ts +939 -0
  171. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +60 -0
  172. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/intersection.test.ts +198 -0
  173. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/json.test.ts +109 -0
  174. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/lazy.test.ts +227 -0
  175. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/literal.test.ts +117 -0
  176. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/map.test.ts +330 -0
  177. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/nan.test.ts +21 -0
  178. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/nested-refine.test.ts +168 -0
  179. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/nonoptional.test.ts +101 -0
  180. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/nullable.test.ts +22 -0
  181. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/number.test.ts +270 -0
  182. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/object.test.ts +640 -0
  183. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/optional.test.ts +223 -0
  184. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/partial.test.ts +427 -0
  185. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/pickomit.test.ts +211 -0
  186. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/pipe.test.ts +101 -0
  187. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/prefault.test.ts +74 -0
  188. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +282 -0
  189. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/primitive.test.ts +175 -0
  190. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/promise.test.ts +81 -0
  191. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/prototypes.test.ts +23 -0
  192. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/readonly.test.ts +252 -0
  193. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/record.test.ts +632 -0
  194. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +582 -0
  195. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/refine.test.ts +570 -0
  196. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/registries.test.ts +243 -0
  197. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/set.test.ts +181 -0
  198. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +134 -0
  199. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/string-formats.test.ts +125 -0
  200. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/string.test.ts +1175 -0
  201. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +106 -0
  202. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +771 -0
  203. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/to-json-schema-methods.test.ts +438 -0
  204. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +2990 -0
  205. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/transform.test.ts +361 -0
  206. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/tuple.test.ts +183 -0
  207. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/union.test.ts +219 -0
  208. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/url.test.ts +13 -0
  209. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/validations.test.ts +283 -0
  210. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/void.test.ts +12 -0
  211. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/api.ts +1798 -0
  212. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/checks.ts +1293 -0
  213. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/config.ts +15 -0
  214. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/core.ts +138 -0
  215. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/doc.ts +44 -0
  216. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/errors.ts +448 -0
  217. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/index.ts +16 -0
  218. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/json-schema-generator.ts +126 -0
  219. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/json-schema-processors.ts +667 -0
  220. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/json-schema.ts +147 -0
  221. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/parse.ts +195 -0
  222. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/regexes.ts +183 -0
  223. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/registries.ts +105 -0
  224. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/schemas.ts +4538 -0
  225. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/standard-schema.ts +159 -0
  226. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/extend.test.ts +59 -0
  227. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/index.test.ts +46 -0
  228. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/be.test.ts +124 -0
  229. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/en.test.ts +22 -0
  230. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/es.test.ts +181 -0
  231. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/he.test.ts +379 -0
  232. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/nl.test.ts +46 -0
  233. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/ru.test.ts +128 -0
  234. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/tr.test.ts +69 -0
  235. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/uz.test.ts +83 -0
  236. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/record-constructor.test.ts +67 -0
  237. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/recursive-tuples.test.ts +45 -0
  238. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/to-json-schema.ts +613 -0
  239. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/util.ts +966 -0
  240. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/versions.ts +5 -0
  241. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/zsf.ts +323 -0
  242. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/index.ts +4 -0
  243. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ar.ts +115 -0
  244. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/az.ts +111 -0
  245. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/be.ts +176 -0
  246. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/bg.ts +128 -0
  247. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ca.ts +116 -0
  248. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/cs.ts +118 -0
  249. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/da.ts +123 -0
  250. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/de.ts +116 -0
  251. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/en.ts +119 -0
  252. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/eo.ts +118 -0
  253. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/es.ts +141 -0
  254. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/fa.ts +126 -0
  255. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/fi.ts +121 -0
  256. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/fr-CA.ts +116 -0
  257. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/fr.ts +116 -0
  258. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/he.ts +246 -0
  259. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/hu.ts +117 -0
  260. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/hy.ts +164 -0
  261. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/id.ts +115 -0
  262. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/index.ts +49 -0
  263. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/is.ts +119 -0
  264. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/it.ts +116 -0
  265. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ja.ts +114 -0
  266. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ka.ts +123 -0
  267. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/kh.ts +7 -0
  268. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/km.ts +119 -0
  269. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ko.ts +121 -0
  270. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/lt.ts +239 -0
  271. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/mk.ts +118 -0
  272. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ms.ts +115 -0
  273. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/nl.ts +121 -0
  274. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/no.ts +116 -0
  275. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ota.ts +117 -0
  276. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/pl.ts +118 -0
  277. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ps.ts +126 -0
  278. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/pt.ts +116 -0
  279. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ru.ts +176 -0
  280. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/sl.ts +118 -0
  281. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/sv.ts +119 -0
  282. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ta.ts +118 -0
  283. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/th.ts +119 -0
  284. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/tr.ts +111 -0
  285. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ua.ts +7 -0
  286. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/uk.ts +117 -0
  287. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ur.ts +119 -0
  288. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/uz.ts +116 -0
  289. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/vi.ts +117 -0
  290. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/yo.ts +124 -0
  291. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/zh-CN.ts +116 -0
  292. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/zh-TW.ts +115 -0
  293. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/checks.ts +32 -0
  294. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/coerce.ts +27 -0
  295. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/external.ts +40 -0
  296. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/index.ts +3 -0
  297. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/iso.ts +66 -0
  298. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/parse.ts +14 -0
  299. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/schemas.ts +1916 -0
  300. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/apply.test.ts +24 -0
  301. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/assignability.test.ts +129 -0
  302. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/brand.test.ts +94 -0
  303. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/checks.test.ts +144 -0
  304. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/codec.test.ts +529 -0
  305. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/computed.test.ts +36 -0
  306. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/error.test.ts +22 -0
  307. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/functions.test.ts +5 -0
  308. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/index.test.ts +963 -0
  309. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/number.test.ts +95 -0
  310. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/object.test.ts +227 -0
  311. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/prototypes.test.ts +43 -0
  312. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +275 -0
  313. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/standard-schema.test.ts +50 -0
  314. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/string.test.ts +347 -0
  315. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4-mini/index.ts +3 -0
  316. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/ZodError.cjs +138 -0
  317. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/ZodError.d.cts +164 -0
  318. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/ZodError.d.ts +164 -0
  319. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/ZodError.js +133 -0
  320. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/errors.cjs +17 -0
  321. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/errors.d.cts +5 -0
  322. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/errors.d.ts +5 -0
  323. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/errors.js +9 -0
  324. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/external.cjs +22 -0
  325. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/external.d.cts +6 -0
  326. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/external.d.ts +6 -0
  327. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/external.js +6 -0
  328. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/enumUtil.cjs +2 -0
  329. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/enumUtil.d.cts +8 -0
  330. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/enumUtil.d.ts +8 -0
  331. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/enumUtil.js +1 -0
  332. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/errorUtil.cjs +9 -0
  333. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/errorUtil.d.cts +9 -0
  334. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/errorUtil.d.ts +9 -0
  335. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/errorUtil.js +6 -0
  336. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/parseUtil.cjs +124 -0
  337. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/parseUtil.d.cts +78 -0
  338. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/parseUtil.d.ts +78 -0
  339. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/parseUtil.js +109 -0
  340. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/partialUtil.cjs +2 -0
  341. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/partialUtil.d.cts +8 -0
  342. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/partialUtil.d.ts +8 -0
  343. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/partialUtil.js +1 -0
  344. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/typeAliases.cjs +2 -0
  345. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/typeAliases.d.cts +2 -0
  346. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/typeAliases.d.ts +2 -0
  347. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/typeAliases.js +1 -0
  348. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/util.cjs +137 -0
  349. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/util.d.cts +85 -0
  350. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/util.d.ts +85 -0
  351. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/util.js +133 -0
  352. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/index.cjs +33 -0
  353. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/index.d.cts +4 -0
  354. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/index.d.ts +4 -0
  355. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/index.js +4 -0
  356. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/locales/en.cjs +112 -0
  357. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/locales/en.d.cts +3 -0
  358. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/locales/en.d.ts +3 -0
  359. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/locales/en.js +109 -0
  360. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/package.json +6 -0
  361. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/standard-schema.cjs +2 -0
  362. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/standard-schema.d.cts +102 -0
  363. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/standard-schema.d.ts +102 -0
  364. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/standard-schema.js +1 -0
  365. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/types.cjs +3777 -0
  366. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/types.d.cts +1034 -0
  367. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/types.d.ts +1034 -0
  368. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/types.js +3695 -0
  369. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/checks.cjs +33 -0
  370. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/checks.d.cts +1 -0
  371. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/checks.d.ts +1 -0
  372. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/checks.js +1 -0
  373. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/coerce.cjs +47 -0
  374. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/coerce.d.cts +17 -0
  375. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/coerce.d.ts +17 -0
  376. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/coerce.js +17 -0
  377. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/compat.cjs +61 -0
  378. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/compat.d.cts +50 -0
  379. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/compat.d.ts +50 -0
  380. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/compat.js +31 -0
  381. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/errors.cjs +74 -0
  382. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/errors.d.cts +30 -0
  383. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/errors.d.ts +30 -0
  384. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/errors.js +48 -0
  385. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/external.cjs +73 -0
  386. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/external.d.cts +15 -0
  387. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/external.d.ts +15 -0
  388. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/external.js +20 -0
  389. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/from-json-schema.cjs +610 -0
  390. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/from-json-schema.d.cts +12 -0
  391. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/from-json-schema.d.ts +12 -0
  392. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/from-json-schema.js +584 -0
  393. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/index.cjs +33 -0
  394. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/index.d.cts +4 -0
  395. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/index.d.ts +4 -0
  396. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/index.js +4 -0
  397. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/iso.cjs +60 -0
  398. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/iso.d.cts +22 -0
  399. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/iso.d.ts +22 -0
  400. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/iso.js +30 -0
  401. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/package.json +6 -0
  402. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/parse.cjs +41 -0
  403. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/parse.d.cts +31 -0
  404. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/parse.d.ts +31 -0
  405. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/parse.js +15 -0
  406. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/schemas.cjs +1272 -0
  407. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/schemas.d.cts +739 -0
  408. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/schemas.d.ts +739 -0
  409. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/schemas.js +1157 -0
  410. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/api.cjs +1222 -0
  411. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/api.d.cts +304 -0
  412. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/api.d.ts +304 -0
  413. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/api.js +1082 -0
  414. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/checks.cjs +601 -0
  415. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/checks.d.cts +278 -0
  416. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/checks.d.ts +278 -0
  417. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/checks.js +575 -0
  418. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/core.cjs +83 -0
  419. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/core.d.cts +70 -0
  420. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/core.d.ts +70 -0
  421. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/core.js +76 -0
  422. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/doc.cjs +39 -0
  423. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/doc.d.cts +14 -0
  424. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/doc.d.ts +14 -0
  425. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/doc.js +35 -0
  426. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/errors.cjs +213 -0
  427. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/errors.d.cts +220 -0
  428. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/errors.d.ts +220 -0
  429. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/errors.js +182 -0
  430. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/index.cjs +47 -0
  431. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/index.d.cts +16 -0
  432. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/index.d.ts +16 -0
  433. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/index.js +16 -0
  434. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-generator.cjs +99 -0
  435. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-generator.d.cts +65 -0
  436. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-generator.d.ts +65 -0
  437. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-generator.js +95 -0
  438. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-processors.cjs +648 -0
  439. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-processors.d.cts +49 -0
  440. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-processors.d.ts +49 -0
  441. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-processors.js +605 -0
  442. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema.cjs +2 -0
  443. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema.d.cts +88 -0
  444. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema.d.ts +88 -0
  445. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema.js +1 -0
  446. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/package.json +6 -0
  447. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/parse.cjs +131 -0
  448. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/parse.d.cts +49 -0
  449. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/parse.d.ts +49 -0
  450. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/parse.js +93 -0
  451. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/regexes.cjs +166 -0
  452. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/regexes.d.cts +79 -0
  453. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/regexes.d.ts +79 -0
  454. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/regexes.js +133 -0
  455. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/registries.cjs +56 -0
  456. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/registries.d.cts +35 -0
  457. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/registries.d.ts +35 -0
  458. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/registries.js +51 -0
  459. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/schemas.cjs +2124 -0
  460. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/schemas.d.cts +1146 -0
  461. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/schemas.d.ts +1146 -0
  462. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/schemas.js +2093 -0
  463. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/standard-schema.cjs +2 -0
  464. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/standard-schema.d.cts +126 -0
  465. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/standard-schema.d.ts +126 -0
  466. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/standard-schema.js +1 -0
  467. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/to-json-schema.cjs +446 -0
  468. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/to-json-schema.d.cts +114 -0
  469. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/to-json-schema.d.ts +114 -0
  470. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/to-json-schema.js +437 -0
  471. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/util.cjs +710 -0
  472. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/util.d.cts +199 -0
  473. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/util.d.ts +199 -0
  474. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/util.js +651 -0
  475. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/versions.cjs +8 -0
  476. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/versions.d.cts +5 -0
  477. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/versions.d.ts +5 -0
  478. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/versions.js +5 -0
  479. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/index.cjs +22 -0
  480. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/index.d.cts +3 -0
  481. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/index.d.ts +3 -0
  482. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/index.js +3 -0
  483. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ar.cjs +133 -0
  484. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ar.d.cts +5 -0
  485. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ar.d.ts +4 -0
  486. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ar.js +106 -0
  487. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/az.cjs +132 -0
  488. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/az.d.cts +5 -0
  489. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/az.d.ts +4 -0
  490. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/az.js +105 -0
  491. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/be.cjs +183 -0
  492. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/be.d.cts +5 -0
  493. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/be.d.ts +4 -0
  494. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/be.js +156 -0
  495. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/bg.cjs +147 -0
  496. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/bg.d.cts +5 -0
  497. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/bg.d.ts +4 -0
  498. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/bg.js +120 -0
  499. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ca.cjs +134 -0
  500. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ca.d.cts +5 -0
  501. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ca.d.ts +4 -0
  502. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ca.js +107 -0
  503. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/cs.cjs +138 -0
  504. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/cs.d.cts +5 -0
  505. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/cs.d.ts +4 -0
  506. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/cs.js +111 -0
  507. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/da.cjs +142 -0
  508. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/da.d.cts +5 -0
  509. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/da.d.ts +4 -0
  510. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/da.js +115 -0
  511. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/de.cjs +135 -0
  512. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/de.d.cts +5 -0
  513. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/de.d.ts +4 -0
  514. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/de.js +108 -0
  515. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/en.cjs +136 -0
  516. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/en.d.cts +5 -0
  517. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/en.d.ts +4 -0
  518. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/en.js +109 -0
  519. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/eo.cjs +136 -0
  520. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/eo.d.cts +5 -0
  521. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/eo.d.ts +4 -0
  522. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/eo.js +109 -0
  523. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/es.cjs +159 -0
  524. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/es.d.cts +5 -0
  525. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/es.d.ts +4 -0
  526. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/es.js +132 -0
  527. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fa.cjs +141 -0
  528. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fa.d.cts +5 -0
  529. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fa.d.ts +4 -0
  530. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fa.js +114 -0
  531. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fi.cjs +139 -0
  532. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fi.d.cts +5 -0
  533. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fi.d.ts +4 -0
  534. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fi.js +112 -0
  535. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr-CA.cjs +134 -0
  536. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr-CA.d.cts +5 -0
  537. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr-CA.d.ts +4 -0
  538. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr-CA.js +107 -0
  539. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr.cjs +135 -0
  540. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr.d.cts +5 -0
  541. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr.d.ts +4 -0
  542. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr.js +108 -0
  543. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/he.cjs +241 -0
  544. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/he.d.cts +5 -0
  545. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/he.d.ts +4 -0
  546. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/he.js +214 -0
  547. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hu.cjs +135 -0
  548. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hu.d.cts +5 -0
  549. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hu.d.ts +4 -0
  550. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hu.js +108 -0
  551. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hy.cjs +174 -0
  552. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hy.d.cts +5 -0
  553. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hy.d.ts +4 -0
  554. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hy.js +147 -0
  555. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/id.cjs +133 -0
  556. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/id.d.cts +5 -0
  557. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/id.d.ts +4 -0
  558. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/id.js +106 -0
  559. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/index.cjs +104 -0
  560. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/index.d.cts +49 -0
  561. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/index.d.ts +49 -0
  562. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/index.js +49 -0
  563. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/is.cjs +136 -0
  564. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/is.d.cts +5 -0
  565. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/is.d.ts +4 -0
  566. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/is.js +109 -0
  567. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/it.cjs +135 -0
  568. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/it.d.cts +5 -0
  569. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/it.d.ts +4 -0
  570. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/it.js +108 -0
  571. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ja.cjs +134 -0
  572. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ja.d.cts +5 -0
  573. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ja.d.ts +4 -0
  574. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ja.js +107 -0
  575. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ka.cjs +139 -0
  576. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ka.d.cts +5 -0
  577. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ka.d.ts +4 -0
  578. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ka.js +112 -0
  579. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/kh.cjs +12 -0
  580. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/kh.d.cts +5 -0
  581. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/kh.d.ts +5 -0
  582. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/kh.js +5 -0
  583. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/km.cjs +137 -0
  584. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/km.d.cts +5 -0
  585. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/km.d.ts +4 -0
  586. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/km.js +110 -0
  587. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ko.cjs +138 -0
  588. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ko.d.cts +5 -0
  589. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ko.d.ts +4 -0
  590. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ko.js +111 -0
  591. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/lt.cjs +230 -0
  592. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/lt.d.cts +5 -0
  593. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/lt.d.ts +4 -0
  594. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/lt.js +203 -0
  595. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/mk.cjs +136 -0
  596. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/mk.d.cts +5 -0
  597. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/mk.d.ts +4 -0
  598. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/mk.js +109 -0
  599. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ms.cjs +134 -0
  600. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ms.d.cts +5 -0
  601. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ms.d.ts +4 -0
  602. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ms.js +107 -0
  603. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/nl.cjs +137 -0
  604. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/nl.d.cts +5 -0
  605. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/nl.d.ts +4 -0
  606. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/nl.js +110 -0
  607. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/no.cjs +135 -0
  608. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/no.d.cts +5 -0
  609. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/no.d.ts +4 -0
  610. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/no.js +108 -0
  611. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ota.cjs +136 -0
  612. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ota.d.cts +5 -0
  613. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ota.d.ts +4 -0
  614. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ota.js +109 -0
  615. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/package.json +6 -0
  616. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pl.cjs +136 -0
  617. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pl.d.cts +5 -0
  618. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pl.d.ts +4 -0
  619. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pl.js +109 -0
  620. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ps.cjs +141 -0
  621. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ps.d.cts +5 -0
  622. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ps.d.ts +4 -0
  623. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ps.js +114 -0
  624. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pt.cjs +135 -0
  625. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pt.d.cts +5 -0
  626. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pt.d.ts +4 -0
  627. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pt.js +108 -0
  628. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ru.cjs +183 -0
  629. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ru.d.cts +5 -0
  630. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ru.d.ts +4 -0
  631. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ru.js +156 -0
  632. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sl.cjs +136 -0
  633. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sl.d.cts +5 -0
  634. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sl.d.ts +4 -0
  635. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sl.js +109 -0
  636. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sv.cjs +137 -0
  637. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sv.d.cts +5 -0
  638. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sv.d.ts +4 -0
  639. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sv.js +110 -0
  640. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ta.cjs +137 -0
  641. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ta.d.cts +5 -0
  642. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ta.d.ts +4 -0
  643. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ta.js +110 -0
  644. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/th.cjs +137 -0
  645. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/th.d.cts +5 -0
  646. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/th.d.ts +4 -0
  647. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/th.js +110 -0
  648. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/tr.cjs +132 -0
  649. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/tr.d.cts +5 -0
  650. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/tr.d.ts +4 -0
  651. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/tr.js +105 -0
  652. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ua.cjs +12 -0
  653. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ua.d.cts +5 -0
  654. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ua.d.ts +5 -0
  655. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ua.js +5 -0
  656. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uk.cjs +135 -0
  657. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uk.d.cts +5 -0
  658. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uk.d.ts +4 -0
  659. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uk.js +108 -0
  660. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ur.cjs +137 -0
  661. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ur.d.cts +5 -0
  662. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ur.d.ts +4 -0
  663. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ur.js +110 -0
  664. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uz.cjs +136 -0
  665. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uz.d.cts +5 -0
  666. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uz.d.ts +4 -0
  667. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uz.js +109 -0
  668. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/vi.cjs +135 -0
  669. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/vi.d.cts +5 -0
  670. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/vi.d.ts +4 -0
  671. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/vi.js +108 -0
  672. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/yo.cjs +134 -0
  673. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/yo.d.cts +5 -0
  674. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/yo.d.ts +4 -0
  675. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/yo.js +107 -0
  676. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-CN.cjs +136 -0
  677. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-CN.d.cts +5 -0
  678. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-CN.d.ts +4 -0
  679. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-CN.js +109 -0
  680. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-TW.cjs +134 -0
  681. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-TW.d.cts +5 -0
  682. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-TW.d.ts +4 -0
  683. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-TW.js +107 -0
  684. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/checks.cjs +34 -0
  685. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/checks.d.cts +1 -0
  686. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/checks.d.ts +1 -0
  687. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/checks.js +1 -0
  688. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/coerce.cjs +52 -0
  689. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/coerce.d.cts +7 -0
  690. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/coerce.d.ts +7 -0
  691. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/coerce.js +22 -0
  692. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/external.cjs +63 -0
  693. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/external.d.cts +12 -0
  694. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/external.d.ts +12 -0
  695. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/external.js +14 -0
  696. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/index.cjs +32 -0
  697. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/index.d.cts +3 -0
  698. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/index.d.ts +3 -0
  699. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/index.js +3 -0
  700. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/iso.cjs +64 -0
  701. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/iso.d.cts +22 -0
  702. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/iso.d.ts +22 -0
  703. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/iso.js +34 -0
  704. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/package.json +6 -0
  705. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/parse.cjs +16 -0
  706. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/parse.d.cts +1 -0
  707. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/parse.d.ts +1 -0
  708. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/parse.js +1 -0
  709. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/schemas.cjs +1046 -0
  710. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/schemas.d.cts +427 -0
  711. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/schemas.d.ts +427 -0
  712. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/schemas.js +925 -0
  713. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/package.json +6 -0
  714. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4-mini/index.cjs +32 -0
  715. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4-mini/index.d.cts +3 -0
  716. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4-mini/index.d.ts +3 -0
  717. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4-mini/index.js +3 -0
  718. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4-mini/package.json +6 -0
  719. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/package.json +37 -0
  720. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/attachment-naming.test.ts +104 -0
  721. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +36 -0
  722. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +299 -0
  723. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/conversation-handle.test.ts +316 -0
  724. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +280 -0
  725. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/package-boundary.test.ts +151 -0
  726. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
  727. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/remote-web-pairing.test.ts +389 -0
  728. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
  729. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/stripe-currency.test.ts +37 -0
  730. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
  731. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/attachment-naming.ts +118 -0
  732. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/channels.ts +92 -0
  733. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/client-metadata.ts +46 -0
  734. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/conversation-handle.ts +246 -0
  735. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/credential-rpc.ts +21 -0
  736. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/error.ts +26 -0
  737. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/handles.ts +212 -0
  738. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/index.ts +32 -0
  739. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/ingress.ts +175 -0
  740. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
  741. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +816 -0
  742. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/rpc.ts +408 -0
  743. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
  744. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/stripe-currency.ts +55 -0
  745. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/transport.ts +133 -0
  746. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/trust-rules.ts +116 -0
  747. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +73 -0
  748. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
  749. package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/tsconfig.json +20 -0
  750. package/node_modules/@vellumai/local-mode/package.json +3 -1
  751. package/node_modules/@vellumai/local-mode/src/__tests__/guardian-token.test.ts +45 -0
  752. package/node_modules/@vellumai/local-mode/src/__tests__/package-boundary.test.ts +32 -14
  753. package/node_modules/@vellumai/local-mode/src/__tests__/pair.test.ts +1535 -155
  754. package/node_modules/@vellumai/local-mode/src/__tests__/status.test.ts +71 -1
  755. package/node_modules/@vellumai/local-mode/src/avatar.test.ts +404 -0
  756. package/node_modules/@vellumai/local-mode/src/avatar.ts +151 -0
  757. package/node_modules/@vellumai/local-mode/src/devices.test.ts +62 -0
  758. package/node_modules/@vellumai/local-mode/src/devices.ts +12 -0
  759. package/node_modules/@vellumai/local-mode/src/guardian-token.ts +27 -34
  760. package/node_modules/@vellumai/local-mode/src/index.ts +26 -3
  761. package/node_modules/@vellumai/local-mode/src/lockfile-contract.ts +1 -1
  762. package/node_modules/@vellumai/local-mode/src/lockfile.test.ts +1 -0
  763. package/node_modules/@vellumai/local-mode/src/lockfile.ts +6 -3
  764. package/node_modules/@vellumai/local-mode/src/pair.ts +1099 -129
  765. package/node_modules/@vellumai/local-mode/src/status.ts +67 -22
  766. package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +37 -0
  767. package/node_modules/@vellumai/service-contracts/src/__tests__/remote-web-pairing.test.ts +389 -0
  768. package/node_modules/@vellumai/service-contracts/src/ingress.ts +22 -0
  769. package/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +508 -18
  770. package/node_modules/@vellumai/service-contracts/src/rpc.ts +174 -0
  771. package/package.json +3 -1
  772. package/src/__tests__/connect-import.test.ts +512 -172
  773. package/src/__tests__/detached-process.test.ts +152 -0
  774. package/src/__tests__/devices.test.ts +12 -0
  775. package/src/__tests__/hatch-provider-secrets.test.ts +95 -0
  776. package/src/__tests__/pair.test.ts +319 -305
  777. package/src/__tests__/provider-secrets.test.ts +158 -0
  778. package/src/__tests__/tunnel.test.ts +200 -23
  779. package/src/__tests__/wake.test.ts +51 -1
  780. package/src/adapters/install.sh +2 -1
  781. package/src/adapters/openclaw.ts +2 -1
  782. package/src/commands/client.ts +81 -58
  783. package/src/commands/connect/import.ts +248 -52
  784. package/src/commands/connect.ts +1 -1
  785. package/src/commands/devices.ts +4 -0
  786. package/src/commands/pair.ts +173 -298
  787. package/src/commands/tunnel.ts +162 -54
  788. package/src/commands/voice.ts +370 -0
  789. package/src/components/DefaultMainScreen.tsx +0 -144
  790. package/src/index.ts +5 -2
  791. package/src/lib/detached-process.ts +81 -0
  792. package/src/lib/docker.ts +21 -4
  793. package/src/lib/guardian-token.ts +19 -2
  794. package/src/lib/hatch-local.ts +23 -5
  795. package/src/lib/live-voice/client.test.ts +316 -0
  796. package/src/lib/live-voice/client.ts +363 -0
  797. package/src/lib/live-voice/connection.ts +133 -0
  798. package/src/lib/live-voice/pcm-player.test.ts +101 -0
  799. package/src/lib/live-voice/pcm-player.ts +356 -0
  800. package/src/lib/live-voice/protocol.test.ts +53 -0
  801. package/src/lib/live-voice/protocol.ts +193 -0
  802. package/src/lib/local.ts +2 -1
  803. package/src/lib/provider-secrets.ts +195 -0
  804. package/src/lib/shell-arg.test.ts +24 -0
  805. package/src/lib/shell-arg.ts +17 -0
  806. package/src/lib/tunnel-edge.ts +31 -2
  807. package/src/shared/provider-env-vars.ts +1 -0
@@ -1,6 +1,18 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
 
4
+ import {
5
+ parsePairingAddress,
6
+ REMOTE_WEB_PAIRING_CODE_TTL_MS,
7
+ resolveRemoteWebPairingPlatform,
8
+ tunnelProviderWebsiteName,
9
+ type PairingFailureReason,
10
+ type PublicBaseUrlRejection,
11
+ type RemoteWebPairingChallengeRequest,
12
+ type RemoteWebPairingChallengeResponse,
13
+ type RemoteWebPairingTokenPendingResponse,
14
+ type RemoteWebPairingTokenRequest,
15
+ } from "@vellumai/service-contracts/remote-web-pairing";
4
16
  import { nanoid } from "nanoid";
5
17
 
6
18
  import { guardianTokenPath } from "./config";
@@ -12,79 +24,23 @@ import {
12
24
  import { readRawLockfile, upsertLockfileAssistant } from "./lockfile";
13
25
 
14
26
  /**
15
- * A decoded `vellum pair` bundle: base64(JSON.stringify({ gatewayUrl, token,
16
- * ... })) printed on the host machine and imported on this one.
27
+ * The session credentials a pairing exchange yields, in the shape
28
+ * {@link pairAssistant} persists. `refreshToken` is absent when the assistant's
29
+ * gateway does not issue a device-bound refresh credential, which imports the
30
+ * pairing access-only.
31
+ *
32
+ * `refreshTokenExpiresAt` mirrors GuardianTokenData (ISO string OR epoch-ms
33
+ * number) so a numeric expiry isn't silently dropped on import.
17
34
  */
18
- export interface PairBundle {
35
+ export interface PairedAssistantCredentials {
19
36
  gatewayUrl: string;
20
37
  token: string;
21
- assistantId?: string;
22
38
  deviceId?: string;
23
- // Optional refresh credential. Present when the host's gateway issued a
24
- // device-bound token pair; absent for older access-only bundles (which remain
25
- // importable, just without auto-renewal). `refreshTokenExpiresAt` mirrors
26
- // GuardianTokenData (ISO string OR epoch-ms number) so a numeric expiry isn't
27
- // silently dropped on import.
28
39
  refreshToken?: string;
29
40
  refreshTokenExpiresAt?: string | number;
30
41
  refreshAfter?: string;
31
42
  }
32
43
 
33
- export type DecodePairBundleResult =
34
- | { ok: true; bundle: PairBundle }
35
- | { ok: false; error: string };
36
-
37
- /**
38
- * Decode and validate a base64 pairing bundle. Total and non-throwing:
39
- * malformed input yields a typed failure. `gatewayUrl` is persisted as
40
- * `runtimeUrl` and used to build fetch URLs, so it must be an absolute http(s)
41
- * URL rather than letting an invalid string through (which would crash
42
- * `new URL(...)` or break later client calls).
43
- */
44
- export function decodePairBundle(encoded: string): DecodePairBundleResult {
45
- let json: unknown;
46
- try {
47
- json = JSON.parse(Buffer.from(encoded, "base64").toString("utf8"));
48
- } catch {
49
- return { ok: false, error: "Bundle is not base64-encoded JSON" };
50
- }
51
- if (typeof json !== "object" || json === null) {
52
- return { ok: false, error: "Bundle is not a JSON object" };
53
- }
54
- const b = json as Record<string, unknown>;
55
- if (typeof b.gatewayUrl !== "string" || typeof b.token !== "string") {
56
- return { ok: false, error: "Bundle is missing gatewayUrl or token" };
57
- }
58
- let parsed: URL;
59
- try {
60
- parsed = new URL(b.gatewayUrl);
61
- } catch {
62
- return { ok: false, error: "Bundle gatewayUrl is not an absolute URL" };
63
- }
64
- if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
65
- return { ok: false, error: "Bundle gatewayUrl is not an http(s) URL" };
66
- }
67
- return {
68
- ok: true,
69
- bundle: {
70
- gatewayUrl: b.gatewayUrl,
71
- token: b.token,
72
- assistantId:
73
- typeof b.assistantId === "string" ? b.assistantId : undefined,
74
- deviceId: typeof b.deviceId === "string" ? b.deviceId : undefined,
75
- refreshToken:
76
- typeof b.refreshToken === "string" ? b.refreshToken : undefined,
77
- refreshTokenExpiresAt:
78
- typeof b.refreshTokenExpiresAt === "string" ||
79
- typeof b.refreshTokenExpiresAt === "number"
80
- ? b.refreshTokenExpiresAt
81
- : undefined,
82
- refreshAfter:
83
- typeof b.refreshAfter === "string" ? b.refreshAfter : undefined,
84
- },
85
- };
86
- }
87
-
88
44
  /** Lowercase, collapse non-alphanumerics to single dashes, trim dashes. */
89
45
  function slugify(name: string): string {
90
46
  return name
@@ -109,16 +65,25 @@ function jwtExpiryMs(token: string): number | null {
109
65
  }
110
66
 
111
67
  export interface PairOptions {
112
- /** A bundle validated by {@link decodePairBundle}. */
113
- bundle: PairBundle;
68
+ /** Credentials from a completed pairing exchange. */
69
+ credentials: PairedAssistantCredentials;
114
70
  /** Optional local name; its slug becomes the entry's assistantId. */
115
71
  name?: string;
72
+ /**
73
+ * The device id a legacy base64 bundle carries, which only
74
+ * {@link connectImport} passes. It adopts the `paired-<deviceId>` entry a
75
+ * previous release keyed that same bundle on, so a nameless re-import
76
+ * updates it instead of adding a second entry (see
77
+ * {@link findLegacyDeviceScopedId}). The pairing-link flow mints a device id
78
+ * per attempt, so keying on it there would strand every earlier pairing.
79
+ */
80
+ legacyDeviceId?: string;
116
81
  }
117
82
 
118
83
  /**
119
84
  * Failure statuses: 400 the name slugifies to nothing, 409 the id names an
120
85
  * existing non-paired assistant (`assistantId` carries the refused id),
121
- * 422 the bundle's gatewayUrl is unparseable, 500 a write failed.
86
+ * 422 the credentials' gatewayUrl is unusable, 500 a write failed.
122
87
  */
123
88
  export type PairResult =
124
89
  | {
@@ -127,17 +92,205 @@ export type PairResult =
127
92
  assistantId: string;
128
93
  /** True when an existing paired entry was updated in place. */
129
94
  updated: boolean;
130
- /** True when the bundle carried no refresh credential. */
95
+ /** True when the exchange yielded no usable refresh credential. */
131
96
  accessOnly: boolean;
132
97
  }
133
98
  | { ok: false; status: number; error: string; assistantId?: string };
134
99
 
100
+ /** The refusal half of {@link PairResult}. */
101
+ export type PairRefusal = Extract<PairResult, { ok: false }>;
102
+
103
+ /**
104
+ * How a gateway URL names one assistant: its host plus the deployment path
105
+ * prefix, e.g. `gw.example.com/assistant-1`. The prefix is part of the
106
+ * identity because `normalizePairingBaseUrl` keeps it, so several assistants
107
+ * can sit behind one host and differ only there. The empty string when the URL
108
+ * names no host, which is nothing to key on.
109
+ */
110
+ function gatewayLabel(gatewayUrl: string): string {
111
+ const url = new URL(gatewayUrl);
112
+ if (!url.host) {
113
+ return "";
114
+ }
115
+ return `${url.host}${url.pathname.replace(/\/+$/, "")}`;
116
+ }
117
+
118
+ /**
119
+ * The local id a pairing registers under: a `--name` slug, or
120
+ * `paired-<gateway label>`. The {@link gatewayLabel} keys the default because
121
+ * it is what stays the same across re-pairings of one assistant, so a second
122
+ * pairing lands on the existing entry instead of adding another; the device id
123
+ * is minted fresh per attempt and would strand every previous pairing in the
124
+ * lockfile. Never the remote assistantId, which is typically "self" and would
125
+ * collide across hosts.
126
+ *
127
+ * The label carries the path prefix, so two assistants behind one host get
128
+ * distinct ids. Keying on the host alone would make the second nameless import
129
+ * read as a re-pair of the first and take over its entry and guardian token.
130
+ *
131
+ * The id is a path component for `saveGuardianToken`, so it is always
132
+ * slugified (no `../` traversal) and falls back to a random id when it
133
+ * sanitizes to empty.
134
+ */
135
+ function derivePairedAssistantId(name?: string, gatewayUrl?: string): string {
136
+ if (name) {
137
+ return slugify(name);
138
+ }
139
+ let label = "";
140
+ try {
141
+ label = gatewayLabel(gatewayUrl ?? "");
142
+ } catch {
143
+ /* an unparseable URL names no host, so the random id below applies */
144
+ }
145
+ return `paired-${slugify(label) || nanoid()}`;
146
+ }
147
+
148
+ /** The raw lockfile entry already holding `localId`, if any. */
149
+ function findRawAssistant(
150
+ lockfilePaths: string[],
151
+ localId: string,
152
+ ): Record<string, unknown> | undefined {
153
+ const rawAssistants = readRawLockfile(lockfilePaths).assistants;
154
+ return (
155
+ Array.isArray(rawAssistants)
156
+ ? (rawAssistants as Array<Record<string, unknown>>)
157
+ : []
158
+ ).find((a) => a?.assistantId === localId);
159
+ }
160
+
161
+ /**
162
+ * The `paired-<deviceId>` entry an earlier release wrote for this same
163
+ * bundle, or undefined when there is none. That release keyed a nameless
164
+ * bundle import on the bundle's own device id, so honoring the key here is
165
+ * what makes a re-import of that bundle update its entry rather than register
166
+ * a duplicate under the {@link gatewayLabel} id and leave the original holding
167
+ * stale credentials.
168
+ *
169
+ * Only a `paired: true` entry whose runtimeUrl names the same gateway is
170
+ * adopted. The device id is untrusted bundle input, so an unmatched one would
171
+ * let a crafted bundle take over an unrelated pairing and repoint it at
172
+ * another host; requiring the match means the adopted id is always one this
173
+ * machine already minted for this gateway.
174
+ */
175
+ function findLegacyDeviceScopedId(
176
+ lockfilePaths: string[],
177
+ deviceId: string,
178
+ gatewayUrl: string,
179
+ ): string | undefined {
180
+ const slug = slugify(deviceId);
181
+ if (!slug) {
182
+ return undefined;
183
+ }
184
+ const legacyId = `paired-${slug}`;
185
+ const existing = findRawAssistant(lockfilePaths, legacyId);
186
+ if (
187
+ existing?.paired !== true ||
188
+ typeof existing.runtimeUrl !== "string" ||
189
+ !existing.runtimeUrl
190
+ ) {
191
+ return undefined;
192
+ }
193
+ try {
194
+ if (gatewayLabel(existing.runtimeUrl) !== gatewayLabel(gatewayUrl)) {
195
+ return undefined;
196
+ }
197
+ } catch {
198
+ return undefined;
199
+ }
200
+ return legacyId;
201
+ }
202
+
203
+ /**
204
+ * Why `localId` may not be registered, or null when it is free. An id that
205
+ * slugifies to nothing is unusable, and an id already held by a NON-paired
206
+ * assistant is refused rather than clobbered: overwriting would drop that
207
+ * assistant's resources/runtime metadata. An existing PAIRED entry is a
208
+ * re-import and updates in place.
209
+ */
210
+ function refusePairedAssistantId(
211
+ localId: string,
212
+ existing: Record<string, unknown> | undefined,
213
+ ): PairRefusal | null {
214
+ if (!localId) {
215
+ return {
216
+ ok: false,
217
+ status: 400,
218
+ error: "Name must contain at least one alphanumeric character",
219
+ };
220
+ }
221
+ if (existing && existing.paired !== true) {
222
+ return {
223
+ ok: false,
224
+ status: 409,
225
+ error: `An assistant named '${localId}' already exists`,
226
+ assistantId: localId,
227
+ };
228
+ }
229
+ return null;
230
+ }
231
+
232
+ /** Where a pairing would land locally, and whether it may. */
233
+ interface PairedDestination {
234
+ localId: string;
235
+ /** The raw lockfile entry already holding `localId`, if any. */
236
+ existing: Record<string, unknown> | undefined;
237
+ /** Why the id cannot be used, or null when it is free. */
238
+ refusal: PairRefusal | null;
239
+ }
240
+
135
241
  /**
136
- * Register a pairing bundle on this machine: persist the guardian token and
137
- * upsert a `cloud: "paired"` lockfile entry, the write counterpart of
242
+ * The single derivation-plus-refusal every pairing caller runs, so a
243
+ * pre-check and the registration it precedes cannot drift apart.
244
+ *
245
+ * A pre-check is not a reservation: another process can claim the id in
246
+ * between. It closes the common case; the check inside `pairAssistant` is
247
+ * still what guarantees the id.
248
+ *
249
+ * `legacyDeviceId` is the bundle path's opt-in to
250
+ * {@link findLegacyDeviceScopedId}; an explicit name outranks it.
251
+ */
252
+ function resolvePairedDestination(
253
+ lockfilePaths: string[],
254
+ name: string | undefined,
255
+ gatewayUrl?: string,
256
+ legacyDeviceId?: string,
257
+ ): PairedDestination {
258
+ let localId: string | undefined;
259
+ if (!name && legacyDeviceId && gatewayUrl) {
260
+ localId = findLegacyDeviceScopedId(
261
+ lockfilePaths,
262
+ legacyDeviceId,
263
+ gatewayUrl,
264
+ );
265
+ }
266
+ localId ??= derivePairedAssistantId(name, gatewayUrl);
267
+ const existing = findRawAssistant(lockfilePaths, localId);
268
+ return {
269
+ localId,
270
+ existing,
271
+ refusal: refusePairedAssistantId(localId, existing),
272
+ };
273
+ }
274
+
275
+ /**
276
+ * The refusal {@link pairAssistant} would return for a `--name`, or null when
277
+ * the name is usable. Lets a caller reject a colliding name BEFORE spending a
278
+ * one-time pairing code, which the gateway records a device for even when the
279
+ * local write then fails.
280
+ */
281
+ export function checkPairedAssistantName(
282
+ lockfilePaths: string[],
283
+ name: string,
284
+ ): PairRefusal | null {
285
+ return resolvePairedDestination(lockfilePaths, name).refusal;
286
+ }
287
+
288
+ /**
289
+ * Register a pairing on this machine: persist the guardian token and upsert a
290
+ * `cloud: "paired"` lockfile entry, the write counterpart of
138
291
  * `unpairAssistant`.
139
292
  *
140
- * The entry is stored under a UNIQUE LOCAL id (not the bundle's assistantId,
293
+ * The entry is stored under a UNIQUE LOCAL id (not the remote assistant id,
141
294
  * which is typically "self" and would collide across hosts). This is safe
142
295
  * because the gateway's runtime proxy strips the `/v1/assistants/<id>/` segment
143
296
  * before forwarding, so the local id never has to match the remote one: the
@@ -146,66 +299,41 @@ export type PairResult =
146
299
  export function pairAssistant(
147
300
  lockfilePaths: string[],
148
301
  configDir: string,
149
- { bundle, name }: PairOptions,
302
+ { credentials, name, legacyDeviceId }: PairOptions,
150
303
  ): PairResult {
151
- let gatewayHost: string;
304
+ let label: string;
152
305
  try {
153
- gatewayHost = new URL(bundle.gatewayUrl).host;
306
+ label = gatewayLabel(credentials.gatewayUrl);
154
307
  } catch {
155
308
  return {
156
309
  ok: false,
157
310
  status: 422,
158
- error: "Bundle gatewayUrl is not an absolute URL",
311
+ error: "Pairing gatewayUrl is not an absolute URL",
159
312
  };
160
313
  }
161
314
 
162
315
  // A paired entry is remote by definition (`vellum pair` refuses to advertise
163
316
  // loopback URLs), and a loopback runtimeUrl in the lockfile would otherwise
164
317
  // read as a local gateway to loopback-port consumers. Refuse it outright so
165
- // a crafted bundle cannot point a pairing at this machine's own services.
166
- if (isLoopbackUrl(bundle.gatewayUrl)) {
318
+ // a crafted address cannot point a pairing at this machine's own services.
319
+ if (isLoopbackUrl(credentials.gatewayUrl)) {
167
320
  return {
168
321
  ok: false,
169
322
  status: 422,
170
323
  error:
171
324
  "A paired assistant needs a non-loopback gateway URL; run `vellum pair` " +
172
- "with --url pointing at a tunnel or LAN address.",
173
- };
174
- }
175
-
176
- // Unique local id: a name slug, or paired-<deviceId> (deviceId is unique per
177
- // pairing). Never the bundle's "self" assistantId, which would collide. The
178
- // deviceId comes from an untrusted bundle and is used as a path component by
179
- // saveGuardianToken, so it MUST be slugified (no `../` traversal); fall back
180
- // to a random id if it sanitizes to empty.
181
- const localId = name
182
- ? slugify(name)
183
- : `paired-${slugify(bundle.deviceId ?? "") || nanoid()}`;
184
- if (!localId) {
185
- return {
186
- ok: false,
187
- status: 400,
188
- error: "Name must contain at least one alphanumeric character",
325
+ "with --url pointing at a tunnel or public https address.",
189
326
  };
190
327
  }
191
328
 
192
- // Don't clobber an existing assistant. Only update in place when the prior
193
- // entry is itself a paired import (marked `paired: true`); otherwise the id
194
- // collides with a real local/remote assistant and overwriting would drop its
195
- // resources/runtime metadata. Reject and let the caller pick a fresh name.
196
- const rawAssistants = readRawLockfile(lockfilePaths).assistants;
197
- const existing = (
198
- Array.isArray(rawAssistants)
199
- ? (rawAssistants as Array<Record<string, unknown>>)
200
- : []
201
- ).find((a) => a?.assistantId === localId);
202
- if (existing && existing.paired !== true) {
203
- return {
204
- ok: false,
205
- status: 409,
206
- error: `An assistant named '${localId}' already exists`,
207
- assistantId: localId,
208
- };
329
+ const { localId, existing, refusal } = resolvePairedDestination(
330
+ lockfilePaths,
331
+ name,
332
+ credentials.gatewayUrl,
333
+ legacyDeviceId,
334
+ );
335
+ if (refusal) {
336
+ return refusal;
209
337
  }
210
338
 
211
339
  // Write the token BEFORE committing the lockfile entry, the mirror of
@@ -226,16 +354,16 @@ export function pairAssistant(
226
354
  try {
227
355
  saveGuardianToken(configDir, localId, {
228
356
  guardianPrincipalId: "imported",
229
- accessToken: bundle.token,
357
+ accessToken: credentials.token,
230
358
  accessTokenExpiresAt:
231
- jwtExpiryMs(bundle.token) ?? now + 24 * 60 * 60 * 1000,
232
- refreshToken: bundle.refreshToken ?? "",
233
- refreshTokenExpiresAt: bundle.refreshTokenExpiresAt ?? 0,
234
- refreshAfter: bundle.refreshAfter ?? "",
359
+ jwtExpiryMs(credentials.token) ?? now + 24 * 60 * 60 * 1000,
360
+ refreshToken: credentials.refreshToken ?? "",
361
+ refreshTokenExpiresAt: credentials.refreshTokenExpiresAt ?? 0,
362
+ refreshAfter: credentials.refreshAfter ?? "",
235
363
  isNew: false,
236
- deviceId: bundle.deviceId ?? "",
364
+ deviceId: credentials.deviceId ?? "",
237
365
  leasedAt: new Date(now).toISOString(),
238
- pairedGatewayUrl: bundle.gatewayUrl,
366
+ pairedGatewayUrl: credentials.gatewayUrl,
239
367
  });
240
368
  } catch (err) {
241
369
  return {
@@ -251,8 +379,11 @@ export function pairAssistant(
251
379
  lockfilePaths,
252
380
  {
253
381
  assistantId: localId,
254
- name: name ?? `paired (${gatewayHost})`,
255
- runtimeUrl: bundle.gatewayUrl,
382
+ // The label, not the bare host: two assistants behind one host differ
383
+ // only in their path prefix, and a display name that dropped it would
384
+ // make them indistinguishable in a chooser.
385
+ name: name ?? `paired (${label})`,
386
+ runtimeUrl: credentials.gatewayUrl,
256
387
  // Paired entries are reached by bearer token at the remote runtimeUrl
257
388
  // (a non-"vellum" cloud selects the bearer-token auth path in client.ts).
258
389
  // The "paired" topology lets lifecycle/status commands (ps/wake/sleep)
@@ -263,6 +394,10 @@ export function pairAssistant(
263
394
  // guard above).
264
395
  paired: true,
265
396
  species: "vellum",
397
+ // A re-pair may point at a different gateway, so the platform id the
398
+ // web resolver cached for the old target is dropped; the upsert merge
399
+ // would otherwise keep it and the resolver would never re-probe.
400
+ platformAssistantId: undefined,
266
401
  },
267
402
  undefined,
268
403
  );
@@ -291,15 +426,848 @@ export function pairAssistant(
291
426
  // loopback refused above, a plaintext http gateway can never renew, so it
292
427
  // is reported access-only and gets the expiry warning.
293
428
  accessOnly:
294
- !bundle.refreshToken || !isConfidentialRefreshUrl(bundle.gatewayUrl),
429
+ !credentials.refreshToken ||
430
+ !isConfidentialRefreshUrl(credentials.gatewayUrl),
295
431
  };
296
432
  }
297
433
 
434
+ // ── Host-side pairing sessions ──────────────────────────────────────────────
435
+ //
436
+ // A pairing address is either a full pairing link (it carries an approved
437
+ // device code) or a bare assistant URL (this machine mints its own challenge
438
+ // and the user approves the printed code on the host). Both end at one
439
+ // `POST /v1/remote-web/pairing-token` exchange whose credentials go straight
440
+ // to `pairAssistant`.
441
+ //
442
+ // The device code, the generated device id, and the minted tokens never leave
443
+ // this process: callers hold an opaque handle and see only the approval code
444
+ // they are meant to display.
445
+
446
+ /**
447
+ * Bounds what an untrusted pairing request can make a host buffer and parse.
448
+ * A pairing link is a URL, so anything approaching this is not one.
449
+ */
450
+ const MAX_PAIRING_ADDRESS_LENGTH = 2 * 1024;
451
+
452
+ /** Poll cadence used until the gateway names its own. */
453
+ const DEFAULT_PAIRING_POLL_INTERVAL_SECONDS = 5;
454
+
298
455
  /**
299
- * Bounds what an untrusted connect-import request can make a host buffer and
300
- * decode. Enforced by {@link connectImport} for every host.
456
+ * Caps the cadence the assistant at a pasted address may set. That address is
457
+ * untrusted and callers turn the cadence straight into a wait, so an absurd
458
+ * interval parks the attempt forever, and one past `2**31-1` ms overflows a
459
+ * `setTimeout` into a tight loop against that host. The gateway's own cadence
460
+ * is 5s, so this is generous.
301
461
  */
302
- export const MAX_PAIR_BUNDLE_LENGTH = 64 * 1024;
462
+ const MAX_PAIRING_POLL_INTERVAL_SECONDS = 60;
463
+
464
+ /**
465
+ * Floors that same cadence. Without one, an assistant naming `1e-9` has the
466
+ * caller poll it as fast as the round trip allows for the code's whole
467
+ * ten-minute TTL, which is a tight loop against that host and this machine
468
+ * alike. The gateway's own cadence is 5s, so a floor a fifth of that slows no
469
+ * legitimate deployment.
470
+ */
471
+ const MIN_PAIRING_POLL_INTERVAL_SECONDS = 1;
472
+
473
+ /** Caps how long a single pairing request may occupy the caller. */
474
+ const PAIRING_REQUEST_TIMEOUT_MS = 15_000;
475
+
476
+ /**
477
+ * Caps how many bytes of a pairing reply a host will buffer. Every pairing
478
+ * response is a small fixed-shape payload, so a body approaching this is not
479
+ * one and is refused rather than parsed.
480
+ */
481
+ const MAX_PAIRING_RESPONSE_BYTES = 64 * 1024;
482
+
483
+ const PAIRING_CHALLENGE_PATH = "/v1/remote-web/pairing-challenge";
484
+ const PAIRING_TOKEN_PATH = "/v1/remote-web/pairing-token";
485
+
486
+ /**
487
+ * What a pairing attempt failed on. Defined by
488
+ * `@vellumai/service-contracts/remote-web-pairing`, which also owns the
489
+ * retryable classification every pairing surface reads.
490
+ */
491
+ export type { PairingFailureReason };
492
+
493
+ export interface PairingFailure {
494
+ ok: false;
495
+ reason: PairingFailureReason;
496
+ /** Ready to display. */
497
+ error: string;
498
+ /** HTTP status for the loopback hosts that expose this over a route. */
499
+ status: number;
500
+ /** Why the address was refused; set only for `invalid-address`. */
501
+ rejection?: PublicBaseUrlRejection;
502
+ }
503
+
504
+ export interface PairingStarted {
505
+ ok: true;
506
+ /** Opaque key for {@link pairingPoll} and {@link pairingCancel}. */
507
+ handle: string;
508
+ /**
509
+ * The approval code to display, or null when the address already carried an
510
+ * approved device code and the first poll imports outright.
511
+ */
512
+ userCode: string | null;
513
+ /** ISO-8601 instant the attempt expires. */
514
+ expiresAt: string;
515
+ /** Seconds to wait between {@link pairingPoll} calls. */
516
+ intervalSeconds: number;
517
+ }
518
+
519
+ export type PairingStartResult = PairingStarted | PairingFailure;
520
+
521
+ export type PairingPollResult =
522
+ | {
523
+ ok: true;
524
+ status: "pending";
525
+ /** ISO-8601 instant the attempt expires. */
526
+ expiresAt: string;
527
+ /** Seconds to wait before polling again. */
528
+ intervalSeconds: number;
529
+ }
530
+ | {
531
+ ok: true;
532
+ status: "imported";
533
+ /** The unique local id the pairing was registered under. */
534
+ assistantId: string;
535
+ /** True when an existing paired entry was updated in place. */
536
+ updated: boolean;
537
+ /** True when the exchange yielded no usable refresh credential. */
538
+ accessOnly: boolean;
539
+ }
540
+ | PairingFailure;
541
+
542
+ interface PendingPairing {
543
+ publicBaseUrl: string;
544
+ deviceCode: string;
545
+ deviceId: string;
546
+ expiresAtMs: number;
547
+ intervalSeconds: number;
548
+ /**
549
+ * Aborted when the session leaves {@link pendingPairings}: it stops the
550
+ * exchange in flight and marks the session as one no caller is waiting on.
551
+ * {@link pairingPoll} reads this signal rather than the map so a dead
552
+ * session is distinguishable from a map lookup that simply raced.
553
+ */
554
+ abort: AbortController;
555
+ }
556
+
557
+ /**
558
+ * Live pairing sessions by handle.
559
+ *
560
+ * The rule for leaving this map: a session that is removed is aborted on the
561
+ * way out, so an exchange still in flight for it can never persist. That holds
562
+ * for a cancel, an expiry sweep, and a code the gateway reports dead. The one
563
+ * exception is the delete that follows an approved 200, whose exchange has
564
+ * already succeeded and is being persisted by the very call that removes it.
565
+ */
566
+ const pendingPairings = new Map<string, PendingPairing>();
567
+
568
+ /**
569
+ * Drop sessions past their challenge's TTL so the map can't grow unbounded.
570
+ * Each eviction aborts, so an exchange that left while its session was live
571
+ * cannot persist credentials once the session is gone.
572
+ */
573
+ function sweepExpiredPairings(): void {
574
+ const now = Date.now();
575
+ for (const [handle, session] of pendingPairings) {
576
+ if (now >= session.expiresAtMs) {
577
+ pendingPairings.delete(handle);
578
+ session.abort.abort();
579
+ }
580
+ }
581
+ }
582
+
583
+ function addressRejectionMessage(
584
+ reason: PublicBaseUrlRejection,
585
+ address: string,
586
+ ): string {
587
+ switch (reason) {
588
+ case "loopback":
589
+ return "That address points back at this machine. Use the assistant's public https address.";
590
+ case "private-address":
591
+ return "That address points at a private network address. Pairing needs the assistant's public address.";
592
+ case "non-https":
593
+ return "A pairing address must use https.";
594
+ case "service-website":
595
+ return `That is ${
596
+ tunnelProviderWebsiteName(address) ?? "the tunnel provider"
597
+ }'s own website, not your assistant's address.`;
598
+ default:
599
+ return "That is not a valid address. Paste the assistant's https URL or a pairing link.";
600
+ }
601
+ }
602
+
603
+ function invalidAddress(
604
+ error: string,
605
+ rejection?: PublicBaseUrlRejection,
606
+ ): PairingFailure {
607
+ return {
608
+ ok: false,
609
+ reason: "invalid-address",
610
+ status: 400,
611
+ error,
612
+ rejection,
613
+ };
614
+ }
615
+
616
+ /**
617
+ * No live session behind a handle: never opened, already settled, or
618
+ * cancelled. A cancel that lands mid-exchange answers with this too, since
619
+ * from the caller's side the outcome is the same: the attempt is over and a
620
+ * retry needs a fresh code. Never retryable, so a caller cannot spin against
621
+ * a session it just killed.
622
+ */
623
+ function unknownSession(): PairingFailure {
624
+ return {
625
+ ok: false,
626
+ reason: "unknown-session",
627
+ status: 404,
628
+ error: "That pairing attempt is no longer active. Start over.",
629
+ };
630
+ }
631
+
632
+ function expiredCode(): PairingFailure {
633
+ return {
634
+ ok: false,
635
+ reason: "expired",
636
+ status: 410,
637
+ error:
638
+ "The pairing code expired or was denied. Start over to get a new one.",
639
+ };
640
+ }
641
+
642
+ function unreachableAssistant(): PairingFailure {
643
+ return {
644
+ ok: false,
645
+ reason: "unreachable",
646
+ status: 503,
647
+ error:
648
+ "Could not reach that assistant. Check the address and that it is online.",
649
+ };
650
+ }
651
+
652
+ function oversizedGatewayReply(): PairingFailure {
653
+ return {
654
+ ok: false,
655
+ reason: "gateway",
656
+ status: 502,
657
+ error: "The assistant's pairing reply was too large to be read.",
658
+ };
659
+ }
660
+
661
+ function unusableGatewayCredentials(): PairingFailure {
662
+ return {
663
+ ok: false,
664
+ reason: "gateway",
665
+ status: 502,
666
+ error:
667
+ "The assistant approved the pairing but returned credentials this device cannot use.",
668
+ };
669
+ }
670
+
671
+ function unusableChallengeReply(): PairingFailure {
672
+ return {
673
+ ok: false,
674
+ reason: "gateway",
675
+ status: 502,
676
+ error:
677
+ "The assistant answered the pairing request with something this device cannot use.",
678
+ };
679
+ }
680
+
681
+ /**
682
+ * A refusal the assistant answered with instead of a reply it completed. The
683
+ * gateway releases the device code on these (a transient failure, or one that
684
+ * needs repair), so the code stays exchangeable and the caller is meant to try
685
+ * the same session again.
686
+ */
687
+ function retryableGatewayReply(status: number): PairingFailure {
688
+ return {
689
+ ok: false,
690
+ reason: "gateway-retryable",
691
+ status: 502,
692
+ error: `The assistant could not finish the pairing (HTTP ${status}). Trying again may work.`,
693
+ };
694
+ }
695
+
696
+ type PairingPost =
697
+ | { ok: true; status: number; body: unknown }
698
+ | { ok: false; failure: PairingFailure };
699
+
700
+ type PairingBody =
701
+ { ok: true; value: unknown } | { ok: false; failure: PairingFailure };
702
+
703
+ /**
704
+ * The reply body as JSON, read under {@link MAX_PAIRING_RESPONSE_BYTES}. An
705
+ * over-cap body is refused mid-stream (the rest is never buffered) and a body
706
+ * that is absent or not JSON reads as `null`, which every caller already
707
+ * treats as an unusable reply.
708
+ */
709
+ async function readPairingBody(response: Response): Promise<PairingBody> {
710
+ const stream = response.body;
711
+ if (!stream) {
712
+ return { ok: true, value: null };
713
+ }
714
+ const reader = stream.getReader();
715
+ const chunks: Uint8Array[] = [];
716
+ let bytes = 0;
717
+ try {
718
+ for (;;) {
719
+ const { done, value } = await reader.read();
720
+ if (done) {
721
+ break;
722
+ }
723
+ bytes += value.byteLength;
724
+ if (bytes > MAX_PAIRING_RESPONSE_BYTES) {
725
+ await reader.cancel().catch(() => {});
726
+ return { ok: false, failure: oversizedGatewayReply() };
727
+ }
728
+ chunks.push(value);
729
+ }
730
+ } catch {
731
+ // A stream that errors or times out mid-body is a transport failure.
732
+ await reader.cancel().catch(() => {});
733
+ return { ok: false, failure: unreachableAssistant() };
734
+ }
735
+ try {
736
+ return {
737
+ ok: true,
738
+ value: JSON.parse(Buffer.concat(chunks).toString("utf8")) as unknown,
739
+ };
740
+ } catch {
741
+ return { ok: true, value: null };
742
+ }
743
+ }
744
+
745
+ /**
746
+ * One timeout-bounded pairing POST. A network error, a timeout, an over-cap
747
+ * body, and a non-JSON body all resolve rather than throw so every caller
748
+ * stays total.
749
+ *
750
+ * `redirect: "error"` is what keeps the address checks meaningful: a followed
751
+ * 3xx would carry the request to a host `parsePairingAddress` never saw, so a
752
+ * loopback or plaintext target could be reached through a validated public
753
+ * URL. A pairing endpoint has no reason to redirect, and fetch rejects the
754
+ * attempt as a transport failure.
755
+ *
756
+ * `cancelSignal` cuts a request short when its session is cancelled. An abort
757
+ * reads as a transport failure here, so the caller that owns the signal has to
758
+ * report the cancellation itself rather than passing this failure on.
759
+ */
760
+ async function postPairingRequest(
761
+ publicBaseUrl: string,
762
+ routePath: string,
763
+ body: unknown,
764
+ cancelSignal?: AbortSignal,
765
+ ): Promise<PairingPost> {
766
+ const timeout = AbortSignal.timeout(PAIRING_REQUEST_TIMEOUT_MS);
767
+ let response: Response;
768
+ try {
769
+ response = await fetch(`${publicBaseUrl}${routePath}`, {
770
+ method: "POST",
771
+ headers: { "Content-Type": "application/json" },
772
+ body: JSON.stringify(body),
773
+ redirect: "error",
774
+ signal: cancelSignal ? AbortSignal.any([timeout, cancelSignal]) : timeout,
775
+ });
776
+ } catch {
777
+ return { ok: false, failure: unreachableAssistant() };
778
+ }
779
+ const parsed = await readPairingBody(response);
780
+ if (!parsed.ok) {
781
+ return { ok: false, failure: parsed.failure };
782
+ }
783
+ return { ok: true, status: response.status, body: parsed.value };
784
+ }
785
+
786
+ function isChallengeResponse(
787
+ value: unknown,
788
+ ): value is RemoteWebPairingChallengeResponse {
789
+ const payload = value as Partial<RemoteWebPairingChallengeResponse> | null;
790
+ return (
791
+ typeof payload?.deviceCode === "string" &&
792
+ typeof payload.userCode === "string" &&
793
+ typeof payload.expiresAt === "string"
794
+ );
795
+ }
796
+
797
+ /** The credential fields a usable approved pairing reply carries. */
798
+ interface ApprovedCredentials {
799
+ accessToken: string;
800
+ refreshToken?: string;
801
+ refreshTokenExpiresAt?: string | number;
802
+ refreshAfter?: string;
803
+ }
804
+
805
+ /**
806
+ * The credentials of an approved reply, or null when it is not one this device
807
+ * can persist. Every field is checked before anything reaches the guardian
808
+ * token file: an empty `accessToken` or a wrong-typed refresh field would
809
+ * otherwise be written as a credential that reports success now and fails
810
+ * later, at first use or first refresh.
811
+ *
812
+ * ABSENT refresh fields are legitimate. That is the older-gateway path, which
813
+ * mints no device-bound refresh credential, and it imports access-only. A
814
+ * field that is PRESENT with the wrong type is malformed rather than dropped,
815
+ * so a broken reply is reported instead of silently degrading the pairing.
816
+ *
817
+ * The refresh CREDENTIAL is all-or-none. `refreshToken` and its expiry are the
818
+ * device-bound pair, and half of it persists a zero expiry while reporting the
819
+ * pairing as renewable, so the connection claims it can renew and then cannot.
820
+ * `refreshAfter` is not part of that pair: every approved reply carries it,
821
+ * including the browser and older-gateway ones that mint no refresh token.
822
+ */
823
+ function approvedCredentials(value: unknown): ApprovedCredentials | null {
824
+ if (typeof value !== "object" || value === null) {
825
+ return null;
826
+ }
827
+ const {
828
+ status,
829
+ accessToken,
830
+ refreshToken,
831
+ refreshTokenExpiresAt,
832
+ refreshAfter,
833
+ } = value as Record<string, unknown>;
834
+ if (status !== "approved") {
835
+ return null;
836
+ }
837
+ if (typeof accessToken !== "string" || !accessToken) {
838
+ return null;
839
+ }
840
+ if (refreshAfter !== undefined && typeof refreshAfter !== "string") {
841
+ return null;
842
+ }
843
+ if (refreshToken === undefined || refreshToken === "") {
844
+ // No refresh credential: the older-gateway path, imported access-only. A
845
+ // stray expiry without a token would persist as a renewable-looking
846
+ // credential, so it is malformed rather than dropped.
847
+ if (refreshTokenExpiresAt !== undefined) {
848
+ return null;
849
+ }
850
+ return { accessToken, refreshAfter };
851
+ }
852
+ if (typeof refreshToken !== "string") {
853
+ return null;
854
+ }
855
+ if (!usableRefreshExpiry(refreshTokenExpiresAt)) {
856
+ return null;
857
+ }
858
+ return { accessToken, refreshToken, refreshTokenExpiresAt, refreshAfter };
859
+ }
860
+
861
+ /**
862
+ * A refresh expiry this device can act on: an ISO instant on the wire, or an
863
+ * epoch-ms number, which PairedAssistantCredentials persists either of rather
864
+ * than dropping one. Zero and negative values are already-expired sentinels.
865
+ */
866
+ function usableRefreshExpiry(value: unknown): value is string | number {
867
+ if (typeof value === "number") {
868
+ return Number.isFinite(value) && value > 0;
869
+ }
870
+ if (typeof value !== "string") {
871
+ return false;
872
+ }
873
+ const parsed = Date.parse(value);
874
+ return Number.isFinite(parsed) && parsed > 0;
875
+ }
876
+
877
+ /**
878
+ * An ISO instant as epoch ms, or `fallback` when it isn't one. `Date.parse`
879
+ * answers NaN for an unparseable or out-of-range date, so the result is always
880
+ * a real instant; how far out it may sit is the caller's to bound.
881
+ */
882
+ function instantMs(value: unknown, fallback: number): number {
883
+ if (typeof value !== "string") {
884
+ return fallback;
885
+ }
886
+ const parsed = Date.parse(value);
887
+ return Number.isFinite(parsed) ? parsed : fallback;
888
+ }
889
+
890
+ /**
891
+ * A session deadline the remote named, which may only move EARLIER than
892
+ * `ceilingMs`. A remote that keeps reporting a fresh expiry would otherwise
893
+ * hold a session open indefinitely, on its own TTL rather than the one the
894
+ * pairing code was minted with.
895
+ */
896
+ function clampedDeadlineMs(value: unknown, ceilingMs: number): number {
897
+ return Math.min(instantMs(value, ceilingMs), ceilingMs);
898
+ }
899
+
900
+ /**
901
+ * A remote-named cadence in seconds, held between
902
+ * {@link MIN_PAIRING_POLL_INTERVAL_SECONDS} and
903
+ * {@link MAX_PAIRING_POLL_INTERVAL_SECONDS}. Non-finite values fall back:
904
+ * JSON.parse reads `1e400` as Infinity, which a caller turns into a wait that
905
+ * never ends or a timeout that overflows and fires immediately. Both ends
906
+ * matter because callers turn this straight into a wait: the cap stops an
907
+ * assistant from parking the attempt, and the floor stops it from driving a
908
+ * tight poll loop.
909
+ */
910
+ function clampedIntervalSeconds(value: unknown, fallback: number): number {
911
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
912
+ return fallback;
913
+ }
914
+ return Math.min(
915
+ Math.max(value, MIN_PAIRING_POLL_INTERVAL_SECONDS),
916
+ MAX_PAIRING_POLL_INTERVAL_SECONDS,
917
+ );
918
+ }
919
+
920
+ function openPairingSession(
921
+ session: Omit<PendingPairing, "abort">,
922
+ userCode: string | null,
923
+ ): PairingStarted {
924
+ const handle = nanoid();
925
+ pendingPairings.set(handle, { ...session, abort: new AbortController() });
926
+ return {
927
+ ok: true,
928
+ handle,
929
+ userCode,
930
+ expiresAt: new Date(session.expiresAtMs).toISOString(),
931
+ intervalSeconds: session.intervalSeconds,
932
+ };
933
+ }
934
+
935
+ /**
936
+ * Begin pairing with an assistant at `address`, either a pairing link or a
937
+ * bare `https://host` URL. A link carries an approved device code, so the
938
+ * first {@link pairingPoll} imports outright; a bare URL mints a challenge
939
+ * whose `userCode` the caller displays for approval on the host.
940
+ *
941
+ * SSRF containment rides on `parsePairingAddress`, which refuses loopback,
942
+ * private-network IP literals, non-https, and tunnel-vendor websites before
943
+ * any request is made, and on {@link postPairingRequest} refusing to follow
944
+ * redirects away from the address that was checked.
945
+ */
946
+ export async function pairingStart(
947
+ address: unknown,
948
+ ): Promise<PairingStartResult> {
949
+ if (typeof address !== "string" || !address.trim()) {
950
+ return invalidAddress("Enter the assistant's address or a pairing link.");
951
+ }
952
+ if (address.length > MAX_PAIRING_ADDRESS_LENGTH) {
953
+ return invalidAddress("That pairing address is too long.");
954
+ }
955
+ const trimmed = address.trim();
956
+ const parsed = parsePairingAddress(trimmed);
957
+ if (!parsed.ok) {
958
+ return invalidAddress(
959
+ addressRejectionMessage(parsed.reason, trimmed),
960
+ parsed.reason,
961
+ );
962
+ }
963
+
964
+ sweepExpiredPairings();
965
+ const deviceId = nanoid();
966
+
967
+ if (parsed.deviceCode) {
968
+ return openPairingSession(
969
+ {
970
+ publicBaseUrl: parsed.publicBaseUrl,
971
+ deviceCode: parsed.deviceCode,
972
+ deviceId,
973
+ // A link carries no expiry, so bound the session by the TTL the
974
+ // gateway would have minted the challenge with.
975
+ expiresAtMs: Date.now() + REMOTE_WEB_PAIRING_CODE_TTL_MS,
976
+ intervalSeconds: DEFAULT_PAIRING_POLL_INTERVAL_SECONDS,
977
+ },
978
+ null,
979
+ );
980
+ }
981
+
982
+ const posted = await postPairingRequest(
983
+ parsed.publicBaseUrl,
984
+ PAIRING_CHALLENGE_PATH,
985
+ {
986
+ publicBaseUrl: parsed.publicBaseUrl,
987
+ } satisfies RemoteWebPairingChallengeRequest,
988
+ );
989
+ if (!posted.ok) {
990
+ return posted.failure;
991
+ }
992
+ // A refused mint leaves nothing spent, so the same address is worth another
993
+ // attempt; a 200 that is not a challenge is a reply this device cannot use.
994
+ if (posted.status !== 200) {
995
+ return retryableGatewayReply(posted.status);
996
+ }
997
+ if (!isChallengeResponse(posted.body)) {
998
+ return unusableChallengeReply();
999
+ }
1000
+
1001
+ const challenge = posted.body;
1002
+ return openPairingSession(
1003
+ {
1004
+ publicBaseUrl: parsed.publicBaseUrl,
1005
+ deviceCode: challenge.deviceCode,
1006
+ deviceId,
1007
+ // A challenge expires somewhere inside the code's own TTL, so that TTL
1008
+ // is the ceiling: a remote naming a further instant cannot buy itself a
1009
+ // longer-lived session.
1010
+ expiresAtMs: clampedDeadlineMs(
1011
+ challenge.expiresAt,
1012
+ Date.now() + REMOTE_WEB_PAIRING_CODE_TTL_MS,
1013
+ ),
1014
+ intervalSeconds: clampedIntervalSeconds(
1015
+ challenge.intervalSeconds,
1016
+ DEFAULT_PAIRING_POLL_INTERVAL_SECONDS,
1017
+ ),
1018
+ },
1019
+ challenge.userCode,
1020
+ );
1021
+ }
1022
+
1023
+ export interface PairingPollOptions {
1024
+ /** The handle {@link pairingStart} returned. */
1025
+ handle: unknown;
1026
+ /** Optional local name; non-string or empty values are ignored. */
1027
+ name?: unknown;
1028
+ /** Platform to record for this device; defaults to `desktop`. */
1029
+ platform?: unknown;
1030
+ }
1031
+
1032
+ /**
1033
+ * One device-code exchange attempt for a live session. Still-pending
1034
+ * challenges resolve with the cadence to wait before trying again; an approved
1035
+ * one is registered through {@link pairAssistant} in the same call.
1036
+ *
1037
+ * A {@link pairingCancel} that lands while the exchange is in flight ends the
1038
+ * attempt with nothing persisted, so a dismissed dialog or an interrupted CLI
1039
+ * never leaves credentials for an assistant the user declined to pair.
1040
+ */
1041
+ export async function pairingPoll(
1042
+ lockfilePaths: string[],
1043
+ configDir: string,
1044
+ { handle, name, platform }: PairingPollOptions,
1045
+ ): Promise<PairingPollResult> {
1046
+ const key = typeof handle === "string" ? handle : "";
1047
+ const session = pendingPairings.get(key);
1048
+ if (!session) {
1049
+ return unknownSession();
1050
+ }
1051
+ if (Date.now() >= session.expiresAtMs) {
1052
+ pendingPairings.delete(key);
1053
+ session.abort.abort();
1054
+ return expiredCode();
1055
+ }
1056
+
1057
+ const localName = typeof name === "string" && name ? name : undefined;
1058
+ // Refuse a destination this machine cannot register BEFORE the exchange.
1059
+ // The device code is one-time and the gateway records a device the moment it
1060
+ // is spent, so a collision found after the exchange burns the code and costs
1061
+ // the user a fresh pairing link. Nothing is spent here: the code is
1062
+ // untouched and the session stays pollable, so correcting the name and
1063
+ // polling again completes the same attempt. `import-precheck` is what tells
1064
+ // the caller that, distinguishing it from the post-exchange `import`
1065
+ // refusal, which does spend the code.
1066
+ const { refusal } = resolvePairedDestination(
1067
+ lockfilePaths,
1068
+ localName,
1069
+ session.publicBaseUrl,
1070
+ );
1071
+ if (refusal) {
1072
+ return {
1073
+ ok: false,
1074
+ reason: "import-precheck",
1075
+ status: refusal.status,
1076
+ error: refusal.error,
1077
+ };
1078
+ }
1079
+
1080
+ const posted = await postPairingRequest(
1081
+ session.publicBaseUrl,
1082
+ PAIRING_TOKEN_PATH,
1083
+ {
1084
+ deviceCode: session.deviceCode,
1085
+ deviceId: session.deviceId,
1086
+ platform: resolveRemoteWebPairingPlatform(platform),
1087
+ } satisfies RemoteWebPairingTokenRequest,
1088
+ session.abort.signal,
1089
+ );
1090
+ // A cancel that lands while the gateway is answering: the caller closed the
1091
+ // dialog or interrupted the CLI, so the attempt is over and NOTHING is
1092
+ // persisted. This is the only guard the import needs, because no await sits
1093
+ // between here and `pairAssistant` below. It also outranks the transport
1094
+ // failure an aborted request produces, which would otherwise read as the
1095
+ // retryable `unreachable`.
1096
+ //
1097
+ // Residual: a cancel landing after the gateway recorded the device leaves
1098
+ // the code spent and a device credential registered gateway-side with
1099
+ // nothing local behind it. That row is visible and revocable in the host's
1100
+ // paired-devices list, which is where it belongs; keeping nothing locally is
1101
+ // what the user asked for.
1102
+ if (session.abort.signal.aborted) {
1103
+ return unknownSession();
1104
+ }
1105
+ // The session survives a transport failure so the caller can simply poll
1106
+ // again; the device code is untouched until the gateway answers.
1107
+ if (!posted.ok) {
1108
+ return posted.failure;
1109
+ }
1110
+
1111
+ if (posted.status === 202) {
1112
+ const pending =
1113
+ posted.body as Partial<RemoteWebPairingTokenPendingResponse> | null;
1114
+ session.expiresAtMs = clampedDeadlineMs(
1115
+ pending?.expiresAt,
1116
+ session.expiresAtMs,
1117
+ );
1118
+ session.intervalSeconds = clampedIntervalSeconds(
1119
+ pending?.intervalSeconds,
1120
+ session.intervalSeconds,
1121
+ );
1122
+ return {
1123
+ ok: true,
1124
+ status: "pending",
1125
+ expiresAt: new Date(session.expiresAtMs).toISOString(),
1126
+ intervalSeconds: session.intervalSeconds,
1127
+ };
1128
+ }
1129
+
1130
+ // The gateway answers an unknown, expired, denied, or already-spent device
1131
+ // code alike: the attempt is over and needs a fresh code.
1132
+ if (posted.status === 401 || posted.status === 404 || posted.status === 410) {
1133
+ pendingPairings.delete(key);
1134
+ session.abort.abort();
1135
+ return expiredCode();
1136
+ }
1137
+ // Anything else left the code exchangeable (the gateway releases it on a
1138
+ // repairable failure), so the session stays pollable and the failure is
1139
+ // reported as one the caller should retry.
1140
+ if (posted.status !== 200) {
1141
+ return retryableGatewayReply(posted.status);
1142
+ }
1143
+
1144
+ // Past here the gateway has spent the code, so the session goes whether or
1145
+ // not the reply is usable and whether or not the local write succeeds; a
1146
+ // retry starts from a fresh code. This is the one removal that does NOT
1147
+ // abort: the exchange it drops the session for has already succeeded and is
1148
+ // persisted right below.
1149
+ pendingPairings.delete(key);
1150
+ const approved = approvedCredentials(posted.body);
1151
+ if (!approved) {
1152
+ return unusableGatewayCredentials();
1153
+ }
1154
+
1155
+ const result = pairAssistant(lockfilePaths, configDir, {
1156
+ credentials: {
1157
+ gatewayUrl: session.publicBaseUrl,
1158
+ token: approved.accessToken,
1159
+ deviceId: session.deviceId,
1160
+ refreshToken: approved.refreshToken,
1161
+ refreshTokenExpiresAt: approved.refreshTokenExpiresAt,
1162
+ refreshAfter: approved.refreshAfter,
1163
+ },
1164
+ name: localName,
1165
+ });
1166
+ if (!result.ok) {
1167
+ return {
1168
+ ok: false,
1169
+ reason: "import",
1170
+ status: result.status,
1171
+ error: result.error,
1172
+ };
1173
+ }
1174
+ return {
1175
+ ok: true,
1176
+ status: "imported",
1177
+ assistantId: result.assistantId,
1178
+ updated: result.updated,
1179
+ accessOnly: result.accessOnly,
1180
+ };
1181
+ }
1182
+
1183
+ /**
1184
+ * Forget a pending pairing. True when a live session was dropped.
1185
+ *
1186
+ * Aborting the session also cuts short an exchange already in flight, so a
1187
+ * cancel that beats the gateway's reply can leave the device code unspent, and
1188
+ * one that does not still stops {@link pairingPoll} short of persisting
1189
+ * anything.
1190
+ */
1191
+ export function pairingCancel(handle: unknown): boolean {
1192
+ let dropped = false;
1193
+ if (typeof handle === "string") {
1194
+ const session = pendingPairings.get(handle);
1195
+ if (session) {
1196
+ pendingPairings.delete(handle);
1197
+ session.abort.abort();
1198
+ dropped = true;
1199
+ }
1200
+ }
1201
+ // Swept after the named session goes, so a cancel still aborts an exchange
1202
+ // whose session crossed its expiry while the gateway was answering.
1203
+ sweepExpiredPairings();
1204
+ return dropped;
1205
+ }
1206
+
1207
+ // ── Legacy base64 bundle import ─────────────────────────────────────────────
1208
+ //
1209
+ // The pre-pairing-link import path. Its one caller is `vellum connect import`
1210
+ // (cli/src/commands/connect/import.ts), which falls back to it for a bundle
1211
+ // minted by a host on the previous release; nothing mints bundles any more, so
1212
+ // this section goes once that release is out of support. It shares
1213
+ // `pairAssistant` with the pairing-session flow above and adds only base64
1214
+ // decoding.
1215
+
1216
+ /** Bounds what an untrusted bundle import can make a host buffer and decode. */
1217
+ const MAX_BUNDLE_LENGTH = 64 * 1024;
1218
+
1219
+ type DecodedBundle =
1220
+ | { ok: true; credentials: PairedAssistantCredentials }
1221
+ | { ok: false; error: string };
1222
+
1223
+ /**
1224
+ * Decode and validate a base64 pairing bundle. Total and non-throwing:
1225
+ * malformed input yields a typed failure. `gatewayUrl` is persisted as
1226
+ * `runtimeUrl` and used to build fetch URLs, so it must be an absolute http(s)
1227
+ * URL rather than letting an invalid string through (which would crash
1228
+ * `new URL(...)` or break later client calls).
1229
+ */
1230
+ function decodePairBundle(encoded: string): DecodedBundle {
1231
+ let json: unknown;
1232
+ try {
1233
+ json = JSON.parse(Buffer.from(encoded, "base64").toString("utf8"));
1234
+ } catch {
1235
+ return { ok: false, error: "Bundle is not base64-encoded JSON" };
1236
+ }
1237
+ if (typeof json !== "object" || json === null) {
1238
+ return { ok: false, error: "Bundle is not a JSON object" };
1239
+ }
1240
+ const b = json as Record<string, unknown>;
1241
+ if (typeof b.gatewayUrl !== "string" || typeof b.token !== "string") {
1242
+ return { ok: false, error: "Bundle is missing gatewayUrl or token" };
1243
+ }
1244
+ let parsed: URL;
1245
+ try {
1246
+ parsed = new URL(b.gatewayUrl);
1247
+ } catch {
1248
+ return { ok: false, error: "Bundle gatewayUrl is not an absolute URL" };
1249
+ }
1250
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
1251
+ return { ok: false, error: "Bundle gatewayUrl is not an http(s) URL" };
1252
+ }
1253
+ return {
1254
+ ok: true,
1255
+ credentials: {
1256
+ gatewayUrl: b.gatewayUrl,
1257
+ token: b.token,
1258
+ deviceId: typeof b.deviceId === "string" ? b.deviceId : undefined,
1259
+ refreshToken:
1260
+ typeof b.refreshToken === "string" ? b.refreshToken : undefined,
1261
+ refreshTokenExpiresAt:
1262
+ typeof b.refreshTokenExpiresAt === "string" ||
1263
+ typeof b.refreshTokenExpiresAt === "number"
1264
+ ? b.refreshTokenExpiresAt
1265
+ : undefined,
1266
+ refreshAfter:
1267
+ typeof b.refreshAfter === "string" ? b.refreshAfter : undefined,
1268
+ },
1269
+ };
1270
+ }
303
1271
 
304
1272
  export interface ConnectImportOptions {
305
1273
  /** The encoded bundle exactly as received from the transport. */
@@ -314,12 +1282,12 @@ export interface ConnectImportOptions {
314
1282
  * respond with (the IPC host ignores it).
315
1283
  */
316
1284
  export type ConnectImportResult =
317
- | { ok: true; assistantId: string; accessOnly: boolean }
1285
+ | { ok: true; assistantId: string; updated: boolean; accessOnly: boolean }
318
1286
  | { ok: false; status: number; error: string };
319
1287
 
320
1288
  /**
321
- * The complete connect-import host operation: validate the raw bundle value
322
- * (present, non-empty, within {@link MAX_PAIR_BUNDLE_LENGTH}), decode it, and
1289
+ * The complete bundle-import host operation: validate the raw bundle value
1290
+ * (present, non-empty, within {@link MAX_BUNDLE_LENGTH}), decode it, and
323
1291
  * register the pairing via {@link pairAssistant}. Hosts keep only
324
1292
  * transport-specific parsing and pass the untrusted values straight through,
325
1293
  * so bundle limits, error strings, and the result shape are defined once.
@@ -332,7 +1300,7 @@ export function connectImport(
332
1300
  if (typeof bundle !== "string" || !bundle) {
333
1301
  return { ok: false, status: 400, error: "Missing pairing bundle" };
334
1302
  }
335
- if (bundle.length > MAX_PAIR_BUNDLE_LENGTH) {
1303
+ if (bundle.length > MAX_BUNDLE_LENGTH) {
336
1304
  return { ok: false, status: 400, error: "Pairing bundle is too large" };
337
1305
  }
338
1306
  const decoded = decodePairBundle(bundle.trim());
@@ -340,8 +1308,9 @@ export function connectImport(
340
1308
  return { ok: false, status: 400, error: decoded.error };
341
1309
  }
342
1310
  const result = pairAssistant(lockfilePaths, configDir, {
343
- bundle: decoded.bundle,
1311
+ credentials: decoded.credentials,
344
1312
  name: typeof name === "string" && name ? name : undefined,
1313
+ legacyDeviceId: decoded.credentials.deviceId,
345
1314
  });
346
1315
  if (!result.ok) {
347
1316
  return { ok: false, status: result.status, error: result.error };
@@ -349,6 +1318,7 @@ export function connectImport(
349
1318
  return {
350
1319
  ok: true,
351
1320
  assistantId: result.assistantId,
1321
+ updated: result.updated,
352
1322
  accessOnly: result.accessOnly,
353
1323
  };
354
1324
  }