@lssm/lib.contracts 1.10.0 → 1.11.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 +3 -1
- package/dist/app-config/branding.d.ts +1 -2
- package/dist/app-config/contracts.d.ts +51 -52
- package/dist/app-config/contracts.js +1 -2
- package/dist/app-config/events.d.ts +28 -29
- package/dist/app-config/events.js +1 -2
- package/dist/app-config/lifecycle-contracts.d.ts +81 -82
- package/dist/app-config/lifecycle-contracts.js +1 -2
- package/dist/app-config/lifecycle.d.ts +1 -2
- package/dist/app-config/runtime.d.ts +1 -2
- package/dist/app-config/runtime.js +1 -2
- package/dist/app-config/spec.d.ts +1 -2
- package/dist/app-config/spec.js +1 -2
- package/dist/app-config/validation.d.ts +1 -2
- package/dist/app-config/validation.js +1 -2
- package/dist/capabilities/openbanking.d.ts +1 -2
- package/dist/capabilities/openbanking.js +1 -2
- package/dist/capabilities.d.ts +1 -2
- package/dist/capabilities.js +1 -2
- package/dist/client/react/drivers/rn-reusables.d.ts +1 -2
- package/dist/client/react/drivers/rn-reusables.js +1 -2
- package/dist/client/react/drivers/shadcn.d.ts +1 -2
- package/dist/client/react/drivers/shadcn.js +1 -2
- package/dist/client/react/feature-render.d.ts +1 -2
- package/dist/client/react/feature-render.js +1 -2
- package/dist/client/react/form-render.d.ts +1 -2
- package/dist/client/react/form-render.js +1 -2
- package/dist/contracts-adapter-hydration.d.ts +1 -2
- package/dist/contracts-adapter-hydration.js +1 -2
- package/dist/contracts-adapter-input.d.ts +1 -2
- package/dist/contracts-adapter-input.js +1 -2
- package/dist/data-views/query-generator.d.ts +1 -2
- package/dist/data-views/query-generator.js +1 -2
- package/dist/data-views/runtime.d.ts +1 -2
- package/dist/data-views/runtime.js +1 -2
- package/dist/data-views.d.ts +1 -2
- package/dist/data-views.js +1 -2
- package/dist/events.d.ts +1 -2
- package/dist/events.js +1 -2
- package/dist/experiments/evaluator.d.ts +1 -2
- package/dist/experiments/evaluator.js +1 -2
- package/dist/experiments/spec-resolver.d.ts +1 -2
- package/dist/experiments/spec.d.ts +1 -2
- package/dist/experiments/spec.js +1 -2
- package/dist/features.d.ts +1 -2
- package/dist/features.js +1 -2
- package/dist/forms.d.ts +1 -2
- package/dist/forms.js +1 -2
- package/dist/graphql-federation/dist/index.js +1 -2
- package/dist/install.d.ts +1 -2
- package/dist/install.js +1 -2
- package/dist/integrations/binding.d.ts +1 -2
- package/dist/integrations/connection.d.ts +1 -2
- package/dist/integrations/contracts.d.ts +103 -104
- package/dist/integrations/contracts.js +1 -2
- package/dist/integrations/health.d.ts +1 -2
- package/dist/integrations/health.js +1 -2
- package/dist/integrations/openbanking/contracts/accounts.d.ts +67 -68
- package/dist/integrations/openbanking/contracts/accounts.js +1 -2
- package/dist/integrations/openbanking/contracts/balances.d.ts +35 -36
- package/dist/integrations/openbanking/contracts/balances.js +1 -2
- package/dist/integrations/openbanking/contracts/index.d.ts +1 -2
- package/dist/integrations/openbanking/contracts/index.js +1 -2
- package/dist/integrations/openbanking/contracts/transactions.d.ts +49 -50
- package/dist/integrations/openbanking/contracts/transactions.js +1 -2
- package/dist/integrations/openbanking/guards.d.ts +1 -2
- package/dist/integrations/openbanking/guards.js +1 -2
- package/dist/integrations/openbanking/models.d.ts +56 -57
- package/dist/integrations/openbanking/models.js +1 -2
- package/dist/integrations/openbanking/telemetry.d.ts +1 -2
- package/dist/integrations/openbanking/telemetry.js +1 -2
- package/dist/integrations/providers/calendar.d.ts +1 -2
- package/dist/integrations/providers/elevenlabs.d.ts +1 -2
- package/dist/integrations/providers/elevenlabs.js +1 -2
- package/dist/integrations/providers/email.d.ts +1 -2
- package/dist/integrations/providers/embedding.d.ts +1 -2
- package/dist/integrations/providers/gcs-storage.d.ts +1 -2
- package/dist/integrations/providers/gcs-storage.js +1 -2
- package/dist/integrations/providers/gmail.d.ts +1 -2
- package/dist/integrations/providers/gmail.js +1 -2
- package/dist/integrations/providers/google-calendar.d.ts +1 -2
- package/dist/integrations/providers/google-calendar.js +1 -2
- package/dist/integrations/providers/impls/elevenlabs-voice.d.ts +1 -2
- package/dist/integrations/providers/impls/elevenlabs-voice.js +1 -2
- package/dist/integrations/providers/impls/gcs-storage.d.ts +1 -2
- package/dist/integrations/providers/impls/gcs-storage.js +1 -2
- package/dist/integrations/providers/impls/gmail-inbound.d.ts +1 -2
- package/dist/integrations/providers/impls/gmail-inbound.js +1 -2
- package/dist/integrations/providers/impls/gmail-outbound.d.ts +1 -2
- package/dist/integrations/providers/impls/gmail-outbound.js +1 -2
- package/dist/integrations/providers/impls/google-calendar.d.ts +1 -2
- package/dist/integrations/providers/impls/google-calendar.js +1 -2
- package/dist/integrations/providers/impls/mistral-embedding.d.ts +1 -2
- package/dist/integrations/providers/impls/mistral-embedding.js +1 -2
- package/dist/integrations/providers/impls/mistral-llm.d.ts +1 -2
- package/dist/integrations/providers/impls/mistral-llm.js +1 -2
- package/dist/integrations/providers/impls/postmark-email.d.ts +1 -2
- package/dist/integrations/providers/impls/postmark-email.js +1 -2
- package/dist/integrations/providers/impls/powens-client.d.ts +1 -2
- package/dist/integrations/providers/impls/powens-client.js +1 -2
- package/dist/integrations/providers/impls/powens-openbanking.d.ts +1 -2
- package/dist/integrations/providers/impls/powens-openbanking.js +1 -2
- package/dist/integrations/providers/impls/provider-factory.d.ts +1 -2
- package/dist/integrations/providers/impls/provider-factory.js +1 -2
- package/dist/integrations/providers/impls/qdrant-vector.d.ts +1 -2
- package/dist/integrations/providers/impls/qdrant-vector.js +1 -2
- package/dist/integrations/providers/impls/stripe-payments.d.ts +1 -2
- package/dist/integrations/providers/impls/stripe-payments.js +1 -2
- package/dist/integrations/providers/impls/twilio-sms.d.ts +1 -2
- package/dist/integrations/providers/impls/twilio-sms.js +1 -2
- package/dist/integrations/providers/llm.d.ts +1 -2
- package/dist/integrations/providers/mistral.d.ts +1 -2
- package/dist/integrations/providers/mistral.js +1 -2
- package/dist/integrations/providers/openbanking.d.ts +1 -2
- package/dist/integrations/providers/payments.d.ts +1 -2
- package/dist/integrations/providers/postmark.d.ts +1 -2
- package/dist/integrations/providers/postmark.js +1 -2
- package/dist/integrations/providers/powens.d.ts +1 -2
- package/dist/integrations/providers/powens.js +1 -2
- package/dist/integrations/providers/qdrant.d.ts +1 -2
- package/dist/integrations/providers/qdrant.js +1 -2
- package/dist/integrations/providers/sms.d.ts +1 -2
- package/dist/integrations/providers/storage.d.ts +1 -2
- package/dist/integrations/providers/stripe.d.ts +1 -2
- package/dist/integrations/providers/stripe.js +1 -2
- package/dist/integrations/providers/twilio-sms.d.ts +1 -2
- package/dist/integrations/providers/twilio-sms.js +1 -2
- package/dist/integrations/providers/vector-store.d.ts +1 -2
- package/dist/integrations/providers/voice.d.ts +1 -2
- package/dist/integrations/runtime.d.ts +1 -2
- package/dist/integrations/runtime.js +1 -2
- package/dist/integrations/secrets/env-secret-provider.d.ts +1 -2
- package/dist/integrations/secrets/env-secret-provider.js +1 -2
- package/dist/integrations/secrets/gcp-secret-manager.d.ts +1 -2
- package/dist/integrations/secrets/gcp-secret-manager.js +1 -2
- package/dist/integrations/secrets/manager.d.ts +1 -2
- package/dist/integrations/secrets/manager.js +1 -2
- package/dist/integrations/secrets/provider.d.ts +1 -2
- package/dist/integrations/secrets/provider.js +1 -2
- package/dist/integrations/spec.d.ts +1 -2
- package/dist/integrations/spec.js +1 -2
- package/dist/jobs/gcp-cloud-tasks.d.ts +1 -2
- package/dist/jobs/gcp-cloud-tasks.js +1 -2
- package/dist/jobs/gcp-pubsub.d.ts +1 -2
- package/dist/jobs/gcp-pubsub.js +1 -2
- package/dist/jobs/handlers/gmail-sync-handler.d.ts +1 -2
- package/dist/jobs/handlers/gmail-sync-handler.js +1 -2
- package/dist/jobs/handlers/storage-document-handler.d.ts +1 -2
- package/dist/jobs/handlers/storage-document-handler.js +1 -2
- package/dist/jobs/memory-queue.d.ts +1 -2
- package/dist/jobs/memory-queue.js +1 -2
- package/dist/jobs/queue.d.ts +1 -2
- package/dist/jsonschema.d.ts +1 -2
- package/dist/jsonschema.js +1 -2
- package/dist/knowledge/binding.d.ts +1 -2
- package/dist/knowledge/contracts.d.ts +67 -68
- package/dist/knowledge/contracts.js +1 -2
- package/dist/knowledge/ingestion/document-processor.d.ts +1 -2
- package/dist/knowledge/ingestion/document-processor.js +1 -2
- package/dist/knowledge/ingestion/embedding-service.d.ts +1 -2
- package/dist/knowledge/ingestion/embedding-service.js +1 -2
- package/dist/knowledge/ingestion/gmail-adapter.d.ts +1 -2
- package/dist/knowledge/ingestion/gmail-adapter.js +1 -2
- package/dist/knowledge/ingestion/storage-adapter.d.ts +1 -2
- package/dist/knowledge/ingestion/storage-adapter.js +1 -2
- package/dist/knowledge/ingestion/vector-indexer.d.ts +1 -2
- package/dist/knowledge/ingestion/vector-indexer.js +1 -2
- package/dist/knowledge/query/service.d.ts +1 -2
- package/dist/knowledge/query/service.js +1 -2
- package/dist/knowledge/runtime.d.ts +1 -2
- package/dist/knowledge/runtime.js +1 -2
- package/dist/knowledge/source.d.ts +1 -2
- package/dist/knowledge/spaces/email-threads.d.ts +1 -2
- package/dist/knowledge/spaces/email-threads.js +1 -2
- package/dist/knowledge/spaces/financial-docs.d.ts +1 -2
- package/dist/knowledge/spaces/financial-docs.js +1 -2
- package/dist/knowledge/spaces/financial-overview.d.ts +1 -2
- package/dist/knowledge/spaces/financial-overview.js +1 -2
- package/dist/knowledge/spaces/product-canon.d.ts +1 -2
- package/dist/knowledge/spaces/product-canon.js +1 -2
- package/dist/knowledge/spaces/support-faq.d.ts +1 -2
- package/dist/knowledge/spaces/support-faq.js +1 -2
- package/dist/knowledge/spaces/uploaded-docs.d.ts +1 -2
- package/dist/knowledge/spaces/uploaded-docs.js +1 -2
- package/dist/knowledge/spec.d.ts +1 -2
- package/dist/knowledge/spec.js +1 -2
- package/dist/markdown.d.ts +1 -2
- package/dist/markdown.js +1 -2
- package/dist/migrations.d.ts +1 -2
- package/dist/migrations.js +1 -2
- package/dist/onboarding-base.d.ts +30 -31
- package/dist/onboarding-base.js +1 -2
- package/dist/ownership.d.ts +1 -2
- package/dist/ownership.js +1 -2
- package/dist/policy/engine.d.ts +1 -2
- package/dist/policy/engine.js +1 -2
- package/dist/policy/opa-adapter.d.ts +1 -2
- package/dist/policy/opa-adapter.js +1 -2
- package/dist/policy/spec.d.ts +1 -2
- package/dist/policy/spec.js +1 -2
- package/dist/presentations.backcompat.d.ts +1 -2
- package/dist/presentations.backcompat.js +1 -2
- package/dist/presentations.d.ts +1 -2
- package/dist/presentations.js +1 -2
- package/dist/presentations.v2.d.ts +1 -2
- package/dist/presentations.v2.js +1 -2
- package/dist/prompt.d.ts +1 -2
- package/dist/prompt.js +1 -2
- package/dist/promptRegistry.d.ts +1 -2
- package/dist/promptRegistry.js +1 -2
- package/dist/regenerator/adapters.d.ts +1 -2
- package/dist/regenerator/executor.d.ts +1 -2
- package/dist/regenerator/executor.js +1 -2
- package/dist/regenerator/service.d.ts +1 -2
- package/dist/regenerator/service.js +1 -2
- package/dist/regenerator/sinks.d.ts +1 -2
- package/dist/regenerator/sinks.js +1 -2
- package/dist/regenerator/types.d.ts +1 -2
- package/dist/regenerator/utils.d.ts +1 -2
- package/dist/regenerator/utils.js +1 -2
- package/dist/registry.d.ts +1 -2
- package/dist/registry.js +1 -2
- package/dist/resources.d.ts +1 -2
- package/dist/resources.js +1 -2
- package/dist/schema/dist/FieldType.js +1 -2
- package/dist/schema/dist/ScalarTypeEnum.js +1 -2
- package/dist/schema/dist/SchemaModel.js +1 -2
- package/dist/server/graphql-pothos.d.ts +1 -2
- package/dist/server/graphql-pothos.js +1 -2
- package/dist/server/graphql-schema-export.d.ts +1 -2
- package/dist/server/graphql-schema-export.js +1 -2
- package/dist/server/provider-mcp.d.ts +1 -2
- package/dist/server/provider-mcp.js +1 -2
- package/dist/server/rest-elysia.d.ts +1 -2
- package/dist/server/rest-elysia.js +1 -2
- package/dist/server/rest-express.d.ts +1 -2
- package/dist/server/rest-express.js +1 -2
- package/dist/server/rest-generic.d.ts +1 -2
- package/dist/server/rest-generic.js +1 -2
- package/dist/server/rest-next-app.d.ts +1 -2
- package/dist/server/rest-next-app.js +1 -2
- package/dist/server/rest-next-mcp.d.ts +1 -2
- package/dist/server/rest-next-mcp.js +1 -2
- package/dist/server/rest-next-pages.d.ts +1 -2
- package/dist/server/rest-next-pages.js +1 -2
- package/dist/spec.d.ts +1 -2
- package/dist/spec.js +1 -2
- package/dist/telemetry/anomaly.d.ts +1 -2
- package/dist/telemetry/anomaly.js +1 -2
- package/dist/telemetry/spec.d.ts +1 -2
- package/dist/telemetry/spec.js +1 -2
- package/dist/telemetry/tracker.d.ts +1 -2
- package/dist/telemetry/tracker.js +1 -2
- package/dist/tests/runner.d.ts +1 -2
- package/dist/tests/runner.js +1 -2
- package/dist/tests/spec.d.ts +1 -2
- package/dist/tests/spec.js +1 -2
- package/dist/themes.d.ts +1 -2
- package/dist/themes.js +1 -2
- package/dist/translations/catalog.d.ts +1 -2
- package/dist/translations/tenant.d.ts +1 -2
- package/dist/types.d.ts +1 -2
- package/dist/workflow/adapters/db-adapter.d.ts +1 -2
- package/dist/workflow/adapters/db-adapter.js +1 -2
- package/dist/workflow/adapters/file-adapter.d.ts +1 -2
- package/dist/workflow/adapters/file-adapter.js +1 -2
- package/dist/workflow/adapters/memory-store.d.ts +1 -2
- package/dist/workflow/adapters/memory-store.js +1 -2
- package/dist/workflow/expression.d.ts +1 -2
- package/dist/workflow/expression.js +1 -2
- package/dist/workflow/runner.d.ts +1 -2
- package/dist/workflow/runner.js +1 -2
- package/dist/workflow/sla-monitor.d.ts +1 -2
- package/dist/workflow/sla-monitor.js +1 -2
- package/dist/workflow/spec.d.ts +1 -2
- package/dist/workflow/spec.js +1 -2
- package/dist/workflow/state.d.ts +1 -2
- package/dist/workflow/validation.d.ts +1 -2
- package/dist/workflow/validation.js +1 -2
- package/package.json +14 -12
- package/dist/app-config/branding.d.ts.map +0 -1
- package/dist/app-config/contracts.d.ts.map +0 -1
- package/dist/app-config/contracts.js.map +0 -1
- package/dist/app-config/events.d.ts.map +0 -1
- package/dist/app-config/events.js.map +0 -1
- package/dist/app-config/lifecycle-contracts.d.ts.map +0 -1
- package/dist/app-config/lifecycle-contracts.js.map +0 -1
- package/dist/app-config/lifecycle.d.ts.map +0 -1
- package/dist/app-config/runtime.d.ts.map +0 -1
- package/dist/app-config/runtime.js.map +0 -1
- package/dist/app-config/spec.d.ts.map +0 -1
- package/dist/app-config/spec.js.map +0 -1
- package/dist/app-config/validation.d.ts.map +0 -1
- package/dist/app-config/validation.js.map +0 -1
- package/dist/capabilities/openbanking.d.ts.map +0 -1
- package/dist/capabilities/openbanking.js.map +0 -1
- package/dist/capabilities.d.ts.map +0 -1
- package/dist/capabilities.js.map +0 -1
- package/dist/client/react/drivers/rn-reusables.d.ts.map +0 -1
- package/dist/client/react/drivers/rn-reusables.js.map +0 -1
- package/dist/client/react/drivers/shadcn.d.ts.map +0 -1
- package/dist/client/react/drivers/shadcn.js.map +0 -1
- package/dist/client/react/feature-render.d.ts.map +0 -1
- package/dist/client/react/feature-render.js.map +0 -1
- package/dist/client/react/form-render.d.ts.map +0 -1
- package/dist/client/react/form-render.js.map +0 -1
- package/dist/contracts-adapter-hydration.d.ts.map +0 -1
- package/dist/contracts-adapter-hydration.js.map +0 -1
- package/dist/contracts-adapter-input.d.ts.map +0 -1
- package/dist/contracts-adapter-input.js.map +0 -1
- package/dist/data-views/query-generator.d.ts.map +0 -1
- package/dist/data-views/query-generator.js.map +0 -1
- package/dist/data-views/runtime.d.ts.map +0 -1
- package/dist/data-views/runtime.js.map +0 -1
- package/dist/data-views.d.ts.map +0 -1
- package/dist/data-views.js.map +0 -1
- package/dist/events.d.ts.map +0 -1
- package/dist/events.js.map +0 -1
- package/dist/experiments/evaluator.d.ts.map +0 -1
- package/dist/experiments/evaluator.js.map +0 -1
- package/dist/experiments/spec-resolver.d.ts.map +0 -1
- package/dist/experiments/spec.d.ts.map +0 -1
- package/dist/experiments/spec.js.map +0 -1
- package/dist/features.d.ts.map +0 -1
- package/dist/features.js.map +0 -1
- package/dist/forms.d.ts.map +0 -1
- package/dist/forms.js.map +0 -1
- package/dist/graphql-federation/dist/index.js.map +0 -1
- package/dist/install.d.ts.map +0 -1
- package/dist/install.js.map +0 -1
- package/dist/integrations/binding.d.ts.map +0 -1
- package/dist/integrations/connection.d.ts.map +0 -1
- package/dist/integrations/contracts.d.ts.map +0 -1
- package/dist/integrations/contracts.js.map +0 -1
- package/dist/integrations/health.d.ts.map +0 -1
- package/dist/integrations/health.js.map +0 -1
- package/dist/integrations/openbanking/contracts/accounts.d.ts.map +0 -1
- package/dist/integrations/openbanking/contracts/accounts.js.map +0 -1
- package/dist/integrations/openbanking/contracts/balances.d.ts.map +0 -1
- package/dist/integrations/openbanking/contracts/balances.js.map +0 -1
- package/dist/integrations/openbanking/contracts/index.d.ts.map +0 -1
- package/dist/integrations/openbanking/contracts/index.js.map +0 -1
- package/dist/integrations/openbanking/contracts/transactions.d.ts.map +0 -1
- package/dist/integrations/openbanking/contracts/transactions.js.map +0 -1
- package/dist/integrations/openbanking/guards.d.ts.map +0 -1
- package/dist/integrations/openbanking/guards.js.map +0 -1
- package/dist/integrations/openbanking/models.d.ts.map +0 -1
- package/dist/integrations/openbanking/models.js.map +0 -1
- package/dist/integrations/openbanking/telemetry.d.ts.map +0 -1
- package/dist/integrations/openbanking/telemetry.js.map +0 -1
- package/dist/integrations/providers/calendar.d.ts.map +0 -1
- package/dist/integrations/providers/elevenlabs.d.ts.map +0 -1
- package/dist/integrations/providers/elevenlabs.js.map +0 -1
- package/dist/integrations/providers/email.d.ts.map +0 -1
- package/dist/integrations/providers/embedding.d.ts.map +0 -1
- package/dist/integrations/providers/gcs-storage.d.ts.map +0 -1
- package/dist/integrations/providers/gcs-storage.js.map +0 -1
- package/dist/integrations/providers/gmail.d.ts.map +0 -1
- package/dist/integrations/providers/gmail.js.map +0 -1
- package/dist/integrations/providers/google-calendar.d.ts.map +0 -1
- package/dist/integrations/providers/google-calendar.js.map +0 -1
- package/dist/integrations/providers/impls/elevenlabs-voice.d.ts.map +0 -1
- package/dist/integrations/providers/impls/elevenlabs-voice.js.map +0 -1
- package/dist/integrations/providers/impls/gcs-storage.d.ts.map +0 -1
- package/dist/integrations/providers/impls/gcs-storage.js.map +0 -1
- package/dist/integrations/providers/impls/gmail-inbound.d.ts.map +0 -1
- package/dist/integrations/providers/impls/gmail-inbound.js.map +0 -1
- package/dist/integrations/providers/impls/gmail-outbound.d.ts.map +0 -1
- package/dist/integrations/providers/impls/gmail-outbound.js.map +0 -1
- package/dist/integrations/providers/impls/google-calendar.d.ts.map +0 -1
- package/dist/integrations/providers/impls/google-calendar.js.map +0 -1
- package/dist/integrations/providers/impls/mistral-embedding.d.ts.map +0 -1
- package/dist/integrations/providers/impls/mistral-embedding.js.map +0 -1
- package/dist/integrations/providers/impls/mistral-llm.d.ts.map +0 -1
- package/dist/integrations/providers/impls/mistral-llm.js.map +0 -1
- package/dist/integrations/providers/impls/postmark-email.d.ts.map +0 -1
- package/dist/integrations/providers/impls/postmark-email.js.map +0 -1
- package/dist/integrations/providers/impls/powens-client.d.ts.map +0 -1
- package/dist/integrations/providers/impls/powens-client.js.map +0 -1
- package/dist/integrations/providers/impls/powens-openbanking.d.ts.map +0 -1
- package/dist/integrations/providers/impls/powens-openbanking.js.map +0 -1
- package/dist/integrations/providers/impls/provider-factory.d.ts.map +0 -1
- package/dist/integrations/providers/impls/provider-factory.js.map +0 -1
- package/dist/integrations/providers/impls/qdrant-vector.d.ts.map +0 -1
- package/dist/integrations/providers/impls/qdrant-vector.js.map +0 -1
- package/dist/integrations/providers/impls/stripe-payments.d.ts.map +0 -1
- package/dist/integrations/providers/impls/stripe-payments.js.map +0 -1
- package/dist/integrations/providers/impls/twilio-sms.d.ts.map +0 -1
- package/dist/integrations/providers/impls/twilio-sms.js.map +0 -1
- package/dist/integrations/providers/llm.d.ts.map +0 -1
- package/dist/integrations/providers/mistral.d.ts.map +0 -1
- package/dist/integrations/providers/mistral.js.map +0 -1
- package/dist/integrations/providers/openbanking.d.ts.map +0 -1
- package/dist/integrations/providers/payments.d.ts.map +0 -1
- package/dist/integrations/providers/postmark.d.ts.map +0 -1
- package/dist/integrations/providers/postmark.js.map +0 -1
- package/dist/integrations/providers/powens.d.ts.map +0 -1
- package/dist/integrations/providers/powens.js.map +0 -1
- package/dist/integrations/providers/qdrant.d.ts.map +0 -1
- package/dist/integrations/providers/qdrant.js.map +0 -1
- package/dist/integrations/providers/sms.d.ts.map +0 -1
- package/dist/integrations/providers/storage.d.ts.map +0 -1
- package/dist/integrations/providers/stripe.d.ts.map +0 -1
- package/dist/integrations/providers/stripe.js.map +0 -1
- package/dist/integrations/providers/twilio-sms.d.ts.map +0 -1
- package/dist/integrations/providers/twilio-sms.js.map +0 -1
- package/dist/integrations/providers/vector-store.d.ts.map +0 -1
- package/dist/integrations/providers/voice.d.ts.map +0 -1
- package/dist/integrations/runtime.d.ts.map +0 -1
- package/dist/integrations/runtime.js.map +0 -1
- package/dist/integrations/secrets/env-secret-provider.d.ts.map +0 -1
- package/dist/integrations/secrets/env-secret-provider.js.map +0 -1
- package/dist/integrations/secrets/gcp-secret-manager.d.ts.map +0 -1
- package/dist/integrations/secrets/gcp-secret-manager.js.map +0 -1
- package/dist/integrations/secrets/manager.d.ts.map +0 -1
- package/dist/integrations/secrets/manager.js.map +0 -1
- package/dist/integrations/secrets/provider.d.ts.map +0 -1
- package/dist/integrations/secrets/provider.js.map +0 -1
- package/dist/integrations/spec.d.ts.map +0 -1
- package/dist/integrations/spec.js.map +0 -1
- package/dist/jobs/gcp-cloud-tasks.d.ts.map +0 -1
- package/dist/jobs/gcp-cloud-tasks.js.map +0 -1
- package/dist/jobs/gcp-pubsub.d.ts.map +0 -1
- package/dist/jobs/gcp-pubsub.js.map +0 -1
- package/dist/jobs/handlers/gmail-sync-handler.d.ts.map +0 -1
- package/dist/jobs/handlers/gmail-sync-handler.js.map +0 -1
- package/dist/jobs/handlers/storage-document-handler.d.ts.map +0 -1
- package/dist/jobs/handlers/storage-document-handler.js.map +0 -1
- package/dist/jobs/memory-queue.d.ts.map +0 -1
- package/dist/jobs/memory-queue.js.map +0 -1
- package/dist/jobs/queue.d.ts.map +0 -1
- package/dist/jsonschema.d.ts.map +0 -1
- package/dist/jsonschema.js.map +0 -1
- package/dist/knowledge/binding.d.ts.map +0 -1
- package/dist/knowledge/contracts.d.ts.map +0 -1
- package/dist/knowledge/contracts.js.map +0 -1
- package/dist/knowledge/ingestion/document-processor.d.ts.map +0 -1
- package/dist/knowledge/ingestion/document-processor.js.map +0 -1
- package/dist/knowledge/ingestion/embedding-service.d.ts.map +0 -1
- package/dist/knowledge/ingestion/embedding-service.js.map +0 -1
- package/dist/knowledge/ingestion/gmail-adapter.d.ts.map +0 -1
- package/dist/knowledge/ingestion/gmail-adapter.js.map +0 -1
- package/dist/knowledge/ingestion/storage-adapter.d.ts.map +0 -1
- package/dist/knowledge/ingestion/storage-adapter.js.map +0 -1
- package/dist/knowledge/ingestion/vector-indexer.d.ts.map +0 -1
- package/dist/knowledge/ingestion/vector-indexer.js.map +0 -1
- package/dist/knowledge/query/service.d.ts.map +0 -1
- package/dist/knowledge/query/service.js.map +0 -1
- package/dist/knowledge/runtime.d.ts.map +0 -1
- package/dist/knowledge/runtime.js.map +0 -1
- package/dist/knowledge/source.d.ts.map +0 -1
- package/dist/knowledge/spaces/email-threads.d.ts.map +0 -1
- package/dist/knowledge/spaces/email-threads.js.map +0 -1
- package/dist/knowledge/spaces/financial-docs.d.ts.map +0 -1
- package/dist/knowledge/spaces/financial-docs.js.map +0 -1
- package/dist/knowledge/spaces/financial-overview.d.ts.map +0 -1
- package/dist/knowledge/spaces/financial-overview.js.map +0 -1
- package/dist/knowledge/spaces/product-canon.d.ts.map +0 -1
- package/dist/knowledge/spaces/product-canon.js.map +0 -1
- package/dist/knowledge/spaces/support-faq.d.ts.map +0 -1
- package/dist/knowledge/spaces/support-faq.js.map +0 -1
- package/dist/knowledge/spaces/uploaded-docs.d.ts.map +0 -1
- package/dist/knowledge/spaces/uploaded-docs.js.map +0 -1
- package/dist/knowledge/spec.d.ts.map +0 -1
- package/dist/knowledge/spec.js.map +0 -1
- package/dist/markdown.d.ts.map +0 -1
- package/dist/markdown.js.map +0 -1
- package/dist/migrations.d.ts.map +0 -1
- package/dist/migrations.js.map +0 -1
- package/dist/onboarding-base.d.ts.map +0 -1
- package/dist/onboarding-base.js.map +0 -1
- package/dist/ownership.d.ts.map +0 -1
- package/dist/ownership.js.map +0 -1
- package/dist/policy/engine.d.ts.map +0 -1
- package/dist/policy/engine.js.map +0 -1
- package/dist/policy/opa-adapter.d.ts.map +0 -1
- package/dist/policy/opa-adapter.js.map +0 -1
- package/dist/policy/spec.d.ts.map +0 -1
- package/dist/policy/spec.js.map +0 -1
- package/dist/presentations.backcompat.d.ts.map +0 -1
- package/dist/presentations.backcompat.js.map +0 -1
- package/dist/presentations.d.ts.map +0 -1
- package/dist/presentations.js.map +0 -1
- package/dist/presentations.v2.d.ts.map +0 -1
- package/dist/presentations.v2.js.map +0 -1
- package/dist/prompt.d.ts.map +0 -1
- package/dist/prompt.js.map +0 -1
- package/dist/promptRegistry.d.ts.map +0 -1
- package/dist/promptRegistry.js.map +0 -1
- package/dist/regenerator/adapters.d.ts.map +0 -1
- package/dist/regenerator/executor.d.ts.map +0 -1
- package/dist/regenerator/executor.js.map +0 -1
- package/dist/regenerator/service.d.ts.map +0 -1
- package/dist/regenerator/service.js.map +0 -1
- package/dist/regenerator/sinks.d.ts.map +0 -1
- package/dist/regenerator/sinks.js.map +0 -1
- package/dist/regenerator/types.d.ts.map +0 -1
- package/dist/regenerator/utils.d.ts.map +0 -1
- package/dist/regenerator/utils.js.map +0 -1
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js.map +0 -1
- package/dist/resources.d.ts.map +0 -1
- package/dist/resources.js.map +0 -1
- package/dist/schema/dist/FieldType.js.map +0 -1
- package/dist/schema/dist/ScalarTypeEnum.js.map +0 -1
- package/dist/schema/dist/SchemaModel.js.map +0 -1
- package/dist/server/graphql-pothos.d.ts.map +0 -1
- package/dist/server/graphql-pothos.js.map +0 -1
- package/dist/server/graphql-schema-export.d.ts.map +0 -1
- package/dist/server/graphql-schema-export.js.map +0 -1
- package/dist/server/provider-mcp.d.ts.map +0 -1
- package/dist/server/provider-mcp.js.map +0 -1
- package/dist/server/rest-elysia.d.ts.map +0 -1
- package/dist/server/rest-elysia.js.map +0 -1
- package/dist/server/rest-express.d.ts.map +0 -1
- package/dist/server/rest-express.js.map +0 -1
- package/dist/server/rest-generic.d.ts.map +0 -1
- package/dist/server/rest-generic.js.map +0 -1
- package/dist/server/rest-next-app.d.ts.map +0 -1
- package/dist/server/rest-next-app.js.map +0 -1
- package/dist/server/rest-next-mcp.d.ts.map +0 -1
- package/dist/server/rest-next-mcp.js.map +0 -1
- package/dist/server/rest-next-pages.d.ts.map +0 -1
- package/dist/server/rest-next-pages.js.map +0 -1
- package/dist/spec.d.ts.map +0 -1
- package/dist/spec.js.map +0 -1
- package/dist/telemetry/anomaly.d.ts.map +0 -1
- package/dist/telemetry/anomaly.js.map +0 -1
- package/dist/telemetry/spec.d.ts.map +0 -1
- package/dist/telemetry/spec.js.map +0 -1
- package/dist/telemetry/tracker.d.ts.map +0 -1
- package/dist/telemetry/tracker.js.map +0 -1
- package/dist/tests/runner.d.ts.map +0 -1
- package/dist/tests/runner.js.map +0 -1
- package/dist/tests/spec.d.ts.map +0 -1
- package/dist/tests/spec.js.map +0 -1
- package/dist/themes.d.ts.map +0 -1
- package/dist/themes.js.map +0 -1
- package/dist/translations/catalog.d.ts.map +0 -1
- package/dist/translations/tenant.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/workflow/adapters/db-adapter.d.ts.map +0 -1
- package/dist/workflow/adapters/db-adapter.js.map +0 -1
- package/dist/workflow/adapters/file-adapter.d.ts.map +0 -1
- package/dist/workflow/adapters/file-adapter.js.map +0 -1
- package/dist/workflow/adapters/memory-store.d.ts.map +0 -1
- package/dist/workflow/adapters/memory-store.js.map +0 -1
- package/dist/workflow/expression.d.ts.map +0 -1
- package/dist/workflow/expression.js.map +0 -1
- package/dist/workflow/runner.d.ts.map +0 -1
- package/dist/workflow/runner.js.map +0 -1
- package/dist/workflow/sla-monitor.d.ts.map +0 -1
- package/dist/workflow/sla-monitor.js.map +0 -1
- package/dist/workflow/spec.d.ts.map +0 -1
- package/dist/workflow/spec.js.map +0 -1
- package/dist/workflow/state.d.ts.map +0 -1
- package/dist/workflow/validation.d.ts.map +0 -1
- package/dist/workflow/validation.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","names":["registry: PolicyRegistry","allowReason: string | undefined","appliedRateLimit: PolicyDecision['rateLimit']","escalate: 'human_review' | null | undefined","specs: PolicySpec[]","allowMatch: RuleEvaluation | undefined","evaluation: RuleEvaluation","definition: RateLimitDefinition | undefined"],"sources":["../../src/policy/engine.ts"],"sourcesContent":["import {\n PolicyRegistry,\n type PolicyRef,\n type PolicySpec,\n type PolicyRule,\n type FieldPolicyRule,\n type PolicyCondition,\n type ConsentDefinition,\n type RateLimitDefinition,\n type RelationshipMatcher,\n} from './spec';\nimport type { PolicyDecision, FieldLevelDecision } from '../types';\n\nexport interface SubjectRelationship {\n relation: string;\n object: string;\n objectType?: string;\n}\n\nexport interface SubjectContext {\n roles?: string[];\n attributes?: Record<string, unknown>;\n relationships?: SubjectRelationship[];\n}\n\nexport interface ResourceContext {\n type: string;\n id?: string;\n fields?: string[];\n attributes?: Record<string, unknown>;\n}\n\nexport interface DecisionContext {\n subject: SubjectContext;\n resource: ResourceContext;\n context?: Record<string, unknown>;\n action: string;\n policies: PolicyRef[];\n consents?: string[];\n flags?: string[];\n}\n\ninterface RuleEvaluation {\n rule: PolicyRule;\n missingConsents: ConsentDefinition[];\n rateLimit?: PolicyDecision['rateLimit'];\n}\n\nexport class PolicyEngine {\n constructor(private readonly registry: PolicyRegistry) {}\n\n decide(input: DecisionContext): PolicyDecision {\n const policies = this.resolvePolicies(input.policies);\n let allowReason: string | undefined;\n let appliedRateLimit: PolicyDecision['rateLimit'];\n let escalate: 'human_review' | null | undefined;\n\n for (const policy of policies) {\n const match = this.matchRuleSet(policy, input);\n if (!match) continue;\n if (match.rule.effect === 'deny') {\n return {\n effect: 'deny',\n reason: match.rule.reason ?? policy.meta.name,\n requiredConsents: match.missingConsents.length\n ? match.missingConsents\n : undefined,\n evaluatedBy: 'engine',\n };\n }\n if (match.rule.effect === 'allow') {\n if (match.missingConsents.length) {\n return {\n effect: 'deny',\n reason: 'consent_required',\n requiredConsents: match.missingConsents,\n evaluatedBy: 'engine',\n };\n }\n if (!allowReason) {\n allowReason = match.rule.reason ?? policy.meta.name;\n }\n if (!appliedRateLimit && match.rateLimit) {\n appliedRateLimit = match.rateLimit;\n }\n if (!escalate && match.rule.escalate) {\n escalate = match.rule.escalate;\n }\n }\n }\n\n const fieldDecisions = this.evaluateFields(policies, input);\n const pii = policies.find((p) => p.pii)?.pii;\n const escalateValue =\n typeof escalate === 'undefined' ? undefined : escalate;\n\n return {\n effect: allowReason ? 'allow' : 'deny',\n reason: allowReason,\n rateLimit: appliedRateLimit,\n escalate: escalateValue,\n fieldDecisions: fieldDecisions.length ? fieldDecisions : undefined,\n pii,\n evaluatedBy: 'engine',\n };\n }\n\n private resolvePolicies(refs: PolicyRef[]): PolicySpec[] {\n const specs: PolicySpec[] = [];\n for (const ref of refs) {\n const spec = this.registry.get(ref.name, ref.version);\n if (!spec)\n throw new Error(\n `PolicyEngine: policy not found ${ref.name}.v${ref.version}`\n );\n specs.push(spec);\n }\n return specs;\n }\n\n private matchRuleSet(\n policy: PolicySpec,\n input: DecisionContext\n ): RuleEvaluation | undefined {\n let allowMatch: RuleEvaluation | undefined;\n for (const rule of policy.rules) {\n if (!rule.actions.includes(input.action)) continue;\n if (!matchesSubject(rule, input.subject)) continue;\n if (!matchesResource(rule, input.resource)) continue;\n if (!matchesFlags(rule, input)) continue;\n if (!matchesRelationships(rule.relationships, input)) continue;\n if (!matchesConditions(rule, input)) continue;\n const missingConsents = collectMissingConsents(rule, policy, input);\n const rateLimit = resolveRateLimit(rule, policy, input);\n const evaluation: RuleEvaluation = {\n rule,\n missingConsents,\n rateLimit,\n };\n if (rule.effect === 'deny') return evaluation;\n if (rule.effect === 'allow' && !allowMatch) allowMatch = evaluation;\n }\n return allowMatch;\n }\n\n private evaluateFields(\n policies: PolicySpec[],\n input: DecisionContext\n ): FieldLevelDecision[] {\n const out = new Map<string, FieldLevelDecision>();\n for (const policy of policies) {\n if (!policy.fieldPolicies) continue;\n for (const rule of policy.fieldPolicies) {\n if (!rule.actions.includes(mapActionToFieldAction(input.action)))\n continue;\n if (!matchesSubject(rule, input.subject)) continue;\n if (!matchesResource(rule, input.resource)) continue;\n if (!matchesConditions(rule, input)) continue;\n const existing = out.get(rule.field);\n if (rule.effect === 'deny') {\n out.set(rule.field, {\n field: rule.field,\n effect: 'deny',\n reason: rule.reason ?? policy.meta.name,\n });\n } else if (!existing) {\n out.set(rule.field, {\n field: rule.field,\n effect: 'allow',\n reason: rule.reason ?? policy.meta.name,\n });\n }\n }\n }\n return [...out.values()];\n }\n}\n\nfunction mapActionToFieldAction(action: string): 'read' | 'write' {\n if (action.startsWith('write')) return 'write';\n return 'read';\n}\n\nfunction matchesSubject(\n rule: { subject?: PolicyRule['subject'] | FieldPolicyRule['subject'] },\n subject: SubjectContext\n): boolean {\n const matcher = rule.subject;\n if (!matcher) return true;\n if (matcher.roles?.length) {\n const roles = subject.roles ?? [];\n const hasRole = matcher.roles.some((role) => roles.includes(role));\n if (!hasRole) return false;\n }\n if (matcher.attributes) {\n const attributes = subject.attributes ?? {};\n if (!matchAttributes(matcher.attributes, attributes)) return false;\n }\n return true;\n}\n\nfunction matchesResource(\n rule: { resource?: PolicyRule['resource'] | FieldPolicyRule['resource'] },\n resource: ResourceContext\n): boolean {\n const matcher = rule.resource;\n if (!matcher) return true;\n if (matcher.type && matcher.type !== resource.type) return false;\n if (matcher.fields?.length) {\n const targetFields = resource.fields ?? [];\n if (!matcher.fields.some((field) => targetFields.includes(field)))\n return false;\n }\n if (matcher.attributes) {\n const attributes = resource.attributes ?? {};\n if (!matchAttributes(matcher.attributes, attributes)) return false;\n }\n return true;\n}\n\nfunction matchesFlags(rule: PolicyRule, input: DecisionContext): boolean {\n if (!rule.flags?.length) return true;\n const available = new Set<string>();\n if (input.flags) {\n for (const flag of input.flags) available.add(flag);\n }\n const attributeFlags = input.subject.attributes?.featureFlags;\n if (Array.isArray(attributeFlags)) {\n for (const flag of attributeFlags) available.add(flag);\n }\n return rule.flags.every((flag) => available.has(flag));\n}\n\nfunction matchesRelationships(\n matchers: RelationshipMatcher[] | undefined,\n input: DecisionContext\n): boolean {\n if (!matchers || matchers.length === 0) return true;\n const relationships = input.subject.relationships ?? [];\n const resourceId = getResourceId(input.resource);\n const resourceType = input.resource.type;\n\n return matchers.every((matcher) =>\n relationships.some((relation) => {\n if (relation.relation !== matcher.relation) return false;\n\n const typeMatches =\n !matcher.objectType ||\n relation.objectType === matcher.objectType ||\n matcher.objectType === resourceType;\n\n if (!typeMatches) return false;\n\n if (!matcher.objectId) return true;\n\n if (matcher.objectId === '$resource') {\n if (resourceId) {\n return relation.object === resourceId;\n }\n return (\n relation.object === resourceType ||\n relation.objectType === resourceType\n );\n }\n\n return relation.object === matcher.objectId;\n })\n );\n}\n\nfunction matchesConditions(\n rule: { conditions?: PolicyCondition[] },\n input: DecisionContext\n): boolean {\n if (!rule.conditions || rule.conditions.length === 0) return true;\n return rule.conditions.every((condition) =>\n evaluateCondition(condition.expression, input)\n );\n}\n\nfunction matchAttributes(\n matcher: Record<string, import('./spec').AttributeMatcher>,\n actual: Record<string, unknown>\n): boolean {\n for (const [key, attrMatcher] of Object.entries(matcher)) {\n const value = actual[key];\n if (attrMatcher.exists && typeof value === 'undefined') return false;\n if (typeof attrMatcher.equals !== 'undefined') {\n if (value !== attrMatcher.equals) return false;\n }\n if (attrMatcher.oneOf && !attrMatcher.oneOf.includes(value)) return false;\n }\n return true;\n}\n\nfunction collectMissingConsents(\n rule: PolicyRule,\n policy: PolicySpec,\n input: DecisionContext\n): ConsentDefinition[] {\n if (!rule.requiresConsent?.length) return [];\n const granted = new Set(input.consents ?? []);\n const missingIds = rule.requiresConsent.filter((id) => !granted.has(id));\n if (missingIds.length === 0) return [];\n return resolveConsentDefinitions(policy, missingIds);\n}\n\nfunction resolveConsentDefinitions(\n policy: PolicySpec,\n ids: string[]\n): ConsentDefinition[] {\n const catalog = policy.consents ?? [];\n return ids.map((id) => {\n const found = catalog.find((consent) => consent.id === id);\n return (\n found ?? {\n id,\n scope: 'unspecified',\n purpose: 'unspecified',\n description: `Consent \"${id}\" required by ${policy.meta.name}`,\n required: true,\n }\n );\n });\n}\n\nfunction resolveRateLimit(\n rule: PolicyRule,\n policy: PolicySpec,\n input: DecisionContext\n): PolicyDecision['rateLimit'] | undefined {\n if (!rule.rateLimit) return undefined;\n const definition: RateLimitDefinition | undefined =\n typeof rule.rateLimit === 'string'\n ? (policy.rateLimits ?? []).find((item) => item.id === rule.rateLimit)\n : rule.rateLimit;\n\n if (!definition) {\n throw new Error(\n `PolicyEngine: rate limit \"${String(\n rule.rateLimit\n )}\" not declared in ${policy.meta.name}`\n );\n }\n\n return {\n rpm: definition.rpm,\n key: definition.key ?? input.resource.type,\n windowSeconds: definition.windowSeconds,\n burst: definition.burst,\n };\n}\n\nfunction evaluateCondition(\n expression: string,\n input: DecisionContext\n): boolean {\n const trimmed = expression.trim();\n if (!trimmed) return true;\n\n const context = {\n subject: input.subject,\n resource: input.resource,\n context: input.context ?? {},\n };\n\n try {\n // very small whitelist of expressions\n // Supports subject/resource/context dot paths, comparisons, and logical operators.\n const fn = new Function(\n 'subject',\n 'resource',\n 'context',\n `return (${transformExpression(trimmed)});`\n );\n const result = fn(context.subject, context.resource, context.context);\n return Boolean(result);\n } catch (_error) {\n return false;\n }\n}\n\nfunction transformExpression(expression: string): string {\n return expression.replace(/&&/g, '&&').replace(/\\|\\|/g, '||');\n}\n\nfunction getResourceId(resource: ResourceContext): string | undefined {\n if (resource.id) return resource.id;\n const candidate = resource.attributes?.id;\n if (typeof candidate === 'string') return candidate;\n if (typeof candidate === 'number') return String(candidate);\n return undefined;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"opa-adapter.d.ts","names":[],"sources":["../../src/policy/opa-adapter.ts"],"sourcesContent":[],"mappings":";;;;;UAIiB,SAAA;qDACoC,QAAQ;AAD7D;AAIiB,UAAA,mBAAA,CAAmB;EAOnB,MAAA,CAAA,EAAA,OAAA,GAAA,MAAiB;EAWrB,MAAA,CAAA,EAAA,MAAA;EAA0B,cAAA,CAAA,EAfpB,cAeoB,CAAA,gBAAA,CAAA;EAEV,gBAAA,CAAA,EAAA,MAAA,EAAA;;AACC,UAdb,iBAca,CAAA,SAdc,mBAcd,GAAA,IAAA,CAAA,CAAA;EAIjB;;;EAGA,YAAA,EAAA,MAAA;EAAR;;AAqCL;EACW,SAAA,CAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAnDuB,MAmDvB;;AAEO,cAlDL,gBAkDK,CAAA,SAlDqB,mBAkDrB,GAAA,IAAA,CAAA,CAAA;;;sBAhDW,oBACC,kBAAkB;oBAInC,2BACC,8BACM,iBACf,QAAQ;;iBAqCG,aAAA,UACL,2BACC,8BACM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"opa-adapter.js","names":["client: OPAClient","options: OPAAdapterOptions<Result>"],"sources":["../../src/policy/opa-adapter.ts"],"sourcesContent":["import type { PolicyDecision } from '../types';\nimport type { PolicySpec, ConsentDefinition } from './spec';\nimport type { DecisionContext } from './engine';\n\nexport interface OPAClient {\n evaluate<T>(decisionPath: string, input: unknown): Promise<T>;\n}\n\nexport interface OPAEvaluationResult {\n effect?: 'allow' | 'deny';\n reason?: string;\n fieldDecisions?: PolicyDecision['fieldDecisions'];\n requiredConsents?: string[];\n}\n\nexport interface OPAAdapterOptions<Result = OPAEvaluationResult | null> {\n /**\n * Path fed to the OPA client (e.g., \"sigil/authz/allow\").\n */\n decisionPath: string;\n /**\n * Optional mapper when the OPA client returns a non-standard payload.\n */\n mapResult?: (value: unknown) => Result;\n}\n\nexport class OPAPolicyAdapter<Result = OPAEvaluationResult | null> {\n constructor(\n private readonly client: OPAClient,\n private readonly options: OPAAdapterOptions<Result>\n ) {}\n\n async evaluate(\n context: DecisionContext,\n policies: PolicySpec[],\n engineDecision: PolicyDecision\n ): Promise<PolicyDecision> {\n const input = buildOPAInput(context, policies, engineDecision);\n const raw = await this.client.evaluate<unknown>(\n this.options.decisionPath,\n input\n );\n const resolved = this.options.mapResult\n ? this.options.mapResult(raw)\n : (raw as OPAEvaluationResult | null);\n\n if (!resolved) {\n return {\n ...engineDecision,\n evaluatedBy: engineDecision.evaluatedBy ?? 'engine',\n };\n }\n\n const opaResult = resolved as OPAEvaluationResult;\n const mergedRequiredConsents = mergeRequiredConsents(\n policies,\n engineDecision.requiredConsents ?? [],\n opaResult.requiredConsents ?? []\n );\n\n return {\n ...engineDecision,\n effect: opaResult.effect ?? engineDecision.effect,\n reason: opaResult.reason ?? engineDecision.reason,\n fieldDecisions: opaResult.fieldDecisions ?? engineDecision.fieldDecisions,\n requiredConsents: mergedRequiredConsents.length\n ? mergedRequiredConsents\n : undefined,\n evaluatedBy: 'opa',\n };\n }\n}\n\nexport function buildOPAInput(\n context: DecisionContext,\n policies: PolicySpec[],\n engineDecision: PolicyDecision\n) {\n return {\n context,\n decision: engineDecision,\n policies: policies.map((policy) => ({\n meta: policy.meta,\n rules: policy.rules,\n fieldPolicies: policy.fieldPolicies,\n pii: policy.pii,\n relationships: policy.relationships,\n consents: policy.consents,\n rateLimits: policy.rateLimits,\n })),\n };\n}\n\nfunction mergeRequiredConsents(\n policies: PolicySpec[],\n existing: ConsentDefinition[],\n incomingIds: string[]\n): ConsentDefinition[] {\n if (incomingIds.length === 0) return existing;\n const existingIds = new Set(existing.map((consent) => consent.id));\n const merged = [...existing];\n\n for (const id of incomingIds) {\n if (existingIds.has(id)) continue;\n const resolved = resolveConsentAcrossPolicies(policies, id);\n if (resolved) {\n merged.push(resolved);\n existingIds.add(resolved.id);\n }\n }\n\n return merged;\n}\n\nfunction resolveConsentAcrossPolicies(\n policies: PolicySpec[],\n id: string\n): ConsentDefinition | null {\n for (const policy of policies) {\n const match = policy.consents?.find((consent) => consent.id === id);\n if (match) return match;\n }\n\n return {\n id,\n scope: 'unspecified',\n purpose: 'unspecified',\n description: `Consent \"${id}\" returned by OPA`,\n required: true,\n };\n}\n"],"mappings":"AA0BA,IAAa,EAAb,KAAmE,CACjE,YACE,EACA,EACA,CAFiB,KAAA,OAAA,EACA,KAAA,QAAA,EAGnB,MAAM,SACJ,EACA,EACA,EACyB,CACzB,IAAM,EAAQ,EAAc,EAAS,EAAU,EAAe,CACxD,EAAM,MAAM,KAAK,OAAO,SAC5B,KAAK,QAAQ,aACb,EACD,CACK,EAAW,KAAK,QAAQ,UAC1B,KAAK,QAAQ,UAAU,EAAI,CAC1B,EAEL,GAAI,CAAC,EACH,MAAO,CACL,GAAG,EACH,YAAa,EAAe,aAAe,SAC5C,CAGH,IAAM,EAAY,EACZ,EAAyB,EAC7B,EACA,EAAe,kBAAoB,EAAE,CACrC,EAAU,kBAAoB,EAAE,CACjC,CAED,MAAO,CACL,GAAG,EACH,OAAQ,EAAU,QAAU,EAAe,OAC3C,OAAQ,EAAU,QAAU,EAAe,OAC3C,eAAgB,EAAU,gBAAkB,EAAe,eAC3D,iBAAkB,EAAuB,OACrC,EACA,IAAA,GACJ,YAAa,MACd,GAIL,SAAgB,EACd,EACA,EACA,EACA,CACA,MAAO,CACL,UACA,SAAU,EACV,SAAU,EAAS,IAAK,IAAY,CAClC,KAAM,EAAO,KACb,MAAO,EAAO,MACd,cAAe,EAAO,cACtB,IAAK,EAAO,IACZ,cAAe,EAAO,cACtB,SAAU,EAAO,SACjB,WAAY,EAAO,WACpB,EAAE,CACJ,CAGH,SAAS,EACP,EACA,EACA,EACqB,CACrB,GAAI,EAAY,SAAW,EAAG,OAAO,EACrC,IAAM,EAAc,IAAI,IAAI,EAAS,IAAK,GAAY,EAAQ,GAAG,CAAC,CAC5D,EAAS,CAAC,GAAG,EAAS,CAE5B,IAAK,IAAM,KAAM,EAAa,CAC5B,GAAI,EAAY,IAAI,EAAG,CAAE,SACzB,IAAM,EAAW,EAA6B,EAAU,EAAG,CACvD,IACF,EAAO,KAAK,EAAS,CACrB,EAAY,IAAI,EAAS,GAAG,EAIhC,OAAO,EAGT,SAAS,EACP,EACA,EAC0B,CAC1B,IAAK,IAAM,KAAU,EAAU,CAC7B,IAAM,EAAQ,EAAO,UAAU,KAAM,GAAY,EAAQ,KAAO,EAAG,CACnE,GAAI,EAAO,OAAO,EAGpB,MAAO,CACL,KACA,MAAO,cACP,QAAS,cACT,YAAa,YAAY,EAAG,mBAC5B,SAAU,GACX"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spec.d.ts","names":[],"sources":["../../src/policy/spec.ts"],"sourcesContent":[],"mappings":";;;KAEY,YAAA;UAEK,sBAAA;EAFL,WAAA,EAAA,MAAY;EAEP,QAAA,EAAA,MAAA;EAQA,UAAA,EAAA,MAAA;EAMA,WAAA,CAAA,EAAA,MAAiB;EAcjB,UAAA,CAAA,EAAA,OAAA;AAQjB;AAOiB,UAnCA,mBAAA,CAmCmB;EASnB,QAAA,EAAA,MAAA;EAMA,UAAA,CAAA,EAAA,MAAc;EAKd,QAAA,CAAA,EAAA,MAAA;AAMjB;AAKiB,UA5DA,iBAAA,CA4DU;EACjB,EAAA,EAAA,MAAA;EAEE,KAAA,EAAA,MAAA;EACC,OAAA,EAAA,MAAA;EACK,WAAA,CAAA,EAAA,MAAA;EAGK,WAAA,CAAA,EAAA,SAAA,GAAA,UAAA,GAAA,kBAAA,GAAA,qBAAA;EAER,aAAA,CAAA,EAAA,MAAA;EAAe,QAAA,CAAA,EAAA,OAAA;AAI9B;AACU,UA7DO,mBAAA,CA6DP;EAGE,EAAA,EAAA,MAAA;EACC,GAAA,EAAA,MAAA;EACE,GAAA,CAAA,EAAA,MAAA;EAAe,aAAA,CAAA,EAAA,MAAA;EAIb,KAAA,CAAA,EAAA,MAAS;AAM1B;AACQ,UArES,eAAA,CAqET;EACC;EACS,OAAA,EAAA,MAAA;EACV;EACU,QAAA,CAAA,EAAA,MAAA;;AAEH,UApEE,UAAA,SAAmB,aAoErB,CAAA;EACP;EAAe,IAAA,EAAA,MAAA;EAGN;EAOJ,OAAA,EAAA,MAAA;EAGI;EAOP,KAAA,CAAA,EAAA,QAAA,GAAA,SAAA,GAAA,WAAA;;AAIuC,UApFhC,gBAAA,CAoFgC;EAejC,MAAA,CAAA,EAAA,OAAa;;;;UA7FZ,cAAA;;eAEF,eAAe;;UAGb,eAAA;;;eAGF,eAAe;;UAGb,eAAA;;;;UAKA,UAAA;UACP;;YAEE;aACC;kBACK;;;uBAGK;;eAER;;;UAIE,eAAA;UACP;;;YAGE;aACC;eACE;;;UAIE,SAAA;;;;;UAMA,UAAA;QACT;SACC;kBACS;QACV;kBACU;aACL;eACE;QACP;;UAGS,SAAA;;;;cAOJ,cAAA;;iBAGI;UAOP;uCAI6B;;iBAevB,aAAA,MAAmB"}
|
package/dist/policy/spec.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spec.js","names":["candidate: PolicySpec | undefined"],"sources":["../../src/policy/spec.ts"],"sourcesContent":["import type { OwnerShipMeta } from '../ownership';\n\nexport type PolicyEffect = 'allow' | 'deny';\n\nexport interface RelationshipDefinition {\n subjectType: string;\n relation: string;\n objectType: string;\n description?: string;\n transitive?: boolean;\n}\n\nexport interface RelationshipMatcher {\n relation: string;\n objectType?: string;\n objectId?: string;\n}\n\nexport interface ConsentDefinition {\n id: string;\n scope: string;\n purpose: string;\n description?: string;\n lawfulBasis?:\n | 'consent'\n | 'contract'\n | 'legal_obligation'\n | 'legitimate_interest';\n expiresInDays?: number;\n required?: boolean;\n}\n\nexport interface RateLimitDefinition {\n id: string;\n rpm: number;\n key?: string;\n windowSeconds?: number;\n burst?: number;\n}\n\nexport interface PolicyOPAConfig {\n /** Fully-qualified package, e.g. \"sigil.authz\" */\n package: string;\n /** Optional rule within package (defaults to \"allow\") */\n decision?: string;\n}\n\nexport interface PolicyMeta extends OwnerShipMeta {\n /** Fully-qualified policy name (e.g., \"sigil.core.default\"). */\n name: string;\n /** Version of the policy; bump on breaking changes. */\n version: number;\n /** Optional scope hint used for discovery. */\n scope?: 'global' | 'feature' | 'operation';\n}\n\nexport interface AttributeMatcher {\n equals?: unknown;\n oneOf?: unknown[];\n exists?: boolean;\n}\n\nexport interface SubjectMatcher {\n roles?: string[];\n attributes?: Record<string, AttributeMatcher>;\n}\n\nexport interface ResourceMatcher {\n type: string;\n fields?: string[];\n attributes?: Record<string, AttributeMatcher>;\n}\n\nexport interface PolicyCondition {\n /** Simple expression evaluated against { subject, resource, context }. */\n expression: string;\n}\n\nexport interface PolicyRule {\n effect: PolicyEffect;\n actions: string[];\n subject?: SubjectMatcher;\n resource?: ResourceMatcher;\n relationships?: RelationshipMatcher[];\n requiresConsent?: string[];\n flags?: string[];\n rateLimit?: string | RateLimitDefinition;\n escalate?: 'human_review' | null;\n conditions?: PolicyCondition[];\n reason?: string;\n}\n\nexport interface FieldPolicyRule {\n effect: PolicyEffect;\n field: string;\n actions: ('read' | 'write')[];\n subject?: SubjectMatcher;\n resource?: ResourceMatcher;\n conditions?: PolicyCondition[];\n reason?: string;\n}\n\nexport interface PIIPolicy {\n fields: string[];\n consentRequired?: boolean;\n retentionDays?: number;\n}\n\nexport interface PolicySpec {\n meta: PolicyMeta;\n rules: PolicyRule[];\n fieldPolicies?: FieldPolicyRule[];\n pii?: PIIPolicy;\n relationships?: RelationshipDefinition[];\n consents?: ConsentDefinition[];\n rateLimits?: RateLimitDefinition[];\n opa?: PolicyOPAConfig;\n}\n\nexport interface PolicyRef {\n name: string;\n version: number;\n}\n\nconst policyKey = (name: string, version: number) => `${name}.v${version}`;\n\nexport class PolicyRegistry {\n private readonly items = new Map<string, PolicySpec>();\n\n register(spec: PolicySpec): this {\n const key = policyKey(spec.meta.name, spec.meta.version);\n if (this.items.has(key)) throw new Error(`Duplicate policy ${key}`);\n this.items.set(key, spec);\n return this;\n }\n\n list(): PolicySpec[] {\n return [...this.items.values()];\n }\n\n get(name: string, version?: number): PolicySpec | undefined {\n if (version != null) return this.items.get(policyKey(name, version));\n let candidate: PolicySpec | 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 makePolicyKey(ref: PolicyRef) {\n return policyKey(ref.name, ref.version);\n}\n"],"mappings":"AA4HA,MAAM,GAAa,EAAc,IAAoB,GAAG,EAAK,IAAI,IAEjE,IAAa,EAAb,KAA4B,CAC1B,MAAyB,IAAI,IAE7B,SAAS,EAAwB,CAC/B,IAAM,EAAM,EAAU,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,CACxD,GAAI,KAAK,MAAM,IAAI,EAAI,CAAE,MAAU,MAAM,oBAAoB,IAAM,CAEnE,OADA,KAAK,MAAM,IAAI,EAAK,EAAK,CAClB,KAGT,MAAqB,CACnB,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAGjC,IAAI,EAAc,EAA0C,CAC1D,GAAI,GAAW,KAAM,OAAO,KAAK,MAAM,IAAI,EAAU,EAAM,EAAQ,CAAC,CACpE,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,EAAc,EAAgB,CAC5C,OAAO,EAAU,EAAI,KAAM,EAAI,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"presentations.backcompat.d.ts","names":[],"sources":["../src/presentations.backcompat.ts"],"sourcesContent":[],"mappings":";;;;iBAGgB,UAAA,KAAe,mBAAmB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"presentations.backcompat.js","names":[],"sources":["../src/presentations.backcompat.ts"],"sourcesContent":["import type { PresentationSpec } from './presentations';\nimport type { PresentationDescriptorV2 } from './presentations.v2';\n\nexport function toV2FromV1(v1: PresentationSpec): PresentationDescriptorV2 {\n if (v1.content.kind === 'web_component') {\n return {\n meta: { ...v1.meta },\n policy: v1.policy,\n source: {\n type: 'component',\n framework: v1.content.framework,\n componentKey: v1.content.componentKey,\n props: v1.content.props,\n },\n targets: ['react', 'application/json', 'application/xml'],\n };\n }\n if (v1.content.kind === 'markdown') {\n return {\n meta: { ...v1.meta },\n policy: v1.policy,\n source: {\n type: 'blocknotejs',\n docJson: v1.content.content ?? v1.content.resourceUri ?? '',\n },\n targets: ['markdown', 'application/json', 'application/xml'],\n };\n }\n return {\n meta: { ...v1.meta },\n policy: v1.policy,\n source: {\n type: 'blocknotejs',\n docJson: { kind: 'data', mimeType: v1.content.mimeType, model: 'schema' },\n },\n targets: ['application/json', 'application/xml'],\n };\n}\n"],"mappings":"AAGA,SAAgB,EAAW,EAAgD,CAyBzE,OAxBI,EAAG,QAAQ,OAAS,gBACf,CACL,KAAM,CAAE,GAAG,EAAG,KAAM,CACpB,OAAQ,EAAG,OACX,OAAQ,CACN,KAAM,YACN,UAAW,EAAG,QAAQ,UACtB,aAAc,EAAG,QAAQ,aACzB,MAAO,EAAG,QAAQ,MACnB,CACD,QAAS,CAAC,QAAS,mBAAoB,kBAAkB,CAC1D,CAEC,EAAG,QAAQ,OAAS,WACf,CACL,KAAM,CAAE,GAAG,EAAG,KAAM,CACpB,OAAQ,EAAG,OACX,OAAQ,CACN,KAAM,cACN,QAAS,EAAG,QAAQ,SAAW,EAAG,QAAQ,aAAe,GAC1D,CACD,QAAS,CAAC,WAAY,mBAAoB,kBAAkB,CAC7D,CAEI,CACL,KAAM,CAAE,GAAG,EAAG,KAAM,CACpB,OAAQ,EAAG,OACX,OAAQ,CACN,KAAM,cACN,QAAS,CAAE,KAAM,OAAQ,SAAU,EAAG,QAAQ,SAAU,MAAO,SAAU,CAC1E,CACD,QAAS,CAAC,mBAAoB,kBAAkB,CACjD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"presentations.d.ts","names":[],"sources":["../src/presentations.ts"],"sourcesContent":[],"mappings":";;;;;;KAKY,gBAAA;AAAZ;AAGiB,UAAA,gBAAA,CAAgB;EAUhB,IAAA,EAAA,MAAA;EAMA,OAAA,EAAA,MAAA;EAWA,SAAA,CAAA,EAxBH,SAwBG;EASA,MAAA,CAAA,EAAA,MAAA,EAAA;EAOL,IAAA,CAAA,EAAA,MAAA,EAAA;EACR,WAAA,CAAA,EAAA,MAAA;;;AAEgB,UApCH,kBAAA,CAoCG;EAEH,KAAA,CAAA,EAAA,MAAA,EAAA;EACT,GAAA,CAAA,EAAA,MAAA,EAAA;;;AAEsB,UAnCb,wBAAA,CAmCa;EAQjB,IAAA,EAAA,eAAA;EAGC,SAAA,EAAA,OAAA;EAOJ;EAI6B,YAAA,EAAA,MAAA;EAAgB;EAevC,KAAA,EAlEP,cAkEO;EAA6B,SAAA,CAAA,EAAA,MAAA,EAAA;;;AASR,UAtEpB,oBAAA,CAsEoB;;EAAA;;;EAAA,WAAA,CAAA,EAAA,MAAA;;;UA7DpB,gBAAA;;;;SAIR;;KAGG,mBAAA,GACR,2BACA,uBACA;UAEa,gBAAA;QACT;WACG;WACA;;;cAQE,oBAAA;;cAGC;UAOJ;uCAI6B;;iBAevB,yBAAA,IAA6B;;;;;;;;;;;QASR;;;;;;;;;;;QAAA;;;;;;;;;;;QAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"presentations.js","names":["candidate: PresentationSpec | undefined","z"],"sources":["../src/presentations.ts"],"sourcesContent":["import type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { Stability } from './ownership';\nimport z from 'zod';\n\n/** V1 presentation kinds (back-compat). Prefer V2 descriptors for new work. */\nexport type PresentationKind = 'web_component' | 'markdown' | 'data';\n\n/** Minimal metadata for presentations (V1). */\nexport interface PresentationMeta {\n name: string;\n version: number;\n stability?: Stability;\n owners?: string[];\n tags?: string[];\n description?: string;\n}\n\n/** Policy for presentations (flags, pii). */\nexport interface PresentationPolicy {\n flags?: string[];\n pii?: string[];\n}\n\n/** Web component presentation (V1). */\nexport interface WebComponentPresentation {\n kind: 'web_component';\n framework: 'react'; // future: 'vue' | 'angular'\n /** Symbolic key resolved by host via component map */\n componentKey: string;\n /** Props schema (validated at runtime) */\n props: AnySchemaModel;\n analytics?: string[];\n}\n\n/** Markdown presentation (V1). */\nexport interface MarkdownPresentation {\n kind: 'markdown';\n /** Inline markdown/MDX content */\n content?: string;\n /** Or a resolvable resource URI handled by ResourceRegistry */\n resourceUri?: string;\n}\n\n/** Data presentation (V1): structured export description. */\nexport interface DataPresentation {\n kind: 'data';\n mimeType: string; // e.g., application/json, application/xml\n /** Structured data schema */\n model: AnySchemaModel;\n}\n\nexport type PresentationContent =\n | WebComponentPresentation\n | MarkdownPresentation\n | DataPresentation;\n\nexport interface PresentationSpec {\n meta: PresentationMeta;\n policy?: PresentationPolicy;\n content: PresentationContent;\n}\n\nfunction keyOf(p: PresentationSpec) {\n return `${p.meta.name}.v${p.meta.version}`;\n}\n\n/** In-memory registry for V1 PresentationSpec. */\nexport class PresentationRegistry {\n private items = new Map<string, PresentationSpec>();\n\n register(p: PresentationSpec): this {\n const key = keyOf(p);\n if (this.items.has(key)) throw new Error(`Duplicate presentation ${key}`);\n this.items.set(key, p);\n return this;\n }\n\n list(): PresentationSpec[] {\n return [...this.items.values()];\n }\n\n get(name: string, version?: number): PresentationSpec | undefined {\n if (version != null) return this.items.get(`${name}.v${version}`);\n let candidate: PresentationSpec | undefined;\n let max = -Infinity;\n for (const [k, p] of this.items.entries()) {\n if (!k.startsWith(`${name}.v`)) continue;\n if (p.meta.version > max) {\n max = p.meta.version;\n candidate = p;\n }\n }\n return candidate;\n }\n}\n\nexport function jsonSchemaForPresentation(p: PresentationSpec) {\n const base = {\n meta: {\n name: p.meta.name,\n version: p.meta.version,\n stability: p.meta.stability ?? 'stable',\n tags: p.meta.tags ?? [],\n description: p.meta.description ?? '',\n },\n kind: (p.content as any).kind as PresentationKind,\n } as const;\n\n if (p.content.kind === 'web_component') {\n return {\n ...base,\n framework: p.content.framework,\n componentKey: p.content.componentKey,\n props: z.toJSONSchema(p.content.props.getZod()),\n };\n }\n if (p.content.kind === 'markdown') {\n return {\n ...base,\n content: p.content.content,\n resourceUri: p.content.resourceUri,\n };\n }\n return {\n ...base,\n mimeType: p.content.mimeType,\n model: z.toJSONSchema(p.content.model.getZod()),\n };\n}\n"],"mappings":"mBA8DA,SAAS,EAAM,EAAqB,CAClC,MAAO,GAAG,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,UAInC,IAAa,EAAb,KAAkC,CAChC,MAAgB,IAAI,IAEpB,SAAS,EAA2B,CAClC,IAAM,EAAM,EAAM,EAAE,CACpB,GAAI,KAAK,MAAM,IAAI,EAAI,CAAE,MAAU,MAAM,0BAA0B,IAAM,CAEzE,OADA,KAAK,MAAM,IAAI,EAAK,EAAE,CACf,KAGT,MAA2B,CACzB,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAGjC,IAAI,EAAc,EAAgD,CAChE,GAAI,GAAW,KAAM,OAAO,KAAK,MAAM,IAAI,GAAG,EAAK,IAAI,IAAU,CACjE,IAAIA,EACA,EAAM,KACV,IAAK,GAAM,CAAC,EAAG,KAAM,KAAK,MAAM,SAAS,CAClC,EAAE,WAAW,GAAG,EAAK,IAAI,EAC1B,EAAE,KAAK,QAAU,IACnB,EAAM,EAAE,KAAK,QACb,EAAY,GAGhB,OAAO,IAIX,SAAgB,EAA0B,EAAqB,CAC7D,IAAM,EAAO,CACX,KAAM,CACJ,KAAM,EAAE,KAAK,KACb,QAAS,EAAE,KAAK,QAChB,UAAW,EAAE,KAAK,WAAa,SAC/B,KAAM,EAAE,KAAK,MAAQ,EAAE,CACvB,YAAa,EAAE,KAAK,aAAe,GACpC,CACD,KAAO,EAAE,QAAgB,KAC1B,CAiBD,OAfI,EAAE,QAAQ,OAAS,gBACd,CACL,GAAG,EACH,UAAW,EAAE,QAAQ,UACrB,aAAc,EAAE,QAAQ,aACxB,MAAOC,EAAE,aAAa,EAAE,QAAQ,MAAM,QAAQ,CAAC,CAChD,CAEC,EAAE,QAAQ,OAAS,WACd,CACL,GAAG,EACH,QAAS,EAAE,QAAQ,QACnB,YAAa,EAAE,QAAQ,YACxB,CAEI,CACL,GAAG,EACH,SAAU,EAAE,QAAQ,SACpB,MAAOA,EAAE,aAAa,EAAE,QAAQ,MAAM,QAAQ,CAAC,CAChD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"presentations.v2.d.ts","names":[],"sources":["../src/presentations.v2.ts"],"sourcesContent":[],"mappings":";;;;;;KAKY,kBAAA;AAAA,UAMK,kBAAA,SAA2B,OANd,CAMsB,aANtB,CAAA,CAAA;EAMb;EAUA,IAAA,EAAA,MAAA;EAYA;EASL,OAAA,EAAA,MAAA;EAQK;EACT,WAAA,CAAA,EAAA,MAAA;;;AAGqB,UAjCZ,gCAAA,CAiCY;EAGZ;EASA,IAAA,EAAA,WAAA;EACP;EAEA,SAAA,EAAA,OAAA;EACA;EACK,YAAA,EAAA,MAAA;EAAR;EAAO,KAAA,CAAA,EA1CJ,cA0CI;AAGd;;AAGY,UA5CK,6BAAA,CA4CL;EACF;EACH,IAAA,EAAA,aAAA;EAAO;EAOD,OAAA,EAAA,OAAA;EAOmC;EAArB,WAAA,CAAA,EAtDX,WAsDW;;AAaf,KAhEA,kBAAA,GACR,gCA+DQ,GA9DR,6BA8DQ;;;;;AAGA,UA3DK,wBAAA,CA2DL;EAsBI,IAAA,EAhFR,kBAgFQ;EA4FJ,MAAA,CAAA,EAAA;IASI,KAAA,CAAA,EAAA,MAAA,EAAA;IA8BA,GAAA,CAAA,EAAA,MAAA,EAAA;;UAjNN;WACC;;UAGM,aAAA;;;;;;;;UASA;UACP;iBAEA,gCACA,kBACH,QAAQ;;UAGE,qBAAA;mBAEP,kCACE,0BACF,kBACH;;;;;;cAOM,eAAA;;;2BAOc,qBAAqB;kBAO9B;iCAMN,0BACF,gCACA,gBACL,QAAQ;;;iBAsBG,4BAAA,CAAA,GAA4B;;KA4FhC,qBAAA;;;UAIE;;;;gBAE6C;;;iBAG3C,4BAAA,SAAqC,kBAAe;;;;iBA8BpD,uBAAA,SAAgC,kBAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"presentations.v2.js","names":[],"sources":["../src/presentations.v2.ts"],"sourcesContent":["import type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { OwnerShipMeta } from './ownership';\nimport type { BlockConfig } from '@blocknote/core';\n\n/** Supported render targets for the transform engine and descriptors. */\nexport type PresentationTarget =\n | 'react'\n | 'markdown'\n | 'application/json'\n | 'application/xml';\n\nexport interface PresentationV2Meta extends Partial<OwnerShipMeta> {\n /** Fully-qualified presentation name (e.g., \"sigil.auth.webauth_tabs_v2\"). */\n name: string;\n /** Version of this descriptor. Increment on breaking changes. */\n version: number;\n /** Human-readable description for docs/a11y. Required by validators. */\n description?: string;\n}\n\n/** React component presentation source. */\nexport interface PresentationSourceComponentReact {\n /** Source marker for React component presentations. */\n type: 'component';\n /** Framework for the component source (currently only 'react'). */\n framework: 'react';\n /** Component key resolved by host `componentMap`. */\n componentKey: string;\n /** Optional props schema to validate against. */\n props?: AnySchemaModel;\n}\n\n/** BlockNoteJS document presentation source. */\nexport interface PresentationSourceBlocknotejs {\n /** Source marker for BlockNoteJS document presentations. */\n type: 'blocknotejs';\n /** BlockNoteJS JSON document. */\n docJson: unknown;\n /** Optional BlockNote config to guide rendering. */\n blockConfig?: BlockConfig;\n}\n\nexport type PresentationSource =\n | PresentationSourceComponentReact\n | PresentationSourceBlocknotejs;\n\n/**\n * Normalized presentation descriptor decoupled from framework/adapters.\n * Renderers and validators are provided via TransformEngine.\n */\nexport interface PresentationDescriptorV2 {\n meta: PresentationV2Meta;\n policy?: { flags?: string[]; pii?: string[] };\n source: PresentationSource;\n targets: PresentationTarget[]; // which outputs are supported by transforms\n}\n\nexport interface RenderContext {\n /** Optional locale hint (i18n). */\n locale?: string;\n /** Enabled feature flags to drive conditional rendering. */\n featureFlags?: string[];\n /** Redaction hook for custom PII handling. */\n redact?: (path: string, value: unknown) => unknown;\n}\n\nexport interface PresentationRenderer<TOut> {\n target: PresentationTarget;\n render: (\n desc: PresentationDescriptorV2,\n ctx?: RenderContext\n ) => Promise<TOut>;\n}\n\nexport interface PresentationValidator {\n validate: (\n desc: PresentationDescriptorV2,\n target: PresentationTarget,\n ctx?: RenderContext\n ) => Promise<void> | void;\n}\n\n/**\n * Pluggable transform engine that renders descriptors to various targets\n * and runs validators (e.g., basic metadata checks, PII redaction policies).\n */\nexport class TransformEngine {\n private renderers = new Map<\n PresentationTarget,\n PresentationRenderer<any>[]\n >();\n private validators: PresentationValidator[] = [];\n\n register<TOut>(renderer: PresentationRenderer<TOut>): this {\n const arr = this.renderers.get(renderer.target) ?? [];\n arr.push(renderer);\n this.renderers.set(renderer.target, arr);\n return this;\n }\n\n addValidator(v: PresentationValidator): this {\n this.validators.push(v);\n return this;\n }\n\n async render<TOut = unknown>(\n target: PresentationTarget,\n desc: PresentationDescriptorV2,\n ctx?: RenderContext\n ): Promise<TOut> {\n if (!desc.targets.includes(target))\n throw new Error(\n `Target ${target} not declared for ${desc.meta.name}.v${desc.meta.version}`\n );\n for (const v of this.validators) await v.validate(desc, target, ctx);\n const arr = this.renderers.get(target) ?? [];\n for (const r of arr) {\n try {\n const out = await r.render(desc, ctx);\n // first successful renderer wins\n return out as TOut;\n } catch (_e) {\n // try next\n }\n }\n throw new Error(`No renderer available for ${target}`);\n }\n}\n\n// Minimal built-ins (stubs). Host apps can register concrete adapters.\n/** Create a TransformEngine instance with default markdown/json/xml renderers. */\nexport function createDefaultTransformEngine() {\n const engine = new TransformEngine();\n\n const applyPii = (desc: PresentationDescriptorV2, obj: any) => {\n const clone = JSON.parse(JSON.stringify(obj));\n const paths = desc.policy?.pii ?? [];\n const setAtPath = (root: any, path: string) => {\n const segs = path\n .replace(/^\\//, '')\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean);\n let cur = root;\n for (let i = 0; i < segs.length - 1; i++) {\n const k = segs[i]!;\n if (cur && typeof cur === 'object' && k in cur) cur = cur[k];\n else return;\n }\n const last = segs[segs.length - 1];\n if (cur && typeof cur === 'object' && last && last in cur)\n cur[last] = '[REDACTED]';\n };\n for (const p of paths) setAtPath(clone, p);\n return clone;\n };\n\n // markdown output for both blocknote and component\n engine.register<{ mimeType: 'text/markdown'; body: string }>({\n target: 'markdown',\n async render(desc) {\n if (desc.source.type === 'blocknotejs') {\n // TODO: convert BlockNote doc JSON → markdown (placeholder for now)\n const raw =\n typeof desc.source.docJson === 'string'\n ? desc.source.docJson\n : JSON.stringify(desc.source.docJson);\n const redacted = applyPii(desc, { text: raw });\n return { mimeType: 'text/markdown', body: String(redacted.text) };\n }\n if (desc.source.type === 'component') {\n const header = `# ${desc.meta.name} v${desc.meta.version}`;\n const about = desc.meta.description\n ? `\\n\\n${desc.meta.description}`\n : '';\n const tags =\n desc.meta.tags && desc.meta.tags.length\n ? `\\n\\nTags: ${desc.meta.tags.join(', ')}`\n : '';\n const owners =\n desc.meta.owners && desc.meta.owners.length\n ? `\\n\\nOwners: ${desc.meta.owners.join(', ')}`\n : '';\n const comp = `\\n\\nComponent: \\`${desc.source.componentKey}\\``;\n const policy = desc.policy?.pii?.length\n ? `\\n\\nRedacted paths: ${desc.policy.pii.map((p) => `\\`${p}\\``).join(', ')}`\n : '';\n const body = `${header}${about}${tags}${owners}${comp}${policy}`;\n return { mimeType: 'text/markdown', body };\n }\n throw new Error('unsupported');\n },\n });\n\n // json snapshot of source\n engine.register<{ mimeType: 'application/json'; body: string }>({\n target: 'application/json',\n async render(desc) {\n const payload = applyPii(desc, { meta: desc.meta, source: desc.source });\n return {\n mimeType: 'application/json',\n body: JSON.stringify(payload, null, 2),\n };\n },\n });\n\n // xml (simple wrapper around json for now)\n engine.register<{ mimeType: 'application/xml'; body: string }>({\n target: 'application/xml',\n async render(desc) {\n const json = applyPii(desc, { meta: desc.meta, source: desc.source });\n const body = `<presentation name=\"${desc.meta.name}\" version=\"${desc.meta.version}\"><json>${encodeURIComponent(\n JSON.stringify(json)\n )}</json></presentation>`;\n return { mimeType: 'application/xml', body };\n },\n });\n\n return engine;\n}\n\n// React target returns a serializable descriptor the host can render.\n/** Serializable render descriptor for React hosts. */\nexport type ReactRenderDescriptor =\n | {\n kind: 'react_component';\n componentKey: string;\n props?: Record<string, unknown>;\n }\n | { kind: 'blocknotejs'; docJson: unknown; blockConfig?: BlockConfig };\n\n/** Register a default React target renderer that returns a serializable descriptor. */\nexport function registerDefaultReactRenderer(engine: TransformEngine) {\n engine.register<ReactRenderDescriptor>({\n target: 'react',\n async render(desc) {\n if (desc.source.type === 'component') {\n const props = desc.source.props\n ? desc.source.props.getZod().safeParse({}).success\n ? {}\n : undefined\n : undefined;\n return {\n kind: 'react_component',\n componentKey: desc.source.componentKey,\n props,\n } as ReactRenderDescriptor;\n }\n // blocknote\n return {\n kind: 'blocknotejs',\n docJson: desc.source.docJson,\n blockConfig: desc.source.blockConfig,\n } as ReactRenderDescriptor;\n },\n });\n return engine;\n}\n\n/**\n * Add basic validators (e.g., meta.description presence) to the engine.\n */\nexport function registerBasicValidation(engine: TransformEngine) {\n // Ensure description is provided for a11y/i18n/docs\n engine.addValidator({\n validate(desc) {\n if (!desc.meta.description || desc.meta.description.length < 3)\n throw new Error(\n `Presentation ${desc.meta.name}.v${desc.meta.version} missing meta.description`\n );\n },\n });\n return engine;\n}\n"],"mappings":"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"}
|
package/dist/prompt.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","names":[],"sources":["../src/prompt.ts"],"sourcesContent":[],"mappings":";;;KAEY,eAAA;;AAAA,UAGK,SAAA,CAHU;EAGV,IAAA,EAAA,MAAS;EAWd,WAAA,CAAA,EAAA,MAAiB;EAKZ,QAAA,CAAA,EAAA,OAAU;EAWV,MAAA,EAvBP,CAAA,CAAE,OAuBiB;EAOZ,YAAA,CAAU,EAAA,MAAA;;;;;AAIhB,KA3BC,iBAAA,GA2BD;EAIO,IAAA,EAAA,MAAA;EAAN,IAAA,EAAA,MAAA;CAKyB,GAAA;EAEtB,IAAA,EAAA,UAAA;EAAR,GAAA,EAAA,MAAA;EAAO,KAAA,CAAA,EAAA,MAAA;AAId,CAAA;;AACmB,UAtCF,UAAA,CAsCE;EAAX,IAAA,EAAA,MAAA;EACM,OAAA,EAAA,MAAA;EAAX,KAAA,EAAA,MAAA;EAAU,WAAA,EAAA,MAAA;;cAjCC;;;;UAKG,YAAA;;;;;;;;;UAOA,qBAAqB,CAAA,CAAE;QAChC;QACA;SACC;WACE;;iBAID,CAAA,CAAE,MAAM;;;;mCAKmB;QAE9B,QAAQ;;;iBAIC,uBAAuB,CAAA,CAAE,eACjC,WAAW,KAChB,WAAW"}
|
package/dist/prompt.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","names":[],"sources":["../src/prompt.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type PromptStability = 'experimental' | 'beta' | 'stable' | 'deprecated';\n\n/** Parameter definition for a prompt argument. */\nexport interface PromptArg {\n name: string;\n description?: string;\n required?: boolean;\n schema: z.ZodType; // zod schema for this argument\n completeWith?: string; // optional completion source name\n}\n\n/**\n * Rendered content part for a prompt. Clients (MCP) can fetch referenced resources.\n */\nexport type PromptContentPart =\n | { type: 'text'; text: string }\n | { type: 'resource'; uri: string; title?: string };\n\n/** Prompt metadata for discoverability and governance. */\nexport interface PromptMeta {\n name: string; // e.g. \"sigil.signup-help\"\n version: number; // bump on breaking change\n title: string;\n description: string;\n tags?: string[];\n stability?: PromptStability;\n owners?: string[];\n}\n\n/** Policy constraints for prompts (flags, PII paths, rate limits). */\nexport interface PromptPolicy {\n flags?: string[];\n pii?: string[]; // JSON-like paths within args to redact in logs/prompts\n rateLimit?: { rpm: number; key: 'user' | 'org' | 'global' };\n}\n\n/** Full prompt specification including args schema and render function. */\nexport interface PromptSpec<I extends z.ZodType> {\n meta: PromptMeta;\n args: PromptArg[];\n input: I; // full args object schema (zod)\n policy?: PromptPolicy;\n\n /** Render MCP-friendly content parts. DO NOT perform side effects here. */\n render: (\n args: z.infer<I>,\n ctx: {\n userId?: string | null;\n orgId?: string | null;\n locale?: string;\n link: (template: string, vars: Record<string, string | number>) => string;\n }\n ) => Promise<PromptContentPart[]>;\n}\n\n/** Identity helper that preserves generic inference when declaring prompts. */\nexport function definePrompt<I extends z.ZodType>(\n spec: PromptSpec<I>\n): PromptSpec<I> {\n return spec;\n}\n"],"mappings":"wBA0DA,SAAgB,EACd,EACe,CACf,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"promptRegistry.d.ts","names":[],"sources":["../src/promptRegistry.ts"],"sourcesContent":[],"mappings":";;;;cAGa,cAAA;;EAAA;EAIU,QAAA,CAAA,UAAF,CAAA,CAAE,OAAA,CAAA,CAAA,CAAA,EAAY,UAAZ,CAAuB,CAAvB,CAAA,CAAA,EAAA,IAAA;EAAuB;EAAX,IAAA,CAAA,CAAA,EAQ7B,UAR6B,CAAA,GAAA,CAAA,EAAA;EAQ7B;EAK8B,GAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,MAAA,CAAA,EAAA,UAAA,CAAA,GAAA,CAAA,GAAA,SAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"promptRegistry.js","names":["candidate: PromptSpec<any> | undefined"],"sources":["../src/promptRegistry.ts"],"sourcesContent":["import type { PromptSpec } from './prompt';\nimport { z } from 'zod';\n\nexport class PromptRegistry {\n private prompts = new Map<string, PromptSpec<any>>(); // key = name.vX\n\n /** Register a prompt. Throws on duplicate name+version. */\n register<I extends z.ZodType>(p: PromptSpec<I>): this {\n const key = `${p.meta.name}.v${p.meta.version}`;\n if (this.prompts.has(key)) throw new Error(`Duplicate prompt ${key}`);\n this.prompts.set(key, p);\n return this;\n }\n\n /** List all registered prompts. */\n list() {\n return [...this.prompts.values()];\n }\n\n /** Get prompt by name; when version omitted, returns highest version. */\n get(name: string, version?: number) {\n if (version != null) return this.prompts.get(`${name}.v${version}`);\n // latest by highest version\n let candidate: PromptSpec<any> | undefined;\n let max = -Infinity;\n for (const [k, p] of this.prompts.entries()) {\n if (!k.startsWith(`${name}.v`)) continue;\n if (p.meta.version > max) {\n max = p.meta.version;\n candidate = p;\n }\n }\n return candidate;\n }\n}\n"],"mappings":"wBAGA,IAAa,EAAb,KAA4B,CAC1B,QAAkB,IAAI,IAGtB,SAA8B,EAAwB,CACpD,IAAM,EAAM,GAAG,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,UACtC,GAAI,KAAK,QAAQ,IAAI,EAAI,CAAE,MAAU,MAAM,oBAAoB,IAAM,CAErE,OADA,KAAK,QAAQ,IAAI,EAAK,EAAE,CACjB,KAIT,MAAO,CACL,MAAO,CAAC,GAAG,KAAK,QAAQ,QAAQ,CAAC,CAInC,IAAI,EAAc,EAAkB,CAClC,GAAI,GAAW,KAAM,OAAO,KAAK,QAAQ,IAAI,GAAG,EAAK,IAAI,IAAU,CAEnE,IAAIA,EACA,EAAM,KACV,IAAK,GAAM,CAAC,EAAG,KAAM,KAAK,QAAQ,SAAS,CACpC,EAAE,WAAW,GAAG,EAAK,IAAI,EAC1B,EAAE,KAAK,QAAU,IACnB,EAAM,EAAE,KAAK,QACb,EAAY,GAGhB,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/regenerator/adapters.ts"],"sourcesContent":[],"mappings":";;;UAOiB,uBAAA;yBAEJ,4BACF,aACA,OACN,QAAQ;AALb;AAEa,UAMI,mBAAA,CANJ;EACF,UAAA,CAAA,OAAA,EAOE,mBAPF,EAAA,KAAA,EAQA,IARA,EAAA,KAAA,EASA,IATA,CAAA,EAUN,OAVM,CAUE,WAVF,EAAA,CAAA;;AAEE,UAWI,sBAAA,CAXJ;EAAR,YAAA,CAAA,OAAA,EAaQ,mBAbR,EAAA,KAAA,EAcM,IAdN,EAAA,KAAA,EAeM,IAfN,CAAA,EAgBA,OAhBA,CAgBQ,cAhBR,EAAA,CAAA;;AAGY,UAgBA,cAAA,CAhBmB;EAEvB,SAAA,CAAA,EAeC,uBAfD;EACF,MAAA,CAAA,EAeA,mBAfA;EACA,QAAA,CAAA,EAeE,sBAfF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","names":[],"sources":["../../src/regenerator/executor.ts"],"sourcesContent":[],"mappings":";;;KAMY,eAAA;UAEK,qBAAA;EAFL,KAAA,EAAA,MAAA;EAEK,MAAA,EAEP,cAFO;EAEP,MAAA,EACA,eADA;EACA,SAAA,EACG,IADH;EACG,UAAA,EACC,IADD;EACC,MAAA,CAAA,EAAA,MAAA;EAEJ,KAAA,CAAA,EAAA,KAAA;EAAK,MAAA,CAAA,EAAA,OAAA;AAIf;AAGa,UAHI,uBAAA,CAGJ;EACC,UAAA,EAAA,MAAA;EAEH,SAAA,EAAA,MAAA;EAAqB,SAAA,EAHnB,IAGmB;EAGpB,UAAA,EALE,IAKF;EAIA,MAAA,EAAA,SAAA,GAAA,SAAwB,GAAA,QAClC;EAGU,OAAA,EAXD,qBAW0B,EAAA;AACrC;AAIY,KAbA,qBAAA,GAAwB,OAaC,CAZnC,cAaA,EAAA;EAIe,IAAA,EAAA,kBAAgB;CAEpB,CAAA;AACC,KAjBF,wBAAA,GAA2B,OAiBzB,CAhBZ,cAgBY,EAAA;EACF,IAAA,EAAA,sBAAA;CACP,CAAA;AAAO,KAfA,cAAA,GAAiB,OAejB,CAfyB,cAezB,EAAA;EAGK,IAAA,EAAA,WAAA;CAEJ,CAAA;AACC,KApBF,mBAAA,GAAsB,OAoBpB,CAnBZ,cAmBY,EAAA;EACF,IAAA,EAAA,gBAAA;CACP,CAAA;AAAO,KAlBA,yBAAA,GAA4B,OAkB5B,CAjBV,cAiBU,EAAA;EAGK,IAAA,EAAA,sBAAY;CAEhB,CAAA;AACC,UAnBG,gBAAA,CAmBH;EACF,oBAAA,CAAA,OAAA,EAlBC,mBAkBD,EAAA,QAAA,EAjBE,kBAiBF,EAAA,MAAA,EAhBA,qBAgBA,CAAA,EAfP,OAeO,CAAA,OAAA,CAAA;;AACA,UAbK,mBAAA,CAaL;EAGK,uBAAiB,CAAA,OAAA,EAdrB,mBAcqB,EAAA,QAAA,EAbpB,kBAaoB,EAAA,MAAA,EAZtB,wBAYsB,CAAA,EAX7B,OAW6B,CAAA,OAAA,CAAA;;AAGpB,UAXG,YAAA,CAWH;EACF,QAAA,CAAA,OAAA,EAVC,mBAUD,EAAA,QAAA,EATE,kBASF,EAAA,MAAA,EARA,cAQA,CAAA,EAPP,OAOO,CAAA,OAAA,CAAA;;AACA,UALK,iBAAA,CAKL;EAGK,aAAA,CAAA,OAAA,EANJ,mBAMuB,EAAA,QAAA,EALtB,kBAKsB,EAAA,MAAA,EAJxB,mBAIwB,CAAA,EAH/B,OAG+B,CAAA,OAAA,CAAA;;AAGtB,UAHG,mBAAA,CAGH;EACF,mBAAA,CAAA,OAAA,EAFC,mBAED,EAAA,QAAA,EADE,kBACF,EAAA,MAAA,EAAA,yBAAA,CAAA,EACP,OADO,CAAA,OAAA,CAAA;;AACA,UAGK,uBAAA,CAHL;EAGK,MAAA,CAAA,EAAA,OAAA;AAIjB;AACqB,UADJ,oBAAA,CACI;EACG,gBAAA,CAAA,EADH,gBACG;EACP,mBAAA,CAAA,EADO,mBACP;EACK,YAAA,CAAA,EADL,YACK;EACE,iBAAA,CAAA,EADF,iBACE;EAAmB,mBAAA,CAAA,EAAnB,mBAAmB;AAG3C;AACqC,cADxB,gBAAA,CACwB;EAGxB,iBAAA,IAAA;EACC,WAAA,CAAA,IAAA,CAAA,EAJuB,oBAIvB;EACD,OAAA,CAAA,OAAA,EAFA,mBAEA,EAAA,QAAA,EADC,kBACD,EAAA,OAAA,CAAA,EAAA,uBAAA,CAAA,EACR,OADQ,CACA,uBADA,CAAA;EACA,QAAA,aAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","names":["deps: ProposalExecutorDeps","actionResults: ActionExecutionResult[]"],"sources":["../../src/regenerator/executor.ts"],"sourcesContent":["import type {\n SpecChangeProposal,\n ProposalAction,\n RegenerationContext,\n} from './types';\n\nexport type ExecutionStatus = 'success' | 'skipped' | 'failed';\n\nexport interface ActionExecutionResult {\n index: number;\n action: ProposalAction;\n status: ExecutionStatus;\n startedAt: Date;\n finishedAt: Date;\n reason?: string;\n error?: Error;\n output?: unknown;\n}\n\nexport interface ProposalExecutionResult {\n proposalId: string;\n contextId: string;\n startedAt: Date;\n finishedAt: Date;\n status: 'success' | 'partial' | 'failed';\n actions: ActionExecutionResult[];\n}\n\nexport type UpdateBlueprintAction = Extract<\n ProposalAction,\n { kind: 'update_blueprint' }\n>;\nexport type UpdateTenantConfigAction = Extract<\n ProposalAction,\n { kind: 'update_tenant_config' }\n>;\nexport type RunTestsAction = Extract<ProposalAction, { kind: 'run_tests' }>;\nexport type RunMigrationsAction = Extract<\n ProposalAction,\n { kind: 'run_migrations' }\n>;\nexport type TriggerRegenerationAction = Extract<\n ProposalAction,\n { kind: 'trigger_regeneration' }\n>;\n\nexport interface BlueprintUpdater {\n applyBlueprintUpdate(\n context: RegenerationContext,\n proposal: SpecChangeProposal,\n action: UpdateBlueprintAction\n ): Promise<unknown>;\n}\n\nexport interface TenantConfigUpdater {\n applyTenantConfigUpdate(\n context: RegenerationContext,\n proposal: SpecChangeProposal,\n action: UpdateTenantConfigAction\n ): Promise<unknown>;\n}\n\nexport interface TestExecutor {\n runTests(\n context: RegenerationContext,\n proposal: SpecChangeProposal,\n action: RunTestsAction\n ): Promise<unknown>;\n}\n\nexport interface MigrationExecutor {\n runMigrations(\n context: RegenerationContext,\n proposal: SpecChangeProposal,\n action: RunMigrationsAction\n ): Promise<unknown>;\n}\n\nexport interface RegenerationTrigger {\n triggerRegeneration(\n context: RegenerationContext,\n proposal: SpecChangeProposal,\n action: TriggerRegenerationAction\n ): Promise<unknown>;\n}\n\nexport interface ProposalExecutorOptions {\n dryRun?: boolean;\n}\n\nexport interface ProposalExecutorDeps {\n blueprintUpdater?: BlueprintUpdater;\n tenantConfigUpdater?: TenantConfigUpdater;\n testExecutor?: TestExecutor;\n migrationExecutor?: MigrationExecutor;\n regenerationTrigger?: RegenerationTrigger;\n}\n\nexport class ProposalExecutor {\n constructor(private readonly deps: ProposalExecutorDeps = {}) {}\n\n async execute(\n context: RegenerationContext,\n proposal: SpecChangeProposal,\n options: ProposalExecutorOptions = {}\n ): Promise<ProposalExecutionResult> {\n const startedAt = new Date();\n const actionResults: ActionExecutionResult[] = [];\n\n for (const [index, action] of proposal.actions.entries()) {\n const result = await this.executeAction({\n index,\n action,\n context,\n proposal,\n options,\n });\n actionResults.push(result);\n }\n\n const finishedAt = new Date();\n const summaryStatus = summarizeStatus(actionResults);\n\n return {\n proposalId: proposal.id,\n contextId: context.id,\n startedAt,\n finishedAt,\n status: summaryStatus,\n actions: actionResults,\n };\n }\n\n private async executeAction({\n index,\n action,\n context,\n proposal,\n options,\n }: {\n index: number;\n action: ProposalAction;\n context: RegenerationContext;\n proposal: SpecChangeProposal;\n options: ProposalExecutorOptions;\n }): Promise<ActionExecutionResult> {\n const startedAt = new Date();\n const dryRun = options.dryRun ?? false;\n\n const complete = (\n status: ExecutionStatus,\n params: {\n reason?: string;\n output?: unknown;\n error?: Error;\n } = {}\n ): ActionExecutionResult => ({\n index,\n action,\n status,\n startedAt,\n finishedAt: new Date(),\n reason: params.reason,\n output: params.output,\n error: params.error,\n });\n\n if (dryRun) {\n return complete('skipped', { reason: 'dry_run' });\n }\n\n try {\n switch (action.kind) {\n case 'update_blueprint': {\n const updater = this.deps.blueprintUpdater;\n if (!updater) {\n return complete('skipped', { reason: 'missing_blueprint_updater' });\n }\n const output = await updater.applyBlueprintUpdate(\n context,\n proposal,\n action\n );\n return complete('success', { output });\n }\n case 'update_tenant_config': {\n const updater = this.deps.tenantConfigUpdater;\n if (!updater) {\n return complete('skipped', {\n reason: 'missing_tenant_config_updater',\n });\n }\n const output = await updater.applyTenantConfigUpdate(\n context,\n proposal,\n action\n );\n return complete('success', { output });\n }\n case 'run_tests': {\n const executor = this.deps.testExecutor;\n if (!executor) {\n return complete('skipped', { reason: 'missing_test_executor' });\n }\n const output = await executor.runTests(context, proposal, action);\n return complete('success', { output });\n }\n case 'run_migrations': {\n const executor = this.deps.migrationExecutor;\n if (!executor) {\n return complete('skipped', {\n reason: 'missing_migration_executor',\n });\n }\n const output = await executor.runMigrations(\n context,\n proposal,\n action\n );\n return complete('success', { output });\n }\n case 'trigger_regeneration': {\n const trigger = this.deps.regenerationTrigger;\n if (!trigger) {\n return complete('skipped', {\n reason: 'missing_regeneration_trigger',\n });\n }\n const output = await trigger.triggerRegeneration(\n context,\n proposal,\n action\n );\n return complete('success', { output });\n }\n default: {\n return complete('skipped', { reason: 'unknown_action' });\n }\n }\n } catch (error) {\n return complete('failed', {\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n}\n\nfunction summarizeStatus(\n actionResults: ActionExecutionResult[]\n): ProposalExecutionResult['status'] {\n if (actionResults.some((result) => result.status === 'failed')) {\n return 'failed';\n }\n if (\n actionResults.some((result) => result.status === 'success') &&\n actionResults.some((result) => result.status === 'skipped')\n ) {\n return 'partial';\n }\n if (actionResults.every((result) => result.status === 'skipped')) {\n return 'partial';\n }\n return 'success';\n}\n"],"mappings":"AAkGA,IAAa,EAAb,KAA8B,CAC5B,YAAY,EAA8C,EAAE,CAAE,CAAjC,KAAA,KAAA,EAE7B,MAAM,QACJ,EACA,EACA,EAAmC,EAAE,CACH,CAClC,IAAM,EAAY,IAAI,KAChBC,EAAyC,EAAE,CAEjD,IAAK,GAAM,CAAC,EAAO,KAAW,EAAS,QAAQ,SAAS,CAAE,CACxD,IAAM,EAAS,MAAM,KAAK,cAAc,CACtC,QACA,SACA,UACA,WACA,UACD,CAAC,CACF,EAAc,KAAK,EAAO,CAG5B,IAAM,EAAa,IAAI,KACjB,EAAgB,EAAgB,EAAc,CAEpD,MAAO,CACL,WAAY,EAAS,GACrB,UAAW,EAAQ,GACnB,YACA,aACA,OAAQ,EACR,QAAS,EACV,CAGH,MAAc,cAAc,CAC1B,QACA,SACA,UACA,WACA,WAOiC,CACjC,IAAM,EAAY,IAAI,KAChB,EAAS,EAAQ,QAAU,GAE3B,GACJ,EACA,EAII,EAAE,IACqB,CAC3B,QACA,SACA,SACA,YACA,WAAY,IAAI,KAChB,OAAQ,EAAO,OACf,OAAQ,EAAO,OACf,MAAO,EAAO,MACf,EAED,GAAI,EACF,OAAO,EAAS,UAAW,CAAE,OAAQ,UAAW,CAAC,CAGnD,GAAI,CACF,OAAQ,EAAO,KAAf,CACE,IAAK,mBAAoB,CACvB,IAAM,EAAU,KAAK,KAAK,iBAS1B,OARK,EAQE,EAAS,UAAW,CAAE,OALd,MAAM,EAAQ,qBAC3B,EACA,EACA,EACD,CACoC,CAAC,CAP7B,EAAS,UAAW,CAAE,OAAQ,4BAA6B,CAAC,CASvE,IAAK,uBAAwB,CAC3B,IAAM,EAAU,KAAK,KAAK,oBAW1B,OAVK,EAUE,EAAS,UAAW,CAAE,OALd,MAAM,EAAQ,wBAC3B,EACA,EACA,EACD,CACoC,CAAC,CAT7B,EAAS,UAAW,CACzB,OAAQ,gCACT,CAAC,CASN,IAAK,YAAa,CAChB,IAAM,EAAW,KAAK,KAAK,aAK3B,OAJK,EAIE,EAAS,UAAW,CAAE,OADd,MAAM,EAAS,SAAS,EAAS,EAAU,EAAO,CAC5B,CAAC,CAH7B,EAAS,UAAW,CAAE,OAAQ,wBAAyB,CAAC,CAKnE,IAAK,iBAAkB,CACrB,IAAM,EAAW,KAAK,KAAK,kBAW3B,OAVK,EAUE,EAAS,UAAW,CAAE,OALd,MAAM,EAAS,cAC5B,EACA,EACA,EACD,CACoC,CAAC,CAT7B,EAAS,UAAW,CACzB,OAAQ,6BACT,CAAC,CASN,IAAK,uBAAwB,CAC3B,IAAM,EAAU,KAAK,KAAK,oBAW1B,OAVK,EAUE,EAAS,UAAW,CAAE,OALd,MAAM,EAAQ,oBAC3B,EACA,EACA,EACD,CACoC,CAAC,CAT7B,EAAS,UAAW,CACzB,OAAQ,+BACT,CAAC,CASN,QACE,OAAO,EAAS,UAAW,CAAE,OAAQ,iBAAkB,CAAC,QAGrD,EAAO,CACd,OAAO,EAAS,SAAU,CACxB,MAAO,aAAiB,MAAQ,EAAY,MAAM,OAAO,EAAM,CAAC,CACjE,CAAC,IAKR,SAAS,EACP,EACmC,CAanC,OAZI,EAAc,KAAM,GAAW,EAAO,SAAW,SAAS,CACrD,SAGP,EAAc,KAAM,GAAW,EAAO,SAAW,UAAU,EAC3D,EAAc,KAAM,GAAW,EAAO,SAAW,UAAU,EAIzD,EAAc,MAAO,GAAW,EAAO,SAAW,UAAU,CACvD,UAEF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","names":[],"sources":["../../src/regenerator/service.ts"],"sourcesContent":[],"mappings":";;;;UAeiB,kBAAA;YACL;EADK,QAAA,EAEL,cAFuB;EACvB,KAAA,EAEH,gBAFG,EAAA;EACA,IAAA,EAEJ,YAFI;EACH,cAAA,CAAA,EAAA,MAAA;EACD,eAAA,CAAA,EAAA,MAAA;EAGQ,KAAA,CAAA,EAAA,GAAA,GAAA,IAAA;;AAMH,cAAA,kBAAA,CAS2B;;;;;;;;;uBAAA;;;aA4BrB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","names":["options: RegeneratorOptions","proposals: SpecChangeProposal[]","envelopes: RegeneratorSignal[]","delay"],"sources":["../../src/regenerator/service.ts"],"sourcesContent":["import { setTimeout as delay } from 'node:timers/promises';\nimport type {\n ProposalSink,\n RegeneratorSignal,\n RegenerationRule,\n RegenerationContext,\n SpecChangeProposal,\n} from './types';\nimport type { SignalAdapters } from './adapters';\nimport {\n telemetryToEnvelope,\n errorToEnvelope,\n behaviorToEnvelope,\n} from './utils';\n\nexport interface RegeneratorOptions {\n contexts: RegenerationContext[];\n adapters: SignalAdapters;\n rules: RegenerationRule[];\n sink: ProposalSink;\n pollIntervalMs?: number;\n batchDurationMs?: number;\n clock?: () => Date;\n}\n\nconst DEFAULT_POLL_INTERVAL = 60_000;\nconst DEFAULT_BATCH_DURATION = 5 * 60_000;\n\nexport class RegeneratorService {\n private readonly contexts: Map<string, RegenerationContext>;\n private readonly lastPoll = new Map<string, Date>();\n private timer?: NodeJS.Timeout;\n private running = false;\n private readonly pollInterval: number;\n private readonly batchDuration: number;\n private readonly clock: () => Date;\n\n constructor(private readonly options: RegeneratorOptions) {\n this.contexts = new Map(options.contexts.map((ctx) => [ctx.id, ctx]));\n this.pollInterval = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL;\n this.batchDuration = options.batchDurationMs ?? DEFAULT_BATCH_DURATION;\n this.clock = options.clock ?? (() => new Date());\n if (this.options.rules.length === 0) {\n throw new Error('RegeneratorService requires at least one rule');\n }\n }\n\n start() {\n if (this.running) return;\n this.running = true;\n void this.tick();\n this.timer = setInterval(() => {\n void this.tick();\n }, this.pollInterval);\n }\n\n stop() {\n if (!this.running) return;\n this.running = false;\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n }\n\n async runOnce(): Promise<void> {\n await this.tick();\n }\n\n private async tick(): Promise<void> {\n const now = this.clock();\n const sinceDefault = new Date(now.getTime() - this.batchDuration);\n for (const context of this.contexts.values()) {\n const last = this.lastPoll.get(context.id) ?? sinceDefault;\n await this.evaluateContext(context, last, now);\n this.lastPoll.set(context.id, now);\n }\n }\n\n private async evaluateContext(\n context: RegenerationContext,\n since: Date,\n until: Date\n ): Promise<void> {\n const signals = await this.collectSignals(context, since, until);\n if (signals.length === 0) return;\n\n for (const rule of this.options.rules) {\n let proposals: SpecChangeProposal[] = [];\n try {\n proposals = await rule.evaluate(context, signals);\n } catch (error) {\n console.error(\n `[regenerator] rule ${rule.id} failed`,\n error instanceof Error ? error : new Error(String(error))\n );\n continue;\n }\n await this.flushProposals(context, proposals);\n }\n }\n\n private async collectSignals(\n context: RegenerationContext,\n since: Date,\n until: Date\n ): Promise<RegeneratorSignal[]> {\n const envelopes: RegeneratorSignal[] = [];\n const { adapters } = this.options;\n if (adapters.telemetry) {\n const telemetrySignals = await adapters.telemetry.pollTelemetry(\n context,\n since,\n until\n );\n envelopes.push(\n ...telemetrySignals.map((signal) =>\n telemetryToEnvelope(context.id, signal, this.clock)\n )\n );\n }\n if (adapters.errors) {\n const errorSignals = await adapters.errors.pollErrors(\n context,\n since,\n until\n );\n envelopes.push(\n ...errorSignals.map((signal) =>\n errorToEnvelope(context.id, signal, this.clock)\n )\n );\n }\n if (adapters.behavior) {\n const behaviorSignals = await adapters.behavior.pollBehavior(\n context,\n since,\n until\n );\n envelopes.push(\n ...behaviorSignals.map((signal) =>\n behaviorToEnvelope(context.id, signal, this.clock)\n )\n );\n }\n return envelopes;\n }\n\n private async flushProposals(\n context: RegenerationContext,\n proposals: SpecChangeProposal[]\n ): Promise<void> {\n for (const proposal of proposals) {\n if (proposal.signalIds.length === 0) continue;\n await this.options.sink.submit(context, proposal);\n // allow event loop to breathe when large volumes\n if (proposals.length > 10) {\n await delay(0);\n }\n }\n }\n}\n"],"mappings":"gJA4BA,IAAa,EAAb,KAAgC,CAC9B,SACA,SAA4B,IAAI,IAChC,MACA,QAAkB,GAClB,aACA,cACA,MAEA,YAAY,EAA8C,CAKxD,GAL2B,KAAA,QAAA,EAC3B,KAAK,SAAW,IAAI,IAAI,EAAQ,SAAS,IAAK,GAAQ,CAAC,EAAI,GAAI,EAAI,CAAC,CAAC,CACrE,KAAK,aAAe,EAAQ,gBAAkB,IAC9C,KAAK,cAAgB,EAAQ,iBAAmB,IAChD,KAAK,MAAQ,EAAQ,YAAgB,IAAI,MACrC,KAAK,QAAQ,MAAM,SAAW,EAChC,MAAU,MAAM,gDAAgD,CAIpE,OAAQ,CACF,KAAK,UACT,KAAK,QAAU,GACV,KAAK,MAAM,CAChB,KAAK,MAAQ,gBAAkB,CACxB,KAAK,MAAM,EACf,KAAK,aAAa,EAGvB,MAAO,CACA,KAAK,UACV,KAAK,QAAU,GACf,AAEE,KAAK,SADL,cAAc,KAAK,MAAM,CACZ,IAAA,KAIjB,MAAM,SAAyB,CAC7B,MAAM,KAAK,MAAM,CAGnB,MAAc,MAAsB,CAClC,IAAM,EAAM,KAAK,OAAO,CAClB,EAAe,IAAI,KAAK,EAAI,SAAS,CAAG,KAAK,cAAc,CACjE,IAAK,IAAM,KAAW,KAAK,SAAS,QAAQ,CAAE,CAC5C,IAAM,EAAO,KAAK,SAAS,IAAI,EAAQ,GAAG,EAAI,EAC9C,MAAM,KAAK,gBAAgB,EAAS,EAAM,EAAI,CAC9C,KAAK,SAAS,IAAI,EAAQ,GAAI,EAAI,EAItC,MAAc,gBACZ,EACA,EACA,EACe,CACf,IAAM,EAAU,MAAM,KAAK,eAAe,EAAS,EAAO,EAAM,CAC5D,KAAQ,SAAW,EAEvB,IAAK,IAAM,KAAQ,KAAK,QAAQ,MAAO,CACrC,IAAIC,EAAkC,EAAE,CACxC,GAAI,CACF,EAAY,MAAM,EAAK,SAAS,EAAS,EAAQ,OAC1C,EAAO,CACd,QAAQ,MACN,sBAAsB,EAAK,GAAG,SAC9B,aAAiB,MAAQ,EAAY,MAAM,OAAO,EAAM,CAAC,CAC1D,CACD,SAEF,MAAM,KAAK,eAAe,EAAS,EAAU,EAIjD,MAAc,eACZ,EACA,EACA,EAC8B,CAC9B,IAAMC,EAAiC,EAAE,CACnC,CAAE,YAAa,KAAK,QAC1B,GAAI,EAAS,UAAW,CACtB,IAAM,EAAmB,MAAM,EAAS,UAAU,cAChD,EACA,EACA,EACD,CACD,EAAU,KACR,GAAG,EAAiB,IAAK,GACvB,EAAoB,EAAQ,GAAI,EAAQ,KAAK,MAAM,CACpD,CACF,CAEH,GAAI,EAAS,OAAQ,CACnB,IAAM,EAAe,MAAM,EAAS,OAAO,WACzC,EACA,EACA,EACD,CACD,EAAU,KACR,GAAG,EAAa,IAAK,GACnB,EAAgB,EAAQ,GAAI,EAAQ,KAAK,MAAM,CAChD,CACF,CAEH,GAAI,EAAS,SAAU,CACrB,IAAM,EAAkB,MAAM,EAAS,SAAS,aAC9C,EACA,EACA,EACD,CACD,EAAU,KACR,GAAG,EAAgB,IAAK,GACtB,EAAmB,EAAQ,GAAI,EAAQ,KAAK,MAAM,CACnD,CACF,CAEH,OAAO,EAGT,MAAc,eACZ,EACA,EACe,CACf,IAAK,IAAM,KAAY,EACjB,EAAS,UAAU,SAAW,IAClC,MAAM,KAAK,QAAQ,KAAK,OAAO,EAAS,EAAS,CAE7C,EAAU,OAAS,IACrB,MAAMC,EAAM,EAAE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sinks.d.ts","names":[],"sources":["../../src/regenerator/sinks.ts"],"sourcesContent":[],"mappings":";;;;UAQiB,qBAAA;EAAA,OAAA,EACN,mBAD2B;EAC3B,QAAA,EACC,kBADD;EACC,MAAA,EACF,uBADE;;AACqB,UAGhB,kBAAA,CAHgB;EAGhB,IAAA,CAAA,EAAA,CAAA,OAAA,EAAA,MAAkB,EAAA,IAAA,CAAA,EACD,MADC,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,GAAA,IAAA;EACD,KAAA,CAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,EAGvB,KAHuB,EAAA,IAAA,CAAA,EAIvB,MAJuB,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,GAAA,IAAA;;AAIvB,UAIM,mBAAA,CAJN;EAAM,MAAA,CAAA,EAAA,OAAA;EAIA,QAAA,CAAA,EAAA,CAAA,OAAA,EAEM,qBAFa,EAAA,GAAA,IAAA,GAEoB,OAFpB,CAAA,IAAA,CAAA;EAEb,MAAA,CAAA,EACZ,kBADY;;AACZ,cAGE,oBAAA,YAAgC,YAHlC,CAAA;EAAkB,iBAAA,QAAA;EAGhB,iBAAA,OAAqB;EAEH,WAAA,CAAA,QAAA,EAAA,gBAAA,EAAA,OAAA,CAAA,EACD,mBADC;EACD,MAAA,CAAA,OAAA,EAIjB,mBAJiB,EAAA,QAAA,EAKhB,kBALgB,CAAA,EAMzB,OANyB,CAAA,IAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sinks.js","names":["executor: ProposalExecutor","options: ExecutorSinkOptions"],"sources":["../../src/regenerator/sinks.ts"],"sourcesContent":["import type {\n ProposalSink,\n RegenerationContext,\n SpecChangeProposal,\n} from './types';\nimport { ProposalExecutor } from './executor';\nimport type { ProposalExecutionResult } from './executor';\n\nexport interface ExecutorResultPayload {\n context: RegenerationContext;\n proposal: SpecChangeProposal;\n result: ProposalExecutionResult;\n}\n\nexport interface ExecutorSinkLogger {\n info?: (message: string, meta?: Record<string, unknown>) => void;\n error?: (\n message: string,\n error: Error,\n meta?: Record<string, unknown>\n ) => void;\n}\n\nexport interface ExecutorSinkOptions {\n dryRun?: boolean;\n onResult?: (payload: ExecutorResultPayload) => void | Promise<void>;\n logger?: ExecutorSinkLogger;\n}\n\nexport class ExecutorProposalSink implements ProposalSink {\n constructor(\n private readonly executor: ProposalExecutor,\n private readonly options: ExecutorSinkOptions = {}\n ) {}\n\n async submit(\n context: RegenerationContext,\n proposal: SpecChangeProposal\n ): Promise<void> {\n const dryRun = this.options.dryRun ?? false;\n try {\n const result = await this.executor.execute(context, proposal, { dryRun });\n if (this.options.logger?.info) {\n this.options.logger.info('[regenerator] proposal executed', {\n proposalId: proposal.id,\n contextId: context.id,\n status: result.status,\n });\n }\n if (this.options.onResult) {\n await this.options.onResult({ context, proposal, result });\n }\n } catch (error) {\n if (this.options.logger?.error) {\n this.options.logger.error(\n '[regenerator] proposal execution failed',\n error instanceof Error ? error : new Error(String(error)),\n { proposalId: proposal.id, contextId: context.id }\n );\n }\n throw error instanceof Error ? error : new Error(String(error));\n }\n }\n}\n"],"mappings":"AA6BA,IAAa,EAAb,KAA0D,CACxD,YACE,EACA,EAAgD,EAAE,CAClD,CAFiB,KAAA,SAAA,EACA,KAAA,QAAA,EAGnB,MAAM,OACJ,EACA,EACe,CACf,IAAM,EAAS,KAAK,QAAQ,QAAU,GACtC,GAAI,CACF,IAAM,EAAS,MAAM,KAAK,SAAS,QAAQ,EAAS,EAAU,CAAE,SAAQ,CAAC,CACrE,KAAK,QAAQ,QAAQ,MACvB,KAAK,QAAQ,OAAO,KAAK,kCAAmC,CAC1D,WAAY,EAAS,GACrB,UAAW,EAAQ,GACnB,OAAQ,EAAO,OAChB,CAAC,CAEA,KAAK,QAAQ,UACf,MAAM,KAAK,QAAQ,SAAS,CAAE,UAAS,WAAU,SAAQ,CAAC,OAErD,EAAO,CAQd,MAPI,KAAK,QAAQ,QAAQ,OACvB,KAAK,QAAQ,OAAO,MAClB,0CACA,aAAiB,MAAQ,EAAY,MAAM,OAAO,EAAM,CAAC,CACzD,CAAE,WAAY,EAAS,GAAI,UAAW,EAAQ,GAAI,CACnD,CAEG,aAAiB,MAAQ,EAAY,MAAM,OAAO,EAAM,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/regenerator/types.ts"],"sourcesContent":[],"mappings":";;;;;KAIY,iBAAA,GACR,0BACA,sBACA;UAEa,uBAAA;EALL,IAAA,EAAA,WAAA;EACR,SAAA,EAAA,MAAA;EACA,MAAA,EAMM,eANN;;AACsB,UAQT,eAAA,CARS;EAET,SAAA,EAAA,MAAA;EAMA,YAAA,EAAA,MAAe;EAIjB,KAAA,EAAA,MAAA;EACF,WAAA,EADE,IACF;EAGA,SAAA,EAHA,IAGA;EACK,YAAA,CAAA,EAAA,MAAA;EAAa,cAAA,CAAA,EAAA,QAAA,GAAA,SAAA,GAAA,UAAA;EAGd,QAAA,CAAA,EAJJ,MAII,CAAA,MAAmB,EAAA,OAAA,CAAA;EAMnB,aAAA,CAAW,EATV,aAaJ;AAKd;AAMiB,UArBA,mBAAA,CAqBc;EAKhB,IAAA,EAAA,OAAA;EACF,SAAA,EAAA,MAAA;EACA,MAAA,EAzBH,WAyBG;;AAGI,UAzBA,WAAA,CAyBkB;EAIrB,EAAA,EAAA,MAAA;EAEJ,cAAA,EAAA,SAAA,GAAA,QAAA,GAAA,UAAA,GAAA,SAAA;EAEC,OAAA,EAAA,MAAA;EACE,UAAA,EA9BC,IA8BD;EACA,KAAA,EAAA,MAAA;EAAI,QAAA,CAAA,EA7BJ,MA6BI,CAAA,MAAA,EAAA,OAAA,CAAA;AAIjB;AAEiB,UAhCA,sBAAA,CAgCc;EAiBnB,IAAA,EAAA,UAAA;EAsBK,SAAA,EAAA,MAAA;EASA,MAAA,EA7EP,cA6E0B;;AAGpB,UA7EC,cAAA,CA6ED;EACJ,OAAA,EAAA,MAAA;EAAiB,MAAA,EAAA,OAAA,GAAA,YAAA,GAAA,SAAA,GAAA,QAAA;EAGZ,KAAA,EAAA,MAAA;EAIJ,QAAA,CAAA,EAAA,MAAA;EACA,WAAA,EAjFE,IAiFF;EACA,SAAA,EAjFA,IAiFA;EAAR,QAAA,CAAA,EAhFQ,MAgFR,CAAA,MAAA,EAAA,OAAA,CAAA;;AAGY,UAhFA,kBAAA,CAgFY;EAEhB,EAAA,EAAA,MAAA;EACC,KAAA,EAAA,MAAA;EACT,OAAA,EAAA,MAAA;EAAO,UAAA,EAhFE,kBAgFF;;UA9EF;;WAEC;aACE;aACA;;;KAID,kBAAA;UAEK,cAAA;;;;;;;;KAiBL,cAAA;;;;;;;;;;;;;;;;UAsBK,eAAA;;;;UASA,mBAAA;;aAEJ;gBACG;YACJ;;UAGK,gBAAA;;;oBAIJ,8BACA,sBACR,QAAQ;;UAGI,YAAA;kBAEJ,+BACC,qBACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","names":[],"sources":["../../src/regenerator/utils.ts"],"sourcesContent":[],"mappings":";;;KASK,KAAA,SAAc;iBAEH,mBAAA,4BAEN,wBACD,QACN;AANE,iBAcW,eAAA,CAdO,SAAA,EAAA,MAAA,EAAA,MAAA,EAgBb,WAhBa,EAAA,KAAA,EAiBd,KAjBc,CAAA,EAkBpB,mBAlBoB;AAEP,iBAwBA,kBAAA,CAxBmB,SAAA,EAAA,MAAA,EAAA,MAAA,EA0BzB,cA1ByB,EAAA,KAAA,EA2B1B,KA3B0B,CAAA,EA4BhC,sBA5BgC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../../src/regenerator/utils.ts"],"sourcesContent":["import type {\n BehaviorSignal,\n BehaviorSignalEnvelope,\n ErrorSignal,\n ErrorSignalEnvelope,\n TelemetrySignal,\n TelemetrySignalEnvelope,\n} from './types';\n\ntype Clock = () => Date;\n\nexport function telemetryToEnvelope(\n contextId: string,\n signal: TelemetrySignal,\n clock: Clock\n): TelemetrySignalEnvelope {\n return {\n type: 'telemetry',\n contextId,\n signal: normalizeTelemetryDates(signal, clock),\n };\n}\n\nexport function errorToEnvelope(\n contextId: string,\n signal: ErrorSignal,\n clock: Clock\n): ErrorSignalEnvelope {\n return {\n type: 'error',\n contextId,\n signal: normalizeErrorDates(signal, clock),\n };\n}\n\nexport function behaviorToEnvelope(\n contextId: string,\n signal: BehaviorSignal,\n clock: Clock\n): BehaviorSignalEnvelope {\n return {\n type: 'behavior',\n contextId,\n signal: normalizeBehaviorDates(signal, clock),\n };\n}\n\nfunction normalizeTelemetryDates(\n signal: TelemetrySignal,\n clock: Clock\n): TelemetrySignal {\n return {\n ...signal,\n windowStart: toDate(signal.windowStart, clock),\n windowEnd: toDate(signal.windowEnd, clock),\n };\n}\n\nfunction normalizeErrorDates(signal: ErrorSignal, clock: Clock): ErrorSignal {\n return {\n ...signal,\n occurredAt: toDate(signal.occurredAt, clock),\n };\n}\n\nfunction normalizeBehaviorDates(\n signal: BehaviorSignal,\n clock: Clock\n): BehaviorSignal {\n return {\n ...signal,\n windowStart: toDate(signal.windowStart, clock),\n windowEnd: toDate(signal.windowEnd, clock),\n };\n}\n\nfunction toDate(value: Date | string, clock: Clock): Date {\n if (value instanceof Date) return value;\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return clock();\n }\n return parsed;\n}\n"],"mappings":"AAWA,SAAgB,EACd,EACA,EACA,EACyB,CACzB,MAAO,CACL,KAAM,YACN,YACA,OAAQ,EAAwB,EAAQ,EAAM,CAC/C,CAGH,SAAgB,EACd,EACA,EACA,EACqB,CACrB,MAAO,CACL,KAAM,QACN,YACA,OAAQ,EAAoB,EAAQ,EAAM,CAC3C,CAGH,SAAgB,EACd,EACA,EACA,EACwB,CACxB,MAAO,CACL,KAAM,WACN,YACA,OAAQ,EAAuB,EAAQ,EAAM,CAC9C,CAGH,SAAS,EACP,EACA,EACiB,CACjB,MAAO,CACL,GAAG,EACH,YAAa,EAAO,EAAO,YAAa,EAAM,CAC9C,UAAW,EAAO,EAAO,UAAW,EAAM,CAC3C,CAGH,SAAS,EAAoB,EAAqB,EAA2B,CAC3E,MAAO,CACL,GAAG,EACH,WAAY,EAAO,EAAO,WAAY,EAAM,CAC7C,CAGH,SAAS,EACP,EACA,EACgB,CAChB,MAAO,CACL,GAAG,EACH,YAAa,EAAO,EAAO,YAAa,EAAM,CAC9C,UAAW,EAAO,EAAO,UAAW,EAAM,CAC3C,CAGH,SAAS,EAAO,EAAsB,EAAoB,CACxD,GAAI,aAAiB,KAAM,OAAO,EAClC,IAAM,EAAS,IAAI,KAAK,EAAM,CAI9B,OAHI,OAAO,MAAM,EAAO,SAAS,CAAC,CACzB,GAAO,CAET"}
|
package/dist/registry.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","names":[],"sources":["../src/registry.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAyBe,KANH,YAAA,GAMG,GAAA,MAAA,KAAA,MAAA,EAAA;AAAY,iBAJX,KAAA,CAIW,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAJ2B,YAI3B;AAAA,KAAtB,OAAA,GAAU,YAIA,CAHb,cAGgD,EAFhD,cAEuD,GAFtC,qBAEsC,CAAA,OAAA,CAAA,CAAA;AAMzD,KANK,UAAA,GAMQ,CAAY,IAAA,EAAA,GAAA,EAAA,GAAA,EANU,UAMV,EAAA,GANyB,OAMzB,CAAA,OAAA,CAAA;;;;;AAcC,cAdb,YAAA,CAca;EAAhB,QAAA,KAAA;EAgBI,QAAA,QAAA;EACA;;;;;;;EACoC,QAAA,CAAA,UApBpC,cAoBoC,EAAA,UAnBpC,cAmBoC,GAnBnB,qBAmBmB,CAAA,OAAA,CAAA,CAAA,CAAA,IAAA,EAlBxC,YAkBwC,CAlB3B,CAkB2B,EAlBxB,CAkBwB,CAAA,CAAA,EAAA,IAAA;EAAX;;;;;;;;EA2E3B,IAAA,CAAA,UA7EE,cA6EF,EAAA,UA5EE,cA4EF,GA5EmB,qBA4EnB,CAAA,OAAA,CAAA,CAAA,CAAA,IAAA,EA3EF,YA2EE,CA3EW,CA2EX,EA3Ec,CA2Ed,CAAA,EAAA,OAAA,EA3E2B,UA2E3B,CA3EsC,YA2EtC,CA3EmD,CA2EnD,EA3EsD,CA2EtD,CAAA,CAAA,CAAA,EAAA,IAAA;;;;;;;;2CAzD+B;;;;8CAkBG;;eAO/B;;;UAKQ;aAAkB;;;;;;;;;;;;;;;6EA0BhC,aACJ"}
|
package/dist/registry.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","names":["key: OperationKey","found: AnySpec | undefined","out: { spec: AnySpec; handler: AnyHandler }[]","key","result: unknown"],"sources":["../src/registry.ts"],"sourcesContent":["/**\n * SpecRegistry:\n * - Registers ContractSpecs (unique by name+version)\n * - Binds runtime handlers to specs\n * - Provides lookup, iteration, and a safe execute() with validation/policy/enforcement\n *\n * Includes a minimal OpRegistry shim for backward-compat (deprecated).\n */\nimport {\n type ContractSpec,\n type TelemetryTrigger,\n isEmitDeclRef,\n} from './spec';\nimport type { ResourceRefDescriptor } from './resources';\nimport type { HandlerCtx } from './types';\nimport { eventKey } from './events';\nimport type { AnySchemaModel, ZodSchemaModel } from '@lssm/lib.schema';\nimport type { HandlerFor } from './install';\n\nexport type OperationKey = `${string}.v${number}`;\n\nexport function opKey(name: string, version: number): OperationKey {\n return `${name}.v${version}`;\n}\n\ntype AnySpec = ContractSpec<\n AnySchemaModel,\n AnySchemaModel | ResourceRefDescriptor<boolean>\n>;\ntype AnyHandler = (args: any, ctx: HandlerCtx) => Promise<unknown>;\n\n/**\n * In-memory registry for ContractSpecs and their bound handlers.\n * Provides validation, policy enforcement, and guarded event emission at execute time.\n */\nexport class SpecRegistry {\n private specs = new Map<OperationKey, AnySpec>();\n private handlers = new Map<OperationKey, AnyHandler>();\n\n /**\n * Registers a ContractSpec definition.\n *\n * @param spec - The contract specification to register.\n * @returns The registry instance for chaining.\n * @throws If a spec with the same name and version is already registered.\n */\n register<\n I extends AnySchemaModel,\n O extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n >(spec: ContractSpec<I, O>): this {\n const key = opKey(spec.meta.name, spec.meta.version);\n if (this.specs.has(key)) throw new Error(`Duplicate spec ${key}`);\n this.specs.set(key, spec as AnySpec);\n return this;\n }\n\n /**\n * Binds a runtime handler implementation to a previously registered spec.\n *\n * @param spec - The spec to bind to.\n * @param handler - The async function implementing the business logic.\n * @returns The registry instance for chaining.\n * @throws If the spec is not found or a handler is already bound.\n */\n bind<\n I extends AnySchemaModel,\n O extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n >(spec: ContractSpec<I, O>, handler: HandlerFor<ContractSpec<I, O>>): this {\n const key: OperationKey = opKey(spec.meta.name, spec.meta.version);\n\n if (!this.specs.has(key))\n throw new Error(`Cannot bind; spec not found: ${key}`);\n if (this.handlers.has(key))\n throw new Error(`Handler already bound for ${key}`);\n this.handlers.set(key, handler);\n return this;\n }\n\n /**\n * Retrieves a registered spec by name and version.\n * If version is omitted, returns the highest version found.\n *\n * @param name - Operation name.\n * @param version - (Optional) Specific version.\n */\n getSpec(name: string, version?: number): AnySpec | undefined {\n if (version != null) return this.specs.get(opKey(name, version));\n // find highest version by scanning keys of the same name\n let found: AnySpec | undefined;\n let maxV = -Infinity;\n for (const [k, s] of this.specs.entries()) {\n if (!k.startsWith(`${name}.v`)) continue;\n if (s.meta.version > maxV) {\n maxV = s.meta.version;\n found = s;\n }\n }\n return found;\n }\n\n /**\n * Retrieves the bound handler for a spec.\n */\n getHandler(name: string, version?: number): AnyHandler | undefined {\n const spec = this.getSpec(name, version);\n if (!spec) return undefined;\n return this.handlers.get(opKey(spec.meta.name, spec.meta.version));\n }\n\n /** Iterate all registered specs. */\n listSpecs(): AnySpec[] {\n return [...this.specs.values()];\n }\n\n /** Iterate all bound operations (spec+handler). */\n listBound(): { spec: AnySpec; handler: AnyHandler }[] {\n const out: { spec: AnySpec; handler: AnyHandler }[] = [];\n for (const [k, spec] of this.specs.entries()) {\n const h = this.handlers.get(k);\n if (h) out.push({ spec, handler: h });\n }\n return out;\n }\n\n /**\n * Execute an operation by name/version with full runtime protections:\n * 1. Validates input against Zod schema.\n * 2. Enforces policy (Auth, RBAC, Rate Limits) via PDP.\n * 3. Guards event emission to ensure only declared events are sent.\n * 4. Validates output against Zod schema (if applicable).\n * 5. Tracks telemetry (success/failure).\n *\n * @param name - Operation name.\n * @param version - Operation version (optional, defaults to latest).\n * @param rawInput - The raw input payload (e.g. from JSON body).\n * @param ctx - The runtime context (actor, tenant, etc.).\n */\n async execute(\n name: string,\n version: number | undefined,\n rawInput: unknown,\n ctx: HandlerCtx\n ): Promise<unknown> {\n const baseSpec = this.getSpec(name, version);\n if (!baseSpec)\n throw new Error(\n `Spec not found for ${name}${version ? `.v${version}` : ''}`\n );\n const spec =\n (await ctx.specVariantResolver?.resolve(\n {\n name: baseSpec.meta.name,\n version: baseSpec.meta.version,\n kind: baseSpec.meta.kind,\n },\n ctx\n )) ?? baseSpec;\n\n let key = opKey(spec.meta.name, spec.meta.version);\n let handler = this.handlers.get(key);\n if (!handler) {\n const fallbackKey = opKey(baseSpec.meta.name, baseSpec.meta.version);\n handler = this.handlers.get(fallbackKey);\n key = fallbackKey;\n }\n if (!handler) throw new Error(`No handler bound for ${key}`);\n\n // 1) Validate input\n const parsedInput = spec.io.input?.getZod().parse(rawInput);\n\n // 2) Policy enforcement\n if (ctx.decide) {\n const [service, command] = spec.meta.name.split('.');\n const decision = await ctx.decide({\n service: service!,\n command: command!,\n version: spec.meta.version,\n actor: ctx.actor ?? 'anonymous',\n channel: ctx.channel,\n roles: ctx.roles,\n organizationId: ctx.organizationId,\n userId: ctx.userId,\n flags: [], // adapter may fill flags from request\n });\n if (decision.effect === 'deny') {\n throw new Error(\n `PolicyDenied: ${spec.meta.name}.v${spec.meta.version}`\n );\n }\n if (decision.rateLimit && ctx.rateLimit) {\n const key = decision.rateLimit.key ?? 'default';\n const rpm = decision.rateLimit.rpm ?? 60;\n await ctx.rateLimit(key, 1, rpm);\n }\n // escalations are advisory; adapter may short-circuit if needed\n }\n\n // 3) Event emission guard\n const allowedEvents = new Map<string, AnySchemaModel>();\n if (spec.sideEffects?.emits) {\n for (const e of spec.sideEffects.emits) {\n if (isEmitDeclRef(e)) {\n allowedEvents.set(`${e.ref.name}.v${e.ref.version}`, e.ref.payload);\n } else {\n allowedEvents.set(`${e.name}.v${e.version}`, e.payload);\n }\n }\n }\n\n const emitGuard = async (\n eventName: string,\n eventVersion: number,\n payload: unknown\n ) => {\n const key2 = eventKey(eventName, eventVersion);\n const schema = allowedEvents.get(key2);\n if (!schema)\n throw new Error(\n `UndeclaredEvent: ${key2} not allowed by ${opKey(spec.meta.name, spec.meta.version)}`\n );\n const parsed = schema.getZod().parse(payload);\n // Delegate to service publisher if present\n await ctx.eventPublisher?.({\n name: eventName,\n version: eventVersion,\n payload: parsed,\n traceId: ctx.traceId,\n });\n };\n\n // 4) Execute handler with guarded ctx\n if (ctx.appConfig) {\n if (!ctx.branding) {\n ctx.branding = ctx.appConfig.branding;\n }\n if (!ctx.translation) {\n ctx.translation = { config: ctx.appConfig.translation };\n } else if (!ctx.translation.config) {\n ctx.translation = {\n ...ctx.translation,\n config: ctx.appConfig.translation,\n };\n }\n }\n const telemetryContext = ctx.telemetry;\n const trackTelemetry = async (\n trigger: TelemetryTrigger | undefined,\n details: { input: unknown; output?: unknown; error?: unknown }\n ) => {\n if (!telemetryContext || !trigger?.event) return;\n try {\n const props = trigger.properties?.(details) ?? {};\n await telemetryContext.track(\n trigger.event.name,\n trigger.event.version ?? 1,\n props,\n {\n tenantId: ctx.organizationId ?? undefined,\n organizationId: ctx.organizationId,\n userId: ctx.userId,\n actor: ctx.actor,\n channel: ctx.channel,\n metadata: ctx.traceId ? { traceId: ctx.traceId } : undefined,\n }\n );\n } catch (_error) {\n // Best-effort telemetry: swallow errors to avoid breaking the handler.\n }\n };\n\n let result: unknown;\n try {\n result = await handler(parsedInput, {\n ...ctx,\n __emitGuard__: emitGuard,\n });\n } catch (error) {\n if (spec.telemetry?.failure) {\n await trackTelemetry(spec.telemetry.failure, {\n input: parsedInput ?? rawInput,\n error,\n });\n }\n throw error;\n }\n\n if (spec.telemetry?.success) {\n await trackTelemetry(spec.telemetry.success, {\n input: parsedInput ?? rawInput,\n output: result,\n });\n }\n\n // 5) Validate output when the spec declares a SchemaModel output.\n const outputModel = spec.io.output as\n | AnySchemaModel\n | ResourceRefDescriptor<boolean>;\n if ((outputModel as AnySchemaModel)?.getZod) {\n const parsedOutput = (outputModel as AnySchemaModel)\n .getZod()\n .parse(result);\n return parsedOutput;\n }\n // ResourceRefDescriptor path: adapter may hydrate entity; leave as-is\n return result;\n }\n}\n"],"mappings":"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"}
|
package/dist/resources.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resources.d.ts","names":[],"sources":["../src/resources.ts"],"sourcesContent":[],"mappings":";;;;UAGiB,YAAA;;EAAA,WAAA,EAAA,MAAY;EAaZ;EAAiC,KAAA,EAAA,MAAA;EAC1C;EAEC,WAAA,CAAA,EAAA,MAAA;EAMS;EAAN,QAAA,EAAA,MAAA;EAE2C;EAAhD,IAAA,CAAA,EAdE,GAcF,EAAA;;AAGS,UAdC,oBAcqB,CAAA,UAdU,CAAA,CAAE,OAcZ,CAAA,CAAA;EAAa,IAAA,EAb3C,YAa2C;EACtB;EAArB,KAAA,EAZC,CAYD;EACgB;;;AAIxB;EAGuB,OAAA,EAAA,CAAA,IAAA,EAdb,CAAA,CAAE,KAcW,CAdL,CAcK,CAAA,EAAA,GAAA,EAAA;IAAoC,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAArB,KAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAKvB,MAAA,CAAA,EAAA,MAAA;EASD,CAAA,EAAA,GA1BP,OA0BO,CAAA;IAAmC,GAAA,EAAA,MAAA;IAAM,QAAA,CAAA,EAAA,MAAA;IAoBtC,IAAA,EA9CsC,UA8CtC,GAAA,MAAqB;EAYtB,CAAA,CAAA;;AAGS,iBA1DT,sBA0DS,CAAA,UA1DwB,CAAA,CAAE,OA0D1B,CAAA,CAAA,IAAA,EAzDjB,oBAyDiB,CAzDI,CAyDJ,CAAA,CAAA,EAxDtB,oBAwDsB,CAxDD,CAwDC,CAAA;AAAtB,cApDU,gBAAA,CAoDV;EAAqB,QAAA,SAAA;EAUR,QAAA,CAAA,UA3DK,CAAA,CAAE,OA2DM,CAAmB,CAAA,IAAA,EA3DV,oBA2D+B,CA3DV,CA2DU,CAAA,CAAA,EAAA,IAAA;mBAtDtD;;;UASD;YAAmC;;;UAoBhC;;;;;;;;;QAST;;iBAGQ;;;QAEuC;IACpD,sBAAsB;iBAUT,aAAA,mBAAgC"}
|
package/dist/resources.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resources.js","names":["params: Record<string, string>"],"sources":["../src/resources.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { Tag } from './ownership';\n\nexport interface ResourceMeta {\n /** URI scheme, e.g. \"content://doc/{id}\" or \"marketplace://offers/{city}/{tag}\" */\n uriTemplate: string;\n /** Human title for discovery */\n title: string;\n /** Short description */\n description?: string;\n /** MIME type for resource body */\n mimeType: string; // e.g., \"application/json\" | \"text/markdown\"\n /** Tags for filtering/grouping */\n tags?: Tag[];\n}\n\nexport interface ResourceTemplateSpec<I extends z.ZodType> {\n meta: ResourceMeta;\n /** Arguments to materialize the URI (zod validates input) */\n input: I;\n /**\n * Resolve returns the resource body and a resolved URI.\n * It MUST be read-only (no side effects).\n */\n resolve: (\n args: z.infer<I>,\n ctx: { userId?: string | null; orgId?: string | null; locale?: string }\n ) => Promise<{ uri: string; mimeType?: string; data: Uint8Array | string }>;\n}\n\nexport function defineResourceTemplate<I extends z.ZodType>(\n spec: ResourceTemplateSpec<I>\n): ResourceTemplateSpec<I> {\n return spec;\n}\n\nexport class ResourceRegistry {\n private templates: ResourceTemplateSpec<any>[] = [];\n\n register<I extends z.ZodType>(tmpl: ResourceTemplateSpec<I>): this {\n this.templates.push(tmpl);\n return this;\n }\n\n listTemplates() {\n return [...this.templates];\n }\n\n /** Try to match a concrete URI to a template by naive pattern substitution */\n // MVP: simple matcher; replace {param} with (.+) and capture\n match(\n uri: string\n ):\n | { tmpl: ResourceTemplateSpec<any>; params: Record<string, string> }\n | undefined {\n for (const tmpl of this.templates) {\n const re = new RegExp(\n '^' + tmpl.meta.uriTemplate.replace(/\\{[^}]+\\}/g, '([^/]+)') + '$'\n );\n const m = uri.match(re);\n if (!m) continue;\n const names = [...tmpl.meta.uriTemplate.matchAll(/\\{([^}]+)\\}/g)].map(\n (x) => x[1]\n );\n const params: Record<string, string> = {};\n names.forEach((n, i) => (params[n!] = decodeURIComponent(m[i + 1]!)));\n return { tmpl, params };\n }\n return undefined;\n }\n}\n\n// ResourceRef (output descriptor for ContractSpecs)\nexport interface ResourceRefDescriptor<Many extends boolean> {\n kind: 'resource_ref';\n /** URI template, e.g. 'strit://spot/{id}' */\n uriTemplate: string;\n /** Variable name inside result payload to substitute into template; defaults to 'id' */\n varName?: string;\n /** Optional GraphQL type name to use when exposing over GraphQL (e.g., 'Spot') */\n graphQLType: string;\n /** Cardinality: when present and true, the handler returns an array of resources */\n many: Many;\n}\n\nexport function resourceRef<Many extends boolean>(\n uriTemplate: string,\n opts: { varName?: string; graphQLType: string; many: Many }\n): ResourceRefDescriptor<Many> {\n return {\n kind: 'resource_ref',\n uriTemplate,\n varName: opts.varName ?? 'id',\n graphQLType: opts.graphQLType,\n many: opts.many,\n };\n}\n\nexport function isResourceRef(x: unknown): x is ResourceRefDescriptor<boolean> {\n const o = x as any;\n return !!o && o.kind === 'resource_ref' && typeof o.uriTemplate === 'string';\n}\n"],"mappings":"wBA8BA,SAAgB,EACd,EACyB,CACzB,OAAO,EAGT,IAAa,EAAb,KAA8B,CAC5B,UAAiD,EAAE,CAEnD,SAA8B,EAAqC,CAEjE,OADA,KAAK,UAAU,KAAK,EAAK,CAClB,KAGT,eAAgB,CACd,MAAO,CAAC,GAAG,KAAK,UAAU,CAK5B,MACE,EAGY,CACZ,IAAK,IAAM,KAAQ,KAAK,UAAW,CACjC,IAAM,EAAS,OACb,IAAM,EAAK,KAAK,YAAY,QAAQ,aAAc,UAAU,CAAG,IAChE,CACK,EAAI,EAAI,MAAM,EAAG,CACvB,GAAI,CAAC,EAAG,SACR,IAAM,EAAQ,CAAC,GAAG,EAAK,KAAK,YAAY,SAAS,eAAe,CAAC,CAAC,IAC/D,GAAM,EAAE,GACV,CACKA,EAAiC,EAAE,CAEzC,OADA,EAAM,SAAS,EAAG,IAAO,EAAO,GAAM,mBAAmB,EAAE,EAAI,GAAI,CAAE,CAC9D,CAAE,OAAM,SAAQ,IAmB7B,SAAgB,EACd,EACA,EAC6B,CAC7B,MAAO,CACL,KAAM,eACN,cACA,QAAS,EAAK,SAAW,KACzB,YAAa,EAAK,YAClB,KAAM,EAAK,KACZ,CAGH,SAAgB,EAAc,EAAiD,CAC7E,IAAM,EAAI,EACV,MAAO,CAAC,CAAC,GAAK,EAAE,OAAS,gBAAkB,OAAO,EAAE,aAAgB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FieldType.js","names":["t","n"],"sources":["../../../../schema/dist/FieldType.js"],"sourcesContent":["import{z as e}from\"zod\";import{GraphQLScalarType as t}from\"graphql\";var n=class extends t{zodSchema;jsonSchemaDef;constructor(e){super(e),this.zodSchema=e.zod,this.jsonSchemaDef=e.jsonSchema}getZod(){return this.zodSchema}getPothos(){return this}getJson(){return typeof this.jsonSchemaDef==`function`?this.jsonSchemaDef():this.jsonSchemaDef}getJsonSchemaDef(){return this.jsonSchemaDef}getJsonSchema(){let e=t=>{let n=typeof t==`function`?t():t;if(Array.isArray(n))return n.map(t=>e(t));if(n&&typeof n==`object`){let t={};for(let[r,i]of Object.entries(n))t[r]=e(i);return t}return n};return e(this.getJson())}};export{n as FieldType};\n//# sourceMappingURL=FieldType.js.map"],"mappings":"oEAAoE,IAAI,EAAE,cAAcA,CAAC,CAAC,UAAU,cAAc,YAAY,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,UAAU,EAAE,IAAI,KAAK,cAAc,EAAE,WAAW,QAAQ,CAAC,OAAO,KAAK,UAAU,WAAW,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,OAAO,KAAK,eAAe,WAAW,KAAK,eAAe,CAAC,KAAK,cAAc,kBAAkB,CAAC,OAAO,KAAK,cAAc,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,IAAIC,EAAE,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,GAAG,MAAM,QAAQA,EAAE,CAAC,OAAOA,EAAE,IAAI,GAAG,EAAED,EAAE,CAAC,CAAC,GAAGC,GAAG,OAAOA,GAAG,SAAS,CAAC,IAAID,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,OAAO,QAAQC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,OAAOD,EAAE,OAAOC,GAAG,OAAO,EAAE,KAAK,SAAS,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ScalarTypeEnum.js","names":["e","t","n"],"sources":["../../../../schema/dist/ScalarTypeEnum.js"],"sourcesContent":["import{FieldType as e}from\"./FieldType.js\";import{z as t}from\"zod\";import{Kind as n}from\"graphql\";const r=/^[A-Za-z]{2}(?:-[A-Za-z0-9]{2,8})*$/,i=/^(?:UTC|[A-Za-z_]+\\/[A-Za-z_]+)$/,a=/^[+]?\\d[\\d\\s().-]{3,}$/,o=/^[A-Z]{3}$/,s=/^[A-Z]{2}$/,c=-180,l={String_unsecure:()=>new e({name:`String_unsecure`,description:`Unvalidated string scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),Int_unsecure:()=>new e({name:`Int_unsecure`,description:`Unvalidated integer scalar`,zod:t.number().int(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().int().parse(n)},serialize:e=>Math.trunc(typeof e==`number`?e:Number(e)),parseLiteral:e=>{if(e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`integer`}}),Float_unsecure:()=>new e({name:`Float_unsecure`,description:`Unvalidated float scalar`,zod:t.number(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().parse(n)},serialize:e=>Number(e),parseLiteral:e=>{if(e.kind!==n.FLOAT&&e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`number`}}),Boolean:()=>new e({name:`Boolean`,description:`Unvalidated boolean scalar`,zod:t.boolean(),parseValue:e=>t.coerce.boolean().parse(e),serialize:e=>!!e,parseLiteral:e=>{if(e.kind!==n.BOOLEAN)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`boolean`}}),ID:()=>new e({name:`ID`,description:`Unvalidated id scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),JSON:()=>new e({name:`JSON`,zod:t.any(),parseValue:e=>e,serialize:e=>e,jsonSchema:{}}),JSONObject:()=>new e({name:`JSONObject`,zod:t.record(t.string(),t.any()),parseValue:e=>t.record(t.string(),t.any()).parse(e),serialize:e=>e??{},jsonSchema:{type:`object`}}),Date:()=>new e({name:`Date`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString().split(`T`)[0]:String(e),jsonSchema:{type:`string`,format:`date`}}),DateTime:()=>new e({name:`DateTime`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString():String(e),jsonSchema:{type:`string`,format:`date-time`}}),Time:()=>new e({name:`Time`,zod:t.string().regex(/^\\d{2}:\\d{2}(:\\d{2})?$/),parseValue:e=>t.string().regex(/^\\d{2}:\\d{2}(:\\d{2})?$/).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:`^\\\\d{2}:\\\\d{2}(:\\\\d{2})?$`}}),EmailAddress:()=>new e({name:`EmailAddress`,zod:t.string().email(),parseValue:e=>t.string().email().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`email`}}),URL:()=>new e({name:`URL`,zod:t.string().url(),parseValue:e=>t.string().url().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`uri`}}),PhoneNumber:()=>new e({name:`PhoneNumber`,zod:t.string().regex(a),parseValue:e=>t.string().regex(a).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:a.source}}),NonEmptyString:()=>new e({name:`NonEmptyString`,zod:t.string().min(1),parseValue:e=>t.string().min(1).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,minLength:1}}),Locale:()=>new e({name:`Locale`,zod:t.string().regex(r),parseValue:e=>t.string().regex(r).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:r.source}}),TimeZone:()=>new e({name:`TimeZone`,zod:t.string().regex(i),parseValue:e=>t.string().regex(i).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:i.source}}),Latitude:()=>new e({name:`Latitude`,zod:t.number().min(-90).max(90),parseValue:e=>t.coerce.number().min(-90).max(90).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:-90,maximum:90}}),Longitude:()=>new e({name:`Longitude`,zod:t.number().min(c).max(180),parseValue:e=>t.coerce.number().min(c).max(180).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:c,maximum:180}}),Currency:()=>new e({name:`Currency`,zod:t.string().regex(o),parseValue:e=>t.string().regex(o).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:o.source}}),CountryCode:()=>new e({name:`CountryCode`,zod:t.string().regex(s),parseValue:e=>t.string().regex(s).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:s.source}})};export{l as ScalarTypeEnum};\n//# sourceMappingURL=ScalarTypeEnum.js.map"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaModel.js","names":["t","e"],"sources":["../../../../schema/dist/SchemaModel.js"],"sourcesContent":["import\"./EnumType.js\";import\"./FieldType.js\";import{z as e}from\"zod\";var t=class{constructor(e){this.config=e}getZod(){let t=Object.entries(this.config.fields).reduce((t,[n,r])=>{let i=r.type.getZod(),a=r.isArray?e.array(i):i;return t[n]=r.isOptional?a.optional():a,t},{});return e.object(t)}getPothosInput(){return this.config.name}};export{t as SchemaModel};\n//# sourceMappingURL=SchemaModel.js.map"],"mappings":"qEAAqE,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,KAAK,OAAO,EAAE,QAAQ,CAAC,IAAIA,EAAE,OAAO,QAAQ,KAAK,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,QAAQC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAO,GAAE,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,EAAED,GAAG,EAAE,CAAC,CAAC,OAAOC,EAAE,OAAOD,EAAE,CAAC,gBAAgB,CAAC,OAAO,KAAK,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graphql-pothos.d.ts","names":[],"sources":["../../src/server/graphql-pothos.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;AAuCA;;;;;;;;;;;;;;;iBAAgB,qCAAqC,sBAC1C,iBAAA,CAAkB,cAAc,SACpC,0BACO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graphql-pothos.js","names":["acc: Record<string, any>","handlerCtx: HandlerCtx","result: unknown","fieldSettingsFn: QueryFieldThunk<T> | MutationFieldThunk<T>"],"sources":["../../src/server/graphql-pothos.ts"],"sourcesContent":["import type {\n MutationFieldThunk,\n QueryFieldThunk,\n SchemaTypes,\n} from '@pothos/core';\nimport type { HandlerCtx } from '../types';\nimport { defaultGqlField } from '../jsonschema';\nimport type { SpecRegistry } from '../registry';\nimport '@pothos/plugin-prisma';\nimport '@pothos/plugin-complexity';\nimport '@pothos/plugin-relay';\nimport '@pothos/plugin-dataloader';\nimport '@pothos/plugin-tracing';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { ResourceRefDescriptor, ResourceRegistry } from '../resources';\nimport { createInputTypeBuilder } from '../contracts-adapter-input';\nimport type { AnyContractSpec } from '../spec';\nimport {\n hydrateResourceIfNeeded,\n parseReturns,\n} from '../contracts-adapter-hydration';\n\n/**\n * Registers all ContractSpecs from a SpecRegistry onto a Pothos SchemaBuilder.\n *\n * This adapter:\n * 1. Discovers output types from specs and registers them as Pothos object types.\n * 2. Maps `ContractSpec` inputs to Pothos input types.\n * 3. Mounts `query` specs as `Query` fields and `command` specs as `Mutation` fields.\n * 4. Wraps the resolver to:\n * - Enforce auth policies (basic check).\n * - Build a `HandlerCtx`.\n * - Execute via `SpecRegistry`.\n * - Hydrate resource references if applicable.\n *\n * @param builder - The Pothos SchemaBuilder instance.\n * @param reg - The SpecRegistry containing operations.\n * @param resources - (Optional) ResourceRegistry for hydrating resource references.\n */\nexport function registerContractsOnBuilder<T extends SchemaTypes>(\n builder: PothosSchemaTypes.SchemaBuilder<T>,\n reg: SpecRegistry,\n resources?: ResourceRegistry\n) {\n const { buildInputFieldArgs } = createInputTypeBuilder(builder);\n\n // Build a map of output types we need to register\n const outputTypeCache = new Map<string, AnySchemaModel>();\n for (const spec of reg.listSpecs()) {\n const out = spec.io.output as\n | AnySchemaModel\n | ResourceRefDescriptor<boolean>;\n if (out && 'getZod' in out && typeof out.getZod === 'function') {\n const model = out as AnySchemaModel;\n const typeName = model.config?.name ?? 'UnknownOutput';\n if (!outputTypeCache.has(typeName)) {\n outputTypeCache.set(typeName, model);\n }\n }\n }\n\n // Register all output types as GraphQL object types\n for (const [typeName, model] of outputTypeCache.entries()) {\n builder.objectType(typeName as any, {\n fields: (t) => {\n const entries = Object.entries(model.config.fields) as [\n string,\n {\n type: any;\n isOptional: boolean;\n isArray?: boolean;\n },\n ][];\n const acc: Record<string, any> = {};\n for (const [key, field] of entries) {\n const fieldType = field.type;\n let gqlType = 'JSON';\n\n // Check if it's a known scalar type\n if (fieldType && typeof fieldType.getPothos === 'function') {\n const pothosInfo = fieldType.getPothos();\n gqlType = pothosInfo.name || 'JSON';\n // Map unsecure types to their secure equivalents\n if (gqlType === 'String_unsecure') gqlType = 'String';\n if (gqlType === 'Int_unsecure') gqlType = 'Int';\n if (gqlType === 'Float_unsecure') gqlType = 'Float';\n if (gqlType === 'Boolean_unsecure') gqlType = 'Boolean';\n if (gqlType === 'ID_unsecure') gqlType = 'ID';\n }\n\n const typeRef = field.isArray\n ? ([gqlType] as never)\n : (gqlType as never);\n acc[key] = t.field({\n type: typeRef,\n nullable: field.isOptional,\n resolve: (parent: any) => parent[key],\n });\n }\n return acc as never;\n },\n });\n }\n\n // For outputs, prefer an explicit GraphQL type name; otherwise use SchemaModel name or resource ref\n function resolveGraphQLTypeName(contractSpec: AnyContractSpec): string {\n const returnsName = contractSpec.transport?.gql?.returns;\n if (returnsName) return returnsName;\n\n const out = contractSpec.io.output ?? {};\n\n // Check if it's a resource ref\n if (\n out &&\n 'kind' in out &&\n out.kind === 'resource_ref' &&\n 'graphQLType' in out &&\n out.graphQLType\n )\n return String(out.graphQLType);\n\n // Check if it's a SchemaModel with a name\n if (out && 'getZod' in out && typeof out.getZod === 'function') {\n const model = out as AnySchemaModel;\n const typeName = model.config?.name;\n if (typeName && outputTypeCache.has(typeName)) {\n return typeName;\n }\n }\n\n return 'JSON';\n }\n\n // parseReturns moved to hydration util\n\n for (const spec of reg.listSpecs()) {\n const fieldName =\n spec.transport?.gql?.field ??\n defaultGqlField(spec.meta.name, spec.meta.version);\n const returnsName = spec.transport?.gql?.returns;\n const byIdField =\n (spec.transport as unknown as { gql?: { byIdField?: string } })?.gql\n ?.byIdField ?? 'id';\n const returnsResource = (\n spec.transport as unknown as { gql?: { resource?: string } }\n )?.gql?.resource;\n const isQuery = spec.meta.kind === 'query';\n\n const graphQLTypeName = resolveGraphQLTypeName(spec);\n const returnsDecl = (\n spec.transport as unknown as { gql?: { returns?: string } }\n )?.gql?.returns;\n const parsed = parseReturns(returnsDecl ?? graphQLTypeName);\n\n const resolveFieldFn = async (_root: any, args: any, ctx: any) => {\n if (spec.policy.auth !== 'anonymous' && !ctx.user)\n throw new Error('Unauthorized');\n const handlerCtx: HandlerCtx = {\n traceId: ctx.logger?.getTraceId?.() ?? undefined,\n userId: ctx.user?.id ?? null,\n organizationId: ctx.session?.activeOrganizationId ?? null,\n actor: ctx.user ? 'user' : 'anonymous',\n channel: 'web',\n eventPublisher: ctx.eventPublisher,\n };\n const parsedInput = spec.io.input?.getZod().parse(args.input ?? {});\n const result: unknown = await reg.execute(\n spec.meta.name,\n spec.meta.version,\n parsedInput,\n handlerCtx\n );\n const out = spec.io.output as unknown;\n if (\n resources &&\n (returnsResource || (out as { kind?: string })?.kind === 'resource_ref')\n ) {\n const varName =\n byIdField ?? (out as { varName?: string })?.varName ?? 'id';\n const template =\n returnsResource ?? (out as { uriTemplate?: string })?.uriTemplate;\n const hydrated = await hydrateResourceIfNeeded(resources, result, {\n template,\n varName,\n returns: parsed,\n });\n if (hydrated !== result) return hydrated as never;\n }\n if (graphQLTypeName) {\n if (parsed.inner === 'Boolean' && !parsed.isList)\n return Boolean((result as { ok?: boolean })?.ok ?? result) as never;\n // fallback to direct\n return result as unknown as never;\n }\n const parsedOut: unknown = (spec.io.output as AnySchemaModel)\n .getZod()\n .parse(result);\n return parsedOut as never;\n };\n\n const fieldSettingsFn: QueryFieldThunk<T> | MutationFieldThunk<T> = (\n t: PothosSchemaTypes.MutationFieldBuilder<T, T['Root']>\n ) => {\n const inputType = buildInputFieldArgs(spec.io.input);\n return t.field({\n type: (parsed.isList ? [parsed.inner] : parsed.inner) as any,\n complexity: () => 10,\n resolve: resolveFieldFn as any,\n args: inputType\n ? {\n input: t.arg({\n type: inputType,\n required: true,\n }),\n }\n : undefined,\n });\n };\n\n if (isQuery) {\n builder.queryField(\n fieldName,\n fieldSettingsFn as never as QueryFieldThunk<T>\n );\n } else {\n builder.mutationField(\n fieldName,\n fieldSettingsFn as MutationFieldThunk<T>\n );\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graphql-schema-export.d.ts","names":[],"sources":["../../src/server/graphql-schema-export.ts"],"sourcesContent":[],"mappings":";;;cAKa,yCACH,yCACa"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graphql-schema-export.js","names":["toSubgraphSDL"],"sources":["../../src/server/graphql-schema-export.ts"],"sourcesContent":["'use server';\n\nimport { GraphQLSchema, printSchema } from 'graphql';\nimport { toSubgraphSDL } from '@lssm/lib.graphql-federation';\n\nexport const exportContractsToGraphQLSchema = async (\n schema: GraphQLSchema,\n outputPathDir: string\n) => {\n const fs = await import('fs');\n const path = await import('path');\n\n const schemaString = printSchema(schema);\n const subgraphString = toSubgraphSDL(schema);\n const outputPath = path.join(outputPathDir, '../schema.graphql');\n const subgraphPath = path.join(outputPathDir, '../schema.subgraph.graphql');\n\n fs.writeFileSync(outputPath, schemaString);\n console.log(`Schema exported to ${outputPath}`);\n fs.writeFileSync(subgraphPath, subgraphString);\n console.log(`Subgraph exported to ${subgraphPath}`);\n};\n"],"mappings":"8HAKA,MAAa,EAAiC,MAC5C,EACA,IACG,CACH,IAAM,EAAK,MAAM,OAAO,MAClB,EAAO,MAAM,OAAO,QAEpB,EAAe,EAAY,EAAO,CAClC,EAAiBA,EAAc,EAAO,CACtC,EAAa,EAAK,KAAK,EAAe,oBAAoB,CAC1D,EAAe,EAAK,KAAK,EAAe,6BAA6B,CAE3E,EAAG,cAAc,EAAY,EAAa,CAC1C,QAAQ,IAAI,sBAAsB,IAAa,CAC/C,EAAG,cAAc,EAAc,EAAe,CAC9C,QAAQ,IAAI,wBAAwB,IAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider-mcp.d.ts","names":[],"sources":["../../src/server/provider-mcp.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;AA6CA;;;;;;;;;;;;;;;;;iBAAgB,eAAA,SACN,gBACH,yBACM,2BACF;;iBAGQ;;;;;;;;;;;;;;kBAcC;;oBAEE;IACnB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider-mcp.js","names":["z"],"sources":["../../src/server/provider-mcp.ts"],"sourcesContent":["import {\n McpServer,\n ResourceTemplate,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { SpecRegistry } from '../registry';\nimport type { ResourceRegistry } from '../resources';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { ContractSpec } from '../spec';\nimport type { PresentationRegistry } from '../presentations';\nimport { jsonSchemaForPresentation } from '../presentations';\nimport {\n createDefaultTransformEngine,\n type PresentationDescriptorV2,\n registerBasicValidation,\n registerDefaultReactRenderer,\n} from '../presentations.v2';\nimport type { PromptRegistry } from '../promptRegistry';\nimport type { HandlerCtx } from '../types';\nimport { defaultMcpTool, jsonSchemaForSpec } from '../jsonschema';\nimport type {\n CallToolResult,\n GetPromptResult,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport z from 'zod';\n\n/**\n * Creates a unified Model Context Protocol (MCP) server exposing operations, resources, and prompts.\n *\n * This function takes registries for operations, resources, and prompts, and exposes them as\n * MCP Tools, Resources, and Prompts respectively. It enables AI agents to discover and interact\n * with the application's capabilities.\n *\n * Features:\n * - **Tools**: Exposes `command` operations as executable tools.\n * - **Resources**: Exposes `ResourceRegistry` entries and `PresentationSpec`s (Markdown/JSON) as read-only resources.\n * - **Prompts**: Exposes `PromptRegistry` entries as templated prompts.\n *\n * @param server - The `McpServer` instance to populate.\n * @param ops - Registry containing operations (tools).\n * @param resources - Registry containing data resources.\n * @param prompts - Registry containing prompt templates.\n * @param ctxFactories - Factories to create context for tools, resources, and prompts execution.\n * @returns The populated `McpServer` instance.\n */\nexport function createMcpServer(\n server: McpServer,\n ops: SpecRegistry,\n resources: ResourceRegistry,\n prompts: PromptRegistry,\n ctxFactories: {\n /** Factory for tool execution context (e.g., system actor) */\n toolCtx: () => HandlerCtx;\n /** Factory for prompt rendering context */\n promptCtx: () => {\n userId?: string | null;\n orgId?: string | null;\n locale?: string;\n };\n /** Factory for resource resolution context */\n resourceCtx: () => {\n userId?: string | null;\n orgId?: string | null;\n locale?: string;\n };\n /** Optional registry for V1 presentations */\n presentations?: PresentationRegistry;\n /** Optional list of V2 presentation descriptors */\n presentationsV2?: PresentationDescriptorV2[];\n }\n) {\n /* ---------- Tools (commands) ---------- */\n for (const spec of ops.listSpecs()) {\n if (spec.meta.kind !== 'command') continue; // expose only commands as tools\n const { input } = jsonSchemaForSpec(\n spec as unknown as ContractSpec<AnySchemaModel, AnySchemaModel>\n );\n const toolName =\n spec.transport?.mcp?.toolName ??\n defaultMcpTool(spec.meta.name, spec.meta.version);\n\n server.registerTool(\n toolName,\n {\n // name: toolName,\n description: spec.meta.description,\n inputSchema: input as any,\n },\n async (args: any, _req: any): Promise<CallToolResult> => {\n const result = await ops.execute(\n spec.meta.name,\n spec.meta.version,\n args ?? {},\n ctxFactories.toolCtx()\n );\n // return { content: [{ type: 'json', json: result }] };\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 4) }],\n };\n }\n );\n }\n\n /* ---------- Resources (queries/views) ---------- */\n for (const resource of resources.listTemplates()) {\n // server.registerPrompt(\n // 'review-code',\n // {\n // title: 'Code Review',\n // description: 'Review code for best practices and potential issues',\n // argsSchema: { code: z.string() as any },\n // },\n // ({ code }: { code?: string }) => ({\n // messages: [\n // {\n // role: 'user',\n // content: {\n // type: 'text',\n // text: `Please review this code:\\n\\n${code}`,\n // },\n // },\n // ],\n // })\n // );\n\n (server as any).registerResource(\n resource.meta.uriTemplate.split(':')[0]!,\n new ResourceTemplate(resource.meta.uriTemplate, {} as any),\n {\n // name: resource.meta.title,\n description: resource.meta.description,\n inputSchema: zodToJsonSchema(resource.input, {\n // metadata: `${op.meta.name}.input.v${op.meta.version}`,\n }),\n },\n async (_uri: any, args: any, _req: any) => {\n const ctx = ctxFactories.resourceCtx();\n const out = await resource.resolve(args, ctx);\n if (typeof out.data === 'string') {\n return {\n contents: [\n {\n uri: out.uri,\n mimeType: out.mimeType ?? resource.meta.mimeType,\n text: out.data,\n },\n ],\n };\n }\n return {\n contents: [\n {\n uri: out.uri,\n mimeType: out.mimeType ?? resource.meta.mimeType,\n blob: out.data.toString(),\n },\n ],\n };\n }\n );\n }\n\n /* ---------- Presentations as resources (markdown/data) with content negotiation ---------- */\n const __presentations = ctxFactories.presentations;\n const __presentationsV2 = ctxFactories.presentationsV2;\n if (__presentations) {\n const engine = registerBasicValidation(\n registerDefaultReactRenderer(createDefaultTransformEngine())\n );\n for (const p of __presentations.list()) {\n const baseKey = `presentation.${p.meta.name.replace(/\\./g, '_')}.v${p.meta.version}`;\n const baseUri = `presentation://${p.meta.name}/v${p.meta.version}`;\n\n // Generic metadata\n (server as any).registerResource(\n baseKey,\n new ResourceTemplate(baseUri, {} as any),\n {\n description: p.meta.description ?? 'Presentation',\n inputSchema: z.toJSONSchema(z.object({})),\n },\n async (_uri: any, _args: any, _req: any) => {\n if (p.content.kind === 'markdown') {\n const text = p.content.content\n ? p.content.content\n : `See resource: ${p.content.resourceUri ?? ''}`;\n return {\n contents: [\n {\n uri: baseUri,\n mimeType: 'text/markdown',\n text,\n },\n ],\n };\n }\n if (p.content.kind === 'data') {\n const schema = jsonSchemaForPresentation(p);\n return {\n contents: [\n {\n uri: baseUri,\n mimeType: 'application/json',\n text: JSON.stringify(schema, null, 2),\n },\n ],\n };\n }\n // web_component: metadata only for now\n const metaOnly = {\n name: p.meta.name,\n version: p.meta.version,\n kind: p.content.kind,\n description: p.meta.description ?? '',\n };\n return {\n contents: [\n {\n uri: baseUri,\n mimeType: 'application/json',\n text: JSON.stringify(metaOnly, null, 2),\n },\n ],\n };\n }\n );\n\n // Negotiated variants\n const variants: {\n ext: string;\n target: 'markdown' | 'application/json' | 'application/xml';\n }[] = [\n { ext: '.md', target: 'markdown' },\n { ext: '.json', target: 'application/json' },\n { ext: '.xml', target: 'application/xml' },\n ];\n for (const v of variants) {\n const key = `${baseKey}${v.ext}`;\n const uri = `${baseUri}${v.ext}`;\n (server as any).registerResource(\n key,\n new ResourceTemplate(uri, {} as any),\n {\n description: `${p.meta.description ?? 'Presentation'} (${v.ext})`,\n inputSchema: z.toJSONSchema(z.object({})),\n },\n async () => {\n // Use V2 engine to render a normalized JSON snapshot; if p is V1, fallback to jsonSchemaForPresentation\n if (p.content.kind === 'markdown' && v.target === 'markdown') {\n const text =\n p.content.content ??\n `See resource: ${p.content.resourceUri ?? ''}`;\n return { contents: [{ uri, mimeType: 'text/markdown', text }] };\n }\n if (p.content.kind === 'data' && v.target === 'application/json') {\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(jsonSchemaForPresentation(p), null, 2),\n },\n ],\n };\n }\n // Default: represent as JSON snapshot\n const jsonText = JSON.stringify(\n { meta: p.meta, content: p.content },\n null,\n 2\n );\n if (v.target === 'application/json') {\n return {\n contents: [\n { uri, mimeType: 'application/json', text: jsonText },\n ],\n };\n }\n if (v.target === 'application/xml') {\n const xml = `<presentation name=\"${p.meta.name}\" version=\"${p.meta.version}\"><json>${encodeURIComponent(jsonText)}</json></presentation>`;\n return {\n contents: [{ uri, mimeType: 'application/xml', text: xml }],\n };\n }\n // markdown fallback\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: 'Unsupported presentation for markdown',\n },\n ],\n };\n }\n );\n }\n }\n }\n\n // V2: register descriptors using transform engine (same scheme/negotiation)\n if (__presentationsV2 && __presentationsV2.length) {\n const engine = registerBasicValidation(\n registerDefaultReactRenderer(createDefaultTransformEngine())\n );\n for (const d of __presentationsV2) {\n const baseKey = `presentation.${d.meta.name.replace(/\\./g, '_')}.v${d.meta.version}`;\n const baseUri = `presentation://${d.meta.name}/v${d.meta.version}`;\n\n (server as any).registerResource(\n baseKey,\n new ResourceTemplate(baseUri, {} as any),\n {\n description: d.meta.description ?? 'Presentation',\n inputSchema: z.toJSONSchema(z.object({})),\n },\n async () => {\n const jsonText = JSON.stringify(\n { meta: d.meta, source: d.source, targets: d.targets },\n null,\n 2\n );\n return {\n contents: [\n { uri: baseUri, mimeType: 'application/json', text: jsonText },\n ],\n };\n }\n );\n\n const variants: {\n ext: string;\n target: 'markdown' | 'application/json' | 'application/xml';\n }[] = [\n { ext: '.md', target: 'markdown' },\n { ext: '.json', target: 'application/json' },\n { ext: '.xml', target: 'application/xml' },\n ];\n for (const v of variants) {\n const key = `${baseKey}${v.ext}`;\n const uri = `${baseUri}${v.ext}`;\n (server as any).registerResource(\n key,\n new ResourceTemplate(uri, {} as any),\n {\n description: `${d.meta.description ?? 'Presentation'} (${v.ext})`,\n inputSchema: z.toJSONSchema(z.object({})),\n },\n async () => {\n const out = await engine.render(v.target, d);\n return {\n contents: [\n {\n uri,\n mimeType:\n (out as any).mimeType ??\n (v.target === 'markdown' ? 'text/markdown' : v.target),\n text: (out as any).body ?? String(out),\n },\n ],\n };\n }\n );\n }\n }\n }\n\n /* ---------- Prompts ---------- */\n // for (const prompt of prompts.list()) {\n for (const prompt of prompts.list()) {\n server.registerPrompt(\n prompt.meta.name,\n {\n title: prompt.meta.title,\n description: prompt.meta.title,\n argsSchema: zodToJsonSchema(prompt.input) as any,\n },\n async (args: any, _extra: any): Promise<GetPromptResult> => {\n const link = (tpl: string, vars: Record<string, string | number>) => {\n let out = tpl;\n for (const [k, v] of Object.entries(vars))\n out = out.replace(\n new RegExp(`\\\\{${k}\\\\}`, 'g'),\n encodeURIComponent(String(v))\n );\n return out;\n };\n\n const parts = await prompt.render(prompt.input.parse(args), {\n ...ctxFactories.promptCtx(),\n link,\n });\n\n // MCP prompt shape: messages[{role, content[]}]; we return a single \"system\" text chunk + referenced resources\n const contents: GetPromptResult['messages'][number]['content'][] =\n parts.map(\n (p) =>\n p.type === 'text'\n ? { type: 'text', text: p.text }\n : {\n type: 'text',\n text: `See resource: ${p.title ?? p.uri}\\nURI: ${p.uri}`,\n } // simple way to reference; clients may fetch resources directly\n );\n\n return {\n messages: [{ role: 'assistant', content: contents[0]! }],\n description: prompt.meta.description,\n };\n }\n );\n }\n\n return server;\n}\n"],"mappings":"gbA6CA,SAAgB,EACd,EACA,EACA,EACA,EACA,EAoBA,CAEA,IAAK,IAAM,KAAQ,EAAI,WAAW,CAAE,CAClC,GAAI,EAAK,KAAK,OAAS,UAAW,SAClC,GAAM,CAAE,SAAU,EAChB,EACD,CACK,EACJ,EAAK,WAAW,KAAK,UACrB,EAAe,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,CAEnD,EAAO,aACL,EACA,CAEE,YAAa,EAAK,KAAK,YACvB,YAAa,EACd,CACD,MAAO,EAAW,IAAuC,CACvD,IAAM,EAAS,MAAM,EAAI,QACvB,EAAK,KAAK,KACV,EAAK,KAAK,QACV,GAAQ,EAAE,CACV,EAAa,SAAS,CACvB,CAED,MAAO,CACL,QAAS,CAAC,CAAE,KAAM,OAAQ,KAAM,KAAK,UAAU,EAAQ,KAAM,EAAE,CAAE,CAAC,CACnE,EAEJ,CAIH,IAAK,IAAM,KAAY,EAAU,eAAe,CAqB7C,EAAe,iBACd,EAAS,KAAK,YAAY,MAAM,IAAI,CAAC,GACrC,IAAI,EAAiB,EAAS,KAAK,YAAa,EAAE,CAAQ,CAC1D,CAEE,YAAa,EAAS,KAAK,YAC3B,YAAa,EAAgB,EAAS,MAAO,EAE5C,CAAC,CACH,CACD,MAAO,EAAW,EAAW,IAAc,CACzC,IAAM,EAAM,EAAa,aAAa,CAChC,EAAM,MAAM,EAAS,QAAQ,EAAM,EAAI,CAY7C,OAXI,OAAO,EAAI,MAAS,SACf,CACL,SAAU,CACR,CACE,IAAK,EAAI,IACT,SAAU,EAAI,UAAY,EAAS,KAAK,SACxC,KAAM,EAAI,KACX,CACF,CACF,CAEI,CACL,SAAU,CACR,CACE,IAAK,EAAI,IACT,SAAU,EAAI,UAAY,EAAS,KAAK,SACxC,KAAM,EAAI,KAAK,UAAU,CAC1B,CACF,CACF,EAEJ,CAIH,IAAM,EAAkB,EAAa,cAC/B,EAAoB,EAAa,gBACvC,GAAI,EAAiB,CACJ,EACb,EAA6B,GAA8B,CAAC,CAC7D,CACD,IAAK,IAAM,KAAK,EAAgB,MAAM,CAAE,CACtC,IAAM,EAAU,gBAAgB,EAAE,KAAK,KAAK,QAAQ,MAAO,IAAI,CAAC,IAAI,EAAE,KAAK,UACrE,EAAU,kBAAkB,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,UAGxD,EAAe,iBACd,EACA,IAAI,EAAiB,EAAS,EAAE,CAAQ,CACxC,CACE,YAAa,EAAE,KAAK,aAAe,eACnC,YAAaA,EAAE,aAAaA,EAAE,OAAO,EAAE,CAAC,CAAC,CAC1C,CACD,MAAO,EAAW,EAAY,IAAc,CAC1C,GAAI,EAAE,QAAQ,OAAS,WAIrB,MAAO,CACL,SAAU,CACR,CACE,IAAK,EACL,SAAU,gBACV,KARO,EAAE,QAAQ,QACnB,EAAE,QAAQ,QACV,iBAAiB,EAAE,QAAQ,aAAe,KAOzC,CACF,CACF,CAEH,GAAI,EAAE,QAAQ,OAAS,OAAQ,CAC7B,IAAM,EAAS,EAA0B,EAAE,CAC3C,MAAO,CACL,SAAU,CACR,CACE,IAAK,EACL,SAAU,mBACV,KAAM,KAAK,UAAU,EAAQ,KAAM,EAAE,CACtC,CACF,CACF,CAGH,IAAM,EAAW,CACf,KAAM,EAAE,KAAK,KACb,QAAS,EAAE,KAAK,QAChB,KAAM,EAAE,QAAQ,KAChB,YAAa,EAAE,KAAK,aAAe,GACpC,CACD,MAAO,CACL,SAAU,CACR,CACE,IAAK,EACL,SAAU,mBACV,KAAM,KAAK,UAAU,EAAU,KAAM,EAAE,CACxC,CACF,CACF,EAEJ,CAWD,IAAK,IAAM,IALL,CACJ,CAAE,IAAK,MAAO,OAAQ,WAAY,CAClC,CAAE,IAAK,QAAS,OAAQ,mBAAoB,CAC5C,CAAE,IAAK,OAAQ,OAAQ,kBAAmB,CAC3C,CACyB,CACxB,IAAM,EAAM,GAAG,IAAU,EAAE,MACrB,EAAM,GAAG,IAAU,EAAE,MAC1B,EAAe,iBACd,EACA,IAAI,EAAiB,EAAK,EAAE,CAAQ,CACpC,CACE,YAAa,GAAG,EAAE,KAAK,aAAe,eAAe,IAAI,EAAE,IAAI,GAC/D,YAAaA,EAAE,aAAaA,EAAE,OAAO,EAAE,CAAC,CAAC,CAC1C,CACD,SAAY,CAEV,GAAI,EAAE,QAAQ,OAAS,YAAc,EAAE,SAAW,WAIhD,MAAO,CAAE,SAAU,CAAC,CAAE,MAAK,SAAU,gBAAiB,KAFpD,EAAE,QAAQ,SACV,iBAAiB,EAAE,QAAQ,aAAe,KACgB,CAAC,CAAE,CAEjE,GAAI,EAAE,QAAQ,OAAS,QAAU,EAAE,SAAW,mBAC5C,MAAO,CACL,SAAU,CACR,CACE,MACA,SAAU,mBACV,KAAM,KAAK,UAAU,EAA0B,EAAE,CAAE,KAAM,EAAE,CAC5D,CACF,CACF,CAGH,IAAM,EAAW,KAAK,UACpB,CAAE,KAAM,EAAE,KAAM,QAAS,EAAE,QAAS,CACpC,KACA,EACD,CAeD,OAdI,EAAE,SAAW,mBACR,CACL,SAAU,CACR,CAAE,MAAK,SAAU,mBAAoB,KAAM,EAAU,CACtD,CACF,CAEC,EAAE,SAAW,kBAER,CACL,SAAU,CAAC,CAAE,MAAK,SAAU,kBAAmB,KAFrC,uBAAuB,EAAE,KAAK,KAAK,aAAa,EAAE,KAAK,QAAQ,UAAU,mBAAmB,EAAS,CAAC,wBAEtD,CAAC,CAC5D,CAGI,CACL,SAAU,CACR,CACE,MACA,SAAU,gBACV,KAAM,wCACP,CACF,CACF,EAEJ,GAMP,GAAI,GAAqB,EAAkB,OAAQ,CACjD,IAAM,EAAS,EACb,EAA6B,GAA8B,CAAC,CAC7D,CACD,IAAK,IAAM,KAAK,EAAmB,CACjC,IAAM,EAAU,gBAAgB,EAAE,KAAK,KAAK,QAAQ,MAAO,IAAI,CAAC,IAAI,EAAE,KAAK,UACrE,EAAU,kBAAkB,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,UAExD,EAAe,iBACd,EACA,IAAI,EAAiB,EAAS,EAAE,CAAQ,CACxC,CACE,YAAa,EAAE,KAAK,aAAe,eACnC,YAAaA,EAAE,aAAaA,EAAE,OAAO,EAAE,CAAC,CAAC,CAC1C,CACD,UAMS,CACL,SAAU,CACR,CAAE,IAAK,EAAS,SAAU,mBAAoB,KAPjC,KAAK,UACpB,CAAE,KAAM,EAAE,KAAM,OAAQ,EAAE,OAAQ,QAAS,EAAE,QAAS,CACtD,KACA,EACD,CAGiE,CAC/D,CACF,EAEJ,CAUD,IAAK,IAAM,IALL,CACJ,CAAE,IAAK,MAAO,OAAQ,WAAY,CAClC,CAAE,IAAK,QAAS,OAAQ,mBAAoB,CAC5C,CAAE,IAAK,OAAQ,OAAQ,kBAAmB,CAC3C,CACyB,CACxB,IAAM,EAAM,GAAG,IAAU,EAAE,MACrB,EAAM,GAAG,IAAU,EAAE,MAC1B,EAAe,iBACd,EACA,IAAI,EAAiB,EAAK,EAAE,CAAQ,CACpC,CACE,YAAa,GAAG,EAAE,KAAK,aAAe,eAAe,IAAI,EAAE,IAAI,GAC/D,YAAaA,EAAE,aAAaA,EAAE,OAAO,EAAE,CAAC,CAAC,CAC1C,CACD,SAAY,CACV,IAAM,EAAM,MAAM,EAAO,OAAO,EAAE,OAAQ,EAAE,CAC5C,MAAO,CACL,SAAU,CACR,CACE,MACA,SACG,EAAY,WACZ,EAAE,SAAW,WAAa,gBAAkB,EAAE,QACjD,KAAO,EAAY,MAAQ,OAAO,EAAI,CACvC,CACF,CACF,EAEJ,GAOP,IAAK,IAAM,KAAU,EAAQ,MAAM,CACjC,EAAO,eACL,EAAO,KAAK,KACZ,CACE,MAAO,EAAO,KAAK,MACnB,YAAa,EAAO,KAAK,MACzB,WAAY,EAAgB,EAAO,MAAM,CAC1C,CACD,MAAO,EAAW,IAA0C,CAC1D,IAAM,GAAQ,EAAa,IAA0C,CACnE,IAAI,EAAM,EACV,IAAK,GAAM,CAAC,EAAG,KAAM,OAAO,QAAQ,EAAK,CACvC,EAAM,EAAI,QACJ,OAAO,MAAM,EAAE,KAAM,IAAI,CAC7B,mBAAmB,OAAO,EAAE,CAAC,CAC9B,CACH,OAAO,GAoBT,MAAO,CACL,SAAU,CAAC,CAAE,KAAM,YAAa,SAlBpB,MAAM,EAAO,OAAO,EAAO,MAAM,MAAM,EAAK,CAAE,CAC1D,GAAG,EAAa,WAAW,CAC3B,OACD,CAAC,EAIM,IACH,GACC,EAAE,OAAS,OACP,CAAE,KAAM,OAAQ,KAAM,EAAE,KAAM,CAC9B,CACE,KAAM,OACN,KAAM,iBAAiB,EAAE,OAAS,EAAE,IAAI,SAAS,EAAE,MACpD,CACR,CAGiD,GAAK,CAAC,CACxD,YAAa,EAAO,KAAK,YAC1B,EAEJ,CAGH,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-elysia.d.ts","names":[],"sources":["../../src/server/rest-elysia.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAMgB,YAAA,MACT,aACA;EAFS,OAAA,EAGa,OAHD;EACrB,KAAA,EAAA,GAAA;CACA,EAAA,GACgD,UADhD,EAAA,OAAA,CAAA,EAEK,WAFL,CAAA,EAEgB,MAFhB,CAAA,EAAA,EAAA;EACsB,SAAA,EAAA,CAAA,CAAA;EAA0B,KAAA,EAAA,CAAA,CAAA;EAC3C,MAAA,EAAA,CAAA,CAAA;EAAW,OAAA,EAAA,CAAA,CAAA;CAAA,EAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-elysia.js","names":[],"sources":["../../src/server/rest-elysia.ts"],"sourcesContent":["import type { Elysia } from 'elysia';\nimport { createFetchHandler, type RestOptions } from './rest-generic';\nimport type { SpecRegistry } from '../registry';\nimport type { HandlerCtx } from '../types';\n\n/** Mount routes on an Elysia instance */\nexport function elysiaPlugin(\n app: Elysia,\n reg: SpecRegistry,\n ctxFactory: (c: { request: Request; store: any }) => HandlerCtx,\n options?: RestOptions\n) {\n const handler = createFetchHandler(\n reg,\n (req) => ctxFactory({ request: req, store: (app as any).store }),\n options\n );\n\n for (const spec of reg.listSpecs()) {\n const method =\n spec.transport?.rest?.method ??\n (spec.meta.kind === 'query' ? 'GET' : 'POST');\n const path =\n (options?.basePath ?? '') +\n (spec.transport?.rest?.path ??\n `/${spec.meta.name.replace(/\\./g, '/')}/v${spec.meta.version}`);\n app[method.toLowerCase() as 'get' | 'post'](path, ({ request }: any) =>\n handler(request)\n );\n }\n\n if (options?.cors) {\n app.options('*', ({ request }: any) => handler(request));\n }\n\n return app;\n}\n"],"mappings":"uDAMA,SAAgB,EACd,EACA,EACA,EACA,EACA,CACA,IAAM,EAAU,EACd,EACC,GAAQ,EAAW,CAAE,QAAS,EAAK,MAAQ,EAAY,MAAO,CAAC,CAChE,EACD,CAED,IAAK,IAAM,KAAQ,EAAI,WAAW,CAAE,CAClC,IAAM,EACJ,EAAK,WAAW,MAAM,SACrB,EAAK,KAAK,OAAS,QAAU,MAAQ,QAClC,GACH,GAAS,UAAY,KACrB,EAAK,WAAW,MAAM,MACrB,IAAI,EAAK,KAAK,KAAK,QAAQ,MAAO,IAAI,CAAC,IAAI,EAAK,KAAK,WACzD,EAAI,EAAO,aAAa,EAAoB,GAAO,CAAE,aACnD,EAAQ,EAAQ,CACjB,CAOH,OAJI,GAAS,MACX,EAAI,QAAQ,KAAM,CAAE,aAAmB,EAAQ,EAAQ,CAAC,CAGnD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-express.d.ts","names":[],"sources":["../../src/server/rest-express.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAaA;;AAEO,iBAFS,aAAA,CAET,OAAA,EAAA;EACa,MAAA,EAAA,GAAA,GAFO,MAEP;CAAe,EAAA,GAAA,EAD5B,YAC4B,EAAA,UAAA,EAAA,CAAA,GAAA,EAAf,OAAe,EAAA,GAAA,UAAA,EAAA,OAAA,CAAA,EACvB,WADuB,CAAA,EAEhC,MAFgC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-express.js","names":[],"sources":["../../src/server/rest-express.ts"],"sourcesContent":["import type {\n Request as ExpressReq,\n Response as ExpressRes,\n Router,\n} from 'express';\nimport { createFetchHandler, type RestOptions } from './rest-generic';\nimport type { SpecRegistry } from '../registry';\nimport type { HandlerCtx } from '../types';\n\n/**\n * Build an Express Router that proxies to the Fetch-style handler.\n * You can mount it at any base path; pass the same basePath in options.\n */\nexport function expressRouter(\n express: { Router: () => Router },\n reg: SpecRegistry,\n ctxFactory: (req: ExpressReq) => HandlerCtx,\n options?: RestOptions\n): Router {\n const router = express.Router();\n const fetchHandler = createFetchHandler(\n reg,\n (_r) => {\n // Convert Fetch Request headers -> Express req is provided below\n // We pass the Express req directly via closure\n throw new Error('ctxFactory must be called from route'); // placeholder\n },\n options\n );\n\n // For each spec, create a concrete route so Express can match quickly\n for (const spec of reg.listSpecs()) {\n const method =\n spec.transport?.rest?.method ??\n (spec.meta.kind === 'query' ? 'GET' : 'POST');\n const path =\n (options?.basePath ?? '') +\n (spec.transport?.rest?.path ??\n `/${spec.meta.name.replace(/\\./g, '/')}/v${spec.meta.version}`);\n\n router[method.toLowerCase() as 'get' | 'post'](\n path,\n async (req: ExpressReq, res: ExpressRes) => {\n const url = new URL(\n `${req.protocol}://${req.get('host')}${req.originalUrl}`\n );\n const request = new Request(url.toString(), {\n method,\n headers: Object.fromEntries(\n Object.entries(req.headers).map(([k, v]) => [k, String(v)])\n ),\n body: method === 'POST' ? JSON.stringify(req.body ?? {}) : undefined,\n });\n\n const handler = createFetchHandler(reg, () => ctxFactory(req), options);\n const response = await handler(request);\n\n res.status(response.status);\n response.headers.forEach((v, k) => res.setHeader(k, v));\n const text = await response.text();\n res.send(text);\n }\n );\n }\n\n // Generic OPTIONS for CORS (if enabled)\n if (options?.cors) {\n router.options('*', (_req, res) => {\n const h = new Headers();\n const resp = new Response(null, { status: 204 });\n resp.headers.forEach((v, k) => h.set(k, v));\n res.status(204).send();\n });\n }\n\n return router;\n}\n"],"mappings":"uDAaA,SAAgB,EACd,EACA,EACA,EACA,EACQ,CACR,IAAM,EAAS,EAAQ,QAAQ,CACV,EACnB,EACC,GAAO,CAGN,MAAU,MAAM,uCAAuC,EAEzD,EACD,CAGD,IAAK,IAAM,KAAQ,EAAI,WAAW,CAAE,CAClC,IAAM,EACJ,EAAK,WAAW,MAAM,SACrB,EAAK,KAAK,OAAS,QAAU,MAAQ,QAClC,GACH,GAAS,UAAY,KACrB,EAAK,WAAW,MAAM,MACrB,IAAI,EAAK,KAAK,KAAK,QAAQ,MAAO,IAAI,CAAC,IAAI,EAAK,KAAK,WAEzD,EAAO,EAAO,aAAa,EACzB,EACA,MAAO,EAAiB,IAAoB,CAC1C,IAAM,EAAM,IAAI,IACd,GAAG,EAAI,SAAS,KAAK,EAAI,IAAI,OAAO,GAAG,EAAI,cAC5C,CACK,EAAU,IAAI,QAAQ,EAAI,UAAU,CAAE,CAC1C,SACA,QAAS,OAAO,YACd,OAAO,QAAQ,EAAI,QAAQ,CAAC,KAAK,CAAC,EAAG,KAAO,CAAC,EAAG,OAAO,EAAE,CAAC,CAAC,CAC5D,CACD,KAAM,IAAW,OAAS,KAAK,UAAU,EAAI,MAAQ,EAAE,CAAC,CAAG,IAAA,GAC5D,CAAC,CAGI,EAAW,MADD,EAAmB,MAAW,EAAW,EAAI,CAAE,EAAQ,CACxC,EAAQ,CAEvC,EAAI,OAAO,EAAS,OAAO,CAC3B,EAAS,QAAQ,SAAS,EAAG,IAAM,EAAI,UAAU,EAAG,EAAE,CAAC,CACvD,IAAM,EAAO,MAAM,EAAS,MAAM,CAClC,EAAI,KAAK,EAAK,EAEjB,CAaH,OATI,GAAS,MACX,EAAO,QAAQ,KAAM,EAAM,IAAQ,CACjC,IAAM,EAAI,IAAI,QACD,IAAI,SAAS,KAAM,CAAE,OAAQ,IAAK,CAAC,CAC3C,QAAQ,SAAS,EAAG,IAAM,EAAE,IAAI,EAAG,EAAE,CAAC,CAC3C,EAAI,OAAO,IAAI,CAAC,MAAM,EACtB,CAGG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-generic.d.ts","names":[],"sources":["../../src/server/rest-generic.ts"],"sourcesContent":[],"mappings":";;;;UAIiB,WAAA;;EAAA,QAAA,CAAA,EAAA,MAAW;EAsDZ;EACT,IAAA,CAAA,EAAA,OAAA,GAAA;IACa,MAAA,CAAA,EAAA,MAAA,GAAA,GAAA;IAAY,OAAA,CAAA,EAAA,MAAA,EAAA;IACpB,OAAA,CAAA,EAAA,MAAA,EAAA;IAiDwB,WAAA,CAAA,EAAA,OAAA;IAAkB,MAAA,CAAA,EAAA,MAAA;EAAR,CAAA;EAAO;;;;;;;;;;;;;;iBApDrC,kBAAA,MACT,gCACa,YAAY,sBACpB,oBAiDwB,YAAU,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-generic.js","names":["h: Record<string, string>","opts: Required<Omit<RestOptions, 'onError'>> &\n Pick<RestOptions, 'onError'>","routes: Route[]","base: HeadersInit","headers: HeadersInit","input: any","obj: Record<string, any>","err: any","headers"],"sources":["../../src/server/rest-generic.ts"],"sourcesContent":["import { defaultRestPath } from '../jsonschema';\nimport type { SpecRegistry } from '../registry';\nimport type { HandlerCtx } from '../types';\n\nexport interface RestOptions {\n /** Prefix all routes, e.g. \"/api\" */\n basePath?: string;\n /** If true, handle OPTIONS and set CORS headers */\n cors?:\n | boolean\n | {\n origin?: string | '*';\n methods?: string[];\n headers?: string[];\n credentials?: boolean;\n maxAge?: number;\n };\n /** JSON spacing in responses (dev only ideally) */\n prettyJson?: number | false;\n /** Map thrown errors to {status, body} */\n onError?: (err: unknown) => { status: number; body: any };\n}\n\n/** Minimal WHATWG Response polyfill util for Node < 18 (if needed) */\n// export const toResponse = (status: number, data: any, headers?: HeadersInit) =>\n// new Response(JSON.stringify(data), { status, headers: { \"content-type\": \"application/json; charset=utf-8\", ...(headers || {}) } });\n\nfunction corsHeaders(opt: NonNullable<RestOptions['cors']>) {\n const h: Record<string, string> = {};\n const origin = typeof opt === 'object' ? (opt.origin ?? '*') : '*';\n h['access-control-allow-origin'] = origin as string;\n h['vary'] = 'Origin';\n if (typeof opt === 'object') {\n if (opt.methods) h['access-control-allow-methods'] = opt.methods.join(', ');\n if (opt.headers) h['access-control-allow-headers'] = opt.headers.join(', ');\n if (opt.credentials) h['access-control-allow-credentials'] = 'true';\n if (typeof opt.maxAge === 'number')\n h['access-control-max-age'] = String(opt.maxAge);\n } else {\n h['access-control-allow-methods'] = 'GET,POST,OPTIONS';\n h['access-control-allow-headers'] =\n 'content-type,x-idempotency-key,x-trace-id';\n }\n return h;\n}\n\nfunction joinPath(a: string | undefined, b: string) {\n const left = (a ?? '').replace(/\\/+$/g, '');\n const right = b.replace(/^\\/+/g, '');\n return `${left}/${right}`.replace(/\\/{2,}/g, '/');\n}\n\n/**\n * Build a single Fetch-style handler: (req) => Response\n * - Discovers routes from SpecRegistry\n * - Validates with zod via registry.execute()\n * - Handles CORS (optional)\n */\nexport function createFetchHandler(\n reg: SpecRegistry,\n ctxFactory: (req: Request) => HandlerCtx,\n options?: RestOptions\n) {\n const opts: Required<Omit<RestOptions, 'onError'>> &\n Pick<RestOptions, 'onError'> = {\n basePath: options?.basePath ?? '',\n cors: options?.cors ?? false,\n prettyJson: options?.prettyJson ?? false,\n onError: options?.onError,\n };\n\n interface Route {\n method: 'GET' | 'POST';\n path: string; // absolute path including basePath\n name: string;\n version: number;\n }\n\n const routes: Route[] = reg.listSpecs().map((spec) => ({\n method: (spec.transport?.rest?.method ??\n (spec.meta.kind === 'query' ? 'GET' : 'POST')) as 'GET' | 'POST',\n path: joinPath(\n opts.basePath,\n spec.transport?.rest?.path ??\n defaultRestPath(spec.meta.name, spec.meta.version)\n ),\n name: spec.meta.name,\n version: spec.meta.version,\n }));\n\n const routeTable = new Map<string, Route>(); // KEY: METHOD + \" \" + PATH\n for (const r of routes) routeTable.set(`${r.method} ${r.path}`, r);\n\n const allowHeader = Array.from(new Set(routes.map((r) => r.method))).join(\n ', '\n );\n\n const makeJson = (status: number, data: any, extraHeaders?: HeadersInit) => {\n const body = opts.prettyJson\n ? JSON.stringify(data, null, opts.prettyJson)\n : JSON.stringify(data);\n const base: HeadersInit = {\n 'content-type': 'application/json; charset=utf-8',\n };\n return new Response(body, {\n status,\n headers: extraHeaders ? { ...base, ...extraHeaders } : base,\n });\n };\n\n return async function handle(req: Request): Promise<Response> {\n const url = new URL(req.url);\n const key = `${req.method.toUpperCase()} ${url.pathname}`;\n\n // CORS preflight\n if (opts.cors && req.method.toUpperCase() === 'OPTIONS') {\n const h = corsHeaders(opts.cors === true ? {} : opts.cors);\n return new Response(null, {\n status: 204,\n headers: { ...h, 'content-length': '0' },\n });\n }\n\n const route = routeTable.get(key);\n if (!route) {\n const headers: HeadersInit = {};\n if (opts.cors)\n Object.assign(\n headers,\n corsHeaders(opts.cors === true ? {} : opts.cors)\n );\n return makeJson(404, { error: 'NotFound', path: url.pathname }, headers);\n }\n\n try {\n let input: any = {};\n if (route.method === 'GET') {\n // Support either flattened query (?a=1&b=x) or ?input=<json>\n if (url.searchParams.has('input')) {\n const raw = url.searchParams.get('input')!;\n input = raw ? JSON.parse(raw) : {};\n } else {\n const obj: Record<string, any> = {};\n for (const [k, v] of url.searchParams.entries()) obj[k] = v;\n input = obj;\n }\n } else {\n const contentType = req.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n input = await req.json();\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n const form = (await req.formData()) as never as FormData;\n input = Object.fromEntries(form.entries());\n } else if (!contentType) {\n input = {};\n } else {\n return makeJson(415, { error: 'UnsupportedMediaType', contentType });\n }\n }\n\n const ctx = ctxFactory(req);\n const result = await reg.execute(route.name, route.version, input, ctx);\n\n const headers: HeadersInit = {};\n if (opts.cors)\n Object.assign(\n headers,\n corsHeaders(opts.cors === true ? {} : opts.cors)\n );\n return makeJson(200, result, headers);\n } catch (err: any) {\n if (opts.onError) {\n const mapped = opts.onError(err);\n const headers: HeadersInit = {};\n if (opts.cors)\n Object.assign(\n headers,\n corsHeaders(opts.cors === true ? {} : opts.cors)\n );\n return makeJson(mapped.status, mapped.body, headers);\n }\n const headers: HeadersInit = {};\n if (opts.cors)\n Object.assign(\n headers,\n corsHeaders(opts.cors === true ? {} : opts.cors)\n );\n // Basic zod hint\n if (err?.issues)\n return makeJson(\n 400,\n { error: 'ValidationError', issues: err.issues },\n headers\n );\n if (\n typeof err?.message === 'string' &&\n err.message.startsWith('PolicyDenied')\n ) {\n return makeJson(403, { error: 'PolicyDenied' }, headers);\n }\n return makeJson(500, { error: 'InternalError' }, headers);\n }\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-next-app.d.ts","names":[],"sources":["../../src/server/rest-next-app.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA8BA;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,kBAAA,MACT,gCACa,YAAY,sBACpB,oBAGgC,YAAO,QAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-next-app.js","names":[],"sources":["../../src/server/rest-next-app.ts"],"sourcesContent":["import { createFetchHandler, type RestOptions } from './rest-generic';\nimport type { SpecRegistry } from '../registry';\nimport type { HandlerCtx } from '../types';\n\n/**\n * Creates a Next.js App Router route handler for ContractSpec operations.\n *\n * This function returns a handler suitable for `export const { GET, POST }` in a `route.ts` file.\n * It handles:\n * - Path parsing to determine the operation name and version.\n * - Body parsing (JSON).\n * - Context creation via `ctxFactory`.\n * - Execution via `SpecRegistry`.\n * - Response formatting (JSON success/error).\n *\n * @param reg - The SpecRegistry containing the operations.\n * @param ctxFactory - A factory function to build the `HandlerCtx` (e.g., auth, tenant) from the request.\n * @param options - Optional configuration for the REST handler.\n * @returns A function `(req: Request) => Promise<Response>`.\n *\n * @example\n * ```ts\n * // app/api/[...route]/route.ts\n * import { makeNextAppHandler } from '@lssm/lib.contracts/server/rest-next-app';\n * import { registry } from '@/lib/registry';\n *\n * const handler = makeNextAppHandler(registry, (req) => ({ actor: 'anonymous' }));\n * export { handler as GET, handler as POST };\n * ```\n */\nexport function makeNextAppHandler(\n reg: SpecRegistry,\n ctxFactory: (req: Request) => HandlerCtx,\n options?: RestOptions\n) {\n const handler = createFetchHandler(reg, ctxFactory, options);\n return async function requestHandler(req: Request) {\n return handler(req);\n };\n}\n"],"mappings":"uDA8BA,SAAgB,EACd,EACA,EACA,EACA,CACA,IAAM,EAAU,EAAmB,EAAK,EAAY,EAAQ,CAC5D,OAAO,eAA8B,EAAc,CACjD,OAAO,EAAQ,EAAI"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-next-mcp.d.ts","names":[],"sources":["../../src/server/rest-next-mcp.ts"],"sourcesContent":[],"mappings":";;;;iBAYgB,6BAAA,MACT,gCACa;;EAFJ,IAAA,EAAA,CAAA,OAAA,SAAA,EAAA,UAA6B,SAAA,CAAA;EACtC,MAAA,EAAA,CAAA,OAAA,SAAA,EAAA,UAAA,SAAA,CAAA;CACa"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-next-mcp.js","names":[],"sources":["../../src/server/rest-next-mcp.ts"],"sourcesContent":["import type { SpecRegistry } from '../registry';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { ContractSpec } from '../spec';\nimport type { HandlerCtx } from '../types';\nimport { createMcpHandler } from 'mcp-handler';\nimport type {\n ReadResourceTemplateCallback,\n ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { defaultMcpTool, jsonSchemaForSpec } from '../jsonschema';\n\nexport function makeNextMcpServerFromRegistry(\n reg: SpecRegistry,\n ctxFactory: () => HandlerCtx\n) {\n const handler = createMcpHandler(\n (server) => {\n for (const spec of reg.listSpecs()) {\n const { input, output, meta } = jsonSchemaForSpec(\n spec as unknown as ContractSpec<AnySchemaModel, AnySchemaModel>\n );\n\n if (meta.kind === 'query') {\n const resourceName =\n spec.transport?.mcp?.toolName ??\n defaultMcpTool(spec.meta.name, spec.meta.version);\n\n (server as any).registerResource(\n resourceName,\n new ResourceTemplate('users://{userId}/profile', {\n list: undefined,\n }),\n {\n // name: resourceName,\n description: spec.meta.description,\n inputSchema: input,\n },\n (async (uri: URL, args, _req) => {\n const result = await reg.execute(\n spec.meta.name,\n spec.meta.version,\n args ?? {},\n ctxFactory()\n );\n // return { content: [{ type: 'json', json: result }] };\n return { contents: [{ uri: uri.href, text: String(result) }] };\n }) as ReadResourceTemplateCallback\n );\n } else if (meta.kind === 'command') {\n const toolName =\n spec.transport?.mcp?.toolName ??\n defaultMcpTool(spec.meta.name, spec.meta.version);\n\n server.registerTool(\n toolName,\n {\n // name: toolName,\n description: spec.meta.description,\n inputSchema: input as any,\n },\n (async (args: any, _req: any) => {\n const result = await reg.execute(\n spec.meta.name,\n spec.meta.version,\n args ?? {},\n ctxFactory()\n );\n // return { content: [{ type: 'json', json: result }] };\n return { content: [{ type: 'text', text: String(result) }] };\n }) as ToolCallback\n );\n } else {\n throw new Error(`Unsupported kind: ${meta.kind}`);\n }\n }\n },\n {},\n { basePath: '/api' }\n );\n\n return { GET: handler, POST: handler, DELETE: handler };\n}\n"],"mappings":"mMAYA,SAAgB,EACd,EACA,EACA,CACA,IAAM,EAAU,EACb,GAAW,CACV,IAAK,IAAM,KAAQ,EAAI,WAAW,CAAE,CAClC,GAAM,CAAE,QAAO,SAAQ,QAAS,EAC9B,EACD,CAED,GAAI,EAAK,OAAS,QAAS,CACzB,IAAM,EACJ,EAAK,WAAW,KAAK,UACrB,EAAe,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,CAElD,EAAe,iBACd,EACA,IAAI,EAAiB,2BAA4B,CAC/C,KAAM,IAAA,GACP,CAAC,CACF,CAEE,YAAa,EAAK,KAAK,YACvB,YAAa,EACd,EACA,MAAO,EAAU,EAAM,IAAS,CAC/B,IAAM,EAAS,MAAM,EAAI,QACvB,EAAK,KAAK,KACV,EAAK,KAAK,QACV,GAAQ,EAAE,CACV,GAAY,CACb,CAED,MAAO,CAAE,SAAU,CAAC,CAAE,IAAK,EAAI,KAAM,KAAM,OAAO,EAAO,CAAE,CAAC,CAAE,GAEjE,SACQ,EAAK,OAAS,UAAW,CAClC,IAAM,EACJ,EAAK,WAAW,KAAK,UACrB,EAAe,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,CAEnD,EAAO,aACL,EACA,CAEE,YAAa,EAAK,KAAK,YACvB,YAAa,EACd,EACA,MAAO,EAAW,IAAc,CAC/B,IAAM,EAAS,MAAM,EAAI,QACvB,EAAK,KAAK,KACV,EAAK,KAAK,QACV,GAAQ,EAAE,CACV,GAAY,CACb,CAED,MAAO,CAAE,QAAS,CAAC,CAAE,KAAM,OAAQ,KAAM,OAAO,EAAO,CAAE,CAAC,CAAE,GAE/D,MAED,MAAU,MAAM,qBAAqB,EAAK,OAAO,GAIvD,EAAE,CACF,CAAE,SAAU,OAAQ,CACrB,CAED,MAAO,CAAE,IAAK,EAAS,KAAM,EAAS,OAAQ,EAAS"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-next-pages.d.ts","names":[],"sources":["../../src/server/rest-next-pages.ts"],"sourcesContent":[],"mappings":";;;;;;iBAKgB,oBAAA,MACT,gCACa,mBAAmB,sBAC3B,oBAUyB,qBAAqB,oBAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-next-pages.js","names":[],"sources":["../../src/server/rest-next-pages.ts"],"sourcesContent":["import type { NextApiRequest, NextApiResponse } from 'next';\nimport { createFetchHandler, type RestOptions } from './rest-generic';\nimport type { SpecRegistry } from '../registry';\nimport type { HandlerCtx } from '../types';\n\nexport function makeNextPagesHandler(\n reg: SpecRegistry,\n ctxFactory: (req: NextApiRequest) => HandlerCtx,\n options?: RestOptions\n) {\n const fetchHandler = createFetchHandler(\n reg,\n (_req: Request) => {\n throw new Error('Use per-request wrapper'); // we wrap below\n },\n options\n );\n\n return async function handler(req: NextApiRequest, res: NextApiResponse) {\n const url = `${req.headers['x-forwarded-proto'] ?? 'http'}://${req.headers.host}${req.url}`;\n const method = req.method?.toUpperCase() || 'GET';\n\n const request = new Request(url, {\n method,\n headers: Object.fromEntries(\n Object.entries(req.headers).map(([k, v]) => [k, String(v)])\n ),\n body: method === 'POST' ? JSON.stringify(req.body ?? {}) : undefined,\n });\n\n const perReqHandler = createFetchHandler(\n reg,\n () => ctxFactory(req),\n options\n );\n const response = await perReqHandler(request);\n\n res.status(response.status);\n response.headers.forEach((v, k) => res.setHeader(k, v));\n const text = await response.text();\n res.send(text);\n };\n}\n"],"mappings":"uDAKA,SAAgB,EACd,EACA,EACA,EACA,CASA,OARqB,EACnB,EACC,GAAkB,CACjB,MAAU,MAAM,0BAA0B,EAE5C,EACD,CAEM,eAAuB,EAAqB,EAAsB,CACvE,IAAM,EAAM,GAAG,EAAI,QAAQ,sBAAwB,OAAO,KAAK,EAAI,QAAQ,OAAO,EAAI,MAChF,EAAS,EAAI,QAAQ,aAAa,EAAI,MAEtC,EAAU,IAAI,QAAQ,EAAK,CAC/B,SACA,QAAS,OAAO,YACd,OAAO,QAAQ,EAAI,QAAQ,CAAC,KAAK,CAAC,EAAG,KAAO,CAAC,EAAG,OAAO,EAAE,CAAC,CAAC,CAC5D,CACD,KAAM,IAAW,OAAS,KAAK,UAAU,EAAI,MAAQ,EAAE,CAAC,CAAG,IAAA,GAC5D,CAAC,CAOI,EAAW,MALK,EACpB,MACM,EAAW,EAAI,CACrB,EACD,CACoC,EAAQ,CAE7C,EAAI,OAAO,EAAS,OAAO,CAC3B,EAAS,QAAQ,SAAS,EAAG,IAAM,EAAI,UAAU,EAAG,EAAE,CAAC,CACvD,IAAM,EAAO,MAAM,EAAS,MAAM,CAClC,EAAI,KAAK,EAAK"}
|