@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.
- package/AGENTS.md +3 -1
- package/knip.json +1 -0
- package/node_modules/@vellumai/avatar-manifest/package.json +18 -0
- package/node_modules/@vellumai/avatar-manifest/src/__tests__/manifest.test.ts +173 -0
- package/node_modules/@vellumai/avatar-manifest/src/__tests__/read.test.ts +114 -0
- package/node_modules/@vellumai/avatar-manifest/src/index.ts +29 -0
- package/node_modules/@vellumai/avatar-manifest/src/layout.ts +18 -0
- package/node_modules/@vellumai/avatar-manifest/src/manifest.ts +156 -0
- package/node_modules/@vellumai/avatar-manifest/src/read.ts +109 -0
- package/node_modules/@vellumai/avatar-manifest/tsconfig.json +20 -0
- package/node_modules/@vellumai/environments/package.json +2 -1
- package/node_modules/@vellumai/environments/src/shell.test.ts +56 -0
- package/node_modules/@vellumai/environments/src/shell.ts +65 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/package.json +18 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/src/__tests__/manifest.test.ts +173 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/src/__tests__/read.test.ts +114 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/src/index.ts +29 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/src/layout.ts +18 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/src/manifest.ts +156 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/src/read.ts +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/avatar-manifest/tsconfig.json +20 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/environments/package.json +2 -1
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/environments/src/shell.test.ts +56 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/environments/src/shell.ts +65 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/LICENSE +21 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/README.md +208 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/index.cjs +33 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/index.d.cts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/index.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/index.js +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/locales/index.cjs +17 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/locales/index.d.cts +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/locales/index.d.ts +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/locales/index.js +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/locales/package.json +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/mini/index.cjs +32 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/mini/index.d.cts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/mini/index.d.ts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/mini/index.js +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/mini/package.json +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/package.json +135 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/index.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/locales/index.ts +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/mini/index.ts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/ZodError.ts +330 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/datetime.ts +58 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/discriminatedUnion.ts +80 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/index.ts +59 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/ipv4.ts +57 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/object.ts +69 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/primitives.ts +162 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/realworld.ts +63 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/string.ts +55 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/benchmarks/union.ts +80 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/errors.ts +13 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/external.ts +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/helpers/enumUtil.ts +17 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/helpers/errorUtil.ts +8 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/helpers/parseUtil.ts +176 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/helpers/partialUtil.ts +34 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/helpers/typeAliases.ts +2 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/helpers/util.ts +224 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/index.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/locales/en.ts +124 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/standard-schema.ts +113 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/Mocker.ts +54 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/all-errors.test.ts +157 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/anyunknown.test.ts +28 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/array.test.ts +71 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/async-parsing.test.ts +388 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/async-refinements.test.ts +46 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/base.test.ts +29 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/bigint.test.ts +55 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/branded.test.ts +53 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/catch.test.ts +220 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/coerce.test.ts +133 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/complex.test.ts +70 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/custom.test.ts +31 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/date.test.ts +32 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/deepmasking.test.ts +186 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/default.test.ts +112 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/description.test.ts +33 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/discriminated-unions.test.ts +315 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/enum.test.ts +80 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/error.test.ts +551 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/firstparty.test.ts +87 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/firstpartyschematypes.test.ts +21 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/function.test.ts +261 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/generics.test.ts +48 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/instanceof.test.ts +37 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/intersection.test.ts +110 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/language-server.source.ts +76 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/language-server.test.ts +207 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/literal.test.ts +36 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/map.test.ts +110 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/masking.test.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/mocker.test.ts +19 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/nan.test.ts +24 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/nativeEnum.test.ts +87 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/nullable.test.ts +42 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/number.test.ts +176 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/object-augmentation.test.ts +29 -0
- 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
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/object.test.ts +434 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/optional.test.ts +42 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/parseUtil.test.ts +23 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/parser.test.ts +41 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/partials.test.ts +243 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/pickomit.test.ts +111 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/pipeline.test.ts +29 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/preprocess.test.ts +186 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/primitive.test.ts +440 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/promise.test.ts +90 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/readonly.test.ts +194 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/record.test.ts +171 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/recursive.test.ts +197 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/refine.test.ts +313 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/safeparse.test.ts +27 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/set.test.ts +142 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/standard-schema.test.ts +83 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/string.test.ts +916 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/transformer.test.ts +233 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/tuple.test.ts +90 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/unions.test.ts +57 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/validations.test.ts +133 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/tests/void.test.ts +15 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v3/types.ts +5138 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/checks.ts +32 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/coerce.ts +27 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/compat.ts +70 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/errors.ts +82 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/external.ts +51 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/from-json-schema.ts +643 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/index.ts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/iso.ts +90 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/parse.ts +82 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/schemas.ts +2409 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/anyunknown.test.ts +26 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/apply.test.ts +59 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/array.test.ts +264 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/assignability.test.ts +210 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/async-parsing.test.ts +381 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/async-refinements.test.ts +68 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/base.test.ts +7 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/bigint.test.ts +54 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/brand.test.ts +106 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/catch.test.ts +276 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/coalesce.test.ts +20 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +573 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/codec.test.ts +562 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/coerce.test.ts +160 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/continuability.test.ts +374 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/custom.test.ts +40 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/date.test.ts +62 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/datetime.test.ts +302 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/default.test.ts +365 -0
- 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
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/description.test.ts +32 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +661 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/enum.test.ts +285 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +595 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/error.test.ts +711 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/file.test.ts +96 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/firstparty.test.ts +179 -0
- 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
- 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
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/function.test.ts +360 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/generics.test.ts +72 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/hash.test.ts +68 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/index.test.ts +939 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +60 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/intersection.test.ts +198 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/json.test.ts +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/lazy.test.ts +227 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/literal.test.ts +117 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/map.test.ts +330 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/nan.test.ts +21 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/nested-refine.test.ts +168 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/nonoptional.test.ts +101 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/nullable.test.ts +22 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/number.test.ts +270 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/object.test.ts +640 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/optional.test.ts +223 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/partial.test.ts +427 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/pickomit.test.ts +211 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/pipe.test.ts +101 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/prefault.test.ts +74 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +282 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/primitive.test.ts +175 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/promise.test.ts +81 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/prototypes.test.ts +23 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/readonly.test.ts +252 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/record.test.ts +632 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +582 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/refine.test.ts +570 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/registries.test.ts +243 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/set.test.ts +181 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +134 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/string-formats.test.ts +125 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/string.test.ts +1175 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +106 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +771 -0
- 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
- 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
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/transform.test.ts +361 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/tuple.test.ts +183 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/union.test.ts +219 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/url.test.ts +13 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/validations.test.ts +283 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/classic/tests/void.test.ts +12 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/api.ts +1798 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/checks.ts +1293 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/config.ts +15 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/core.ts +138 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/doc.ts +44 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/errors.ts +448 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/index.ts +16 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/json-schema-generator.ts +126 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/json-schema-processors.ts +667 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/json-schema.ts +147 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/parse.ts +195 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/regexes.ts +183 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/registries.ts +105 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/schemas.ts +4538 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/standard-schema.ts +159 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/extend.test.ts +59 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/index.test.ts +46 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/be.test.ts +124 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/en.test.ts +22 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/es.test.ts +181 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/he.test.ts +379 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/nl.test.ts +46 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/ru.test.ts +128 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/tr.test.ts +69 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/locales/uz.test.ts +83 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/record-constructor.test.ts +67 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/tests/recursive-tuples.test.ts +45 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/to-json-schema.ts +613 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/util.ts +966 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/versions.ts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/core/zsf.ts +323 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/index.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ar.ts +115 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/az.ts +111 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/be.ts +176 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/bg.ts +128 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ca.ts +116 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/cs.ts +118 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/da.ts +123 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/de.ts +116 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/en.ts +119 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/eo.ts +118 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/es.ts +141 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/fa.ts +126 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/fi.ts +121 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/fr-CA.ts +116 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/fr.ts +116 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/he.ts +246 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/hu.ts +117 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/hy.ts +164 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/id.ts +115 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/index.ts +49 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/is.ts +119 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/it.ts +116 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ja.ts +114 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ka.ts +123 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/kh.ts +7 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/km.ts +119 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ko.ts +121 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/lt.ts +239 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/mk.ts +118 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ms.ts +115 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/nl.ts +121 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/no.ts +116 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ota.ts +117 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/pl.ts +118 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ps.ts +126 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/pt.ts +116 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ru.ts +176 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/sl.ts +118 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/sv.ts +119 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ta.ts +118 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/th.ts +119 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/tr.ts +111 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ua.ts +7 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/uk.ts +117 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/ur.ts +119 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/uz.ts +116 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/vi.ts +117 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/yo.ts +124 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/zh-CN.ts +116 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/locales/zh-TW.ts +115 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/checks.ts +32 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/coerce.ts +27 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/external.ts +40 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/index.ts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/iso.ts +66 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/parse.ts +14 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/schemas.ts +1916 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/apply.test.ts +24 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/assignability.test.ts +129 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/brand.test.ts +94 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/checks.test.ts +144 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/codec.test.ts +529 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/computed.test.ts +36 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/error.test.ts +22 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/functions.test.ts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/index.test.ts +963 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/number.test.ts +95 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/object.test.ts +227 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/prototypes.test.ts +43 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +275 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/standard-schema.test.ts +50 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4/mini/tests/string.test.ts +347 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/src/v4-mini/index.ts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/ZodError.cjs +138 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/ZodError.d.cts +164 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/ZodError.d.ts +164 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/ZodError.js +133 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/errors.cjs +17 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/errors.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/errors.d.ts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/errors.js +9 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/external.cjs +22 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/external.d.cts +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/external.d.ts +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/external.js +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/enumUtil.cjs +2 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/enumUtil.d.cts +8 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/enumUtil.d.ts +8 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/enumUtil.js +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/errorUtil.cjs +9 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/errorUtil.d.cts +9 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/errorUtil.d.ts +9 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/errorUtil.js +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/parseUtil.cjs +124 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/parseUtil.d.cts +78 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/parseUtil.d.ts +78 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/parseUtil.js +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/partialUtil.cjs +2 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/partialUtil.d.cts +8 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/partialUtil.d.ts +8 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/partialUtil.js +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/typeAliases.cjs +2 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/typeAliases.d.cts +2 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/typeAliases.d.ts +2 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/typeAliases.js +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/util.cjs +137 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/util.d.cts +85 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/util.d.ts +85 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/helpers/util.js +133 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/index.cjs +33 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/index.d.cts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/index.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/index.js +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/locales/en.cjs +112 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/locales/en.d.cts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/locales/en.d.ts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/locales/en.js +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/package.json +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/standard-schema.cjs +2 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/standard-schema.d.cts +102 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/standard-schema.d.ts +102 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/standard-schema.js +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/types.cjs +3777 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/types.d.cts +1034 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/types.d.ts +1034 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v3/types.js +3695 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/checks.cjs +33 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/checks.d.cts +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/checks.d.ts +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/checks.js +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/coerce.cjs +47 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/coerce.d.cts +17 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/coerce.d.ts +17 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/coerce.js +17 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/compat.cjs +61 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/compat.d.cts +50 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/compat.d.ts +50 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/compat.js +31 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/errors.cjs +74 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/errors.d.cts +30 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/errors.d.ts +30 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/errors.js +48 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/external.cjs +73 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/external.d.cts +15 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/external.d.ts +15 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/external.js +20 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/from-json-schema.cjs +610 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/from-json-schema.d.cts +12 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/from-json-schema.d.ts +12 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/from-json-schema.js +584 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/index.cjs +33 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/index.d.cts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/index.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/index.js +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/iso.cjs +60 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/iso.d.cts +22 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/iso.d.ts +22 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/iso.js +30 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/package.json +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/parse.cjs +41 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/parse.d.cts +31 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/parse.d.ts +31 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/parse.js +15 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/schemas.cjs +1272 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/schemas.d.cts +739 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/schemas.d.ts +739 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/classic/schemas.js +1157 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/api.cjs +1222 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/api.d.cts +304 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/api.d.ts +304 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/api.js +1082 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/checks.cjs +601 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/checks.d.cts +278 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/checks.d.ts +278 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/checks.js +575 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/core.cjs +83 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/core.d.cts +70 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/core.d.ts +70 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/core.js +76 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/doc.cjs +39 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/doc.d.cts +14 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/doc.d.ts +14 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/doc.js +35 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/errors.cjs +213 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/errors.d.cts +220 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/errors.d.ts +220 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/errors.js +182 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/index.cjs +47 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/index.d.cts +16 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/index.d.ts +16 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/index.js +16 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-generator.cjs +99 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-generator.d.cts +65 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-generator.d.ts +65 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-generator.js +95 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-processors.cjs +648 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-processors.d.cts +49 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-processors.d.ts +49 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema-processors.js +605 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema.cjs +2 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema.d.cts +88 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema.d.ts +88 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/json-schema.js +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/package.json +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/parse.cjs +131 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/parse.d.cts +49 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/parse.d.ts +49 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/parse.js +93 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/regexes.cjs +166 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/regexes.d.cts +79 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/regexes.d.ts +79 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/regexes.js +133 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/registries.cjs +56 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/registries.d.cts +35 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/registries.d.ts +35 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/registries.js +51 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/schemas.cjs +2124 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/schemas.d.cts +1146 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/schemas.d.ts +1146 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/schemas.js +2093 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/standard-schema.cjs +2 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/standard-schema.d.cts +126 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/standard-schema.d.ts +126 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/standard-schema.js +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/to-json-schema.cjs +446 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/to-json-schema.d.cts +114 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/to-json-schema.d.ts +114 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/to-json-schema.js +437 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/util.cjs +710 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/util.d.cts +199 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/util.d.ts +199 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/util.js +651 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/versions.cjs +8 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/versions.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/versions.d.ts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/core/versions.js +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/index.cjs +22 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/index.d.cts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/index.d.ts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/index.js +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ar.cjs +133 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ar.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ar.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ar.js +106 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/az.cjs +132 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/az.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/az.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/az.js +105 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/be.cjs +183 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/be.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/be.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/be.js +156 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/bg.cjs +147 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/bg.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/bg.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/bg.js +120 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ca.cjs +134 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ca.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ca.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ca.js +107 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/cs.cjs +138 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/cs.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/cs.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/cs.js +111 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/da.cjs +142 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/da.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/da.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/da.js +115 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/de.cjs +135 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/de.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/de.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/de.js +108 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/en.cjs +136 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/en.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/en.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/en.js +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/eo.cjs +136 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/eo.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/eo.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/eo.js +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/es.cjs +159 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/es.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/es.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/es.js +132 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fa.cjs +141 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fa.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fa.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fa.js +114 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fi.cjs +139 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fi.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fi.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fi.js +112 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr-CA.cjs +134 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr-CA.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr-CA.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr-CA.js +107 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr.cjs +135 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/fr.js +108 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/he.cjs +241 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/he.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/he.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/he.js +214 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hu.cjs +135 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hu.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hu.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hu.js +108 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hy.cjs +174 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hy.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hy.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/hy.js +147 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/id.cjs +133 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/id.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/id.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/id.js +106 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/index.cjs +104 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/index.d.cts +49 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/index.d.ts +49 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/index.js +49 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/is.cjs +136 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/is.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/is.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/is.js +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/it.cjs +135 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/it.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/it.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/it.js +108 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ja.cjs +134 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ja.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ja.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ja.js +107 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ka.cjs +139 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ka.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ka.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ka.js +112 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/kh.cjs +12 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/kh.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/kh.d.ts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/kh.js +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/km.cjs +137 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/km.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/km.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/km.js +110 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ko.cjs +138 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ko.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ko.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ko.js +111 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/lt.cjs +230 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/lt.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/lt.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/lt.js +203 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/mk.cjs +136 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/mk.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/mk.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/mk.js +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ms.cjs +134 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ms.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ms.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ms.js +107 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/nl.cjs +137 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/nl.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/nl.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/nl.js +110 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/no.cjs +135 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/no.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/no.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/no.js +108 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ota.cjs +136 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ota.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ota.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ota.js +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/package.json +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pl.cjs +136 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pl.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pl.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pl.js +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ps.cjs +141 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ps.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ps.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ps.js +114 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pt.cjs +135 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pt.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pt.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/pt.js +108 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ru.cjs +183 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ru.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ru.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ru.js +156 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sl.cjs +136 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sl.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sl.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sl.js +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sv.cjs +137 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sv.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sv.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/sv.js +110 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ta.cjs +137 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ta.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ta.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ta.js +110 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/th.cjs +137 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/th.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/th.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/th.js +110 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/tr.cjs +132 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/tr.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/tr.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/tr.js +105 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ua.cjs +12 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ua.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ua.d.ts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ua.js +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uk.cjs +135 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uk.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uk.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uk.js +108 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ur.cjs +137 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ur.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ur.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/ur.js +110 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uz.cjs +136 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uz.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uz.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/uz.js +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/vi.cjs +135 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/vi.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/vi.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/vi.js +108 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/yo.cjs +134 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/yo.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/yo.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/yo.js +107 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-CN.cjs +136 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-CN.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-CN.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-CN.js +109 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-TW.cjs +134 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-TW.d.cts +5 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-TW.d.ts +4 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/locales/zh-TW.js +107 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/checks.cjs +34 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/checks.d.cts +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/checks.d.ts +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/checks.js +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/coerce.cjs +52 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/coerce.d.cts +7 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/coerce.d.ts +7 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/coerce.js +22 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/external.cjs +63 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/external.d.cts +12 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/external.d.ts +12 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/external.js +14 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/index.cjs +32 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/index.d.cts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/index.d.ts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/index.js +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/iso.cjs +64 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/iso.d.cts +22 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/iso.d.ts +22 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/iso.js +34 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/package.json +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/parse.cjs +16 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/parse.d.cts +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/parse.d.ts +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/parse.js +1 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/schemas.cjs +1046 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/schemas.d.cts +427 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/schemas.d.ts +427 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/mini/schemas.js +925 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4/package.json +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4-mini/index.cjs +32 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4-mini/index.d.cts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4-mini/index.d.ts +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4-mini/index.js +3 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/node_modules/zod/v4-mini/package.json +6 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/package.json +37 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/attachment-naming.test.ts +104 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +36 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +299 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/conversation-handle.test.ts +316 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +280 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/package-boundary.test.ts +151 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/remote-web-pairing.test.ts +389 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/stripe-currency.test.ts +37 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/attachment-naming.ts +118 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/channels.ts +92 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/client-metadata.ts +46 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/conversation-handle.ts +246 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/credential-rpc.ts +21 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/error.ts +26 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/handles.ts +212 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/index.ts +32 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/ingress.ts +175 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +816 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/rpc.ts +408 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/stripe-currency.ts +55 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/transport.ts +133 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/trust-rules.ts +116 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +73 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- package/node_modules/@vellumai/local-mode/node_modules/@vellumai/service-contracts/tsconfig.json +20 -0
- package/node_modules/@vellumai/local-mode/package.json +3 -1
- package/node_modules/@vellumai/local-mode/src/__tests__/guardian-token.test.ts +45 -0
- package/node_modules/@vellumai/local-mode/src/__tests__/package-boundary.test.ts +32 -14
- package/node_modules/@vellumai/local-mode/src/__tests__/pair.test.ts +1535 -155
- package/node_modules/@vellumai/local-mode/src/__tests__/status.test.ts +71 -1
- package/node_modules/@vellumai/local-mode/src/avatar.test.ts +404 -0
- package/node_modules/@vellumai/local-mode/src/avatar.ts +151 -0
- package/node_modules/@vellumai/local-mode/src/devices.test.ts +62 -0
- package/node_modules/@vellumai/local-mode/src/devices.ts +12 -0
- package/node_modules/@vellumai/local-mode/src/guardian-token.ts +27 -34
- package/node_modules/@vellumai/local-mode/src/index.ts +26 -3
- package/node_modules/@vellumai/local-mode/src/lockfile-contract.ts +1 -1
- package/node_modules/@vellumai/local-mode/src/lockfile.test.ts +1 -0
- package/node_modules/@vellumai/local-mode/src/lockfile.ts +6 -3
- package/node_modules/@vellumai/local-mode/src/pair.ts +1099 -129
- package/node_modules/@vellumai/local-mode/src/status.ts +67 -22
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +37 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/remote-web-pairing.test.ts +389 -0
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +22 -0
- package/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +508 -18
- package/node_modules/@vellumai/service-contracts/src/rpc.ts +174 -0
- package/package.json +3 -1
- package/src/__tests__/connect-import.test.ts +512 -172
- package/src/__tests__/detached-process.test.ts +152 -0
- package/src/__tests__/devices.test.ts +12 -0
- package/src/__tests__/hatch-provider-secrets.test.ts +95 -0
- package/src/__tests__/pair.test.ts +319 -305
- package/src/__tests__/provider-secrets.test.ts +158 -0
- package/src/__tests__/tunnel.test.ts +200 -23
- package/src/__tests__/wake.test.ts +51 -1
- package/src/adapters/install.sh +2 -1
- package/src/adapters/openclaw.ts +2 -1
- package/src/commands/client.ts +81 -58
- package/src/commands/connect/import.ts +248 -52
- package/src/commands/connect.ts +1 -1
- package/src/commands/devices.ts +4 -0
- package/src/commands/pair.ts +173 -298
- package/src/commands/tunnel.ts +162 -54
- package/src/commands/voice.ts +370 -0
- package/src/components/DefaultMainScreen.tsx +0 -144
- package/src/index.ts +5 -2
- package/src/lib/detached-process.ts +81 -0
- package/src/lib/docker.ts +21 -4
- package/src/lib/guardian-token.ts +19 -2
- package/src/lib/hatch-local.ts +23 -5
- package/src/lib/live-voice/client.test.ts +316 -0
- package/src/lib/live-voice/client.ts +363 -0
- package/src/lib/live-voice/connection.ts +133 -0
- package/src/lib/live-voice/pcm-player.test.ts +101 -0
- package/src/lib/live-voice/pcm-player.ts +356 -0
- package/src/lib/live-voice/protocol.test.ts +53 -0
- package/src/lib/live-voice/protocol.ts +193 -0
- package/src/lib/local.ts +2 -1
- package/src/lib/provider-secrets.ts +195 -0
- package/src/lib/shell-arg.test.ts +24 -0
- package/src/lib/shell-arg.ts +17 -0
- package/src/lib/tunnel-edge.ts +31 -2
- 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
|
-
*
|
|
16
|
-
*
|
|
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
|
|
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
|
-
/**
|
|
113
|
-
|
|
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
|
|
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
|
|
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
|
-
*
|
|
137
|
-
*
|
|
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
|
|
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
|
-
{
|
|
302
|
+
{ credentials, name, legacyDeviceId }: PairOptions,
|
|
150
303
|
): PairResult {
|
|
151
|
-
let
|
|
304
|
+
let label: string;
|
|
152
305
|
try {
|
|
153
|
-
|
|
306
|
+
label = gatewayLabel(credentials.gatewayUrl);
|
|
154
307
|
} catch {
|
|
155
308
|
return {
|
|
156
309
|
ok: false,
|
|
157
310
|
status: 422,
|
|
158
|
-
error: "
|
|
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
|
|
166
|
-
if (isLoopbackUrl(
|
|
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
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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:
|
|
357
|
+
accessToken: credentials.token,
|
|
230
358
|
accessTokenExpiresAt:
|
|
231
|
-
jwtExpiryMs(
|
|
232
|
-
refreshToken:
|
|
233
|
-
refreshTokenExpiresAt:
|
|
234
|
-
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:
|
|
364
|
+
deviceId: credentials.deviceId ?? "",
|
|
237
365
|
leasedAt: new Date(now).toISOString(),
|
|
238
|
-
pairedGatewayUrl:
|
|
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
|
-
|
|
255
|
-
|
|
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
|
-
!
|
|
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
|
-
*
|
|
300
|
-
*
|
|
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
|
-
|
|
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
|
|
322
|
-
* (present, non-empty, within {@link
|
|
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 >
|
|
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
|
-
|
|
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
|
}
|