@lssm/lib.contracts 1.2.0
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 +361 -0
- package/dist/app-config/branding.d.ts +56 -0
- package/dist/app-config/branding.d.ts.map +1 -0
- package/dist/app-config/branding.js +0 -0
- package/dist/app-config/contracts.d.ts +243 -0
- package/dist/app-config/contracts.d.ts.map +1 -0
- package/dist/app-config/contracts.js +2 -0
- package/dist/app-config/contracts.js.map +1 -0
- package/dist/app-config/events.d.ts +121 -0
- package/dist/app-config/events.d.ts.map +1 -0
- package/dist/app-config/events.js +2 -0
- package/dist/app-config/events.js.map +1 -0
- package/dist/app-config/index.d.ts +8 -0
- package/dist/app-config/index.js +1 -0
- package/dist/app-config/lifecycle-contracts.d.ts +381 -0
- package/dist/app-config/lifecycle-contracts.d.ts.map +1 -0
- package/dist/app-config/lifecycle-contracts.js +2 -0
- package/dist/app-config/lifecycle-contracts.js.map +1 -0
- package/dist/app-config/lifecycle.d.ts +28 -0
- package/dist/app-config/lifecycle.d.ts.map +1 -0
- package/dist/app-config/lifecycle.js +0 -0
- package/dist/app-config/runtime.d.ts +115 -0
- package/dist/app-config/runtime.d.ts.map +1 -0
- package/dist/app-config/runtime.js +2 -0
- package/dist/app-config/runtime.js.map +1 -0
- package/dist/app-config/spec.d.ts +176 -0
- package/dist/app-config/spec.d.ts.map +1 -0
- package/dist/app-config/spec.js +2 -0
- package/dist/app-config/spec.js.map +1 -0
- package/dist/app-config/validation.d.ts +48 -0
- package/dist/app-config/validation.d.ts.map +1 -0
- package/dist/app-config/validation.js +2 -0
- package/dist/app-config/validation.js.map +1 -0
- package/dist/capabilities/openbanking.d.ts +10 -0
- package/dist/capabilities/openbanking.d.ts.map +1 -0
- package/dist/capabilities/openbanking.js +2 -0
- package/dist/capabilities/openbanking.js.map +1 -0
- package/dist/capabilities.d.ts +45 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +2 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.js +1 -0
- package/dist/client/react/drivers/rn-reusables.d.ts +23 -0
- package/dist/client/react/drivers/rn-reusables.d.ts.map +1 -0
- package/dist/client/react/drivers/rn-reusables.js +2 -0
- package/dist/client/react/drivers/rn-reusables.js.map +1 -0
- package/dist/client/react/drivers/shadcn.d.ts +13 -0
- package/dist/client/react/drivers/shadcn.d.ts.map +1 -0
- package/dist/client/react/drivers/shadcn.js +2 -0
- package/dist/client/react/drivers/shadcn.js.map +1 -0
- package/dist/client/react/feature-render.d.ts +21 -0
- package/dist/client/react/feature-render.d.ts.map +1 -0
- package/dist/client/react/feature-render.js +2 -0
- package/dist/client/react/feature-render.js.map +1 -0
- package/dist/client/react/form-render.d.ts +91 -0
- package/dist/client/react/form-render.d.ts.map +1 -0
- package/dist/client/react/form-render.js +2 -0
- package/dist/client/react/form-render.js.map +1 -0
- package/dist/client/react/index.d.ts +5 -0
- package/dist/client/react/index.js +1 -0
- package/dist/contracts-adapter-hydration.d.ts +16 -0
- package/dist/contracts-adapter-hydration.d.ts.map +1 -0
- package/dist/contracts-adapter-hydration.js +2 -0
- package/dist/contracts-adapter-hydration.js.map +1 -0
- package/dist/contracts-adapter-input.d.ts +10 -0
- package/dist/contracts-adapter-input.d.ts.map +1 -0
- package/dist/contracts-adapter-input.js +2 -0
- package/dist/contracts-adapter-input.js.map +1 -0
- package/dist/data-views.d.ts +132 -0
- package/dist/data-views.d.ts.map +1 -0
- package/dist/data-views.js +2 -0
- package/dist/data-views.js.map +1 -0
- package/dist/events.d.ts +44 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +2 -0
- package/dist/events.js.map +1 -0
- package/dist/experiments/evaluator.d.ts +38 -0
- package/dist/experiments/evaluator.d.ts.map +1 -0
- package/dist/experiments/evaluator.js +2 -0
- package/dist/experiments/evaluator.js.map +1 -0
- package/dist/experiments/spec.d.ts +90 -0
- package/dist/experiments/spec.d.ts.map +1 -0
- package/dist/experiments/spec.js +2 -0
- package/dist/experiments/spec.js.map +1 -0
- package/dist/features.d.ts +88 -0
- package/dist/features.d.ts.map +1 -0
- package/dist/features.js +2 -0
- package/dist/features.js.map +1 -0
- package/dist/forms.d.ts +258 -0
- package/dist/forms.d.ts.map +1 -0
- package/dist/forms.js +2 -0
- package/dist/forms.js.map +1 -0
- package/dist/graphql-federation/src/index.js +2 -0
- package/dist/graphql-federation/src/index.js.map +1 -0
- package/dist/index.d.ts +129 -0
- package/dist/index.js +1 -0
- package/dist/install.d.ts +76 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +2 -0
- package/dist/install.js.map +1 -0
- package/dist/integrations/binding.d.ts +18 -0
- package/dist/integrations/binding.d.ts.map +1 -0
- package/dist/integrations/binding.js +0 -0
- package/dist/integrations/connection.d.ts +52 -0
- package/dist/integrations/connection.d.ts.map +1 -0
- package/dist/integrations/connection.js +0 -0
- package/dist/integrations/contracts.d.ts +434 -0
- package/dist/integrations/contracts.d.ts.map +1 -0
- package/dist/integrations/contracts.js +2 -0
- package/dist/integrations/contracts.js.map +1 -0
- package/dist/integrations/health.d.ts +22 -0
- package/dist/integrations/health.d.ts.map +1 -0
- package/dist/integrations/health.js +2 -0
- package/dist/integrations/health.js.map +1 -0
- package/dist/integrations/index.d.ts +53 -0
- package/dist/integrations/index.js +1 -0
- package/dist/integrations/openbanking/contracts/accounts.d.ts +286 -0
- package/dist/integrations/openbanking/contracts/accounts.d.ts.map +1 -0
- package/dist/integrations/openbanking/contracts/accounts.js +2 -0
- package/dist/integrations/openbanking/contracts/accounts.js.map +1 -0
- package/dist/integrations/openbanking/contracts/balances.d.ts +162 -0
- package/dist/integrations/openbanking/contracts/balances.d.ts.map +1 -0
- package/dist/integrations/openbanking/contracts/balances.js +2 -0
- package/dist/integrations/openbanking/contracts/balances.js.map +1 -0
- package/dist/integrations/openbanking/contracts/index.d.ts +10 -0
- package/dist/integrations/openbanking/contracts/index.d.ts.map +1 -0
- package/dist/integrations/openbanking/contracts/index.js +2 -0
- package/dist/integrations/openbanking/contracts/index.js.map +1 -0
- package/dist/integrations/openbanking/contracts/transactions.d.ts +210 -0
- package/dist/integrations/openbanking/contracts/transactions.d.ts.map +1 -0
- package/dist/integrations/openbanking/contracts/transactions.js +2 -0
- package/dist/integrations/openbanking/contracts/transactions.js.map +1 -0
- package/dist/integrations/openbanking/guards.d.ts +13 -0
- package/dist/integrations/openbanking/guards.d.ts.map +1 -0
- package/dist/integrations/openbanking/guards.js +2 -0
- package/dist/integrations/openbanking/guards.js.map +1 -0
- package/dist/integrations/openbanking/models.d.ts +226 -0
- package/dist/integrations/openbanking/models.d.ts.map +1 -0
- package/dist/integrations/openbanking/models.js +2 -0
- package/dist/integrations/openbanking/models.js.map +1 -0
- package/dist/integrations/openbanking/telemetry.d.ts +16 -0
- package/dist/integrations/openbanking/telemetry.d.ts.map +1 -0
- package/dist/integrations/openbanking/telemetry.js +2 -0
- package/dist/integrations/openbanking/telemetry.js.map +1 -0
- package/dist/integrations/providers/calendar.d.ts +79 -0
- package/dist/integrations/providers/calendar.d.ts.map +1 -0
- package/dist/integrations/providers/calendar.js +0 -0
- package/dist/integrations/providers/elevenlabs.d.ts +8 -0
- package/dist/integrations/providers/elevenlabs.d.ts.map +1 -0
- package/dist/integrations/providers/elevenlabs.js +2 -0
- package/dist/integrations/providers/elevenlabs.js.map +1 -0
- package/dist/integrations/providers/email.d.ts +87 -0
- package/dist/integrations/providers/email.d.ts.map +1 -0
- package/dist/integrations/providers/email.js +0 -0
- package/dist/integrations/providers/embedding.d.ts +25 -0
- package/dist/integrations/providers/embedding.d.ts.map +1 -0
- package/dist/integrations/providers/embedding.js +0 -0
- package/dist/integrations/providers/gcs-storage.d.ts +8 -0
- package/dist/integrations/providers/gcs-storage.d.ts.map +1 -0
- package/dist/integrations/providers/gcs-storage.js +2 -0
- package/dist/integrations/providers/gcs-storage.js.map +1 -0
- package/dist/integrations/providers/gmail.d.ts +8 -0
- package/dist/integrations/providers/gmail.d.ts.map +1 -0
- package/dist/integrations/providers/gmail.js +2 -0
- package/dist/integrations/providers/gmail.js.map +1 -0
- package/dist/integrations/providers/google-calendar.d.ts +8 -0
- package/dist/integrations/providers/google-calendar.d.ts.map +1 -0
- package/dist/integrations/providers/google-calendar.js +2 -0
- package/dist/integrations/providers/google-calendar.js.map +1 -0
- package/dist/integrations/providers/impls/elevenlabs-voice.d.ts +21 -0
- package/dist/integrations/providers/impls/elevenlabs-voice.d.ts.map +1 -0
- package/dist/integrations/providers/impls/elevenlabs-voice.js +2 -0
- package/dist/integrations/providers/impls/elevenlabs-voice.js.map +1 -0
- package/dist/integrations/providers/impls/gcs-storage.d.ts +25 -0
- package/dist/integrations/providers/impls/gcs-storage.d.ts.map +1 -0
- package/dist/integrations/providers/impls/gcs-storage.js +2 -0
- package/dist/integrations/providers/impls/gcs-storage.js.map +1 -0
- package/dist/integrations/providers/impls/gmail-inbound.d.ts +27 -0
- package/dist/integrations/providers/impls/gmail-inbound.d.ts.map +1 -0
- package/dist/integrations/providers/impls/gmail-inbound.js +2 -0
- package/dist/integrations/providers/impls/gmail-inbound.js.map +1 -0
- package/dist/integrations/providers/impls/gmail-outbound.d.ts +19 -0
- package/dist/integrations/providers/impls/gmail-outbound.d.ts.map +1 -0
- package/dist/integrations/providers/impls/gmail-outbound.js +7 -0
- package/dist/integrations/providers/impls/gmail-outbound.js.map +1 -0
- package/dist/integrations/providers/impls/google-calendar.d.ts +24 -0
- package/dist/integrations/providers/impls/google-calendar.d.ts.map +1 -0
- package/dist/integrations/providers/impls/google-calendar.js +2 -0
- package/dist/integrations/providers/impls/google-calendar.js.map +1 -0
- package/dist/integrations/providers/impls/index.d.ts +15 -0
- package/dist/integrations/providers/impls/index.js +1 -0
- package/dist/integrations/providers/impls/mistral-embedding.d.ts +24 -0
- package/dist/integrations/providers/impls/mistral-embedding.d.ts.map +1 -0
- package/dist/integrations/providers/impls/mistral-embedding.js +2 -0
- package/dist/integrations/providers/impls/mistral-embedding.js.map +1 -0
- package/dist/integrations/providers/impls/mistral-llm.d.ts +32 -0
- package/dist/integrations/providers/impls/mistral-llm.d.ts.map +1 -0
- package/dist/integrations/providers/impls/mistral-llm.js +2 -0
- package/dist/integrations/providers/impls/mistral-llm.js.map +1 -0
- package/dist/integrations/providers/impls/postmark-email.d.ts +20 -0
- package/dist/integrations/providers/impls/postmark-email.d.ts.map +1 -0
- package/dist/integrations/providers/impls/postmark-email.js +2 -0
- package/dist/integrations/providers/impls/postmark-email.js.map +1 -0
- package/dist/integrations/providers/impls/powens-client.d.ts +125 -0
- package/dist/integrations/providers/impls/powens-client.d.ts.map +1 -0
- package/dist/integrations/providers/impls/powens-client.js +2 -0
- package/dist/integrations/providers/impls/powens-client.js.map +1 -0
- package/dist/integrations/providers/impls/powens-openbanking.d.ts +28 -0
- package/dist/integrations/providers/impls/powens-openbanking.d.ts.map +1 -0
- package/dist/integrations/providers/impls/powens-openbanking.js +2 -0
- package/dist/integrations/providers/impls/powens-openbanking.js.map +1 -0
- package/dist/integrations/providers/impls/provider-factory.d.ts +27 -0
- package/dist/integrations/providers/impls/provider-factory.d.ts.map +1 -0
- package/dist/integrations/providers/impls/provider-factory.js +2 -0
- package/dist/integrations/providers/impls/provider-factory.js.map +1 -0
- package/dist/integrations/providers/impls/qdrant-vector.d.ts +25 -0
- package/dist/integrations/providers/impls/qdrant-vector.d.ts.map +1 -0
- package/dist/integrations/providers/impls/qdrant-vector.js +2 -0
- package/dist/integrations/providers/impls/qdrant-vector.js.map +1 -0
- package/dist/integrations/providers/impls/stripe-payments.d.ts +29 -0
- package/dist/integrations/providers/impls/stripe-payments.d.ts.map +1 -0
- package/dist/integrations/providers/impls/stripe-payments.js +2 -0
- package/dist/integrations/providers/impls/stripe-payments.js.map +1 -0
- package/dist/integrations/providers/impls/twilio-sms.d.ts +21 -0
- package/dist/integrations/providers/impls/twilio-sms.d.ts.map +1 -0
- package/dist/integrations/providers/impls/twilio-sms.js +2 -0
- package/dist/integrations/providers/impls/twilio-sms.js.map +1 -0
- package/dist/integrations/providers/index.d.ts +36 -0
- package/dist/integrations/providers/index.js +1 -0
- package/dist/integrations/providers/llm.d.ts +83 -0
- package/dist/integrations/providers/llm.d.ts.map +1 -0
- package/dist/integrations/providers/llm.js +0 -0
- package/dist/integrations/providers/mistral.d.ts +8 -0
- package/dist/integrations/providers/mistral.d.ts.map +1 -0
- package/dist/integrations/providers/mistral.js +2 -0
- package/dist/integrations/providers/mistral.js.map +1 -0
- package/dist/integrations/providers/openbanking.d.ts +129 -0
- package/dist/integrations/providers/openbanking.d.ts.map +1 -0
- package/dist/integrations/providers/openbanking.js +0 -0
- package/dist/integrations/providers/payments.d.ts +110 -0
- package/dist/integrations/providers/payments.d.ts.map +1 -0
- package/dist/integrations/providers/payments.js +0 -0
- package/dist/integrations/providers/postmark.d.ts +8 -0
- package/dist/integrations/providers/postmark.d.ts.map +1 -0
- package/dist/integrations/providers/postmark.js +2 -0
- package/dist/integrations/providers/postmark.js.map +1 -0
- package/dist/integrations/providers/powens.d.ts +8 -0
- package/dist/integrations/providers/powens.d.ts.map +1 -0
- package/dist/integrations/providers/powens.js +2 -0
- package/dist/integrations/providers/powens.js.map +1 -0
- package/dist/integrations/providers/qdrant.d.ts +8 -0
- package/dist/integrations/providers/qdrant.d.ts.map +1 -0
- package/dist/integrations/providers/qdrant.js +2 -0
- package/dist/integrations/providers/qdrant.js.map +1 -0
- package/dist/integrations/providers/sms.d.ts +35 -0
- package/dist/integrations/providers/sms.d.ts.map +1 -0
- package/dist/integrations/providers/sms.js +0 -0
- package/dist/integrations/providers/storage.d.ts +61 -0
- package/dist/integrations/providers/storage.d.ts.map +1 -0
- package/dist/integrations/providers/storage.js +0 -0
- package/dist/integrations/providers/stripe.d.ts +8 -0
- package/dist/integrations/providers/stripe.d.ts.map +1 -0
- package/dist/integrations/providers/stripe.js +2 -0
- package/dist/integrations/providers/stripe.js.map +1 -0
- package/dist/integrations/providers/twilio-sms.d.ts +8 -0
- package/dist/integrations/providers/twilio-sms.d.ts.map +1 -0
- package/dist/integrations/providers/twilio-sms.js +2 -0
- package/dist/integrations/providers/twilio-sms.js.map +1 -0
- package/dist/integrations/providers/vector-store.d.ts +44 -0
- package/dist/integrations/providers/vector-store.d.ts.map +1 -0
- package/dist/integrations/providers/vector-store.js +0 -0
- package/dist/integrations/providers/voice.d.ts +35 -0
- package/dist/integrations/providers/voice.d.ts.map +1 -0
- package/dist/integrations/providers/voice.js +0 -0
- package/dist/integrations/runtime.d.ts +100 -0
- package/dist/integrations/runtime.d.ts.map +1 -0
- package/dist/integrations/runtime.js +2 -0
- package/dist/integrations/runtime.js.map +1 -0
- package/dist/integrations/secrets/env-secret-provider.d.ts +32 -0
- package/dist/integrations/secrets/env-secret-provider.d.ts.map +1 -0
- package/dist/integrations/secrets/env-secret-provider.js +2 -0
- package/dist/integrations/secrets/env-secret-provider.js.map +1 -0
- package/dist/integrations/secrets/gcp-secret-manager.d.ts +33 -0
- package/dist/integrations/secrets/gcp-secret-manager.d.ts.map +1 -0
- package/dist/integrations/secrets/gcp-secret-manager.js +2 -0
- package/dist/integrations/secrets/gcp-secret-manager.js.map +1 -0
- package/dist/integrations/secrets/index.d.ts +5 -0
- package/dist/integrations/secrets/index.js +1 -0
- package/dist/integrations/secrets/manager.d.ts +48 -0
- package/dist/integrations/secrets/manager.d.ts.map +1 -0
- package/dist/integrations/secrets/manager.js +2 -0
- package/dist/integrations/secrets/manager.js.map +1 -0
- package/dist/integrations/secrets/provider.d.ts +53 -0
- package/dist/integrations/secrets/provider.d.ts.map +1 -0
- package/dist/integrations/secrets/provider.js +2 -0
- package/dist/integrations/secrets/provider.js.map +1 -0
- package/dist/integrations/spec.d.ts +80 -0
- package/dist/integrations/spec.d.ts.map +1 -0
- package/dist/integrations/spec.js +2 -0
- package/dist/integrations/spec.js.map +1 -0
- package/dist/jobs/gcp-cloud-tasks.d.ts +42 -0
- package/dist/jobs/gcp-cloud-tasks.d.ts.map +1 -0
- package/dist/jobs/gcp-cloud-tasks.js +2 -0
- package/dist/jobs/gcp-cloud-tasks.js.map +1 -0
- package/dist/jobs/gcp-pubsub.d.ts +26 -0
- package/dist/jobs/gcp-pubsub.d.ts.map +1 -0
- package/dist/jobs/gcp-pubsub.js +2 -0
- package/dist/jobs/gcp-pubsub.js.map +1 -0
- package/dist/jobs/handlers/gmail-sync-handler.d.ts +10 -0
- package/dist/jobs/handlers/gmail-sync-handler.d.ts.map +1 -0
- package/dist/jobs/handlers/gmail-sync-handler.js +2 -0
- package/dist/jobs/handlers/gmail-sync-handler.js.map +1 -0
- package/dist/jobs/handlers/index.d.ts +3 -0
- package/dist/jobs/handlers/index.js +1 -0
- package/dist/jobs/handlers/storage-document-handler.d.ts +13 -0
- package/dist/jobs/handlers/storage-document-handler.d.ts.map +1 -0
- package/dist/jobs/handlers/storage-document-handler.js +2 -0
- package/dist/jobs/handlers/storage-document-handler.js.map +1 -0
- package/dist/jobs/index.d.ts +7 -0
- package/dist/jobs/index.js +1 -0
- package/dist/jobs/memory-queue.d.ts +19 -0
- package/dist/jobs/memory-queue.d.ts.map +1 -0
- package/dist/jobs/memory-queue.js +2 -0
- package/dist/jobs/memory-queue.js.map +1 -0
- package/dist/jobs/queue.d.ts +27 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +0 -0
- package/dist/jsonschema.d.ts +27 -0
- package/dist/jsonschema.d.ts.map +1 -0
- package/dist/jsonschema.js +2 -0
- package/dist/jsonschema.js.map +1 -0
- package/dist/knowledge/binding.d.ts +26 -0
- package/dist/knowledge/binding.d.ts.map +1 -0
- package/dist/knowledge/binding.js +0 -0
- package/dist/knowledge/contracts.d.ts +315 -0
- package/dist/knowledge/contracts.d.ts.map +1 -0
- package/dist/knowledge/contracts.js +2 -0
- package/dist/knowledge/contracts.js.map +1 -0
- package/dist/knowledge/index.d.ts +10 -0
- package/dist/knowledge/index.js +1 -0
- package/dist/knowledge/ingestion/document-processor.d.ts +25 -0
- package/dist/knowledge/ingestion/document-processor.d.ts.map +1 -0
- package/dist/knowledge/ingestion/document-processor.js +2 -0
- package/dist/knowledge/ingestion/document-processor.js.map +1 -0
- package/dist/knowledge/ingestion/embedding-service.d.ts +13 -0
- package/dist/knowledge/ingestion/embedding-service.d.ts.map +1 -0
- package/dist/knowledge/ingestion/embedding-service.js +2 -0
- package/dist/knowledge/ingestion/embedding-service.js.map +1 -0
- package/dist/knowledge/ingestion/gmail-adapter.d.ts +19 -0
- package/dist/knowledge/ingestion/gmail-adapter.d.ts.map +1 -0
- package/dist/knowledge/ingestion/gmail-adapter.js +7 -0
- package/dist/knowledge/ingestion/gmail-adapter.js.map +1 -0
- package/dist/knowledge/ingestion/index.d.ts +6 -0
- package/dist/knowledge/ingestion/index.js +1 -0
- package/dist/knowledge/ingestion/storage-adapter.d.ts +16 -0
- package/dist/knowledge/ingestion/storage-adapter.d.ts.map +1 -0
- package/dist/knowledge/ingestion/storage-adapter.js +2 -0
- package/dist/knowledge/ingestion/storage-adapter.js.map +1 -0
- package/dist/knowledge/ingestion/vector-indexer.d.ts +19 -0
- package/dist/knowledge/ingestion/vector-indexer.d.ts.map +1 -0
- package/dist/knowledge/ingestion/vector-indexer.js +2 -0
- package/dist/knowledge/ingestion/vector-indexer.js.map +1 -0
- package/dist/knowledge/query/index.d.ts +2 -0
- package/dist/knowledge/query/index.js +1 -0
- package/dist/knowledge/query/service.d.ts +30 -0
- package/dist/knowledge/query/service.d.ts.map +1 -0
- package/dist/knowledge/query/service.js +4 -0
- package/dist/knowledge/query/service.js.map +1 -0
- package/dist/knowledge/runtime.d.ts +33 -0
- package/dist/knowledge/runtime.d.ts.map +1 -0
- package/dist/knowledge/runtime.js +2 -0
- package/dist/knowledge/runtime.js.map +1 -0
- package/dist/knowledge/source.d.ts +33 -0
- package/dist/knowledge/source.d.ts.map +1 -0
- package/dist/knowledge/source.js +0 -0
- package/dist/knowledge/spaces/email-threads.d.ts +8 -0
- package/dist/knowledge/spaces/email-threads.d.ts.map +1 -0
- package/dist/knowledge/spaces/email-threads.js +2 -0
- package/dist/knowledge/spaces/email-threads.js.map +1 -0
- package/dist/knowledge/spaces/financial-docs.d.ts +8 -0
- package/dist/knowledge/spaces/financial-docs.d.ts.map +1 -0
- package/dist/knowledge/spaces/financial-docs.js +2 -0
- package/dist/knowledge/spaces/financial-docs.js.map +1 -0
- package/dist/knowledge/spaces/financial-overview.d.ts +8 -0
- package/dist/knowledge/spaces/financial-overview.d.ts.map +1 -0
- package/dist/knowledge/spaces/financial-overview.js +2 -0
- package/dist/knowledge/spaces/financial-overview.js.map +1 -0
- package/dist/knowledge/spaces/index.d.ts +7 -0
- package/dist/knowledge/spaces/index.js +1 -0
- package/dist/knowledge/spaces/product-canon.d.ts +8 -0
- package/dist/knowledge/spaces/product-canon.d.ts.map +1 -0
- package/dist/knowledge/spaces/product-canon.js +2 -0
- package/dist/knowledge/spaces/product-canon.js.map +1 -0
- package/dist/knowledge/spaces/support-faq.d.ts +8 -0
- package/dist/knowledge/spaces/support-faq.d.ts.map +1 -0
- package/dist/knowledge/spaces/support-faq.js +2 -0
- package/dist/knowledge/spaces/support-faq.js.map +1 -0
- package/dist/knowledge/spaces/uploaded-docs.d.ts +8 -0
- package/dist/knowledge/spaces/uploaded-docs.d.ts.map +1 -0
- package/dist/knowledge/spaces/uploaded-docs.js +2 -0
- package/dist/knowledge/spaces/uploaded-docs.js.map +1 -0
- package/dist/knowledge/spec.d.ts +53 -0
- package/dist/knowledge/spec.d.ts.map +1 -0
- package/dist/knowledge/spec.js +2 -0
- package/dist/knowledge/spec.js.map +1 -0
- package/dist/markdown.d.ts +22 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +4 -0
- package/dist/markdown.js.map +1 -0
- package/dist/migrations.d.ts +53 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +2 -0
- package/dist/migrations.js.map +1 -0
- package/dist/onboarding-base.d.ts +136 -0
- package/dist/onboarding-base.d.ts.map +1 -0
- package/dist/onboarding-base.js +2 -0
- package/dist/onboarding-base.js.map +1 -0
- package/dist/ownership.d.ts +76 -0
- package/dist/ownership.d.ts.map +1 -0
- package/dist/ownership.js +2 -0
- package/dist/ownership.js.map +1 -0
- package/dist/policy/engine.d.ts +40 -0
- package/dist/policy/engine.d.ts.map +1 -0
- package/dist/policy/engine.js +2 -0
- package/dist/policy/engine.js.map +1 -0
- package/dist/policy/opa-adapter.d.ts +46 -0
- package/dist/policy/opa-adapter.d.ts.map +1 -0
- package/dist/policy/opa-adapter.js +2 -0
- package/dist/policy/opa-adapter.js.map +1 -0
- package/dist/policy/spec.d.ts +115 -0
- package/dist/policy/spec.d.ts.map +1 -0
- package/dist/policy/spec.js +2 -0
- package/dist/policy/spec.js.map +1 -0
- package/dist/presentations.backcompat.d.ts +8 -0
- package/dist/presentations.backcompat.d.ts.map +1 -0
- package/dist/presentations.backcompat.js +2 -0
- package/dist/presentations.backcompat.js.map +1 -0
- package/dist/presentations.d.ts +96 -0
- package/dist/presentations.d.ts.map +1 -0
- package/dist/presentations.js +2 -0
- package/dist/presentations.js.map +1 -0
- package/dist/presentations.v2.d.ts +95 -0
- package/dist/presentations.v2.d.ts.map +1 -0
- package/dist/presentations.v2.js +2 -0
- package/dist/presentations.v2.js.map +1 -0
- package/dist/prompt.d.ts +61 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +2 -0
- package/dist/prompt.js.map +1 -0
- package/dist/promptRegistry.d.ts +16 -0
- package/dist/promptRegistry.d.ts.map +1 -0
- package/dist/promptRegistry.js +2 -0
- package/dist/promptRegistry.js.map +1 -0
- package/dist/regenerator/adapters.d.ts +20 -0
- package/dist/regenerator/adapters.d.ts.map +1 -0
- package/dist/regenerator/adapters.js +0 -0
- package/dist/regenerator/executor.d.ts +71 -0
- package/dist/regenerator/executor.d.ts.map +1 -0
- package/dist/regenerator/executor.js +2 -0
- package/dist/regenerator/executor.js.map +1 -0
- package/dist/regenerator/index.d.ts +7 -0
- package/dist/regenerator/index.js +1 -0
- package/dist/regenerator/service.d.ts +34 -0
- package/dist/regenerator/service.d.ts.map +1 -0
- package/dist/regenerator/service.js +2 -0
- package/dist/regenerator/service.js.map +1 -0
- package/dist/regenerator/sinks.d.ts +27 -0
- package/dist/regenerator/sinks.d.ts.map +1 -0
- package/dist/regenerator/sinks.js +2 -0
- package/dist/regenerator/sinks.js.map +1 -0
- package/dist/regenerator/types.d.ts +108 -0
- package/dist/regenerator/types.d.ts.map +1 -0
- package/dist/regenerator/types.js +0 -0
- package/dist/regenerator/utils.d.ts +10 -0
- package/dist/regenerator/utils.d.ts.map +1 -0
- package/dist/regenerator/utils.js +2 -0
- package/dist/regenerator/utils.js.map +1 -0
- package/dist/registry.d.ts +45 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +2 -0
- package/dist/registry.js.map +1 -0
- package/dist/resources.d.ts +65 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +2 -0
- package/dist/resources.js.map +1 -0
- package/dist/schema/src/EnumType.js +1 -0
- package/dist/schema/src/FieldType.js +2 -0
- package/dist/schema/src/FieldType.js.map +1 -0
- package/dist/schema/src/ScalarTypeEnum.js +2 -0
- package/dist/schema/src/ScalarTypeEnum.js.map +1 -0
- package/dist/schema/src/SchemaModel.js +2 -0
- package/dist/schema/src/SchemaModel.js.map +1 -0
- package/dist/schema/src/index.js +1 -0
- package/dist/server/graphql-pothos.d.ts +19 -0
- package/dist/server/graphql-pothos.d.ts.map +1 -0
- package/dist/server/graphql-pothos.js +2 -0
- package/dist/server/graphql-pothos.js.map +1 -0
- package/dist/server/graphql-schema-export.d.ts +7 -0
- package/dist/server/graphql-schema-export.d.ts.map +1 -0
- package/dist/server/graphql-schema-export.js +2 -0
- package/dist/server/graphql-schema-export.js.map +1 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.js +1 -0
- package/dist/server/provider-mcp.d.ts +34 -0
- package/dist/server/provider-mcp.d.ts.map +1 -0
- package/dist/server/provider-mcp.js +2 -0
- package/dist/server/provider-mcp.js.map +1 -0
- package/dist/server/rest-elysia.d.ts +41 -0
- package/dist/server/rest-elysia.d.ts.map +1 -0
- package/dist/server/rest-elysia.js +2 -0
- package/dist/server/rest-elysia.js.map +1 -0
- package/dist/server/rest-express.d.ts +17 -0
- package/dist/server/rest-express.d.ts.map +1 -0
- package/dist/server/rest-express.js +2 -0
- package/dist/server/rest-express.js.map +1 -0
- package/dist/server/rest-generic.d.ts +33 -0
- package/dist/server/rest-generic.d.ts.map +1 -0
- package/dist/server/rest-generic.js +2 -0
- package/dist/server/rest-generic.js.map +1 -0
- package/dist/server/rest-next-app.d.ts +16 -0
- package/dist/server/rest-next-app.d.ts.map +1 -0
- package/dist/server/rest-next-app.js +2 -0
- package/dist/server/rest-next-app.js.map +1 -0
- package/dist/server/rest-next-mcp.d.ts +12 -0
- package/dist/server/rest-next-mcp.d.ts.map +1 -0
- package/dist/server/rest-next-mcp.js +2 -0
- package/dist/server/rest-next-mcp.js.map +1 -0
- package/dist/server/rest-next-pages.d.ts +10 -0
- package/dist/server/rest-next-pages.d.ts.map +1 -0
- package/dist/server/rest-next-pages.js +2 -0
- package/dist/server/rest-next-pages.js.map +1 -0
- package/dist/spec.d.ts +149 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +2 -0
- package/dist/spec.js.map +1 -0
- package/dist/telemetry/anomaly.d.ts +28 -0
- package/dist/telemetry/anomaly.d.ts.map +1 -0
- package/dist/telemetry/anomaly.js +2 -0
- package/dist/telemetry/anomaly.js.map +1 -0
- package/dist/telemetry/index.d.ts +4 -0
- package/dist/telemetry/index.js +1 -0
- package/dist/telemetry/spec.d.ts +99 -0
- package/dist/telemetry/spec.d.ts.map +1 -0
- package/dist/telemetry/spec.js +2 -0
- package/dist/telemetry/spec.js.map +1 -0
- package/dist/telemetry/tracker.d.ts +52 -0
- package/dist/telemetry/tracker.d.ts.map +1 -0
- package/dist/telemetry/tracker.js +2 -0
- package/dist/telemetry/tracker.js.map +1 -0
- package/dist/tests/index.d.ts +3 -0
- package/dist/tests/index.js +1 -0
- package/dist/tests/runner.d.ts +44 -0
- package/dist/tests/runner.d.ts.map +1 -0
- package/dist/tests/runner.js +2 -0
- package/dist/tests/runner.js.map +1 -0
- package/dist/tests/spec.d.ts +90 -0
- package/dist/tests/spec.d.ts.map +1 -0
- package/dist/tests/spec.js +2 -0
- package/dist/tests/spec.js.map +1 -0
- package/dist/themes.d.ts +56 -0
- package/dist/themes.d.ts.map +1 -0
- package/dist/themes.js +2 -0
- package/dist/themes.js.map +1 -0
- package/dist/translations/catalog.d.ts +29 -0
- package/dist/translations/catalog.d.ts.map +1 -0
- package/dist/translations/catalog.js +0 -0
- package/dist/translations/tenant.d.ts +16 -0
- package/dist/translations/tenant.d.ts.map +1 -0
- package/dist/translations/tenant.js +0 -0
- package/dist/types/all.d.ts +60 -0
- package/dist/types/all.js +0 -0
- package/dist/types.d.ts +86 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +0 -0
- package/dist/workflow/adapters/db-adapter.d.ts +15 -0
- package/dist/workflow/adapters/db-adapter.d.ts.map +1 -0
- package/dist/workflow/adapters/db-adapter.js +2 -0
- package/dist/workflow/adapters/db-adapter.js.map +1 -0
- package/dist/workflow/adapters/file-adapter.d.ts +15 -0
- package/dist/workflow/adapters/file-adapter.d.ts.map +1 -0
- package/dist/workflow/adapters/file-adapter.js +2 -0
- package/dist/workflow/adapters/file-adapter.js.map +1 -0
- package/dist/workflow/adapters/index.d.ts +4 -0
- package/dist/workflow/adapters/index.js +1 -0
- package/dist/workflow/adapters/memory-store.d.ts +19 -0
- package/dist/workflow/adapters/memory-store.d.ts.map +1 -0
- package/dist/workflow/adapters/memory-store.js +2 -0
- package/dist/workflow/adapters/memory-store.js.map +1 -0
- package/dist/workflow/expression.d.ts +10 -0
- package/dist/workflow/expression.d.ts.map +1 -0
- package/dist/workflow/expression.js +2 -0
- package/dist/workflow/expression.js.map +1 -0
- package/dist/workflow/index.d.ts +10 -0
- package/dist/workflow/index.js +1 -0
- package/dist/workflow/runner.d.ts +74 -0
- package/dist/workflow/runner.d.ts.map +1 -0
- package/dist/workflow/runner.js +2 -0
- package/dist/workflow/runner.js.map +1 -0
- package/dist/workflow/spec.d.ts +100 -0
- package/dist/workflow/spec.d.ts.map +1 -0
- package/dist/workflow/spec.js +2 -0
- package/dist/workflow/spec.js.map +1 -0
- package/dist/workflow/state.d.ts +35 -0
- package/dist/workflow/state.d.ts.map +1 -0
- package/dist/workflow/state.js +0 -0
- package/dist/workflow/validation.d.ts +29 -0
- package/dist/workflow/validation.d.ts.map +1 -0
- package/dist/workflow/validation.js +2 -0
- package/dist/workflow/validation.js.map +1 -0
- package/package.json +401 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { OwnerShipMeta } from "./ownership.js";
|
|
2
|
+
import { ExperimentRef } from "./experiments/spec.js";
|
|
3
|
+
import { EventRef, OpRef, PresentationRef } from "./features.js";
|
|
4
|
+
|
|
5
|
+
//#region src/data-views.d.ts
|
|
6
|
+
type DataViewKind = 'list' | 'detail' | 'table' | 'grid';
|
|
7
|
+
interface DataViewMeta extends OwnerShipMeta {
|
|
8
|
+
/** Fully-qualified data view name (e.g., "sigil.spaces.admin_list"). */
|
|
9
|
+
name: string;
|
|
10
|
+
/** Version of this data view. Increment on breaking changes. */
|
|
11
|
+
version: number;
|
|
12
|
+
/** Canonical entity slug (e.g., "space", "resident"). */
|
|
13
|
+
entity: string;
|
|
14
|
+
}
|
|
15
|
+
interface DataViewSource {
|
|
16
|
+
/** Primary query used to fetch items for this view. */
|
|
17
|
+
primary: OpRef;
|
|
18
|
+
/** Optional operation used to fetch a single item (detail views). */
|
|
19
|
+
item?: OpRef;
|
|
20
|
+
/** Optional record mutation operations (used for inline editing or actions). */
|
|
21
|
+
mutations?: {
|
|
22
|
+
create?: OpRef;
|
|
23
|
+
update?: OpRef;
|
|
24
|
+
delete?: OpRef;
|
|
25
|
+
};
|
|
26
|
+
/** Events that should trigger refresh when emitted. */
|
|
27
|
+
refreshEvents?: EventRef[];
|
|
28
|
+
}
|
|
29
|
+
type DataViewFieldFormat = 'text' | 'number' | 'currency' | 'percentage' | 'date' | 'dateTime' | 'boolean' | 'badge';
|
|
30
|
+
interface DataViewField {
|
|
31
|
+
/** Unique identifier for the field within the view. */
|
|
32
|
+
key: string;
|
|
33
|
+
/** Human-friendly label for headers/tooltips. */
|
|
34
|
+
label: string;
|
|
35
|
+
/** Dot-path into the data item (e.g., "address.city"). */
|
|
36
|
+
dataPath: string;
|
|
37
|
+
/** Optional description surfaced in tooltips or docs. */
|
|
38
|
+
description?: string;
|
|
39
|
+
/** Optional formatting hint for renderers. */
|
|
40
|
+
format?: DataViewFieldFormat;
|
|
41
|
+
/** When true, the field can be used for sorting. */
|
|
42
|
+
sortable?: boolean;
|
|
43
|
+
/** When true, the field can be used for filtering. */
|
|
44
|
+
filterable?: boolean;
|
|
45
|
+
/** Optional width hint for table layouts. */
|
|
46
|
+
width?: 'auto' | 'xs' | 'sm' | 'md' | 'lg';
|
|
47
|
+
/** Optional presentation override (e.g., card component). */
|
|
48
|
+
presentation?: PresentationRef;
|
|
49
|
+
}
|
|
50
|
+
interface DataViewFilter {
|
|
51
|
+
key: string;
|
|
52
|
+
label: string;
|
|
53
|
+
field: string;
|
|
54
|
+
type: 'search' | 'enum' | 'number' | 'date' | 'boolean';
|
|
55
|
+
options?: {
|
|
56
|
+
value: string;
|
|
57
|
+
label: string;
|
|
58
|
+
}[];
|
|
59
|
+
}
|
|
60
|
+
interface DataViewAction {
|
|
61
|
+
key: string;
|
|
62
|
+
label: string;
|
|
63
|
+
kind: 'navigation' | 'operation';
|
|
64
|
+
/** Operation invoked when kind === 'operation'. */
|
|
65
|
+
operation?: OpRef;
|
|
66
|
+
/** Optional feature flag gating the action. */
|
|
67
|
+
requiresFlag?: string;
|
|
68
|
+
}
|
|
69
|
+
interface DataViewSections {
|
|
70
|
+
title?: string;
|
|
71
|
+
description?: string;
|
|
72
|
+
fields: string[];
|
|
73
|
+
}
|
|
74
|
+
interface DataViewBaseConfig {
|
|
75
|
+
kind: DataViewKind;
|
|
76
|
+
fields: DataViewField[];
|
|
77
|
+
primaryField?: string;
|
|
78
|
+
secondaryFields?: string[];
|
|
79
|
+
filters?: DataViewFilter[];
|
|
80
|
+
actions?: DataViewAction[];
|
|
81
|
+
}
|
|
82
|
+
interface DataViewListConfig extends DataViewBaseConfig {
|
|
83
|
+
kind: 'list';
|
|
84
|
+
layout?: 'card' | 'compact';
|
|
85
|
+
}
|
|
86
|
+
interface DataViewDetailConfig extends DataViewBaseConfig {
|
|
87
|
+
kind: 'detail';
|
|
88
|
+
sections?: DataViewSections[];
|
|
89
|
+
}
|
|
90
|
+
interface DataViewTableColumn {
|
|
91
|
+
field: string;
|
|
92
|
+
label?: string;
|
|
93
|
+
width?: 'auto' | 'xs' | 'sm' | 'md' | 'lg';
|
|
94
|
+
align?: 'left' | 'center' | 'right';
|
|
95
|
+
}
|
|
96
|
+
interface DataViewTableConfig extends DataViewBaseConfig {
|
|
97
|
+
kind: 'table';
|
|
98
|
+
columns?: DataViewTableColumn[];
|
|
99
|
+
rowSelectable?: boolean;
|
|
100
|
+
density?: 'comfortable' | 'compact';
|
|
101
|
+
}
|
|
102
|
+
interface DataViewGridConfig extends DataViewBaseConfig {
|
|
103
|
+
kind: 'grid';
|
|
104
|
+
columns?: number;
|
|
105
|
+
}
|
|
106
|
+
type DataViewConfig = DataViewListConfig | DataViewDetailConfig | DataViewTableConfig | DataViewGridConfig;
|
|
107
|
+
interface DataViewStates {
|
|
108
|
+
empty?: PresentationRef;
|
|
109
|
+
error?: PresentationRef;
|
|
110
|
+
loading?: PresentationRef;
|
|
111
|
+
}
|
|
112
|
+
interface DataViewSpec {
|
|
113
|
+
meta: DataViewMeta;
|
|
114
|
+
source: DataViewSource;
|
|
115
|
+
view: DataViewConfig;
|
|
116
|
+
states?: DataViewStates;
|
|
117
|
+
policy?: {
|
|
118
|
+
flags?: string[];
|
|
119
|
+
pii?: string[];
|
|
120
|
+
};
|
|
121
|
+
experiments?: ExperimentRef[];
|
|
122
|
+
}
|
|
123
|
+
declare class DataViewRegistry {
|
|
124
|
+
private readonly items;
|
|
125
|
+
register(spec: DataViewSpec): this;
|
|
126
|
+
list(): DataViewSpec[];
|
|
127
|
+
get(name: string, version?: number): DataViewSpec | undefined;
|
|
128
|
+
}
|
|
129
|
+
declare function dataViewKey(spec: DataViewSpec): string;
|
|
130
|
+
//#endregion
|
|
131
|
+
export { DataViewAction, DataViewBaseConfig, DataViewConfig, DataViewDetailConfig, DataViewField, DataViewFieldFormat, DataViewFilter, DataViewGridConfig, DataViewKind, DataViewListConfig, DataViewMeta, DataViewRegistry, DataViewSections, DataViewSource, DataViewSpec, DataViewStates, DataViewTableColumn, DataViewTableConfig, dataViewKey };
|
|
132
|
+
//# sourceMappingURL=data-views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-views.d.ts","names":[],"sources":["../src/data-views.ts"],"sourcesContent":[],"mappings":";;;;;KAIY,YAAA;UAEK,YAAA,SAAqB;EAF1B;EAEK,IAAA,EAAA,MAAA;EASA;EAEN,OAAA,EAAA,MAAA;EAEF;EAGI,MAAA,EAAA,MAAA;;AAEA,UATI,cAAA,CASJ;EAGK;EAAQ,OAAA,EAVf,KAUe;EAGd;EAUK,IAAA,CAAA,EArBR,KAqBQ;EAqBA;EAQA,SAAA,CAAA,EAAA;IAUA,MAAA,CAAA,EAzDJ,KAyDI;IAMA,MAAA,CAAA,EA9DJ,KA8DI;IACT,MAAA,CAAA,EA9DK,KA8DL;EACE,CAAA;EAGE;EACA,aAAA,CAAA,EAhEM,QAgEN,EAAA;;AAGK,KAhEL,mBAAA,GAgEwB,MAAQ,GAAA,QAAA,GAAA,UAAkB,GAAA,YAAA,GAAA,MAAA,GAAA,UAAA,GAAA,SAAA,GAAA,OAAA;AAK7C,UA3DA,aAAA,CA2DqB;EAKrB;EAOA,GAAA,EAAA,MAAA;EAOA;EAKL,KAAA,EAAA,MAAA;EACR;EACA,QAAA,EAAA,MAAA;EACA;EACA,WAAA,CAAA,EAAA,MAAA;EAAkB;EAEL,MAAA,CAAA,EA/EN,mBA+EoB;EACrB;EACA,QAAA,CAAA,EAAA,OAAA;EACE;EAAe,UAAA,CAAA,EAAA,OAAA;EAGV;EACT,KAAA,CAAA,EAAA,MAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA;EACE;EACF,YAAA,CAAA,EAhFS,eAgFT;;AAGQ,UAhFC,cAAA,CAgFD;EAAa,GAAA,EAAA,MAAA;EAOhB,KAAA,EAAA,MAAA;EAGI,KAAA,EAAA,MAAA;EAOP,IAAA,EAAA,QAAA,GAAA,MAAA,GAAA,QAAA,GAAA,MAAA,GAAA,SAAA;EAI6B,OAAA,CAAA,EAAA;IAAY,KAAA,EAAA,MAAA;IAenC,KAAA,EAAA,MAAW;;;UA5GV,cAAA;;;;;cAKH;;;;UAKG,gBAAA;;;;;UAMA,kBAAA;QACT;UACE;;;YAGE;YACA;;UAGK,kBAAA,SAA2B;;;;UAK3B,oBAAA,SAA6B;;aAEjC;;UAGI,mBAAA;;;;;;UAOA,mBAAA,SAA4B;;YAEjC;;;;UAKK,kBAAA,SAA2B;;;;KAKhC,cAAA,GACR,qBACA,uBACA,sBACA;UAEa,cAAA;UACP;UACA;YACE;;UAGK,YAAA;QACT;UACE;QACF;WACG;;;;;gBAEK;;cAOH,gBAAA;;iBAGI;UAOP;uCAI6B;;iBAevB,WAAA,OAAkB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){return`${e.meta.name}.v${e.meta.version}`}var t=class{items=new Map;register(t){let n=e(t);if(this.items.has(n))throw Error(`Duplicate data view ${n}`);return this.items.set(n,t),this}list(){return[...this.items.values()]}get(e,t){if(t!=null)return this.items.get(`${e}.v${t}`);let n,r=-1/0;for(let t of this.items.values())t.meta.name===e&&t.meta.version>r&&(r=t.meta.version,n=t);return n}};function n(t){return e(t)}export{t as DataViewRegistry,n as dataViewKey};
|
|
2
|
+
//# sourceMappingURL=data-views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-views.js","names":["candidate: DataViewSpec | undefined"],"sources":["../src/data-views.ts"],"sourcesContent":["import type { OwnerShipMeta } from './ownership';\nimport type { OpRef, EventRef, PresentationRef } from './features';\nimport type { ExperimentRef } from './experiments/spec';\n\nexport type DataViewKind = 'list' | 'detail' | 'table' | 'grid';\n\nexport interface DataViewMeta extends OwnerShipMeta {\n /** Fully-qualified data view name (e.g., \"sigil.spaces.admin_list\"). */\n name: string;\n /** Version of this data view. Increment on breaking changes. */\n version: number;\n /** Canonical entity slug (e.g., \"space\", \"resident\"). */\n entity: string;\n}\n\nexport interface DataViewSource {\n /** Primary query used to fetch items for this view. */\n primary: OpRef;\n /** Optional operation used to fetch a single item (detail views). */\n item?: OpRef;\n /** Optional record mutation operations (used for inline editing or actions). */\n mutations?: {\n create?: OpRef;\n update?: OpRef;\n delete?: OpRef;\n };\n /** Events that should trigger refresh when emitted. */\n refreshEvents?: EventRef[];\n}\n\nexport type DataViewFieldFormat =\n | 'text'\n | 'number'\n | 'currency'\n | 'percentage'\n | 'date'\n | 'dateTime'\n | 'boolean'\n | 'badge';\n\nexport interface DataViewField {\n /** Unique identifier for the field within the view. */\n key: string;\n /** Human-friendly label for headers/tooltips. */\n label: string;\n /** Dot-path into the data item (e.g., \"address.city\"). */\n dataPath: string;\n /** Optional description surfaced in tooltips or docs. */\n description?: string;\n /** Optional formatting hint for renderers. */\n format?: DataViewFieldFormat;\n /** When true, the field can be used for sorting. */\n sortable?: boolean;\n /** When true, the field can be used for filtering. */\n filterable?: boolean;\n /** Optional width hint for table layouts. */\n width?: 'auto' | 'xs' | 'sm' | 'md' | 'lg';\n /** Optional presentation override (e.g., card component). */\n presentation?: PresentationRef;\n}\n\nexport interface DataViewFilter {\n key: string;\n label: string;\n field: string;\n type: 'search' | 'enum' | 'number' | 'date' | 'boolean';\n options?: { value: string; label: string }[];\n}\n\nexport interface DataViewAction {\n key: string;\n label: string;\n kind: 'navigation' | 'operation';\n /** Operation invoked when kind === 'operation'. */\n operation?: OpRef;\n /** Optional feature flag gating the action. */\n requiresFlag?: string;\n}\n\nexport interface DataViewSections {\n title?: string;\n description?: string;\n fields: string[];\n}\n\nexport interface DataViewBaseConfig {\n kind: DataViewKind;\n fields: DataViewField[];\n primaryField?: string;\n secondaryFields?: string[];\n filters?: DataViewFilter[];\n actions?: DataViewAction[];\n}\n\nexport interface DataViewListConfig extends DataViewBaseConfig {\n kind: 'list';\n layout?: 'card' | 'compact';\n}\n\nexport interface DataViewDetailConfig extends DataViewBaseConfig {\n kind: 'detail';\n sections?: DataViewSections[];\n}\n\nexport interface DataViewTableColumn {\n field: string;\n label?: string;\n width?: 'auto' | 'xs' | 'sm' | 'md' | 'lg';\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface DataViewTableConfig extends DataViewBaseConfig {\n kind: 'table';\n columns?: DataViewTableColumn[];\n rowSelectable?: boolean;\n density?: 'comfortable' | 'compact';\n}\n\nexport interface DataViewGridConfig extends DataViewBaseConfig {\n kind: 'grid';\n columns?: number;\n}\n\nexport type DataViewConfig =\n | DataViewListConfig\n | DataViewDetailConfig\n | DataViewTableConfig\n | DataViewGridConfig;\n\nexport interface DataViewStates {\n empty?: PresentationRef;\n error?: PresentationRef;\n loading?: PresentationRef;\n}\n\nexport interface DataViewSpec {\n meta: DataViewMeta;\n source: DataViewSource;\n view: DataViewConfig;\n states?: DataViewStates;\n policy?: { flags?: string[]; pii?: string[] };\n experiments?: ExperimentRef[];\n}\n\nfunction keyOf(spec: DataViewSpec) {\n return `${spec.meta.name}.v${spec.meta.version}`;\n}\n\nexport class DataViewRegistry {\n private readonly items = new Map<string, DataViewSpec>();\n\n register(spec: DataViewSpec): this {\n const key = keyOf(spec);\n if (this.items.has(key)) throw new Error(`Duplicate data view ${key}`);\n this.items.set(key, spec);\n return this;\n }\n\n list(): DataViewSpec[] {\n return [...this.items.values()];\n }\n\n get(name: string, version?: number): DataViewSpec | undefined {\n if (version != null) return this.items.get(`${name}.v${version}`);\n let candidate: DataViewSpec | undefined;\n let max = -Infinity;\n for (const spec of this.items.values()) {\n if (spec.meta.name !== name) continue;\n if (spec.meta.version > max) {\n max = spec.meta.version;\n candidate = spec;\n }\n }\n return candidate;\n }\n}\n\nexport function dataViewKey(spec: DataViewSpec) {\n return keyOf(spec);\n}\n\n"],"mappings":"AAgJA,SAAS,EAAM,EAAoB,CACjC,MAAO,GAAG,EAAK,KAAK,KAAK,IAAI,EAAK,KAAK,UAGzC,IAAa,EAAb,KAA8B,CAC5B,MAAyB,IAAI,IAE7B,SAAS,EAA0B,CACjC,IAAM,EAAM,EAAM,EAAK,CACvB,GAAI,KAAK,MAAM,IAAI,EAAI,CAAE,MAAU,MAAM,uBAAuB,IAAM,CAEtE,OADA,KAAK,MAAM,IAAI,EAAK,EAAK,CAClB,KAGT,MAAuB,CACrB,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAGjC,IAAI,EAAc,EAA4C,CAC5D,GAAI,GAAW,KAAM,OAAO,KAAK,MAAM,IAAI,GAAG,EAAK,IAAI,IAAU,CACjE,IAAIA,EACA,EAAM,KACV,IAAK,IAAM,KAAQ,KAAK,MAAM,QAAQ,CAChC,EAAK,KAAK,OAAS,GACnB,EAAK,KAAK,QAAU,IACtB,EAAM,EAAK,KAAK,QAChB,EAAY,GAGhB,OAAO,IAIX,SAAgB,EAAY,EAAoB,CAC9C,OAAO,EAAM,EAAK"}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { OwnerShipMeta } from "./ownership.js";
|
|
2
|
+
|
|
3
|
+
//#region src/events.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Typed event specification. Declare once, validate payloads at publish time,
|
|
7
|
+
* and guard emissions via the contracts runtime.
|
|
8
|
+
*/
|
|
9
|
+
interface EventSpec<T extends AnySchemaModel> {
|
|
10
|
+
/** Fully-qualified event name, e.g. "sigil.magic_link.created". */
|
|
11
|
+
name: string;
|
|
12
|
+
/** Event payload version. Bump on any breaking payload change. */
|
|
13
|
+
version: number;
|
|
14
|
+
/** Short human-friendly summary. */
|
|
15
|
+
description?: string;
|
|
16
|
+
/** JSON-like paths to redact from logs/exports. */
|
|
17
|
+
pii?: string[];
|
|
18
|
+
/** Event payload schema from @lssm/lib.schema. */
|
|
19
|
+
payload: T;
|
|
20
|
+
/** Optional ownership metadata for governance and docs. */
|
|
21
|
+
ownership?: OwnerShipMeta;
|
|
22
|
+
}
|
|
23
|
+
/** Identity function to keep type inference when declaring events. */
|
|
24
|
+
declare function defineEvent<T extends AnySchemaModel>(e: EventSpec<T>): EventSpec<T>;
|
|
25
|
+
interface EventEnvelope<T> {
|
|
26
|
+
/** Unique identifier for the published event (UUID recommended). */
|
|
27
|
+
id: string;
|
|
28
|
+
/** ISO timestamp when the event occurred. */
|
|
29
|
+
occurredAt: string;
|
|
30
|
+
/** Optional trace identifier for correlating across services. */
|
|
31
|
+
traceId?: string;
|
|
32
|
+
/** Event name as published (should match spec.name). */
|
|
33
|
+
name: string;
|
|
34
|
+
/** Event version as published (should match spec.version). */
|
|
35
|
+
version: number;
|
|
36
|
+
/** Validated payload. */
|
|
37
|
+
payload: T;
|
|
38
|
+
}
|
|
39
|
+
type EventKey = `${string}.v${number}`;
|
|
40
|
+
/** Build a stable string key for an event name/version pair. */
|
|
41
|
+
declare const eventKey: (name: string, version: number) => EventKey;
|
|
42
|
+
//#endregion
|
|
43
|
+
export { EventEnvelope, EventKey, EventSpec, defineEvent, eventKey };
|
|
44
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","names":[],"sources":["../src/events.ts"],"sourcesContent":[],"mappings":";;;;;AAOA;;;AAYc,UAZG,SAYH,CAAA,UAZuB,cAYvB,CAAA,CAAA;EAAa;EAIX,IAAA,EAAA,MAAA;EAAsB;EACvB,OAAA,EAAA,MAAA;EAAV;EACQ,WAAA,CAAA,EAAA,MAAA;EAAV;EAAS,GAAA,CAAA,EAAA,MAAA,EAAA;EAIK;EAeL,OAAA,EA3BD,CA2BC;EAEC;cA3BC;;;iBAIE,sBAAsB,mBACjC,UAAU,KACZ,UAAU;UAII;;;;;;;;;;;;WAYN;;KAGC,QAAA;;cAEC,6CAA4C"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","names":[],"sources":["../src/events.ts"],"sourcesContent":["import { type AnySchemaModel } from '@lssm/lib.schema';\nimport type { OwnerShipMeta } from './ownership';\n\n/**\n * Typed event specification. Declare once, validate payloads at publish time,\n * and guard emissions via the contracts runtime.\n */\nexport interface EventSpec<T extends AnySchemaModel> {\n /** Fully-qualified event name, e.g. \"sigil.magic_link.created\". */\n name: string;\n /** Event payload version. Bump on any breaking payload change. */\n version: number;\n /** Short human-friendly summary. */\n description?: string;\n /** JSON-like paths to redact from logs/exports. */\n pii?: string[];\n /** Event payload schema from @lssm/lib.schema. */\n payload: T;\n /** Optional ownership metadata for governance and docs. */\n ownership?: OwnerShipMeta;\n}\n\n/** Identity function to keep type inference when declaring events. */\nexport function defineEvent<T extends AnySchemaModel>(\n e: EventSpec<T>\n): EventSpec<T> {\n return e;\n}\n\nexport interface EventEnvelope<T> {\n /** Unique identifier for the published event (UUID recommended). */\n id: string;\n /** ISO timestamp when the event occurred. */\n occurredAt: string;\n /** Optional trace identifier for correlating across services. */\n traceId?: string;\n /** Event name as published (should match spec.name). */\n name: string;\n /** Event version as published (should match spec.version). */\n version: number;\n /** Validated payload. */\n payload: T;\n}\n\nexport type EventKey = `${string}.v${number}`;\n/** Build a stable string key for an event name/version pair. */\nexport const eventKey = (name: string, version: number): EventKey =>\n `${name}.v${version}`;\n"],"mappings":"8BAuBA,SAAgB,EACd,EACc,CACd,OAAO,EAoBT,MAAa,GAAY,EAAc,IACrC,GAAG,EAAK,IAAI"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { PolicyRef } from "../policy/spec.js";
|
|
2
|
+
import { ExperimentRegistry, ExperimentVariant } from "./spec.js";
|
|
3
|
+
|
|
4
|
+
//#region src/experiments/evaluator.d.ts
|
|
5
|
+
interface ExperimentContext {
|
|
6
|
+
experiment: string;
|
|
7
|
+
version?: number;
|
|
8
|
+
userId?: string | null;
|
|
9
|
+
organizationId?: string | null;
|
|
10
|
+
sessionId?: string | null;
|
|
11
|
+
attributes?: Record<string, unknown>;
|
|
12
|
+
flags?: string[];
|
|
13
|
+
}
|
|
14
|
+
interface ExperimentEvaluation {
|
|
15
|
+
variant: ExperimentVariant;
|
|
16
|
+
reason: 'control' | 'random' | 'sticky' | 'targeted';
|
|
17
|
+
}
|
|
18
|
+
interface ExperimentEvaluatorConfig {
|
|
19
|
+
registry: ExperimentRegistry;
|
|
20
|
+
policyChecker?: (policy: PolicyRef, context: ExperimentContext) => Promise<boolean> | boolean;
|
|
21
|
+
expressionEvaluator?: (expression: string, context: ExperimentContext) => boolean;
|
|
22
|
+
}
|
|
23
|
+
declare class ExperimentEvaluator {
|
|
24
|
+
private readonly registry;
|
|
25
|
+
private readonly policyChecker?;
|
|
26
|
+
private readonly expressionEvaluator?;
|
|
27
|
+
constructor(config: ExperimentEvaluatorConfig);
|
|
28
|
+
chooseVariant(context: ExperimentContext): Promise<ExperimentEvaluation | null>;
|
|
29
|
+
private pickByWeight;
|
|
30
|
+
private randomSeed;
|
|
31
|
+
private stickySeed;
|
|
32
|
+
private hashToUnitInterval;
|
|
33
|
+
private evaluateTargeting;
|
|
34
|
+
private matchesRule;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { ExperimentContext, ExperimentEvaluation, ExperimentEvaluator, ExperimentEvaluatorConfig };
|
|
38
|
+
//# sourceMappingURL=evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","names":[],"sources":["../../src/experiments/evaluator.ts"],"sourcesContent":[],"mappings":";;;;UAIiB,iBAAA;;EAAA,OAAA,CAAA,EAAA,MAAA;EAUA,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAKA,cAAA,CAAA,EAAA,MAAA,GAAA,IAAyB;EAC9B,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACe,UAAA,CAAA,EAXZ,MAWY,CAAA,MAAA,EAAA,OAAA,CAAA;EAAoB,KAAA,CAAA,EAAA,MAAA,EAAA;;AACO,UARrC,oBAAA,CAQqC;EAAiB,OAAA,EAP5D,iBAO4D;EAG1D,MAAA,EAAA,SAAA,GAAA,QAAmB,GAAA,QAAA,GAAA,UAAA;;AAWD,UAjBd,yBAAA,CAiBc;EAA4B,QAAA,EAhB/C,kBAgB+C;EAAR,aAAA,CAAA,EAAA,CAAA,MAAA,EAfxB,SAewB,EAAA,OAAA,EAfJ,iBAeI,EAAA,GAfkB,OAelB,CAAA,OAAA,CAAA,GAAA,OAAA;EAAO,mBAAA,CAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAdJ,iBAcI,EAAA,GAAA,OAAA;;cAX7C,mBAAA;;;;sBAKS;yBAMS,oBAAoB,QAAQ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createHash as e}from"node:crypto";var t=class{registry;policyChecker;expressionEvaluator;constructor(e){this.registry=e.registry,this.policyChecker=e.policyChecker,this.expressionEvaluator=e.expressionEvaluator}async chooseVariant(e){let t=this.registry.get(e.experiment,e.version);if(!t)return null;let n=t.variants.find(e=>e.id===t.controlVariant);if(!n)throw Error(`Experiment ${t.meta.name} missing control variant ${t.controlVariant}`);switch(t.allocation.type){case`random`:return{variant:this.pickByWeight(t,this.randomSeed(e,t.allocation.salt)),reason:`random`};case`sticky`:return{variant:this.pickByWeight(t,this.stickySeed(e,t.allocation.attribute,t.allocation.salt)),reason:`sticky`};case`targeted`:{let r=await this.evaluateTargeting(t,e,t.allocation.rules);return r?{variant:r,reason:`targeted`}:t.allocation.fallback===`random`?{variant:this.pickByWeight(t,this.randomSeed(e)),reason:`random`}:{variant:n,reason:`control`}}default:return{variant:n,reason:`control`}}}pickByWeight(e,t){let n=e.variants,r=t*n.reduce((e,t)=>e+(t.weight??1),0),i=0;for(let e of n)if(i+=e.weight??1,r<=i)return e;return n[n.length-1]}randomSeed(e,t=``){let n=e.sessionId??e.userId??e.organizationId??`${Date.now()}-${Math.random()}`;return this.hashToUnitInterval(n+t)}stickySeed(e,t,n=``){let r=e[t];return r?this.hashToUnitInterval(`${r}-${n}`):this.randomSeed(e,n)}hashToUnitInterval(t){let n=e(`sha256`).update(t).digest(`hex`).slice(0,15);return parseInt(n,16)%1e6/1e6}async evaluateTargeting(e,t,n){for(let r of n){if(!await this.matchesRule(r,t))continue;let n=e.variants.find(e=>e.id===r.variantId);if(n&&!(typeof r.percentage==`number`&&this.randomSeed(t,`rule-${r.variantId}`)>r.percentage))return n}return null}async matchesRule(e,t){if(e.policy&&this.policyChecker&&!await this.policyChecker(e.policy,t))return!1;if(e.expression){if(this.expressionEvaluator)return!!this.expressionEvaluator(e.expression,t);try{return!!Function(`context`,`return (${e.expression});`)(t)}catch{return!1}}return!0}};export{t as ExperimentEvaluator};
|
|
2
|
+
//# sourceMappingURL=evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.js","names":[],"sources":["../../src/experiments/evaluator.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport type { PolicyRef } from '../policy/spec';\nimport type { ExperimentRegistry, ExperimentSpec, ExperimentVariant, TargetingRule } from './spec';\n\nexport interface ExperimentContext {\n experiment: string;\n version?: number;\n userId?: string | null;\n organizationId?: string | null;\n sessionId?: string | null;\n attributes?: Record<string, unknown>;\n flags?: string[];\n}\n\nexport interface ExperimentEvaluation {\n variant: ExperimentVariant;\n reason: 'control' | 'random' | 'sticky' | 'targeted';\n}\n\nexport interface ExperimentEvaluatorConfig {\n registry: ExperimentRegistry;\n policyChecker?: (policy: PolicyRef, context: ExperimentContext) => Promise<boolean> | boolean;\n expressionEvaluator?: (expression: string, context: ExperimentContext) => boolean;\n}\n\nexport class ExperimentEvaluator {\n private readonly registry: ExperimentRegistry;\n private readonly policyChecker?: ExperimentEvaluatorConfig['policyChecker'];\n private readonly expressionEvaluator?: ExperimentEvaluatorConfig['expressionEvaluator'];\n\n constructor(config: ExperimentEvaluatorConfig) {\n this.registry = config.registry;\n this.policyChecker = config.policyChecker;\n this.expressionEvaluator = config.expressionEvaluator;\n }\n\n async chooseVariant(context: ExperimentContext): Promise<ExperimentEvaluation | null> {\n const experiment = this.registry.get(context.experiment, context.version);\n if (!experiment) return null;\n\n const control = experiment.variants.find((variant) => variant.id === experiment.controlVariant);\n if (!control) throw new Error(`Experiment ${experiment.meta.name} missing control variant ${experiment.controlVariant}`);\n\n switch (experiment.allocation.type) {\n case 'random':\n return {\n variant: this.pickByWeight(experiment, this.randomSeed(context, experiment.allocation.salt)),\n reason: 'random',\n };\n case 'sticky':\n return {\n variant: this.pickByWeight(\n experiment,\n this.stickySeed(context, experiment.allocation.attribute, experiment.allocation.salt)\n ),\n reason: 'sticky',\n };\n case 'targeted':\n {\n const targeted = await this.evaluateTargeting(experiment, context, experiment.allocation.rules);\n if (targeted) {\n return {\n variant: targeted,\n reason: 'targeted',\n };\n }\n if (experiment.allocation.fallback === 'random') {\n return {\n variant: this.pickByWeight(experiment, this.randomSeed(context)),\n reason: 'random',\n };\n }\n return {\n variant: control,\n reason: 'control',\n };\n }\n default:\n return {\n variant: control,\n reason: 'control',\n };\n }\n }\n\n private pickByWeight(experiment: ExperimentSpec, seed: number): ExperimentVariant {\n const variants = experiment.variants;\n const totalWeight = variants.reduce((sum, variant) => sum + (variant.weight ?? 1), 0);\n const target = seed * totalWeight;\n let cumulative = 0;\n for (const variant of variants) {\n cumulative += variant.weight ?? 1;\n if (target <= cumulative) {\n return variant;\n }\n }\n return variants[variants.length - 1]!;\n }\n\n private randomSeed(context: ExperimentContext, salt = ''): number {\n const base =\n context.sessionId ??\n context.userId ??\n context.organizationId ??\n `${Date.now()}-${Math.random()}`;\n return this.hashToUnitInterval(base + salt);\n }\n\n private stickySeed(context: ExperimentContext, attribute: 'userId' | 'organizationId' | 'sessionId', salt = ''): number {\n const value = context[attribute];\n if (!value) return this.randomSeed(context, salt);\n return this.hashToUnitInterval(`${value}-${salt}`);\n }\n\n private hashToUnitInterval(value: string): number {\n const hash = createHash('sha256').update(value).digest('hex').slice(0, 15);\n const intValue = parseInt(hash, 16);\n return (intValue % 1_000_000) / 1_000_000;\n }\n\n private async evaluateTargeting(\n experiment: ExperimentSpec,\n context: ExperimentContext,\n rules: TargetingRule[]\n ): Promise<ExperimentVariant | null> {\n for (const rule of rules) {\n if (!(await this.matchesRule(rule, context))) continue;\n const variant = experiment.variants.find((v) => v.id === rule.variantId);\n if (!variant) continue;\n if (typeof rule.percentage === 'number') {\n const seed = this.randomSeed(context, `rule-${rule.variantId}`);\n if (seed > rule.percentage) {\n continue;\n }\n }\n return variant;\n }\n return null;\n }\n\n private async matchesRule(rule: TargetingRule, context: ExperimentContext): Promise<boolean> {\n if (rule.policy && this.policyChecker) {\n const allowed = await this.policyChecker(rule.policy, context);\n if (!allowed) return false;\n }\n if (rule.expression) {\n if (this.expressionEvaluator) {\n return Boolean(this.expressionEvaluator(rule.expression, context));\n }\n try {\n const fn = new Function('context', `return (${rule.expression});`);\n return Boolean(fn(context));\n } catch (_error) {\n return false;\n }\n }\n return true;\n }\n}\n\n"],"mappings":"yCAyBA,IAAa,EAAb,KAAiC,CAC/B,SACA,cACA,oBAEA,YAAY,EAAmC,CAC7C,KAAK,SAAW,EAAO,SACvB,KAAK,cAAgB,EAAO,cAC5B,KAAK,oBAAsB,EAAO,oBAGpC,MAAM,cAAc,EAAkE,CACpF,IAAM,EAAa,KAAK,SAAS,IAAI,EAAQ,WAAY,EAAQ,QAAQ,CACzE,GAAI,CAAC,EAAY,OAAO,KAExB,IAAM,EAAU,EAAW,SAAS,KAAM,GAAY,EAAQ,KAAO,EAAW,eAAe,CAC/F,GAAI,CAAC,EAAS,MAAU,MAAM,cAAc,EAAW,KAAK,KAAK,2BAA2B,EAAW,iBAAiB,CAExH,OAAQ,EAAW,WAAW,KAA9B,CACE,IAAK,SACH,MAAO,CACL,QAAS,KAAK,aAAa,EAAY,KAAK,WAAW,EAAS,EAAW,WAAW,KAAK,CAAC,CAC5F,OAAQ,SACT,CACH,IAAK,SACH,MAAO,CACL,QAAS,KAAK,aACZ,EACA,KAAK,WAAW,EAAS,EAAW,WAAW,UAAW,EAAW,WAAW,KAAK,CACtF,CACD,OAAQ,SACT,CACH,IAAK,WACH,CACE,IAAM,EAAW,MAAM,KAAK,kBAAkB,EAAY,EAAS,EAAW,WAAW,MAAM,CAa/F,OAZI,EACK,CACL,QAAS,EACT,OAAQ,WACT,CAEC,EAAW,WAAW,WAAa,SAC9B,CACL,QAAS,KAAK,aAAa,EAAY,KAAK,WAAW,EAAQ,CAAC,CAChE,OAAQ,SACT,CAEI,CACL,QAAS,EACT,OAAQ,UACT,CAEL,QACE,MAAO,CACL,QAAS,EACT,OAAQ,UACT,EAIP,aAAqB,EAA4B,EAAiC,CAChF,IAAM,EAAW,EAAW,SAEtB,EAAS,EADK,EAAS,QAAQ,EAAK,IAAY,GAAO,EAAQ,QAAU,GAAI,EAAE,CAEjF,EAAa,EACjB,IAAK,IAAM,KAAW,EAEpB,GADA,GAAc,EAAQ,QAAU,EAC5B,GAAU,EACZ,OAAO,EAGX,OAAO,EAAS,EAAS,OAAS,GAGpC,WAAmB,EAA4B,EAAO,GAAY,CAChE,IAAM,EACJ,EAAQ,WACR,EAAQ,QACR,EAAQ,gBACR,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,GAChC,OAAO,KAAK,mBAAmB,EAAO,EAAK,CAG7C,WAAmB,EAA4B,EAAsD,EAAO,GAAY,CACtH,IAAM,EAAQ,EAAQ,GAEtB,OADK,EACE,KAAK,mBAAmB,GAAG,EAAM,GAAG,IAAO,CAD/B,KAAK,WAAW,EAAS,EAAK,CAInD,mBAA2B,EAAuB,CAChD,IAAM,EAAO,EAAW,SAAS,CAAC,OAAO,EAAM,CAAC,OAAO,MAAM,CAAC,MAAM,EAAG,GAAG,CAE1E,OADiB,SAAS,EAAM,GAAG,CAChB,IAAa,IAGlC,MAAc,kBACZ,EACA,EACA,EACmC,CACnC,IAAK,IAAM,KAAQ,EAAO,CACxB,GAAI,CAAE,MAAM,KAAK,YAAY,EAAM,EAAQ,CAAG,SAC9C,IAAM,EAAU,EAAW,SAAS,KAAM,GAAM,EAAE,KAAO,EAAK,UAAU,CACnE,QACD,OAAO,EAAK,YAAe,UAChB,KAAK,WAAW,EAAS,QAAQ,EAAK,YAAY,CACpD,EAAK,YAIlB,OAAO,EAET,OAAO,KAGT,MAAc,YAAY,EAAqB,EAA8C,CAC3F,GAAI,EAAK,QAAU,KAAK,eAElB,CADY,MAAM,KAAK,cAAc,EAAK,OAAQ,EAAQ,CAChD,MAAO,GAEvB,GAAI,EAAK,WAAY,CACnB,GAAI,KAAK,oBACP,MAAO,EAAQ,KAAK,oBAAoB,EAAK,WAAY,EAAQ,CAEnE,GAAI,CAEF,MAAO,EADQ,SAAS,UAAW,WAAW,EAAK,WAAW,IAAI,CAChD,EAAQ,MACX,CACf,MAAO,IAGX,MAAO"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { OwnerShipMeta } from "../ownership.js";
|
|
2
|
+
import { PolicyRef } from "../policy/spec.js";
|
|
3
|
+
import { TelemetryEventDef } from "../telemetry/spec.js";
|
|
4
|
+
|
|
5
|
+
//#region src/experiments/spec.d.ts
|
|
6
|
+
interface ExperimentMeta extends OwnerShipMeta {
|
|
7
|
+
/** Fully-qualified experiment name (e.g., "sigil.onboarding.variant"). */
|
|
8
|
+
name: string;
|
|
9
|
+
/** Version of the experiment; bump when allocation or variants change materially. */
|
|
10
|
+
version: number;
|
|
11
|
+
/** Domain/bounded context (e.g., "onboarding"). */
|
|
12
|
+
domain: string;
|
|
13
|
+
}
|
|
14
|
+
interface ExperimentRef {
|
|
15
|
+
name: string;
|
|
16
|
+
version?: number;
|
|
17
|
+
}
|
|
18
|
+
type ExperimentOverrideType = 'dataView' | 'workflow' | 'theme' | 'policy' | 'presentation';
|
|
19
|
+
interface ExperimentOverride {
|
|
20
|
+
type: ExperimentOverrideType;
|
|
21
|
+
/** Target spec meta name (e.g., DataViewSpec.meta.name). */
|
|
22
|
+
target: string;
|
|
23
|
+
/** Target version. Optional; evaluator may choose latest when omitted. */
|
|
24
|
+
version?: number;
|
|
25
|
+
/** Optional configuration applied when this variant is active. */
|
|
26
|
+
config?: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
interface ExperimentVariant {
|
|
29
|
+
id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
description?: string;
|
|
32
|
+
/** Relative weight for random allocation (defaults to 1). */
|
|
33
|
+
weight?: number;
|
|
34
|
+
overrides?: ExperimentOverride[];
|
|
35
|
+
/** Optional metadata for downstream analytics/UI. */
|
|
36
|
+
metadata?: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
interface TargetingRule {
|
|
39
|
+
/** Variant to assign when rule matches. */
|
|
40
|
+
variantId: string;
|
|
41
|
+
/** Optional percentage of matching traffic (0-1). If omitted, 100%. */
|
|
42
|
+
percentage?: number;
|
|
43
|
+
/** Policies that must allow the assignment. */
|
|
44
|
+
policy?: PolicyRef;
|
|
45
|
+
/** Expression evaluated against context (see evaluator for details). */
|
|
46
|
+
expression?: string;
|
|
47
|
+
}
|
|
48
|
+
type AllocationStrategy = {
|
|
49
|
+
type: 'random';
|
|
50
|
+
/** Optional salt for deterministic hashing. */
|
|
51
|
+
salt?: string;
|
|
52
|
+
} | {
|
|
53
|
+
type: 'sticky';
|
|
54
|
+
/** Which attribute to hash for sticky assignment. */
|
|
55
|
+
attribute: 'userId' | 'organizationId' | 'sessionId';
|
|
56
|
+
salt?: string;
|
|
57
|
+
} | {
|
|
58
|
+
type: 'targeted';
|
|
59
|
+
rules: TargetingRule[];
|
|
60
|
+
fallback?: 'control' | 'random';
|
|
61
|
+
};
|
|
62
|
+
type MetricAggregation = 'count' | 'avg' | 'p75' | 'p90' | 'p95' | 'p99';
|
|
63
|
+
interface SuccessMetric {
|
|
64
|
+
name: string;
|
|
65
|
+
telemetryEvent: {
|
|
66
|
+
name: TelemetryEventDef['name'];
|
|
67
|
+
version: number;
|
|
68
|
+
};
|
|
69
|
+
aggregation: MetricAggregation;
|
|
70
|
+
target?: number;
|
|
71
|
+
}
|
|
72
|
+
interface ExperimentSpec {
|
|
73
|
+
meta: ExperimentMeta;
|
|
74
|
+
/** Identifier of the control variant (must exist in variants array). */
|
|
75
|
+
controlVariant: string;
|
|
76
|
+
variants: ExperimentVariant[];
|
|
77
|
+
allocation: AllocationStrategy;
|
|
78
|
+
successMetrics?: SuccessMetric[];
|
|
79
|
+
tags?: string[];
|
|
80
|
+
}
|
|
81
|
+
declare class ExperimentRegistry {
|
|
82
|
+
private readonly items;
|
|
83
|
+
register(spec: ExperimentSpec): this;
|
|
84
|
+
list(): ExperimentSpec[];
|
|
85
|
+
get(name: string, version?: number): ExperimentSpec | undefined;
|
|
86
|
+
}
|
|
87
|
+
declare function makeExperimentKey(meta: ExperimentMeta): string;
|
|
88
|
+
//#endregion
|
|
89
|
+
export { AllocationStrategy, ExperimentMeta, ExperimentOverride, ExperimentOverrideType, ExperimentRef, ExperimentRegistry, ExperimentSpec, ExperimentVariant, MetricAggregation, SuccessMetric, TargetingRule, makeExperimentKey };
|
|
90
|
+
//# sourceMappingURL=spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.d.ts","names":[],"sources":["../../src/experiments/spec.ts"],"sourcesContent":[],"mappings":";;;;;UAIiB,cAAA,SAAuB;;EAAvB,IAAA,EAAA,MAAA;EASA;EAKL,OAAA,EAAA,MAAA;EAOK;EAUA,MAAA,EAAA,MAAA;AAWjB;AAWY,UA5CK,aAAA,CA4Ca;EAkBlB,IAAA,EAAA,MAAA;EAEK,OAAA,CAAA,EAAA,MAAa;AAO9B;AACQ,KAnEI,sBAAA,GAmEJ,UAAA,GAAA,UAAA,GAAA,OAAA,GAAA,QAAA,GAAA,cAAA;AAGI,UA/DK,kBAAA,CA+DL;EACE,IAAA,EA/DN,sBA+DM;EACK;EAAa,MAAA,EAAA,MAAA;EAMnB;EAGI,OAAA,CAAA,EAAA,MAAA;EASP;EAI6B,MAAA,CAAA,EAhF5B,MAgF4B,CAAA,MAAA,EAAA,OAAA,CAAA;;AAiBvB,UA9FC,iBAAA,CA8FgB;;;;;;cAxFnB;;aAED;;UAGI,aAAA;;;;;;WAMN;;;;KAKC,kBAAA;;;;;;;;;;;SAcC;;;KAID,iBAAA;UAEK,aAAA;;;UAES;;;eACX;;;UAIE,cAAA;QACT;;;YAGI;cACE;mBACK;;;cAMN,kBAAA;;iBAGI;UASP;uCAI6B;;iBAiBvB,iBAAA,OAAwB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=e=>`${e.name}.v${e.version}`;var t=class{items=new Map;register(t){let n=e(t.meta);if(this.items.has(n))throw Error(`Duplicate experiment ${n}`);return this.items.set(n,t),this}list(){return[...this.items.values()]}get(e,t){if(t!=null)return this.items.get(`${e}.v${t}`);let n,r=-1/0;for(let t of this.items.values())t.meta.name===e&&t.meta.version>r&&(r=t.meta.version,n=t);return n}};function n(t){return e(t)}export{t as ExperimentRegistry,n as makeExperimentKey};
|
|
2
|
+
//# sourceMappingURL=spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","names":["latest: ExperimentSpec | undefined"],"sources":["../../src/experiments/spec.ts"],"sourcesContent":["import type { OwnerShipMeta } from '../ownership';\nimport type { PolicyRef } from '../policy/spec';\nimport type { TelemetryEventDef } from '../telemetry/spec';\n\nexport interface ExperimentMeta extends OwnerShipMeta {\n /** Fully-qualified experiment name (e.g., \"sigil.onboarding.variant\"). */\n name: string;\n /** Version of the experiment; bump when allocation or variants change materially. */\n version: number;\n /** Domain/bounded context (e.g., \"onboarding\"). */\n domain: string;\n}\n\nexport interface ExperimentRef {\n name: string;\n version?: number;\n}\n\nexport type ExperimentOverrideType =\n | 'dataView'\n | 'workflow'\n | 'theme'\n | 'policy'\n | 'presentation';\n\nexport interface ExperimentOverride {\n type: ExperimentOverrideType;\n /** Target spec meta name (e.g., DataViewSpec.meta.name). */\n target: string;\n /** Target version. Optional; evaluator may choose latest when omitted. */\n version?: number;\n /** Optional configuration applied when this variant is active. */\n config?: Record<string, unknown>;\n}\n\nexport interface ExperimentVariant {\n id: string;\n name: string;\n description?: string;\n /** Relative weight for random allocation (defaults to 1). */\n weight?: number;\n overrides?: ExperimentOverride[];\n /** Optional metadata for downstream analytics/UI. */\n metadata?: Record<string, unknown>;\n}\n\nexport interface TargetingRule {\n /** Variant to assign when rule matches. */\n variantId: string;\n /** Optional percentage of matching traffic (0-1). If omitted, 100%. */\n percentage?: number;\n /** Policies that must allow the assignment. */\n policy?: PolicyRef;\n /** Expression evaluated against context (see evaluator for details). */\n expression?: string;\n}\n\nexport type AllocationStrategy =\n | {\n type: 'random';\n /** Optional salt for deterministic hashing. */\n salt?: string;\n }\n | {\n type: 'sticky';\n /** Which attribute to hash for sticky assignment. */\n attribute: 'userId' | 'organizationId' | 'sessionId';\n salt?: string;\n }\n | {\n type: 'targeted';\n rules: TargetingRule[];\n fallback?: 'control' | 'random';\n };\n\nexport type MetricAggregation = 'count' | 'avg' | 'p75' | 'p90' | 'p95' | 'p99';\n\nexport interface SuccessMetric {\n name: string;\n telemetryEvent: { name: TelemetryEventDef['name']; version: number };\n aggregation: MetricAggregation;\n target?: number;\n}\n\nexport interface ExperimentSpec {\n meta: ExperimentMeta;\n /** Identifier of the control variant (must exist in variants array). */\n controlVariant: string;\n variants: ExperimentVariant[];\n allocation: AllocationStrategy;\n successMetrics?: SuccessMetric[];\n tags?: string[];\n}\n\nconst experimentKey = (meta: ExperimentMeta) => `${meta.name}.v${meta.version}`;\n\nexport class ExperimentRegistry {\n private readonly items = new Map<string, ExperimentSpec>();\n\n register(spec: ExperimentSpec): this {\n const key = experimentKey(spec.meta);\n if (this.items.has(key)) {\n throw new Error(`Duplicate experiment ${key}`);\n }\n this.items.set(key, spec);\n return this;\n }\n\n list(): ExperimentSpec[] {\n return [...this.items.values()];\n }\n\n get(name: string, version?: number): ExperimentSpec | undefined {\n if (version != null) {\n return this.items.get(`${name}.v${version}`);\n }\n let latest: ExperimentSpec | undefined;\n let maxVersion = -Infinity;\n for (const spec of this.items.values()) {\n if (spec.meta.name !== name) continue;\n if (spec.meta.version > maxVersion) {\n maxVersion = spec.meta.version;\n latest = spec;\n }\n }\n return latest;\n }\n}\n\nexport function makeExperimentKey(meta: ExperimentMeta) {\n return experimentKey(meta);\n}\n\n"],"mappings":"AA8FA,MAAM,EAAiB,GAAyB,GAAG,EAAK,KAAK,IAAI,EAAK,UAEtE,IAAa,EAAb,KAAgC,CAC9B,MAAyB,IAAI,IAE7B,SAAS,EAA4B,CACnC,IAAM,EAAM,EAAc,EAAK,KAAK,CACpC,GAAI,KAAK,MAAM,IAAI,EAAI,CACrB,MAAU,MAAM,wBAAwB,IAAM,CAGhD,OADA,KAAK,MAAM,IAAI,EAAK,EAAK,CAClB,KAGT,MAAyB,CACvB,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAGjC,IAAI,EAAc,EAA8C,CAC9D,GAAI,GAAW,KACb,OAAO,KAAK,MAAM,IAAI,GAAG,EAAK,IAAI,IAAU,CAE9C,IAAIA,EACA,EAAa,KACjB,IAAK,IAAM,KAAQ,KAAK,MAAM,QAAQ,CAChC,EAAK,KAAK,OAAS,GACnB,EAAK,KAAK,QAAU,IACtB,EAAa,EAAK,KAAK,QACvB,EAAS,GAGb,OAAO,IAIX,SAAgB,EAAkB,EAAsB,CACtD,OAAO,EAAc,EAAK"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { OwnerShipMeta } from "./ownership.js";
|
|
2
|
+
import { CapabilityRef, CapabilityRegistry, CapabilityRequirement } from "./capabilities.js";
|
|
3
|
+
import { PresentationRegistry } from "./presentations.js";
|
|
4
|
+
import { PresentationDescriptorV2, PresentationTarget } from "./presentations.v2.js";
|
|
5
|
+
import { ExperimentRef } from "./experiments/spec.js";
|
|
6
|
+
import { SpecRegistry } from "./registry.js";
|
|
7
|
+
|
|
8
|
+
//#region src/features.d.ts
|
|
9
|
+
/** Minimal metadata to identify and categorize a feature module. */
|
|
10
|
+
interface FeatureModuleMeta extends OwnerShipMeta {
|
|
11
|
+
/** Stable slug key used to identify this feature (e.g., "weekly_pulse"). */
|
|
12
|
+
key: string;
|
|
13
|
+
}
|
|
14
|
+
interface OpRef {
|
|
15
|
+
/** Operation name (ContractSpec.meta.name). */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Operation version (ContractSpec.meta.version). */
|
|
18
|
+
version: number;
|
|
19
|
+
}
|
|
20
|
+
interface EventRef {
|
|
21
|
+
/** Event name. */
|
|
22
|
+
name: string;
|
|
23
|
+
/** Event version. */
|
|
24
|
+
version: number;
|
|
25
|
+
}
|
|
26
|
+
interface PresentationRef {
|
|
27
|
+
/** Presentation name. */
|
|
28
|
+
name: string;
|
|
29
|
+
/** Presentation version. */
|
|
30
|
+
version: number;
|
|
31
|
+
}
|
|
32
|
+
/** Group operations/events/presentations into an installable feature. */
|
|
33
|
+
interface FeatureModuleSpec {
|
|
34
|
+
meta: FeatureModuleMeta;
|
|
35
|
+
/** Contract operations included in this feature. */
|
|
36
|
+
operations?: OpRef[];
|
|
37
|
+
/** Events declared/emitted by this feature. */
|
|
38
|
+
events?: EventRef[];
|
|
39
|
+
/** Presentations associated to this feature. */
|
|
40
|
+
presentations?: PresentationRef[];
|
|
41
|
+
/** Experiments related to this feature. */
|
|
42
|
+
experiments?: ExperimentRef[];
|
|
43
|
+
/** Capability bindings exposed/required by this feature. */
|
|
44
|
+
capabilities?: {
|
|
45
|
+
provides?: CapabilityRef[];
|
|
46
|
+
requires?: CapabilityRequirement[];
|
|
47
|
+
};
|
|
48
|
+
/** Optional: link ops to presentations for traceability (e.g., ui for op) */
|
|
49
|
+
opToPresentation?: {
|
|
50
|
+
op: OpRef;
|
|
51
|
+
pres: PresentationRef;
|
|
52
|
+
}[];
|
|
53
|
+
/** Optional: declare per-presentation target requirements (V2 descriptors) */
|
|
54
|
+
presentationsTargets?: {
|
|
55
|
+
/** Presentation name. */
|
|
56
|
+
name: string;
|
|
57
|
+
/** Presentation version. */
|
|
58
|
+
version: number;
|
|
59
|
+
/** Required targets that must be supported by the descriptor. */
|
|
60
|
+
targets: PresentationTarget[];
|
|
61
|
+
}[];
|
|
62
|
+
}
|
|
63
|
+
interface FeatureRef {
|
|
64
|
+
key: string;
|
|
65
|
+
}
|
|
66
|
+
/** In-memory registry for FeatureModuleSpec. */
|
|
67
|
+
declare class FeatureRegistry {
|
|
68
|
+
private items;
|
|
69
|
+
/** Register a feature module. Throws when the key already exists. */
|
|
70
|
+
register(f: FeatureModuleSpec): this;
|
|
71
|
+
/** List all registered feature modules. */
|
|
72
|
+
list(): FeatureModuleSpec[];
|
|
73
|
+
/** Get a feature by its key (slug). */
|
|
74
|
+
get(key: string): FeatureModuleSpec | undefined;
|
|
75
|
+
}
|
|
76
|
+
/** Validate and register a feature against optional registries/descriptors. */
|
|
77
|
+
declare function installFeature(feature: FeatureModuleSpec, deps: {
|
|
78
|
+
features: FeatureRegistry;
|
|
79
|
+
ops?: SpecRegistry;
|
|
80
|
+
presentations?: PresentationRegistry;
|
|
81
|
+
descriptorsV2?: PresentationDescriptorV2[];
|
|
82
|
+
capabilities?: CapabilityRegistry;
|
|
83
|
+
}): FeatureRegistry;
|
|
84
|
+
/** Ensure declared target requirements exist on the provided descriptors. */
|
|
85
|
+
declare function validateFeatureTargetsV2(feature: FeatureModuleSpec, descriptors: PresentationDescriptorV2[]): boolean;
|
|
86
|
+
//#endregion
|
|
87
|
+
export { EventRef, FeatureModuleMeta, FeatureModuleSpec, FeatureRef, FeatureRegistry, OpRef, PresentationRef, installFeature, validateFeatureTargetsV2 };
|
|
88
|
+
//# sourceMappingURL=features.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.d.ts","names":[],"sources":["../src/features.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UAaiB,iBAAA,SAA0B;;;AAA3C;AAKiB,UAAA,KAAA,CAAK;EAOL;EAOA,IAAA,EAAA,MAAA;EAQA;EACT,OAAA,EAAA,MAAA;;AAIG,UApBM,QAAA,CAoBN;EAEO;EAEF,IAAA,EAAA,MAAA;EAGD;EACA,OAAA,EAAA,MAAA;;AAGyB,UAxBvB,eAAA,CAwBuB;EAQ3B;EAAkB,IAAA,EAAA,MAAA;EAId;EASJ,OAAA,EAAA,MAAA;;;AAiBO,UAtDH,iBAAA,CAsDG;EAAiB,IAAA,EArD7B,iBAqD6B;EAMrB;EACL,UAAA,CAAA,EA1DI,KA0DJ,EAAA;EAEG;EAAe,MAAA,CAAA,EA1DlB,QA0DkB,EAAA;EACc;EAEvB,aAAA,CAAA,EA3DF,eA2DE,EAAA;EACD;EAChB,WAAA,CAAA,EA3Da,aA2Db,EAAA;EAAA;EAwFa,YAAA,CAAA,EAAA;eAhJD;eACA;;;;QAGY;UAAa;;;;;;;;;aAQ3B;;;UAII,UAAA;;;;cASJ,eAAA;;;cAIC;;UAQJ;;oBAKU;;;iBAMJ,cAAA,UACL;YAEG;QAAe;kBACc;kBAEvB;iBACD;IAChB;;iBAwFa,wBAAA,UACL,gCACI"}
|
package/dist/features.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){return e.meta.key}var t=class{items=new Map;register(t){let n=e(t);if(this.items.has(n))throw Error(`Duplicate feature ${n}`);return this.items.set(n,t),this}list(){return[...this.items.values()]}get(e){return this.items.get(e)}};function n(e,t){if(t.ops&&e.operations){for(let n of e.operations)if(!t.ops.getSpec(n.name,n.version))throw Error(`installFeature: operation not found ${n.name}.v${n.version}`)}if(t.presentations&&e.presentations){for(let n of e.presentations)if(!t.presentations.get(n.name,n.version))throw Error(`installFeature: presentation not found ${n.name}.v${n.version}`)}if(e.presentationsTargets&&t.descriptorsV2)for(let n of e.presentationsTargets){let e=t.descriptorsV2.find(e=>e.meta.name===n.name&&e.meta.version===n.version);if(!e)throw Error(`installFeature: V2 descriptor not found ${n.name}.v${n.version}`);for(let t of n.targets)if(!e.targets.includes(t))throw Error(`installFeature: descriptor ${n.name}.v${n.version} missing target ${t}`)}if(e.opToPresentation&&e.opToPresentation.length>0)for(let n of e.opToPresentation){if(t.ops&&!t.ops.getSpec(n.op.name,n.op.version))throw Error(`installFeature: linked op not found ${n.op.name}.v${n.op.version}`);if(t.presentations&&!t.presentations.get(n.pres.name,n.pres.version))throw Error(`installFeature: linked presentation not found ${n.pres.name}.v${n.pres.version}`)}if(t.capabilities&&e.capabilities?.provides){for(let n of e.capabilities.provides)if(!t.capabilities.get(n.key,n.version))throw Error(`installFeature: capability not registered ${n.key}.v${n.version}`)}if(e.capabilities?.requires?.length){if(!t.capabilities)throw Error(`installFeature: capability registry required to validate capability requirements for ${e.meta.key}`);let n=e.capabilities.provides??[];for(let r of e.capabilities.requires)if(!t.capabilities.satisfies(r,n))throw Error(`installFeature: capability requirement not satisfied ${r.key}${r.version?`.v${r.version}`:``}`)}return t.features.register(e),t.features}function r(e,t){if(!e.presentationsTargets||e.presentationsTargets.length===0)return!0;for(let n of e.presentationsTargets){let e=t.find(e=>e.meta.name===n.name&&e.meta.version===n.version);if(!e)throw Error(`V2 descriptor not found ${n.name}.v${n.version}`);for(let t of n.targets)if(!e.targets.includes(t))throw Error(`Descriptor ${n.name}.v${n.version} missing target ${t}`)}return!0}export{t as FeatureRegistry,n as installFeature,r as validateFeatureTargetsV2};
|
|
2
|
+
//# sourceMappingURL=features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.js","names":[],"sources":["../src/features.ts"],"sourcesContent":["import type {\n PresentationTarget,\n PresentationDescriptorV2,\n} from './presentations.v2';\nimport type { OwnerShipMeta } from './ownership';\nimport type {\n CapabilityRef,\n CapabilityRequirement,\n CapabilityRegistry,\n} from './capabilities';\nimport type { ExperimentRef } from './experiments/spec';\n\n/** Minimal metadata to identify and categorize a feature module. */\nexport interface FeatureModuleMeta extends OwnerShipMeta {\n /** Stable slug key used to identify this feature (e.g., \"weekly_pulse\"). */\n key: string;\n}\n\nexport interface OpRef {\n /** Operation name (ContractSpec.meta.name). */\n name: string;\n /** Operation version (ContractSpec.meta.version). */\n version: number;\n}\n\nexport interface EventRef {\n /** Event name. */\n name: string;\n /** Event version. */\n version: number;\n}\n\nexport interface PresentationRef {\n /** Presentation name. */\n name: string;\n /** Presentation version. */\n version: number;\n}\n\n/** Group operations/events/presentations into an installable feature. */\nexport interface FeatureModuleSpec {\n meta: FeatureModuleMeta;\n /** Contract operations included in this feature. */\n operations?: OpRef[];\n /** Events declared/emitted by this feature. */\n events?: EventRef[];\n /** Presentations associated to this feature. */\n presentations?: PresentationRef[];\n /** Experiments related to this feature. */\n experiments?: ExperimentRef[];\n /** Capability bindings exposed/required by this feature. */\n capabilities?: {\n provides?: CapabilityRef[];\n requires?: CapabilityRequirement[];\n };\n /** Optional: link ops to presentations for traceability (e.g., ui for op) */\n opToPresentation?: { op: OpRef; pres: PresentationRef }[];\n /** Optional: declare per-presentation target requirements (V2 descriptors) */\n presentationsTargets?: {\n /** Presentation name. */\n name: string;\n /** Presentation version. */\n version: number;\n /** Required targets that must be supported by the descriptor. */\n targets: PresentationTarget[];\n }[];\n}\n\nexport interface FeatureRef {\n key: string;\n}\n\nfunction keyOf(f: FeatureModuleSpec) {\n return f.meta.key;\n}\n\n/** In-memory registry for FeatureModuleSpec. */\nexport class FeatureRegistry {\n private items = new Map<string, FeatureModuleSpec>();\n\n /** Register a feature module. Throws when the key already exists. */\n register(f: FeatureModuleSpec): this {\n const key = keyOf(f);\n if (this.items.has(key)) throw new Error(`Duplicate feature ${key}`);\n this.items.set(key, f);\n return this;\n }\n\n /** List all registered feature modules. */\n list(): FeatureModuleSpec[] {\n return [...this.items.values()];\n }\n\n /** Get a feature by its key (slug). */\n get(key: string): FeatureModuleSpec | undefined {\n return this.items.get(key);\n }\n}\n\n/** Validate and register a feature against optional registries/descriptors. */\nexport function installFeature(\n feature: FeatureModuleSpec,\n deps: {\n features: FeatureRegistry;\n ops?: import('./registry').SpecRegistry;\n presentations?: import('./presentations').PresentationRegistry;\n descriptorsV2?: PresentationDescriptorV2[];\n capabilities?: CapabilityRegistry;\n }\n) {\n // Validate referenced ops exist if registry provided\n if (deps.ops && feature.operations) {\n for (const o of feature.operations) {\n const s = deps.ops.getSpec(o.name, o.version);\n if (!s)\n throw new Error(\n `installFeature: operation not found ${o.name}.v${o.version}`\n );\n }\n }\n // Validate referenced presentations exist if registry provided\n if (deps.presentations && feature.presentations) {\n for (const p of feature.presentations) {\n const pres = deps.presentations.get(p.name, p.version);\n if (!pres)\n throw new Error(\n `installFeature: presentation not found ${p.name}.v${p.version}`\n );\n }\n }\n // Validate V2 target requirements if provided\n if (feature.presentationsTargets && deps.descriptorsV2) {\n for (const req of feature.presentationsTargets) {\n const d = deps.descriptorsV2.find(\n (x) => x.meta.name === req.name && x.meta.version === req.version\n );\n if (!d)\n throw new Error(\n `installFeature: V2 descriptor not found ${req.name}.v${req.version}`\n );\n for (const t of req.targets) {\n if (!d.targets.includes(t))\n throw new Error(\n `installFeature: descriptor ${req.name}.v${req.version} missing target ${t}`\n );\n }\n }\n }\n // Validate op→presentation links\n if (feature.opToPresentation && feature.opToPresentation.length > 0) {\n for (const link of feature.opToPresentation) {\n if (deps.ops) {\n const s = deps.ops.getSpec(link.op.name, link.op.version);\n if (!s)\n throw new Error(\n `installFeature: linked op not found ${link.op.name}.v${link.op.version}`\n );\n }\n if (deps.presentations) {\n const pres = deps.presentations.get(link.pres.name, link.pres.version);\n if (!pres)\n throw new Error(\n `installFeature: linked presentation not found ${link.pres.name}.v${link.pres.version}`\n );\n }\n }\n }\n // Validate capability bindings when registry provided\n if (deps.capabilities && feature.capabilities?.provides) {\n for (const cap of feature.capabilities.provides) {\n const spec = deps.capabilities.get(cap.key, cap.version);\n if (!spec)\n throw new Error(\n `installFeature: capability not registered ${cap.key}.v${cap.version}`\n );\n }\n }\n if (feature.capabilities?.requires?.length) {\n if (!deps.capabilities)\n throw new Error(\n `installFeature: capability registry required to validate capability requirements for ${feature.meta.key}`\n );\n const provided = feature.capabilities.provides ?? [];\n for (const req of feature.capabilities.requires) {\n const satisfied = deps.capabilities.satisfies(req, provided);\n if (!satisfied)\n throw new Error(\n `installFeature: capability requirement not satisfied ${req.key}${req.version ? `.v${req.version}` : ''}`\n );\n }\n }\n deps.features.register(feature);\n return deps.features;\n}\n\n/** Ensure declared target requirements exist on the provided descriptors. */\nexport function validateFeatureTargetsV2(\n feature: FeatureModuleSpec,\n descriptors: PresentationDescriptorV2[]\n) {\n if (\n !feature.presentationsTargets ||\n feature.presentationsTargets.length === 0\n )\n return true;\n for (const req of feature.presentationsTargets) {\n const d = descriptors.find(\n (x) => x.meta.name === req.name && x.meta.version === req.version\n );\n if (!d)\n throw new Error(`V2 descriptor not found ${req.name}.v${req.version}`);\n for (const t of req.targets)\n if (!d.targets.includes(t))\n throw new Error(\n `Descriptor ${req.name}.v${req.version} missing target ${t}`\n );\n }\n return true;\n}\n"],"mappings":"AAwEA,SAAS,EAAM,EAAsB,CACnC,OAAO,EAAE,KAAK,IAIhB,IAAa,EAAb,KAA6B,CAC3B,MAAgB,IAAI,IAGpB,SAAS,EAA4B,CACnC,IAAM,EAAM,EAAM,EAAE,CACpB,GAAI,KAAK,MAAM,IAAI,EAAI,CAAE,MAAU,MAAM,qBAAqB,IAAM,CAEpE,OADA,KAAK,MAAM,IAAI,EAAK,EAAE,CACf,KAIT,MAA4B,CAC1B,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAIjC,IAAI,EAA4C,CAC9C,OAAO,KAAK,MAAM,IAAI,EAAI,GAK9B,SAAgB,EACd,EACA,EAOA,CAEA,GAAI,EAAK,KAAO,EAAQ,gBACjB,IAAM,KAAK,EAAQ,WAEtB,GAAI,CADM,EAAK,IAAI,QAAQ,EAAE,KAAM,EAAE,QAAQ,CAE3C,MAAU,MACR,uCAAuC,EAAE,KAAK,IAAI,EAAE,UACrD,CAIP,GAAI,EAAK,eAAiB,EAAQ,mBAC3B,IAAM,KAAK,EAAQ,cAEtB,GAAI,CADS,EAAK,cAAc,IAAI,EAAE,KAAM,EAAE,QAAQ,CAEpD,MAAU,MACR,0CAA0C,EAAE,KAAK,IAAI,EAAE,UACxD,CAIP,GAAI,EAAQ,sBAAwB,EAAK,cACvC,IAAK,IAAM,KAAO,EAAQ,qBAAsB,CAC9C,IAAM,EAAI,EAAK,cAAc,KAC1B,GAAM,EAAE,KAAK,OAAS,EAAI,MAAQ,EAAE,KAAK,UAAY,EAAI,QAC3D,CACD,GAAI,CAAC,EACH,MAAU,MACR,2CAA2C,EAAI,KAAK,IAAI,EAAI,UAC7D,CACH,IAAK,IAAM,KAAK,EAAI,QAClB,GAAI,CAAC,EAAE,QAAQ,SAAS,EAAE,CACxB,MAAU,MACR,8BAA8B,EAAI,KAAK,IAAI,EAAI,QAAQ,kBAAkB,IAC1E,CAKT,GAAI,EAAQ,kBAAoB,EAAQ,iBAAiB,OAAS,EAChE,IAAK,IAAM,KAAQ,EAAQ,iBAAkB,CAC3C,GAAI,EAAK,KAEH,CADM,EAAK,IAAI,QAAQ,EAAK,GAAG,KAAM,EAAK,GAAG,QAAQ,CAEvD,MAAU,MACR,uCAAuC,EAAK,GAAG,KAAK,IAAI,EAAK,GAAG,UACjE,CAEL,GAAI,EAAK,eAEH,CADS,EAAK,cAAc,IAAI,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,CAEpE,MAAU,MACR,iDAAiD,EAAK,KAAK,KAAK,IAAI,EAAK,KAAK,UAC/E,CAKT,GAAI,EAAK,cAAgB,EAAQ,cAAc,cACxC,IAAM,KAAO,EAAQ,aAAa,SAErC,GAAI,CADS,EAAK,aAAa,IAAI,EAAI,IAAK,EAAI,QAAQ,CAEtD,MAAU,MACR,6CAA6C,EAAI,IAAI,IAAI,EAAI,UAC9D,CAGP,GAAI,EAAQ,cAAc,UAAU,OAAQ,CAC1C,GAAI,CAAC,EAAK,aACR,MAAU,MACR,wFAAwF,EAAQ,KAAK,MACtG,CACH,IAAM,EAAW,EAAQ,aAAa,UAAY,EAAE,CACpD,IAAK,IAAM,KAAO,EAAQ,aAAa,SAErC,GAAI,CADc,EAAK,aAAa,UAAU,EAAK,EAAS,CAE1D,MAAU,MACR,wDAAwD,EAAI,MAAM,EAAI,QAAU,KAAK,EAAI,UAAY,KACtG,CAIP,OADA,EAAK,SAAS,SAAS,EAAQ,CACxB,EAAK,SAId,SAAgB,EACd,EACA,EACA,CACA,GACE,CAAC,EAAQ,sBACT,EAAQ,qBAAqB,SAAW,EAExC,MAAO,GACT,IAAK,IAAM,KAAO,EAAQ,qBAAsB,CAC9C,IAAM,EAAI,EAAY,KACnB,GAAM,EAAE,KAAK,OAAS,EAAI,MAAQ,EAAE,KAAK,UAAY,EAAI,QAC3D,CACD,GAAI,CAAC,EACH,MAAU,MAAM,2BAA2B,EAAI,KAAK,IAAI,EAAI,UAAU,CACxE,IAAK,IAAM,KAAK,EAAI,QAClB,GAAI,CAAC,EAAE,QAAQ,SAAS,EAAE,CACxB,MAAU,MACR,cAAc,EAAI,KAAK,IAAI,EAAI,QAAQ,kBAAkB,IAC1D,CAEP,MAAO"}
|