@vellumai/credential-executor 0.4.55 → 0.4.56
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/Dockerfile +6 -2
- package/node_modules/@vellumai/ces-contracts/bun.lock +29 -0
- package/node_modules/@vellumai/ces-contracts/package.json +24 -0
- package/node_modules/@vellumai/ces-contracts/src/__tests__/contracts.test.ts +293 -0
- package/node_modules/@vellumai/ces-contracts/src/__tests__/grants.test.ts +686 -0
- package/node_modules/@vellumai/ces-contracts/src/error.ts +25 -0
- package/node_modules/@vellumai/ces-contracts/src/grants.ts +184 -0
- package/node_modules/@vellumai/ces-contracts/src/handles.ts +213 -0
- package/node_modules/@vellumai/ces-contracts/src/index.ts +147 -0
- package/node_modules/@vellumai/ces-contracts/src/rendering.ts +135 -0
- package/node_modules/@vellumai/ces-contracts/src/rpc.ts +511 -0
- package/node_modules/@vellumai/ces-contracts/tsconfig.json +20 -0
- package/node_modules/@vellumai/credential-storage/bun.lock +24 -0
- package/node_modules/@vellumai/credential-storage/package.json +17 -0
- package/node_modules/@vellumai/credential-storage/src/__tests__/package-boundary.test.ts +151 -0
- package/node_modules/@vellumai/credential-storage/src/index.ts +213 -0
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +340 -0
- package/node_modules/@vellumai/credential-storage/src/static-credentials.ts +365 -0
- package/node_modules/@vellumai/credential-storage/tsconfig.json +20 -0
- package/node_modules/@vellumai/egress-proxy/bun.lock +24 -0
- package/node_modules/@vellumai/egress-proxy/package.json +17 -0
- package/node_modules/@vellumai/egress-proxy/src/__tests__/package-boundary.test.ts +131 -0
- package/node_modules/@vellumai/egress-proxy/src/index.ts +54 -0
- package/node_modules/@vellumai/egress-proxy/src/session-core.ts +466 -0
- package/node_modules/@vellumai/egress-proxy/src/types.ts +227 -0
- package/node_modules/@vellumai/egress-proxy/tsconfig.json +20 -0
- package/node_modules/zod/LICENSE +21 -0
- package/node_modules/zod/README.md +208 -0
- package/node_modules/zod/index.cjs +33 -0
- package/node_modules/zod/index.d.cts +4 -0
- package/node_modules/zod/index.d.ts +4 -0
- package/node_modules/zod/index.js +4 -0
- package/node_modules/zod/locales/index.cjs +17 -0
- package/node_modules/zod/locales/index.d.cts +1 -0
- package/node_modules/zod/locales/index.d.ts +1 -0
- package/node_modules/zod/locales/index.js +1 -0
- package/node_modules/zod/locales/package.json +6 -0
- package/node_modules/zod/mini/index.cjs +32 -0
- package/node_modules/zod/mini/index.d.cts +3 -0
- package/node_modules/zod/mini/index.d.ts +3 -0
- package/node_modules/zod/mini/index.js +3 -0
- package/node_modules/zod/mini/package.json +6 -0
- package/node_modules/zod/package.json +135 -0
- package/node_modules/zod/src/index.ts +4 -0
- package/node_modules/zod/src/locales/index.ts +1 -0
- package/node_modules/zod/src/mini/index.ts +3 -0
- package/node_modules/zod/src/v3/ZodError.ts +330 -0
- package/node_modules/zod/src/v3/benchmarks/datetime.ts +58 -0
- package/node_modules/zod/src/v3/benchmarks/discriminatedUnion.ts +80 -0
- package/node_modules/zod/src/v3/benchmarks/index.ts +59 -0
- package/node_modules/zod/src/v3/benchmarks/ipv4.ts +57 -0
- package/node_modules/zod/src/v3/benchmarks/object.ts +69 -0
- package/node_modules/zod/src/v3/benchmarks/primitives.ts +162 -0
- package/node_modules/zod/src/v3/benchmarks/realworld.ts +63 -0
- package/node_modules/zod/src/v3/benchmarks/string.ts +55 -0
- package/node_modules/zod/src/v3/benchmarks/union.ts +80 -0
- package/node_modules/zod/src/v3/errors.ts +13 -0
- package/node_modules/zod/src/v3/external.ts +6 -0
- package/node_modules/zod/src/v3/helpers/enumUtil.ts +17 -0
- package/node_modules/zod/src/v3/helpers/errorUtil.ts +8 -0
- package/node_modules/zod/src/v3/helpers/parseUtil.ts +176 -0
- package/node_modules/zod/src/v3/helpers/partialUtil.ts +34 -0
- package/node_modules/zod/src/v3/helpers/typeAliases.ts +2 -0
- package/node_modules/zod/src/v3/helpers/util.ts +224 -0
- package/node_modules/zod/src/v3/index.ts +4 -0
- package/node_modules/zod/src/v3/locales/en.ts +124 -0
- package/node_modules/zod/src/v3/standard-schema.ts +113 -0
- package/node_modules/zod/src/v3/tests/Mocker.ts +54 -0
- package/node_modules/zod/src/v3/tests/all-errors.test.ts +157 -0
- package/node_modules/zod/src/v3/tests/anyunknown.test.ts +28 -0
- package/node_modules/zod/src/v3/tests/array.test.ts +71 -0
- package/node_modules/zod/src/v3/tests/async-parsing.test.ts +388 -0
- package/node_modules/zod/src/v3/tests/async-refinements.test.ts +46 -0
- package/node_modules/zod/src/v3/tests/base.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/bigint.test.ts +55 -0
- package/node_modules/zod/src/v3/tests/branded.test.ts +53 -0
- package/node_modules/zod/src/v3/tests/catch.test.ts +220 -0
- package/node_modules/zod/src/v3/tests/coerce.test.ts +133 -0
- package/node_modules/zod/src/v3/tests/complex.test.ts +70 -0
- package/node_modules/zod/src/v3/tests/custom.test.ts +31 -0
- package/node_modules/zod/src/v3/tests/date.test.ts +32 -0
- package/node_modules/zod/src/v3/tests/deepmasking.test.ts +186 -0
- package/node_modules/zod/src/v3/tests/default.test.ts +112 -0
- package/node_modules/zod/src/v3/tests/description.test.ts +33 -0
- package/node_modules/zod/src/v3/tests/discriminated-unions.test.ts +315 -0
- package/node_modules/zod/src/v3/tests/enum.test.ts +80 -0
- package/node_modules/zod/src/v3/tests/error.test.ts +551 -0
- package/node_modules/zod/src/v3/tests/firstparty.test.ts +87 -0
- package/node_modules/zod/src/v3/tests/firstpartyschematypes.test.ts +21 -0
- package/node_modules/zod/src/v3/tests/function.test.ts +261 -0
- package/node_modules/zod/src/v3/tests/generics.test.ts +48 -0
- package/node_modules/zod/src/v3/tests/instanceof.test.ts +37 -0
- package/node_modules/zod/src/v3/tests/intersection.test.ts +110 -0
- package/node_modules/zod/src/v3/tests/language-server.source.ts +76 -0
- package/node_modules/zod/src/v3/tests/language-server.test.ts +207 -0
- package/node_modules/zod/src/v3/tests/literal.test.ts +36 -0
- package/node_modules/zod/src/v3/tests/map.test.ts +110 -0
- package/node_modules/zod/src/v3/tests/masking.test.ts +4 -0
- package/node_modules/zod/src/v3/tests/mocker.test.ts +19 -0
- package/node_modules/zod/src/v3/tests/nan.test.ts +24 -0
- package/node_modules/zod/src/v3/tests/nativeEnum.test.ts +87 -0
- package/node_modules/zod/src/v3/tests/nullable.test.ts +42 -0
- package/node_modules/zod/src/v3/tests/number.test.ts +176 -0
- package/node_modules/zod/src/v3/tests/object-augmentation.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/object-in-es5-env.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/object.test.ts +434 -0
- package/node_modules/zod/src/v3/tests/optional.test.ts +42 -0
- package/node_modules/zod/src/v3/tests/parseUtil.test.ts +23 -0
- package/node_modules/zod/src/v3/tests/parser.test.ts +41 -0
- package/node_modules/zod/src/v3/tests/partials.test.ts +243 -0
- package/node_modules/zod/src/v3/tests/pickomit.test.ts +111 -0
- package/node_modules/zod/src/v3/tests/pipeline.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/preprocess.test.ts +186 -0
- package/node_modules/zod/src/v3/tests/primitive.test.ts +440 -0
- package/node_modules/zod/src/v3/tests/promise.test.ts +90 -0
- package/node_modules/zod/src/v3/tests/readonly.test.ts +194 -0
- package/node_modules/zod/src/v3/tests/record.test.ts +171 -0
- package/node_modules/zod/src/v3/tests/recursive.test.ts +197 -0
- package/node_modules/zod/src/v3/tests/refine.test.ts +313 -0
- package/node_modules/zod/src/v3/tests/safeparse.test.ts +27 -0
- package/node_modules/zod/src/v3/tests/set.test.ts +142 -0
- package/node_modules/zod/src/v3/tests/standard-schema.test.ts +83 -0
- package/node_modules/zod/src/v3/tests/string.test.ts +916 -0
- package/node_modules/zod/src/v3/tests/transformer.test.ts +233 -0
- package/node_modules/zod/src/v3/tests/tuple.test.ts +90 -0
- package/node_modules/zod/src/v3/tests/unions.test.ts +57 -0
- package/node_modules/zod/src/v3/tests/validations.test.ts +133 -0
- package/node_modules/zod/src/v3/tests/void.test.ts +15 -0
- package/node_modules/zod/src/v3/types.ts +5138 -0
- package/node_modules/zod/src/v4/classic/checks.ts +32 -0
- package/node_modules/zod/src/v4/classic/coerce.ts +27 -0
- package/node_modules/zod/src/v4/classic/compat.ts +70 -0
- package/node_modules/zod/src/v4/classic/errors.ts +82 -0
- package/node_modules/zod/src/v4/classic/external.ts +51 -0
- package/node_modules/zod/src/v4/classic/from-json-schema.ts +643 -0
- package/node_modules/zod/src/v4/classic/index.ts +5 -0
- package/node_modules/zod/src/v4/classic/iso.ts +90 -0
- package/node_modules/zod/src/v4/classic/parse.ts +82 -0
- package/node_modules/zod/src/v4/classic/schemas.ts +2409 -0
- package/node_modules/zod/src/v4/classic/tests/anyunknown.test.ts +26 -0
- package/node_modules/zod/src/v4/classic/tests/apply.test.ts +59 -0
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +264 -0
- package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +210 -0
- package/node_modules/zod/src/v4/classic/tests/async-parsing.test.ts +381 -0
- package/node_modules/zod/src/v4/classic/tests/async-refinements.test.ts +68 -0
- package/node_modules/zod/src/v4/classic/tests/base.test.ts +7 -0
- package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +54 -0
- package/node_modules/zod/src/v4/classic/tests/brand.test.ts +106 -0
- package/node_modules/zod/src/v4/classic/tests/catch.test.ts +276 -0
- package/node_modules/zod/src/v4/classic/tests/coalesce.test.ts +20 -0
- package/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +573 -0
- package/node_modules/zod/src/v4/classic/tests/codec.test.ts +562 -0
- package/node_modules/zod/src/v4/classic/tests/coerce.test.ts +160 -0
- package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +374 -0
- package/node_modules/zod/src/v4/classic/tests/custom.test.ts +40 -0
- package/node_modules/zod/src/v4/classic/tests/date.test.ts +62 -0
- package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +302 -0
- package/node_modules/zod/src/v4/classic/tests/default.test.ts +365 -0
- package/node_modules/zod/src/v4/classic/tests/describe-meta-checks.test.ts +27 -0
- package/node_modules/zod/src/v4/classic/tests/description.test.ts +32 -0
- package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +661 -0
- package/node_modules/zod/src/v4/classic/tests/enum.test.ts +285 -0
- package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +595 -0
- package/node_modules/zod/src/v4/classic/tests/error.test.ts +711 -0
- package/node_modules/zod/src/v4/classic/tests/file.test.ts +96 -0
- package/node_modules/zod/src/v4/classic/tests/firstparty.test.ts +179 -0
- package/node_modules/zod/src/v4/classic/tests/fix-json-issue.test.ts +26 -0
- package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +734 -0
- package/node_modules/zod/src/v4/classic/tests/function.test.ts +360 -0
- package/node_modules/zod/src/v4/classic/tests/generics.test.ts +72 -0
- package/node_modules/zod/src/v4/classic/tests/hash.test.ts +68 -0
- package/node_modules/zod/src/v4/classic/tests/index.test.ts +939 -0
- package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +60 -0
- package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +198 -0
- package/node_modules/zod/src/v4/classic/tests/json.test.ts +109 -0
- package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +227 -0
- package/node_modules/zod/src/v4/classic/tests/literal.test.ts +117 -0
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +330 -0
- package/node_modules/zod/src/v4/classic/tests/nan.test.ts +21 -0
- package/node_modules/zod/src/v4/classic/tests/nested-refine.test.ts +168 -0
- package/node_modules/zod/src/v4/classic/tests/nonoptional.test.ts +101 -0
- package/node_modules/zod/src/v4/classic/tests/nullable.test.ts +22 -0
- package/node_modules/zod/src/v4/classic/tests/number.test.ts +270 -0
- package/node_modules/zod/src/v4/classic/tests/object.test.ts +640 -0
- package/node_modules/zod/src/v4/classic/tests/optional.test.ts +223 -0
- package/node_modules/zod/src/v4/classic/tests/partial.test.ts +427 -0
- package/node_modules/zod/src/v4/classic/tests/pickomit.test.ts +211 -0
- package/node_modules/zod/src/v4/classic/tests/pipe.test.ts +101 -0
- package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +74 -0
- package/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +282 -0
- package/node_modules/zod/src/v4/classic/tests/primitive.test.ts +175 -0
- package/node_modules/zod/src/v4/classic/tests/promise.test.ts +81 -0
- package/node_modules/zod/src/v4/classic/tests/prototypes.test.ts +23 -0
- package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +252 -0
- package/node_modules/zod/src/v4/classic/tests/record.test.ts +632 -0
- package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +582 -0
- package/node_modules/zod/src/v4/classic/tests/refine.test.ts +570 -0
- package/node_modules/zod/src/v4/classic/tests/registries.test.ts +243 -0
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +181 -0
- package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +134 -0
- package/node_modules/zod/src/v4/classic/tests/string-formats.test.ts +125 -0
- package/node_modules/zod/src/v4/classic/tests/string.test.ts +1175 -0
- package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +106 -0
- package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +771 -0
- package/node_modules/zod/src/v4/classic/tests/to-json-schema-methods.test.ts +438 -0
- package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +2990 -0
- package/node_modules/zod/src/v4/classic/tests/transform.test.ts +361 -0
- package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +183 -0
- package/node_modules/zod/src/v4/classic/tests/union.test.ts +219 -0
- package/node_modules/zod/src/v4/classic/tests/url.test.ts +13 -0
- package/node_modules/zod/src/v4/classic/tests/validations.test.ts +283 -0
- package/node_modules/zod/src/v4/classic/tests/void.test.ts +12 -0
- package/node_modules/zod/src/v4/core/api.ts +1798 -0
- package/node_modules/zod/src/v4/core/checks.ts +1293 -0
- package/node_modules/zod/src/v4/core/config.ts +15 -0
- package/node_modules/zod/src/v4/core/core.ts +138 -0
- package/node_modules/zod/src/v4/core/doc.ts +44 -0
- package/node_modules/zod/src/v4/core/errors.ts +448 -0
- package/node_modules/zod/src/v4/core/index.ts +16 -0
- package/node_modules/zod/src/v4/core/json-schema-generator.ts +126 -0
- package/node_modules/zod/src/v4/core/json-schema-processors.ts +667 -0
- package/node_modules/zod/src/v4/core/json-schema.ts +147 -0
- package/node_modules/zod/src/v4/core/parse.ts +195 -0
- package/node_modules/zod/src/v4/core/regexes.ts +183 -0
- package/node_modules/zod/src/v4/core/registries.ts +105 -0
- package/node_modules/zod/src/v4/core/schemas.ts +4538 -0
- package/node_modules/zod/src/v4/core/standard-schema.ts +159 -0
- package/node_modules/zod/src/v4/core/tests/extend.test.ts +59 -0
- package/node_modules/zod/src/v4/core/tests/index.test.ts +46 -0
- package/node_modules/zod/src/v4/core/tests/locales/be.test.ts +124 -0
- package/node_modules/zod/src/v4/core/tests/locales/en.test.ts +22 -0
- package/node_modules/zod/src/v4/core/tests/locales/es.test.ts +181 -0
- package/node_modules/zod/src/v4/core/tests/locales/he.test.ts +379 -0
- package/node_modules/zod/src/v4/core/tests/locales/nl.test.ts +46 -0
- package/node_modules/zod/src/v4/core/tests/locales/ru.test.ts +128 -0
- package/node_modules/zod/src/v4/core/tests/locales/tr.test.ts +69 -0
- package/node_modules/zod/src/v4/core/tests/locales/uz.test.ts +83 -0
- package/node_modules/zod/src/v4/core/tests/record-constructor.test.ts +67 -0
- package/node_modules/zod/src/v4/core/tests/recursive-tuples.test.ts +45 -0
- package/node_modules/zod/src/v4/core/to-json-schema.ts +613 -0
- package/node_modules/zod/src/v4/core/util.ts +966 -0
- package/node_modules/zod/src/v4/core/versions.ts +5 -0
- package/node_modules/zod/src/v4/core/zsf.ts +323 -0
- package/node_modules/zod/src/v4/index.ts +4 -0
- package/node_modules/zod/src/v4/locales/ar.ts +115 -0
- package/node_modules/zod/src/v4/locales/az.ts +111 -0
- package/node_modules/zod/src/v4/locales/be.ts +176 -0
- package/node_modules/zod/src/v4/locales/bg.ts +128 -0
- package/node_modules/zod/src/v4/locales/ca.ts +116 -0
- package/node_modules/zod/src/v4/locales/cs.ts +118 -0
- package/node_modules/zod/src/v4/locales/da.ts +123 -0
- package/node_modules/zod/src/v4/locales/de.ts +116 -0
- package/node_modules/zod/src/v4/locales/en.ts +119 -0
- package/node_modules/zod/src/v4/locales/eo.ts +118 -0
- package/node_modules/zod/src/v4/locales/es.ts +141 -0
- package/node_modules/zod/src/v4/locales/fa.ts +126 -0
- package/node_modules/zod/src/v4/locales/fi.ts +121 -0
- package/node_modules/zod/src/v4/locales/fr-CA.ts +116 -0
- package/node_modules/zod/src/v4/locales/fr.ts +116 -0
- package/node_modules/zod/src/v4/locales/he.ts +246 -0
- package/node_modules/zod/src/v4/locales/hu.ts +117 -0
- package/node_modules/zod/src/v4/locales/hy.ts +164 -0
- package/node_modules/zod/src/v4/locales/id.ts +115 -0
- package/node_modules/zod/src/v4/locales/index.ts +49 -0
- package/node_modules/zod/src/v4/locales/is.ts +119 -0
- package/node_modules/zod/src/v4/locales/it.ts +116 -0
- package/node_modules/zod/src/v4/locales/ja.ts +114 -0
- package/node_modules/zod/src/v4/locales/ka.ts +123 -0
- package/node_modules/zod/src/v4/locales/kh.ts +7 -0
- package/node_modules/zod/src/v4/locales/km.ts +119 -0
- package/node_modules/zod/src/v4/locales/ko.ts +121 -0
- package/node_modules/zod/src/v4/locales/lt.ts +239 -0
- package/node_modules/zod/src/v4/locales/mk.ts +118 -0
- package/node_modules/zod/src/v4/locales/ms.ts +115 -0
- package/node_modules/zod/src/v4/locales/nl.ts +121 -0
- package/node_modules/zod/src/v4/locales/no.ts +116 -0
- package/node_modules/zod/src/v4/locales/ota.ts +117 -0
- package/node_modules/zod/src/v4/locales/pl.ts +118 -0
- package/node_modules/zod/src/v4/locales/ps.ts +126 -0
- package/node_modules/zod/src/v4/locales/pt.ts +116 -0
- package/node_modules/zod/src/v4/locales/ru.ts +176 -0
- package/node_modules/zod/src/v4/locales/sl.ts +118 -0
- package/node_modules/zod/src/v4/locales/sv.ts +119 -0
- package/node_modules/zod/src/v4/locales/ta.ts +118 -0
- package/node_modules/zod/src/v4/locales/th.ts +119 -0
- package/node_modules/zod/src/v4/locales/tr.ts +111 -0
- package/node_modules/zod/src/v4/locales/ua.ts +7 -0
- package/node_modules/zod/src/v4/locales/uk.ts +117 -0
- package/node_modules/zod/src/v4/locales/ur.ts +119 -0
- package/node_modules/zod/src/v4/locales/uz.ts +116 -0
- package/node_modules/zod/src/v4/locales/vi.ts +117 -0
- package/node_modules/zod/src/v4/locales/yo.ts +124 -0
- package/node_modules/zod/src/v4/locales/zh-CN.ts +116 -0
- package/node_modules/zod/src/v4/locales/zh-TW.ts +115 -0
- package/node_modules/zod/src/v4/mini/checks.ts +32 -0
- package/node_modules/zod/src/v4/mini/coerce.ts +27 -0
- package/node_modules/zod/src/v4/mini/external.ts +40 -0
- package/node_modules/zod/src/v4/mini/index.ts +3 -0
- package/node_modules/zod/src/v4/mini/iso.ts +66 -0
- package/node_modules/zod/src/v4/mini/parse.ts +14 -0
- package/node_modules/zod/src/v4/mini/schemas.ts +1916 -0
- package/node_modules/zod/src/v4/mini/tests/apply.test.ts +24 -0
- package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +129 -0
- package/node_modules/zod/src/v4/mini/tests/brand.test.ts +94 -0
- package/node_modules/zod/src/v4/mini/tests/checks.test.ts +144 -0
- package/node_modules/zod/src/v4/mini/tests/codec.test.ts +529 -0
- package/node_modules/zod/src/v4/mini/tests/computed.test.ts +36 -0
- package/node_modules/zod/src/v4/mini/tests/error.test.ts +22 -0
- package/node_modules/zod/src/v4/mini/tests/functions.test.ts +5 -0
- package/node_modules/zod/src/v4/mini/tests/index.test.ts +963 -0
- package/node_modules/zod/src/v4/mini/tests/number.test.ts +95 -0
- package/node_modules/zod/src/v4/mini/tests/object.test.ts +227 -0
- package/node_modules/zod/src/v4/mini/tests/prototypes.test.ts +43 -0
- package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +275 -0
- package/node_modules/zod/src/v4/mini/tests/standard-schema.test.ts +50 -0
- package/node_modules/zod/src/v4/mini/tests/string.test.ts +347 -0
- package/node_modules/zod/src/v4-mini/index.ts +3 -0
- package/node_modules/zod/v3/ZodError.cjs +138 -0
- package/node_modules/zod/v3/ZodError.d.cts +164 -0
- package/node_modules/zod/v3/ZodError.d.ts +164 -0
- package/node_modules/zod/v3/ZodError.js +133 -0
- package/node_modules/zod/v3/errors.cjs +17 -0
- package/node_modules/zod/v3/errors.d.cts +5 -0
- package/node_modules/zod/v3/errors.d.ts +5 -0
- package/node_modules/zod/v3/errors.js +9 -0
- package/node_modules/zod/v3/external.cjs +22 -0
- package/node_modules/zod/v3/external.d.cts +6 -0
- package/node_modules/zod/v3/external.d.ts +6 -0
- package/node_modules/zod/v3/external.js +6 -0
- package/node_modules/zod/v3/helpers/enumUtil.cjs +2 -0
- package/node_modules/zod/v3/helpers/enumUtil.d.cts +8 -0
- package/node_modules/zod/v3/helpers/enumUtil.d.ts +8 -0
- package/node_modules/zod/v3/helpers/enumUtil.js +1 -0
- package/node_modules/zod/v3/helpers/errorUtil.cjs +9 -0
- package/node_modules/zod/v3/helpers/errorUtil.d.cts +9 -0
- package/node_modules/zod/v3/helpers/errorUtil.d.ts +9 -0
- package/node_modules/zod/v3/helpers/errorUtil.js +6 -0
- package/node_modules/zod/v3/helpers/parseUtil.cjs +124 -0
- package/node_modules/zod/v3/helpers/parseUtil.d.cts +78 -0
- package/node_modules/zod/v3/helpers/parseUtil.d.ts +78 -0
- package/node_modules/zod/v3/helpers/parseUtil.js +109 -0
- package/node_modules/zod/v3/helpers/partialUtil.cjs +2 -0
- package/node_modules/zod/v3/helpers/partialUtil.d.cts +8 -0
- package/node_modules/zod/v3/helpers/partialUtil.d.ts +8 -0
- package/node_modules/zod/v3/helpers/partialUtil.js +1 -0
- package/node_modules/zod/v3/helpers/typeAliases.cjs +2 -0
- package/node_modules/zod/v3/helpers/typeAliases.d.cts +2 -0
- package/node_modules/zod/v3/helpers/typeAliases.d.ts +2 -0
- package/node_modules/zod/v3/helpers/typeAliases.js +1 -0
- package/node_modules/zod/v3/helpers/util.cjs +137 -0
- package/node_modules/zod/v3/helpers/util.d.cts +85 -0
- package/node_modules/zod/v3/helpers/util.d.ts +85 -0
- package/node_modules/zod/v3/helpers/util.js +133 -0
- package/node_modules/zod/v3/index.cjs +33 -0
- package/node_modules/zod/v3/index.d.cts +4 -0
- package/node_modules/zod/v3/index.d.ts +4 -0
- package/node_modules/zod/v3/index.js +4 -0
- package/node_modules/zod/v3/locales/en.cjs +112 -0
- package/node_modules/zod/v3/locales/en.d.cts +3 -0
- package/node_modules/zod/v3/locales/en.d.ts +3 -0
- package/node_modules/zod/v3/locales/en.js +109 -0
- package/node_modules/zod/v3/package.json +6 -0
- package/node_modules/zod/v3/standard-schema.cjs +2 -0
- package/node_modules/zod/v3/standard-schema.d.cts +102 -0
- package/node_modules/zod/v3/standard-schema.d.ts +102 -0
- package/node_modules/zod/v3/standard-schema.js +1 -0
- package/node_modules/zod/v3/types.cjs +3777 -0
- package/node_modules/zod/v3/types.d.cts +1034 -0
- package/node_modules/zod/v3/types.d.ts +1034 -0
- package/node_modules/zod/v3/types.js +3695 -0
- package/node_modules/zod/v4/classic/checks.cjs +33 -0
- package/node_modules/zod/v4/classic/checks.d.cts +1 -0
- package/node_modules/zod/v4/classic/checks.d.ts +1 -0
- package/node_modules/zod/v4/classic/checks.js +1 -0
- package/node_modules/zod/v4/classic/coerce.cjs +47 -0
- package/node_modules/zod/v4/classic/coerce.d.cts +17 -0
- package/node_modules/zod/v4/classic/coerce.d.ts +17 -0
- package/node_modules/zod/v4/classic/coerce.js +17 -0
- package/node_modules/zod/v4/classic/compat.cjs +61 -0
- package/node_modules/zod/v4/classic/compat.d.cts +50 -0
- package/node_modules/zod/v4/classic/compat.d.ts +50 -0
- package/node_modules/zod/v4/classic/compat.js +31 -0
- package/node_modules/zod/v4/classic/errors.cjs +74 -0
- package/node_modules/zod/v4/classic/errors.d.cts +30 -0
- package/node_modules/zod/v4/classic/errors.d.ts +30 -0
- package/node_modules/zod/v4/classic/errors.js +48 -0
- package/node_modules/zod/v4/classic/external.cjs +73 -0
- package/node_modules/zod/v4/classic/external.d.cts +15 -0
- package/node_modules/zod/v4/classic/external.d.ts +15 -0
- package/node_modules/zod/v4/classic/external.js +20 -0
- package/node_modules/zod/v4/classic/from-json-schema.cjs +610 -0
- package/node_modules/zod/v4/classic/from-json-schema.d.cts +12 -0
- package/node_modules/zod/v4/classic/from-json-schema.d.ts +12 -0
- package/node_modules/zod/v4/classic/from-json-schema.js +584 -0
- package/node_modules/zod/v4/classic/index.cjs +33 -0
- package/node_modules/zod/v4/classic/index.d.cts +4 -0
- package/node_modules/zod/v4/classic/index.d.ts +4 -0
- package/node_modules/zod/v4/classic/index.js +4 -0
- package/node_modules/zod/v4/classic/iso.cjs +60 -0
- package/node_modules/zod/v4/classic/iso.d.cts +22 -0
- package/node_modules/zod/v4/classic/iso.d.ts +22 -0
- package/node_modules/zod/v4/classic/iso.js +30 -0
- package/node_modules/zod/v4/classic/package.json +6 -0
- package/node_modules/zod/v4/classic/parse.cjs +41 -0
- package/node_modules/zod/v4/classic/parse.d.cts +31 -0
- package/node_modules/zod/v4/classic/parse.d.ts +31 -0
- package/node_modules/zod/v4/classic/parse.js +15 -0
- package/node_modules/zod/v4/classic/schemas.cjs +1272 -0
- package/node_modules/zod/v4/classic/schemas.d.cts +739 -0
- package/node_modules/zod/v4/classic/schemas.d.ts +739 -0
- package/node_modules/zod/v4/classic/schemas.js +1157 -0
- package/node_modules/zod/v4/core/api.cjs +1222 -0
- package/node_modules/zod/v4/core/api.d.cts +304 -0
- package/node_modules/zod/v4/core/api.d.ts +304 -0
- package/node_modules/zod/v4/core/api.js +1082 -0
- package/node_modules/zod/v4/core/checks.cjs +601 -0
- package/node_modules/zod/v4/core/checks.d.cts +278 -0
- package/node_modules/zod/v4/core/checks.d.ts +278 -0
- package/node_modules/zod/v4/core/checks.js +575 -0
- package/node_modules/zod/v4/core/core.cjs +83 -0
- package/node_modules/zod/v4/core/core.d.cts +70 -0
- package/node_modules/zod/v4/core/core.d.ts +70 -0
- package/node_modules/zod/v4/core/core.js +76 -0
- package/node_modules/zod/v4/core/doc.cjs +39 -0
- package/node_modules/zod/v4/core/doc.d.cts +14 -0
- package/node_modules/zod/v4/core/doc.d.ts +14 -0
- package/node_modules/zod/v4/core/doc.js +35 -0
- package/node_modules/zod/v4/core/errors.cjs +213 -0
- package/node_modules/zod/v4/core/errors.d.cts +220 -0
- package/node_modules/zod/v4/core/errors.d.ts +220 -0
- package/node_modules/zod/v4/core/errors.js +182 -0
- package/node_modules/zod/v4/core/index.cjs +47 -0
- package/node_modules/zod/v4/core/index.d.cts +16 -0
- package/node_modules/zod/v4/core/index.d.ts +16 -0
- package/node_modules/zod/v4/core/index.js +16 -0
- package/node_modules/zod/v4/core/json-schema-generator.cjs +99 -0
- package/node_modules/zod/v4/core/json-schema-generator.d.cts +65 -0
- package/node_modules/zod/v4/core/json-schema-generator.d.ts +65 -0
- package/node_modules/zod/v4/core/json-schema-generator.js +95 -0
- package/node_modules/zod/v4/core/json-schema-processors.cjs +648 -0
- package/node_modules/zod/v4/core/json-schema-processors.d.cts +49 -0
- package/node_modules/zod/v4/core/json-schema-processors.d.ts +49 -0
- package/node_modules/zod/v4/core/json-schema-processors.js +605 -0
- package/node_modules/zod/v4/core/json-schema.cjs +2 -0
- package/node_modules/zod/v4/core/json-schema.d.cts +88 -0
- package/node_modules/zod/v4/core/json-schema.d.ts +88 -0
- package/node_modules/zod/v4/core/json-schema.js +1 -0
- package/node_modules/zod/v4/core/package.json +6 -0
- package/node_modules/zod/v4/core/parse.cjs +131 -0
- package/node_modules/zod/v4/core/parse.d.cts +49 -0
- package/node_modules/zod/v4/core/parse.d.ts +49 -0
- package/node_modules/zod/v4/core/parse.js +93 -0
- package/node_modules/zod/v4/core/regexes.cjs +166 -0
- package/node_modules/zod/v4/core/regexes.d.cts +79 -0
- package/node_modules/zod/v4/core/regexes.d.ts +79 -0
- package/node_modules/zod/v4/core/regexes.js +133 -0
- package/node_modules/zod/v4/core/registries.cjs +56 -0
- package/node_modules/zod/v4/core/registries.d.cts +35 -0
- package/node_modules/zod/v4/core/registries.d.ts +35 -0
- package/node_modules/zod/v4/core/registries.js +51 -0
- package/node_modules/zod/v4/core/schemas.cjs +2124 -0
- package/node_modules/zod/v4/core/schemas.d.cts +1146 -0
- package/node_modules/zod/v4/core/schemas.d.ts +1146 -0
- package/node_modules/zod/v4/core/schemas.js +2093 -0
- package/node_modules/zod/v4/core/standard-schema.cjs +2 -0
- package/node_modules/zod/v4/core/standard-schema.d.cts +126 -0
- package/node_modules/zod/v4/core/standard-schema.d.ts +126 -0
- package/node_modules/zod/v4/core/standard-schema.js +1 -0
- package/node_modules/zod/v4/core/to-json-schema.cjs +446 -0
- package/node_modules/zod/v4/core/to-json-schema.d.cts +114 -0
- package/node_modules/zod/v4/core/to-json-schema.d.ts +114 -0
- package/node_modules/zod/v4/core/to-json-schema.js +437 -0
- package/node_modules/zod/v4/core/util.cjs +710 -0
- package/node_modules/zod/v4/core/util.d.cts +199 -0
- package/node_modules/zod/v4/core/util.d.ts +199 -0
- package/node_modules/zod/v4/core/util.js +651 -0
- package/node_modules/zod/v4/core/versions.cjs +8 -0
- package/node_modules/zod/v4/core/versions.d.cts +5 -0
- package/node_modules/zod/v4/core/versions.d.ts +5 -0
- package/node_modules/zod/v4/core/versions.js +5 -0
- package/node_modules/zod/v4/index.cjs +22 -0
- package/node_modules/zod/v4/index.d.cts +3 -0
- package/node_modules/zod/v4/index.d.ts +3 -0
- package/node_modules/zod/v4/index.js +3 -0
- package/node_modules/zod/v4/locales/ar.cjs +133 -0
- package/node_modules/zod/v4/locales/ar.d.cts +5 -0
- package/node_modules/zod/v4/locales/ar.d.ts +4 -0
- package/node_modules/zod/v4/locales/ar.js +106 -0
- package/node_modules/zod/v4/locales/az.cjs +132 -0
- package/node_modules/zod/v4/locales/az.d.cts +5 -0
- package/node_modules/zod/v4/locales/az.d.ts +4 -0
- package/node_modules/zod/v4/locales/az.js +105 -0
- package/node_modules/zod/v4/locales/be.cjs +183 -0
- package/node_modules/zod/v4/locales/be.d.cts +5 -0
- package/node_modules/zod/v4/locales/be.d.ts +4 -0
- package/node_modules/zod/v4/locales/be.js +156 -0
- package/node_modules/zod/v4/locales/bg.cjs +147 -0
- package/node_modules/zod/v4/locales/bg.d.cts +5 -0
- package/node_modules/zod/v4/locales/bg.d.ts +4 -0
- package/node_modules/zod/v4/locales/bg.js +120 -0
- package/node_modules/zod/v4/locales/ca.cjs +134 -0
- package/node_modules/zod/v4/locales/ca.d.cts +5 -0
- package/node_modules/zod/v4/locales/ca.d.ts +4 -0
- package/node_modules/zod/v4/locales/ca.js +107 -0
- package/node_modules/zod/v4/locales/cs.cjs +138 -0
- package/node_modules/zod/v4/locales/cs.d.cts +5 -0
- package/node_modules/zod/v4/locales/cs.d.ts +4 -0
- package/node_modules/zod/v4/locales/cs.js +111 -0
- package/node_modules/zod/v4/locales/da.cjs +142 -0
- package/node_modules/zod/v4/locales/da.d.cts +5 -0
- package/node_modules/zod/v4/locales/da.d.ts +4 -0
- package/node_modules/zod/v4/locales/da.js +115 -0
- package/node_modules/zod/v4/locales/de.cjs +135 -0
- package/node_modules/zod/v4/locales/de.d.cts +5 -0
- package/node_modules/zod/v4/locales/de.d.ts +4 -0
- package/node_modules/zod/v4/locales/de.js +108 -0
- package/node_modules/zod/v4/locales/en.cjs +136 -0
- package/node_modules/zod/v4/locales/en.d.cts +5 -0
- package/node_modules/zod/v4/locales/en.d.ts +4 -0
- package/node_modules/zod/v4/locales/en.js +109 -0
- package/node_modules/zod/v4/locales/eo.cjs +136 -0
- package/node_modules/zod/v4/locales/eo.d.cts +5 -0
- package/node_modules/zod/v4/locales/eo.d.ts +4 -0
- package/node_modules/zod/v4/locales/eo.js +109 -0
- package/node_modules/zod/v4/locales/es.cjs +159 -0
- package/node_modules/zod/v4/locales/es.d.cts +5 -0
- package/node_modules/zod/v4/locales/es.d.ts +4 -0
- package/node_modules/zod/v4/locales/es.js +132 -0
- package/node_modules/zod/v4/locales/fa.cjs +141 -0
- package/node_modules/zod/v4/locales/fa.d.cts +5 -0
- package/node_modules/zod/v4/locales/fa.d.ts +4 -0
- package/node_modules/zod/v4/locales/fa.js +114 -0
- package/node_modules/zod/v4/locales/fi.cjs +139 -0
- package/node_modules/zod/v4/locales/fi.d.cts +5 -0
- package/node_modules/zod/v4/locales/fi.d.ts +4 -0
- package/node_modules/zod/v4/locales/fi.js +112 -0
- package/node_modules/zod/v4/locales/fr-CA.cjs +134 -0
- package/node_modules/zod/v4/locales/fr-CA.d.cts +5 -0
- package/node_modules/zod/v4/locales/fr-CA.d.ts +4 -0
- package/node_modules/zod/v4/locales/fr-CA.js +107 -0
- package/node_modules/zod/v4/locales/fr.cjs +135 -0
- package/node_modules/zod/v4/locales/fr.d.cts +5 -0
- package/node_modules/zod/v4/locales/fr.d.ts +4 -0
- package/node_modules/zod/v4/locales/fr.js +108 -0
- package/node_modules/zod/v4/locales/he.cjs +241 -0
- package/node_modules/zod/v4/locales/he.d.cts +5 -0
- package/node_modules/zod/v4/locales/he.d.ts +4 -0
- package/node_modules/zod/v4/locales/he.js +214 -0
- package/node_modules/zod/v4/locales/hu.cjs +135 -0
- package/node_modules/zod/v4/locales/hu.d.cts +5 -0
- package/node_modules/zod/v4/locales/hu.d.ts +4 -0
- package/node_modules/zod/v4/locales/hu.js +108 -0
- package/node_modules/zod/v4/locales/hy.cjs +174 -0
- package/node_modules/zod/v4/locales/hy.d.cts +5 -0
- package/node_modules/zod/v4/locales/hy.d.ts +4 -0
- package/node_modules/zod/v4/locales/hy.js +147 -0
- package/node_modules/zod/v4/locales/id.cjs +133 -0
- package/node_modules/zod/v4/locales/id.d.cts +5 -0
- package/node_modules/zod/v4/locales/id.d.ts +4 -0
- package/node_modules/zod/v4/locales/id.js +106 -0
- package/node_modules/zod/v4/locales/index.cjs +104 -0
- package/node_modules/zod/v4/locales/index.d.cts +49 -0
- package/node_modules/zod/v4/locales/index.d.ts +49 -0
- package/node_modules/zod/v4/locales/index.js +49 -0
- package/node_modules/zod/v4/locales/is.cjs +136 -0
- package/node_modules/zod/v4/locales/is.d.cts +5 -0
- package/node_modules/zod/v4/locales/is.d.ts +4 -0
- package/node_modules/zod/v4/locales/is.js +109 -0
- package/node_modules/zod/v4/locales/it.cjs +135 -0
- package/node_modules/zod/v4/locales/it.d.cts +5 -0
- package/node_modules/zod/v4/locales/it.d.ts +4 -0
- package/node_modules/zod/v4/locales/it.js +108 -0
- package/node_modules/zod/v4/locales/ja.cjs +134 -0
- package/node_modules/zod/v4/locales/ja.d.cts +5 -0
- package/node_modules/zod/v4/locales/ja.d.ts +4 -0
- package/node_modules/zod/v4/locales/ja.js +107 -0
- package/node_modules/zod/v4/locales/ka.cjs +139 -0
- package/node_modules/zod/v4/locales/ka.d.cts +5 -0
- package/node_modules/zod/v4/locales/ka.d.ts +4 -0
- package/node_modules/zod/v4/locales/ka.js +112 -0
- package/node_modules/zod/v4/locales/kh.cjs +12 -0
- package/node_modules/zod/v4/locales/kh.d.cts +5 -0
- package/node_modules/zod/v4/locales/kh.d.ts +5 -0
- package/node_modules/zod/v4/locales/kh.js +5 -0
- package/node_modules/zod/v4/locales/km.cjs +137 -0
- package/node_modules/zod/v4/locales/km.d.cts +5 -0
- package/node_modules/zod/v4/locales/km.d.ts +4 -0
- package/node_modules/zod/v4/locales/km.js +110 -0
- package/node_modules/zod/v4/locales/ko.cjs +138 -0
- package/node_modules/zod/v4/locales/ko.d.cts +5 -0
- package/node_modules/zod/v4/locales/ko.d.ts +4 -0
- package/node_modules/zod/v4/locales/ko.js +111 -0
- package/node_modules/zod/v4/locales/lt.cjs +230 -0
- package/node_modules/zod/v4/locales/lt.d.cts +5 -0
- package/node_modules/zod/v4/locales/lt.d.ts +4 -0
- package/node_modules/zod/v4/locales/lt.js +203 -0
- package/node_modules/zod/v4/locales/mk.cjs +136 -0
- package/node_modules/zod/v4/locales/mk.d.cts +5 -0
- package/node_modules/zod/v4/locales/mk.d.ts +4 -0
- package/node_modules/zod/v4/locales/mk.js +109 -0
- package/node_modules/zod/v4/locales/ms.cjs +134 -0
- package/node_modules/zod/v4/locales/ms.d.cts +5 -0
- package/node_modules/zod/v4/locales/ms.d.ts +4 -0
- package/node_modules/zod/v4/locales/ms.js +107 -0
- package/node_modules/zod/v4/locales/nl.cjs +137 -0
- package/node_modules/zod/v4/locales/nl.d.cts +5 -0
- package/node_modules/zod/v4/locales/nl.d.ts +4 -0
- package/node_modules/zod/v4/locales/nl.js +110 -0
- package/node_modules/zod/v4/locales/no.cjs +135 -0
- package/node_modules/zod/v4/locales/no.d.cts +5 -0
- package/node_modules/zod/v4/locales/no.d.ts +4 -0
- package/node_modules/zod/v4/locales/no.js +108 -0
- package/node_modules/zod/v4/locales/ota.cjs +136 -0
- package/node_modules/zod/v4/locales/ota.d.cts +5 -0
- package/node_modules/zod/v4/locales/ota.d.ts +4 -0
- package/node_modules/zod/v4/locales/ota.js +109 -0
- package/node_modules/zod/v4/locales/package.json +6 -0
- package/node_modules/zod/v4/locales/pl.cjs +136 -0
- package/node_modules/zod/v4/locales/pl.d.cts +5 -0
- package/node_modules/zod/v4/locales/pl.d.ts +4 -0
- package/node_modules/zod/v4/locales/pl.js +109 -0
- package/node_modules/zod/v4/locales/ps.cjs +141 -0
- package/node_modules/zod/v4/locales/ps.d.cts +5 -0
- package/node_modules/zod/v4/locales/ps.d.ts +4 -0
- package/node_modules/zod/v4/locales/ps.js +114 -0
- package/node_modules/zod/v4/locales/pt.cjs +135 -0
- package/node_modules/zod/v4/locales/pt.d.cts +5 -0
- package/node_modules/zod/v4/locales/pt.d.ts +4 -0
- package/node_modules/zod/v4/locales/pt.js +108 -0
- package/node_modules/zod/v4/locales/ru.cjs +183 -0
- package/node_modules/zod/v4/locales/ru.d.cts +5 -0
- package/node_modules/zod/v4/locales/ru.d.ts +4 -0
- package/node_modules/zod/v4/locales/ru.js +156 -0
- package/node_modules/zod/v4/locales/sl.cjs +136 -0
- package/node_modules/zod/v4/locales/sl.d.cts +5 -0
- package/node_modules/zod/v4/locales/sl.d.ts +4 -0
- package/node_modules/zod/v4/locales/sl.js +109 -0
- package/node_modules/zod/v4/locales/sv.cjs +137 -0
- package/node_modules/zod/v4/locales/sv.d.cts +5 -0
- package/node_modules/zod/v4/locales/sv.d.ts +4 -0
- package/node_modules/zod/v4/locales/sv.js +110 -0
- package/node_modules/zod/v4/locales/ta.cjs +137 -0
- package/node_modules/zod/v4/locales/ta.d.cts +5 -0
- package/node_modules/zod/v4/locales/ta.d.ts +4 -0
- package/node_modules/zod/v4/locales/ta.js +110 -0
- package/node_modules/zod/v4/locales/th.cjs +137 -0
- package/node_modules/zod/v4/locales/th.d.cts +5 -0
- package/node_modules/zod/v4/locales/th.d.ts +4 -0
- package/node_modules/zod/v4/locales/th.js +110 -0
- package/node_modules/zod/v4/locales/tr.cjs +132 -0
- package/node_modules/zod/v4/locales/tr.d.cts +5 -0
- package/node_modules/zod/v4/locales/tr.d.ts +4 -0
- package/node_modules/zod/v4/locales/tr.js +105 -0
- package/node_modules/zod/v4/locales/ua.cjs +12 -0
- package/node_modules/zod/v4/locales/ua.d.cts +5 -0
- package/node_modules/zod/v4/locales/ua.d.ts +5 -0
- package/node_modules/zod/v4/locales/ua.js +5 -0
- package/node_modules/zod/v4/locales/uk.cjs +135 -0
- package/node_modules/zod/v4/locales/uk.d.cts +5 -0
- package/node_modules/zod/v4/locales/uk.d.ts +4 -0
- package/node_modules/zod/v4/locales/uk.js +108 -0
- package/node_modules/zod/v4/locales/ur.cjs +137 -0
- package/node_modules/zod/v4/locales/ur.d.cts +5 -0
- package/node_modules/zod/v4/locales/ur.d.ts +4 -0
- package/node_modules/zod/v4/locales/ur.js +110 -0
- package/node_modules/zod/v4/locales/uz.cjs +136 -0
- package/node_modules/zod/v4/locales/uz.d.cts +5 -0
- package/node_modules/zod/v4/locales/uz.d.ts +4 -0
- package/node_modules/zod/v4/locales/uz.js +109 -0
- package/node_modules/zod/v4/locales/vi.cjs +135 -0
- package/node_modules/zod/v4/locales/vi.d.cts +5 -0
- package/node_modules/zod/v4/locales/vi.d.ts +4 -0
- package/node_modules/zod/v4/locales/vi.js +108 -0
- package/node_modules/zod/v4/locales/yo.cjs +134 -0
- package/node_modules/zod/v4/locales/yo.d.cts +5 -0
- package/node_modules/zod/v4/locales/yo.d.ts +4 -0
- package/node_modules/zod/v4/locales/yo.js +107 -0
- package/node_modules/zod/v4/locales/zh-CN.cjs +136 -0
- package/node_modules/zod/v4/locales/zh-CN.d.cts +5 -0
- package/node_modules/zod/v4/locales/zh-CN.d.ts +4 -0
- package/node_modules/zod/v4/locales/zh-CN.js +109 -0
- package/node_modules/zod/v4/locales/zh-TW.cjs +134 -0
- package/node_modules/zod/v4/locales/zh-TW.d.cts +5 -0
- package/node_modules/zod/v4/locales/zh-TW.d.ts +4 -0
- package/node_modules/zod/v4/locales/zh-TW.js +107 -0
- package/node_modules/zod/v4/mini/checks.cjs +34 -0
- package/node_modules/zod/v4/mini/checks.d.cts +1 -0
- package/node_modules/zod/v4/mini/checks.d.ts +1 -0
- package/node_modules/zod/v4/mini/checks.js +1 -0
- package/node_modules/zod/v4/mini/coerce.cjs +52 -0
- package/node_modules/zod/v4/mini/coerce.d.cts +7 -0
- package/node_modules/zod/v4/mini/coerce.d.ts +7 -0
- package/node_modules/zod/v4/mini/coerce.js +22 -0
- package/node_modules/zod/v4/mini/external.cjs +63 -0
- package/node_modules/zod/v4/mini/external.d.cts +12 -0
- package/node_modules/zod/v4/mini/external.d.ts +12 -0
- package/node_modules/zod/v4/mini/external.js +14 -0
- package/node_modules/zod/v4/mini/index.cjs +32 -0
- package/node_modules/zod/v4/mini/index.d.cts +3 -0
- package/node_modules/zod/v4/mini/index.d.ts +3 -0
- package/node_modules/zod/v4/mini/index.js +3 -0
- package/node_modules/zod/v4/mini/iso.cjs +64 -0
- package/node_modules/zod/v4/mini/iso.d.cts +22 -0
- package/node_modules/zod/v4/mini/iso.d.ts +22 -0
- package/node_modules/zod/v4/mini/iso.js +34 -0
- package/node_modules/zod/v4/mini/package.json +6 -0
- package/node_modules/zod/v4/mini/parse.cjs +16 -0
- package/node_modules/zod/v4/mini/parse.d.cts +1 -0
- package/node_modules/zod/v4/mini/parse.d.ts +1 -0
- package/node_modules/zod/v4/mini/parse.js +1 -0
- package/node_modules/zod/v4/mini/schemas.cjs +1046 -0
- package/node_modules/zod/v4/mini/schemas.d.cts +427 -0
- package/node_modules/zod/v4/mini/schemas.d.ts +427 -0
- package/node_modules/zod/v4/mini/schemas.js +925 -0
- package/node_modules/zod/v4/package.json +6 -0
- package/node_modules/zod/v4-mini/index.cjs +32 -0
- package/node_modules/zod/v4-mini/index.d.cts +3 -0
- package/node_modules/zod/v4-mini/index.d.ts +3 -0
- package/node_modules/zod/v4-mini/index.js +3 -0
- package/node_modules/zod/v4-mini/package.json +6 -0
- package/package.json +3 -2
- package/src/__tests__/command-executor.test.ts +575 -60
- package/src/__tests__/command-validator.test.ts +697 -0
- package/src/__tests__/command-workspace.test.ts +30 -0
- package/src/__tests__/grant-store.test.ts +151 -33
- package/src/__tests__/http-executor.test.ts +106 -16
- package/src/__tests__/http-policy.test.ts +121 -22
- package/src/__tests__/local-materializers.test.ts +34 -0
- package/src/__tests__/managed-integration.test.ts +633 -0
- package/src/__tests__/managed-lazy-getters.test.ts +245 -0
- package/src/__tests__/managed-materializers.test.ts +107 -38
- package/src/__tests__/managed-rejection.test.ts +43 -0
- package/src/__tests__/toolstore.test.ts +207 -18
- package/src/__tests__/transport.test.ts +26 -6
- package/src/commands/auth-adapters.ts +2 -2
- package/src/commands/egress-hooks.ts +203 -0
- package/src/commands/executor.ts +403 -87
- package/src/commands/profiles.ts +4 -0
- package/src/commands/validator.ts +267 -3
- package/src/commands/workspace.ts +59 -21
- package/src/grants/index.ts +1 -1
- package/src/grants/persistent-store.ts +79 -17
- package/src/grants/rpc-handlers.ts +67 -43
- package/src/grants/temporary-store.ts +26 -19
- package/src/http/executor.ts +170 -25
- package/src/http/path-template.ts +75 -9
- package/src/http/policy.ts +9 -27
- package/src/index.ts +3 -0
- package/src/main.ts +102 -43
- package/src/managed-errors.ts +9 -0
- package/src/managed-lazy-getters.ts +70 -0
- package/src/managed-main.ts +191 -65
- package/src/materializers/local-oauth-lookup.ts +97 -0
- package/src/materializers/local-secure-key-backend.ts +254 -0
- package/src/materializers/local-token-refresh.ts +263 -0
- package/src/materializers/local.ts +21 -5
- package/src/materializers/managed-platform.ts +50 -25
- package/src/paths.ts +28 -10
- package/src/server.ts +147 -11
- package/src/subjects/managed.ts +33 -12
- package/src/subjects/policy.ts +79 -0
- package/src/toolstore/publish.ts +236 -7
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth connection persistence, token persistence, and refresh support
|
|
3
|
+
* primitives.
|
|
4
|
+
*
|
|
5
|
+
* This module provides portable, backend-agnostic helpers for:
|
|
6
|
+
* - Secure-key path conventions for OAuth tokens and client secrets
|
|
7
|
+
* - Token expiry checking with proactive refresh buffering
|
|
8
|
+
* - Token refresh circuit breaker to prevent retry storms
|
|
9
|
+
* - Per-connection refresh deduplication
|
|
10
|
+
* - Abstract token persistence interface
|
|
11
|
+
*
|
|
12
|
+
* It has NO dependency on the assistant daemon, SQLite, Drizzle, or any
|
|
13
|
+
* service-specific module. The assistant's token-manager.ts and
|
|
14
|
+
* token-persistence.ts wire in the platform-specific backends and
|
|
15
|
+
* delegate here for shared logic.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { SecureKeyBackend } from "./index.js";
|
|
19
|
+
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Secure-key path conventions
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Build the secure-key path for an OAuth connection's access token.
|
|
26
|
+
*/
|
|
27
|
+
export function oauthConnectionAccessTokenPath(connectionId: string): string {
|
|
28
|
+
return `oauth_connection/${connectionId}/access_token`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Build the secure-key path for an OAuth connection's refresh token.
|
|
33
|
+
*/
|
|
34
|
+
export function oauthConnectionRefreshTokenPath(connectionId: string): string {
|
|
35
|
+
return `oauth_connection/${connectionId}/refresh_token`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Build the secure-key path for an OAuth app's client secret.
|
|
40
|
+
*/
|
|
41
|
+
export function oauthAppClientSecretPath(appId: string): string {
|
|
42
|
+
return `oauth_app/${appId}/client_secret`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Token expiry
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
|
|
49
|
+
/** Buffer before expiry to trigger proactive refresh (5 minutes). */
|
|
50
|
+
export const EXPIRY_BUFFER_MS = 5 * 60 * 1000;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Check whether a token is expired or will expire within the buffer window.
|
|
54
|
+
*/
|
|
55
|
+
export function isTokenExpired(
|
|
56
|
+
expiresAt: number | null,
|
|
57
|
+
bufferMs: number = EXPIRY_BUFFER_MS
|
|
58
|
+
): boolean {
|
|
59
|
+
if (!expiresAt) return false;
|
|
60
|
+
return Date.now() >= expiresAt - bufferMs;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Compute the absolute expiry timestamp from an `expires_in` seconds value.
|
|
65
|
+
* Returns null if the value is missing or zero.
|
|
66
|
+
*/
|
|
67
|
+
export function computeExpiresAt(
|
|
68
|
+
expiresIn: number | null | undefined
|
|
69
|
+
): number | null {
|
|
70
|
+
if (expiresIn == null || expiresIn <= 0) return null;
|
|
71
|
+
return Date.now() + expiresIn * 1000;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
// Token refresh circuit breaker
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Prevents retry storms when a provider persistently rejects refresh
|
|
78
|
+
// attempts (e.g. revoked refresh token returning 401 repeatedly).
|
|
79
|
+
// Per-key state: after FAILURE_THRESHOLD consecutive failures, stop
|
|
80
|
+
// attempting refreshes for a cooldown period that doubles on each
|
|
81
|
+
// successive trip (exponential backoff), capped at MAX_COOLDOWN_MS.
|
|
82
|
+
// A successful refresh resets the breaker for that key.
|
|
83
|
+
|
|
84
|
+
export const REFRESH_FAILURE_THRESHOLD = 3;
|
|
85
|
+
export const INITIAL_COOLDOWN_MS = 30_000;
|
|
86
|
+
export const MAX_COOLDOWN_MS = 10 * 60 * 1000;
|
|
87
|
+
|
|
88
|
+
export interface RefreshBreakerState {
|
|
89
|
+
consecutiveFailures: number;
|
|
90
|
+
openedAt: number;
|
|
91
|
+
cooldownMs: number;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* In-memory token refresh circuit breaker.
|
|
96
|
+
*
|
|
97
|
+
* Tracks per-key (typically connection ID) failure state. After
|
|
98
|
+
* FAILURE_THRESHOLD consecutive failures, the breaker opens for a
|
|
99
|
+
* cooldown period that doubles on each successive trip.
|
|
100
|
+
*/
|
|
101
|
+
export class RefreshCircuitBreaker {
|
|
102
|
+
private breakers = new Map<string, RefreshBreakerState>();
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Check whether the breaker is currently open (refusing refresh attempts)
|
|
106
|
+
* for the given key. If the cooldown has expired, transitions to half-open
|
|
107
|
+
* by resetting the failure count.
|
|
108
|
+
*/
|
|
109
|
+
isOpen(key: string): boolean {
|
|
110
|
+
const state = this.breakers.get(key);
|
|
111
|
+
if (!state || state.consecutiveFailures < REFRESH_FAILURE_THRESHOLD)
|
|
112
|
+
return false;
|
|
113
|
+
if (Date.now() - state.openedAt < state.cooldownMs) return true;
|
|
114
|
+
// Cooldown expired — transition to half-open: reset failure count so the
|
|
115
|
+
// next batch of failures must reach the threshold again to re-trip. The
|
|
116
|
+
// existing cooldownMs is preserved so re-tripping will escalate it.
|
|
117
|
+
state.consecutiveFailures = 0;
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Get the breaker state for a key, if it exists. */
|
|
122
|
+
getState(key: string): RefreshBreakerState | undefined {
|
|
123
|
+
return this.breakers.get(key);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Record a successful refresh, resetting the breaker for the key. */
|
|
127
|
+
recordSuccess(key: string): void {
|
|
128
|
+
this.breakers.delete(key);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Record a failed refresh attempt, potentially opening the breaker. */
|
|
132
|
+
recordFailure(key: string): void {
|
|
133
|
+
const state = this.breakers.get(key);
|
|
134
|
+
if (!state) {
|
|
135
|
+
this.breakers.set(key, {
|
|
136
|
+
consecutiveFailures: 1,
|
|
137
|
+
openedAt: 0,
|
|
138
|
+
cooldownMs: INITIAL_COOLDOWN_MS,
|
|
139
|
+
});
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
state.consecutiveFailures++;
|
|
143
|
+
if (state.consecutiveFailures >= REFRESH_FAILURE_THRESHOLD) {
|
|
144
|
+
// Only escalate cooldown on the exact failure that trips the breaker.
|
|
145
|
+
// Concurrent in-flight failures that arrive after the threshold is
|
|
146
|
+
// already crossed must not double the cooldown again.
|
|
147
|
+
if (
|
|
148
|
+
state.consecutiveFailures === REFRESH_FAILURE_THRESHOLD &&
|
|
149
|
+
state.openedAt > 0
|
|
150
|
+
) {
|
|
151
|
+
state.cooldownMs = Math.min(state.cooldownMs * 2, MAX_COOLDOWN_MS);
|
|
152
|
+
}
|
|
153
|
+
state.openedAt = Date.now();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** Reset all breaker state (primarily for testing). */
|
|
158
|
+
clear(): void {
|
|
159
|
+
this.breakers.clear();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ---------------------------------------------------------------------------
|
|
164
|
+
// Refresh deduplication
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Deduplicates concurrent refresh attempts for the same key.
|
|
169
|
+
*
|
|
170
|
+
* When multiple callers detect an expired or rejected token for the same
|
|
171
|
+
* connection simultaneously, only one actual refresh attempt is made.
|
|
172
|
+
* Other callers join the in-flight promise.
|
|
173
|
+
*/
|
|
174
|
+
export class RefreshDeduplicator {
|
|
175
|
+
private inflight = new Map<string, Promise<string>>();
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Execute a refresh operation, deduplicating concurrent calls for the same key.
|
|
179
|
+
* If a refresh is already in flight for the given key, returns the existing promise.
|
|
180
|
+
*/
|
|
181
|
+
deduplicate(key: string, refreshFn: () => Promise<string>): Promise<string> {
|
|
182
|
+
const existing = this.inflight.get(key);
|
|
183
|
+
if (existing) return existing;
|
|
184
|
+
|
|
185
|
+
const promise = refreshFn().finally(() => {
|
|
186
|
+
this.inflight.delete(key);
|
|
187
|
+
});
|
|
188
|
+
this.inflight.set(key, promise);
|
|
189
|
+
return promise;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** Reset all in-flight state (primarily for testing). */
|
|
193
|
+
clear(): void {
|
|
194
|
+
this.inflight.clear();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
// Credential error classification
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Distinguish credential-specific refresh failures (which need reauthorization)
|
|
204
|
+
* from transient errors (network timeouts, 5xx) that can be retried.
|
|
205
|
+
*
|
|
206
|
+
* Credential errors: 400 with invalid_grant or invalid_client, 401, 403.
|
|
207
|
+
* Everything else (5xx, network errors, non-credential 400s) is transient.
|
|
208
|
+
*/
|
|
209
|
+
export function isCredentialError(err: unknown): boolean {
|
|
210
|
+
if (!(err instanceof Error)) return false;
|
|
211
|
+
const msg = err.message;
|
|
212
|
+
// 401/403 are always credential errors
|
|
213
|
+
if (/HTTP\s+40[13]\b/.test(msg)) return true;
|
|
214
|
+
// 400 with invalid_grant means the refresh token is revoked/expired;
|
|
215
|
+
// invalid_client means client credentials are bad/rotated
|
|
216
|
+
if (/HTTP\s+400\b/.test(msg) && /invalid_grant|invalid_client/.test(msg))
|
|
217
|
+
return true;
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
// Token persistence helpers
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Persist an OAuth access token (and optionally a refresh token) to the
|
|
227
|
+
* secure-key backend for a given connection ID.
|
|
228
|
+
*
|
|
229
|
+
* When `refreshToken` is provided, it is stored. When omitted (undefined),
|
|
230
|
+
* any existing refresh token is cleared to prevent stale token usage.
|
|
231
|
+
*/
|
|
232
|
+
export async function persistOAuthTokens(
|
|
233
|
+
backend: SecureKeyBackend,
|
|
234
|
+
connectionId: string,
|
|
235
|
+
tokens: {
|
|
236
|
+
accessToken: string;
|
|
237
|
+
refreshToken?: string;
|
|
238
|
+
}
|
|
239
|
+
): Promise<void> {
|
|
240
|
+
const accessPath = oauthConnectionAccessTokenPath(connectionId);
|
|
241
|
+
const stored = await backend.set(accessPath, tokens.accessToken);
|
|
242
|
+
if (!stored) {
|
|
243
|
+
throw new Error("Failed to store access token in secure storage");
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const refreshPath = oauthConnectionRefreshTokenPath(connectionId);
|
|
247
|
+
if (tokens.refreshToken) {
|
|
248
|
+
await backend.set(refreshPath, tokens.refreshToken);
|
|
249
|
+
} else {
|
|
250
|
+
// Re-auth grants that omit refresh_token must clear any stale stored
|
|
251
|
+
// token — otherwise refresh attempts will use invalid credentials.
|
|
252
|
+
await backend.delete(refreshPath);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Retrieve the stored access token for a connection from the secure-key backend.
|
|
258
|
+
* Returns undefined if no token is stored.
|
|
259
|
+
*/
|
|
260
|
+
export async function getStoredAccessToken(
|
|
261
|
+
backend: SecureKeyBackend,
|
|
262
|
+
connectionId: string
|
|
263
|
+
): Promise<string | undefined> {
|
|
264
|
+
return backend.get(oauthConnectionAccessTokenPath(connectionId));
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Retrieve the stored refresh token for a connection from the secure-key backend.
|
|
269
|
+
* Returns undefined if no token is stored.
|
|
270
|
+
*/
|
|
271
|
+
export async function getStoredRefreshToken(
|
|
272
|
+
backend: SecureKeyBackend,
|
|
273
|
+
connectionId: string
|
|
274
|
+
): Promise<string | undefined> {
|
|
275
|
+
return backend.get(oauthConnectionRefreshTokenPath(connectionId));
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Delete all OAuth tokens (access + refresh) for a connection from the
|
|
280
|
+
* secure-key backend. Returns the individual deletion results.
|
|
281
|
+
*/
|
|
282
|
+
export async function deleteOAuthTokens(
|
|
283
|
+
backend: SecureKeyBackend,
|
|
284
|
+
connectionId: string
|
|
285
|
+
): Promise<{
|
|
286
|
+
accessTokenResult: "deleted" | "not-found" | "error";
|
|
287
|
+
refreshTokenResult: "deleted" | "not-found" | "error";
|
|
288
|
+
}> {
|
|
289
|
+
// Delete sequentially to avoid lost updates — the encrypted store uses
|
|
290
|
+
// read-modify-write, so concurrent deletes can restore a deleted key.
|
|
291
|
+
const accessTokenResult = await backend.delete(oauthConnectionAccessTokenPath(connectionId));
|
|
292
|
+
const refreshTokenResult = await backend.delete(oauthConnectionRefreshTokenPath(connectionId));
|
|
293
|
+
return { accessTokenResult, refreshTokenResult };
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Store a refreshed access token in the secure-key backend and update
|
|
298
|
+
* connection metadata. Returns the new access token on success.
|
|
299
|
+
*
|
|
300
|
+
* This is the portable portion of the post-refresh persistence logic.
|
|
301
|
+
* Callers are responsible for updating their connection store (e.g. SQLite)
|
|
302
|
+
* with the new expiresAt and hasRefreshToken values.
|
|
303
|
+
*/
|
|
304
|
+
export async function persistRefreshedTokens(
|
|
305
|
+
backend: SecureKeyBackend,
|
|
306
|
+
connectionId: string,
|
|
307
|
+
result: {
|
|
308
|
+
accessToken: string;
|
|
309
|
+
refreshToken?: string;
|
|
310
|
+
expiresIn?: number | null;
|
|
311
|
+
}
|
|
312
|
+
): Promise<{
|
|
313
|
+
accessToken: string;
|
|
314
|
+
expiresAt: number | null;
|
|
315
|
+
hasRefreshToken: boolean;
|
|
316
|
+
}> {
|
|
317
|
+
const accessPath = oauthConnectionAccessTokenPath(connectionId);
|
|
318
|
+
if (!(await backend.set(accessPath, result.accessToken))) {
|
|
319
|
+
throw new Error(
|
|
320
|
+
`Failed to store refreshed access token for connection ${connectionId}`
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (result.refreshToken) {
|
|
325
|
+
const refreshPath = oauthConnectionRefreshTokenPath(connectionId);
|
|
326
|
+
if (!(await backend.set(refreshPath, result.refreshToken))) {
|
|
327
|
+
throw new Error(
|
|
328
|
+
`Failed to store refreshed refresh token for connection ${connectionId}`
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
const expiresAt = computeExpiresAt(result.expiresIn);
|
|
334
|
+
|
|
335
|
+
return {
|
|
336
|
+
accessToken: result.accessToken,
|
|
337
|
+
expiresAt,
|
|
338
|
+
hasRefreshToken: !!result.refreshToken,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static credential metadata persistence primitives.
|
|
3
|
+
*
|
|
4
|
+
* Provides a portable, path-parameterized metadata store for local static
|
|
5
|
+
* credential records. This module has NO dependency on the assistant daemon,
|
|
6
|
+
* platform helpers, or any service-specific code — callers supply the file
|
|
7
|
+
* path and this module handles versioned JSON persistence with atomic writes.
|
|
8
|
+
*
|
|
9
|
+
* The assistant's `metadata-store.ts` wires in the platform-specific data
|
|
10
|
+
* directory and re-exports convenience functions that delegate here.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { randomUUID } from "node:crypto";
|
|
14
|
+
import {
|
|
15
|
+
existsSync,
|
|
16
|
+
mkdirSync,
|
|
17
|
+
readFileSync,
|
|
18
|
+
renameSync,
|
|
19
|
+
writeFileSync,
|
|
20
|
+
} from "node:fs";
|
|
21
|
+
import { dirname, join } from "node:path";
|
|
22
|
+
|
|
23
|
+
import type { InjectionTemplate, StaticCredentialRecord } from "./index.js";
|
|
24
|
+
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// On-disk schema
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
|
|
29
|
+
/** Current on-disk schema version. */
|
|
30
|
+
const CURRENT_VERSION = 5;
|
|
31
|
+
|
|
32
|
+
interface MetadataFile {
|
|
33
|
+
version: typeof CURRENT_VERSION;
|
|
34
|
+
credentials: StaticCredentialRecord[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Returned when the on-disk file has a version we don't understand.
|
|
39
|
+
* Callers that mutate state must check for this to avoid overwriting
|
|
40
|
+
* data written by a newer version of the app.
|
|
41
|
+
*/
|
|
42
|
+
interface UnknownVersionResult {
|
|
43
|
+
readonly unknownVersion: true;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
type LoadResult = MetadataFile | UnknownVersionResult;
|
|
47
|
+
|
|
48
|
+
function isUnknownVersion(r: LoadResult): r is UnknownVersionResult {
|
|
49
|
+
return "unknownVersion" in r;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Validation & migration helpers
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Returns true if a value looks like a valid credential record (has required fields).
|
|
58
|
+
* Filters out corrupted or incomplete entries during migration.
|
|
59
|
+
*/
|
|
60
|
+
function isValidCredentialRecord(
|
|
61
|
+
record: unknown
|
|
62
|
+
): record is Record<string, unknown> {
|
|
63
|
+
if (typeof record !== "object" || record == null) return false;
|
|
64
|
+
const r = record as Record<string, unknown>;
|
|
65
|
+
return (
|
|
66
|
+
typeof r.credentialId === "string" &&
|
|
67
|
+
typeof r.service === "string" &&
|
|
68
|
+
typeof r.field === "string" &&
|
|
69
|
+
typeof r.createdAt === "number" &&
|
|
70
|
+
typeof r.updatedAt === "number"
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Migrate any record to v5 by stripping OAuth-specific fields that are
|
|
76
|
+
* now exclusively managed by the SQLite oauth-store.
|
|
77
|
+
*/
|
|
78
|
+
function migrateRecordToV5(
|
|
79
|
+
record: Record<string, unknown>
|
|
80
|
+
): StaticCredentialRecord {
|
|
81
|
+
return {
|
|
82
|
+
credentialId: record.credentialId as string,
|
|
83
|
+
service: record.service as string,
|
|
84
|
+
field: record.field as string,
|
|
85
|
+
allowedTools: Array.isArray(record.allowedTools)
|
|
86
|
+
? (record.allowedTools as string[])
|
|
87
|
+
: [],
|
|
88
|
+
allowedDomains: Array.isArray(record.allowedDomains)
|
|
89
|
+
? (record.allowedDomains as string[])
|
|
90
|
+
: [],
|
|
91
|
+
usageDescription:
|
|
92
|
+
typeof record.usageDescription === "string"
|
|
93
|
+
? record.usageDescription
|
|
94
|
+
: undefined,
|
|
95
|
+
alias: typeof record.alias === "string" ? record.alias : undefined,
|
|
96
|
+
injectionTemplates: Array.isArray(record.injectionTemplates)
|
|
97
|
+
? (record.injectionTemplates as InjectionTemplate[])
|
|
98
|
+
: undefined,
|
|
99
|
+
createdAt: record.createdAt as number,
|
|
100
|
+
updatedAt: record.updatedAt as number,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
// Filesystem helpers (inlined to avoid assistant-specific imports)
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
|
|
108
|
+
function ensureDir(dir: string): void {
|
|
109
|
+
if (!existsSync(dir)) {
|
|
110
|
+
mkdirSync(dir, { recursive: true });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function readTextFileSync(path: string): string | null {
|
|
115
|
+
try {
|
|
116
|
+
if (!existsSync(path)) return null;
|
|
117
|
+
return readFileSync(path, "utf-8");
|
|
118
|
+
} catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Core store implementation
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
|
|
127
|
+
function loadFile(
|
|
128
|
+
metadataPath: string,
|
|
129
|
+
saveFileFn: (data: MetadataFile, path: string) => void
|
|
130
|
+
): LoadResult {
|
|
131
|
+
const raw = readTextFileSync(metadataPath);
|
|
132
|
+
if (raw == null) {
|
|
133
|
+
return { version: CURRENT_VERSION, credentials: [] };
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
const data = JSON.parse(raw);
|
|
137
|
+
if (typeof data !== "object" || data == null) {
|
|
138
|
+
return { version: CURRENT_VERSION, credentials: [] };
|
|
139
|
+
}
|
|
140
|
+
const fileVersion = typeof data.version === "number" ? data.version : 1;
|
|
141
|
+
if (
|
|
142
|
+
fileVersion !== 1 &&
|
|
143
|
+
fileVersion !== 2 &&
|
|
144
|
+
fileVersion !== 3 &&
|
|
145
|
+
fileVersion !== 4 &&
|
|
146
|
+
fileVersion !== 5
|
|
147
|
+
) {
|
|
148
|
+
// Unrecognized version (future, fractional, negative, zero) — refuse to touch it
|
|
149
|
+
return { unknownVersion: true };
|
|
150
|
+
}
|
|
151
|
+
const rawCredentials: unknown[] = Array.isArray(data.credentials)
|
|
152
|
+
? data.credentials
|
|
153
|
+
: [];
|
|
154
|
+
// Filter out malformed entries that lack required fields
|
|
155
|
+
const validRecords = rawCredentials.filter(isValidCredentialRecord);
|
|
156
|
+
|
|
157
|
+
if (fileVersion < CURRENT_VERSION) {
|
|
158
|
+
// Migrate all older versions to v5 by stripping OAuth-specific fields
|
|
159
|
+
// and removing ghost refresh_token records
|
|
160
|
+
const filtered = validRecords.filter(
|
|
161
|
+
(r) => (r as Record<string, unknown>).field !== "refresh_token"
|
|
162
|
+
);
|
|
163
|
+
const credentials = filtered.map(migrateRecordToV5);
|
|
164
|
+
const migrated: MetadataFile = { version: CURRENT_VERSION, credentials };
|
|
165
|
+
try {
|
|
166
|
+
saveFileFn(migrated, metadataPath);
|
|
167
|
+
} catch {
|
|
168
|
+
/* persist failed — will retry on next write */
|
|
169
|
+
}
|
|
170
|
+
return migrated;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return {
|
|
174
|
+
version: CURRENT_VERSION,
|
|
175
|
+
credentials: (validRecords as unknown) as StaticCredentialRecord[],
|
|
176
|
+
};
|
|
177
|
+
} catch {
|
|
178
|
+
// Corrupted / unparseable file — treat as empty to avoid data loss on next write
|
|
179
|
+
return { version: CURRENT_VERSION, credentials: [] };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function saveFile(data: MetadataFile, path: string): void {
|
|
184
|
+
const dir = dirname(path);
|
|
185
|
+
ensureDir(dir);
|
|
186
|
+
const tmpPath = join(dir, `.tmp-${randomUUID()}`);
|
|
187
|
+
writeFileSync(tmpPath, JSON.stringify(data, null, 2), "utf-8");
|
|
188
|
+
renameSync(tmpPath, path);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
// Policy input for upsert
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
|
|
195
|
+
/** Policy fields that can be set or updated when upserting a credential. */
|
|
196
|
+
export interface StaticCredentialPolicyInput {
|
|
197
|
+
allowedTools?: string[];
|
|
198
|
+
allowedDomains?: string[];
|
|
199
|
+
usageDescription?: string;
|
|
200
|
+
/** Pass `null` to explicitly clear a previously-set alias. */
|
|
201
|
+
alias?: string | null;
|
|
202
|
+
/** Pass `null` to explicitly clear injection templates. */
|
|
203
|
+
injectionTemplates?: InjectionTemplate[] | null;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
// StaticCredentialMetadataStore
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Portable, path-parameterized metadata store for local static credentials.
|
|
212
|
+
*
|
|
213
|
+
* Callers supply the file path; this class handles versioned JSON persistence,
|
|
214
|
+
* schema migration, and CRUD operations. It has no dependency on the assistant
|
|
215
|
+
* daemon or platform-specific code.
|
|
216
|
+
*/
|
|
217
|
+
export class StaticCredentialMetadataStore {
|
|
218
|
+
private metadataPath: string;
|
|
219
|
+
|
|
220
|
+
constructor(metadataPath: string) {
|
|
221
|
+
this.metadataPath = metadataPath;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/** Update the metadata file path (primarily for testing). */
|
|
225
|
+
setPath(path: string): void {
|
|
226
|
+
this.metadataPath = path;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** Get the current metadata file path. */
|
|
230
|
+
getPath(): string {
|
|
231
|
+
return this.metadataPath;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Throws if the metadata file has an unrecognized version.
|
|
236
|
+
* Call this before performing irreversible keychain operations
|
|
237
|
+
* so the operation fails cleanly before any side effects.
|
|
238
|
+
*/
|
|
239
|
+
assertWritable(): void {
|
|
240
|
+
const result = loadFile(this.metadataPath, saveFile);
|
|
241
|
+
if (isUnknownVersion(result)) {
|
|
242
|
+
throw new Error(
|
|
243
|
+
"Credential metadata file has an unrecognized version; refusing to mutate to avoid data loss"
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Create or update a credential metadata record.
|
|
250
|
+
* If a record with the same service+field exists, it is updated.
|
|
251
|
+
*/
|
|
252
|
+
upsert(
|
|
253
|
+
service: string,
|
|
254
|
+
field: string,
|
|
255
|
+
policy?: StaticCredentialPolicyInput
|
|
256
|
+
): StaticCredentialRecord {
|
|
257
|
+
const result = loadFile(this.metadataPath, saveFile);
|
|
258
|
+
if (isUnknownVersion(result)) {
|
|
259
|
+
throw new Error(
|
|
260
|
+
"Credential metadata file has an unrecognized version; refusing to mutate to avoid data loss"
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
const data = result;
|
|
264
|
+
const now = Date.now();
|
|
265
|
+
|
|
266
|
+
const existing = data.credentials.find(
|
|
267
|
+
(c) => c.service === service && c.field === field
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
if (existing) {
|
|
271
|
+
if (policy?.allowedTools !== undefined)
|
|
272
|
+
existing.allowedTools = policy.allowedTools;
|
|
273
|
+
if (policy?.allowedDomains !== undefined)
|
|
274
|
+
existing.allowedDomains = policy.allowedDomains;
|
|
275
|
+
if (policy?.usageDescription !== undefined)
|
|
276
|
+
existing.usageDescription = policy.usageDescription;
|
|
277
|
+
if (policy?.alias !== undefined) {
|
|
278
|
+
if (policy.alias == null) {
|
|
279
|
+
delete existing.alias;
|
|
280
|
+
} else {
|
|
281
|
+
existing.alias = policy.alias;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (policy?.injectionTemplates !== undefined) {
|
|
285
|
+
if (policy.injectionTemplates == null) {
|
|
286
|
+
delete existing.injectionTemplates;
|
|
287
|
+
} else {
|
|
288
|
+
existing.injectionTemplates = policy.injectionTemplates;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
existing.updatedAt = now;
|
|
292
|
+
saveFile(data, this.metadataPath);
|
|
293
|
+
return existing;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const record: StaticCredentialRecord = {
|
|
297
|
+
credentialId: randomUUID(),
|
|
298
|
+
service,
|
|
299
|
+
field,
|
|
300
|
+
allowedTools: policy?.allowedTools ?? [],
|
|
301
|
+
allowedDomains: policy?.allowedDomains ?? [],
|
|
302
|
+
usageDescription: policy?.usageDescription,
|
|
303
|
+
alias: policy?.alias ?? undefined,
|
|
304
|
+
injectionTemplates: policy?.injectionTemplates ?? undefined,
|
|
305
|
+
createdAt: now,
|
|
306
|
+
updatedAt: now,
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
data.credentials.push(record);
|
|
310
|
+
saveFile(data, this.metadataPath);
|
|
311
|
+
return record;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Get metadata for a credential by service and field.
|
|
316
|
+
*/
|
|
317
|
+
getByServiceField(
|
|
318
|
+
service: string,
|
|
319
|
+
field: string
|
|
320
|
+
): StaticCredentialRecord | undefined {
|
|
321
|
+
const result = loadFile(this.metadataPath, saveFile);
|
|
322
|
+
if (isUnknownVersion(result)) return undefined;
|
|
323
|
+
return result.credentials.find(
|
|
324
|
+
(c) => c.service === service && c.field === field
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Get metadata for a credential by its opaque ID.
|
|
330
|
+
*/
|
|
331
|
+
getById(credentialId: string): StaticCredentialRecord | undefined {
|
|
332
|
+
const result = loadFile(this.metadataPath, saveFile);
|
|
333
|
+
if (isUnknownVersion(result)) return undefined;
|
|
334
|
+
return result.credentials.find((c) => c.credentialId === credentialId);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* List all credential metadata records.
|
|
339
|
+
*/
|
|
340
|
+
list(): StaticCredentialRecord[] {
|
|
341
|
+
const result = loadFile(this.metadataPath, saveFile);
|
|
342
|
+
if (isUnknownVersion(result)) return [];
|
|
343
|
+
return result.credentials;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Delete metadata for a credential.
|
|
348
|
+
*/
|
|
349
|
+
delete(service: string, field: string): boolean {
|
|
350
|
+
const result = loadFile(this.metadataPath, saveFile);
|
|
351
|
+
if (isUnknownVersion(result)) {
|
|
352
|
+
throw new Error(
|
|
353
|
+
"Credential metadata file has an unrecognized version; refusing to mutate to avoid data loss"
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
const data = result;
|
|
357
|
+
const idx = data.credentials.findIndex(
|
|
358
|
+
(c) => c.service === service && c.field === field
|
|
359
|
+
);
|
|
360
|
+
if (idx === -1) return false;
|
|
361
|
+
data.credentials.splice(idx, 1);
|
|
362
|
+
saveFile(data, this.metadataPath);
|
|
363
|
+
return true;
|
|
364
|
+
}
|
|
365
|
+
}
|