@lssm/lib.contracts 0.0.0-canary-20251120170226
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 +98 -0
- package/dist/app-config/branding.d.ts +56 -0
- package/dist/app-config/branding.d.ts.map +1 -0
- package/dist/app-config/branding.js +0 -0
- package/dist/app-config/contracts.d.ts +245 -0
- package/dist/app-config/contracts.d.ts.map +1 -0
- package/dist/app-config/contracts.js +2 -0
- package/dist/app-config/contracts.js.map +1 -0
- package/dist/app-config/events.d.ts +123 -0
- package/dist/app-config/events.d.ts.map +1 -0
- package/dist/app-config/events.js +2 -0
- package/dist/app-config/events.js.map +1 -0
- package/dist/app-config/index.d.ts +8 -0
- package/dist/app-config/index.js +1 -0
- package/dist/app-config/lifecycle-contracts.d.ts +383 -0
- package/dist/app-config/lifecycle-contracts.d.ts.map +1 -0
- package/dist/app-config/lifecycle-contracts.js +2 -0
- package/dist/app-config/lifecycle-contracts.js.map +1 -0
- package/dist/app-config/lifecycle.d.ts +28 -0
- package/dist/app-config/lifecycle.d.ts.map +1 -0
- package/dist/app-config/lifecycle.js +0 -0
- package/dist/app-config/runtime.d.ts +115 -0
- package/dist/app-config/runtime.d.ts.map +1 -0
- package/dist/app-config/runtime.js +2 -0
- package/dist/app-config/runtime.js.map +1 -0
- package/dist/app-config/spec.d.ts +176 -0
- package/dist/app-config/spec.d.ts.map +1 -0
- package/dist/app-config/spec.js +2 -0
- package/dist/app-config/spec.js.map +1 -0
- package/dist/app-config/validation.d.ts +48 -0
- package/dist/app-config/validation.d.ts.map +1 -0
- package/dist/app-config/validation.js +2 -0
- package/dist/app-config/validation.js.map +1 -0
- package/dist/capabilities/openbanking.d.ts +10 -0
- package/dist/capabilities/openbanking.d.ts.map +1 -0
- package/dist/capabilities/openbanking.js +2 -0
- package/dist/capabilities/openbanking.js.map +1 -0
- package/dist/capabilities.d.ts +45 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +2 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.js +1 -0
- package/dist/client/react/drivers/rn-reusables.d.ts +23 -0
- package/dist/client/react/drivers/rn-reusables.d.ts.map +1 -0
- package/dist/client/react/drivers/rn-reusables.js +2 -0
- package/dist/client/react/drivers/rn-reusables.js.map +1 -0
- package/dist/client/react/drivers/shadcn.d.ts +13 -0
- package/dist/client/react/drivers/shadcn.d.ts.map +1 -0
- package/dist/client/react/drivers/shadcn.js +2 -0
- package/dist/client/react/drivers/shadcn.js.map +1 -0
- package/dist/client/react/feature-render.d.ts +21 -0
- package/dist/client/react/feature-render.d.ts.map +1 -0
- package/dist/client/react/feature-render.js +2 -0
- package/dist/client/react/feature-render.js.map +1 -0
- package/dist/client/react/form-render.d.ts +92 -0
- package/dist/client/react/form-render.d.ts.map +1 -0
- package/dist/client/react/form-render.js +2 -0
- package/dist/client/react/form-render.js.map +1 -0
- package/dist/client/react/index.d.ts +5 -0
- package/dist/client/react/index.js +1 -0
- package/dist/contracts-adapter-hydration.d.ts +16 -0
- package/dist/contracts-adapter-hydration.d.ts.map +1 -0
- package/dist/contracts-adapter-hydration.js +2 -0
- package/dist/contracts-adapter-hydration.js.map +1 -0
- package/dist/contracts-adapter-input.d.ts +11 -0
- package/dist/contracts-adapter-input.d.ts.map +1 -0
- package/dist/contracts-adapter-input.js +2 -0
- package/dist/contracts-adapter-input.js.map +1 -0
- package/dist/data-views/query-generator.d.ts +40 -0
- package/dist/data-views/query-generator.d.ts.map +1 -0
- package/dist/data-views/query-generator.js +2 -0
- package/dist/data-views/query-generator.js.map +1 -0
- package/dist/data-views/runtime.d.ts +27 -0
- package/dist/data-views/runtime.d.ts.map +1 -0
- package/dist/data-views/runtime.js +2 -0
- package/dist/data-views/runtime.js.map +1 -0
- package/dist/data-views.d.ts +132 -0
- package/dist/data-views.d.ts.map +1 -0
- package/dist/data-views.js +2 -0
- package/dist/data-views.js.map +1 -0
- package/dist/events.d.ts +45 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +2 -0
- package/dist/events.js.map +1 -0
- package/dist/experiments/evaluator.d.ts +38 -0
- package/dist/experiments/evaluator.d.ts.map +1 -0
- package/dist/experiments/evaluator.js +2 -0
- package/dist/experiments/evaluator.js.map +1 -0
- package/dist/experiments/spec.d.ts +90 -0
- package/dist/experiments/spec.d.ts.map +1 -0
- package/dist/experiments/spec.js +2 -0
- package/dist/experiments/spec.js.map +1 -0
- package/dist/features.d.ts +88 -0
- package/dist/features.d.ts.map +1 -0
- package/dist/features.js +2 -0
- package/dist/features.js.map +1 -0
- package/dist/forms.d.ts +259 -0
- package/dist/forms.d.ts.map +1 -0
- package/dist/forms.js +2 -0
- package/dist/forms.js.map +1 -0
- package/dist/graphql-federation/dist/index.js +2 -0
- package/dist/graphql-federation/dist/index.js.map +1 -0
- package/dist/index.d.ts +129 -0
- package/dist/index.js +1 -0
- package/dist/install.d.ts +77 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +2 -0
- package/dist/install.js.map +1 -0
- package/dist/integrations/binding.d.ts +18 -0
- package/dist/integrations/binding.d.ts.map +1 -0
- package/dist/integrations/binding.js +0 -0
- package/dist/integrations/connection.d.ts +52 -0
- package/dist/integrations/connection.d.ts.map +1 -0
- package/dist/integrations/connection.js +0 -0
- package/dist/integrations/contracts.d.ts +436 -0
- package/dist/integrations/contracts.d.ts.map +1 -0
- package/dist/integrations/contracts.js +2 -0
- package/dist/integrations/contracts.js.map +1 -0
- package/dist/integrations/health.d.ts +22 -0
- package/dist/integrations/health.d.ts.map +1 -0
- package/dist/integrations/health.js +2 -0
- package/dist/integrations/health.js.map +1 -0
- package/dist/integrations/index.d.ts +53 -0
- package/dist/integrations/index.js +1 -0
- package/dist/integrations/openbanking/contracts/accounts.d.ts +288 -0
- package/dist/integrations/openbanking/contracts/accounts.d.ts.map +1 -0
- package/dist/integrations/openbanking/contracts/accounts.js +2 -0
- package/dist/integrations/openbanking/contracts/accounts.js.map +1 -0
- package/dist/integrations/openbanking/contracts/balances.d.ts +164 -0
- package/dist/integrations/openbanking/contracts/balances.d.ts.map +1 -0
- package/dist/integrations/openbanking/contracts/balances.js +2 -0
- package/dist/integrations/openbanking/contracts/balances.js.map +1 -0
- package/dist/integrations/openbanking/contracts/index.d.ts +10 -0
- package/dist/integrations/openbanking/contracts/index.d.ts.map +1 -0
- package/dist/integrations/openbanking/contracts/index.js +2 -0
- package/dist/integrations/openbanking/contracts/index.js.map +1 -0
- package/dist/integrations/openbanking/contracts/transactions.d.ts +212 -0
- package/dist/integrations/openbanking/contracts/transactions.d.ts.map +1 -0
- package/dist/integrations/openbanking/contracts/transactions.js +2 -0
- package/dist/integrations/openbanking/contracts/transactions.js.map +1 -0
- package/dist/integrations/openbanking/guards.d.ts +13 -0
- package/dist/integrations/openbanking/guards.d.ts.map +1 -0
- package/dist/integrations/openbanking/guards.js +2 -0
- package/dist/integrations/openbanking/guards.js.map +1 -0
- package/dist/integrations/openbanking/models.d.ts +229 -0
- package/dist/integrations/openbanking/models.d.ts.map +1 -0
- package/dist/integrations/openbanking/models.js +2 -0
- package/dist/integrations/openbanking/models.js.map +1 -0
- package/dist/integrations/openbanking/telemetry.d.ts +16 -0
- package/dist/integrations/openbanking/telemetry.d.ts.map +1 -0
- package/dist/integrations/openbanking/telemetry.js +2 -0
- package/dist/integrations/openbanking/telemetry.js.map +1 -0
- package/dist/integrations/providers/calendar.d.ts +79 -0
- package/dist/integrations/providers/calendar.d.ts.map +1 -0
- package/dist/integrations/providers/calendar.js +0 -0
- package/dist/integrations/providers/elevenlabs.d.ts +8 -0
- package/dist/integrations/providers/elevenlabs.d.ts.map +1 -0
- package/dist/integrations/providers/elevenlabs.js +2 -0
- package/dist/integrations/providers/elevenlabs.js.map +1 -0
- package/dist/integrations/providers/email.d.ts +87 -0
- package/dist/integrations/providers/email.d.ts.map +1 -0
- package/dist/integrations/providers/email.js +0 -0
- package/dist/integrations/providers/embedding.d.ts +25 -0
- package/dist/integrations/providers/embedding.d.ts.map +1 -0
- package/dist/integrations/providers/embedding.js +0 -0
- package/dist/integrations/providers/gcs-storage.d.ts +8 -0
- package/dist/integrations/providers/gcs-storage.d.ts.map +1 -0
- package/dist/integrations/providers/gcs-storage.js +2 -0
- package/dist/integrations/providers/gcs-storage.js.map +1 -0
- package/dist/integrations/providers/gmail.d.ts +8 -0
- package/dist/integrations/providers/gmail.d.ts.map +1 -0
- package/dist/integrations/providers/gmail.js +2 -0
- package/dist/integrations/providers/gmail.js.map +1 -0
- package/dist/integrations/providers/google-calendar.d.ts +8 -0
- package/dist/integrations/providers/google-calendar.d.ts.map +1 -0
- package/dist/integrations/providers/google-calendar.js +2 -0
- package/dist/integrations/providers/google-calendar.js.map +1 -0
- package/dist/integrations/providers/impls/elevenlabs-voice.d.ts +21 -0
- package/dist/integrations/providers/impls/elevenlabs-voice.d.ts.map +1 -0
- package/dist/integrations/providers/impls/elevenlabs-voice.js +2 -0
- package/dist/integrations/providers/impls/elevenlabs-voice.js.map +1 -0
- package/dist/integrations/providers/impls/gcs-storage.d.ts +25 -0
- package/dist/integrations/providers/impls/gcs-storage.d.ts.map +1 -0
- package/dist/integrations/providers/impls/gcs-storage.js +2 -0
- package/dist/integrations/providers/impls/gcs-storage.js.map +1 -0
- package/dist/integrations/providers/impls/gmail-inbound.d.ts +27 -0
- package/dist/integrations/providers/impls/gmail-inbound.d.ts.map +1 -0
- package/dist/integrations/providers/impls/gmail-inbound.js +2 -0
- package/dist/integrations/providers/impls/gmail-inbound.js.map +1 -0
- package/dist/integrations/providers/impls/gmail-outbound.d.ts +19 -0
- package/dist/integrations/providers/impls/gmail-outbound.d.ts.map +1 -0
- package/dist/integrations/providers/impls/gmail-outbound.js +7 -0
- package/dist/integrations/providers/impls/gmail-outbound.js.map +1 -0
- package/dist/integrations/providers/impls/google-calendar.d.ts +24 -0
- package/dist/integrations/providers/impls/google-calendar.d.ts.map +1 -0
- package/dist/integrations/providers/impls/google-calendar.js +2 -0
- package/dist/integrations/providers/impls/google-calendar.js.map +1 -0
- package/dist/integrations/providers/impls/index.d.ts +15 -0
- package/dist/integrations/providers/impls/index.js +1 -0
- package/dist/integrations/providers/impls/mistral-embedding.d.ts +24 -0
- package/dist/integrations/providers/impls/mistral-embedding.d.ts.map +1 -0
- package/dist/integrations/providers/impls/mistral-embedding.js +2 -0
- package/dist/integrations/providers/impls/mistral-embedding.js.map +1 -0
- package/dist/integrations/providers/impls/mistral-llm.d.ts +32 -0
- package/dist/integrations/providers/impls/mistral-llm.d.ts.map +1 -0
- package/dist/integrations/providers/impls/mistral-llm.js +2 -0
- package/dist/integrations/providers/impls/mistral-llm.js.map +1 -0
- package/dist/integrations/providers/impls/postmark-email.d.ts +20 -0
- package/dist/integrations/providers/impls/postmark-email.d.ts.map +1 -0
- package/dist/integrations/providers/impls/postmark-email.js +2 -0
- package/dist/integrations/providers/impls/postmark-email.js.map +1 -0
- package/dist/integrations/providers/impls/powens-client.d.ts +125 -0
- package/dist/integrations/providers/impls/powens-client.d.ts.map +1 -0
- package/dist/integrations/providers/impls/powens-client.js +2 -0
- package/dist/integrations/providers/impls/powens-client.js.map +1 -0
- package/dist/integrations/providers/impls/powens-openbanking.d.ts +28 -0
- package/dist/integrations/providers/impls/powens-openbanking.d.ts.map +1 -0
- package/dist/integrations/providers/impls/powens-openbanking.js +2 -0
- package/dist/integrations/providers/impls/powens-openbanking.js.map +1 -0
- package/dist/integrations/providers/impls/provider-factory.d.ts +27 -0
- package/dist/integrations/providers/impls/provider-factory.d.ts.map +1 -0
- package/dist/integrations/providers/impls/provider-factory.js +2 -0
- package/dist/integrations/providers/impls/provider-factory.js.map +1 -0
- package/dist/integrations/providers/impls/qdrant-vector.d.ts +25 -0
- package/dist/integrations/providers/impls/qdrant-vector.d.ts.map +1 -0
- package/dist/integrations/providers/impls/qdrant-vector.js +2 -0
- package/dist/integrations/providers/impls/qdrant-vector.js.map +1 -0
- package/dist/integrations/providers/impls/stripe-payments.d.ts +29 -0
- package/dist/integrations/providers/impls/stripe-payments.d.ts.map +1 -0
- package/dist/integrations/providers/impls/stripe-payments.js +2 -0
- package/dist/integrations/providers/impls/stripe-payments.js.map +1 -0
- package/dist/integrations/providers/impls/twilio-sms.d.ts +21 -0
- package/dist/integrations/providers/impls/twilio-sms.d.ts.map +1 -0
- package/dist/integrations/providers/impls/twilio-sms.js +2 -0
- package/dist/integrations/providers/impls/twilio-sms.js.map +1 -0
- package/dist/integrations/providers/index.d.ts +36 -0
- package/dist/integrations/providers/index.js +1 -0
- package/dist/integrations/providers/llm.d.ts +83 -0
- package/dist/integrations/providers/llm.d.ts.map +1 -0
- package/dist/integrations/providers/llm.js +0 -0
- package/dist/integrations/providers/mistral.d.ts +8 -0
- package/dist/integrations/providers/mistral.d.ts.map +1 -0
- package/dist/integrations/providers/mistral.js +2 -0
- package/dist/integrations/providers/mistral.js.map +1 -0
- package/dist/integrations/providers/openbanking.d.ts +129 -0
- package/dist/integrations/providers/openbanking.d.ts.map +1 -0
- package/dist/integrations/providers/openbanking.js +0 -0
- package/dist/integrations/providers/payments.d.ts +110 -0
- package/dist/integrations/providers/payments.d.ts.map +1 -0
- package/dist/integrations/providers/payments.js +0 -0
- package/dist/integrations/providers/postmark.d.ts +8 -0
- package/dist/integrations/providers/postmark.d.ts.map +1 -0
- package/dist/integrations/providers/postmark.js +2 -0
- package/dist/integrations/providers/postmark.js.map +1 -0
- package/dist/integrations/providers/powens.d.ts +8 -0
- package/dist/integrations/providers/powens.d.ts.map +1 -0
- package/dist/integrations/providers/powens.js +2 -0
- package/dist/integrations/providers/powens.js.map +1 -0
- package/dist/integrations/providers/qdrant.d.ts +8 -0
- package/dist/integrations/providers/qdrant.d.ts.map +1 -0
- package/dist/integrations/providers/qdrant.js +2 -0
- package/dist/integrations/providers/qdrant.js.map +1 -0
- package/dist/integrations/providers/sms.d.ts +35 -0
- package/dist/integrations/providers/sms.d.ts.map +1 -0
- package/dist/integrations/providers/sms.js +0 -0
- package/dist/integrations/providers/storage.d.ts +61 -0
- package/dist/integrations/providers/storage.d.ts.map +1 -0
- package/dist/integrations/providers/storage.js +0 -0
- package/dist/integrations/providers/stripe.d.ts +8 -0
- package/dist/integrations/providers/stripe.d.ts.map +1 -0
- package/dist/integrations/providers/stripe.js +2 -0
- package/dist/integrations/providers/stripe.js.map +1 -0
- package/dist/integrations/providers/twilio-sms.d.ts +8 -0
- package/dist/integrations/providers/twilio-sms.d.ts.map +1 -0
- package/dist/integrations/providers/twilio-sms.js +2 -0
- package/dist/integrations/providers/twilio-sms.js.map +1 -0
- package/dist/integrations/providers/vector-store.d.ts +44 -0
- package/dist/integrations/providers/vector-store.d.ts.map +1 -0
- package/dist/integrations/providers/vector-store.js +0 -0
- package/dist/integrations/providers/voice.d.ts +35 -0
- package/dist/integrations/providers/voice.d.ts.map +1 -0
- package/dist/integrations/providers/voice.js +0 -0
- package/dist/integrations/runtime.d.ts +100 -0
- package/dist/integrations/runtime.d.ts.map +1 -0
- package/dist/integrations/runtime.js +2 -0
- package/dist/integrations/runtime.js.map +1 -0
- package/dist/integrations/secrets/env-secret-provider.d.ts +32 -0
- package/dist/integrations/secrets/env-secret-provider.d.ts.map +1 -0
- package/dist/integrations/secrets/env-secret-provider.js +2 -0
- package/dist/integrations/secrets/env-secret-provider.js.map +1 -0
- package/dist/integrations/secrets/gcp-secret-manager.d.ts +33 -0
- package/dist/integrations/secrets/gcp-secret-manager.d.ts.map +1 -0
- package/dist/integrations/secrets/gcp-secret-manager.js +2 -0
- package/dist/integrations/secrets/gcp-secret-manager.js.map +1 -0
- package/dist/integrations/secrets/index.d.ts +5 -0
- package/dist/integrations/secrets/index.js +1 -0
- package/dist/integrations/secrets/manager.d.ts +48 -0
- package/dist/integrations/secrets/manager.d.ts.map +1 -0
- package/dist/integrations/secrets/manager.js +2 -0
- package/dist/integrations/secrets/manager.js.map +1 -0
- package/dist/integrations/secrets/provider.d.ts +53 -0
- package/dist/integrations/secrets/provider.d.ts.map +1 -0
- package/dist/integrations/secrets/provider.js +2 -0
- package/dist/integrations/secrets/provider.js.map +1 -0
- package/dist/integrations/spec.d.ts +80 -0
- package/dist/integrations/spec.d.ts.map +1 -0
- package/dist/integrations/spec.js +2 -0
- package/dist/integrations/spec.js.map +1 -0
- package/dist/jobs/gcp-cloud-tasks.d.ts +42 -0
- package/dist/jobs/gcp-cloud-tasks.d.ts.map +1 -0
- package/dist/jobs/gcp-cloud-tasks.js +2 -0
- package/dist/jobs/gcp-cloud-tasks.js.map +1 -0
- package/dist/jobs/gcp-pubsub.d.ts +26 -0
- package/dist/jobs/gcp-pubsub.d.ts.map +1 -0
- package/dist/jobs/gcp-pubsub.js +2 -0
- package/dist/jobs/gcp-pubsub.js.map +1 -0
- package/dist/jobs/handlers/gmail-sync-handler.d.ts +10 -0
- package/dist/jobs/handlers/gmail-sync-handler.d.ts.map +1 -0
- package/dist/jobs/handlers/gmail-sync-handler.js +2 -0
- package/dist/jobs/handlers/gmail-sync-handler.js.map +1 -0
- package/dist/jobs/handlers/index.d.ts +3 -0
- package/dist/jobs/handlers/index.js +1 -0
- package/dist/jobs/handlers/storage-document-handler.d.ts +13 -0
- package/dist/jobs/handlers/storage-document-handler.d.ts.map +1 -0
- package/dist/jobs/handlers/storage-document-handler.js +2 -0
- package/dist/jobs/handlers/storage-document-handler.js.map +1 -0
- package/dist/jobs/index.d.ts +7 -0
- package/dist/jobs/index.js +1 -0
- package/dist/jobs/memory-queue.d.ts +19 -0
- package/dist/jobs/memory-queue.d.ts.map +1 -0
- package/dist/jobs/memory-queue.js +2 -0
- package/dist/jobs/memory-queue.js.map +1 -0
- package/dist/jobs/queue.d.ts +27 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +0 -0
- package/dist/jsonschema.d.ts +27 -0
- package/dist/jsonschema.d.ts.map +1 -0
- package/dist/jsonschema.js +2 -0
- package/dist/jsonschema.js.map +1 -0
- package/dist/knowledge/binding.d.ts +26 -0
- package/dist/knowledge/binding.d.ts.map +1 -0
- package/dist/knowledge/binding.js +0 -0
- package/dist/knowledge/contracts.d.ts +317 -0
- package/dist/knowledge/contracts.d.ts.map +1 -0
- package/dist/knowledge/contracts.js +2 -0
- package/dist/knowledge/contracts.js.map +1 -0
- package/dist/knowledge/index.d.ts +10 -0
- package/dist/knowledge/index.js +1 -0
- package/dist/knowledge/ingestion/document-processor.d.ts +25 -0
- package/dist/knowledge/ingestion/document-processor.d.ts.map +1 -0
- package/dist/knowledge/ingestion/document-processor.js +2 -0
- package/dist/knowledge/ingestion/document-processor.js.map +1 -0
- package/dist/knowledge/ingestion/embedding-service.d.ts +13 -0
- package/dist/knowledge/ingestion/embedding-service.d.ts.map +1 -0
- package/dist/knowledge/ingestion/embedding-service.js +2 -0
- package/dist/knowledge/ingestion/embedding-service.js.map +1 -0
- package/dist/knowledge/ingestion/gmail-adapter.d.ts +19 -0
- package/dist/knowledge/ingestion/gmail-adapter.d.ts.map +1 -0
- package/dist/knowledge/ingestion/gmail-adapter.js +7 -0
- package/dist/knowledge/ingestion/gmail-adapter.js.map +1 -0
- package/dist/knowledge/ingestion/index.d.ts +6 -0
- package/dist/knowledge/ingestion/index.js +1 -0
- package/dist/knowledge/ingestion/storage-adapter.d.ts +16 -0
- package/dist/knowledge/ingestion/storage-adapter.d.ts.map +1 -0
- package/dist/knowledge/ingestion/storage-adapter.js +2 -0
- package/dist/knowledge/ingestion/storage-adapter.js.map +1 -0
- package/dist/knowledge/ingestion/vector-indexer.d.ts +19 -0
- package/dist/knowledge/ingestion/vector-indexer.d.ts.map +1 -0
- package/dist/knowledge/ingestion/vector-indexer.js +2 -0
- package/dist/knowledge/ingestion/vector-indexer.js.map +1 -0
- package/dist/knowledge/query/index.d.ts +2 -0
- package/dist/knowledge/query/index.js +1 -0
- package/dist/knowledge/query/service.d.ts +30 -0
- package/dist/knowledge/query/service.d.ts.map +1 -0
- package/dist/knowledge/query/service.js +4 -0
- package/dist/knowledge/query/service.js.map +1 -0
- package/dist/knowledge/runtime.d.ts +33 -0
- package/dist/knowledge/runtime.d.ts.map +1 -0
- package/dist/knowledge/runtime.js +2 -0
- package/dist/knowledge/runtime.js.map +1 -0
- package/dist/knowledge/source.d.ts +33 -0
- package/dist/knowledge/source.d.ts.map +1 -0
- package/dist/knowledge/source.js +0 -0
- package/dist/knowledge/spaces/email-threads.d.ts +8 -0
- package/dist/knowledge/spaces/email-threads.d.ts.map +1 -0
- package/dist/knowledge/spaces/email-threads.js +2 -0
- package/dist/knowledge/spaces/email-threads.js.map +1 -0
- package/dist/knowledge/spaces/financial-docs.d.ts +8 -0
- package/dist/knowledge/spaces/financial-docs.d.ts.map +1 -0
- package/dist/knowledge/spaces/financial-docs.js +2 -0
- package/dist/knowledge/spaces/financial-docs.js.map +1 -0
- package/dist/knowledge/spaces/financial-overview.d.ts +8 -0
- package/dist/knowledge/spaces/financial-overview.d.ts.map +1 -0
- package/dist/knowledge/spaces/financial-overview.js +2 -0
- package/dist/knowledge/spaces/financial-overview.js.map +1 -0
- package/dist/knowledge/spaces/index.d.ts +7 -0
- package/dist/knowledge/spaces/index.js +1 -0
- package/dist/knowledge/spaces/product-canon.d.ts +8 -0
- package/dist/knowledge/spaces/product-canon.d.ts.map +1 -0
- package/dist/knowledge/spaces/product-canon.js +2 -0
- package/dist/knowledge/spaces/product-canon.js.map +1 -0
- package/dist/knowledge/spaces/support-faq.d.ts +8 -0
- package/dist/knowledge/spaces/support-faq.d.ts.map +1 -0
- package/dist/knowledge/spaces/support-faq.js +2 -0
- package/dist/knowledge/spaces/support-faq.js.map +1 -0
- package/dist/knowledge/spaces/uploaded-docs.d.ts +8 -0
- package/dist/knowledge/spaces/uploaded-docs.d.ts.map +1 -0
- package/dist/knowledge/spaces/uploaded-docs.js +2 -0
- package/dist/knowledge/spaces/uploaded-docs.js.map +1 -0
- package/dist/knowledge/spec.d.ts +53 -0
- package/dist/knowledge/spec.d.ts.map +1 -0
- package/dist/knowledge/spec.js +2 -0
- package/dist/knowledge/spec.js.map +1 -0
- package/dist/markdown.d.ts +22 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +4 -0
- package/dist/markdown.js.map +1 -0
- package/dist/migrations.d.ts +53 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +2 -0
- package/dist/migrations.js.map +1 -0
- package/dist/onboarding-base.d.ts +138 -0
- package/dist/onboarding-base.d.ts.map +1 -0
- package/dist/onboarding-base.js +2 -0
- package/dist/onboarding-base.js.map +1 -0
- package/dist/ownership.d.ts +76 -0
- package/dist/ownership.d.ts.map +1 -0
- package/dist/ownership.js +2 -0
- package/dist/ownership.js.map +1 -0
- package/dist/policy/engine.d.ts +40 -0
- package/dist/policy/engine.d.ts.map +1 -0
- package/dist/policy/engine.js +2 -0
- package/dist/policy/engine.js.map +1 -0
- package/dist/policy/opa-adapter.d.ts +46 -0
- package/dist/policy/opa-adapter.d.ts.map +1 -0
- package/dist/policy/opa-adapter.js +2 -0
- package/dist/policy/opa-adapter.js.map +1 -0
- package/dist/policy/spec.d.ts +115 -0
- package/dist/policy/spec.d.ts.map +1 -0
- package/dist/policy/spec.js +2 -0
- package/dist/policy/spec.js.map +1 -0
- package/dist/presentations.backcompat.d.ts +8 -0
- package/dist/presentations.backcompat.d.ts.map +1 -0
- package/dist/presentations.backcompat.js +2 -0
- package/dist/presentations.backcompat.js.map +1 -0
- package/dist/presentations.d.ts +97 -0
- package/dist/presentations.d.ts.map +1 -0
- package/dist/presentations.js +2 -0
- package/dist/presentations.js.map +1 -0
- package/dist/presentations.v2.d.ts +96 -0
- package/dist/presentations.v2.d.ts.map +1 -0
- package/dist/presentations.v2.js +2 -0
- package/dist/presentations.v2.js.map +1 -0
- package/dist/prompt.d.ts +61 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +2 -0
- package/dist/prompt.js.map +1 -0
- package/dist/promptRegistry.d.ts +16 -0
- package/dist/promptRegistry.d.ts.map +1 -0
- package/dist/promptRegistry.js +2 -0
- package/dist/promptRegistry.js.map +1 -0
- package/dist/regenerator/adapters.d.ts +20 -0
- package/dist/regenerator/adapters.d.ts.map +1 -0
- package/dist/regenerator/adapters.js +0 -0
- package/dist/regenerator/executor.d.ts +71 -0
- package/dist/regenerator/executor.d.ts.map +1 -0
- package/dist/regenerator/executor.js +2 -0
- package/dist/regenerator/executor.js.map +1 -0
- package/dist/regenerator/index.d.ts +7 -0
- package/dist/regenerator/index.js +1 -0
- package/dist/regenerator/service.d.ts +34 -0
- package/dist/regenerator/service.d.ts.map +1 -0
- package/dist/regenerator/service.js +2 -0
- package/dist/regenerator/service.js.map +1 -0
- package/dist/regenerator/sinks.d.ts +27 -0
- package/dist/regenerator/sinks.d.ts.map +1 -0
- package/dist/regenerator/sinks.js +2 -0
- package/dist/regenerator/sinks.js.map +1 -0
- package/dist/regenerator/types.d.ts +108 -0
- package/dist/regenerator/types.d.ts.map +1 -0
- package/dist/regenerator/types.js +0 -0
- package/dist/regenerator/utils.d.ts +10 -0
- package/dist/regenerator/utils.d.ts.map +1 -0
- package/dist/regenerator/utils.js +2 -0
- package/dist/regenerator/utils.js.map +1 -0
- package/dist/registry.d.ts +73 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +2 -0
- package/dist/registry.js.map +1 -0
- package/dist/resources.d.ts +65 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +2 -0
- package/dist/resources.js.map +1 -0
- package/dist/schema/dist/EnumType.js +1 -0
- package/dist/schema/dist/FieldType.js +2 -0
- package/dist/schema/dist/FieldType.js.map +1 -0
- package/dist/schema/dist/ScalarTypeEnum.js +2 -0
- package/dist/schema/dist/ScalarTypeEnum.js.map +1 -0
- package/dist/schema/dist/SchemaModel.js +2 -0
- package/dist/schema/dist/SchemaModel.js.map +1 -0
- package/dist/schema/dist/index.js +1 -0
- package/dist/server/graphql-pothos.d.ts +32 -0
- package/dist/server/graphql-pothos.d.ts.map +1 -0
- package/dist/server/graphql-pothos.js +2 -0
- package/dist/server/graphql-pothos.js.map +1 -0
- package/dist/server/graphql-schema-export.d.ts +7 -0
- package/dist/server/graphql-schema-export.d.ts.map +1 -0
- package/dist/server/graphql-schema-export.js +2 -0
- package/dist/server/graphql-schema-export.js.map +1 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.js +1 -0
- package/dist/server/provider-mcp.d.ts +52 -0
- package/dist/server/provider-mcp.d.ts.map +1 -0
- package/dist/server/provider-mcp.js +2 -0
- package/dist/server/provider-mcp.js.map +1 -0
- package/dist/server/rest-elysia.d.ts +41 -0
- package/dist/server/rest-elysia.d.ts.map +1 -0
- package/dist/server/rest-elysia.js +2 -0
- package/dist/server/rest-elysia.js.map +1 -0
- package/dist/server/rest-express.d.ts +17 -0
- package/dist/server/rest-express.d.ts.map +1 -0
- package/dist/server/rest-express.js +2 -0
- package/dist/server/rest-express.js.map +1 -0
- package/dist/server/rest-generic.d.ts +33 -0
- package/dist/server/rest-generic.d.ts.map +1 -0
- package/dist/server/rest-generic.js +2 -0
- package/dist/server/rest-generic.js.map +1 -0
- package/dist/server/rest-next-app.d.ts +36 -0
- package/dist/server/rest-next-app.d.ts.map +1 -0
- package/dist/server/rest-next-app.js +2 -0
- package/dist/server/rest-next-app.js.map +1 -0
- package/dist/server/rest-next-mcp.d.ts +12 -0
- package/dist/server/rest-next-mcp.d.ts.map +1 -0
- package/dist/server/rest-next-mcp.js +2 -0
- package/dist/server/rest-next-mcp.js.map +1 -0
- package/dist/server/rest-next-pages.d.ts +10 -0
- package/dist/server/rest-next-pages.d.ts.map +1 -0
- package/dist/server/rest-next-pages.js +2 -0
- package/dist/server/rest-next-pages.js.map +1 -0
- package/dist/spec.d.ts +172 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +2 -0
- package/dist/spec.js.map +1 -0
- package/dist/telemetry/anomaly.d.ts +28 -0
- package/dist/telemetry/anomaly.d.ts.map +1 -0
- package/dist/telemetry/anomaly.js +2 -0
- package/dist/telemetry/anomaly.js.map +1 -0
- package/dist/telemetry/index.d.ts +4 -0
- package/dist/telemetry/index.js +1 -0
- package/dist/telemetry/spec.d.ts +99 -0
- package/dist/telemetry/spec.d.ts.map +1 -0
- package/dist/telemetry/spec.js +2 -0
- package/dist/telemetry/spec.js.map +1 -0
- package/dist/telemetry/tracker.d.ts +52 -0
- package/dist/telemetry/tracker.d.ts.map +1 -0
- package/dist/telemetry/tracker.js +2 -0
- package/dist/telemetry/tracker.js.map +1 -0
- package/dist/tests/index.d.ts +3 -0
- package/dist/tests/index.js +1 -0
- package/dist/tests/runner.d.ts +44 -0
- package/dist/tests/runner.d.ts.map +1 -0
- package/dist/tests/runner.js +2 -0
- package/dist/tests/runner.js.map +1 -0
- package/dist/tests/spec.d.ts +90 -0
- package/dist/tests/spec.d.ts.map +1 -0
- package/dist/tests/spec.js +2 -0
- package/dist/tests/spec.js.map +1 -0
- package/dist/themes.d.ts +56 -0
- package/dist/themes.d.ts.map +1 -0
- package/dist/themes.js +2 -0
- package/dist/themes.js.map +1 -0
- package/dist/translations/catalog.d.ts +29 -0
- package/dist/translations/catalog.d.ts.map +1 -0
- package/dist/translations/catalog.js +0 -0
- package/dist/translations/tenant.d.ts +16 -0
- package/dist/translations/tenant.d.ts.map +1 -0
- package/dist/translations/tenant.js +0 -0
- package/dist/types/all.d.ts +60 -0
- package/dist/types/all.js +0 -0
- package/dist/types.d.ts +86 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +0 -0
- package/dist/workflow/adapters/db-adapter.d.ts +35 -0
- package/dist/workflow/adapters/db-adapter.d.ts.map +1 -0
- package/dist/workflow/adapters/db-adapter.js +2 -0
- package/dist/workflow/adapters/db-adapter.js.map +1 -0
- package/dist/workflow/adapters/file-adapter.d.ts +15 -0
- package/dist/workflow/adapters/file-adapter.d.ts.map +1 -0
- package/dist/workflow/adapters/file-adapter.js +2 -0
- package/dist/workflow/adapters/file-adapter.js.map +1 -0
- package/dist/workflow/adapters/index.d.ts +4 -0
- package/dist/workflow/adapters/index.js +1 -0
- package/dist/workflow/adapters/memory-store.d.ts +19 -0
- package/dist/workflow/adapters/memory-store.d.ts.map +1 -0
- package/dist/workflow/adapters/memory-store.js +2 -0
- package/dist/workflow/adapters/memory-store.js.map +1 -0
- package/dist/workflow/expression.d.ts +10 -0
- package/dist/workflow/expression.d.ts.map +1 -0
- package/dist/workflow/expression.js +2 -0
- package/dist/workflow/expression.js.map +1 -0
- package/dist/workflow/index.d.ts +10 -0
- package/dist/workflow/index.js +1 -0
- package/dist/workflow/runner.d.ts +75 -0
- package/dist/workflow/runner.d.ts.map +1 -0
- package/dist/workflow/runner.js +2 -0
- package/dist/workflow/runner.js.map +1 -0
- package/dist/workflow/sla-monitor.d.ts +21 -0
- package/dist/workflow/sla-monitor.d.ts.map +1 -0
- package/dist/workflow/sla-monitor.js +2 -0
- package/dist/workflow/sla-monitor.js.map +1 -0
- package/dist/workflow/spec.d.ts +100 -0
- package/dist/workflow/spec.d.ts.map +1 -0
- package/dist/workflow/spec.js +2 -0
- package/dist/workflow/spec.js.map +1 -0
- package/dist/workflow/state.d.ts +36 -0
- package/dist/workflow/state.d.ts.map +1 -0
- package/dist/workflow/state.js +0 -0
- package/dist/workflow/validation.d.ts +29 -0
- package/dist/workflow/validation.d.ts.map +1 -0
- package/dist/workflow/validation.js +2 -0
- package/dist/workflow/validation.js.map +1 -0
- package/package.json +403 -0
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { HandlerCtx } from "../types.js";
|
|
2
|
+
import { SpecRegistry } from "../registry.js";
|
|
3
|
+
import { RestOptions } from "./rest-generic.js";
|
|
4
|
+
import { Elysia } from "elysia";
|
|
5
|
+
|
|
6
|
+
//#region src/server/rest-elysia.d.ts
|
|
7
|
+
/** Mount routes on an Elysia instance */
|
|
8
|
+
declare function elysiaPlugin(app: Elysia, reg: SpecRegistry, ctxFactory: (c: {
|
|
9
|
+
request: Request;
|
|
10
|
+
store: any;
|
|
11
|
+
}) => HandlerCtx, options?: RestOptions): Elysia<"", {
|
|
12
|
+
decorator: {};
|
|
13
|
+
store: {};
|
|
14
|
+
derive: {};
|
|
15
|
+
resolve: {};
|
|
16
|
+
}, {
|
|
17
|
+
typebox: {};
|
|
18
|
+
error: {};
|
|
19
|
+
}, {
|
|
20
|
+
schema: {};
|
|
21
|
+
standaloneSchema: {};
|
|
22
|
+
macro: {};
|
|
23
|
+
macroFn: {};
|
|
24
|
+
parser: {};
|
|
25
|
+
response: {};
|
|
26
|
+
}, {}, {
|
|
27
|
+
derive: {};
|
|
28
|
+
resolve: {};
|
|
29
|
+
schema: {};
|
|
30
|
+
standaloneSchema: {};
|
|
31
|
+
response: {};
|
|
32
|
+
}, {
|
|
33
|
+
derive: {};
|
|
34
|
+
resolve: {};
|
|
35
|
+
schema: {};
|
|
36
|
+
standaloneSchema: {};
|
|
37
|
+
response: {};
|
|
38
|
+
}>;
|
|
39
|
+
//#endregion
|
|
40
|
+
export { elysiaPlugin };
|
|
41
|
+
//# sourceMappingURL=rest-elysia.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createFetchHandler as e}from"./rest-generic.js";function t(t,n,r,i){let a=e(n,e=>r({request:e,store:t.store}),i);for(let e of n.listSpecs()){let n=e.transport?.rest?.method??(e.meta.kind===`query`?`GET`:`POST`),r=(i?.basePath??``)+(e.transport?.rest?.path??`/${e.meta.name.replace(/\./g,`/`)}/v${e.meta.version}`);t[n.toLowerCase()](r,({request:e})=>a(e))}return i?.cors&&t.options(`*`,({request:e})=>a(e)),t}export{t as elysiaPlugin};
|
|
2
|
+
//# sourceMappingURL=rest-elysia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { HandlerCtx } from "../types.js";
|
|
2
|
+
import { SpecRegistry } from "../registry.js";
|
|
3
|
+
import { RestOptions } from "./rest-generic.js";
|
|
4
|
+
import { Request, Router } from "express";
|
|
5
|
+
|
|
6
|
+
//#region src/server/rest-express.d.ts
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Build an Express Router that proxies to the Fetch-style handler.
|
|
10
|
+
* You can mount it at any base path; pass the same basePath in options.
|
|
11
|
+
*/
|
|
12
|
+
declare function expressRouter(express: {
|
|
13
|
+
Router: () => Router;
|
|
14
|
+
}, reg: SpecRegistry, ctxFactory: (req: Request) => HandlerCtx, options?: RestOptions): Router;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { expressRouter };
|
|
17
|
+
//# sourceMappingURL=rest-express.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createFetchHandler as e}from"./rest-generic.js";function t(t,n,r,i){let a=t.Router();e(n,e=>{throw Error(`ctxFactory must be called from route`)},i);for(let t of n.listSpecs()){let o=t.transport?.rest?.method??(t.meta.kind===`query`?`GET`:`POST`),s=(i?.basePath??``)+(t.transport?.rest?.path??`/${t.meta.name.replace(/\./g,`/`)}/v${t.meta.version}`);a[o.toLowerCase()](s,async(t,a)=>{let s=new URL(`${t.protocol}://${t.get(`host`)}${t.originalUrl}`),c=new Request(s.toString(),{method:o,headers:Object.fromEntries(Object.entries(t.headers).map(([e,t])=>[e,String(t)])),body:o===`POST`?JSON.stringify(t.body??{}):void 0}),l=await e(n,()=>r(t),i)(c);a.status(l.status),l.headers.forEach((e,t)=>a.setHeader(t,e));let u=await l.text();a.send(u)})}return i?.cors&&a.options(`*`,(e,t)=>{let n=new Headers;new Response(null,{status:204}).headers.forEach((e,t)=>n.set(t,e)),t.status(204).send()}),a}export{t as expressRouter};
|
|
2
|
+
//# sourceMappingURL=rest-express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { HandlerCtx } from "../types.js";
|
|
2
|
+
import { SpecRegistry } from "../registry.js";
|
|
3
|
+
|
|
4
|
+
//#region src/server/rest-generic.d.ts
|
|
5
|
+
interface RestOptions {
|
|
6
|
+
/** Prefix all routes, e.g. "/api" */
|
|
7
|
+
basePath?: string;
|
|
8
|
+
/** If true, handle OPTIONS and set CORS headers */
|
|
9
|
+
cors?: boolean | {
|
|
10
|
+
origin?: string | '*';
|
|
11
|
+
methods?: string[];
|
|
12
|
+
headers?: string[];
|
|
13
|
+
credentials?: boolean;
|
|
14
|
+
maxAge?: number;
|
|
15
|
+
};
|
|
16
|
+
/** JSON spacing in responses (dev only ideally) */
|
|
17
|
+
prettyJson?: number | false;
|
|
18
|
+
/** Map thrown errors to {status, body} */
|
|
19
|
+
onError?: (err: unknown) => {
|
|
20
|
+
status: number;
|
|
21
|
+
body: any;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Build a single Fetch-style handler: (req) => Response
|
|
26
|
+
* - Discovers routes from SpecRegistry
|
|
27
|
+
* - Validates with zod via registry.execute()
|
|
28
|
+
* - Handles CORS (optional)
|
|
29
|
+
*/
|
|
30
|
+
declare function createFetchHandler(reg: SpecRegistry, ctxFactory: (req: Request) => HandlerCtx, options?: RestOptions): (req: Request) => Promise<Response>;
|
|
31
|
+
//#endregion
|
|
32
|
+
export { RestOptions, createFetchHandler };
|
|
33
|
+
//# sourceMappingURL=rest-generic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{defaultRestPath as e}from"../jsonschema.js";function t(e){let t={};return t[`access-control-allow-origin`]=typeof e==`object`?e.origin??`*`:`*`,t.vary=`Origin`,typeof e==`object`?(e.methods&&(t[`access-control-allow-methods`]=e.methods.join(`, `)),e.headers&&(t[`access-control-allow-headers`]=e.headers.join(`, `)),e.credentials&&(t[`access-control-allow-credentials`]=`true`),typeof e.maxAge==`number`&&(t[`access-control-max-age`]=String(e.maxAge))):(t[`access-control-allow-methods`]=`GET,POST,OPTIONS`,t[`access-control-allow-headers`]=`content-type,x-idempotency-key,x-trace-id`),t}function n(e,t){return`${(e??``).replace(/\/+$/g,``)}/${t.replace(/^\/+/g,``)}`.replace(/\/{2,}/g,`/`)}function r(r,i,a){let o={basePath:a?.basePath??``,cors:a?.cors??!1,prettyJson:a?.prettyJson??!1,onError:a?.onError},s=r.listSpecs().map(t=>({method:t.transport?.rest?.method??(t.meta.kind===`query`?`GET`:`POST`),path:n(o.basePath,t.transport?.rest?.path??e(t.meta.name,t.meta.version)),name:t.meta.name,version:t.meta.version})),c=new Map;for(let e of s)c.set(`${e.method} ${e.path}`,e);Array.from(new Set(s.map(e=>e.method))).join(`, `);let l=(e,t,n)=>{let r=o.prettyJson?JSON.stringify(t,null,o.prettyJson):JSON.stringify(t),i={"content-type":`application/json; charset=utf-8`};return new Response(r,{status:e,headers:n?{...i,...n}:i})};return async function(e){let n=new URL(e.url),a=`${e.method.toUpperCase()} ${n.pathname}`;if(o.cors&&e.method.toUpperCase()===`OPTIONS`){let e=t(o.cors===!0?{}:o.cors);return new Response(null,{status:204,headers:{...e,"content-length":`0`}})}let s=c.get(a);if(!s){let e={};return o.cors&&Object.assign(e,t(o.cors===!0?{}:o.cors)),l(404,{error:`NotFound`,path:n.pathname},e)}try{let a={};if(s.method===`GET`)if(n.searchParams.has(`input`)){let e=n.searchParams.get(`input`);a=e?JSON.parse(e):{}}else{let e={};for(let[t,r]of n.searchParams.entries())e[t]=r;a=e}else{let t=e.headers.get(`content-type`)||``;if(t.includes(`application/json`))a=await e.json();else if(t.includes(`application/x-www-form-urlencoded`)){let t=await e.formData();a=Object.fromEntries(t.entries())}else if(!t)a={};else return l(415,{error:`UnsupportedMediaType`,contentType:t})}let c=i(e),u=await r.execute(s.name,s.version,a,c),d={};return o.cors&&Object.assign(d,t(o.cors===!0?{}:o.cors)),l(200,u,d)}catch(e){if(o.onError){let n=o.onError(e),r={};return o.cors&&Object.assign(r,t(o.cors===!0?{}:o.cors)),l(n.status,n.body,r)}let n={};return o.cors&&Object.assign(n,t(o.cors===!0?{}:o.cors)),e?.issues?l(400,{error:`ValidationError`,issues:e.issues},n):typeof e?.message==`string`&&e.message.startsWith(`PolicyDenied`)?l(403,{error:`PolicyDenied`},n):l(500,{error:`InternalError`},n)}}}export{r as createFetchHandler};
|
|
2
|
+
//# sourceMappingURL=rest-generic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { HandlerCtx } from "../types.js";
|
|
2
|
+
import { SpecRegistry } from "../registry.js";
|
|
3
|
+
import { RestOptions } from "./rest-generic.js";
|
|
4
|
+
|
|
5
|
+
//#region src/server/rest-next-app.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Creates a Next.js App Router route handler for ContractSpec operations.
|
|
9
|
+
*
|
|
10
|
+
* This function returns a handler suitable for `export const { GET, POST }` in a `route.ts` file.
|
|
11
|
+
* It handles:
|
|
12
|
+
* - Path parsing to determine the operation name and version.
|
|
13
|
+
* - Body parsing (JSON).
|
|
14
|
+
* - Context creation via `ctxFactory`.
|
|
15
|
+
* - Execution via `SpecRegistry`.
|
|
16
|
+
* - Response formatting (JSON success/error).
|
|
17
|
+
*
|
|
18
|
+
* @param reg - The SpecRegistry containing the operations.
|
|
19
|
+
* @param ctxFactory - A factory function to build the `HandlerCtx` (e.g., auth, tenant) from the request.
|
|
20
|
+
* @param options - Optional configuration for the REST handler.
|
|
21
|
+
* @returns A function `(req: Request) => Promise<Response>`.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* // app/api/[...route]/route.ts
|
|
26
|
+
* import { makeNextAppHandler } from '@lssm/lib.contracts/server/rest-next-app';
|
|
27
|
+
* import { registry } from '@/lib/registry';
|
|
28
|
+
*
|
|
29
|
+
* const handler = makeNextAppHandler(registry, (req) => ({ actor: 'anonymous' }));
|
|
30
|
+
* export { handler as GET, handler as POST };
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
declare function makeNextAppHandler(reg: SpecRegistry, ctxFactory: (req: Request) => HandlerCtx, options?: RestOptions): (req: Request) => Promise<Response>;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { makeNextAppHandler };
|
|
36
|
+
//# sourceMappingURL=rest-next-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { HandlerCtx } from "../types.js";
|
|
2
|
+
import { SpecRegistry } from "../registry.js";
|
|
3
|
+
|
|
4
|
+
//#region src/server/rest-next-mcp.d.ts
|
|
5
|
+
declare function makeNextMcpServerFromRegistry(reg: SpecRegistry, ctxFactory: () => HandlerCtx): {
|
|
6
|
+
GET: (request: Request) => Promise<Response>;
|
|
7
|
+
POST: (request: Request) => Promise<Response>;
|
|
8
|
+
DELETE: (request: Request) => Promise<Response>;
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { makeNextMcpServerFromRegistry };
|
|
12
|
+
//# sourceMappingURL=rest-next-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{defaultMcpTool as e,jsonSchemaForSpec as t}from"../jsonschema.js";import{ResourceTemplate as n}from"@modelcontextprotocol/sdk/server/mcp.js";import{createMcpHandler as r}from"mcp-handler";function i(i,a){let o=r(r=>{for(let o of i.listSpecs()){let{input:s,output:c,meta:l}=t(o);if(l.kind===`query`){let t=o.transport?.mcp?.toolName??e(o.meta.name,o.meta.version);r.registerResource(t,new n(`users://{userId}/profile`,{list:void 0}),{description:o.meta.description,inputSchema:s},(async(e,t,n)=>{let r=await i.execute(o.meta.name,o.meta.version,t??{},a());return{contents:[{uri:e.href,text:String(r)}]}}))}else if(l.kind===`command`){let t=o.transport?.mcp?.toolName??e(o.meta.name,o.meta.version);r.registerTool(t,{description:o.meta.description,inputSchema:s},(async(e,t)=>{let n=await i.execute(o.meta.name,o.meta.version,e??{},a());return{content:[{type:`text`,text:String(n)}]}}))}else throw Error(`Unsupported kind: ${l.kind}`)}},{},{basePath:`/api`});return{GET:o,POST:o,DELETE:o}}export{i as makeNextMcpServerFromRegistry};
|
|
2
|
+
//# sourceMappingURL=rest-next-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { HandlerCtx } from "../types.js";
|
|
2
|
+
import { SpecRegistry } from "../registry.js";
|
|
3
|
+
import { RestOptions } from "./rest-generic.js";
|
|
4
|
+
import { NextApiRequest, NextApiResponse } from "next";
|
|
5
|
+
|
|
6
|
+
//#region src/server/rest-next-pages.d.ts
|
|
7
|
+
declare function makeNextPagesHandler(reg: SpecRegistry, ctxFactory: (req: NextApiRequest) => HandlerCtx, options?: RestOptions): (req: NextApiRequest, res: NextApiResponse) => Promise<void>;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { makeNextPagesHandler };
|
|
10
|
+
//# sourceMappingURL=rest-next-pages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createFetchHandler as e}from"./rest-generic.js";function t(t,n,r){return e(t,e=>{throw Error(`Use per-request wrapper`)},r),async function(i,a){let o=`${i.headers[`x-forwarded-proto`]??`http`}://${i.headers.host}${i.url}`,s=i.method?.toUpperCase()||`GET`,c=new Request(o,{method:s,headers:Object.fromEntries(Object.entries(i.headers).map(([e,t])=>[e,String(t)])),body:s===`POST`?JSON.stringify(i.body??{}):void 0}),l=await e(t,()=>n(i),r)(c);a.status(l.status),l.headers.forEach((e,t)=>a.setHeader(t,e));let u=await l.text();a.send(u)}}export{t as makeNextPagesHandler};
|
|
2
|
+
//# sourceMappingURL=rest-next-pages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
package/dist/spec.d.ts
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Owner, Stability, Tag } from "./ownership.js";
|
|
2
|
+
import { EventSpec } from "./events.js";
|
|
3
|
+
import { ResourceRefDescriptor } from "./resources.js";
|
|
4
|
+
import { PolicyRef } from "./policy/spec.js";
|
|
5
|
+
import { TestSpecRef } from "./tests/spec.js";
|
|
6
|
+
import { AnySchemaModel } from "@lssm/lib.schema";
|
|
7
|
+
|
|
8
|
+
//#region src/spec.d.ts
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Distinguishes between state-changing operations (command) and read-only operations (query).
|
|
12
|
+
*/
|
|
13
|
+
type OpKind = 'command' | 'query';
|
|
14
|
+
interface EmitDeclRef {
|
|
15
|
+
ref: EventSpec<AnySchemaModel>;
|
|
16
|
+
when: string;
|
|
17
|
+
}
|
|
18
|
+
interface EmitDeclInline {
|
|
19
|
+
name: string;
|
|
20
|
+
version: number;
|
|
21
|
+
when: string;
|
|
22
|
+
payload: AnySchemaModel;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Declaration of an event that an operation may emit.
|
|
26
|
+
* Can be a reference to an `EventSpec` or an inline definition.
|
|
27
|
+
*/
|
|
28
|
+
type EmitDecl = EmitDeclRef | EmitDeclInline;
|
|
29
|
+
declare const isEmitDeclRef: (e: EmitDecl) => e is EmitDeclRef;
|
|
30
|
+
interface TelemetryTrigger {
|
|
31
|
+
event: {
|
|
32
|
+
name: string;
|
|
33
|
+
version?: number;
|
|
34
|
+
};
|
|
35
|
+
properties?: (args: {
|
|
36
|
+
input: unknown;
|
|
37
|
+
output?: unknown;
|
|
38
|
+
error?: unknown;
|
|
39
|
+
}) => Record<string, unknown>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The core specification interface for any operation (Command or Query).
|
|
43
|
+
*
|
|
44
|
+
* @template Input - The Zod-backed schema model for the input payload.
|
|
45
|
+
* @template Output - The Zod-backed schema model for the output payload, or a resource reference.
|
|
46
|
+
* @template Events - Tuple of events that this operation may emit.
|
|
47
|
+
*/
|
|
48
|
+
interface ContractSpec<Input extends AnySchemaModel, Output extends AnySchemaModel | ResourceRefDescriptor<boolean>, Events extends readonly EmitDecl[] | undefined = readonly EmitDecl[] | undefined> {
|
|
49
|
+
meta: {
|
|
50
|
+
/** Fully-qualified op name (e.g., "sigil.beginSignup") */
|
|
51
|
+
name: string;
|
|
52
|
+
/** Breaking changes => bump version */
|
|
53
|
+
version: number;
|
|
54
|
+
/** "command" changes state; "query" is read-only/idempotent */
|
|
55
|
+
kind: OpKind;
|
|
56
|
+
/** Lifecycle marker for comms & tooling */
|
|
57
|
+
stability: Stability;
|
|
58
|
+
/** Owners for CODEOWNERS / on-call / approvals */
|
|
59
|
+
owners: Owner[];
|
|
60
|
+
/** Search tags, grouping, docs navigation */
|
|
61
|
+
tags: Tag[];
|
|
62
|
+
/** Short human-friendly summary */
|
|
63
|
+
description: string;
|
|
64
|
+
/** Business goal: why this exists */
|
|
65
|
+
goal: string;
|
|
66
|
+
/** Background, constraints, scope edges (feeds docs & LLM context) */
|
|
67
|
+
context: string;
|
|
68
|
+
};
|
|
69
|
+
io: {
|
|
70
|
+
/** Zod schema for input payload */
|
|
71
|
+
input: Input | null;
|
|
72
|
+
/** Zod schema for output payload */
|
|
73
|
+
output: Output;
|
|
74
|
+
/** Named, typed errors this op may throw (optional) */
|
|
75
|
+
errors?: Record<string, {
|
|
76
|
+
description: string;
|
|
77
|
+
http?: number;
|
|
78
|
+
gqlCode?: string;
|
|
79
|
+
when: string;
|
|
80
|
+
}>;
|
|
81
|
+
};
|
|
82
|
+
policy: {
|
|
83
|
+
/** Minimal auth category allowed to call this op */
|
|
84
|
+
auth: 'anonymous' | 'user' | 'admin';
|
|
85
|
+
/** Idempotency hint. Queries default true; commands default false. */
|
|
86
|
+
idempotent?: boolean;
|
|
87
|
+
/** Soft rate limit suggestion; adapter enforces via limiter */
|
|
88
|
+
rateLimit?: {
|
|
89
|
+
rpm: number;
|
|
90
|
+
key: 'user' | 'org' | 'global';
|
|
91
|
+
};
|
|
92
|
+
/** Feature flags that must be ON for this op to run */
|
|
93
|
+
flags?: string[];
|
|
94
|
+
/** Whether a human must approve before action (e.g., risky commands) */
|
|
95
|
+
escalate?: 'human_review' | null;
|
|
96
|
+
/** JSONPath-like pointers to redact from logs/prompts */
|
|
97
|
+
pii?: string[];
|
|
98
|
+
/** Referenced policy specs governing access */
|
|
99
|
+
policies?: PolicyRef[];
|
|
100
|
+
/** Field-level overrides referencing policy specs */
|
|
101
|
+
fieldPolicies?: {
|
|
102
|
+
field: string;
|
|
103
|
+
actions: ('read' | 'write')[];
|
|
104
|
+
policy?: PolicyRef;
|
|
105
|
+
}[];
|
|
106
|
+
};
|
|
107
|
+
sideEffects?: {
|
|
108
|
+
/** Declared events this op may emit; runtime will guard against others */
|
|
109
|
+
emits?: Events;
|
|
110
|
+
/** Analytics intents (names); the service decides the sink */
|
|
111
|
+
analytics?: string[];
|
|
112
|
+
/** Audit intents (labels); the service decides storage */
|
|
113
|
+
audit?: string[];
|
|
114
|
+
};
|
|
115
|
+
telemetry?: {
|
|
116
|
+
success?: TelemetryTrigger;
|
|
117
|
+
failure?: TelemetryTrigger;
|
|
118
|
+
};
|
|
119
|
+
tests?: TestSpecRef[];
|
|
120
|
+
transport?: {
|
|
121
|
+
rest?: {
|
|
122
|
+
/** Override HTTP method (default: POST for commands, GET for queries) */
|
|
123
|
+
method?: 'GET' | 'POST';
|
|
124
|
+
/** Override path (default derived from meta.name/version) */
|
|
125
|
+
path?: string;
|
|
126
|
+
};
|
|
127
|
+
gql?: {
|
|
128
|
+
/** Override field name (default: dots→underscores + _vN) */
|
|
129
|
+
field?: string;
|
|
130
|
+
returns?: string;
|
|
131
|
+
};
|
|
132
|
+
mcp?: {
|
|
133
|
+
/** Override tool identifier (default: "<name>.v<version>") */
|
|
134
|
+
toolName?: string;
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
acceptance?: {
|
|
138
|
+
/** Gherkin-lite scenarios for docs & auto tests */
|
|
139
|
+
scenarios?: {
|
|
140
|
+
name: string;
|
|
141
|
+
given: string[];
|
|
142
|
+
when: string[];
|
|
143
|
+
then: string[];
|
|
144
|
+
}[];
|
|
145
|
+
/** Request/response examples (used for docs & snapshot tests) */
|
|
146
|
+
examples?: {
|
|
147
|
+
name: string;
|
|
148
|
+
input: unknown;
|
|
149
|
+
output: unknown;
|
|
150
|
+
}[];
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
type AnyContractSpec = ContractSpec<AnySchemaModel, AnySchemaModel | ResourceRefDescriptor<boolean>>;
|
|
154
|
+
/**
|
|
155
|
+
* Helper to define a Command (write operation).
|
|
156
|
+
* Sets `kind: 'command'` and defaults `idempotent: false`.
|
|
157
|
+
*/
|
|
158
|
+
declare const defineCommand: <I extends AnySchemaModel, O extends AnySchemaModel | ResourceRefDescriptor<boolean>, E extends readonly EmitDecl[] | undefined = undefined>(spec: Omit<ContractSpec<I, O, E>, "meta" | "policy"> & {
|
|
159
|
+
meta: Omit<ContractSpec<I, O, E>["meta"], "kind">;
|
|
160
|
+
policy: Omit<ContractSpec<I, O, E>["policy"], "idempotent">;
|
|
161
|
+
}) => ContractSpec<I, O, E>;
|
|
162
|
+
/**
|
|
163
|
+
* Helper to define a Query (read-only operation).
|
|
164
|
+
* Sets `kind: 'query'` and forces `idempotent: true`.
|
|
165
|
+
*/
|
|
166
|
+
declare const defineQuery: <I extends AnySchemaModel, O extends AnySchemaModel | ResourceRefDescriptor<boolean>, E extends readonly EmitDecl[] | undefined = undefined>(spec: Omit<ContractSpec<I, O, E>, "meta" | "policy"> & {
|
|
167
|
+
meta: Omit<ContractSpec<I, O, E>["meta"], "kind">;
|
|
168
|
+
policy: Omit<ContractSpec<I, O, E>["policy"], "idempotent">;
|
|
169
|
+
}) => ContractSpec<I, O, E>;
|
|
170
|
+
//#endregion
|
|
171
|
+
export { AnyContractSpec, ContractSpec, EmitDecl, EmitDeclInline, EmitDeclRef, OpKind, TelemetryTrigger, defineCommand, defineQuery, isEmitDeclRef };
|
|
172
|
+
//# sourceMappingURL=spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.d.ts","names":[],"sources":["../src/spec.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAsBA;AAUA;AACA;AAEiB,KArBL,MAAA,GAqBK,SAAgB,GAAA,OAMzB;AAUS,UAlCA,WAAA,CAkCY;EACb,GAAA,EAlCT,SAkCS,CAlCC,cAkCD,CAAA;EACC,IAAA,EAAA,MAAA;;AACS,UAhCT,cAAA,CAgCS;EACX,IAAA,EAAA,MAAA;EASL,OAAA,EAAA,MAAA;EAEK,IAAA,EAAA,MAAA;EAEH,OAAA,EA1CD,cA0CC;;;;;;AA+CG,KAnFH,QAAA,GAAW,WAmFR,GAnFsB,cAmFtB;AAMH,cAxFC,aAwFD,EAAA,CAAA,CAAA,EAxFqB,QAwFrB,EAAA,GAAA,CAAA,IAxFqC,WAwFrC;AAQE,UA9FG,gBAAA,CA8FH;EACA,KAAA,EAAA;IAGJ,IAAA,EAAA,MAAA;IAAW,OAAA,CAAA,EAAA,MAAA;EAmCT,CAAA;EACV,UAAA,CAAA,EAAA,CAAA,IAAA,EAAA;IACA,KAAA,EAAA,OAAA;IAAiB,MAAA,CAAA,EAAA,OAAA;IAFW,KAAA,CAAA,EAAA,OAAA;EAAY,CAAA,EAAA,GA/HlC,MA+HkC,CAAA,MAAA,EAAA,OAAA,CAAA;AAS1C;;;;;;;;AAKa,UAnII,YAmIJ,CAAA,cAlIG,cAkIH,EAAA,eAjII,cAiIJ,GAjIqB,qBAiIrB,CAAA,OAAA,CAAA,EAAA,eAAA,SAhIa,QAgIb,EAAA,GAAA,SAAA,GAAA,SA/HE,QA+HF,EAAA,GAAA,SAAA,CAAA,CAAA;EAAL,IAAA,EAAA;IACoB;IAAG,IAAA,EAAA,MAAA;IAAG;IAAnB,OAAA,EAAA,MAAA;IAAL;IACoB,IAAA,EAxHpB,MAwHoB;IAAG;IAAG,SAAA,EAtHrB,SAsHqB;IAAnB;IAAL,MAAA,EApHA,KAoHA,EAAA;IAEI;IAAG,IAAA,EApHT,GAoHS,EAAA;IAAG;IAAnB,WAAA,EAAA,MAAA;IAAY;IAeF,IAAA,EAAA,MAaX;IAZU;IACA,OAAA,EAAA,MAAA;EAAiB,CAAA;EACR,EAAA,EAAA;IAEK;IAAG,KAAA,EA7HlB,KA6HkB,GAAA,IAAA;IAAG;IAAnB,MAAA,EA3HD,MA2HC;IAAL;IACoB,MAAA,CAAA,EA1Hf,MA0He,CAAA,MAAA,EAAA;MAAG,WAAA,EAAA,MAAA;MAAG,IAAA,CAAA,EAAA,MAAA;MAAnB,OAAA,CAAA,EAAA,MAAA;MAAL,IAAA,EAAA,MAAA;IACoB,CAAA,CAAA;EAAG,CAAA;EAAG,MAAA,EAAA;IAAnB;IAAL,IAAA,EAAA,WAAA,GAAA,MAAA,GAAA,OAAA;IAEI;IAAG,UAAA,CAAA,EAAA,OAAA;IAAG;IAAnB,SAAA,CAAA,EAAA;MAAY,GAAA,EAAA,MAAA;;;;;;;;;;eApGA;;;;;eAKA;;;;;YAMH;;;;;;;cAQE;cACA;;UAGJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmCE,eAAA,GAAkB,aAC5B,gBACA,iBAAiB;;;;;cAON,0BACD,0BACA,iBAAiB,mDACR,0CAEb,KAAK,aAAa,GAAG,GAAG;QACtB,KAAK,aAAa,GAAG,GAAG;UACtB,KAAK,aAAa,GAAG,GAAG;MAEjC,aAAa,GAAG,GAAG;;;;;cAeT,wBACD,0BACA,iBAAiB,mDACR,0CAEb,KAAK,aAAa,GAAG,GAAG;QACtB,KAAK,aAAa,GAAG,GAAG;UACtB,KAAK,aAAa,GAAG,GAAG;MAEjC,aAAa,GAAG,GAAG"}
|
package/dist/spec.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=e=>`ref`in e,t=e=>({...e,meta:{...e.meta,kind:`command`},policy:{...e.policy,idempotent:e.policy?.policy?.idempotent??!1}}),n=e=>({...e,meta:{...e.meta,kind:`query`},policy:{...e.policy,idempotent:!0}});export{t as defineCommand,n as defineQuery,e as isEmitDeclRef};
|
|
2
|
+
//# sourceMappingURL=spec.js.map
|
package/dist/spec.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","names":[],"sources":["../src/spec.ts"],"sourcesContent":["/**\n * ContractSpec: a single source of truth describing one operation (command/query).\n * It carries narrative context for humans/agents AND machine-typed input/output/policy.\n */\nimport type { EventSpec } from './events';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { ResourceRefDescriptor } from './resources';\nimport type { Owner, Stability, Tag } from './ownership';\nimport type { PolicyRef } from './policy/spec';\nimport type { TestSpecRef } from './tests/spec';\n\n/**\n * Distinguishes between state-changing operations (command) and read-only operations (query).\n */\nexport type OpKind = 'command' | 'query';\n\n// preferred: reference a declared event\nexport interface EmitDeclRef {\n ref: EventSpec<AnySchemaModel>;\n when: string;\n}\n// inline (fallback)\nexport interface EmitDeclInline {\n name: string;\n version: number;\n when: string;\n payload: AnySchemaModel;\n}\n/**\n * Declaration of an event that an operation may emit.\n * Can be a reference to an `EventSpec` or an inline definition.\n */\nexport type EmitDecl = EmitDeclRef | EmitDeclInline;\nexport const isEmitDeclRef = (e: EmitDecl): e is EmitDeclRef => 'ref' in e;\n\nexport interface TelemetryTrigger {\n event: { name: string; version?: number };\n properties?: (args: {\n input: unknown;\n output?: unknown;\n error?: unknown;\n }) => Record<string, unknown>;\n}\n\n/**\n * The core specification interface for any operation (Command or Query).\n *\n * @template Input - The Zod-backed schema model for the input payload.\n * @template Output - The Zod-backed schema model for the output payload, or a resource reference.\n * @template Events - Tuple of events that this operation may emit.\n */\nexport interface ContractSpec<\n Input extends AnySchemaModel,\n Output extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n Events extends readonly EmitDecl[] | undefined =\n | readonly EmitDecl[]\n | undefined,\n> {\n meta: {\n /** Fully-qualified op name (e.g., \"sigil.beginSignup\") */\n name: string;\n /** Breaking changes => bump version */\n version: number;\n /** \"command\" changes state; \"query\" is read-only/idempotent */\n kind: OpKind;\n /** Lifecycle marker for comms & tooling */\n stability: Stability;\n /** Owners for CODEOWNERS / on-call / approvals */\n owners: Owner[];\n /** Search tags, grouping, docs navigation */\n tags: Tag[];\n /** Short human-friendly summary */\n description: string;\n /** Business goal: why this exists */\n goal: string;\n /** Background, constraints, scope edges (feeds docs & LLM context) */\n context: string;\n };\n\n io: {\n /** Zod schema for input payload */\n input: Input | null;\n /** Zod schema for output payload */\n output: Output;\n /** Named, typed errors this op may throw (optional) */\n errors?: Record<\n string,\n {\n description: string;\n http?: number; // suggested HTTP status if surfaced over REST\n gqlCode?: string; // suggested GraphQL error code\n when: string; // human-readable condition\n }\n >;\n };\n\n policy: {\n /** Minimal auth category allowed to call this op */\n auth: 'anonymous' | 'user' | 'admin';\n /** Idempotency hint. Queries default true; commands default false. */\n idempotent?: boolean;\n /** Soft rate limit suggestion; adapter enforces via limiter */\n rateLimit?: { rpm: number; key: 'user' | 'org' | 'global' };\n /** Feature flags that must be ON for this op to run */\n flags?: string[];\n /** Whether a human must approve before action (e.g., risky commands) */\n escalate?: 'human_review' | null;\n /** JSONPath-like pointers to redact from logs/prompts */\n pii?: string[];\n /** Referenced policy specs governing access */\n policies?: PolicyRef[];\n /** Field-level overrides referencing policy specs */\n fieldPolicies?: {\n field: string;\n actions: ('read' | 'write')[];\n policy?: PolicyRef;\n }[];\n };\n\n sideEffects?: {\n /** Declared events this op may emit; runtime will guard against others */\n emits?: Events;\n /** Analytics intents (names); the service decides the sink */\n analytics?: string[];\n /** Audit intents (labels); the service decides storage */\n audit?: string[];\n };\n\n telemetry?: {\n success?: TelemetryTrigger;\n failure?: TelemetryTrigger;\n };\n\n tests?: TestSpecRef[];\n\n transport?: {\n rest?: {\n /** Override HTTP method (default: POST for commands, GET for queries) */\n method?: 'GET' | 'POST';\n /** Override path (default derived from meta.name/version) */\n path?: string;\n };\n gql?: {\n /** Override field name (default: dots→underscores + _vN) */\n field?: string;\n returns?: string;\n // byIdField?: string;\n // resource?: string;\n };\n mcp?: {\n /** Override tool identifier (default: \"<name>.v<version>\") */\n toolName?: string;\n };\n };\n\n acceptance?: {\n /** Gherkin-lite scenarios for docs & auto tests */\n scenarios?: {\n name: string;\n given: string[];\n when: string[];\n then: string[];\n }[];\n /** Request/response examples (used for docs & snapshot tests) */\n examples?: { name: string; input: unknown; output: unknown }[];\n };\n}\n\nexport type AnyContractSpec = ContractSpec<\n AnySchemaModel,\n AnySchemaModel | ResourceRefDescriptor<boolean>\n>;\n\n/**\n * Helper to define a Command (write operation).\n * Sets `kind: 'command'` and defaults `idempotent: false`.\n */\nexport const defineCommand = <\n I extends AnySchemaModel,\n O extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n E extends readonly EmitDecl[] | undefined = undefined,\n>(\n spec: Omit<ContractSpec<I, O, E>, 'meta' | 'policy'> & {\n meta: Omit<ContractSpec<I, O, E>['meta'], 'kind'>;\n policy: Omit<ContractSpec<I, O, E>['policy'], 'idempotent'>;\n }\n): ContractSpec<I, O, E> => ({\n ...spec,\n meta: { ...spec.meta, kind: 'command' as const },\n policy: {\n ...spec.policy,\n idempotent:\n (spec.policy as never as ContractSpec<never, never, never>)?.['policy']\n ?.idempotent ?? false,\n },\n});\n\n/**\n * Helper to define a Query (read-only operation).\n * Sets `kind: 'query'` and forces `idempotent: true`.\n */\nexport const defineQuery = <\n I extends AnySchemaModel,\n O extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n E extends readonly EmitDecl[] | undefined = undefined,\n>(\n spec: Omit<ContractSpec<I, O, E>, 'meta' | 'policy'> & {\n meta: Omit<ContractSpec<I, O, E>['meta'], 'kind'>;\n policy: Omit<ContractSpec<I, O, E>['policy'], 'idempotent'>;\n }\n): ContractSpec<I, O, E> => ({\n ...spec,\n meta: { ...spec.meta, kind: 'query' as const },\n policy: { ...spec.policy, idempotent: true },\n});\n"],"mappings":"AAiCA,MAAa,EAAiB,GAAkC,QAAS,EAgJ5D,EAKX,IAI2B,CAC3B,GAAG,EACH,KAAM,CAAE,GAAG,EAAK,KAAM,KAAM,UAAoB,CAChD,OAAQ,CACN,GAAG,EAAK,OACR,WACG,EAAK,QAAwD,QAC1D,YAAc,GACrB,CACF,EAMY,EAKX,IAI2B,CAC3B,GAAG,EACH,KAAM,CAAE,GAAG,EAAK,KAAM,KAAM,QAAkB,CAC9C,OAAQ,CAAE,GAAG,EAAK,OAAQ,WAAY,GAAM,CAC7C"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { TelemetryAnomalyDetectionConfig } from "./spec.js";
|
|
2
|
+
import { TelemetryDispatch } from "./tracker.js";
|
|
3
|
+
|
|
4
|
+
//#region src/telemetry/anomaly.d.ts
|
|
5
|
+
interface TelemetryAnomalyEvent {
|
|
6
|
+
dispatch: TelemetryDispatch;
|
|
7
|
+
threshold: TelemetryAnomalyDetectionConfig;
|
|
8
|
+
metric: string;
|
|
9
|
+
value: number | undefined;
|
|
10
|
+
type: 'min' | 'max';
|
|
11
|
+
}
|
|
12
|
+
interface TelemetryAnomalyMonitorOptions {
|
|
13
|
+
onAnomaly?: (event: TelemetryAnomalyEvent) => void;
|
|
14
|
+
now?: () => Date;
|
|
15
|
+
}
|
|
16
|
+
declare class TelemetryAnomalyMonitor {
|
|
17
|
+
private readonly onAnomaly?;
|
|
18
|
+
private readonly now;
|
|
19
|
+
private readonly samples;
|
|
20
|
+
constructor(options?: TelemetryAnomalyMonitorOptions);
|
|
21
|
+
observe(dispatch: TelemetryDispatch): void;
|
|
22
|
+
private extractMetric;
|
|
23
|
+
private emit;
|
|
24
|
+
reset(): void;
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { TelemetryAnomalyEvent, TelemetryAnomalyMonitor, TelemetryAnomalyMonitorOptions };
|
|
28
|
+
//# sourceMappingURL=anomaly.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anomaly.d.ts","names":[],"sources":["../../src/telemetry/anomaly.ts"],"sourcesContent":[],"mappings":";;;;UAGiB,qBAAA;YACL;EADK,SAAA,EAEJ,+BADD;EAOK,MAAA,EAAA,MAAA;EAKJ,KAAA,EAAA,MAAA,GAAA,SAAA;;;UALI,8BAAA;sBACK;cACR;;cAGD,uBAAA;;;;wBAKU;oBAKH"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=class{onAnomaly;now;samples=new Map;constructor(e={}){this.onAnomaly=e.onAnomaly,this.now=e.now??(()=>new Date)}observe(e){let t=e.definition.anomalyDetection;if(!t?.enabled||!t.thresholds?.length)return;let n=`${e.name}.v${e.version}`,r=(this.samples.get(n)??0)+1;if(this.samples.set(n,r),!(typeof t.minimumSample==`number`&&r<t.minimumSample))for(let n of t.thresholds){let r=this.extractMetric(e,n.metric);typeof r==`number`&&(typeof n.min==`number`&&r<n.min&&this.emit(e,t,n.metric,r,`min`),typeof n.max==`number`&&r>n.max&&this.emit(e,t,n.metric,r,`max`))}}extractMetric(e,t){let n=e.properties[t];if(typeof n==`number`)return n;if(typeof n==`object`&&n&&`value`in n){let e=n.value;return typeof e==`number`?e:void 0}}emit(e,t,n,r,i){this.onAnomaly?.({dispatch:e,threshold:t,metric:n,value:r,type:i})}reset(){this.samples.clear()}};export{e as TelemetryAnomalyMonitor};
|
|
2
|
+
//# sourceMappingURL=anomaly.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anomaly.js","names":[],"sources":["../../src/telemetry/anomaly.ts"],"sourcesContent":["import type { TelemetryDispatch } from './tracker';\nimport type { TelemetryAnomalyDetectionConfig } from './spec';\n\nexport interface TelemetryAnomalyEvent {\n dispatch: TelemetryDispatch;\n threshold: TelemetryAnomalyDetectionConfig;\n metric: string;\n value: number | undefined;\n type: 'min' | 'max';\n}\n\nexport interface TelemetryAnomalyMonitorOptions {\n onAnomaly?: (event: TelemetryAnomalyEvent) => void;\n now?: () => Date;\n}\n\nexport class TelemetryAnomalyMonitor {\n private readonly onAnomaly?: (event: TelemetryAnomalyEvent) => void;\n private readonly now: () => Date;\n private readonly samples = new Map<string, number>();\n\n constructor(options: TelemetryAnomalyMonitorOptions = {}) {\n this.onAnomaly = options.onAnomaly;\n this.now = options.now ?? (() => new Date());\n }\n\n observe(dispatch: TelemetryDispatch) {\n const anomalyConfig = dispatch.definition.anomalyDetection;\n if (!anomalyConfig?.enabled) return;\n if (!anomalyConfig.thresholds?.length) return;\n\n const eventKey = `${dispatch.name}.v${dispatch.version}`;\n const count = this.samples.get(eventKey) ?? 0;\n const newCount = count + 1;\n this.samples.set(eventKey, newCount);\n\n if (\n typeof anomalyConfig.minimumSample === 'number' &&\n newCount < anomalyConfig.minimumSample\n ) {\n return;\n }\n\n for (const threshold of anomalyConfig.thresholds) {\n const value = this.extractMetric(dispatch, threshold.metric);\n if (typeof value !== 'number') continue;\n if (typeof threshold.min === 'number' && value < threshold.min) {\n this.emit(dispatch, anomalyConfig, threshold.metric, value, 'min');\n }\n if (typeof threshold.max === 'number' && value > threshold.max) {\n this.emit(dispatch, anomalyConfig, threshold.metric, value, 'max');\n }\n }\n }\n\n private extractMetric(dispatch: TelemetryDispatch, metric: string) {\n const value = dispatch.properties[metric];\n if (typeof value === 'number') return value;\n if (typeof value === 'object' && value !== null && 'value' in value) {\n const maybeNumber = (value as Record<string, unknown>).value;\n return typeof maybeNumber === 'number' ? maybeNumber : undefined;\n }\n return undefined;\n }\n\n private emit(\n dispatch: TelemetryDispatch,\n threshold: TelemetryAnomalyDetectionConfig,\n metric: string,\n value: number,\n type: 'min' | 'max'\n ) {\n this.onAnomaly?.({\n dispatch,\n threshold,\n metric,\n value,\n type,\n });\n }\n\n reset() {\n this.samples.clear();\n }\n}\n\n"],"mappings":"AAgBA,IAAa,EAAb,KAAqC,CACnC,UACA,IACA,QAA2B,IAAI,IAE/B,YAAY,EAA0C,EAAE,CAAE,CACxD,KAAK,UAAY,EAAQ,UACzB,KAAK,IAAM,EAAQ,UAAc,IAAI,MAGvC,QAAQ,EAA6B,CACnC,IAAM,EAAgB,EAAS,WAAW,iBAE1C,GADI,CAAC,GAAe,SAChB,CAAC,EAAc,YAAY,OAAQ,OAEvC,IAAM,EAAW,GAAG,EAAS,KAAK,IAAI,EAAS,UAEzC,GADQ,KAAK,QAAQ,IAAI,EAAS,EAAI,GACnB,EACzB,QAAK,QAAQ,IAAI,EAAU,EAAS,CAGlC,SAAO,EAAc,eAAkB,UACvC,EAAW,EAAc,eAK3B,IAAK,IAAM,KAAa,EAAc,WAAY,CAChD,IAAM,EAAQ,KAAK,cAAc,EAAU,EAAU,OAAO,CACxD,OAAO,GAAU,WACjB,OAAO,EAAU,KAAQ,UAAY,EAAQ,EAAU,KACzD,KAAK,KAAK,EAAU,EAAe,EAAU,OAAQ,EAAO,MAAM,CAEhE,OAAO,EAAU,KAAQ,UAAY,EAAQ,EAAU,KACzD,KAAK,KAAK,EAAU,EAAe,EAAU,OAAQ,EAAO,MAAM,GAKxE,cAAsB,EAA6B,EAAgB,CACjE,IAAM,EAAQ,EAAS,WAAW,GAClC,GAAI,OAAO,GAAU,SAAU,OAAO,EACtC,GAAI,OAAO,GAAU,UAAY,GAAkB,UAAW,EAAO,CACnE,IAAM,EAAe,EAAkC,MACvD,OAAO,OAAO,GAAgB,SAAW,EAAc,IAAA,IAK3D,KACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,YAAY,CACf,WACA,YACA,SACA,QACA,OACD,CAAC,CAGJ,OAAQ,CACN,KAAK,QAAQ,OAAO"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { TelemetryAnomalyAction, TelemetryAnomalyDetectionConfig, TelemetryAnomalyThreshold, TelemetryConfig, TelemetryEventDef, TelemetryMeta, TelemetryPrivacyLevel, TelemetryPropertyDef, TelemetryProviderConfig, TelemetryRegistry, TelemetryRetentionConfig, TelemetrySamplingConfig, TelemetrySpec, makeTelemetryKey } from "./spec.js";
|
|
2
|
+
import { TelemetryAnomalyEvent, TelemetryAnomalyMonitor, TelemetryAnomalyMonitorOptions } from "./anomaly.js";
|
|
3
|
+
import { RuntimeTelemetryProvider, TelemetryDispatch, TelemetryEventContext, TelemetryTracker, TelemetryTrackerOptions } from "./tracker.js";
|
|
4
|
+
export { RuntimeTelemetryProvider, TelemetryAnomalyAction, TelemetryAnomalyDetectionConfig, TelemetryAnomalyEvent, TelemetryAnomalyMonitor, TelemetryAnomalyMonitorOptions, TelemetryAnomalyThreshold, TelemetryConfig, TelemetryDispatch, TelemetryEventContext, TelemetryEventDef, TelemetryMeta, TelemetryPrivacyLevel, TelemetryPropertyDef, TelemetryProviderConfig, TelemetryRegistry, TelemetryRetentionConfig, TelemetrySamplingConfig, TelemetrySpec, TelemetryTracker, TelemetryTrackerOptions, makeTelemetryKey };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{TelemetryRegistry as e,makeTelemetryKey as t}from"./spec.js";import{TelemetryTracker as n}from"./tracker.js";import{TelemetryAnomalyMonitor as r}from"./anomaly.js";export{r as TelemetryAnomalyMonitor,e as TelemetryRegistry,n as TelemetryTracker,t as makeTelemetryKey};
|