@vibesdotdev/config 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -0
- package/SPEC.md +71 -0
- package/dist/adapters/cli/flags.d.ts +75 -0
- package/dist/adapters/cli/flags.d.ts.map +1 -0
- package/dist/adapters/cli/flags.js +221 -0
- package/dist/adapters/cli/flags.js.map +1 -0
- package/dist/adapters/cli/index.d.ts +12 -0
- package/dist/adapters/cli/index.d.ts.map +1 -0
- package/dist/adapters/cli/index.js +9 -0
- package/dist/adapters/cli/index.js.map +1 -0
- package/dist/adapters/cli/mappings.d.ts +17 -0
- package/dist/adapters/cli/mappings.d.ts.map +1 -0
- package/dist/adapters/cli/mappings.js +32 -0
- package/dist/adapters/cli/mappings.js.map +1 -0
- package/dist/adapters/cli/prompts.d.ts +28 -0
- package/dist/adapters/cli/prompts.d.ts.map +1 -0
- package/dist/adapters/cli/prompts.js +55 -0
- package/dist/adapters/cli/prompts.js.map +1 -0
- package/dist/adapters/cli/schemas/flags.schema.d.ts +8 -0
- package/dist/adapters/cli/schemas/flags.schema.d.ts.map +1 -0
- package/dist/adapters/cli/schemas/flags.schema.js +2 -0
- package/dist/adapters/cli/schemas/flags.schema.js.map +1 -0
- package/dist/adapters/cli/schemas/mappings.schema.d.ts +2 -0
- package/dist/adapters/cli/schemas/mappings.schema.d.ts.map +1 -0
- package/dist/adapters/cli/schemas/mappings.schema.js +2 -0
- package/dist/adapters/cli/schemas/mappings.schema.js.map +1 -0
- package/dist/adapters/cli/schemas/prompts.schema.d.ts +5 -0
- package/dist/adapters/cli/schemas/prompts.schema.d.ts.map +1 -0
- package/dist/adapters/cli/schemas/prompts.schema.js +2 -0
- package/dist/adapters/cli/schemas/prompts.schema.js.map +1 -0
- package/dist/adapters/cli/schemas/wizard.schema.d.ts +19 -0
- package/dist/adapters/cli/schemas/wizard.schema.d.ts.map +1 -0
- package/dist/adapters/cli/schemas/wizard.schema.js +2 -0
- package/dist/adapters/cli/schemas/wizard.schema.js.map +1 -0
- package/dist/adapters/cli/wizard.d.ts +33 -0
- package/dist/adapters/cli/wizard.d.ts.map +1 -0
- package/dist/adapters/cli/wizard.js +77 -0
- package/dist/adapters/cli/wizard.js.map +1 -0
- package/dist/browser/index.d.ts +7 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +4 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/cli/settings.descriptor.d.ts +9 -0
- package/dist/cli/settings.descriptor.d.ts.map +1 -0
- package/dist/cli/settings.descriptor.js +18 -0
- package/dist/cli/settings.descriptor.js.map +1 -0
- package/dist/cli/types.d.ts +57 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +9 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/client/index.d.ts +19 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +145 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/storage.d.ts +48 -0
- package/dist/client/storage.d.ts.map +1 -0
- package/dist/client/storage.js +46 -0
- package/dist/client/storage.js.map +1 -0
- package/dist/collection/collection.d.ts +46 -0
- package/dist/collection/collection.d.ts.map +1 -0
- package/dist/collection/collection.js +93 -0
- package/dist/collection/collection.js.map +1 -0
- package/dist/collection/index.d.ts +6 -0
- package/dist/collection/index.d.ts.map +1 -0
- package/dist/collection/index.js +5 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/common/index.d.ts +7 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +4 -0
- package/dist/common/index.js.map +1 -0
- package/dist/config.context.descriptor.d.ts +21 -0
- package/dist/config.context.descriptor.d.ts.map +1 -0
- package/dist/config.context.descriptor.js +11 -0
- package/dist/config.context.descriptor.js.map +1 -0
- package/dist/config.plugin.d.ts +15 -0
- package/dist/config.plugin.d.ts.map +1 -0
- package/dist/config.plugin.js +166 -0
- package/dist/config.plugin.js.map +1 -0
- package/dist/crud/base-types.d.ts +10 -0
- package/dist/crud/base-types.d.ts.map +1 -0
- package/dist/crud/base-types.js +10 -0
- package/dist/crud/base-types.js.map +1 -0
- package/dist/crud/index.d.ts +4 -0
- package/dist/crud/index.d.ts.map +1 -0
- package/dist/crud/index.js +2 -0
- package/dist/crud/index.js.map +1 -0
- package/dist/crud/schemas/base-types.schema.d.ts +19 -0
- package/dist/crud/schemas/base-types.schema.d.ts.map +1 -0
- package/dist/crud/schemas/base-types.schema.js +2 -0
- package/dist/crud/schemas/base-types.schema.js.map +1 -0
- package/dist/crud/schemas/shared.schema.d.ts +13 -0
- package/dist/crud/schemas/shared.schema.d.ts.map +1 -0
- package/dist/crud/schemas/shared.schema.js +2 -0
- package/dist/crud/schemas/shared.schema.js.map +1 -0
- package/dist/crud/shared.d.ts +8 -0
- package/dist/crud/shared.d.ts.map +1 -0
- package/dist/crud/shared.js +8 -0
- package/dist/crud/shared.js.map +1 -0
- package/dist/crud/types.d.ts +250 -0
- package/dist/crud/types.d.ts.map +1 -0
- package/dist/crud/types.js +22 -0
- package/dist/crud/types.js.map +1 -0
- package/dist/docs/environment.docs.descriptor.d.ts +4 -0
- package/dist/docs/environment.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/environment.docs.descriptor.js +383 -0
- package/dist/docs/environment.docs.descriptor.js.map +1 -0
- package/dist/docs/manifests.docs.descriptor.d.ts +4 -0
- package/dist/docs/manifests.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/manifests.docs.descriptor.js +503 -0
- package/dist/docs/manifests.docs.descriptor.js.map +1 -0
- package/dist/docs/validation.docs.descriptor.d.ts +4 -0
- package/dist/docs/validation.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/validation.docs.descriptor.js +441 -0
- package/dist/docs/validation.docs.descriptor.js.map +1 -0
- package/dist/doctor.d.ts +42 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +119 -0
- package/dist/doctor.js.map +1 -0
- package/dist/env.d.ts +28 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +75 -0
- package/dist/env.js.map +1 -0
- package/dist/env.runtime.d.ts +19 -0
- package/dist/env.runtime.d.ts.map +1 -0
- package/dist/env.runtime.js +37 -0
- package/dist/env.runtime.js.map +1 -0
- package/dist/environment/current.d.ts +32 -0
- package/dist/environment/current.d.ts.map +1 -0
- package/dist/environment/current.js +91 -0
- package/dist/environment/current.js.map +1 -0
- package/dist/environment/environment.config.descriptor.d.ts +11 -0
- package/dist/environment/environment.config.descriptor.d.ts.map +1 -0
- package/dist/environment/environment.config.descriptor.js +51 -0
- package/dist/environment/environment.config.descriptor.js.map +1 -0
- package/dist/environment/environment.config.schema.d.ts +47 -0
- package/dist/environment/environment.config.schema.d.ts.map +1 -0
- package/dist/environment/environment.config.schema.js +19 -0
- package/dist/environment/environment.config.schema.js.map +1 -0
- package/dist/environment/environment.local.descriptor.d.ts +11 -0
- package/dist/environment/environment.local.descriptor.d.ts.map +1 -0
- package/dist/environment/environment.local.descriptor.js +42 -0
- package/dist/environment/environment.local.descriptor.js.map +1 -0
- package/dist/environment/environment.plugin.d.ts +9 -0
- package/dist/environment/environment.plugin.d.ts.map +1 -0
- package/dist/environment/environment.plugin.js +27 -0
- package/dist/environment/environment.plugin.js.map +1 -0
- package/dist/environment/environment.production.descriptor.d.ts +10 -0
- package/dist/environment/environment.production.descriptor.d.ts.map +1 -0
- package/dist/environment/environment.production.descriptor.js +37 -0
- package/dist/environment/environment.production.descriptor.js.map +1 -0
- package/dist/environment/environment.staging.descriptor.d.ts +11 -0
- package/dist/environment/environment.staging.descriptor.d.ts.map +1 -0
- package/dist/environment/environment.staging.descriptor.js +22 -0
- package/dist/environment/environment.staging.descriptor.js.map +1 -0
- package/dist/environment/index.d.ts +8 -0
- package/dist/environment/index.d.ts.map +1 -0
- package/dist/environment/index.js +9 -0
- package/dist/environment/index.js.map +1 -0
- package/dist/environment/kinds/environment.default.d.ts +23 -0
- package/dist/environment/kinds/environment.default.d.ts.map +1 -0
- package/dist/environment/kinds/environment.default.js +49 -0
- package/dist/environment/kinds/environment.default.js.map +1 -0
- package/dist/environment/kinds/environment.interface.d.ts +7 -0
- package/dist/environment/kinds/environment.interface.d.ts.map +1 -0
- package/dist/environment/kinds/environment.interface.js +7 -0
- package/dist/environment/kinds/environment.interface.js.map +1 -0
- package/dist/environment/kinds/environment.kind.d.ts +10 -0
- package/dist/environment/kinds/environment.kind.d.ts.map +1 -0
- package/dist/environment/kinds/environment.kind.js +57 -0
- package/dist/environment/kinds/environment.kind.js.map +1 -0
- package/dist/environment/kinds/environment.schema.d.ts +34 -0
- package/dist/environment/kinds/environment.schema.d.ts.map +1 -0
- package/dist/environment/kinds/environment.schema.js +46 -0
- package/dist/environment/kinds/environment.schema.js.map +1 -0
- package/dist/environment/kinds/index.d.ts +8 -0
- package/dist/environment/kinds/index.d.ts.map +1 -0
- package/dist/environment/kinds/index.js +7 -0
- package/dist/environment/kinds/index.js.map +1 -0
- package/dist/environment/kinds/schemas/environment.interface.schema.d.ts +11 -0
- package/dist/environment/kinds/schemas/environment.interface.schema.d.ts.map +1 -0
- package/dist/environment/kinds/schemas/environment.interface.schema.js +2 -0
- package/dist/environment/kinds/schemas/environment.interface.schema.js.map +1 -0
- package/dist/environment/kinds/schemas/environment.schema.d.ts +30 -0
- package/dist/environment/kinds/schemas/environment.schema.d.ts.map +1 -0
- package/dist/environment/kinds/schemas/environment.schema.js +2 -0
- package/dist/environment/kinds/schemas/environment.schema.js.map +1 -0
- package/dist/environment/schemas/current.schema.d.ts +20 -0
- package/dist/environment/schemas/current.schema.d.ts.map +1 -0
- package/dist/environment/schemas/current.schema.js +2 -0
- package/dist/environment/schemas/current.schema.js.map +1 -0
- package/dist/environment/schemas/environment.config.schema.d.ts +4 -0
- package/dist/environment/schemas/environment.config.schema.d.ts.map +1 -0
- package/dist/environment/schemas/environment.config.schema.js +2 -0
- package/dist/environment/schemas/environment.config.schema.js.map +1 -0
- package/dist/extensions/index.d.ts +8 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +8 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/registry.d.ts +41 -0
- package/dist/extensions/registry.d.ts.map +1 -0
- package/dist/extensions/registry.js +142 -0
- package/dist/extensions/registry.js.map +1 -0
- package/dist/extensions/types.d.ts +101 -0
- package/dist/extensions/types.d.ts.map +1 -0
- package/dist/extensions/types.js +8 -0
- package/dist/extensions/types.js.map +1 -0
- package/dist/form/core/field-resolver.d.ts +42 -0
- package/dist/form/core/field-resolver.d.ts.map +1 -0
- package/dist/form/core/field-resolver.js +293 -0
- package/dist/form/core/field-resolver.js.map +1 -0
- package/dist/form/core/groups.d.ts +20 -0
- package/dist/form/core/groups.d.ts.map +1 -0
- package/dist/form/core/groups.js +69 -0
- package/dist/form/core/groups.js.map +1 -0
- package/dist/form/core/index.d.ts +8 -0
- package/dist/form/core/index.d.ts.map +1 -0
- package/dist/form/core/index.js +6 -0
- package/dist/form/core/index.js.map +1 -0
- package/dist/form/core/nested-utils.d.ts +40 -0
- package/dist/form/core/nested-utils.d.ts.map +1 -0
- package/dist/form/core/nested-utils.js +98 -0
- package/dist/form/core/nested-utils.js.map +1 -0
- package/dist/form/core/schemas/validation.schema.d.ts +9 -0
- package/dist/form/core/schemas/validation.schema.d.ts.map +1 -0
- package/dist/form/core/schemas/validation.schema.js +2 -0
- package/dist/form/core/schemas/validation.schema.js.map +1 -0
- package/dist/form/core/types.d.ts +103 -0
- package/dist/form/core/types.d.ts.map +1 -0
- package/dist/form/core/types.js +2 -0
- package/dist/form/core/types.js.map +1 -0
- package/dist/form/core/validation.d.ts +23 -0
- package/dist/form/core/validation.d.ts.map +1 -0
- package/dist/form/core/validation.js +103 -0
- package/dist/form/core/validation.js.map +1 -0
- package/dist/form/core/visibility.d.ts +37 -0
- package/dist/form/core/visibility.d.ts.map +1 -0
- package/dist/form/core/visibility.js +128 -0
- package/dist/form/core/visibility.js.map +1 -0
- package/dist/form/index.d.ts +8 -0
- package/dist/form/index.d.ts.map +1 -0
- package/dist/form/index.js +2 -0
- package/dist/form/index.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/loader/cli/index.d.ts +61 -0
- package/dist/loader/cli/index.d.ts.map +1 -0
- package/dist/loader/cli/index.js +263 -0
- package/dist/loader/cli/index.js.map +1 -0
- package/dist/loader/cli/loaders.d.ts +13 -0
- package/dist/loader/cli/loaders.d.ts.map +1 -0
- package/dist/loader/cli/loaders.js +132 -0
- package/dist/loader/cli/loaders.js.map +1 -0
- package/dist/loader/cli/types.d.ts +152 -0
- package/dist/loader/cli/types.d.ts.map +1 -0
- package/dist/loader/cli/types.js +5 -0
- package/dist/loader/cli/types.js.map +1 -0
- package/dist/loader/cli/utils.d.ts +53 -0
- package/dist/loader/cli/utils.d.ts.map +1 -0
- package/dist/loader/cli/utils.js +198 -0
- package/dist/loader/cli/utils.js.map +1 -0
- package/dist/loader/client.d.ts +18 -0
- package/dist/loader/client.d.ts.map +1 -0
- package/dist/loader/client.js +109 -0
- package/dist/loader/client.js.map +1 -0
- package/dist/loader/discovery.d.ts +48 -0
- package/dist/loader/discovery.d.ts.map +1 -0
- package/dist/loader/discovery.js +253 -0
- package/dist/loader/discovery.js.map +1 -0
- package/dist/loader/file-loader.d.ts +17 -0
- package/dist/loader/file-loader.d.ts.map +1 -0
- package/dist/loader/file-loader.js +237 -0
- package/dist/loader/file-loader.js.map +1 -0
- package/dist/loader/index.d.ts +9 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +8 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/index.server.d.ts +66 -0
- package/dist/loader/index.server.d.ts.map +1 -0
- package/dist/loader/index.server.js +256 -0
- package/dist/loader/index.server.js.map +1 -0
- package/dist/loader/merge.d.ts +88 -0
- package/dist/loader/merge.d.ts.map +1 -0
- package/dist/loader/merge.js +301 -0
- package/dist/loader/merge.js.map +1 -0
- package/dist/loader/schemas/merge.schema.d.ts +8 -0
- package/dist/loader/schemas/merge.schema.d.ts.map +1 -0
- package/dist/loader/schemas/merge.schema.js +2 -0
- package/dist/loader/schemas/merge.schema.js.map +1 -0
- package/dist/loader/schemas/validation.schema.d.ts +17 -0
- package/dist/loader/schemas/validation.schema.d.ts.map +1 -0
- package/dist/loader/schemas/validation.schema.js +2 -0
- package/dist/loader/schemas/validation.schema.js.map +1 -0
- package/dist/loader/server.d.ts +3 -0
- package/dist/loader/server.d.ts.map +1 -0
- package/dist/loader/server.js +2 -0
- package/dist/loader/server.js.map +1 -0
- package/dist/loader/types.d.ts +136 -0
- package/dist/loader/types.d.ts.map +1 -0
- package/dist/loader/types.js +24 -0
- package/dist/loader/types.js.map +1 -0
- package/dist/loader/validation.d.ts +59 -0
- package/dist/loader/validation.d.ts.map +1 -0
- package/dist/loader/validation.js +218 -0
- package/dist/loader/validation.js.map +1 -0
- package/dist/manifest/builder.d.ts +172 -0
- package/dist/manifest/builder.d.ts.map +1 -0
- package/dist/manifest/builder.js +336 -0
- package/dist/manifest/builder.js.map +1 -0
- package/dist/manifest/config-manifest.d.ts +199 -0
- package/dist/manifest/config-manifest.d.ts.map +1 -0
- package/dist/manifest/config-manifest.js +388 -0
- package/dist/manifest/config-manifest.js.map +1 -0
- package/dist/manifest/index.d.ts +10 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +20 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/schema.d.ts +460 -0
- package/dist/manifest/schema.d.ts.map +1 -0
- package/dist/manifest/schema.js +187 -0
- package/dist/manifest/schema.js.map +1 -0
- package/dist/manifest/schemas/builder.schema.d.ts +20 -0
- package/dist/manifest/schemas/builder.schema.d.ts.map +1 -0
- package/dist/manifest/schemas/builder.schema.js +2 -0
- package/dist/manifest/schemas/builder.schema.js.map +1 -0
- package/dist/manifest/schemas/config-manifest.schema.d.ts +2 -0
- package/dist/manifest/schemas/config-manifest.schema.d.ts.map +1 -0
- package/dist/manifest/schemas/config-manifest.schema.js +2 -0
- package/dist/manifest/schemas/config-manifest.schema.js.map +1 -0
- package/dist/manifest/schemas/schema.schema.d.ts +83 -0
- package/dist/manifest/schemas/schema.schema.d.ts.map +1 -0
- package/dist/manifest/schemas/schema.schema.js +2 -0
- package/dist/manifest/schemas/schema.schema.js.map +1 -0
- package/dist/manifest/types.d.ts +563 -0
- package/dist/manifest/types.d.ts.map +1 -0
- package/dist/manifest/types.js +9 -0
- package/dist/manifest/types.js.map +1 -0
- package/dist/routing/index.d.ts +29 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +35 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/merge.d.ts +164 -0
- package/dist/routing/merge.d.ts.map +1 -0
- package/dist/routing/merge.js +460 -0
- package/dist/routing/merge.js.map +1 -0
- package/dist/routing/registry.d.ts +145 -0
- package/dist/routing/registry.d.ts.map +1 -0
- package/dist/routing/registry.js +459 -0
- package/dist/routing/registry.js.map +1 -0
- package/dist/routing/schemas/merge.schema.d.ts +5 -0
- package/dist/routing/schemas/merge.schema.d.ts.map +1 -0
- package/dist/routing/schemas/merge.schema.js +2 -0
- package/dist/routing/schemas/merge.schema.js.map +1 -0
- package/dist/routing/types.d.ts +358 -0
- package/dist/routing/types.d.ts.map +1 -0
- package/dist/routing/types.js +89 -0
- package/dist/routing/types.js.map +1 -0
- package/dist/schema/extend-zod.d.ts +137 -0
- package/dist/schema/extend-zod.d.ts.map +1 -0
- package/dist/schema/extend-zod.js +243 -0
- package/dist/schema/extend-zod.js.map +1 -0
- package/dist/schema/index.d.ts +9 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +10 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/references.d.ts +9 -0
- package/dist/schema/references.d.ts.map +1 -0
- package/dist/schema/references.js +9 -0
- package/dist/schema/references.js.map +1 -0
- package/dist/schema/resolver.d.ts +45 -0
- package/dist/schema/resolver.d.ts.map +1 -0
- package/dist/schema/resolver.js +267 -0
- package/dist/schema/resolver.js.map +1 -0
- package/dist/schema/schemas/extend-zod.schema.d.ts +16 -0
- package/dist/schema/schemas/extend-zod.schema.d.ts.map +1 -0
- package/dist/schema/schemas/extend-zod.schema.js +2 -0
- package/dist/schema/schemas/extend-zod.schema.js.map +1 -0
- package/dist/schema/schemas/references.schema.d.ts +70 -0
- package/dist/schema/schemas/references.schema.d.ts.map +1 -0
- package/dist/schema/schemas/references.schema.js +2 -0
- package/dist/schema/schemas/references.schema.js.map +1 -0
- package/dist/schemas/collection.d.ts +31 -0
- package/dist/schemas/collection.d.ts.map +1 -0
- package/dist/schemas/collection.js +22 -0
- package/dist/schemas/collection.js.map +1 -0
- package/dist/schemas/config-manifest-descriptor.d.ts +495 -0
- package/dist/schemas/config-manifest-descriptor.d.ts.map +1 -0
- package/dist/schemas/config-manifest-descriptor.js +210 -0
- package/dist/schemas/config-manifest-descriptor.js.map +1 -0
- package/dist/schemas/config-registry-state.d.ts +8 -0
- package/dist/schemas/config-registry-state.d.ts.map +1 -0
- package/dist/schemas/config-registry-state.js +6 -0
- package/dist/schemas/config-registry-state.js.map +1 -0
- package/dist/schemas/doctor.schema.d.ts +25 -0
- package/dist/schemas/doctor.schema.d.ts.map +1 -0
- package/dist/schemas/doctor.schema.js +2 -0
- package/dist/schemas/doctor.schema.js.map +1 -0
- package/dist/schemas/index.d.ts +8 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +21 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +4 -0
- package/dist/server/index.js.map +1 -0
- package/dist/services/config-accessor.d.ts +40 -0
- package/dist/services/config-accessor.d.ts.map +1 -0
- package/dist/services/config-accessor.js +180 -0
- package/dist/services/config-accessor.js.map +1 -0
- package/dist/services/config-storage/index.d.ts +8 -0
- package/dist/services/config-storage/index.d.ts.map +1 -0
- package/dist/services/config-storage/index.js +7 -0
- package/dist/services/config-storage/index.js.map +1 -0
- package/dist/services/config-storage/service.d.ts +63 -0
- package/dist/services/config-storage/service.d.ts.map +1 -0
- package/dist/services/config-storage/service.js +234 -0
- package/dist/services/config-storage/service.js.map +1 -0
- package/dist/services/config.d.ts +3 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +30 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/encryption.d.ts +114 -0
- package/dist/services/encryption.d.ts.map +1 -0
- package/dist/services/encryption.js +232 -0
- package/dist/services/encryption.js.map +1 -0
- package/dist/services/index.d.ts +12 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +16 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/loader/loader.descriptor.d.ts +103 -0
- package/dist/services/loader/loader.descriptor.d.ts.map +1 -0
- package/dist/services/loader/loader.descriptor.js +60 -0
- package/dist/services/loader/loader.descriptor.js.map +1 -0
- package/dist/services/loader/loader.impl.cloud.d.ts +55 -0
- package/dist/services/loader/loader.impl.cloud.d.ts.map +1 -0
- package/dist/services/loader/loader.impl.cloud.js +182 -0
- package/dist/services/loader/loader.impl.cloud.js.map +1 -0
- package/dist/services/loader/loader.impl.consumer.d.ts +48 -0
- package/dist/services/loader/loader.impl.consumer.d.ts.map +1 -0
- package/dist/services/loader/loader.impl.consumer.js +175 -0
- package/dist/services/loader/loader.impl.consumer.js.map +1 -0
- package/dist/services/loader/loader.impl.consumer.local-first.d.ts +59 -0
- package/dist/services/loader/loader.impl.consumer.local-first.d.ts.map +1 -0
- package/dist/services/loader/loader.impl.consumer.local-first.js +347 -0
- package/dist/services/loader/loader.impl.consumer.local-first.js.map +1 -0
- package/dist/services/manifest-utils.d.ts +47 -0
- package/dist/services/manifest-utils.d.ts.map +1 -0
- package/dist/services/manifest-utils.js +105 -0
- package/dist/services/manifest-utils.js.map +1 -0
- package/dist/services/schemas/config-accessor.schema.d.ts +10 -0
- package/dist/services/schemas/config-accessor.schema.d.ts.map +1 -0
- package/dist/services/schemas/config-accessor.schema.js +2 -0
- package/dist/services/schemas/config-accessor.schema.js.map +1 -0
- package/dist/services/schemas/encryption.schema.d.ts +22 -0
- package/dist/services/schemas/encryption.schema.d.ts.map +1 -0
- package/dist/services/schemas/encryption.schema.js +2 -0
- package/dist/services/schemas/encryption.schema.js.map +1 -0
- package/dist/services/schemas/manifest-utils.schema.d.ts +4 -0
- package/dist/services/schemas/manifest-utils.schema.d.ts.map +1 -0
- package/dist/services/schemas/manifest-utils.schema.js +2 -0
- package/dist/services/schemas/manifest-utils.schema.js.map +1 -0
- package/dist/settings/assemble.d.ts +28 -0
- package/dist/settings/assemble.d.ts.map +1 -0
- package/dist/settings/assemble.js +30 -0
- package/dist/settings/assemble.js.map +1 -0
- package/dist/settings/index.d.ts +10 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +10 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/settings-section.schema.d.ts +49 -0
- package/dist/settings/settings-section.schema.d.ts.map +1 -0
- package/dist/settings/settings-section.schema.js +70 -0
- package/dist/settings/settings-section.schema.js.map +1 -0
- package/dist/storage/adapter.d.ts +11 -0
- package/dist/storage/adapter.d.ts.map +1 -0
- package/dist/storage/adapter.js +8 -0
- package/dist/storage/adapter.js.map +1 -0
- package/dist/storage/index.d.ts +8 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +8 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/schemas.d.ts +257 -0
- package/dist/storage/schemas.d.ts.map +1 -0
- package/dist/storage/schemas.js +179 -0
- package/dist/storage/schemas.js.map +1 -0
- package/dist/storage/types.d.ts +74 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +7 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/system-constants.d.ts +95 -0
- package/dist/system-constants.d.ts.map +1 -0
- package/dist/system-constants.js +110 -0
- package/dist/system-constants.js.map +1 -0
- package/package.json +417 -0
- package/src/adapters/cli/flags.ts +260 -0
- package/src/adapters/cli/index.ts +24 -0
- package/src/adapters/cli/mappings.ts +43 -0
- package/src/adapters/cli/prompts.ts +70 -0
- package/src/adapters/cli/schemas/flags.schema.ts +8 -0
- package/src/adapters/cli/schemas/mappings.schema.ts +3 -0
- package/src/adapters/cli/schemas/prompts.schema.ts +4 -0
- package/src/adapters/cli/schemas/wizard.schema.ts +21 -0
- package/src/adapters/cli/wizard.ts +106 -0
- package/src/adapters/web/components/ManifestForm.svelte +817 -0
- package/src/browser/index.ts +86 -0
- package/src/cli/settings.descriptor.ts +23 -0
- package/src/cli/types.ts +59 -0
- package/src/client/index.ts +169 -0
- package/src/client/storage.ts +76 -0
- package/src/collection/collection.ts +121 -0
- package/src/collection/index.ts +6 -0
- package/src/common/index.ts +86 -0
- package/src/config.context.descriptor.ts +12 -0
- package/src/config.plugin.ts +214 -0
- package/src/crud/base-types.ts +10 -0
- package/src/crud/index.ts +15 -0
- package/src/crud/schemas/base-types.schema.ts +20 -0
- package/src/crud/schemas/shared.schema.ts +14 -0
- package/src/crud/shared.ts +8 -0
- package/src/crud/types.ts +299 -0
- package/src/docs/environment.docs.descriptor.ts +385 -0
- package/src/docs/manifests.docs.descriptor.ts +505 -0
- package/src/docs/validation.docs.descriptor.ts +443 -0
- package/src/doctor.ts +143 -0
- package/src/env.runtime.ts +49 -0
- package/src/env.ts +91 -0
- package/src/environment/current.ts +108 -0
- package/src/environment/environment.config.descriptor.ts +60 -0
- package/src/environment/environment.config.schema.ts +24 -0
- package/src/environment/environment.local.descriptor.ts +45 -0
- package/src/environment/environment.plugin.ts +31 -0
- package/src/environment/environment.production.descriptor.ts +40 -0
- package/src/environment/environment.staging.descriptor.ts +25 -0
- package/src/environment/index.ts +22 -0
- package/src/environment/kinds/environment.default.ts +57 -0
- package/src/environment/kinds/environment.interface.ts +10 -0
- package/src/environment/kinds/environment.kind.ts +69 -0
- package/src/environment/kinds/environment.schema.ts +57 -0
- package/src/environment/kinds/index.ts +8 -0
- package/src/environment/kinds/schemas/environment.interface.schema.ts +11 -0
- package/src/environment/kinds/schemas/environment.schema.ts +24 -0
- package/src/environment/schemas/current.schema.ts +21 -0
- package/src/environment/schemas/environment.config.schema.ts +3 -0
- package/src/extensions/index.ts +26 -0
- package/src/extensions/registry.ts +179 -0
- package/src/extensions/types.ts +123 -0
- package/src/form/core/field-resolver.ts +380 -0
- package/src/form/core/groups.ts +96 -0
- package/src/form/core/index.ts +41 -0
- package/src/form/core/nested-utils.ts +115 -0
- package/src/form/core/schemas/validation.schema.ts +9 -0
- package/src/form/core/types.ts +115 -0
- package/src/form/core/validation.ts +137 -0
- package/src/form/core/visibility.ts +172 -0
- package/src/form/index.ts +36 -0
- package/src/index.ts +69 -0
- package/src/js-yaml.d.ts +4 -0
- package/src/loader/cli/index.ts +386 -0
- package/src/loader/cli/loaders.ts +153 -0
- package/src/loader/cli/types.ts +181 -0
- package/src/loader/cli/utils.ts +236 -0
- package/src/loader/client.ts +140 -0
- package/src/loader/discovery.ts +291 -0
- package/src/loader/file-loader.ts +262 -0
- package/src/loader/index.server.ts +389 -0
- package/src/loader/index.ts +18 -0
- package/src/loader/merge.ts +366 -0
- package/src/loader/schemas/merge.schema.ts +8 -0
- package/src/loader/schemas/validation.schema.ts +18 -0
- package/src/loader/server.ts +15 -0
- package/src/loader/types.ts +142 -0
- package/src/loader/validation.ts +261 -0
- package/src/manifest/builder.ts +452 -0
- package/src/manifest/config-manifest.ts +482 -0
- package/src/manifest/index.ts +92 -0
- package/src/manifest/schema.ts +249 -0
- package/src/manifest/schemas/builder.schema.ts +33 -0
- package/src/manifest/schemas/config-manifest.schema.ts +1 -0
- package/src/manifest/schemas/schema.schema.ts +99 -0
- package/src/manifest/types.ts +726 -0
- package/src/routing/index.ts +105 -0
- package/src/routing/merge.ts +589 -0
- package/src/routing/registry.ts +595 -0
- package/src/routing/schemas/merge.schema.ts +6 -0
- package/src/routing/types.ts +470 -0
- package/src/schema/extend-zod.ts +289 -0
- package/src/schema/index.ts +44 -0
- package/src/schema/references.ts +21 -0
- package/src/schema/resolver.ts +343 -0
- package/src/schema/schemas/extend-zod.schema.ts +16 -0
- package/src/schema/schemas/references.schema.ts +86 -0
- package/src/schemas/collection.ts +38 -0
- package/src/schemas/config-manifest-descriptor.ts +259 -0
- package/src/schemas/config-registry-state.ts +13 -0
- package/src/schemas/doctor.schema.ts +27 -0
- package/src/schemas/index.ts +53 -0
- package/src/server/index.ts +4 -0
- package/src/services/config-accessor.ts +218 -0
- package/src/services/config-storage/index.ts +8 -0
- package/src/services/config-storage/service.ts +355 -0
- package/src/services/config.ts +37 -0
- package/src/services/encryption.ts +260 -0
- package/src/services/index.ts +34 -0
- package/src/services/loader/loader.descriptor.ts +96 -0
- package/src/services/loader/loader.impl.cloud.ts +214 -0
- package/src/services/loader/loader.impl.consumer.local-first.ts +417 -0
- package/src/services/loader/loader.impl.consumer.ts +213 -0
- package/src/services/manifest-utils.ts +119 -0
- package/src/services/schemas/config-accessor.schema.ts +11 -0
- package/src/services/schemas/encryption.schema.ts +23 -0
- package/src/services/schemas/manifest-utils.schema.ts +4 -0
- package/src/settings/assemble.ts +46 -0
- package/src/settings/index.ts +19 -0
- package/src/settings/settings-section.schema.ts +84 -0
- package/src/storage/adapter.ts +12 -0
- package/src/storage/index.ts +48 -0
- package/src/storage/schemas.ts +215 -0
- package/src/storage/types.ts +88 -0
- package/src/system-constants.ts +121 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Storage Service
|
|
3
|
+
*
|
|
4
|
+
* Unified configuration storage using runtime-resolved storage adapter.
|
|
5
|
+
* Provides credentials and config document CRUD through SqlDatabaseHandle.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { randomUUID } from 'crypto';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
|
|
11
|
+
interface SqlStatement<T, P extends unknown[] = unknown[]> {
|
|
12
|
+
all(...params: P): T[];
|
|
13
|
+
get(...params: P): T | undefined;
|
|
14
|
+
run(...params: P): void;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface SqlDatabaseHandle {
|
|
18
|
+
exec(sql: string): void;
|
|
19
|
+
query<T, P extends unknown[] = unknown[]>(sql: string): SqlStatement<T, P>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const CONFIG_DB_PATH = join('.vibes', 'config.db');
|
|
23
|
+
const CONFIG_NAMESPACE = 'config';
|
|
24
|
+
|
|
25
|
+
export type ConfigScope = 'global' | 'local' | 'project';
|
|
26
|
+
|
|
27
|
+
export interface CredentialsInput {
|
|
28
|
+
environment: string;
|
|
29
|
+
apiKey?: string;
|
|
30
|
+
sessionToken?: string;
|
|
31
|
+
refreshToken?: string;
|
|
32
|
+
userId?: string;
|
|
33
|
+
email?: string;
|
|
34
|
+
name?: string;
|
|
35
|
+
expiresAt?: string;
|
|
36
|
+
metadata?: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ConfigDocumentInput {
|
|
40
|
+
scope: ConfigScope;
|
|
41
|
+
content: Record<string, unknown>;
|
|
42
|
+
namespace?: string;
|
|
43
|
+
encrypted?: boolean;
|
|
44
|
+
changeReason?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface CredentialsRow {
|
|
48
|
+
id: string;
|
|
49
|
+
environment: string;
|
|
50
|
+
api_key: string | null;
|
|
51
|
+
session_token: string | null;
|
|
52
|
+
refresh_token: string | null;
|
|
53
|
+
user_id: string | null;
|
|
54
|
+
email: string | null;
|
|
55
|
+
name: string | null;
|
|
56
|
+
expires_at: string | null;
|
|
57
|
+
metadata: string | null;
|
|
58
|
+
created_at: string;
|
|
59
|
+
updated_at: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface ConfigDocumentRow {
|
|
63
|
+
id: string;
|
|
64
|
+
scope: ConfigScope;
|
|
65
|
+
namespace: string | null;
|
|
66
|
+
content: string;
|
|
67
|
+
version: number;
|
|
68
|
+
encrypted: number;
|
|
69
|
+
created_at: string;
|
|
70
|
+
updated_at: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
type StorageAdapter = {
|
|
74
|
+
getDatabaseConnection: () => unknown;
|
|
75
|
+
ensureReady: () => Promise<void>;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
type Runtime = {
|
|
79
|
+
query: (kind: string) => {
|
|
80
|
+
withId: (id: string) => {
|
|
81
|
+
resolve: () => Promise<StorageAdapter>;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
async function createStorageAdapter(runtime: Runtime): Promise<StorageAdapter> {
|
|
87
|
+
const adapter = await runtime.query('storage/adapter').withId(CONFIG_NAMESPACE).resolve();
|
|
88
|
+
await adapter.ensureReady();
|
|
89
|
+
return adapter;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function getSqlHandle(adapter: StorageAdapter): SqlDatabaseHandle {
|
|
93
|
+
return adapter.getDatabaseConnection() as SqlDatabaseHandle;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {
|
|
97
|
+
const result = { ...target };
|
|
98
|
+
for (const key of Object.keys(source)) {
|
|
99
|
+
const sourceValue = source[key];
|
|
100
|
+
const targetValue = result[key];
|
|
101
|
+
if (
|
|
102
|
+
sourceValue !== null &&
|
|
103
|
+
typeof sourceValue === 'object' &&
|
|
104
|
+
!Array.isArray(sourceValue) &&
|
|
105
|
+
targetValue !== null &&
|
|
106
|
+
typeof targetValue === 'object' &&
|
|
107
|
+
!Array.isArray(targetValue)
|
|
108
|
+
) {
|
|
109
|
+
result[key] = deepMerge(targetValue as Record<string, unknown>, sourceValue as Record<string, unknown>);
|
|
110
|
+
} else {
|
|
111
|
+
result[key] = sourceValue;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export class ConfigStorageService {
|
|
118
|
+
private sql: SqlDatabaseHandle | null = null;
|
|
119
|
+
private initPromise: Promise<void> | null = null;
|
|
120
|
+
private runtime: Runtime;
|
|
121
|
+
|
|
122
|
+
constructor(runtime: Runtime) {
|
|
123
|
+
this.runtime = runtime;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private async ensureInitialized(): Promise<SqlDatabaseHandle> {
|
|
127
|
+
if (this.sql) return this.sql;
|
|
128
|
+
if (!this.initPromise) {
|
|
129
|
+
this.initPromise = (async () => {
|
|
130
|
+
const adapter = await createStorageAdapter(this.runtime);
|
|
131
|
+
this.sql = getSqlHandle(adapter);
|
|
132
|
+
this.createTables();
|
|
133
|
+
})();
|
|
134
|
+
}
|
|
135
|
+
await this.initPromise;
|
|
136
|
+
return this.sql!;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private createTables(): void {
|
|
140
|
+
if (!this.sql) return;
|
|
141
|
+
this.sql.exec(`
|
|
142
|
+
CREATE TABLE IF NOT EXISTS credentials (
|
|
143
|
+
id TEXT PRIMARY KEY,
|
|
144
|
+
environment TEXT NOT NULL UNIQUE,
|
|
145
|
+
api_key TEXT,
|
|
146
|
+
session_token TEXT,
|
|
147
|
+
refresh_token TEXT,
|
|
148
|
+
user_id TEXT,
|
|
149
|
+
email TEXT,
|
|
150
|
+
name TEXT,
|
|
151
|
+
expires_at TEXT,
|
|
152
|
+
metadata TEXT,
|
|
153
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
154
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
155
|
+
);
|
|
156
|
+
CREATE INDEX IF NOT EXISTS idx_credentials_environment ON credentials(environment);
|
|
157
|
+
|
|
158
|
+
CREATE TABLE IF NOT EXISTS config_documents (
|
|
159
|
+
id TEXT PRIMARY KEY,
|
|
160
|
+
scope TEXT NOT NULL CHECK(scope IN ('global', 'local', 'project')),
|
|
161
|
+
namespace TEXT,
|
|
162
|
+
content TEXT NOT NULL DEFAULT '{}',
|
|
163
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
164
|
+
encrypted INTEGER NOT NULL DEFAULT 0,
|
|
165
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
166
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
167
|
+
UNIQUE(scope, namespace)
|
|
168
|
+
);
|
|
169
|
+
CREATE INDEX IF NOT EXISTS idx_config_documents_scope ON config_documents(scope);
|
|
170
|
+
CREATE INDEX IF NOT EXISTS idx_config_documents_namespace ON config_documents(namespace);
|
|
171
|
+
`);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async getCredentials(environment: string): Promise<CredentialsInput | null> {
|
|
175
|
+
const sql = await this.ensureInitialized();
|
|
176
|
+
const row = sql.query<CredentialsRow, [string]>('SELECT * FROM credentials WHERE environment = ?').get(environment);
|
|
177
|
+
if (!row) return null;
|
|
178
|
+
return {
|
|
179
|
+
environment: row.environment,
|
|
180
|
+
apiKey: row.api_key ?? undefined,
|
|
181
|
+
sessionToken: row.session_token ?? undefined,
|
|
182
|
+
refreshToken: row.refresh_token ?? undefined,
|
|
183
|
+
userId: row.user_id ?? undefined,
|
|
184
|
+
email: row.email ?? undefined,
|
|
185
|
+
name: row.name ?? undefined,
|
|
186
|
+
expiresAt: row.expires_at ?? undefined,
|
|
187
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async setCredentials(input: CredentialsInput): Promise<void> {
|
|
192
|
+
const sql = await this.ensureInitialized();
|
|
193
|
+
const now = new Date().toISOString();
|
|
194
|
+
const existing = sql.query<{ id: string }, [string]>('SELECT id FROM credentials WHERE environment = ?').get(input.environment);
|
|
195
|
+
if (existing) {
|
|
196
|
+
sql.query(
|
|
197
|
+
`UPDATE credentials SET
|
|
198
|
+
api_key = ?, session_token = ?, refresh_token = ?,
|
|
199
|
+
user_id = ?, email = ?, name = ?, expires_at = ?,
|
|
200
|
+
metadata = ?, updated_at = ?
|
|
201
|
+
WHERE environment = ?`
|
|
202
|
+
).run(
|
|
203
|
+
input.apiKey ?? null,
|
|
204
|
+
input.sessionToken ?? null,
|
|
205
|
+
input.refreshToken ?? null,
|
|
206
|
+
input.userId ?? null,
|
|
207
|
+
input.email ?? null,
|
|
208
|
+
input.name ?? null,
|
|
209
|
+
input.expiresAt ?? null,
|
|
210
|
+
input.metadata ? JSON.stringify(input.metadata) : null,
|
|
211
|
+
now,
|
|
212
|
+
input.environment
|
|
213
|
+
);
|
|
214
|
+
} else {
|
|
215
|
+
sql.query(
|
|
216
|
+
`INSERT INTO credentials
|
|
217
|
+
(id, environment, api_key, session_token, refresh_token,
|
|
218
|
+
user_id, email, name, expires_at, metadata, created_at, updated_at)
|
|
219
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
220
|
+
).run(
|
|
221
|
+
randomUUID(),
|
|
222
|
+
input.environment,
|
|
223
|
+
input.apiKey ?? null,
|
|
224
|
+
input.sessionToken ?? null,
|
|
225
|
+
input.refreshToken ?? null,
|
|
226
|
+
input.userId ?? null,
|
|
227
|
+
input.email ?? null,
|
|
228
|
+
input.name ?? null,
|
|
229
|
+
input.expiresAt ?? null,
|
|
230
|
+
input.metadata ? JSON.stringify(input.metadata) : null,
|
|
231
|
+
now,
|
|
232
|
+
now
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
async deleteCredentials(environment: string): Promise<void> {
|
|
238
|
+
const sql = await this.ensureInitialized();
|
|
239
|
+
sql.query('DELETE FROM credentials WHERE environment = ?').run(environment);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
async getDocument<T = Record<string, unknown>>(scope: ConfigScope, namespace: string | null = null): Promise<T | null> {
|
|
243
|
+
const sql = await this.ensureInitialized();
|
|
244
|
+
let row: ConfigDocumentRow | null;
|
|
245
|
+
if (namespace === null) {
|
|
246
|
+
row = sql.query<ConfigDocumentRow, [string]>('SELECT * FROM config_documents WHERE scope = ? AND namespace IS NULL').get(scope) ?? null;
|
|
247
|
+
} else {
|
|
248
|
+
row = sql.query<ConfigDocumentRow, [string, string]>('SELECT * FROM config_documents WHERE scope = ? AND namespace = ?').get(scope, namespace) ?? null;
|
|
249
|
+
}
|
|
250
|
+
if (!row) return null;
|
|
251
|
+
try {
|
|
252
|
+
return JSON.parse(row.content) as T;
|
|
253
|
+
} catch {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
async getDocumentMerged<T = Record<string, unknown>>(
|
|
259
|
+
scopes: ConfigScope[],
|
|
260
|
+
namespace: string | null = null
|
|
261
|
+
): Promise<{ config: T; sources: Array<{ scope: ConfigScope; version: number }> }> {
|
|
262
|
+
const sql = await this.ensureInitialized();
|
|
263
|
+
let merged: Record<string, unknown> = {};
|
|
264
|
+
const sources: Array<{ scope: ConfigScope; version: number }> = [];
|
|
265
|
+
for (const scope of scopes) {
|
|
266
|
+
let row: ConfigDocumentRow | null;
|
|
267
|
+
if (namespace === null) {
|
|
268
|
+
row = sql.query<ConfigDocumentRow, [string]>('SELECT * FROM config_documents WHERE scope = ? AND namespace IS NULL').get(scope) ?? null;
|
|
269
|
+
} else {
|
|
270
|
+
row = sql.query<ConfigDocumentRow, [string, string]>('SELECT * FROM config_documents WHERE scope = ? AND namespace = ?').get(scope, namespace) ?? null;
|
|
271
|
+
}
|
|
272
|
+
if (row) {
|
|
273
|
+
try {
|
|
274
|
+
const content = JSON.parse(row.content);
|
|
275
|
+
merged = deepMerge(merged, content);
|
|
276
|
+
sources.push({ scope, version: row.version });
|
|
277
|
+
} catch {
|
|
278
|
+
// Skip malformed content
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return { config: merged as T, sources };
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
async setDocument(input: ConfigDocumentInput): Promise<void> {
|
|
286
|
+
const sql = await this.ensureInitialized();
|
|
287
|
+
const now = new Date().toISOString();
|
|
288
|
+
const namespace = input.namespace ?? null;
|
|
289
|
+
let existing: ConfigDocumentRow | null;
|
|
290
|
+
if (namespace === null) {
|
|
291
|
+
existing = sql.query<ConfigDocumentRow, [string]>('SELECT * FROM config_documents WHERE scope = ? AND namespace IS NULL').get(input.scope) ?? null;
|
|
292
|
+
} else {
|
|
293
|
+
existing = sql.query<ConfigDocumentRow, [string, string]>('SELECT * FROM config_documents WHERE scope = ? AND namespace = ?').get(input.scope, namespace) ?? null;
|
|
294
|
+
}
|
|
295
|
+
const content = JSON.stringify(input.content);
|
|
296
|
+
const encrypted = input.encrypted ? 1 : 0;
|
|
297
|
+
if (existing) {
|
|
298
|
+
sql.query(
|
|
299
|
+
`UPDATE config_documents SET
|
|
300
|
+
content = ?, version = version + 1, encrypted = ?, updated_at = ?
|
|
301
|
+
WHERE id = ?`
|
|
302
|
+
).run(content, encrypted, now, existing.id);
|
|
303
|
+
} else {
|
|
304
|
+
sql.query(
|
|
305
|
+
`INSERT INTO config_documents
|
|
306
|
+
(id, scope, namespace, content, version, encrypted, created_at, updated_at)
|
|
307
|
+
VALUES (?, ?, ?, ?, 1, ?, ?, ?)`
|
|
308
|
+
).run(randomUUID(), input.scope, namespace, content, encrypted, now, now);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
async mergeDocument(
|
|
313
|
+
scope: ConfigScope,
|
|
314
|
+
content: Record<string, unknown>,
|
|
315
|
+
namespace: string | null = null,
|
|
316
|
+
changeReason?: string
|
|
317
|
+
): Promise<void> {
|
|
318
|
+
const existing = await this.getDocument<Record<string, unknown>>(scope, namespace);
|
|
319
|
+
const merged = deepMerge(existing || {}, content);
|
|
320
|
+
await this.setDocument({
|
|
321
|
+
scope,
|
|
322
|
+
namespace: namespace ?? undefined,
|
|
323
|
+
content: merged,
|
|
324
|
+
encrypted: false,
|
|
325
|
+
changeReason
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
async deleteDocument(scope: ConfigScope, namespace: string | null = null): Promise<void> {
|
|
330
|
+
const sql = await this.ensureInitialized();
|
|
331
|
+
if (namespace === null) {
|
|
332
|
+
sql.query('DELETE FROM config_documents WHERE scope = ? AND namespace IS NULL').run(scope);
|
|
333
|
+
} else {
|
|
334
|
+
sql.query('DELETE FROM config_documents WHERE scope = ? AND namespace = ?').run(scope, namespace);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
async close(): Promise<void> {
|
|
339
|
+
this.sql = null;
|
|
340
|
+
this.initPromise = null;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
let instance: ConfigStorageService | null = null;
|
|
345
|
+
|
|
346
|
+
export function getConfigStorageService(runtime: Runtime): ConfigStorageService {
|
|
347
|
+
if (!instance) {
|
|
348
|
+
instance = new ConfigStorageService(runtime);
|
|
349
|
+
}
|
|
350
|
+
return instance;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
export function resetConfigStorageService(): void {
|
|
354
|
+
instance = null;
|
|
355
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
|
|
5
|
+
const VIBES_CONFIG_DIR = join(homedir(), '.config', 'vibes');
|
|
6
|
+
const GLOBAL_CONFIG_FILE = join(VIBES_CONFIG_DIR, 'config.json');
|
|
7
|
+
|
|
8
|
+
function ensureConfigDir(): void {
|
|
9
|
+
if (!existsSync(VIBES_CONFIG_DIR)) {
|
|
10
|
+
mkdirSync(VIBES_CONFIG_DIR, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export async function loadConfigForScope(
|
|
15
|
+
scope: 'global' | 'project'
|
|
16
|
+
): Promise<Record<string, unknown>> {
|
|
17
|
+
ensureConfigDir();
|
|
18
|
+
if (scope === 'global' && existsSync(GLOBAL_CONFIG_FILE)) {
|
|
19
|
+
try {
|
|
20
|
+
const content = readFileSync(GLOBAL_CONFIG_FILE, 'utf-8');
|
|
21
|
+
return JSON.parse(content) as Record<string, unknown>;
|
|
22
|
+
} catch {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function saveConfigForScope(
|
|
30
|
+
config: Record<string, unknown>,
|
|
31
|
+
scope: 'global' | 'project'
|
|
32
|
+
): Promise<void> {
|
|
33
|
+
ensureConfigDir();
|
|
34
|
+
if (scope === 'global') {
|
|
35
|
+
writeFileSync(GLOBAL_CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Encryption Service
|
|
3
|
+
*
|
|
4
|
+
* Production-grade encryption for sensitive configuration values.
|
|
5
|
+
* Uses AES-256-GCM for authenticated encryption with PBKDF2 key derivation.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - AES-256-GCM authenticated encryption
|
|
9
|
+
* - PBKDF2 key derivation (100k iterations)
|
|
10
|
+
* - Random IV and salt generation
|
|
11
|
+
* - Constant-time comparison helpers
|
|
12
|
+
* - Browser and Node.js compatible (Web Crypto API)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { createHash, randomBytes, createCipheriv, createDecipheriv, pbkdf2Sync } from 'crypto';
|
|
16
|
+
|
|
17
|
+
// Algorithm constants
|
|
18
|
+
const ALGORITHM = 'aes-256-gcm';
|
|
19
|
+
const IV_LENGTH = 16; // 128 bits for GCM
|
|
20
|
+
const AUTH_TAG_LENGTH = 16; // 128 bits
|
|
21
|
+
const SALT_LENGTH = 32; // 256 bits
|
|
22
|
+
const KEY_LENGTH = 32; // 256 bits
|
|
23
|
+
const PBKDF2_ITERATIONS = 100_000;
|
|
24
|
+
|
|
25
|
+
import type { EncryptedValue, SerializedEncryptedValue, EncryptionOptions } from './schemas/encryption.schema.ts';
|
|
26
|
+
|
|
27
|
+
export type { EncryptedValue, SerializedEncryptedValue, EncryptionOptions } from './schemas/encryption.schema.ts';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Derive a 256-bit key from password and salt using PBKDF2.
|
|
31
|
+
*
|
|
32
|
+
* @param password - The encryption password/key
|
|
33
|
+
* @param salt - Random salt for key derivation
|
|
34
|
+
* @returns 32-byte derived key
|
|
35
|
+
*/
|
|
36
|
+
function deriveKey(password: string, salt: Buffer): Buffer {
|
|
37
|
+
return pbkdf2Sync(password, salt, PBKDF2_ITERATIONS, KEY_LENGTH, 'sha256');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Encrypt a string value using AES-256-GCM.
|
|
42
|
+
*
|
|
43
|
+
* @param value - The plaintext value to encrypt
|
|
44
|
+
* @param password - The encryption password/key
|
|
45
|
+
* @param options - Optional encryption parameters
|
|
46
|
+
* @returns EncryptedValue with all components needed for decryption
|
|
47
|
+
* @throws Error if encryption fails
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const encrypted = await encrypt('my-secret-api-key', 'my-master-password');
|
|
52
|
+
* // Store encrypted object
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export async function encrypt(
|
|
56
|
+
value: string,
|
|
57
|
+
password: string,
|
|
58
|
+
options: EncryptionOptions = {}
|
|
59
|
+
): Promise<EncryptedValue> {
|
|
60
|
+
if (!value) {
|
|
61
|
+
throw new Error('Cannot encrypt empty value');
|
|
62
|
+
}
|
|
63
|
+
if (!password) {
|
|
64
|
+
throw new Error('Encryption password is required');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Generate random salt and IV
|
|
68
|
+
const salt = options.salt ?? randomBytes(SALT_LENGTH);
|
|
69
|
+
const iv = options.iv ?? randomBytes(IV_LENGTH);
|
|
70
|
+
|
|
71
|
+
// Derive key from password
|
|
72
|
+
const key = deriveKey(password, salt);
|
|
73
|
+
|
|
74
|
+
// Encrypt
|
|
75
|
+
const cipher = createCipheriv(ALGORITHM, key, iv);
|
|
76
|
+
let encrypted = cipher.update(value, 'utf8', 'base64');
|
|
77
|
+
encrypted += cipher.final('base64');
|
|
78
|
+
const tag = cipher.getAuthTag();
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
ciphertext: encrypted,
|
|
82
|
+
iv: iv.toString('base64'),
|
|
83
|
+
salt: salt.toString('base64'),
|
|
84
|
+
tag: tag.toString('base64'),
|
|
85
|
+
algorithm: ALGORITHM,
|
|
86
|
+
iterations: PBKDF2_ITERATIONS
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Decrypt an encrypted value using AES-256-GCM.
|
|
92
|
+
*
|
|
93
|
+
* @param encrypted - The encrypted value object
|
|
94
|
+
* @param password - The encryption password/key
|
|
95
|
+
* @returns The decrypted plaintext value
|
|
96
|
+
* @throws Error if decryption fails (wrong password, corrupted data, etc.)
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const encrypted = {
|
|
101
|
+
* ciphertext: '...',
|
|
102
|
+
* iv: '...',
|
|
103
|
+
* salt: '...',
|
|
104
|
+
* tag: '...',
|
|
105
|
+
* algorithm: 'aes-256-gcm',
|
|
106
|
+
* iterations: 100000
|
|
107
|
+
* };
|
|
108
|
+
* const decrypted = await decrypt(encrypted, 'my-master-password');
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export async function decrypt(encrypted: EncryptedValue, password: string): Promise<string> {
|
|
112
|
+
if (!password) {
|
|
113
|
+
throw new Error('Decryption password is required');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Validate algorithm
|
|
117
|
+
if (encrypted.algorithm !== ALGORITHM) {
|
|
118
|
+
throw new Error(`Unsupported algorithm: ${encrypted.algorithm}`);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Decode components
|
|
122
|
+
const salt = Buffer.from(encrypted.salt, 'base64');
|
|
123
|
+
const iv = Buffer.from(encrypted.iv, 'base64');
|
|
124
|
+
const tag = Buffer.from(encrypted.tag, 'base64');
|
|
125
|
+
|
|
126
|
+
// Derive key
|
|
127
|
+
const key = deriveKey(password, salt);
|
|
128
|
+
|
|
129
|
+
// Decrypt
|
|
130
|
+
try {
|
|
131
|
+
const decipher = createDecipheriv(ALGORITHM, key, iv);
|
|
132
|
+
decipher.setAuthTag(tag);
|
|
133
|
+
let decrypted = decipher.update(encrypted.ciphertext, 'base64', 'utf8');
|
|
134
|
+
decrypted += decipher.final('utf8');
|
|
135
|
+
return decrypted;
|
|
136
|
+
} catch (error) {
|
|
137
|
+
throw new Error('Decryption failed: invalid password or corrupted data');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Serialize an encrypted value to a compact JSON object for storage.
|
|
143
|
+
*
|
|
144
|
+
* @param encrypted - The encrypted value
|
|
145
|
+
* @returns Compact serialized format
|
|
146
|
+
*/
|
|
147
|
+
export function serializeEncrypted(encrypted: EncryptedValue): SerializedEncryptedValue {
|
|
148
|
+
return {
|
|
149
|
+
v: 1,
|
|
150
|
+
ct: encrypted.ciphertext,
|
|
151
|
+
iv: encrypted.iv,
|
|
152
|
+
s: encrypted.salt,
|
|
153
|
+
t: encrypted.tag,
|
|
154
|
+
a: encrypted.algorithm,
|
|
155
|
+
i: encrypted.iterations
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Deserialize a compact JSON object back to EncryptedValue format.
|
|
161
|
+
*
|
|
162
|
+
* @param serialized - The serialized encrypted value
|
|
163
|
+
* @returns EncryptedValue object
|
|
164
|
+
*/
|
|
165
|
+
export function deserializeEncrypted(serialized: SerializedEncryptedValue): EncryptedValue {
|
|
166
|
+
return {
|
|
167
|
+
ciphertext: serialized.ct,
|
|
168
|
+
iv: serialized.iv,
|
|
169
|
+
salt: serialized.s,
|
|
170
|
+
tag: serialized.t,
|
|
171
|
+
algorithm: serialized.a,
|
|
172
|
+
iterations: serialized.i
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Encrypt a value and serialize it to a JSON string for storage.
|
|
178
|
+
*
|
|
179
|
+
* @param value - The plaintext value
|
|
180
|
+
* @param password - The encryption password
|
|
181
|
+
* @returns JSON string of serialized encrypted value
|
|
182
|
+
*/
|
|
183
|
+
export async function encryptToString(value: string, password: string): Promise<string> {
|
|
184
|
+
const encrypted = await encrypt(value, password);
|
|
185
|
+
const serialized = serializeEncrypted(encrypted);
|
|
186
|
+
return JSON.stringify(serialized);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Decrypt a value from its serialized JSON string format.
|
|
191
|
+
*
|
|
192
|
+
* @param encryptedString - JSON string from encryptToString
|
|
193
|
+
* @param password - The encryption password
|
|
194
|
+
* @returns The decrypted plaintext value
|
|
195
|
+
*/
|
|
196
|
+
export async function decryptFromString(encryptedString: string, password: string): Promise<string> {
|
|
197
|
+
const serialized = JSON.parse(encryptedString) as SerializedEncryptedValue;
|
|
198
|
+
const encrypted = deserializeEncrypted(serialized);
|
|
199
|
+
return decrypt(encrypted, password);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Generate a secure random password of the specified length.
|
|
204
|
+
*
|
|
205
|
+
* @param length - Password length (default: 32)
|
|
206
|
+
* @returns Base64-encoded random string
|
|
207
|
+
*/
|
|
208
|
+
export function generateSecurePassword(length = 32): string {
|
|
209
|
+
return randomBytes(length).toString('base64').slice(0, length);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Hash a password for storage using SHA-256.
|
|
214
|
+
* This is NOT for encryption keys - use only for password verification.
|
|
215
|
+
*
|
|
216
|
+
* @param password - The password to hash
|
|
217
|
+
* @returns SHA-256 hash as hex string
|
|
218
|
+
*/
|
|
219
|
+
export function hashPassword(password: string): string {
|
|
220
|
+
return createHash('sha256').update(password).digest('hex');
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Verify a password against a stored hash.
|
|
225
|
+
*
|
|
226
|
+
* @param password - The password to verify
|
|
227
|
+
* @param hash - The stored hash
|
|
228
|
+
* @returns True if the password matches
|
|
229
|
+
*/
|
|
230
|
+
export function verifyPassword(password: string, hash: string): boolean {
|
|
231
|
+
// Constant-time comparison to prevent timing attacks
|
|
232
|
+
const computed = hashPassword(password);
|
|
233
|
+
if (computed.length !== hash.length) return false;
|
|
234
|
+
|
|
235
|
+
let result = 0;
|
|
236
|
+
for (let i = 0; i < computed.length; i++) {
|
|
237
|
+
result |= computed.charCodeAt(i) ^ hash.charCodeAt(i);
|
|
238
|
+
}
|
|
239
|
+
return result === 0;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Check if a value appears to be an encrypted value.
|
|
244
|
+
*
|
|
245
|
+
* @param value - The value to check
|
|
246
|
+
* @returns True if the value looks like an encrypted config value
|
|
247
|
+
*/
|
|
248
|
+
export function isEncryptedValue(value: unknown): value is SerializedEncryptedValue {
|
|
249
|
+
if (typeof value !== 'object' || value === null) return false;
|
|
250
|
+
const v = value as SerializedEncryptedValue;
|
|
251
|
+
return (
|
|
252
|
+
v.v === 1 &&
|
|
253
|
+
typeof v.ct === 'string' &&
|
|
254
|
+
typeof v.iv === 'string' &&
|
|
255
|
+
typeof v.s === 'string' &&
|
|
256
|
+
typeof v.t === 'string' &&
|
|
257
|
+
typeof v.a === 'string' &&
|
|
258
|
+
typeof v.i === 'number'
|
|
259
|
+
);
|
|
260
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Services
|
|
3
|
+
*
|
|
4
|
+
* Higher-level services built on top of the config infrastructure.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Runtime-scoped config loader (replaces unified-loader.ts)
|
|
8
|
+
//
|
|
9
|
+
// IMPORTANT: do not re-export the consumer/cloud/local-first loader impls here.
|
|
10
|
+
// They are runtime-scoped and loaded lazily via dynamic import() in
|
|
11
|
+
// config.plugin.ts. Re-exporting them statically would let bundlers
|
|
12
|
+
// (e.g. workerd/cloudflare) walk the barrel and pull consumer-only code
|
|
13
|
+
// (localdb adapter) into worker bundles where it cannot resolve.
|
|
14
|
+
export {
|
|
15
|
+
configLoaderDescriptor
|
|
16
|
+
} from './loader/loader.descriptor.ts';
|
|
17
|
+
export type { ConfigLoaderInterface, LoadResult, SaveResult } from './loader/loader.descriptor.ts';
|
|
18
|
+
|
|
19
|
+
export { createConfigAccessor, createSyncConfigAccessor } from './config-accessor.ts';
|
|
20
|
+
export type { ConfigAccessor, ConfigAccessorInterface } from './config-accessor.ts';
|
|
21
|
+
|
|
22
|
+
export {
|
|
23
|
+
encrypt,
|
|
24
|
+
decrypt,
|
|
25
|
+
serializeEncrypted,
|
|
26
|
+
deserializeEncrypted,
|
|
27
|
+
encryptToString,
|
|
28
|
+
decryptFromString,
|
|
29
|
+
generateSecurePassword,
|
|
30
|
+
hashPassword,
|
|
31
|
+
verifyPassword,
|
|
32
|
+
isEncryptedValue
|
|
33
|
+
} from './encryption.ts';
|
|
34
|
+
export type { EncryptedValue, SerializedEncryptedValue, EncryptionOptions } from './encryption.ts';
|