@lssm/lib.contracts 1.7.4 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/README.md +62 -325
  2. package/dist/app-config/contracts.d.ts +50 -50
  3. package/dist/app-config/contracts.d.ts.map +1 -1
  4. package/dist/app-config/contracts.js.map +1 -1
  5. package/dist/app-config/events.d.ts +27 -27
  6. package/dist/app-config/events.d.ts.map +1 -1
  7. package/dist/app-config/events.js.map +1 -1
  8. package/dist/app-config/lifecycle-contracts.d.ts +80 -80
  9. package/dist/app-config/lifecycle-contracts.d.ts.map +1 -1
  10. package/dist/app-config/lifecycle-contracts.js.map +1 -1
  11. package/dist/app-config/runtime.d.ts.map +1 -1
  12. package/dist/app-config/runtime.js.map +1 -1
  13. package/dist/app-config/spec.d.ts +2 -2
  14. package/dist/app-config/spec.d.ts.map +1 -1
  15. package/dist/app-config/spec.js.map +1 -1
  16. package/dist/app-config/validation.d.ts.map +1 -1
  17. package/dist/app-config/validation.js.map +1 -1
  18. package/dist/capabilities/openbanking.d.ts.map +1 -1
  19. package/dist/capabilities/openbanking.js.map +1 -1
  20. package/dist/capabilities.d.ts +2 -1
  21. package/dist/capabilities.d.ts.map +1 -1
  22. package/dist/capabilities.js +1 -1
  23. package/dist/capabilities.js.map +1 -1
  24. package/dist/data-views/query-generator.d.ts +40 -0
  25. package/dist/data-views/query-generator.d.ts.map +1 -0
  26. package/dist/data-views/query-generator.js +2 -0
  27. package/dist/data-views/query-generator.js.map +1 -0
  28. package/dist/data-views/runtime.d.ts +27 -0
  29. package/dist/data-views/runtime.d.ts.map +1 -0
  30. package/dist/data-views/runtime.js +2 -0
  31. package/dist/data-views/runtime.js.map +1 -0
  32. package/dist/data-views.js.map +1 -1
  33. package/dist/experiments/evaluator.d.ts.map +1 -1
  34. package/dist/experiments/evaluator.js.map +1 -1
  35. package/dist/experiments/spec-resolver.d.ts +17 -0
  36. package/dist/experiments/spec-resolver.d.ts.map +1 -0
  37. package/dist/experiments/spec-resolver.js +0 -0
  38. package/dist/experiments/spec.js.map +1 -1
  39. package/dist/index.d.ts +4 -3
  40. package/dist/index.js +1 -1
  41. package/dist/install.d.ts.map +1 -1
  42. package/dist/integrations/connection.d.ts.map +1 -1
  43. package/dist/integrations/contracts.d.ts.map +1 -1
  44. package/dist/integrations/contracts.js.map +1 -1
  45. package/dist/integrations/health.d.ts.map +1 -1
  46. package/dist/integrations/health.js.map +1 -1
  47. package/dist/integrations/openbanking/contracts/accounts.d.ts +66 -66
  48. package/dist/integrations/openbanking/contracts/accounts.d.ts.map +1 -1
  49. package/dist/integrations/openbanking/contracts/accounts.js.map +1 -1
  50. package/dist/integrations/openbanking/contracts/balances.d.ts +34 -34
  51. package/dist/integrations/openbanking/contracts/balances.d.ts.map +1 -1
  52. package/dist/integrations/openbanking/contracts/balances.js.map +1 -1
  53. package/dist/integrations/openbanking/contracts/index.js.map +1 -1
  54. package/dist/integrations/openbanking/contracts/transactions.d.ts +48 -48
  55. package/dist/integrations/openbanking/contracts/transactions.d.ts.map +1 -1
  56. package/dist/integrations/openbanking/contracts/transactions.js.map +1 -1
  57. package/dist/integrations/openbanking/guards.js.map +1 -1
  58. package/dist/integrations/openbanking/models.d.ts +55 -55
  59. package/dist/integrations/openbanking/models.d.ts.map +1 -1
  60. package/dist/integrations/openbanking/models.js.map +1 -1
  61. package/dist/integrations/openbanking/telemetry.js.map +1 -1
  62. package/dist/integrations/providers/elevenlabs.d.ts.map +1 -1
  63. package/dist/integrations/providers/elevenlabs.js.map +1 -1
  64. package/dist/integrations/providers/gcs-storage.js.map +1 -1
  65. package/dist/integrations/providers/gmail.d.ts.map +1 -1
  66. package/dist/integrations/providers/gmail.js.map +1 -1
  67. package/dist/integrations/providers/google-calendar.js.map +1 -1
  68. package/dist/integrations/providers/impls/elevenlabs-voice.js.map +1 -1
  69. package/dist/integrations/providers/impls/gcs-storage.js.map +1 -1
  70. package/dist/integrations/providers/impls/gmail-inbound.js.map +1 -1
  71. package/dist/integrations/providers/impls/gmail-outbound.d.ts.map +1 -1
  72. package/dist/integrations/providers/impls/gmail-outbound.js.map +1 -1
  73. package/dist/integrations/providers/impls/google-calendar.d.ts.map +1 -1
  74. package/dist/integrations/providers/impls/google-calendar.js.map +1 -1
  75. package/dist/integrations/providers/impls/mistral-embedding.js.map +1 -1
  76. package/dist/integrations/providers/impls/mistral-llm.js.map +1 -1
  77. package/dist/integrations/providers/impls/postmark-email.js.map +1 -1
  78. package/dist/integrations/providers/impls/powens-client.d.ts.map +1 -1
  79. package/dist/integrations/providers/impls/powens-client.js.map +1 -1
  80. package/dist/integrations/providers/impls/powens-openbanking.d.ts.map +1 -1
  81. package/dist/integrations/providers/impls/powens-openbanking.js.map +1 -1
  82. package/dist/integrations/providers/impls/provider-factory.d.ts.map +1 -1
  83. package/dist/integrations/providers/impls/provider-factory.js.map +1 -1
  84. package/dist/integrations/providers/impls/qdrant-vector.d.ts.map +1 -1
  85. package/dist/integrations/providers/impls/qdrant-vector.js.map +1 -1
  86. package/dist/integrations/providers/impls/stripe-payments.d.ts.map +1 -1
  87. package/dist/integrations/providers/impls/stripe-payments.js.map +1 -1
  88. package/dist/integrations/providers/impls/twilio-sms.js.map +1 -1
  89. package/dist/integrations/providers/llm.d.ts.map +1 -1
  90. package/dist/integrations/providers/mistral.d.ts.map +1 -1
  91. package/dist/integrations/providers/mistral.js.map +1 -1
  92. package/dist/integrations/providers/payments.d.ts.map +1 -1
  93. package/dist/integrations/providers/postmark.d.ts.map +1 -1
  94. package/dist/integrations/providers/postmark.js.map +1 -1
  95. package/dist/integrations/providers/powens.js.map +1 -1
  96. package/dist/integrations/providers/qdrant.d.ts.map +1 -1
  97. package/dist/integrations/providers/qdrant.js.map +1 -1
  98. package/dist/integrations/providers/stripe.js.map +1 -1
  99. package/dist/integrations/providers/twilio-sms.js.map +1 -1
  100. package/dist/integrations/runtime.d.ts.map +1 -1
  101. package/dist/integrations/runtime.js.map +1 -1
  102. package/dist/integrations/secrets/env-secret-provider.js.map +1 -1
  103. package/dist/integrations/secrets/gcp-secret-manager.d.ts.map +1 -1
  104. package/dist/integrations/secrets/gcp-secret-manager.js.map +1 -1
  105. package/dist/integrations/secrets/manager.d.ts +2 -2
  106. package/dist/integrations/secrets/manager.d.ts.map +1 -1
  107. package/dist/integrations/secrets/manager.js.map +1 -1
  108. package/dist/integrations/secrets/provider.js.map +1 -1
  109. package/dist/integrations/spec.d.ts.map +1 -1
  110. package/dist/integrations/spec.js.map +1 -1
  111. package/dist/jobs/gcp-cloud-tasks.js.map +1 -1
  112. package/dist/jobs/gcp-pubsub.d.ts.map +1 -1
  113. package/dist/jobs/gcp-pubsub.js.map +1 -1
  114. package/dist/jobs/handlers/gmail-sync-handler.js.map +1 -1
  115. package/dist/jobs/handlers/storage-document-handler.js.map +1 -1
  116. package/dist/jobs/memory-queue.d.ts.map +1 -1
  117. package/dist/jobs/memory-queue.js.map +1 -1
  118. package/dist/jobs/queue.d.ts.map +1 -1
  119. package/dist/knowledge/contracts.d.ts +66 -66
  120. package/dist/knowledge/contracts.d.ts.map +1 -1
  121. package/dist/knowledge/contracts.js.map +1 -1
  122. package/dist/knowledge/ingestion/document-processor.js.map +1 -1
  123. package/dist/knowledge/ingestion/embedding-service.d.ts.map +1 -1
  124. package/dist/knowledge/ingestion/embedding-service.js.map +1 -1
  125. package/dist/knowledge/ingestion/gmail-adapter.d.ts.map +1 -1
  126. package/dist/knowledge/ingestion/gmail-adapter.js.map +1 -1
  127. package/dist/knowledge/ingestion/storage-adapter.js.map +1 -1
  128. package/dist/knowledge/ingestion/vector-indexer.js.map +1 -1
  129. package/dist/knowledge/query/service.d.ts +2 -2
  130. package/dist/knowledge/query/service.d.ts.map +1 -1
  131. package/dist/knowledge/query/service.js.map +1 -1
  132. package/dist/knowledge/runtime.d.ts.map +1 -1
  133. package/dist/knowledge/runtime.js.map +1 -1
  134. package/dist/knowledge/spaces/email-threads.js.map +1 -1
  135. package/dist/knowledge/spaces/financial-docs.js.map +1 -1
  136. package/dist/knowledge/spaces/financial-overview.js.map +1 -1
  137. package/dist/knowledge/spaces/product-canon.js.map +1 -1
  138. package/dist/knowledge/spaces/support-faq.js.map +1 -1
  139. package/dist/knowledge/spaces/uploaded-docs.js.map +1 -1
  140. package/dist/knowledge/spec.js.map +1 -1
  141. package/dist/migrations.d.ts.map +1 -1
  142. package/dist/migrations.js.map +1 -1
  143. package/dist/onboarding-base.d.ts +29 -29
  144. package/dist/onboarding-base.d.ts.map +1 -1
  145. package/dist/policy/engine.js.map +1 -1
  146. package/dist/policy/opa-adapter.d.ts.map +1 -1
  147. package/dist/policy/opa-adapter.js.map +1 -1
  148. package/dist/policy/spec.d.ts.map +1 -1
  149. package/dist/policy/spec.js.map +1 -1
  150. package/dist/regenerator/executor.d.ts.map +1 -1
  151. package/dist/regenerator/executor.js.map +1 -1
  152. package/dist/regenerator/service.d.ts.map +1 -1
  153. package/dist/regenerator/service.js.map +1 -1
  154. package/dist/regenerator/sinks.d.ts.map +1 -1
  155. package/dist/regenerator/sinks.js.map +1 -1
  156. package/dist/regenerator/types.d.ts.map +1 -1
  157. package/dist/regenerator/utils.js.map +1 -1
  158. package/dist/registry.d.ts +36 -9
  159. package/dist/registry.d.ts.map +1 -1
  160. package/dist/registry.js +1 -1
  161. package/dist/registry.js.map +1 -1
  162. package/dist/resources.d.ts.map +1 -1
  163. package/dist/schema/dist/FieldType.js +1 -1
  164. package/dist/schema/dist/FieldType.js.map +1 -1
  165. package/dist/schema/dist/ScalarTypeEnum.js +1 -1
  166. package/dist/schema/dist/ScalarTypeEnum.js.map +1 -1
  167. package/dist/schema/dist/index.js +1 -1
  168. package/dist/server/graphql-pothos.d.ts +15 -2
  169. package/dist/server/graphql-pothos.d.ts.map +1 -1
  170. package/dist/server/graphql-pothos.js.map +1 -1
  171. package/dist/server/provider-mcp.d.ts +22 -4
  172. package/dist/server/provider-mcp.d.ts.map +1 -1
  173. package/dist/server/provider-mcp.js.map +1 -1
  174. package/dist/server/rest-next-app.d.ts +23 -3
  175. package/dist/server/rest-next-app.d.ts.map +1 -1
  176. package/dist/server/rest-next-app.js.map +1 -1
  177. package/dist/spec.d.ts +22 -0
  178. package/dist/spec.d.ts.map +1 -1
  179. package/dist/spec.js.map +1 -1
  180. package/dist/telemetry/anomaly.js.map +1 -1
  181. package/dist/telemetry/spec.d.ts.map +1 -1
  182. package/dist/telemetry/spec.js.map +1 -1
  183. package/dist/telemetry/tracker.d.ts.map +1 -1
  184. package/dist/telemetry/tracker.js.map +1 -1
  185. package/dist/tests/runner.js.map +1 -1
  186. package/dist/tests/spec.js.map +1 -1
  187. package/dist/themes.d.ts.map +1 -1
  188. package/dist/themes.js.map +1 -1
  189. package/dist/types/all.d.ts +2 -2
  190. package/dist/types.d.ts +3 -0
  191. package/dist/types.d.ts.map +1 -1
  192. package/dist/workflow/adapters/db-adapter.d.ts +30 -10
  193. package/dist/workflow/adapters/db-adapter.d.ts.map +1 -1
  194. package/dist/workflow/adapters/db-adapter.js +1 -1
  195. package/dist/workflow/adapters/db-adapter.js.map +1 -1
  196. package/dist/workflow/adapters/file-adapter.js.map +1 -1
  197. package/dist/workflow/adapters/index.d.ts +2 -2
  198. package/dist/workflow/adapters/index.js +1 -1
  199. package/dist/workflow/adapters/memory-store.d.ts.map +1 -1
  200. package/dist/workflow/adapters/memory-store.js.map +1 -1
  201. package/dist/workflow/expression.js.map +1 -1
  202. package/dist/workflow/index.d.ts +2 -2
  203. package/dist/workflow/index.js +1 -1
  204. package/dist/workflow/runner.d.ts +1 -0
  205. package/dist/workflow/runner.d.ts.map +1 -1
  206. package/dist/workflow/runner.js +1 -1
  207. package/dist/workflow/runner.js.map +1 -1
  208. package/dist/workflow/sla-monitor.d.ts +21 -0
  209. package/dist/workflow/sla-monitor.d.ts.map +1 -0
  210. package/dist/workflow/sla-monitor.js +2 -0
  211. package/dist/workflow/sla-monitor.js.map +1 -0
  212. package/dist/workflow/spec.js.map +1 -1
  213. package/dist/workflow/state.d.ts +1 -0
  214. package/dist/workflow/state.d.ts.map +1 -1
  215. package/dist/workflow/validation.d.ts.map +1 -1
  216. package/dist/workflow/validation.js.map +1 -1
  217. package/package.json +13 -9
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../src/regenerator/utils.ts"],"sourcesContent":["import type {\n BehaviorSignal,\n BehaviorSignalEnvelope,\n ErrorSignal,\n ErrorSignalEnvelope,\n TelemetrySignal,\n TelemetrySignalEnvelope,\n} from './types';\n\ntype Clock = () => Date;\n\nexport function telemetryToEnvelope(\n contextId: string,\n signal: TelemetrySignal,\n clock: Clock\n): TelemetrySignalEnvelope {\n return {\n type: 'telemetry',\n contextId,\n signal: normalizeTelemetryDates(signal, clock),\n };\n}\n\nexport function errorToEnvelope(\n contextId: string,\n signal: ErrorSignal,\n clock: Clock\n): ErrorSignalEnvelope {\n return {\n type: 'error',\n contextId,\n signal: normalizeErrorDates(signal, clock),\n };\n}\n\nexport function behaviorToEnvelope(\n contextId: string,\n signal: BehaviorSignal,\n clock: Clock\n): BehaviorSignalEnvelope {\n return {\n type: 'behavior',\n contextId,\n signal: normalizeBehaviorDates(signal, clock),\n };\n}\n\nfunction normalizeTelemetryDates(\n signal: TelemetrySignal,\n clock: Clock\n): TelemetrySignal {\n return {\n ...signal,\n windowStart: toDate(signal.windowStart, clock),\n windowEnd: toDate(signal.windowEnd, clock),\n };\n}\n\nfunction normalizeErrorDates(\n signal: ErrorSignal,\n clock: Clock\n): ErrorSignal {\n return {\n ...signal,\n occurredAt: toDate(signal.occurredAt, clock),\n };\n}\n\nfunction normalizeBehaviorDates(\n signal: BehaviorSignal,\n clock: Clock\n): BehaviorSignal {\n return {\n ...signal,\n windowStart: toDate(signal.windowStart, clock),\n windowEnd: toDate(signal.windowEnd, clock),\n };\n}\n\nfunction toDate(value: Date | string, clock: Clock): Date {\n if (value instanceof Date) return value;\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return clock();\n }\n return parsed;\n}\n\n\n\n\n\n\n"],"mappings":"AAWA,SAAgB,EACd,EACA,EACA,EACyB,CACzB,MAAO,CACL,KAAM,YACN,YACA,OAAQ,EAAwB,EAAQ,EAAM,CAC/C,CAGH,SAAgB,EACd,EACA,EACA,EACqB,CACrB,MAAO,CACL,KAAM,QACN,YACA,OAAQ,EAAoB,EAAQ,EAAM,CAC3C,CAGH,SAAgB,EACd,EACA,EACA,EACwB,CACxB,MAAO,CACL,KAAM,WACN,YACA,OAAQ,EAAuB,EAAQ,EAAM,CAC9C,CAGH,SAAS,EACP,EACA,EACiB,CACjB,MAAO,CACL,GAAG,EACH,YAAa,EAAO,EAAO,YAAa,EAAM,CAC9C,UAAW,EAAO,EAAO,UAAW,EAAM,CAC3C,CAGH,SAAS,EACP,EACA,EACa,CACb,MAAO,CACL,GAAG,EACH,WAAY,EAAO,EAAO,WAAY,EAAM,CAC7C,CAGH,SAAS,EACP,EACA,EACgB,CAChB,MAAO,CACL,GAAG,EACH,YAAa,EAAO,EAAO,YAAa,EAAM,CAC9C,UAAW,EAAO,EAAO,UAAW,EAAM,CAC3C,CAGH,SAAS,EAAO,EAAsB,EAAoB,CACxD,GAAI,aAAiB,KAAM,OAAO,EAClC,IAAM,EAAS,IAAI,KAAK,EAAM,CAI9B,OAHI,OAAO,MAAM,EAAO,SAAS,CAAC,CACzB,GAAO,CAET"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../src/regenerator/utils.ts"],"sourcesContent":["import type {\n BehaviorSignal,\n BehaviorSignalEnvelope,\n ErrorSignal,\n ErrorSignalEnvelope,\n TelemetrySignal,\n TelemetrySignalEnvelope,\n} from './types';\n\ntype Clock = () => Date;\n\nexport function telemetryToEnvelope(\n contextId: string,\n signal: TelemetrySignal,\n clock: Clock\n): TelemetrySignalEnvelope {\n return {\n type: 'telemetry',\n contextId,\n signal: normalizeTelemetryDates(signal, clock),\n };\n}\n\nexport function errorToEnvelope(\n contextId: string,\n signal: ErrorSignal,\n clock: Clock\n): ErrorSignalEnvelope {\n return {\n type: 'error',\n contextId,\n signal: normalizeErrorDates(signal, clock),\n };\n}\n\nexport function behaviorToEnvelope(\n contextId: string,\n signal: BehaviorSignal,\n clock: Clock\n): BehaviorSignalEnvelope {\n return {\n type: 'behavior',\n contextId,\n signal: normalizeBehaviorDates(signal, clock),\n };\n}\n\nfunction normalizeTelemetryDates(\n signal: TelemetrySignal,\n clock: Clock\n): TelemetrySignal {\n return {\n ...signal,\n windowStart: toDate(signal.windowStart, clock),\n windowEnd: toDate(signal.windowEnd, clock),\n };\n}\n\nfunction normalizeErrorDates(signal: ErrorSignal, clock: Clock): ErrorSignal {\n return {\n ...signal,\n occurredAt: toDate(signal.occurredAt, clock),\n };\n}\n\nfunction normalizeBehaviorDates(\n signal: BehaviorSignal,\n clock: Clock\n): BehaviorSignal {\n return {\n ...signal,\n windowStart: toDate(signal.windowStart, clock),\n windowEnd: toDate(signal.windowEnd, clock),\n };\n}\n\nfunction toDate(value: Date | string, clock: Clock): Date {\n if (value instanceof Date) return value;\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return clock();\n }\n return parsed;\n}\n"],"mappings":"AAWA,SAAgB,EACd,EACA,EACA,EACyB,CACzB,MAAO,CACL,KAAM,YACN,YACA,OAAQ,EAAwB,EAAQ,EAAM,CAC/C,CAGH,SAAgB,EACd,EACA,EACA,EACqB,CACrB,MAAO,CACL,KAAM,QACN,YACA,OAAQ,EAAoB,EAAQ,EAAM,CAC3C,CAGH,SAAgB,EACd,EACA,EACA,EACwB,CACxB,MAAO,CACL,KAAM,WACN,YACA,OAAQ,EAAuB,EAAQ,EAAM,CAC9C,CAGH,SAAS,EACP,EACA,EACiB,CACjB,MAAO,CACL,GAAG,EACH,YAAa,EAAO,EAAO,YAAa,EAAM,CAC9C,UAAW,EAAO,EAAO,UAAW,EAAM,CAC3C,CAGH,SAAS,EAAoB,EAAqB,EAA2B,CAC3E,MAAO,CACL,GAAG,EACH,WAAY,EAAO,EAAO,WAAY,EAAM,CAC7C,CAGH,SAAS,EACP,EACA,EACgB,CAChB,MAAO,CACL,GAAG,EACH,YAAa,EAAO,EAAO,YAAa,EAAM,CAC9C,UAAW,EAAO,EAAO,UAAW,EAAM,CAC3C,CAGH,SAAS,EAAO,EAAsB,EAAoB,CACxD,GAAI,aAAiB,KAAM,OAAO,EAClC,IAAM,EAAS,IAAI,KAAK,EAAM,CAI9B,OAHI,OAAO,MAAM,EAAO,SAAS,CAAC,CACzB,GAAO,CAET"}
@@ -17,13 +17,34 @@ type AnyHandler = (args: any, ctx: HandlerCtx) => Promise<unknown>;
17
17
  declare class SpecRegistry {
18
18
  private specs;
19
19
  private handlers;
20
- /** Register a ContractSpec. Throws if duplicate key. */
20
+ /**
21
+ * Registers a ContractSpec definition.
22
+ *
23
+ * @param spec - The contract specification to register.
24
+ * @returns The registry instance for chaining.
25
+ * @throws If a spec with the same name and version is already registered.
26
+ */
21
27
  register<I extends AnySchemaModel, O extends AnySchemaModel | ResourceRefDescriptor<boolean>>(spec: ContractSpec<I, O>): this;
22
- /** Bind a handler implementation to a previously-registered spec. */
28
+ /**
29
+ * Binds a runtime handler implementation to a previously registered spec.
30
+ *
31
+ * @param spec - The spec to bind to.
32
+ * @param handler - The async function implementing the business logic.
33
+ * @returns The registry instance for chaining.
34
+ * @throws If the spec is not found or a handler is already bound.
35
+ */
23
36
  bind<I extends AnySchemaModel, O extends AnySchemaModel | ResourceRefDescriptor<boolean>>(spec: ContractSpec<I, O>, handler: HandlerFor<ContractSpec<I, O>>): this;
24
- /** Retrieve a spec; if version omitted, returns highest version. */
37
+ /**
38
+ * Retrieves a registered spec by name and version.
39
+ * If version is omitted, returns the highest version found.
40
+ *
41
+ * @param name - Operation name.
42
+ * @param version - (Optional) Specific version.
43
+ */
25
44
  getSpec(name: string, version?: number): AnySpec | undefined;
26
- /** Retrieve a handler for given name/version. */
45
+ /**
46
+ * Retrieves the bound handler for a spec.
47
+ */
27
48
  getHandler(name: string, version?: number): AnyHandler | undefined;
28
49
  /** Iterate all registered specs. */
29
50
  listSpecs(): AnySpec[];
@@ -33,11 +54,17 @@ declare class SpecRegistry {
33
54
  handler: AnyHandler;
34
55
  }[];
35
56
  /**
36
- * Execute an operation by name/version:
37
- * - Validates input against zod
38
- * - Enforces policy (auth/flags/rate-limit/escalation)
39
- * - Guards event emission to declared events (via ctx.__emitGuard__)
40
- * - Validates output (SchemaModel outputs)
57
+ * Execute an operation by name/version with full runtime protections:
58
+ * 1. Validates input against Zod schema.
59
+ * 2. Enforces policy (Auth, RBAC, Rate Limits) via PDP.
60
+ * 3. Guards event emission to ensure only declared events are sent.
61
+ * 4. Validates output against Zod schema (if applicable).
62
+ * 5. Tracks telemetry (success/failure).
63
+ *
64
+ * @param name - Operation name.
65
+ * @param version - Operation version (optional, defaults to latest).
66
+ * @param rawInput - The raw input payload (e.g. from JSON body).
67
+ * @param ctx - The runtime context (actor, tenant, etc.).
41
68
  */
42
69
  execute(name: string, version: number | undefined, rawInput: unknown, ctx: HandlerCtx): Promise<unknown>;
43
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","names":[],"sources":["../src/registry.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAqBe,KANH,YAAA,GAMG,GAAA,MAAA,KAAA,MAAA,EAAA;AAAY,iBAJX,KAAA,CAIW,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAJ2B,YAI3B;AAAA,KAAtB,OAAA,GAAU,YAIA,CAHb,cAGgD,EAFhD,cAEuD,GAFtC,qBAEsC,CAAA,OAAA,CAAA,CAAA;AAMzD,KANK,UAAA,GAMQ,CAAY,IAAA,EAAA,GAAA,EAAA,GAAA,EANU,UAMV,EAAA,GANyB,OAMzB,CAAA,OAAA,CAAA;;;;;AAQC,cARb,YAAA,CAQa;EAAhB,QAAA,KAAA;EASI,QAAA,QAAA;EACA;EAAiB,QAAA,CAAA,UAZjB,cAYiB,EAAA,UAXjB,cAWiB,GAXA,qBAWA,CAAA,OAAA,CAAA,CAAA,CAAA,IAAA,EAVrB,YAUqB,CAVR,CAUQ,EAVL,CAUK,CAAA,CAAA,EAAA,IAAA;EACR;EAAG,IAAA,CAAA,UAFZ,cAEY,EAAA,UADZ,cACY,GADK,qBACL,CAAA,OAAA,CAAA,CAAA,CAAA,IAAA,EAAhB,YAAgB,CAAH,CAAG,EAAA,CAAA,CAAA,EAAA,OAAA,EAAa,UAAb,CAAwB,YAAxB,CAAqC,CAArC,EAAwC,CAAxC,CAAA,CAAA,CAAA,EAAA,IAAA;EAAhB;EAAqD,OAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,MAAA,CAAA,EAYpB,OAZoB,GAAA,SAAA;EAAG;EAAhB,UAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,MAAA,CAAA,EA4BJ,UA5BI,GAAA,SAAA;EAAX;EAYI,SAAA,CAAA,CAAA,EAuB5B,OAvB4B,EAAA;EAgBG;EAO/B,SAAA,CAAA,CAAA,EAAA;IAKQ,IAAA,EAAA,OAAA;IAAkB,OAAA,EAAA,UAAA;EAoBhC,CAAA,EAAA;EACJ;;;;;;;6EADI,aACJ"}
1
+ {"version":3,"file":"registry.d.ts","names":[],"sources":["../src/registry.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAyBe,KANH,YAAA,GAMG,GAAA,MAAA,KAAA,MAAA,EAAA;AAAY,iBAJX,KAAA,CAIW,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAJ2B,YAI3B;AAAA,KAAtB,OAAA,GAAU,YAIA,CAHb,cAGgD,EAFhD,cAEuD,GAFtC,qBAEsC,CAAA,OAAA,CAAA,CAAA;AAMzD,KANK,UAAA,GAMQ,CAAY,IAAA,EAAA,GAAA,EAAA,GAAA,EANU,UAMV,EAAA,GANyB,OAMzB,CAAA,OAAA,CAAA;;;;;AAcC,cAdb,YAAA,CAca;EAAhB,QAAA,KAAA;EAgBI,QAAA,QAAA;EACA;;;;;;;EACoC,QAAA,CAAA,UApBpC,cAoBoC,EAAA,UAnBpC,cAmBoC,GAnBnB,qBAmBmB,CAAA,OAAA,CAAA,CAAA,CAAA,IAAA,EAlBxC,YAkBwC,CAlB3B,CAkB2B,EAlBxB,CAkBwB,CAAA,CAAA,EAAA,IAAA;EAAX;;;;;;;;EA2E3B,IAAA,CAAA,UA7EE,cA6EF,EAAA,UA5EE,cA4EF,GA5EmB,qBA4EnB,CAAA,OAAA,CAAA,CAAA,CAAA,IAAA,EA3EF,YA2EE,CA3EW,CA2EX,EA3Ec,CA2Ed,CAAA,EAAA,OAAA,EA3E2B,UA2E3B,CA3EsC,YA2EtC,CA3EmD,CA2EnD,EA3EsD,CA2EtD,CAAA,CAAA,CAAA,EAAA,IAAA;;;;;;;;2CAzD+B;;;;8CAkBG;;eAO/B;;;UAKQ;aAAkB;;;;;;;;;;;;;;;6EA0BhC,aACJ"}
package/dist/registry.js CHANGED
@@ -1,2 +1,2 @@
1
- import{eventKey as e}from"./events.js";import{isEmitDeclRef as t}from"./spec.js";function n(e,t){return`${e}.v${t}`}var r=class{specs=new Map;handlers=new Map;register(e){let t=n(e.meta.name,e.meta.version);if(this.specs.has(t))throw Error(`Duplicate spec ${t}`);return this.specs.set(t,e),this}bind(e,t){let r=n(e.meta.name,e.meta.version);if(!this.specs.has(r))throw Error(`Cannot bind; spec not found: ${r}`);if(this.handlers.has(r))throw Error(`Handler already bound for ${r}`);return this.handlers.set(r,t),this}getSpec(e,t){if(t!=null)return this.specs.get(n(e,t));let r,i=-1/0;for(let[t,n]of this.specs.entries())t.startsWith(`${e}.v`)&&n.meta.version>i&&(i=n.meta.version,r=n);return r}getHandler(e,t){let r=this.getSpec(e,t);if(r)return this.handlers.get(n(r.meta.name,r.meta.version))}listSpecs(){return[...this.specs.values()]}listBound(){let e=[];for(let[t,n]of this.specs.entries()){let r=this.handlers.get(t);r&&e.push({spec:n,handler:r})}return e}async execute(r,i,a,o){let s=this.getSpec(r,i);if(!s)throw Error(`Spec not found for ${r}${i?`.v${i}`:``}`);let c=n(s.meta.name,s.meta.version),l=this.handlers.get(c);if(!l)throw Error(`No handler bound for ${c}`);let u=s.io.input?.getZod().parse(a);if(o.decide){let[e,t]=s.meta.name.split(`.`),n=await o.decide({service:e,command:t,version:s.meta.version,actor:o.actor??`anonymous`,channel:o.channel,roles:o.roles,organizationId:o.organizationId,userId:o.userId,flags:[]});if(n.effect===`deny`)throw Error(`PolicyDenied: ${s.meta.name}.v${s.meta.version}`);if(n.rateLimit&&o.rateLimit){let e=n.rateLimit.key??`default`,t=n.rateLimit.rpm??60;await o.rateLimit(e,1,t)}}let d=new Map;if(s.sideEffects?.emits)for(let e of s.sideEffects.emits)t(e)?d.set(`${e.ref.name}.v${e.ref.version}`,e.ref.payload):d.set(`${e.name}.v${e.version}`,e.payload);let f=async(t,r,i)=>{let a=e(t,r),c=d.get(a);if(!c)throw Error(`UndeclaredEvent: ${a} not allowed by ${n(s.meta.name,s.meta.version)}`);let l=c.getZod().parse(i);await o.eventPublisher?.({name:t,version:r,payload:l,traceId:o.traceId})};o.appConfig&&(o.branding||=o.appConfig.branding,o.translation?o.translation.config||(o.translation={...o.translation,config:o.appConfig.translation}):o.translation={config:o.appConfig.translation});let p=o.telemetry,m=async(e,t)=>{if(!(!p||!e?.event))try{let n=e.properties?.(t)??{};await p.track(e.event.name,e.event.version??1,n,{tenantId:o.organizationId??void 0,organizationId:o.organizationId,userId:o.userId,actor:o.actor,channel:o.channel,metadata:o.traceId?{traceId:o.traceId}:void 0})}catch{}},h;try{h=await l(u,{...o,__emitGuard__:f})}catch(e){throw s.telemetry?.failure&&await m(s.telemetry.failure,{input:u??a,error:e}),e}s.telemetry?.success&&await m(s.telemetry.success,{input:u??a,output:h});let g=s.io.output;return g?.getZod?g.getZod().parse(h):h}};export{r as SpecRegistry,n as opKey};
1
+ import{eventKey as e}from"./events.js";import{isEmitDeclRef as t}from"./spec.js";function n(e,t){return`${e}.v${t}`}var r=class{specs=new Map;handlers=new Map;register(e){let t=n(e.meta.name,e.meta.version);if(this.specs.has(t))throw Error(`Duplicate spec ${t}`);return this.specs.set(t,e),this}bind(e,t){let r=n(e.meta.name,e.meta.version);if(!this.specs.has(r))throw Error(`Cannot bind; spec not found: ${r}`);if(this.handlers.has(r))throw Error(`Handler already bound for ${r}`);return this.handlers.set(r,t),this}getSpec(e,t){if(t!=null)return this.specs.get(n(e,t));let r,i=-1/0;for(let[t,n]of this.specs.entries())t.startsWith(`${e}.v`)&&n.meta.version>i&&(i=n.meta.version,r=n);return r}getHandler(e,t){let r=this.getSpec(e,t);if(r)return this.handlers.get(n(r.meta.name,r.meta.version))}listSpecs(){return[...this.specs.values()]}listBound(){let e=[];for(let[t,n]of this.specs.entries()){let r=this.handlers.get(t);r&&e.push({spec:n,handler:r})}return e}async execute(r,i,a,o){let s=this.getSpec(r,i);if(!s)throw Error(`Spec not found for ${r}${i?`.v${i}`:``}`);let c=await o.specVariantResolver?.resolve({name:s.meta.name,version:s.meta.version,kind:s.meta.kind},o)??s,l=n(c.meta.name,c.meta.version),u=this.handlers.get(l);if(!u){let e=n(s.meta.name,s.meta.version);u=this.handlers.get(e),l=e}if(!u)throw Error(`No handler bound for ${l}`);let d=c.io.input?.getZod().parse(a);if(o.decide){let[e,t]=c.meta.name.split(`.`),n=await o.decide({service:e,command:t,version:c.meta.version,actor:o.actor??`anonymous`,channel:o.channel,roles:o.roles,organizationId:o.organizationId,userId:o.userId,flags:[]});if(n.effect===`deny`)throw Error(`PolicyDenied: ${c.meta.name}.v${c.meta.version}`);if(n.rateLimit&&o.rateLimit){let e=n.rateLimit.key??`default`,t=n.rateLimit.rpm??60;await o.rateLimit(e,1,t)}}let f=new Map;if(c.sideEffects?.emits)for(let e of c.sideEffects.emits)t(e)?f.set(`${e.ref.name}.v${e.ref.version}`,e.ref.payload):f.set(`${e.name}.v${e.version}`,e.payload);let p=async(t,r,i)=>{let a=e(t,r),s=f.get(a);if(!s)throw Error(`UndeclaredEvent: ${a} not allowed by ${n(c.meta.name,c.meta.version)}`);let l=s.getZod().parse(i);await o.eventPublisher?.({name:t,version:r,payload:l,traceId:o.traceId})};o.appConfig&&(o.branding||=o.appConfig.branding,o.translation?o.translation.config||(o.translation={...o.translation,config:o.appConfig.translation}):o.translation={config:o.appConfig.translation});let m=o.telemetry,h=async(e,t)=>{if(!(!m||!e?.event))try{let n=e.properties?.(t)??{};await m.track(e.event.name,e.event.version??1,n,{tenantId:o.organizationId??void 0,organizationId:o.organizationId,userId:o.userId,actor:o.actor,channel:o.channel,metadata:o.traceId?{traceId:o.traceId}:void 0})}catch{}},g;try{g=await u(d,{...o,__emitGuard__:p})}catch(e){throw c.telemetry?.failure&&await h(c.telemetry.failure,{input:d??a,error:e}),e}c.telemetry?.success&&await h(c.telemetry.success,{input:d??a,output:g});let _=c.io.output;return _?.getZod?_.getZod().parse(g):g}};export{r as SpecRegistry,n as opKey};
2
2
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","names":["key: OperationKey","found: AnySpec | undefined","out: { spec: AnySpec; handler: AnyHandler }[]","key","result: unknown"],"sources":["../src/registry.ts"],"sourcesContent":["/**\n * SpecRegistry:\n * - Registers ContractSpecs (unique by name+version)\n * - Binds runtime handlers to specs\n * - Provides lookup, iteration, and a safe execute() with validation/policy/enforcement\n *\n * Includes a minimal OpRegistry shim for backward-compat (deprecated).\n */\nimport { type ContractSpec, type TelemetryTrigger, isEmitDeclRef } from './spec';\nimport type { ResourceRefDescriptor } from './resources';\nimport type { HandlerCtx } from './types';\nimport { eventKey } from './events';\nimport type { AnySchemaModel, ZodSchemaModel } from '@lssm/lib.schema';\nimport type { HandlerFor } from './install';\n\nexport type OperationKey = `${string}.v${number}`;\n\nexport function opKey(name: string, version: number): OperationKey {\n return `${name}.v${version}`;\n}\n\ntype AnySpec = ContractSpec<\n AnySchemaModel,\n AnySchemaModel | ResourceRefDescriptor<boolean>\n>;\ntype AnyHandler = (args: any, ctx: HandlerCtx) => Promise<unknown>;\n\n/**\n * In-memory registry for ContractSpecs and their bound handlers.\n * Provides validation, policy enforcement, and guarded event emission at execute time.\n */\nexport class SpecRegistry {\n private specs = new Map<OperationKey, AnySpec>();\n private handlers = new Map<OperationKey, AnyHandler>();\n\n /** Register a ContractSpec. Throws if duplicate key. */\n register<\n I extends AnySchemaModel,\n O extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n >(spec: ContractSpec<I, O>): this {\n const key = opKey(spec.meta.name, spec.meta.version);\n if (this.specs.has(key)) throw new Error(`Duplicate spec ${key}`);\n this.specs.set(key, spec as AnySpec);\n return this;\n }\n\n /** Bind a handler implementation to a previously-registered spec. */\n bind<\n I extends AnySchemaModel,\n O extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n >(spec: ContractSpec<I, O>, handler: HandlerFor<ContractSpec<I, O>>): this {\n const key: OperationKey = opKey(spec.meta.name, spec.meta.version);\n\n if (!this.specs.has(key))\n throw new Error(`Cannot bind; spec not found: ${key}`);\n if (this.handlers.has(key))\n throw new Error(`Handler already bound for ${key}`);\n this.handlers.set(key, handler);\n return this;\n }\n\n /** Retrieve a spec; if version omitted, returns highest version. */\n getSpec(name: string, version?: number): AnySpec | undefined {\n if (version != null) return this.specs.get(opKey(name, version));\n // find highest version by scanning keys of the same name\n let found: AnySpec | undefined;\n let maxV = -Infinity;\n for (const [k, s] of this.specs.entries()) {\n if (!k.startsWith(`${name}.v`)) continue;\n if (s.meta.version > maxV) {\n maxV = s.meta.version;\n found = s;\n }\n }\n return found;\n }\n\n /** Retrieve a handler for given name/version. */\n getHandler(name: string, version?: number): AnyHandler | undefined {\n const spec = this.getSpec(name, version);\n if (!spec) return undefined;\n return this.handlers.get(opKey(spec.meta.name, spec.meta.version));\n }\n\n /** Iterate all registered specs. */\n listSpecs(): AnySpec[] {\n return [...this.specs.values()];\n }\n\n /** Iterate all bound operations (spec+handler). */\n listBound(): { spec: AnySpec; handler: AnyHandler }[] {\n const out: { spec: AnySpec; handler: AnyHandler }[] = [];\n for (const [k, spec] of this.specs.entries()) {\n const h = this.handlers.get(k);\n if (h) out.push({ spec, handler: h });\n }\n return out;\n }\n\n /**\n * Execute an operation by name/version:\n * - Validates input against zod\n * - Enforces policy (auth/flags/rate-limit/escalation)\n * - Guards event emission to declared events (via ctx.__emitGuard__)\n * - Validates output (SchemaModel outputs)\n */\n async execute(\n name: string,\n version: number | undefined,\n rawInput: unknown,\n ctx: HandlerCtx\n ): Promise<unknown> {\n const spec = this.getSpec(name, version);\n if (!spec)\n throw new Error(\n `Spec not found for ${name}${version ? `.v${version}` : ''}`\n );\n\n const key = opKey(spec.meta.name, spec.meta.version);\n const handler = this.handlers.get(key);\n if (!handler) throw new Error(`No handler bound for ${key}`);\n\n // 1) Validate input\n const parsedInput = spec.io.input?.getZod().parse(rawInput);\n\n // 2) Policy enforcement\n if (ctx.decide) {\n const [service, command] = spec.meta.name.split('.');\n const decision = await ctx.decide({\n service: service!,\n command: command!,\n version: spec.meta.version,\n actor: ctx.actor ?? 'anonymous',\n channel: ctx.channel,\n roles: ctx.roles,\n organizationId: ctx.organizationId,\n userId: ctx.userId,\n flags: [], // adapter may fill flags from request\n });\n if (decision.effect === 'deny') {\n throw new Error(\n `PolicyDenied: ${spec.meta.name}.v${spec.meta.version}`\n );\n }\n if (decision.rateLimit && ctx.rateLimit) {\n const key = decision.rateLimit.key ?? 'default';\n const rpm = decision.rateLimit.rpm ?? 60;\n await ctx.rateLimit(key, 1, rpm);\n }\n // escalations are advisory; adapter may short-circuit if needed\n }\n\n // 3) Event emission guard\n const allowedEvents = new Map<string, AnySchemaModel>();\n if (spec.sideEffects?.emits) {\n for (const e of spec.sideEffects.emits) {\n if (isEmitDeclRef(e)) {\n allowedEvents.set(`${e.ref.name}.v${e.ref.version}`, e.ref.payload);\n } else {\n allowedEvents.set(`${e.name}.v${e.version}`, e.payload);\n }\n }\n }\n\n const emitGuard = async (\n eventName: string,\n eventVersion: number,\n payload: unknown\n ) => {\n const key2 = eventKey(eventName, eventVersion);\n const schema = allowedEvents.get(key2);\n if (!schema)\n throw new Error(\n `UndeclaredEvent: ${key2} not allowed by ${opKey(spec.meta.name, spec.meta.version)}`\n );\n const parsed = schema.getZod().parse(payload);\n // Delegate to service publisher if present\n await ctx.eventPublisher?.({\n name: eventName,\n version: eventVersion,\n payload: parsed,\n traceId: ctx.traceId,\n });\n };\n\n // 4) Execute handler with guarded ctx\n if (ctx.appConfig) {\n if (!ctx.branding) {\n ctx.branding = ctx.appConfig.branding;\n }\n if (!ctx.translation) {\n ctx.translation = { config: ctx.appConfig.translation };\n } else if (!ctx.translation.config) {\n ctx.translation = {\n ...ctx.translation,\n config: ctx.appConfig.translation,\n };\n }\n }\n const telemetryContext = ctx.telemetry;\n const trackTelemetry = async (\n trigger: TelemetryTrigger | undefined,\n details: { input: unknown; output?: unknown; error?: unknown }\n ) => {\n if (!telemetryContext || !trigger?.event) return;\n try {\n const props = trigger.properties?.(details) ?? {};\n await telemetryContext.track(\n trigger.event.name,\n trigger.event.version ?? 1,\n props,\n {\n tenantId: ctx.organizationId ?? undefined,\n organizationId: ctx.organizationId,\n userId: ctx.userId,\n actor: ctx.actor,\n channel: ctx.channel,\n metadata: ctx.traceId ? { traceId: ctx.traceId } : undefined,\n }\n );\n } catch (_error) {\n // Best-effort telemetry: swallow errors to avoid breaking the handler.\n }\n };\n\n let result: unknown;\n try {\n result = await handler(parsedInput, {\n ...ctx,\n __emitGuard__: emitGuard,\n });\n } catch (error) {\n if (spec.telemetry?.failure) {\n await trackTelemetry(spec.telemetry.failure, {\n input: parsedInput ?? rawInput,\n error,\n });\n }\n throw error;\n }\n\n if (spec.telemetry?.success) {\n await trackTelemetry(spec.telemetry.success, {\n input: parsedInput ?? rawInput,\n output: result,\n });\n }\n\n // 5) Validate output when the spec declares a SchemaModel output.\n const outputModel = spec.io.output as\n | AnySchemaModel\n | ResourceRefDescriptor<boolean>;\n if ((outputModel as AnySchemaModel)?.getZod) {\n const parsedOutput = (outputModel as AnySchemaModel)\n .getZod()\n .parse(result);\n return parsedOutput;\n }\n // ResourceRefDescriptor path: adapter may hydrate entity; leave as-is\n return result;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","names":["key: OperationKey","found: AnySpec | undefined","out: { spec: AnySpec; handler: AnyHandler }[]","key","result: unknown"],"sources":["../src/registry.ts"],"sourcesContent":["/**\n * SpecRegistry:\n * - Registers ContractSpecs (unique by name+version)\n * - Binds runtime handlers to specs\n * - Provides lookup, iteration, and a safe execute() with validation/policy/enforcement\n *\n * Includes a minimal OpRegistry shim for backward-compat (deprecated).\n */\nimport {\n type ContractSpec,\n type TelemetryTrigger,\n isEmitDeclRef,\n} from './spec';\nimport type { ResourceRefDescriptor } from './resources';\nimport type { HandlerCtx } from './types';\nimport { eventKey } from './events';\nimport type { AnySchemaModel, ZodSchemaModel } from '@lssm/lib.schema';\nimport type { HandlerFor } from './install';\n\nexport type OperationKey = `${string}.v${number}`;\n\nexport function opKey(name: string, version: number): OperationKey {\n return `${name}.v${version}`;\n}\n\ntype AnySpec = ContractSpec<\n AnySchemaModel,\n AnySchemaModel | ResourceRefDescriptor<boolean>\n>;\ntype AnyHandler = (args: any, ctx: HandlerCtx) => Promise<unknown>;\n\n/**\n * In-memory registry for ContractSpecs and their bound handlers.\n * Provides validation, policy enforcement, and guarded event emission at execute time.\n */\nexport class SpecRegistry {\n private specs = new Map<OperationKey, AnySpec>();\n private handlers = new Map<OperationKey, AnyHandler>();\n\n /**\n * Registers a ContractSpec definition.\n *\n * @param spec - The contract specification to register.\n * @returns The registry instance for chaining.\n * @throws If a spec with the same name and version is already registered.\n */\n register<\n I extends AnySchemaModel,\n O extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n >(spec: ContractSpec<I, O>): this {\n const key = opKey(spec.meta.name, spec.meta.version);\n if (this.specs.has(key)) throw new Error(`Duplicate spec ${key}`);\n this.specs.set(key, spec as AnySpec);\n return this;\n }\n\n /**\n * Binds a runtime handler implementation to a previously registered spec.\n *\n * @param spec - The spec to bind to.\n * @param handler - The async function implementing the business logic.\n * @returns The registry instance for chaining.\n * @throws If the spec is not found or a handler is already bound.\n */\n bind<\n I extends AnySchemaModel,\n O extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n >(spec: ContractSpec<I, O>, handler: HandlerFor<ContractSpec<I, O>>): this {\n const key: OperationKey = opKey(spec.meta.name, spec.meta.version);\n\n if (!this.specs.has(key))\n throw new Error(`Cannot bind; spec not found: ${key}`);\n if (this.handlers.has(key))\n throw new Error(`Handler already bound for ${key}`);\n this.handlers.set(key, handler);\n return this;\n }\n\n /**\n * Retrieves a registered spec by name and version.\n * If version is omitted, returns the highest version found.\n *\n * @param name - Operation name.\n * @param version - (Optional) Specific version.\n */\n getSpec(name: string, version?: number): AnySpec | undefined {\n if (version != null) return this.specs.get(opKey(name, version));\n // find highest version by scanning keys of the same name\n let found: AnySpec | undefined;\n let maxV = -Infinity;\n for (const [k, s] of this.specs.entries()) {\n if (!k.startsWith(`${name}.v`)) continue;\n if (s.meta.version > maxV) {\n maxV = s.meta.version;\n found = s;\n }\n }\n return found;\n }\n\n /**\n * Retrieves the bound handler for a spec.\n */\n getHandler(name: string, version?: number): AnyHandler | undefined {\n const spec = this.getSpec(name, version);\n if (!spec) return undefined;\n return this.handlers.get(opKey(spec.meta.name, spec.meta.version));\n }\n\n /** Iterate all registered specs. */\n listSpecs(): AnySpec[] {\n return [...this.specs.values()];\n }\n\n /** Iterate all bound operations (spec+handler). */\n listBound(): { spec: AnySpec; handler: AnyHandler }[] {\n const out: { spec: AnySpec; handler: AnyHandler }[] = [];\n for (const [k, spec] of this.specs.entries()) {\n const h = this.handlers.get(k);\n if (h) out.push({ spec, handler: h });\n }\n return out;\n }\n\n /**\n * Execute an operation by name/version with full runtime protections:\n * 1. Validates input against Zod schema.\n * 2. Enforces policy (Auth, RBAC, Rate Limits) via PDP.\n * 3. Guards event emission to ensure only declared events are sent.\n * 4. Validates output against Zod schema (if applicable).\n * 5. Tracks telemetry (success/failure).\n *\n * @param name - Operation name.\n * @param version - Operation version (optional, defaults to latest).\n * @param rawInput - The raw input payload (e.g. from JSON body).\n * @param ctx - The runtime context (actor, tenant, etc.).\n */\n async execute(\n name: string,\n version: number | undefined,\n rawInput: unknown,\n ctx: HandlerCtx\n ): Promise<unknown> {\n const baseSpec = this.getSpec(name, version);\n if (!baseSpec)\n throw new Error(\n `Spec not found for ${name}${version ? `.v${version}` : ''}`\n );\n const spec =\n (await ctx.specVariantResolver?.resolve(\n {\n name: baseSpec.meta.name,\n version: baseSpec.meta.version,\n kind: baseSpec.meta.kind,\n },\n ctx\n )) ?? baseSpec;\n\n let key = opKey(spec.meta.name, spec.meta.version);\n let handler = this.handlers.get(key);\n if (!handler) {\n const fallbackKey = opKey(baseSpec.meta.name, baseSpec.meta.version);\n handler = this.handlers.get(fallbackKey);\n key = fallbackKey;\n }\n if (!handler) throw new Error(`No handler bound for ${key}`);\n\n // 1) Validate input\n const parsedInput = spec.io.input?.getZod().parse(rawInput);\n\n // 2) Policy enforcement\n if (ctx.decide) {\n const [service, command] = spec.meta.name.split('.');\n const decision = await ctx.decide({\n service: service!,\n command: command!,\n version: spec.meta.version,\n actor: ctx.actor ?? 'anonymous',\n channel: ctx.channel,\n roles: ctx.roles,\n organizationId: ctx.organizationId,\n userId: ctx.userId,\n flags: [], // adapter may fill flags from request\n });\n if (decision.effect === 'deny') {\n throw new Error(\n `PolicyDenied: ${spec.meta.name}.v${spec.meta.version}`\n );\n }\n if (decision.rateLimit && ctx.rateLimit) {\n const key = decision.rateLimit.key ?? 'default';\n const rpm = decision.rateLimit.rpm ?? 60;\n await ctx.rateLimit(key, 1, rpm);\n }\n // escalations are advisory; adapter may short-circuit if needed\n }\n\n // 3) Event emission guard\n const allowedEvents = new Map<string, AnySchemaModel>();\n if (spec.sideEffects?.emits) {\n for (const e of spec.sideEffects.emits) {\n if (isEmitDeclRef(e)) {\n allowedEvents.set(`${e.ref.name}.v${e.ref.version}`, e.ref.payload);\n } else {\n allowedEvents.set(`${e.name}.v${e.version}`, e.payload);\n }\n }\n }\n\n const emitGuard = async (\n eventName: string,\n eventVersion: number,\n payload: unknown\n ) => {\n const key2 = eventKey(eventName, eventVersion);\n const schema = allowedEvents.get(key2);\n if (!schema)\n throw new Error(\n `UndeclaredEvent: ${key2} not allowed by ${opKey(spec.meta.name, spec.meta.version)}`\n );\n const parsed = schema.getZod().parse(payload);\n // Delegate to service publisher if present\n await ctx.eventPublisher?.({\n name: eventName,\n version: eventVersion,\n payload: parsed,\n traceId: ctx.traceId,\n });\n };\n\n // 4) Execute handler with guarded ctx\n if (ctx.appConfig) {\n if (!ctx.branding) {\n ctx.branding = ctx.appConfig.branding;\n }\n if (!ctx.translation) {\n ctx.translation = { config: ctx.appConfig.translation };\n } else if (!ctx.translation.config) {\n ctx.translation = {\n ...ctx.translation,\n config: ctx.appConfig.translation,\n };\n }\n }\n const telemetryContext = ctx.telemetry;\n const trackTelemetry = async (\n trigger: TelemetryTrigger | undefined,\n details: { input: unknown; output?: unknown; error?: unknown }\n ) => {\n if (!telemetryContext || !trigger?.event) return;\n try {\n const props = trigger.properties?.(details) ?? {};\n await telemetryContext.track(\n trigger.event.name,\n trigger.event.version ?? 1,\n props,\n {\n tenantId: ctx.organizationId ?? undefined,\n organizationId: ctx.organizationId,\n userId: ctx.userId,\n actor: ctx.actor,\n channel: ctx.channel,\n metadata: ctx.traceId ? { traceId: ctx.traceId } : undefined,\n }\n );\n } catch (_error) {\n // Best-effort telemetry: swallow errors to avoid breaking the handler.\n }\n };\n\n let result: unknown;\n try {\n result = await handler(parsedInput, {\n ...ctx,\n __emitGuard__: emitGuard,\n });\n } catch (error) {\n if (spec.telemetry?.failure) {\n await trackTelemetry(spec.telemetry.failure, {\n input: parsedInput ?? rawInput,\n error,\n });\n }\n throw error;\n }\n\n if (spec.telemetry?.success) {\n await trackTelemetry(spec.telemetry.success, {\n input: parsedInput ?? rawInput,\n output: result,\n });\n }\n\n // 5) Validate output when the spec declares a SchemaModel output.\n const outputModel = spec.io.output as\n | AnySchemaModel\n | ResourceRefDescriptor<boolean>;\n if ((outputModel as AnySchemaModel)?.getZod) {\n const parsedOutput = (outputModel as AnySchemaModel)\n .getZod()\n .parse(result);\n return parsedOutput;\n }\n // ResourceRefDescriptor path: adapter may hydrate entity; leave as-is\n return result;\n }\n}\n"],"mappings":"iFAqBA,SAAgB,EAAM,EAAc,EAA+B,CACjE,MAAO,GAAG,EAAK,IAAI,IAarB,IAAa,EAAb,KAA0B,CACxB,MAAgB,IAAI,IACpB,SAAmB,IAAI,IASvB,SAGE,EAAgC,CAChC,IAAM,EAAM,EAAM,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,CACpD,GAAI,KAAK,MAAM,IAAI,EAAI,CAAE,MAAU,MAAM,kBAAkB,IAAM,CAEjE,OADA,KAAK,MAAM,IAAI,EAAK,EAAgB,CAC7B,KAWT,KAGE,EAA0B,EAA+C,CACzE,IAAMA,EAAoB,EAAM,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,CAElE,GAAI,CAAC,KAAK,MAAM,IAAI,EAAI,CACtB,MAAU,MAAM,gCAAgC,IAAM,CACxD,GAAI,KAAK,SAAS,IAAI,EAAI,CACxB,MAAU,MAAM,6BAA6B,IAAM,CAErD,OADA,KAAK,SAAS,IAAI,EAAK,EAAQ,CACxB,KAUT,QAAQ,EAAc,EAAuC,CAC3D,GAAI,GAAW,KAAM,OAAO,KAAK,MAAM,IAAI,EAAM,EAAM,EAAQ,CAAC,CAEhE,IAAIC,EACA,EAAO,KACX,IAAK,GAAM,CAAC,EAAG,KAAM,KAAK,MAAM,SAAS,CAClC,EAAE,WAAW,GAAG,EAAK,IAAI,EAC1B,EAAE,KAAK,QAAU,IACnB,EAAO,EAAE,KAAK,QACd,EAAQ,GAGZ,OAAO,EAMT,WAAW,EAAc,EAA0C,CACjE,IAAM,EAAO,KAAK,QAAQ,EAAM,EAAQ,CACnC,KACL,OAAO,KAAK,SAAS,IAAI,EAAM,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,CAAC,CAIpE,WAAuB,CACrB,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAIjC,WAAsD,CACpD,IAAMC,EAAgD,EAAE,CACxD,IAAK,GAAM,CAAC,EAAG,KAAS,KAAK,MAAM,SAAS,CAAE,CAC5C,IAAM,EAAI,KAAK,SAAS,IAAI,EAAE,CAC1B,GAAG,EAAI,KAAK,CAAE,OAAM,QAAS,EAAG,CAAC,CAEvC,OAAO,EAgBT,MAAM,QACJ,EACA,EACA,EACA,EACkB,CAClB,IAAM,EAAW,KAAK,QAAQ,EAAM,EAAQ,CAC5C,GAAI,CAAC,EACH,MAAU,MACR,sBAAsB,IAAO,EAAU,KAAK,IAAY,KACzD,CACH,IAAM,EACH,MAAM,EAAI,qBAAqB,QAC9B,CACE,KAAM,EAAS,KAAK,KACpB,QAAS,EAAS,KAAK,QACvB,KAAM,EAAS,KAAK,KACrB,CACD,EACD,EAAK,EAEJ,EAAM,EAAM,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,CAC9C,EAAU,KAAK,SAAS,IAAI,EAAI,CACpC,GAAI,CAAC,EAAS,CACZ,IAAM,EAAc,EAAM,EAAS,KAAK,KAAM,EAAS,KAAK,QAAQ,CACpE,EAAU,KAAK,SAAS,IAAI,EAAY,CACxC,EAAM,EAER,GAAI,CAAC,EAAS,MAAU,MAAM,wBAAwB,IAAM,CAG5D,IAAM,EAAc,EAAK,GAAG,OAAO,QAAQ,CAAC,MAAM,EAAS,CAG3D,GAAI,EAAI,OAAQ,CACd,GAAM,CAAC,EAAS,GAAW,EAAK,KAAK,KAAK,MAAM,IAAI,CAC9C,EAAW,MAAM,EAAI,OAAO,CACvB,UACA,UACT,QAAS,EAAK,KAAK,QACnB,MAAO,EAAI,OAAS,YACpB,QAAS,EAAI,QACb,MAAO,EAAI,MACX,eAAgB,EAAI,eACpB,OAAQ,EAAI,OACZ,MAAO,EAAE,CACV,CAAC,CACF,GAAI,EAAS,SAAW,OACtB,MAAU,MACR,iBAAiB,EAAK,KAAK,KAAK,IAAI,EAAK,KAAK,UAC/C,CAEH,GAAI,EAAS,WAAa,EAAI,UAAW,CACvC,IAAMC,EAAM,EAAS,UAAU,KAAO,UAChC,EAAM,EAAS,UAAU,KAAO,GACtC,MAAM,EAAI,UAAUA,EAAK,EAAG,EAAI,EAMpC,IAAM,EAAgB,IAAI,IAC1B,GAAI,EAAK,aAAa,MACpB,IAAK,IAAM,KAAK,EAAK,YAAY,MAC3B,EAAc,EAAE,CAClB,EAAc,IAAI,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,UAAW,EAAE,IAAI,QAAQ,CAEnE,EAAc,IAAI,GAAG,EAAE,KAAK,IAAI,EAAE,UAAW,EAAE,QAAQ,CAK7D,IAAM,EAAY,MAChB,EACA,EACA,IACG,CACH,IAAM,EAAO,EAAS,EAAW,EAAa,CACxC,EAAS,EAAc,IAAI,EAAK,CACtC,GAAI,CAAC,EACH,MAAU,MACR,oBAAoB,EAAK,kBAAkB,EAAM,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,GACpF,CACH,IAAM,EAAS,EAAO,QAAQ,CAAC,MAAM,EAAQ,CAE7C,MAAM,EAAI,iBAAiB,CACzB,KAAM,EACN,QAAS,EACT,QAAS,EACT,QAAS,EAAI,QACd,CAAC,EAIA,EAAI,YACN,AACE,EAAI,WAAW,EAAI,UAAU,SAE1B,EAAI,YAEG,EAAI,YAAY,SAC1B,EAAI,YAAc,CAChB,GAAG,EAAI,YACP,OAAQ,EAAI,UAAU,YACvB,EALD,EAAI,YAAc,CAAE,OAAQ,EAAI,UAAU,YAAa,EAQ3D,IAAM,EAAmB,EAAI,UACvB,EAAiB,MACrB,EACA,IACG,CACC,MAAC,GAAoB,CAAC,GAAS,OACnC,GAAI,CACF,IAAM,EAAQ,EAAQ,aAAa,EAAQ,EAAI,EAAE,CACjD,MAAM,EAAiB,MACrB,EAAQ,MAAM,KACd,EAAQ,MAAM,SAAW,EACzB,EACA,CACE,SAAU,EAAI,gBAAkB,IAAA,GAChC,eAAgB,EAAI,eACpB,OAAQ,EAAI,OACZ,MAAO,EAAI,MACX,QAAS,EAAI,QACb,SAAU,EAAI,QAAU,CAAE,QAAS,EAAI,QAAS,CAAG,IAAA,GACpD,CACF,MACc,IAKfC,EACJ,GAAI,CACF,EAAS,MAAM,EAAQ,EAAa,CAClC,GAAG,EACH,cAAe,EAChB,CAAC,OACK,EAAO,CAOd,MANI,EAAK,WAAW,SAClB,MAAM,EAAe,EAAK,UAAU,QAAS,CAC3C,MAAO,GAAe,EACtB,QACD,CAAC,CAEE,EAGJ,EAAK,WAAW,SAClB,MAAM,EAAe,EAAK,UAAU,QAAS,CAC3C,MAAO,GAAe,EACtB,OAAQ,EACT,CAAC,CAIJ,IAAM,EAAc,EAAK,GAAG,OAU5B,OAPK,GAAgC,OACb,EACnB,QAAQ,CACR,MAAM,EAAO,CAIX"}
@@ -1 +1 @@
1
- {"version":3,"file":"resources.d.ts","names":[],"sources":["../src/resources.ts"],"sourcesContent":[],"mappings":";;;;UAGiB,YAAA;;EAAA,WAAA,EAAA,MAAY;EAaZ;EAAiC,KAAA,EAAA,MAAA;EAC1C;EAEC,WAAA,CAAA,EAAA,MAAA;EAMS;EAAN,QAAA,EAAA,MAAA;EAE2C;EAAhD,IAAA,CAAA,EAdE,GAcF,EAAA;;AAGS,UAdC,oBAcqB,CAAA,UAdU,CAAA,CAAE,OAcZ,CAAA,CAAA;EAAa,IAAA,EAb3C,YAa2C;EACtB;EAArB,KAAA,EAZC,CAYD;EACgB;;;AAIxB;EAGuB,OAAA,EAAA,CAAA,IAAA,EAdb,CAAA,CAAE,KAcW,CAdL,CAcK,CAAA,EAAA,GAAA,EAAA;IAAoC,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAArB,KAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAKvB,MAAA,CAAA,EAAA,MAAA;EASD,CAAA,EAAA,GA1BP,OA0BO,CAAA;IAAmC,GAAA,EAAA,MAAA;IAAM,QAAA,CAAA,EAAA,MAAA;IAoBtC,IAAA,EA9CsC,UA8CtC,GAAA,MAAqB;EAYtB,CAAA,CAAA;;AAGS,iBA1DT,sBA0DS,CAAA,UA1DwB,CAAA,CAAE,OA0D1B,CAAA,CAAA,IAAA,EAzDjB,oBAyDiB,CAzDI,CAyDJ,CAAA,CAAA,EAxDtB,oBAwDsB,CAxDD,CAwDC,CAAA;AAAtB,cApDU,gBAAA,CAoDV;EAAqB,QAAA,SAAA;EAUR,QAAA,CAAA,UA3DK,CAAA,CAAE,OA2DyB,CAAA,CAAA,IAAA,EA3DV,oBA2D+B,CA3DV,CA2DU,CAAA,CAAA,EAAA,IAAA;mBAtDtD;;;UASD;YAAmC;;;UAoBhC;;;;;;;;;QAST;;iBAGQ;;;QAEuC;IACpD,sBAAsB;iBAUT,aAAA,mBAAgC"}
1
+ {"version":3,"file":"resources.d.ts","names":[],"sources":["../src/resources.ts"],"sourcesContent":[],"mappings":";;;;UAGiB,YAAA;;EAAA,WAAA,EAAA,MAAY;EAaZ;EAAiC,KAAA,EAAA,MAAA;EAC1C;EAEC,WAAA,CAAA,EAAA,MAAA;EAMS;EAAN,QAAA,EAAA,MAAA;EAE2C;EAAhD,IAAA,CAAA,EAdE,GAcF,EAAA;;AAGS,UAdC,oBAcqB,CAAA,UAdU,CAAA,CAAE,OAcZ,CAAA,CAAA;EAAa,IAAA,EAb3C,YAa2C;EACtB;EAArB,KAAA,EAZC,CAYD;EACgB;;;AAIxB;EAGuB,OAAA,EAAA,CAAA,IAAA,EAdb,CAAA,CAAE,KAcW,CAdL,CAcK,CAAA,EAAA,GAAA,EAAA;IAAoC,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAArB,KAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAKvB,MAAA,CAAA,EAAA,MAAA;EASD,CAAA,EAAA,GA1BP,OA0BO,CAAA;IAAmC,GAAA,EAAA,MAAA;IAAM,QAAA,CAAA,EAAA,MAAA;IAoBtC,IAAA,EA9CsC,UA8CtC,GAAA,MAAqB;EAYtB,CAAA,CAAA;;AAGS,iBA1DT,sBA0DS,CAAA,UA1DwB,CAAA,CAAE,OA0D1B,CAAA,CAAA,IAAA,EAzDjB,oBAyDiB,CAzDI,CAyDJ,CAAA,CAAA,EAxDtB,oBAwDsB,CAxDD,CAwDC,CAAA;AAAtB,cApDU,gBAAA,CAoDV;EAAqB,QAAA,SAAA;EAUR,QAAA,CAAA,UA3DK,CAAA,CAAE,OA2DM,CAAmB,CAAA,IAAA,EA3DV,oBA2D+B,CA3DV,CA2DU,CAAA,CAAA,EAAA,IAAA;mBAtDtD;;;UASD;YAAmC;;;UAoBhC;;;;;;;;;QAST;;iBAGQ;;;QAEuC;IACpD,sBAAsB;iBAUT,aAAA,mBAAgC"}
@@ -1,2 +1,2 @@
1
- import{z as e}from"zod";import{GraphQLScalarType as t,Kind as n}from"graphql";var r=class extends t{zodSchema;jsonSchemaDef;constructor(e){super(e),this.zodSchema=e.zod,this.jsonSchemaDef=e.jsonSchema}getZod(){return this.zodSchema}getPothos(){return this}getJson(){return typeof this.jsonSchemaDef==`function`?this.jsonSchemaDef():this.jsonSchemaDef}getJsonSchemaDef(){return this.jsonSchemaDef}getJsonSchema(){let e=t=>{let n=typeof t==`function`?t():t;if(Array.isArray(n))return n.map(t=>e(t));if(n&&typeof n==`object`){let t={};for(let[r,i]of Object.entries(n))t[r]=e(i);return t}return n};return e(this.getJson())}};export{r};
1
+ import{z as e}from"zod";import{GraphQLScalarType as t}from"graphql";var n=class extends t{zodSchema;jsonSchemaDef;constructor(e){super(e),this.zodSchema=e.zod,this.jsonSchemaDef=e.jsonSchema}getZod(){return this.zodSchema}getPothos(){return this}getJson(){return typeof this.jsonSchemaDef==`function`?this.jsonSchemaDef():this.jsonSchemaDef}getJsonSchemaDef(){return this.jsonSchemaDef}getJsonSchema(){let e=t=>{let n=typeof t==`function`?t():t;if(Array.isArray(n))return n.map(t=>e(t));if(n&&typeof n==`object`){let t={};for(let[r,i]of Object.entries(n))t[r]=e(i);return t}return n};return e(this.getJson())}};export{n};
2
2
  //# sourceMappingURL=FieldType.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FieldType.js","names":["t","r"],"sources":["../../../../schema/dist/FieldType.js"],"sourcesContent":["import{z as e}from\"zod\";import{GraphQLScalarType as t,Kind as n}from\"graphql\";var r=class extends t{zodSchema;jsonSchemaDef;constructor(e){super(e),this.zodSchema=e.zod,this.jsonSchemaDef=e.jsonSchema}getZod(){return this.zodSchema}getPothos(){return this}getJson(){return typeof this.jsonSchemaDef==`function`?this.jsonSchemaDef():this.jsonSchemaDef}getJsonSchemaDef(){return this.jsonSchemaDef}getJsonSchema(){let e=t=>{let n=typeof t==`function`?t():t;if(Array.isArray(n))return n.map(t=>e(t));if(n&&typeof n==`object`){let t={};for(let[r,i]of Object.entries(n))t[r]=e(i);return t}return n};return e(this.getJson())}};export{r as FieldType};\n//# sourceMappingURL=FieldType.js.map"],"mappings":"8EAA8E,IAAI,EAAE,cAAcA,CAAC,CAAC,UAAU,cAAc,YAAY,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,UAAU,EAAE,IAAI,KAAK,cAAc,EAAE,WAAW,QAAQ,CAAC,OAAO,KAAK,UAAU,WAAW,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,OAAO,KAAK,eAAe,WAAW,KAAK,eAAe,CAAC,KAAK,cAAc,kBAAkB,CAAC,OAAO,KAAK,cAAc,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,GAAG,EAAEA,EAAE,CAAC,CAAC,GAAG,GAAG,OAAO,GAAG,SAAS,CAAC,IAAIA,EAAE,EAAE,CAAC,IAAI,GAAG,CAACC,EAAE,KAAK,OAAO,QAAQ,EAAE,CAAC,EAAEA,GAAG,EAAE,EAAE,CAAC,OAAOD,EAAE,OAAO,GAAG,OAAO,EAAE,KAAK,SAAS,CAAC"}
1
+ {"version":3,"file":"FieldType.js","names":["t","n"],"sources":["../../../../schema/dist/FieldType.js"],"sourcesContent":["import{z as e}from\"zod\";import{GraphQLScalarType as t}from\"graphql\";var n=class extends t{zodSchema;jsonSchemaDef;constructor(e){super(e),this.zodSchema=e.zod,this.jsonSchemaDef=e.jsonSchema}getZod(){return this.zodSchema}getPothos(){return this}getJson(){return typeof this.jsonSchemaDef==`function`?this.jsonSchemaDef():this.jsonSchemaDef}getJsonSchemaDef(){return this.jsonSchemaDef}getJsonSchema(){let e=t=>{let n=typeof t==`function`?t():t;if(Array.isArray(n))return n.map(t=>e(t));if(n&&typeof n==`object`){let t={};for(let[r,i]of Object.entries(n))t[r]=e(i);return t}return n};return e(this.getJson())}};export{n as FieldType};\n//# sourceMappingURL=FieldType.js.map"],"mappings":"oEAAoE,IAAI,EAAE,cAAcA,CAAC,CAAC,UAAU,cAAc,YAAY,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,UAAU,EAAE,IAAI,KAAK,cAAc,EAAE,WAAW,QAAQ,CAAC,OAAO,KAAK,UAAU,WAAW,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,OAAO,KAAK,eAAe,WAAW,KAAK,eAAe,CAAC,KAAK,cAAc,kBAAkB,CAAC,OAAO,KAAK,cAAc,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,IAAIC,EAAE,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,GAAG,MAAM,QAAQA,EAAE,CAAC,OAAOA,EAAE,IAAI,GAAG,EAAED,EAAE,CAAC,CAAC,GAAGC,GAAG,OAAOA,GAAG,SAAS,CAAC,IAAID,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,OAAO,QAAQC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,OAAOD,EAAE,OAAOC,GAAG,OAAO,EAAE,KAAK,SAAS,CAAC"}
@@ -1,2 +1,2 @@
1
- import{r as e}from"./FieldType.js";import{z as t}from"zod";import{Kind as n}from"graphql";const r=/^[A-Za-z]{2}(?:-[A-Za-z0-9]{2,8})*$/,i=/^(?:UTC|[A-Za-z_]+\/[A-Za-z_]+)$/,a=/^[+]?\d[\d\s().-]{3,}$/,o=/^[A-Z]{3}$/,s=/^[A-Z]{2}$/,c=-180,l={String_unsecure:()=>new e({name:`String_unsecure`,description:`Unvalidated string scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),Int_unsecure:()=>new e({name:`Int_unsecure`,description:`Unvalidated integer scalar`,zod:t.number().int(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().int().parse(n)},serialize:e=>Math.trunc(typeof e==`number`?e:Number(e)),parseLiteral:e=>{if(e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`integer`}}),Float_unsecure:()=>new e({name:`Float_unsecure`,description:`Unvalidated float scalar`,zod:t.number(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().parse(n)},serialize:e=>Number(e),parseLiteral:e=>{if(e.kind!==n.FLOAT&&e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`number`}}),Boolean:()=>new e({name:`Boolean`,description:`Unvalidated boolean scalar`,zod:t.boolean(),parseValue:e=>t.coerce.boolean().parse(e),serialize:e=>!!e,parseLiteral:e=>{if(e.kind!==n.BOOLEAN)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`boolean`}}),ID:()=>new e({name:`ID`,description:`Unvalidated id scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),JSON:()=>new e({name:`JSON`,zod:t.any(),parseValue:e=>e,serialize:e=>e,jsonSchema:{}}),JSONObject:()=>new e({name:`JSONObject`,zod:t.record(t.string(),t.any()),parseValue:e=>t.record(t.string(),t.any()).parse(e),serialize:e=>e??{},jsonSchema:{type:`object`}}),Date:()=>new e({name:`Date`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString().split(`T`)[0]:String(e),jsonSchema:{type:`string`,format:`date`}}),DateTime:()=>new e({name:`DateTime`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString():String(e),jsonSchema:{type:`string`,format:`date-time`}}),Time:()=>new e({name:`Time`,zod:t.string().regex(/^\d{2}:\d{2}(:\d{2})?$/),parseValue:e=>t.string().regex(/^\d{2}:\d{2}(:\d{2})?$/).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:`^\\d{2}:\\d{2}(:\\d{2})?$`}}),EmailAddress:()=>new e({name:`EmailAddress`,zod:t.string().email(),parseValue:e=>t.string().email().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`email`}}),URL:()=>new e({name:`URL`,zod:t.string().url(),parseValue:e=>t.string().url().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`uri`}}),PhoneNumber:()=>new e({name:`PhoneNumber`,zod:t.string().regex(a),parseValue:e=>t.string().regex(a).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:a.source}}),NonEmptyString:()=>new e({name:`NonEmptyString`,zod:t.string().min(1),parseValue:e=>t.string().min(1).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,minLength:1}}),Locale:()=>new e({name:`Locale`,zod:t.string().regex(r),parseValue:e=>t.string().regex(r).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:r.source}}),TimeZone:()=>new e({name:`TimeZone`,zod:t.string().regex(i),parseValue:e=>t.string().regex(i).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:i.source}}),Latitude:()=>new e({name:`Latitude`,zod:t.number().min(-90).max(90),parseValue:e=>t.coerce.number().min(-90).max(90).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:-90,maximum:90}}),Longitude:()=>new e({name:`Longitude`,zod:t.number().min(c).max(180),parseValue:e=>t.coerce.number().min(c).max(180).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:c,maximum:180}}),Currency:()=>new e({name:`Currency`,zod:t.string().regex(o),parseValue:e=>t.string().regex(o).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:o.source}}),CountryCode:()=>new e({name:`CountryCode`,zod:t.string().regex(s),parseValue:e=>t.string().regex(s).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:s.source}})};export{l};
1
+ import{n as e}from"./FieldType.js";import{z as t}from"zod";import{Kind as n}from"graphql";const r=/^[A-Za-z]{2}(?:-[A-Za-z0-9]{2,8})*$/,i=/^(?:UTC|[A-Za-z_]+\/[A-Za-z_]+)$/,a=/^[+]?\d[\d\s().-]{3,}$/,o=/^[A-Z]{3}$/,s=/^[A-Z]{2}$/,c=-180,l={String_unsecure:()=>new e({name:`String_unsecure`,description:`Unvalidated string scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),Int_unsecure:()=>new e({name:`Int_unsecure`,description:`Unvalidated integer scalar`,zod:t.number().int(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().int().parse(n)},serialize:e=>Math.trunc(typeof e==`number`?e:Number(e)),parseLiteral:e=>{if(e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`integer`}}),Float_unsecure:()=>new e({name:`Float_unsecure`,description:`Unvalidated float scalar`,zod:t.number(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().parse(n)},serialize:e=>Number(e),parseLiteral:e=>{if(e.kind!==n.FLOAT&&e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`number`}}),Boolean:()=>new e({name:`Boolean`,description:`Unvalidated boolean scalar`,zod:t.boolean(),parseValue:e=>t.coerce.boolean().parse(e),serialize:e=>!!e,parseLiteral:e=>{if(e.kind!==n.BOOLEAN)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`boolean`}}),ID:()=>new e({name:`ID`,description:`Unvalidated id scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),JSON:()=>new e({name:`JSON`,zod:t.any(),parseValue:e=>e,serialize:e=>e,jsonSchema:{}}),JSONObject:()=>new e({name:`JSONObject`,zod:t.record(t.string(),t.any()),parseValue:e=>t.record(t.string(),t.any()).parse(e),serialize:e=>e??{},jsonSchema:{type:`object`}}),Date:()=>new e({name:`Date`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString().split(`T`)[0]:String(e),jsonSchema:{type:`string`,format:`date`}}),DateTime:()=>new e({name:`DateTime`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString():String(e),jsonSchema:{type:`string`,format:`date-time`}}),Time:()=>new e({name:`Time`,zod:t.string().regex(/^\d{2}:\d{2}(:\d{2})?$/),parseValue:e=>t.string().regex(/^\d{2}:\d{2}(:\d{2})?$/).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:`^\\d{2}:\\d{2}(:\\d{2})?$`}}),EmailAddress:()=>new e({name:`EmailAddress`,zod:t.string().email(),parseValue:e=>t.string().email().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`email`}}),URL:()=>new e({name:`URL`,zod:t.string().url(),parseValue:e=>t.string().url().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`uri`}}),PhoneNumber:()=>new e({name:`PhoneNumber`,zod:t.string().regex(a),parseValue:e=>t.string().regex(a).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:a.source}}),NonEmptyString:()=>new e({name:`NonEmptyString`,zod:t.string().min(1),parseValue:e=>t.string().min(1).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,minLength:1}}),Locale:()=>new e({name:`Locale`,zod:t.string().regex(r),parseValue:e=>t.string().regex(r).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:r.source}}),TimeZone:()=>new e({name:`TimeZone`,zod:t.string().regex(i),parseValue:e=>t.string().regex(i).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:i.source}}),Latitude:()=>new e({name:`Latitude`,zod:t.number().min(-90).max(90),parseValue:e=>t.coerce.number().min(-90).max(90).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:-90,maximum:90}}),Longitude:()=>new e({name:`Longitude`,zod:t.number().min(c).max(180),parseValue:e=>t.coerce.number().min(c).max(180).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:c,maximum:180}}),Currency:()=>new e({name:`Currency`,zod:t.string().regex(o),parseValue:e=>t.string().regex(o).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:o.source}}),CountryCode:()=>new e({name:`CountryCode`,zod:t.string().regex(s),parseValue:e=>t.string().regex(s).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:s.source}})};export{l};
2
2
  //# sourceMappingURL=ScalarTypeEnum.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScalarTypeEnum.js","names":["r","e","t","n"],"sources":["../../../../schema/dist/ScalarTypeEnum.js"],"sourcesContent":["import{FieldType as e}from\"./FieldType.js\";import{z as t}from\"zod\";import{Kind as n}from\"graphql\";const r=/^[A-Za-z]{2}(?:-[A-Za-z0-9]{2,8})*$/,i=/^(?:UTC|[A-Za-z_]+\\/[A-Za-z_]+)$/,a=/^[+]?\\d[\\d\\s().-]{3,}$/,o=/^[A-Z]{3}$/,s=/^[A-Z]{2}$/,c=-180,l={String_unsecure:()=>new e({name:`String_unsecure`,description:`Unvalidated string scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),Int_unsecure:()=>new e({name:`Int_unsecure`,description:`Unvalidated integer scalar`,zod:t.number().int(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().int().parse(n)},serialize:e=>Math.trunc(typeof e==`number`?e:Number(e)),parseLiteral:e=>{if(e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`integer`}}),Float_unsecure:()=>new e({name:`Float_unsecure`,description:`Unvalidated float scalar`,zod:t.number(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().parse(n)},serialize:e=>Number(e),parseLiteral:e=>{if(e.kind!==n.FLOAT&&e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`number`}}),Boolean:()=>new e({name:`Boolean`,description:`Unvalidated boolean scalar`,zod:t.boolean(),parseValue:e=>t.coerce.boolean().parse(e),serialize:e=>!!e,parseLiteral:e=>{if(e.kind!==n.BOOLEAN)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`boolean`}}),ID:()=>new e({name:`ID`,description:`Unvalidated id scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),JSON:()=>new e({name:`JSON`,zod:t.any(),parseValue:e=>e,serialize:e=>e,jsonSchema:{}}),JSONObject:()=>new e({name:`JSONObject`,zod:t.record(t.string(),t.any()),parseValue:e=>t.record(t.string(),t.any()).parse(e),serialize:e=>e??{},jsonSchema:{type:`object`}}),Date:()=>new e({name:`Date`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString().split(`T`)[0]:String(e),jsonSchema:{type:`string`,format:`date`}}),DateTime:()=>new e({name:`DateTime`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString():String(e),jsonSchema:{type:`string`,format:`date-time`}}),Time:()=>new e({name:`Time`,zod:t.string().regex(/^\\d{2}:\\d{2}(:\\d{2})?$/),parseValue:e=>t.string().regex(/^\\d{2}:\\d{2}(:\\d{2})?$/).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:`^\\\\d{2}:\\\\d{2}(:\\\\d{2})?$`}}),EmailAddress:()=>new e({name:`EmailAddress`,zod:t.string().email(),parseValue:e=>t.string().email().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`email`}}),URL:()=>new e({name:`URL`,zod:t.string().url(),parseValue:e=>t.string().url().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`uri`}}),PhoneNumber:()=>new e({name:`PhoneNumber`,zod:t.string().regex(a),parseValue:e=>t.string().regex(a).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:a.source}}),NonEmptyString:()=>new e({name:`NonEmptyString`,zod:t.string().min(1),parseValue:e=>t.string().min(1).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,minLength:1}}),Locale:()=>new e({name:`Locale`,zod:t.string().regex(r),parseValue:e=>t.string().regex(r).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:r.source}}),TimeZone:()=>new e({name:`TimeZone`,zod:t.string().regex(i),parseValue:e=>t.string().regex(i).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:i.source}}),Latitude:()=>new e({name:`Latitude`,zod:t.number().min(-90).max(90),parseValue:e=>t.coerce.number().min(-90).max(90).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:-90,maximum:90}}),Longitude:()=>new e({name:`Longitude`,zod:t.number().min(c).max(180),parseValue:e=>t.coerce.number().min(c).max(180).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:c,maximum:180}}),Currency:()=>new e({name:`Currency`,zod:t.string().regex(o),parseValue:e=>t.string().regex(o).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:o.source}}),CountryCode:()=>new e({name:`CountryCode`,zod:t.string().regex(s),parseValue:e=>t.string().regex(s).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:s.source}})};export{l as ScalarTypeEnum};\n//# sourceMappingURL=ScalarTypeEnum.js.map"],"mappings":"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"}
1
+ {"version":3,"file":"ScalarTypeEnum.js","names":["e","t","n"],"sources":["../../../../schema/dist/ScalarTypeEnum.js"],"sourcesContent":["import{FieldType as e}from\"./FieldType.js\";import{z as t}from\"zod\";import{Kind as n}from\"graphql\";const r=/^[A-Za-z]{2}(?:-[A-Za-z0-9]{2,8})*$/,i=/^(?:UTC|[A-Za-z_]+\\/[A-Za-z_]+)$/,a=/^[+]?\\d[\\d\\s().-]{3,}$/,o=/^[A-Z]{3}$/,s=/^[A-Z]{2}$/,c=-180,l={String_unsecure:()=>new e({name:`String_unsecure`,description:`Unvalidated string scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),Int_unsecure:()=>new e({name:`Int_unsecure`,description:`Unvalidated integer scalar`,zod:t.number().int(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().int().parse(n)},serialize:e=>Math.trunc(typeof e==`number`?e:Number(e)),parseLiteral:e=>{if(e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`integer`}}),Float_unsecure:()=>new e({name:`Float_unsecure`,description:`Unvalidated float scalar`,zod:t.number(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().parse(n)},serialize:e=>Number(e),parseLiteral:e=>{if(e.kind!==n.FLOAT&&e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`number`}}),Boolean:()=>new e({name:`Boolean`,description:`Unvalidated boolean scalar`,zod:t.boolean(),parseValue:e=>t.coerce.boolean().parse(e),serialize:e=>!!e,parseLiteral:e=>{if(e.kind!==n.BOOLEAN)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`boolean`}}),ID:()=>new e({name:`ID`,description:`Unvalidated id scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),JSON:()=>new e({name:`JSON`,zod:t.any(),parseValue:e=>e,serialize:e=>e,jsonSchema:{}}),JSONObject:()=>new e({name:`JSONObject`,zod:t.record(t.string(),t.any()),parseValue:e=>t.record(t.string(),t.any()).parse(e),serialize:e=>e??{},jsonSchema:{type:`object`}}),Date:()=>new e({name:`Date`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString().split(`T`)[0]:String(e),jsonSchema:{type:`string`,format:`date`}}),DateTime:()=>new e({name:`DateTime`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString():String(e),jsonSchema:{type:`string`,format:`date-time`}}),Time:()=>new e({name:`Time`,zod:t.string().regex(/^\\d{2}:\\d{2}(:\\d{2})?$/),parseValue:e=>t.string().regex(/^\\d{2}:\\d{2}(:\\d{2})?$/).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:`^\\\\d{2}:\\\\d{2}(:\\\\d{2})?$`}}),EmailAddress:()=>new e({name:`EmailAddress`,zod:t.string().email(),parseValue:e=>t.string().email().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`email`}}),URL:()=>new e({name:`URL`,zod:t.string().url(),parseValue:e=>t.string().url().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`uri`}}),PhoneNumber:()=>new e({name:`PhoneNumber`,zod:t.string().regex(a),parseValue:e=>t.string().regex(a).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:a.source}}),NonEmptyString:()=>new e({name:`NonEmptyString`,zod:t.string().min(1),parseValue:e=>t.string().min(1).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,minLength:1}}),Locale:()=>new e({name:`Locale`,zod:t.string().regex(r),parseValue:e=>t.string().regex(r).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:r.source}}),TimeZone:()=>new e({name:`TimeZone`,zod:t.string().regex(i),parseValue:e=>t.string().regex(i).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:i.source}}),Latitude:()=>new e({name:`Latitude`,zod:t.number().min(-90).max(90),parseValue:e=>t.coerce.number().min(-90).max(90).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:-90,maximum:90}}),Longitude:()=>new e({name:`Longitude`,zod:t.number().min(c).max(180),parseValue:e=>t.coerce.number().min(c).max(180).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:c,maximum:180}}),Currency:()=>new e({name:`Currency`,zod:t.string().regex(o),parseValue:e=>t.string().regex(o).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:o.source}}),CountryCode:()=>new e({name:`CountryCode`,zod:t.string().regex(s),parseValue:e=>t.string().regex(s).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:s.source}})};export{l as ScalarTypeEnum};\n//# sourceMappingURL=ScalarTypeEnum.js.map"],"mappings":"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"}
@@ -1 +1 @@
1
- import"./EnumType.js";import{r as e}from"./FieldType.js";import{l as t}from"./ScalarTypeEnum.js";import{t as n}from"./SchemaModel.js";
1
+ import"./EnumType.js";import{n as e}from"./FieldType.js";import{l as t}from"./ScalarTypeEnum.js";import{t as n}from"./SchemaModel.js";
@@ -10,8 +10,21 @@ import { SchemaTypes } from "@pothos/core";
10
10
  //#region src/server/graphql-pothos.d.ts
11
11
 
12
12
  /**
13
- * Register all ContractSpecs from a SpecRegistry onto a Pothos builder
14
- * as Query/Mutation fields, mapping inputs/outputs and applying auth gate.
13
+ * Registers all ContractSpecs from a SpecRegistry onto a Pothos SchemaBuilder.
14
+ *
15
+ * This adapter:
16
+ * 1. Discovers output types from specs and registers them as Pothos object types.
17
+ * 2. Maps `ContractSpec` inputs to Pothos input types.
18
+ * 3. Mounts `query` specs as `Query` fields and `command` specs as `Mutation` fields.
19
+ * 4. Wraps the resolver to:
20
+ * - Enforce auth policies (basic check).
21
+ * - Build a `HandlerCtx`.
22
+ * - Execute via `SpecRegistry`.
23
+ * - Hydrate resource references if applicable.
24
+ *
25
+ * @param builder - The Pothos SchemaBuilder instance.
26
+ * @param reg - The SpecRegistry containing operations.
27
+ * @param resources - (Optional) ResourceRegistry for hydrating resource references.
15
28
  */
16
29
  declare function registerContractsOnBuilder<T extends SchemaTypes>(builder: PothosSchemaTypes.SchemaBuilder<T>, reg: SpecRegistry, resources?: ResourceRegistry): void;
17
30
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"graphql-pothos.d.ts","names":[],"sources":["../../src/server/graphql-pothos.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;AA0BA;;AAC2C,iBAD3B,0BAC2B,CAAA,UADU,WACV,CAAA,CAAA,OAAA,EAAhC,iBAAA,CAAkB,aAAc,CAAA,CAAA,CAAA,EAAA,GAAA,EACpC,YADoC,EAAA,SAAA,CAAA,EAE7B,gBAF6B,CAAA,EAAA,IAAA"}
1
+ {"version":3,"file":"graphql-pothos.d.ts","names":[],"sources":["../../src/server/graphql-pothos.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;AAuCA;;;;;;;;;;;;;;;iBAAgB,qCAAqC,sBAC1C,iBAAA,CAAkB,cAAc,SACpC,0BACO"}
@@ -1 +1 @@
1
- {"version":3,"file":"graphql-pothos.js","names":["acc: Record<string, any>","handlerCtx: HandlerCtx","result: unknown","fieldSettingsFn: QueryFieldThunk<T> | MutationFieldThunk<T>"],"sources":["../../src/server/graphql-pothos.ts"],"sourcesContent":["import type {\n MutationFieldThunk,\n QueryFieldThunk,\n SchemaTypes,\n} from '@pothos/core';\nimport type { HandlerCtx } from '../types';\nimport { defaultGqlField } from '../jsonschema';\nimport type { SpecRegistry } from '../registry';\nimport '@pothos/plugin-prisma';\nimport '@pothos/plugin-complexity';\nimport '@pothos/plugin-relay';\nimport '@pothos/plugin-dataloader';\nimport '@pothos/plugin-tracing';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { ResourceRefDescriptor, ResourceRegistry } from '../resources';\nimport { createInputTypeBuilder } from '../contracts-adapter-input';\nimport type { AnyContractSpec } from '../spec';\nimport {\n hydrateResourceIfNeeded,\n parseReturns,\n} from '../contracts-adapter-hydration';\n\n/**\n * Register all ContractSpecs from a SpecRegistry onto a Pothos builder\n * as Query/Mutation fields, mapping inputs/outputs and applying auth gate.\n */\nexport function registerContractsOnBuilder<T extends SchemaTypes>(\n builder: PothosSchemaTypes.SchemaBuilder<T>,\n reg: SpecRegistry,\n resources?: ResourceRegistry\n) {\n const { buildInputFieldArgs } = createInputTypeBuilder(builder);\n\n // Build a map of output types we need to register\n const outputTypeCache = new Map<string, AnySchemaModel>();\n for (const spec of reg.listSpecs()) {\n const out = spec.io.output as\n | AnySchemaModel\n | ResourceRefDescriptor<boolean>;\n if (out && 'getZod' in out && typeof out.getZod === 'function') {\n const model = out as AnySchemaModel;\n const typeName = model.config?.name ?? 'UnknownOutput';\n if (!outputTypeCache.has(typeName)) {\n outputTypeCache.set(typeName, model);\n }\n }\n }\n\n // Register all output types as GraphQL object types\n for (const [typeName, model] of outputTypeCache.entries()) {\n builder.objectType(typeName as any, {\n fields: (t) => {\n const entries = Object.entries(model.config.fields) as [\n string,\n {\n type: any;\n isOptional: boolean;\n isArray?: boolean;\n },\n ][];\n const acc: Record<string, any> = {};\n for (const [key, field] of entries) {\n const fieldType = field.type;\n let gqlType = 'JSON';\n\n // Check if it's a known scalar type\n if (fieldType && typeof fieldType.getPothos === 'function') {\n const pothosInfo = fieldType.getPothos();\n gqlType = pothosInfo.name || 'JSON';\n // Map unsecure types to their secure equivalents\n if (gqlType === 'String_unsecure') gqlType = 'String';\n if (gqlType === 'Int_unsecure') gqlType = 'Int';\n if (gqlType === 'Float_unsecure') gqlType = 'Float';\n if (gqlType === 'Boolean_unsecure') gqlType = 'Boolean';\n if (gqlType === 'ID_unsecure') gqlType = 'ID';\n }\n\n const typeRef = field.isArray\n ? ([gqlType] as never)\n : (gqlType as never);\n acc[key] = t.field({\n type: typeRef,\n nullable: field.isOptional,\n resolve: (parent: any) => parent[key],\n });\n }\n return acc as never;\n },\n });\n }\n\n // For outputs, prefer an explicit GraphQL type name; otherwise use SchemaModel name or resource ref\n function resolveGraphQLTypeName(contractSpec: AnyContractSpec): string {\n const returnsName = contractSpec.transport?.gql?.returns;\n if (returnsName) return returnsName;\n\n const out = contractSpec.io.output ?? {};\n\n // Check if it's a resource ref\n if (\n out &&\n 'kind' in out &&\n out.kind === 'resource_ref' &&\n 'graphQLType' in out &&\n out.graphQLType\n )\n return String(out.graphQLType);\n\n // Check if it's a SchemaModel with a name\n if (out && 'getZod' in out && typeof out.getZod === 'function') {\n const model = out as AnySchemaModel;\n const typeName = model.config?.name;\n if (typeName && outputTypeCache.has(typeName)) {\n return typeName;\n }\n }\n\n return 'JSON';\n }\n\n // parseReturns moved to hydration util\n\n for (const spec of reg.listSpecs()) {\n const fieldName =\n spec.transport?.gql?.field ??\n defaultGqlField(spec.meta.name, spec.meta.version);\n const returnsName = spec.transport?.gql?.returns;\n const byIdField =\n (spec.transport as unknown as { gql?: { byIdField?: string } })?.gql\n ?.byIdField ?? 'id';\n const returnsResource = (\n spec.transport as unknown as { gql?: { resource?: string } }\n )?.gql?.resource;\n const isQuery = spec.meta.kind === 'query';\n\n const graphQLTypeName = resolveGraphQLTypeName(spec);\n const returnsDecl = (\n spec.transport as unknown as { gql?: { returns?: string } }\n )?.gql?.returns;\n const parsed = parseReturns(returnsDecl ?? graphQLTypeName);\n\n const resolveFieldFn = async (_root: any, args: any, ctx: any) => {\n if (spec.policy.auth !== 'anonymous' && !ctx.user)\n throw new Error('Unauthorized');\n const handlerCtx: HandlerCtx = {\n traceId: ctx.logger?.getTraceId?.() ?? undefined,\n userId: ctx.user?.id ?? null,\n organizationId: ctx.session?.activeOrganizationId ?? null,\n actor: ctx.user ? 'user' : 'anonymous',\n channel: 'web',\n eventPublisher: ctx.eventPublisher,\n };\n const parsedInput = spec.io.input?.getZod().parse(args.input ?? {});\n const result: unknown = await reg.execute(\n spec.meta.name,\n spec.meta.version,\n parsedInput,\n handlerCtx\n );\n const out = spec.io.output as unknown;\n if (\n resources &&\n (returnsResource || (out as { kind?: string })?.kind === 'resource_ref')\n ) {\n const varName =\n byIdField ?? (out as { varName?: string })?.varName ?? 'id';\n const template =\n returnsResource ?? (out as { uriTemplate?: string })?.uriTemplate;\n const hydrated = await hydrateResourceIfNeeded(resources, result, {\n template,\n varName,\n returns: parsed,\n });\n if (hydrated !== result) return hydrated as never;\n }\n if (graphQLTypeName) {\n if (parsed.inner === 'Boolean' && !parsed.isList)\n return Boolean((result as { ok?: boolean })?.ok ?? result) as never;\n // fallback to direct\n return result as unknown as never;\n }\n const parsedOut: unknown = (spec.io.output as AnySchemaModel)\n .getZod()\n .parse(result);\n return parsedOut as never;\n };\n\n const fieldSettingsFn: QueryFieldThunk<T> | MutationFieldThunk<T> = (\n t: PothosSchemaTypes.MutationFieldBuilder<T, T['Root']>\n ) => {\n const inputType = buildInputFieldArgs(spec.io.input);\n return t.field({\n type: (parsed.isList ? [parsed.inner] : parsed.inner) as any,\n complexity: () => 10,\n resolve: resolveFieldFn as any,\n args: inputType\n ? {\n input: t.arg({\n type: inputType,\n required: true,\n }),\n }\n : undefined,\n });\n };\n\n if (isQuery) {\n builder.queryField(\n fieldName,\n fieldSettingsFn as never as QueryFieldThunk<T>\n );\n } else {\n builder.mutationField(\n fieldName,\n fieldSettingsFn as MutationFieldThunk<T>\n );\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"graphql-pothos.js","names":["acc: Record<string, any>","handlerCtx: HandlerCtx","result: unknown","fieldSettingsFn: QueryFieldThunk<T> | MutationFieldThunk<T>"],"sources":["../../src/server/graphql-pothos.ts"],"sourcesContent":["import type {\n MutationFieldThunk,\n QueryFieldThunk,\n SchemaTypes,\n} from '@pothos/core';\nimport type { HandlerCtx } from '../types';\nimport { defaultGqlField } from '../jsonschema';\nimport type { SpecRegistry } from '../registry';\nimport '@pothos/plugin-prisma';\nimport '@pothos/plugin-complexity';\nimport '@pothos/plugin-relay';\nimport '@pothos/plugin-dataloader';\nimport '@pothos/plugin-tracing';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { ResourceRefDescriptor, ResourceRegistry } from '../resources';\nimport { createInputTypeBuilder } from '../contracts-adapter-input';\nimport type { AnyContractSpec } from '../spec';\nimport {\n hydrateResourceIfNeeded,\n parseReturns,\n} from '../contracts-adapter-hydration';\n\n/**\n * Registers all ContractSpecs from a SpecRegistry onto a Pothos SchemaBuilder.\n *\n * This adapter:\n * 1. Discovers output types from specs and registers them as Pothos object types.\n * 2. Maps `ContractSpec` inputs to Pothos input types.\n * 3. Mounts `query` specs as `Query` fields and `command` specs as `Mutation` fields.\n * 4. Wraps the resolver to:\n * - Enforce auth policies (basic check).\n * - Build a `HandlerCtx`.\n * - Execute via `SpecRegistry`.\n * - Hydrate resource references if applicable.\n *\n * @param builder - The Pothos SchemaBuilder instance.\n * @param reg - The SpecRegistry containing operations.\n * @param resources - (Optional) ResourceRegistry for hydrating resource references.\n */\nexport function registerContractsOnBuilder<T extends SchemaTypes>(\n builder: PothosSchemaTypes.SchemaBuilder<T>,\n reg: SpecRegistry,\n resources?: ResourceRegistry\n) {\n const { buildInputFieldArgs } = createInputTypeBuilder(builder);\n\n // Build a map of output types we need to register\n const outputTypeCache = new Map<string, AnySchemaModel>();\n for (const spec of reg.listSpecs()) {\n const out = spec.io.output as\n | AnySchemaModel\n | ResourceRefDescriptor<boolean>;\n if (out && 'getZod' in out && typeof out.getZod === 'function') {\n const model = out as AnySchemaModel;\n const typeName = model.config?.name ?? 'UnknownOutput';\n if (!outputTypeCache.has(typeName)) {\n outputTypeCache.set(typeName, model);\n }\n }\n }\n\n // Register all output types as GraphQL object types\n for (const [typeName, model] of outputTypeCache.entries()) {\n builder.objectType(typeName as any, {\n fields: (t) => {\n const entries = Object.entries(model.config.fields) as [\n string,\n {\n type: any;\n isOptional: boolean;\n isArray?: boolean;\n },\n ][];\n const acc: Record<string, any> = {};\n for (const [key, field] of entries) {\n const fieldType = field.type;\n let gqlType = 'JSON';\n\n // Check if it's a known scalar type\n if (fieldType && typeof fieldType.getPothos === 'function') {\n const pothosInfo = fieldType.getPothos();\n gqlType = pothosInfo.name || 'JSON';\n // Map unsecure types to their secure equivalents\n if (gqlType === 'String_unsecure') gqlType = 'String';\n if (gqlType === 'Int_unsecure') gqlType = 'Int';\n if (gqlType === 'Float_unsecure') gqlType = 'Float';\n if (gqlType === 'Boolean_unsecure') gqlType = 'Boolean';\n if (gqlType === 'ID_unsecure') gqlType = 'ID';\n }\n\n const typeRef = field.isArray\n ? ([gqlType] as never)\n : (gqlType as never);\n acc[key] = t.field({\n type: typeRef,\n nullable: field.isOptional,\n resolve: (parent: any) => parent[key],\n });\n }\n return acc as never;\n },\n });\n }\n\n // For outputs, prefer an explicit GraphQL type name; otherwise use SchemaModel name or resource ref\n function resolveGraphQLTypeName(contractSpec: AnyContractSpec): string {\n const returnsName = contractSpec.transport?.gql?.returns;\n if (returnsName) return returnsName;\n\n const out = contractSpec.io.output ?? {};\n\n // Check if it's a resource ref\n if (\n out &&\n 'kind' in out &&\n out.kind === 'resource_ref' &&\n 'graphQLType' in out &&\n out.graphQLType\n )\n return String(out.graphQLType);\n\n // Check if it's a SchemaModel with a name\n if (out && 'getZod' in out && typeof out.getZod === 'function') {\n const model = out as AnySchemaModel;\n const typeName = model.config?.name;\n if (typeName && outputTypeCache.has(typeName)) {\n return typeName;\n }\n }\n\n return 'JSON';\n }\n\n // parseReturns moved to hydration util\n\n for (const spec of reg.listSpecs()) {\n const fieldName =\n spec.transport?.gql?.field ??\n defaultGqlField(spec.meta.name, spec.meta.version);\n const returnsName = spec.transport?.gql?.returns;\n const byIdField =\n (spec.transport as unknown as { gql?: { byIdField?: string } })?.gql\n ?.byIdField ?? 'id';\n const returnsResource = (\n spec.transport as unknown as { gql?: { resource?: string } }\n )?.gql?.resource;\n const isQuery = spec.meta.kind === 'query';\n\n const graphQLTypeName = resolveGraphQLTypeName(spec);\n const returnsDecl = (\n spec.transport as unknown as { gql?: { returns?: string } }\n )?.gql?.returns;\n const parsed = parseReturns(returnsDecl ?? graphQLTypeName);\n\n const resolveFieldFn = async (_root: any, args: any, ctx: any) => {\n if (spec.policy.auth !== 'anonymous' && !ctx.user)\n throw new Error('Unauthorized');\n const handlerCtx: HandlerCtx = {\n traceId: ctx.logger?.getTraceId?.() ?? undefined,\n userId: ctx.user?.id ?? null,\n organizationId: ctx.session?.activeOrganizationId ?? null,\n actor: ctx.user ? 'user' : 'anonymous',\n channel: 'web',\n eventPublisher: ctx.eventPublisher,\n };\n const parsedInput = spec.io.input?.getZod().parse(args.input ?? {});\n const result: unknown = await reg.execute(\n spec.meta.name,\n spec.meta.version,\n parsedInput,\n handlerCtx\n );\n const out = spec.io.output as unknown;\n if (\n resources &&\n (returnsResource || (out as { kind?: string })?.kind === 'resource_ref')\n ) {\n const varName =\n byIdField ?? (out as { varName?: string })?.varName ?? 'id';\n const template =\n returnsResource ?? (out as { uriTemplate?: string })?.uriTemplate;\n const hydrated = await hydrateResourceIfNeeded(resources, result, {\n template,\n varName,\n returns: parsed,\n });\n if (hydrated !== result) return hydrated as never;\n }\n if (graphQLTypeName) {\n if (parsed.inner === 'Boolean' && !parsed.isList)\n return Boolean((result as { ok?: boolean })?.ok ?? result) as never;\n // fallback to direct\n return result as unknown as never;\n }\n const parsedOut: unknown = (spec.io.output as AnySchemaModel)\n .getZod()\n .parse(result);\n return parsedOut as never;\n };\n\n const fieldSettingsFn: QueryFieldThunk<T> | MutationFieldThunk<T> = (\n t: PothosSchemaTypes.MutationFieldBuilder<T, T['Root']>\n ) => {\n const inputType = buildInputFieldArgs(spec.io.input);\n return t.field({\n type: (parsed.isList ? [parsed.inner] : parsed.inner) as any,\n complexity: () => 10,\n resolve: resolveFieldFn as any,\n args: inputType\n ? {\n input: t.arg({\n type: inputType,\n required: true,\n }),\n }\n : undefined,\n });\n };\n\n if (isQuery) {\n builder.queryField(\n fieldName,\n fieldSettingsFn as never as QueryFieldThunk<T>\n );\n } else {\n builder.mutationField(\n fieldName,\n fieldSettingsFn as MutationFieldThunk<T>\n );\n }\n }\n}\n"],"mappings":"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"}
@@ -9,24 +9,42 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
9
  //#region src/server/provider-mcp.d.ts
10
10
 
11
11
  /**
12
- * Build a unified MCP server exposing:
13
- * - tools: all command specs from SpecRegistry
14
- * - resources: list/read via ResourceRegistry
15
- * - prompts: list/get via PromptRegistry
12
+ * Creates a unified Model Context Protocol (MCP) server exposing operations, resources, and prompts.
13
+ *
14
+ * This function takes registries for operations, resources, and prompts, and exposes them as
15
+ * MCP Tools, Resources, and Prompts respectively. It enables AI agents to discover and interact
16
+ * with the application's capabilities.
17
+ *
18
+ * Features:
19
+ * - **Tools**: Exposes `command` operations as executable tools.
20
+ * - **Resources**: Exposes `ResourceRegistry` entries and `PresentationSpec`s (Markdown/JSON) as read-only resources.
21
+ * - **Prompts**: Exposes `PromptRegistry` entries as templated prompts.
22
+ *
23
+ * @param server - The `McpServer` instance to populate.
24
+ * @param ops - Registry containing operations (tools).
25
+ * @param resources - Registry containing data resources.
26
+ * @param prompts - Registry containing prompt templates.
27
+ * @param ctxFactories - Factories to create context for tools, resources, and prompts execution.
28
+ * @returns The populated `McpServer` instance.
16
29
  */
17
30
  declare function createMcpServer(server: McpServer, ops: SpecRegistry, resources: ResourceRegistry, prompts: PromptRegistry, ctxFactories: {
31
+ /** Factory for tool execution context (e.g., system actor) */
18
32
  toolCtx: () => HandlerCtx;
33
+ /** Factory for prompt rendering context */
19
34
  promptCtx: () => {
20
35
  userId?: string | null;
21
36
  orgId?: string | null;
22
37
  locale?: string;
23
38
  };
39
+ /** Factory for resource resolution context */
24
40
  resourceCtx: () => {
25
41
  userId?: string | null;
26
42
  orgId?: string | null;
27
43
  locale?: string;
28
44
  };
45
+ /** Optional registry for V1 presentations */
29
46
  presentations?: PresentationRegistry;
47
+ /** Optional list of V2 presentation descriptors */
30
48
  presentationsV2?: PresentationDescriptorV2[];
31
49
  }): McpServer;
32
50
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"provider-mcp.d.ts","names":[],"sources":["../../src/server/provider-mcp.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;AAgCA;;;;AAIW,iBAJK,eAAA,CAIL,MAAA,EAHD,SAGC,EAAA,GAAA,EAFJ,YAEI,EAAA,SAAA,EADE,gBACF,EAAA,OAAA,EAAA,cAAA,EAAA,YAAA,EAAA;EAEQ,OAAA,EAAA,GAAA,GAAA,UAAA;EAWC,SAAA,EAAA,GAAA,GAAA;IACE,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IACnB,KAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAAA,MAAA,CAAA,EAAA,MAAA;;;;;;;kBAFiB;oBACE;IACnB"}
1
+ {"version":3,"file":"provider-mcp.d.ts","names":[],"sources":["../../src/server/provider-mcp.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;AA6CA;;;;;;;;;;;;;;;;;iBAAgB,eAAA,SACN,gBACH,yBACM,2BACF;;iBAGQ;;;;;;;;;;;;;;kBAcC;;oBAEE;IACnB"}
@@ -1 +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 * Build a unified MCP server exposing:\n * - tools: all command specs from SpecRegistry\n * - resources: list/read via ResourceRegistry\n * - prompts: list/get via PromptRegistry\n */\nexport function createMcpServer(\n server: McpServer,\n ops: SpecRegistry,\n resources: ResourceRegistry,\n prompts: PromptRegistry,\n ctxFactories: {\n toolCtx: () => HandlerCtx;\n promptCtx: () => {\n userId?: string | null;\n orgId?: string | null;\n locale?: string;\n };\n resourceCtx: () => {\n userId?: string | null;\n orgId?: string | null;\n locale?: string;\n };\n presentations?: PresentationRegistry; // optional extra carrier without breaking call sites\n presentationsV2?: PresentationDescriptorV2[]; // unified descriptors\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":"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"}
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":"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"}
@@ -5,10 +5,30 @@ import { RestOptions } from "./rest-generic.js";
5
5
  //#region src/server/rest-next-app.d.ts
6
6
 
7
7
  /**
8
- * Build a single Next.js App Router handler for a catch-all route:
9
- * app/api/[...all]/route.ts
8
+ * Creates a Next.js App Router route handler for ContractSpec operations.
10
9
  *
11
- * You can also call this from a specific route; it matches full paths internally.
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
+ * ```
12
32
  */
13
33
  declare function makeNextAppHandler(reg: SpecRegistry, ctxFactory: (req: Request) => HandlerCtx, options?: RestOptions): (req: Request) => Promise<Response>;
14
34
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"rest-next-app.d.ts","names":[],"sources":["../../src/server/rest-next-app.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAUA;;;;AAGY,iBAHI,kBAAA,CAGJ,GAAA,EAFL,YAEK,EAAA,UAAA,EAAA,CAAA,GAAA,EADQ,OACR,EAAA,GADoB,UACpB,EAAA,OAAA,CAAA,EAAA,WAAA,CAAA,EAAA,CAAA,GAAA,EAGgC,OAHhC,EAAA,GAGuC,OAHvC,CAGuC,QAHvC,CAAA"}
1
+ {"version":3,"file":"rest-next-app.d.ts","names":[],"sources":["../../src/server/rest-next-app.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA8BA;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,kBAAA,MACT,gCACa,YAAY,sBACpB,oBAGgC,YAAO,QAAA"}
@@ -1 +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 * Build a single Next.js App Router handler for a catch-all route:\n * app/api/[...all]/route.ts\n *\n * You can also call this from a specific route; it matches full paths internally.\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":"uDAUA,SAAgB,EACd,EACA,EACA,EACA,CACA,IAAM,EAAU,EAAmB,EAAK,EAAY,EAAQ,CAC5D,OAAO,eAA8B,EAAc,CACjD,OAAO,EAAQ,EAAI"}
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"}