@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,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Loader - Local-First Implementation
|
|
3
|
+
*
|
|
4
|
+
* Hybrid configuration loading using runtime-composed strategy.
|
|
5
|
+
* Implements local-first policy through runtime resolution, not internal branching.
|
|
6
|
+
*
|
|
7
|
+
* Scope: { hardware: ['consumer'], qualifiers: { storage: 'local-first' }}
|
|
8
|
+
*
|
|
9
|
+
* This replaces the syncDirection branching in UnifiedConfigLoader with a pure
|
|
10
|
+
* runtime-composed approach. The cloud client is resolved via runtime.query when needed.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { createRuntimeImplementation, getVibesRuntime } from '@vibesdotdev/runtime';
|
|
14
|
+
import type { ConfigManifest } from '../../manifest/types.ts';
|
|
15
|
+
import type { VibesRuntime } from '@vibesdotdev/runtime';
|
|
16
|
+
import type { ConfigLoaderInterface, LoadResult, SaveResult } from './loader.descriptor.ts';
|
|
17
|
+
import type { StorageDocumentStoreInterface } from '@vibesdotdev/storage/interfaces';
|
|
18
|
+
import * as z from 'zod/v4';
|
|
19
|
+
|
|
20
|
+
/** Local storage adapter interface */
|
|
21
|
+
interface LocalConfigStorageAdapter<T> {
|
|
22
|
+
load(): Promise<T | null>;
|
|
23
|
+
save(data: T): Promise<void>;
|
|
24
|
+
exists(): Promise<boolean>;
|
|
25
|
+
delete(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Deferred LocalDB adapter - loads the real adapter dynamically */
|
|
29
|
+
function createDeferredLocalDBAdapter<T>(options: {
|
|
30
|
+
scope: 'project' | 'global';
|
|
31
|
+
namespace: string;
|
|
32
|
+
encrypt?: boolean;
|
|
33
|
+
}): LocalConfigStorageAdapter<T> {
|
|
34
|
+
let docStore: StorageDocumentStoreInterface<T> | null = null;
|
|
35
|
+
|
|
36
|
+
async function getDocStore(): Promise<StorageDocumentStoreInterface<T>> {
|
|
37
|
+
if (!docStore) {
|
|
38
|
+
interface AdapterModule {
|
|
39
|
+
default: {
|
|
40
|
+
impl: {
|
|
41
|
+
configure(config: { basePath: string }): void;
|
|
42
|
+
documentStore<U>(
|
|
43
|
+
namespace: string,
|
|
44
|
+
schema: z.ZodType<U>
|
|
45
|
+
): StorageDocumentStoreInterface<U>;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const modulePath = '@vibesdotdev/storage-adapter-localdb/localdb.adapter.impl';
|
|
50
|
+
const { default: implementation } = (await import(
|
|
51
|
+
/* @vite-ignore */ modulePath
|
|
52
|
+
)) as AdapterModule;
|
|
53
|
+
const adapter = implementation.impl;
|
|
54
|
+
|
|
55
|
+
const basePath =
|
|
56
|
+
options.scope === 'project'
|
|
57
|
+
? `${process.cwd()}/.vibes`
|
|
58
|
+
: `${process.env.HOME ?? '~'}/.vibes`;
|
|
59
|
+
|
|
60
|
+
adapter.configure({ basePath });
|
|
61
|
+
|
|
62
|
+
docStore = adapter.documentStore<T>(options.namespace, z.unknown() as z.ZodType<T>);
|
|
63
|
+
}
|
|
64
|
+
return docStore;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
async load(): Promise<T | null> {
|
|
69
|
+
const store = await getDocStore();
|
|
70
|
+
return store.load();
|
|
71
|
+
},
|
|
72
|
+
async save(data: T): Promise<void> {
|
|
73
|
+
const store = await getDocStore();
|
|
74
|
+
return store.save(data);
|
|
75
|
+
},
|
|
76
|
+
async exists(): Promise<boolean> {
|
|
77
|
+
const store = await getDocStore();
|
|
78
|
+
return store.exists();
|
|
79
|
+
},
|
|
80
|
+
async delete(): Promise<void> {
|
|
81
|
+
const store = await getDocStore();
|
|
82
|
+
return store.delete();
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Cloud client interface - resolved from runtime */
|
|
88
|
+
interface CloudSettingsClient {
|
|
89
|
+
get<T>(namespace: string): Promise<T | null>;
|
|
90
|
+
set<T>(namespace: string, data: T): Promise<void>;
|
|
91
|
+
delete(namespace: string): Promise<void>;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Create a fetch-based cloud settings client */
|
|
95
|
+
function createFetchCloudClient(options: {
|
|
96
|
+
baseUrl: string;
|
|
97
|
+
getAuthToken: () => Promise<string | null>;
|
|
98
|
+
}): CloudSettingsClient {
|
|
99
|
+
const { baseUrl, getAuthToken } = options;
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
async get<T>(namespace: string): Promise<T | null> {
|
|
103
|
+
const token = await getAuthToken();
|
|
104
|
+
if (!token) return null;
|
|
105
|
+
|
|
106
|
+
const res = await fetch(`${baseUrl}/api/settings/${encodeURIComponent(namespace)}`, {
|
|
107
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
if (!res.ok) return null;
|
|
111
|
+
return res.json() as Promise<T>;
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
async set<T>(namespace: string, data: T): Promise<void> {
|
|
115
|
+
const token = await getAuthToken();
|
|
116
|
+
if (!token) throw new Error('Not authenticated');
|
|
117
|
+
|
|
118
|
+
await fetch(`${baseUrl}/api/settings/${encodeURIComponent(namespace)}`, {
|
|
119
|
+
method: 'PUT',
|
|
120
|
+
headers: {
|
|
121
|
+
'Content-Type': 'application/json',
|
|
122
|
+
Authorization: `Bearer ${token}`
|
|
123
|
+
},
|
|
124
|
+
body: JSON.stringify(data)
|
|
125
|
+
});
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
async delete(namespace: string): Promise<void> {
|
|
129
|
+
const token = await getAuthToken();
|
|
130
|
+
if (!token) throw new Error('Not authenticated');
|
|
131
|
+
|
|
132
|
+
await fetch(`${baseUrl}/api/settings/${encodeURIComponent(namespace)}`, {
|
|
133
|
+
method: 'DELETE',
|
|
134
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Local-First Config Loader
|
|
142
|
+
*
|
|
143
|
+
* Hybrid implementation that composes local and cloud storage through runtime.
|
|
144
|
+
* No internal branching - cloud client is resolved via runtime.query.
|
|
145
|
+
*
|
|
146
|
+
* Load strategy: local first, then cloud (with optional caching)
|
|
147
|
+
* Save strategy: local always, cloud when authenticated
|
|
148
|
+
*/
|
|
149
|
+
export class LocalFirstConfigLoader implements ConfigLoaderInterface {
|
|
150
|
+
private runtime: VibesRuntime;
|
|
151
|
+
private localAdapters = new Map<string, LocalConfigStorageAdapter<unknown>>();
|
|
152
|
+
|
|
153
|
+
constructor() {
|
|
154
|
+
this.runtime = getVibesRuntime();
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Resolve cloud client from runtime when needed
|
|
159
|
+
* Returns null if cloud is not available (not authenticated)
|
|
160
|
+
*/
|
|
161
|
+
private async resolveCloudClient(): Promise<CloudSettingsClient | null> {
|
|
162
|
+
try {
|
|
163
|
+
// Query runtime for cloud storage adapter
|
|
164
|
+
const cloudAdapter = await this.runtime
|
|
165
|
+
.query('storage/adapter')
|
|
166
|
+
.matching({
|
|
167
|
+
qualifiers: { type: 'cloud', purpose: 'settings' }
|
|
168
|
+
})
|
|
169
|
+
.resolve();
|
|
170
|
+
|
|
171
|
+
if (cloudAdapter && typeof cloudAdapter === 'object') {
|
|
172
|
+
// Check if it has document store capabilities
|
|
173
|
+
if ('documentStore' in cloudAdapter) {
|
|
174
|
+
return this.wrapAdapterAsCloudClient(cloudAdapter);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Fallback: try to resolve from context/config
|
|
179
|
+
try {
|
|
180
|
+
const configContext = await this.runtime.context<{
|
|
181
|
+
cloudBaseUrl?: string;
|
|
182
|
+
getAuthToken?: () => Promise<string | null>;
|
|
183
|
+
}>('config');
|
|
184
|
+
if (configContext && typeof configContext === 'object') {
|
|
185
|
+
const baseUrl = configContext.cloudBaseUrl;
|
|
186
|
+
const getAuthToken = configContext.getAuthToken;
|
|
187
|
+
if (baseUrl && getAuthToken) {
|
|
188
|
+
return createFetchCloudClient({ baseUrl, getAuthToken });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
} catch {
|
|
192
|
+
// Config context not available
|
|
193
|
+
}
|
|
194
|
+
} catch {
|
|
195
|
+
// Cloud not available
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Wrap a storage adapter as cloud client interface
|
|
203
|
+
*/
|
|
204
|
+
private wrapAdapterAsCloudClient(adapter: object): CloudSettingsClient {
|
|
205
|
+
return {
|
|
206
|
+
async get<T>(namespace: string): Promise<T | null> {
|
|
207
|
+
// The adapter already has namespace baked in via documentStore()
|
|
208
|
+
const store = (adapter as { load?: () => Promise<T | null> }).load;
|
|
209
|
+
if (store) {
|
|
210
|
+
return store.call(adapter);
|
|
211
|
+
}
|
|
212
|
+
return null;
|
|
213
|
+
},
|
|
214
|
+
async set<T>(namespace: string, data: T): Promise<void> {
|
|
215
|
+
const save = (adapter as { save?: (data: T) => Promise<void> }).save;
|
|
216
|
+
if (save) {
|
|
217
|
+
return save.call(adapter, data);
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
async delete(namespace: string): Promise<void> {
|
|
221
|
+
const del = (adapter as { delete?: () => Promise<void> }).delete;
|
|
222
|
+
if (del) {
|
|
223
|
+
return del.call(adapter);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Load configuration: local first, then cloud
|
|
231
|
+
*/
|
|
232
|
+
async load<T>(manifest: ConfigManifest): Promise<LoadResult<T>> {
|
|
233
|
+
const namespace = manifest.storage.namespace;
|
|
234
|
+
|
|
235
|
+
try {
|
|
236
|
+
// Step 1: Try local first
|
|
237
|
+
const localAdapter = this.getLocalAdapter<T>(namespace, manifest);
|
|
238
|
+
const localData = await localAdapter.load();
|
|
239
|
+
|
|
240
|
+
if (localData !== null) {
|
|
241
|
+
return {
|
|
242
|
+
data: localData,
|
|
243
|
+
source: 'local',
|
|
244
|
+
inSync: true,
|
|
245
|
+
lastSyncedAt: null
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Step 2: Local empty, try cloud (resolved via runtime)
|
|
250
|
+
const cloudClient = await this.resolveCloudClient();
|
|
251
|
+
if (cloudClient) {
|
|
252
|
+
const cloudData = await cloudClient.get<T>(namespace);
|
|
253
|
+
if (cloudData !== null) {
|
|
254
|
+
// Cache to local for future loads
|
|
255
|
+
await localAdapter.save(cloudData);
|
|
256
|
+
return {
|
|
257
|
+
data: cloudData,
|
|
258
|
+
source: 'cloud',
|
|
259
|
+
inSync: true,
|
|
260
|
+
lastSyncedAt: new Date()
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Step 3: Neither has data
|
|
266
|
+
return {
|
|
267
|
+
data: null,
|
|
268
|
+
source: 'default',
|
|
269
|
+
inSync: true,
|
|
270
|
+
lastSyncedAt: null
|
|
271
|
+
};
|
|
272
|
+
} catch (error) {
|
|
273
|
+
return {
|
|
274
|
+
data: null,
|
|
275
|
+
source: 'default',
|
|
276
|
+
inSync: false,
|
|
277
|
+
lastSyncedAt: null,
|
|
278
|
+
syncError: error instanceof Error ? error.message : 'Load failed'
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Save configuration: local always, cloud when available
|
|
285
|
+
*/
|
|
286
|
+
async save<T>(manifest: ConfigManifest, data: T): Promise<SaveResult> {
|
|
287
|
+
const namespace = manifest.storage.namespace;
|
|
288
|
+
|
|
289
|
+
try {
|
|
290
|
+
// Step 1: Save to local
|
|
291
|
+
const localAdapter = this.getLocalAdapter<T>(namespace, manifest);
|
|
292
|
+
await localAdapter.save(data);
|
|
293
|
+
|
|
294
|
+
// Step 2: Try to sync to cloud (resolved via runtime)
|
|
295
|
+
const cloudClient = await this.resolveCloudClient();
|
|
296
|
+
if (cloudClient) {
|
|
297
|
+
await cloudClient.set(namespace, data);
|
|
298
|
+
return {
|
|
299
|
+
success: true,
|
|
300
|
+
direction: 'push',
|
|
301
|
+
changesApplied: 1
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// No cloud available, local-only save
|
|
306
|
+
return {
|
|
307
|
+
success: true,
|
|
308
|
+
direction: 'none',
|
|
309
|
+
changesApplied: 1
|
|
310
|
+
};
|
|
311
|
+
} catch (error) {
|
|
312
|
+
return {
|
|
313
|
+
success: false,
|
|
314
|
+
direction: 'none',
|
|
315
|
+
changesApplied: 0,
|
|
316
|
+
error: error instanceof Error ? error.message : 'Save failed'
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Sync between local and cloud
|
|
323
|
+
*/
|
|
324
|
+
async sync(
|
|
325
|
+
manifest: ConfigManifest,
|
|
326
|
+
direction: 'push' | 'pull' | 'auto' = 'auto'
|
|
327
|
+
): Promise<SaveResult> {
|
|
328
|
+
const namespace = manifest.storage.namespace;
|
|
329
|
+
|
|
330
|
+
try {
|
|
331
|
+
const localAdapter = this.getLocalAdapter<unknown>(namespace, manifest);
|
|
332
|
+
const cloudClient = await this.resolveCloudClient();
|
|
333
|
+
|
|
334
|
+
if (!cloudClient) {
|
|
335
|
+
return {
|
|
336
|
+
success: true,
|
|
337
|
+
direction: 'none',
|
|
338
|
+
changesApplied: 0
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const localData = await localAdapter.load();
|
|
343
|
+
const cloudData = await cloudClient.get(namespace);
|
|
344
|
+
|
|
345
|
+
// Determine actual direction
|
|
346
|
+
let actualDirection = direction;
|
|
347
|
+
if (direction === 'auto') {
|
|
348
|
+
// Prefer local if it exists (CLI edits take precedence)
|
|
349
|
+
actualDirection = localData !== null ? 'push' : 'pull';
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
if (actualDirection === 'push' && localData !== null) {
|
|
353
|
+
await cloudClient.set(namespace, localData);
|
|
354
|
+
return {
|
|
355
|
+
success: true,
|
|
356
|
+
direction: 'push',
|
|
357
|
+
changesApplied: 1
|
|
358
|
+
};
|
|
359
|
+
} else if (actualDirection === 'pull' && cloudData !== null) {
|
|
360
|
+
await localAdapter.save(cloudData);
|
|
361
|
+
return {
|
|
362
|
+
success: true,
|
|
363
|
+
direction: 'pull',
|
|
364
|
+
changesApplied: 1
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
return {
|
|
369
|
+
success: true,
|
|
370
|
+
direction: 'none',
|
|
371
|
+
changesApplied: 0
|
|
372
|
+
};
|
|
373
|
+
} catch (error) {
|
|
374
|
+
return {
|
|
375
|
+
success: false,
|
|
376
|
+
direction: 'none',
|
|
377
|
+
changesApplied: 0,
|
|
378
|
+
error: error instanceof Error ? error.message : 'Sync failed'
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Private helpers
|
|
384
|
+
|
|
385
|
+
private getLocalAdapter<T>(
|
|
386
|
+
namespace: string,
|
|
387
|
+
manifest: ConfigManifest
|
|
388
|
+
): LocalConfigStorageAdapter<T> {
|
|
389
|
+
let adapter = this.localAdapters.get(namespace);
|
|
390
|
+
if (!adapter) {
|
|
391
|
+
adapter = createDeferredLocalDBAdapter({
|
|
392
|
+
scope: manifest.storage.scope === 'project' ? 'project' : 'global',
|
|
393
|
+
namespace,
|
|
394
|
+
encrypt: manifest.storage.encryptSensitive
|
|
395
|
+
});
|
|
396
|
+
this.localAdapters.set(namespace, adapter);
|
|
397
|
+
}
|
|
398
|
+
return adapter as LocalConfigStorageAdapter<T>;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Runtime implementation registration
|
|
404
|
+
*
|
|
405
|
+
* Scope: consumer hardware with local-first storage qualifier.
|
|
406
|
+
* No syncDirection parameter - the qualifier encodes the policy.
|
|
407
|
+
* Cloud resolved through runtime.query, not internal composition.
|
|
408
|
+
*/
|
|
409
|
+
export default createRuntimeImplementation({
|
|
410
|
+
kind: 'config/loader',
|
|
411
|
+
id: 'config.loader.local-first',
|
|
412
|
+
implementation: LocalFirstConfigLoader,
|
|
413
|
+
constraint: {
|
|
414
|
+
hardware: ['consumer'],
|
|
415
|
+
qualifiers: { storage: 'local-first' }
|
|
416
|
+
}
|
|
417
|
+
});
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Loader - Consumer Implementation
|
|
3
|
+
*
|
|
4
|
+
* Local-only configuration loading using LocalDB storage.
|
|
5
|
+
* Single-purpose: handles local persistence only, no cloud logic.
|
|
6
|
+
*
|
|
7
|
+
* Scope: { hardware: ['consumer'], qualifiers: { storage: 'local' }}
|
|
8
|
+
*
|
|
9
|
+
* This replaces the branching logic in UnifiedConfigLoader with a pure
|
|
10
|
+
* runtime-selected implementation.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { createRuntimeImplementation } from '@vibesdotdev/runtime';
|
|
14
|
+
import type { ConfigManifest } from '../../manifest/types.ts';
|
|
15
|
+
import type { StorageDocumentStoreInterface } from '@vibesdotdev/storage/interfaces';
|
|
16
|
+
import * as z from 'zod/v4';
|
|
17
|
+
import type { ConfigLoaderInterface, LoadResult, SaveResult } from './loader.descriptor.ts';
|
|
18
|
+
|
|
19
|
+
/** Simple local storage adapter interface */
|
|
20
|
+
interface LocalConfigStorageAdapter<T> {
|
|
21
|
+
load(): Promise<T | null>;
|
|
22
|
+
save(data: T): Promise<void>;
|
|
23
|
+
exists(): Promise<boolean>;
|
|
24
|
+
delete(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Deferred LocalDB adapter - loads the real adapter dynamically */
|
|
28
|
+
function createDeferredLocalDBAdapter<T>(options: {
|
|
29
|
+
scope: 'project' | 'global';
|
|
30
|
+
namespace: string;
|
|
31
|
+
encrypt?: boolean;
|
|
32
|
+
}): LocalConfigStorageAdapter<T> {
|
|
33
|
+
let docStore: StorageDocumentStoreInterface<T> | null = null;
|
|
34
|
+
|
|
35
|
+
async function getDocStore(): Promise<StorageDocumentStoreInterface<T>> {
|
|
36
|
+
if (!docStore) {
|
|
37
|
+
interface AdapterModule {
|
|
38
|
+
default: {
|
|
39
|
+
impl: {
|
|
40
|
+
configure(config: { basePath: string }): void;
|
|
41
|
+
documentStore<U>(
|
|
42
|
+
namespace: string,
|
|
43
|
+
schema: z.ZodType<U>
|
|
44
|
+
): StorageDocumentStoreInterface<U>;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const modulePath = '@vibesdotdev/storage-adapter-localdb/localdb.adapter.impl';
|
|
49
|
+
const { default: implementation } = (await import(
|
|
50
|
+
/* @vite-ignore */ modulePath
|
|
51
|
+
)) as AdapterModule;
|
|
52
|
+
const adapter = implementation.impl;
|
|
53
|
+
|
|
54
|
+
const basePath =
|
|
55
|
+
options.scope === 'project'
|
|
56
|
+
? `${process.cwd()}/.vibes`
|
|
57
|
+
: `${process.env.HOME ?? '~'}/.vibes`;
|
|
58
|
+
|
|
59
|
+
adapter.configure({ basePath });
|
|
60
|
+
|
|
61
|
+
docStore = adapter.documentStore<T>(options.namespace, z.unknown() as z.ZodType<T>);
|
|
62
|
+
}
|
|
63
|
+
return docStore;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
async load(): Promise<T | null> {
|
|
68
|
+
const store = await getDocStore();
|
|
69
|
+
return store.load();
|
|
70
|
+
},
|
|
71
|
+
async save(data: T): Promise<void> {
|
|
72
|
+
const store = await getDocStore();
|
|
73
|
+
return store.save(data);
|
|
74
|
+
},
|
|
75
|
+
async exists(): Promise<boolean> {
|
|
76
|
+
const store = await getDocStore();
|
|
77
|
+
return store.exists();
|
|
78
|
+
},
|
|
79
|
+
async delete(): Promise<void> {
|
|
80
|
+
const store = await getDocStore();
|
|
81
|
+
return store.delete();
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Local Config Loader
|
|
88
|
+
*
|
|
89
|
+
* Single-purpose implementation for local-only configuration.
|
|
90
|
+
* No cloud dependencies. No syncDirection. No branching logic.
|
|
91
|
+
*/
|
|
92
|
+
export class LocalConfigLoader implements ConfigLoaderInterface {
|
|
93
|
+
private adapters = new Map<string, LocalConfigStorageAdapter<unknown>>();
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Load configuration from local storage only
|
|
97
|
+
*/
|
|
98
|
+
async load<T>(manifest: ConfigManifest): Promise<LoadResult<T>> {
|
|
99
|
+
const namespace = manifest.storage.namespace;
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
const adapter = this.getAdapter<T>(namespace, manifest);
|
|
103
|
+
const data = await adapter.load();
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
data,
|
|
107
|
+
source: data !== null ? 'local' : 'default',
|
|
108
|
+
inSync: true,
|
|
109
|
+
lastSyncedAt: null
|
|
110
|
+
};
|
|
111
|
+
} catch (error) {
|
|
112
|
+
return {
|
|
113
|
+
data: null,
|
|
114
|
+
source: 'default',
|
|
115
|
+
inSync: false,
|
|
116
|
+
lastSyncedAt: null,
|
|
117
|
+
syncError: error instanceof Error ? error.message : 'Load failed'
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Save configuration to local storage only
|
|
124
|
+
*/
|
|
125
|
+
async save<T>(manifest: ConfigManifest, data: T): Promise<SaveResult> {
|
|
126
|
+
const namespace = manifest.storage.namespace;
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
const adapter = this.getAdapter<T>(namespace, manifest);
|
|
130
|
+
await adapter.save(data);
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
success: true,
|
|
134
|
+
direction: 'none',
|
|
135
|
+
changesApplied: 1
|
|
136
|
+
};
|
|
137
|
+
} catch (error) {
|
|
138
|
+
return {
|
|
139
|
+
success: false,
|
|
140
|
+
direction: 'none',
|
|
141
|
+
changesApplied: 0,
|
|
142
|
+
error: error instanceof Error ? error.message : 'Save failed'
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Delete configuration from local storage
|
|
149
|
+
*/
|
|
150
|
+
async delete(manifest: ConfigManifest): Promise<SaveResult> {
|
|
151
|
+
const namespace = manifest.storage.namespace;
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
const adapter = this.getAdapter<unknown>(namespace, manifest);
|
|
155
|
+
await adapter.delete();
|
|
156
|
+
|
|
157
|
+
this.adapters.delete(namespace);
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
success: true,
|
|
161
|
+
direction: 'none',
|
|
162
|
+
changesApplied: 1
|
|
163
|
+
};
|
|
164
|
+
} catch (error) {
|
|
165
|
+
return {
|
|
166
|
+
success: false,
|
|
167
|
+
direction: 'none',
|
|
168
|
+
changesApplied: 0,
|
|
169
|
+
error: error instanceof Error ? error.message : 'Delete failed'
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Check if configuration exists locally
|
|
176
|
+
*/
|
|
177
|
+
async exists(manifest: ConfigManifest): Promise<boolean> {
|
|
178
|
+
const namespace = manifest.storage.namespace;
|
|
179
|
+
const adapter = this.getAdapter<unknown>(namespace, manifest);
|
|
180
|
+
return adapter.exists();
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Private helpers
|
|
184
|
+
|
|
185
|
+
private getAdapter<T>(namespace: string, manifest: ConfigManifest): LocalConfigStorageAdapter<T> {
|
|
186
|
+
let adapter = this.adapters.get(namespace);
|
|
187
|
+
if (!adapter) {
|
|
188
|
+
adapter = createDeferredLocalDBAdapter({
|
|
189
|
+
scope: manifest.storage.scope === 'project' ? 'project' : 'global',
|
|
190
|
+
namespace,
|
|
191
|
+
encrypt: manifest.storage.encryptSensitive
|
|
192
|
+
});
|
|
193
|
+
this.adapters.set(namespace, adapter);
|
|
194
|
+
}
|
|
195
|
+
return adapter as LocalConfigStorageAdapter<T>;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Runtime implementation registration
|
|
201
|
+
*
|
|
202
|
+
* Scope: consumer hardware with local storage qualifier.
|
|
203
|
+
* No syncDirection. No cloud dependencies. Single-purpose.
|
|
204
|
+
*/
|
|
205
|
+
export default createRuntimeImplementation({
|
|
206
|
+
kind: 'config/loader',
|
|
207
|
+
id: 'config.loader.local',
|
|
208
|
+
implementation: LocalConfigLoader,
|
|
209
|
+
constraint: {
|
|
210
|
+
hardware: ['consumer'],
|
|
211
|
+
qualifiers: { storage: 'local' }
|
|
212
|
+
}
|
|
213
|
+
});
|