@lssm/lib.contracts 1.11.0 → 1.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (833) hide show
  1. package/README.md +1 -1
  2. package/dist/_virtual/rolldown_runtime.js +1 -0
  3. package/dist/app-config/app-config.feature.js +1 -0
  4. package/dist/app-config/contracts.js +1 -2
  5. package/dist/app-config/docs/app-config.docblock.js +220 -0
  6. package/dist/app-config/events.js +1 -2
  7. package/dist/app-config/index.js +1 -1
  8. package/dist/app-config/lifecycle-contracts.js +1 -2
  9. package/dist/app-config/runtime.js +1 -2
  10. package/dist/app-config/spec.js +1 -2
  11. package/dist/app-config/validation.js +1 -2
  12. package/dist/capabilities/docs/capabilities.docblock.js +1 -0
  13. package/dist/capabilities/openbanking.js +1 -2
  14. package/dist/capabilities.js +1 -2
  15. package/dist/client/react/drivers/rn-reusables.js +1 -2
  16. package/dist/client/react/drivers/shadcn.js +1 -2
  17. package/dist/client/react/feature-render.js +1 -2
  18. package/dist/client/react/form-render.js +1 -2
  19. package/dist/contract-registry/index.js +1 -0
  20. package/dist/contract-registry/schemas.js +1 -0
  21. package/dist/contract-registry/types.js +0 -0
  22. package/dist/contracts-adapter-hydration.js +1 -2
  23. package/dist/contracts-adapter-input.js +1 -2
  24. package/dist/data-views/docs/data-views.docblock.js +1 -0
  25. package/dist/data-views/query-generator.js +1 -2
  26. package/dist/data-views/runtime.js +1 -2
  27. package/dist/data-views.js +1 -2
  28. package/dist/docs/PUBLISHING.docblock.js +76 -0
  29. package/dist/docs/accessibility_wcag_compliance_specs.docblock.js +350 -0
  30. package/dist/docs/index.js +1 -0
  31. package/dist/docs/meta.docs.js +13 -0
  32. package/dist/docs/presentations.js +1 -0
  33. package/dist/docs/registry.js +1 -0
  34. package/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +383 -0
  35. package/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +68 -0
  36. package/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +140 -0
  37. package/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +86 -0
  38. package/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +1 -0
  39. package/dist/docs/tech/auth/better-auth-nextjs.docblock.js +58 -0
  40. package/dist/docs/tech/contracts/README.docblock.js +1 -0
  41. package/dist/docs/tech/contracts/create-subscription.docblock.js +1 -0
  42. package/dist/docs/tech/contracts/graphql-typed-outputs.docblock.js +180 -0
  43. package/dist/docs/tech/contracts/migrations.docblock.js +1 -0
  44. package/dist/docs/tech/contracts/openapi-export.docblock.js +38 -0
  45. package/dist/docs/tech/contracts/ops-to-presentation-linking.docblock.js +62 -0
  46. package/dist/docs/tech/contracts/overlays.docblock.js +68 -0
  47. package/dist/docs/tech/contracts/tests.docblock.js +132 -0
  48. package/dist/docs/tech/contracts/themes.docblock.js +1 -0
  49. package/dist/docs/tech/contracts/vertical-pocket-family-office.docblock.js +106 -0
  50. package/dist/docs/tech/lifecycle-stage-system.docblock.js +213 -0
  51. package/dist/docs/tech/llm/llm-integration.docblock.js +289 -0
  52. package/dist/docs/tech/mcp-endpoints.docblock.js +1 -0
  53. package/dist/docs/tech/presentation-runtime.docblock.js +1 -0
  54. package/dist/docs/tech/schema/README.docblock.js +262 -0
  55. package/dist/docs/tech/studio/learning-events.docblock.js +1 -0
  56. package/dist/docs/tech/studio/learning-journeys.docblock.js +57 -0
  57. package/dist/docs/tech/studio/platform-admin-panel.docblock.js +63 -0
  58. package/dist/docs/tech/studio/project-access-teams.docblock.js +36 -0
  59. package/dist/docs/tech/studio/project-routing.docblock.js +1 -0
  60. package/dist/docs/tech/studio/sandbox-unlogged.docblock.js +20 -0
  61. package/dist/docs/tech/studio/team-invitations.docblock.js +65 -0
  62. package/dist/docs/tech/studio/workspace-ops.docblock.js +1 -0
  63. package/dist/docs/tech/studio/workspaces.docblock.js +41 -0
  64. package/dist/docs/tech/telemetry-ingest.docblock.js +122 -0
  65. package/dist/docs/tech/templates/runtime.docblock.js +1 -0
  66. package/dist/docs/tech/vscode-extension.docblock.js +68 -0
  67. package/dist/docs/tech/workflows/overview.docblock.js +1 -0
  68. package/dist/docs/tech-contracts.docs.js +76 -0
  69. package/dist/docs/types.js +0 -0
  70. package/dist/events.js +1 -2
  71. package/dist/experiments/docs/experiments.docblock.js +128 -0
  72. package/dist/experiments/evaluator.js +1 -2
  73. package/dist/experiments/spec.js +1 -2
  74. package/dist/features.js +1 -2
  75. package/dist/forms/docs/forms.docblock.js +1 -0
  76. package/dist/forms.js +1 -2
  77. package/dist/index.js +1 -1
  78. package/dist/install.js +1 -2
  79. package/dist/integrations/contracts.js +1 -2
  80. package/dist/integrations/docs/integrations.docblock.js +1 -0
  81. package/dist/integrations/health.js +1 -2
  82. package/dist/integrations/index.js +1 -1
  83. package/dist/integrations/openbanking/contracts/accounts.js +1 -2
  84. package/dist/integrations/openbanking/contracts/balances.js +1 -2
  85. package/dist/integrations/openbanking/contracts/index.js +1 -2
  86. package/dist/integrations/openbanking/contracts/transactions.js +1 -2
  87. package/dist/integrations/openbanking/guards.js +1 -2
  88. package/dist/integrations/openbanking/models.js +1 -2
  89. package/dist/integrations/openbanking/openbanking.feature.js +1 -0
  90. package/dist/integrations/openbanking/telemetry.js +1 -2
  91. package/dist/integrations/providers/elevenlabs.js +1 -2
  92. package/dist/integrations/providers/gcs-storage.js +1 -2
  93. package/dist/integrations/providers/gmail.js +1 -2
  94. package/dist/integrations/providers/google-calendar.js +1 -2
  95. package/dist/integrations/providers/impls/elevenlabs-voice.js +1 -2
  96. package/dist/integrations/providers/impls/gcs-storage.js +1 -2
  97. package/dist/integrations/providers/impls/gmail-inbound.js +1 -2
  98. package/dist/integrations/providers/impls/gmail-outbound.js +1 -2
  99. package/dist/integrations/providers/impls/google-calendar.js +1 -2
  100. package/dist/integrations/providers/impls/index.js +1 -1
  101. package/dist/integrations/providers/impls/mistral-embedding.js +1 -2
  102. package/dist/integrations/providers/impls/mistral-llm.js +1 -2
  103. package/dist/integrations/providers/impls/postmark-email.js +1 -2
  104. package/dist/integrations/providers/impls/powens-client.js +1 -2
  105. package/dist/integrations/providers/impls/powens-openbanking.js +1 -2
  106. package/dist/integrations/providers/impls/provider-factory.js +1 -2
  107. package/dist/integrations/providers/impls/qdrant-vector.js +1 -2
  108. package/dist/integrations/providers/impls/stripe-payments.js +1 -2
  109. package/dist/integrations/providers/impls/twilio-sms.js +1 -2
  110. package/dist/integrations/providers/index.js +1 -1
  111. package/dist/integrations/providers/mistral.js +1 -2
  112. package/dist/integrations/providers/postmark.js +1 -2
  113. package/dist/integrations/providers/powens.js +1 -2
  114. package/dist/integrations/providers/qdrant.js +1 -2
  115. package/dist/integrations/providers/registry.js +1 -0
  116. package/dist/integrations/providers/stripe.js +1 -2
  117. package/dist/integrations/providers/twilio-sms.js +1 -2
  118. package/dist/integrations/runtime.js +1 -2
  119. package/dist/integrations/secrets/aws-secret-manager.js +1 -0
  120. package/dist/integrations/secrets/env-secret-provider.js +1 -2
  121. package/dist/integrations/secrets/gcp-secret-manager.js +1 -2
  122. package/dist/integrations/secrets/index.js +1 -1
  123. package/dist/integrations/secrets/manager.js +1 -2
  124. package/dist/integrations/secrets/provider.js +1 -2
  125. package/dist/integrations/secrets/scaleway-secret-manager.js +1 -0
  126. package/dist/integrations/spec.js +1 -2
  127. package/dist/jobs/define-job.js +1 -0
  128. package/dist/jobs/gcp-cloud-tasks.js +1 -2
  129. package/dist/jobs/gcp-pubsub.js +1 -2
  130. package/dist/jobs/handlers/gmail-sync-handler.js +1 -2
  131. package/dist/jobs/handlers/index.js +1 -1
  132. package/dist/jobs/handlers/ping-handler.js +1 -0
  133. package/dist/jobs/handlers/storage-document-handler.js +1 -2
  134. package/dist/jobs/index.js +1 -1
  135. package/dist/jobs/memory-queue.js +1 -2
  136. package/dist/jobs/queue.js +1 -0
  137. package/dist/jobs/scaleway-sqs-queue.js +1 -0
  138. package/dist/jsonschema.js +1 -2
  139. package/dist/knowledge/contracts.js +1 -2
  140. package/dist/knowledge/docs/knowledge.docblock.js +138 -0
  141. package/dist/knowledge/ingestion/document-processor.js +1 -2
  142. package/dist/knowledge/ingestion/embedding-service.js +1 -2
  143. package/dist/knowledge/ingestion/gmail-adapter.js +1 -2
  144. package/dist/knowledge/ingestion/storage-adapter.js +1 -2
  145. package/dist/knowledge/ingestion/vector-indexer.js +1 -2
  146. package/dist/knowledge/query/service.js +1 -2
  147. package/dist/knowledge/runtime.js +1 -2
  148. package/dist/knowledge/spaces/email-threads.js +1 -2
  149. package/dist/knowledge/spaces/financial-docs.js +1 -2
  150. package/dist/knowledge/spaces/financial-overview.js +1 -2
  151. package/dist/knowledge/spaces/product-canon.js +1 -2
  152. package/dist/knowledge/spaces/support-faq.js +1 -2
  153. package/dist/knowledge/spaces/uploaded-docs.js +1 -2
  154. package/dist/knowledge/spec.js +1 -2
  155. package/dist/llm/exporters.js +8 -0
  156. package/dist/llm/index.js +1 -0
  157. package/dist/llm/prompts.js +220 -0
  158. package/dist/llm/types.js +0 -0
  159. package/dist/markdown.js +1 -2
  160. package/dist/migrations.js +1 -2
  161. package/dist/node_modules/@pothos/plugin-complexity/esm/calculate-complexity.js +1 -0
  162. package/dist/node_modules/@pothos/plugin-complexity/esm/defaults.js +1 -0
  163. package/dist/node_modules/@pothos/plugin-complexity/esm/index.js +1 -0
  164. package/dist/node_modules/@pothos/plugin-complexity/esm/types.js +1 -0
  165. package/dist/node_modules/@pothos/plugin-complexity/esm/util.js +1 -0
  166. package/dist/node_modules/@pothos/plugin-complexity/esm/validator.js +1 -0
  167. package/dist/node_modules/@pothos/plugin-dataloader/esm/field-builder.js +1 -0
  168. package/dist/node_modules/@pothos/plugin-dataloader/esm/index.js +1 -0
  169. package/dist/node_modules/@pothos/plugin-dataloader/esm/refs/index.js +1 -0
  170. package/dist/node_modules/@pothos/plugin-dataloader/esm/refs/interface.js +1 -0
  171. package/dist/node_modules/@pothos/plugin-dataloader/esm/refs/node.js +1 -0
  172. package/dist/node_modules/@pothos/plugin-dataloader/esm/refs/object.js +1 -0
  173. package/dist/node_modules/@pothos/plugin-dataloader/esm/refs/union.js +1 -0
  174. package/dist/node_modules/@pothos/plugin-dataloader/esm/schema-builder.js +1 -0
  175. package/dist/node_modules/@pothos/plugin-dataloader/esm/util.js +1 -0
  176. package/dist/node_modules/@pothos/plugin-prisma/esm/connection-helpers.js +1 -0
  177. package/dist/node_modules/@pothos/plugin-prisma/esm/field-builder.js +1 -0
  178. package/dist/node_modules/@pothos/plugin-prisma/esm/index.js +1 -0
  179. package/dist/node_modules/@pothos/plugin-prisma/esm/interface-ref.js +1 -0
  180. package/dist/node_modules/@pothos/plugin-prisma/esm/model-loader.js +1 -0
  181. package/dist/node_modules/@pothos/plugin-prisma/esm/node-ref.js +1 -0
  182. package/dist/node_modules/@pothos/plugin-prisma/esm/object-ref.js +1 -0
  183. package/dist/node_modules/@pothos/plugin-prisma/esm/prisma-field-builder.js +1 -0
  184. package/dist/node_modules/@pothos/plugin-prisma/esm/schema-builder.js +1 -0
  185. package/dist/node_modules/@pothos/plugin-prisma/esm/types.js +0 -0
  186. package/dist/node_modules/@pothos/plugin-prisma/esm/util/cursors.js +1 -0
  187. package/dist/node_modules/@pothos/plugin-prisma/esm/util/datamodel.js +1 -0
  188. package/dist/node_modules/@pothos/plugin-prisma/esm/util/deep-equal.js +1 -0
  189. package/dist/node_modules/@pothos/plugin-prisma/esm/util/description.js +1 -0
  190. package/dist/node_modules/@pothos/plugin-prisma/esm/util/get-client.js +1 -0
  191. package/dist/node_modules/@pothos/plugin-prisma/esm/util/loader-map.js +1 -0
  192. package/dist/node_modules/@pothos/plugin-prisma/esm/util/map-query.js +1 -0
  193. package/dist/node_modules/@pothos/plugin-prisma/esm/util/relation-map.js +1 -0
  194. package/dist/node_modules/@pothos/plugin-prisma/esm/util/selections.js +1 -0
  195. package/dist/node_modules/@pothos/plugin-prisma/esm/util/usage.js +1 -0
  196. package/dist/node_modules/@pothos/plugin-tracing/esm/index.js +1 -0
  197. package/dist/node_modules/@pothos/plugin-tracing/esm/util.js +1 -0
  198. package/dist/node_modules/dataloader/index.js +7 -0
  199. package/dist/node_modules/graphql/error/GraphQLError.js +5 -0
  200. package/dist/node_modules/graphql/error/index.js +1 -0
  201. package/dist/node_modules/graphql/error/locatedError.js +1 -0
  202. package/dist/node_modules/graphql/error/syntaxError.js +1 -0
  203. package/dist/node_modules/graphql/execution/collectFields.js +1 -0
  204. package/dist/node_modules/graphql/execution/execute.js +1 -0
  205. package/dist/node_modules/graphql/execution/index.js +1 -0
  206. package/dist/node_modules/graphql/execution/mapAsyncIterator.js +1 -0
  207. package/dist/node_modules/graphql/execution/subscribe.js +1 -0
  208. package/dist/node_modules/graphql/execution/values.js +1 -0
  209. package/dist/node_modules/graphql/graphql.js +1 -0
  210. package/dist/node_modules/graphql/index.js +1 -0
  211. package/dist/node_modules/graphql/jsutils/Path.js +1 -0
  212. package/dist/node_modules/graphql/jsutils/devAssert.js +1 -0
  213. package/dist/node_modules/graphql/jsutils/didYouMean.js +1 -0
  214. package/dist/node_modules/graphql/jsutils/groupBy.js +1 -0
  215. package/dist/node_modules/graphql/jsutils/identityFunc.js +1 -0
  216. package/dist/node_modules/graphql/jsutils/inspect.js +1 -0
  217. package/dist/node_modules/graphql/jsutils/instanceOf.js +12 -0
  218. package/dist/node_modules/graphql/jsutils/invariant.js +1 -0
  219. package/dist/node_modules/graphql/jsutils/isAsyncIterable.js +1 -0
  220. package/dist/node_modules/graphql/jsutils/isIterableObject.js +1 -0
  221. package/dist/node_modules/graphql/jsutils/isObjectLike.js +1 -0
  222. package/dist/node_modules/graphql/jsutils/isPromise.js +1 -0
  223. package/dist/node_modules/graphql/jsutils/keyMap.js +1 -0
  224. package/dist/node_modules/graphql/jsutils/keyValMap.js +1 -0
  225. package/dist/node_modules/graphql/jsutils/mapValue.js +1 -0
  226. package/dist/node_modules/graphql/jsutils/memoize3.js +1 -0
  227. package/dist/node_modules/graphql/jsutils/naturalCompare.js +1 -0
  228. package/dist/node_modules/graphql/jsutils/printPathArray.js +1 -0
  229. package/dist/node_modules/graphql/jsutils/promiseForObject.js +1 -0
  230. package/dist/node_modules/graphql/jsutils/promiseReduce.js +1 -0
  231. package/dist/node_modules/graphql/jsutils/suggestionList.js +1 -0
  232. package/dist/node_modules/graphql/jsutils/toError.js +1 -0
  233. package/dist/node_modules/graphql/jsutils/toObjMap.js +1 -0
  234. package/dist/node_modules/graphql/language/ast.js +1 -0
  235. package/dist/node_modules/graphql/language/blockString.js +3 -0
  236. package/dist/node_modules/graphql/language/characterClasses.js +1 -0
  237. package/dist/node_modules/graphql/language/directiveLocation.js +1 -0
  238. package/dist/node_modules/graphql/language/index.js +1 -0
  239. package/dist/node_modules/graphql/language/kinds.js +1 -0
  240. package/dist/node_modules/graphql/language/lexer.js +3 -0
  241. package/dist/node_modules/graphql/language/location.js +1 -0
  242. package/dist/node_modules/graphql/language/parser.js +1 -0
  243. package/dist/node_modules/graphql/language/predicates.js +1 -0
  244. package/dist/node_modules/graphql/language/printLocation.js +2 -0
  245. package/dist/node_modules/graphql/language/printString.js +1 -0
  246. package/dist/node_modules/graphql/language/printer.js +34 -0
  247. package/dist/node_modules/graphql/language/schemaCoordinateLexer.js +1 -0
  248. package/dist/node_modules/graphql/language/source.js +1 -0
  249. package/dist/node_modules/graphql/language/tokenKind.js +1 -0
  250. package/dist/node_modules/graphql/language/visitor.js +1 -0
  251. package/dist/node_modules/graphql/type/assertName.js +1 -0
  252. package/dist/node_modules/graphql/type/definition.js +1 -0
  253. package/dist/node_modules/graphql/type/directives.js +1 -0
  254. package/dist/node_modules/graphql/type/index.js +1 -0
  255. package/dist/node_modules/graphql/type/introspection.js +3 -0
  256. package/dist/node_modules/graphql/type/scalars.js +1 -0
  257. package/dist/node_modules/graphql/type/schema.js +1 -0
  258. package/dist/node_modules/graphql/type/validate.js +3 -0
  259. package/dist/node_modules/graphql/utilities/TypeInfo.js +1 -0
  260. package/dist/node_modules/graphql/utilities/assertValidName.js +1 -0
  261. package/dist/node_modules/graphql/utilities/astFromValue.js +1 -0
  262. package/dist/node_modules/graphql/utilities/buildASTSchema.js +1 -0
  263. package/dist/node_modules/graphql/utilities/buildClientSchema.js +1 -0
  264. package/dist/node_modules/graphql/utilities/coerceInputValue.js +1 -0
  265. package/dist/node_modules/graphql/utilities/concatAST.js +1 -0
  266. package/dist/node_modules/graphql/utilities/extendSchema.js +1 -0
  267. package/dist/node_modules/graphql/utilities/findBreakingChanges.js +1 -0
  268. package/dist/node_modules/graphql/utilities/getIntrospectionQuery.js +107 -0
  269. package/dist/node_modules/graphql/utilities/getOperationAST.js +1 -0
  270. package/dist/node_modules/graphql/utilities/getOperationRootType.js +1 -0
  271. package/dist/node_modules/graphql/utilities/index.js +1 -0
  272. package/dist/node_modules/graphql/utilities/introspectionFromSchema.js +1 -0
  273. package/dist/node_modules/graphql/utilities/lexicographicSortSchema.js +1 -0
  274. package/dist/node_modules/graphql/utilities/printSchema.js +13 -0
  275. package/dist/node_modules/graphql/utilities/resolveSchemaCoordinate.js +1 -0
  276. package/dist/node_modules/graphql/utilities/separateOperations.js +1 -0
  277. package/dist/node_modules/graphql/utilities/sortValueNode.js +1 -0
  278. package/dist/node_modules/graphql/utilities/stripIgnoredCharacters.js +1 -0
  279. package/dist/node_modules/graphql/utilities/typeComparators.js +1 -0
  280. package/dist/node_modules/graphql/utilities/typeFromAST.js +1 -0
  281. package/dist/node_modules/graphql/utilities/valueFromAST.js +1 -0
  282. package/dist/node_modules/graphql/utilities/valueFromASTUntyped.js +1 -0
  283. package/dist/node_modules/graphql/validation/ValidationContext.js +1 -0
  284. package/dist/node_modules/graphql/validation/index.js +1 -0
  285. package/dist/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.js +1 -0
  286. package/dist/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js +1 -0
  287. package/dist/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.js +1 -0
  288. package/dist/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js +1 -0
  289. package/dist/node_modules/graphql/validation/rules/KnownDirectivesRule.js +1 -0
  290. package/dist/node_modules/graphql/validation/rules/KnownFragmentNamesRule.js +1 -0
  291. package/dist/node_modules/graphql/validation/rules/KnownTypeNamesRule.js +1 -0
  292. package/dist/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.js +1 -0
  293. package/dist/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.js +1 -0
  294. package/dist/node_modules/graphql/validation/rules/MaxIntrospectionDepthRule.js +1 -0
  295. package/dist/node_modules/graphql/validation/rules/NoFragmentCyclesRule.js +1 -0
  296. package/dist/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.js +1 -0
  297. package/dist/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.js +1 -0
  298. package/dist/node_modules/graphql/validation/rules/NoUnusedVariablesRule.js +1 -0
  299. package/dist/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.js +1 -0
  300. package/dist/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.js +1 -0
  301. package/dist/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.js +1 -0
  302. package/dist/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.js +1 -0
  303. package/dist/node_modules/graphql/validation/rules/ScalarLeafsRule.js +1 -0
  304. package/dist/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.js +1 -0
  305. package/dist/node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.js +1 -0
  306. package/dist/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.js +1 -0
  307. package/dist/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.js +1 -0
  308. package/dist/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.js +1 -0
  309. package/dist/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js +1 -0
  310. package/dist/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js +1 -0
  311. package/dist/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.js +1 -0
  312. package/dist/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.js +1 -0
  313. package/dist/node_modules/graphql/validation/rules/UniqueOperationNamesRule.js +1 -0
  314. package/dist/node_modules/graphql/validation/rules/UniqueOperationTypesRule.js +1 -0
  315. package/dist/node_modules/graphql/validation/rules/UniqueTypeNamesRule.js +1 -0
  316. package/dist/node_modules/graphql/validation/rules/UniqueVariableNamesRule.js +1 -0
  317. package/dist/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.js +1 -0
  318. package/dist/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.js +1 -0
  319. package/dist/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.js +1 -0
  320. package/dist/node_modules/graphql/validation/rules/custom/NoDeprecatedCustomRule.js +1 -0
  321. package/dist/node_modules/graphql/validation/rules/custom/NoSchemaIntrospectionCustomRule.js +1 -0
  322. package/dist/node_modules/graphql/validation/specifiedRules.js +1 -0
  323. package/dist/node_modules/graphql/validation/validate.js +5 -0
  324. package/dist/node_modules/graphql/version.js +1 -0
  325. package/dist/onboarding-base.js +1 -2
  326. package/dist/openapi.js +1 -0
  327. package/dist/openbanking/docs/openbanking.docblock.js +109 -0
  328. package/dist/ownership.js +1 -2
  329. package/dist/policy/docs/policy.docblock.js +1 -0
  330. package/dist/policy/engine.js +1 -2
  331. package/dist/policy/opa-adapter.js +1 -2
  332. package/dist/policy/spec.js +1 -2
  333. package/dist/presentations/docs/presentations-conventions.docblock.js +8 -0
  334. package/dist/presentations.backcompat.js +1 -2
  335. package/dist/presentations.js +1 -2
  336. package/dist/presentations.v2.js +7 -2
  337. package/dist/prompt.js +1 -2
  338. package/dist/promptRegistry.js +1 -2
  339. package/dist/regenerator/docs/regenerator.docblock.js +184 -0
  340. package/dist/regenerator/executor.js +1 -2
  341. package/dist/regenerator/service.js +1 -2
  342. package/dist/regenerator/sinks.js +1 -2
  343. package/dist/regenerator/utils.js +1 -2
  344. package/dist/registry.js +1 -2
  345. package/dist/resources.js +1 -2
  346. package/dist/schema-to-markdown.js +10 -0
  347. package/dist/server/graphql-pothos.js +1 -2
  348. package/dist/server/index.js +1 -1
  349. package/dist/server/mcp/createMcpServer.js +1 -0
  350. package/dist/server/mcp/mcpTypes.js +0 -0
  351. package/dist/server/mcp/registerPresentations.js +1 -0
  352. package/dist/server/mcp/registerPrompts.js +3 -0
  353. package/dist/server/mcp/registerResources.js +1 -0
  354. package/dist/server/mcp/registerTools.js +1 -0
  355. package/dist/server/provider-mcp.js +1 -2
  356. package/dist/server/rest-elysia.js +1 -2
  357. package/dist/server/rest-express.js +1 -2
  358. package/dist/server/rest-generic.js +1 -2
  359. package/dist/server/rest-next-app.js +1 -2
  360. package/dist/server/rest-next-mcp.js +1 -2
  361. package/dist/server/rest-next-pages.js +1 -2
  362. package/dist/spec.js +1 -2
  363. package/dist/telemetry/anomaly.js +1 -2
  364. package/dist/telemetry/docs/telemetry.docblock.js +139 -0
  365. package/dist/telemetry/spec.js +1 -2
  366. package/dist/telemetry/tracker.js +1 -2
  367. package/dist/tests/runner.js +1 -2
  368. package/dist/tests/spec.js +1 -2
  369. package/dist/themes.js +1 -2
  370. package/dist/workflow/adapters/db-adapter.js +1 -2
  371. package/dist/workflow/adapters/file-adapter.js +1 -2
  372. package/dist/workflow/adapters/memory-store.js +1 -2
  373. package/dist/workflow/expression.js +1 -2
  374. package/dist/workflow/runner.js +1 -2
  375. package/dist/workflow/sla-monitor.js +1 -2
  376. package/dist/workflow/spec.js +1 -2
  377. package/dist/workflow/validation.js +1 -2
  378. package/package.json +353 -193
  379. package/dist/app-config/branding.d.ts +0 -56
  380. package/dist/app-config/branding.d.ts.map +0 -1
  381. package/dist/app-config/contracts.d.ts +0 -245
  382. package/dist/app-config/contracts.d.ts.map +0 -1
  383. package/dist/app-config/contracts.js.map +0 -1
  384. package/dist/app-config/events.d.ts +0 -123
  385. package/dist/app-config/events.d.ts.map +0 -1
  386. package/dist/app-config/events.js.map +0 -1
  387. package/dist/app-config/index.d.ts +0 -8
  388. package/dist/app-config/lifecycle-contracts.d.ts +0 -383
  389. package/dist/app-config/lifecycle-contracts.d.ts.map +0 -1
  390. package/dist/app-config/lifecycle-contracts.js.map +0 -1
  391. package/dist/app-config/lifecycle.d.ts +0 -28
  392. package/dist/app-config/lifecycle.d.ts.map +0 -1
  393. package/dist/app-config/runtime.d.ts +0 -115
  394. package/dist/app-config/runtime.d.ts.map +0 -1
  395. package/dist/app-config/runtime.js.map +0 -1
  396. package/dist/app-config/spec.d.ts +0 -176
  397. package/dist/app-config/spec.d.ts.map +0 -1
  398. package/dist/app-config/spec.js.map +0 -1
  399. package/dist/app-config/validation.d.ts +0 -48
  400. package/dist/app-config/validation.d.ts.map +0 -1
  401. package/dist/app-config/validation.js.map +0 -1
  402. package/dist/capabilities/openbanking.d.ts +0 -10
  403. package/dist/capabilities/openbanking.d.ts.map +0 -1
  404. package/dist/capabilities/openbanking.js.map +0 -1
  405. package/dist/capabilities.d.ts +0 -46
  406. package/dist/capabilities.d.ts.map +0 -1
  407. package/dist/capabilities.js.map +0 -1
  408. package/dist/client/index.d.ts +0 -6
  409. package/dist/client/react/drivers/rn-reusables.d.ts +0 -23
  410. package/dist/client/react/drivers/rn-reusables.d.ts.map +0 -1
  411. package/dist/client/react/drivers/rn-reusables.js.map +0 -1
  412. package/dist/client/react/drivers/shadcn.d.ts +0 -13
  413. package/dist/client/react/drivers/shadcn.d.ts.map +0 -1
  414. package/dist/client/react/drivers/shadcn.js.map +0 -1
  415. package/dist/client/react/feature-render.d.ts +0 -21
  416. package/dist/client/react/feature-render.d.ts.map +0 -1
  417. package/dist/client/react/feature-render.js.map +0 -1
  418. package/dist/client/react/form-render.d.ts +0 -92
  419. package/dist/client/react/form-render.d.ts.map +0 -1
  420. package/dist/client/react/form-render.js.map +0 -1
  421. package/dist/client/react/index.d.ts +0 -5
  422. package/dist/contracts-adapter-hydration.d.ts +0 -16
  423. package/dist/contracts-adapter-hydration.d.ts.map +0 -1
  424. package/dist/contracts-adapter-hydration.js.map +0 -1
  425. package/dist/contracts-adapter-input.d.ts +0 -11
  426. package/dist/contracts-adapter-input.d.ts.map +0 -1
  427. package/dist/contracts-adapter-input.js.map +0 -1
  428. package/dist/data-views/query-generator.d.ts +0 -40
  429. package/dist/data-views/query-generator.d.ts.map +0 -1
  430. package/dist/data-views/query-generator.js.map +0 -1
  431. package/dist/data-views/runtime.d.ts +0 -27
  432. package/dist/data-views/runtime.d.ts.map +0 -1
  433. package/dist/data-views/runtime.js.map +0 -1
  434. package/dist/data-views.d.ts +0 -132
  435. package/dist/data-views.d.ts.map +0 -1
  436. package/dist/data-views.js.map +0 -1
  437. package/dist/events.d.ts +0 -45
  438. package/dist/events.d.ts.map +0 -1
  439. package/dist/events.js.map +0 -1
  440. package/dist/experiments/evaluator.d.ts +0 -38
  441. package/dist/experiments/evaluator.d.ts.map +0 -1
  442. package/dist/experiments/evaluator.js.map +0 -1
  443. package/dist/experiments/spec-resolver.d.ts +0 -17
  444. package/dist/experiments/spec-resolver.d.ts.map +0 -1
  445. package/dist/experiments/spec.d.ts +0 -90
  446. package/dist/experiments/spec.d.ts.map +0 -1
  447. package/dist/experiments/spec.js.map +0 -1
  448. package/dist/features.d.ts +0 -88
  449. package/dist/features.d.ts.map +0 -1
  450. package/dist/features.js.map +0 -1
  451. package/dist/forms.d.ts +0 -259
  452. package/dist/forms.d.ts.map +0 -1
  453. package/dist/forms.js.map +0 -1
  454. package/dist/graphql-federation/dist/index.js +0 -2
  455. package/dist/graphql-federation/dist/index.js.map +0 -1
  456. package/dist/index.d.ts +0 -130
  457. package/dist/install.d.ts +0 -77
  458. package/dist/install.d.ts.map +0 -1
  459. package/dist/install.js.map +0 -1
  460. package/dist/integrations/binding.d.ts +0 -18
  461. package/dist/integrations/binding.d.ts.map +0 -1
  462. package/dist/integrations/connection.d.ts +0 -52
  463. package/dist/integrations/connection.d.ts.map +0 -1
  464. package/dist/integrations/contracts.d.ts +0 -436
  465. package/dist/integrations/contracts.d.ts.map +0 -1
  466. package/dist/integrations/contracts.js.map +0 -1
  467. package/dist/integrations/health.d.ts +0 -22
  468. package/dist/integrations/health.d.ts.map +0 -1
  469. package/dist/integrations/health.js.map +0 -1
  470. package/dist/integrations/index.d.ts +0 -53
  471. package/dist/integrations/openbanking/contracts/accounts.d.ts +0 -288
  472. package/dist/integrations/openbanking/contracts/accounts.d.ts.map +0 -1
  473. package/dist/integrations/openbanking/contracts/accounts.js.map +0 -1
  474. package/dist/integrations/openbanking/contracts/balances.d.ts +0 -164
  475. package/dist/integrations/openbanking/contracts/balances.d.ts.map +0 -1
  476. package/dist/integrations/openbanking/contracts/balances.js.map +0 -1
  477. package/dist/integrations/openbanking/contracts/index.d.ts +0 -10
  478. package/dist/integrations/openbanking/contracts/index.d.ts.map +0 -1
  479. package/dist/integrations/openbanking/contracts/index.js.map +0 -1
  480. package/dist/integrations/openbanking/contracts/transactions.d.ts +0 -212
  481. package/dist/integrations/openbanking/contracts/transactions.d.ts.map +0 -1
  482. package/dist/integrations/openbanking/contracts/transactions.js.map +0 -1
  483. package/dist/integrations/openbanking/guards.d.ts +0 -13
  484. package/dist/integrations/openbanking/guards.d.ts.map +0 -1
  485. package/dist/integrations/openbanking/guards.js.map +0 -1
  486. package/dist/integrations/openbanking/models.d.ts +0 -229
  487. package/dist/integrations/openbanking/models.d.ts.map +0 -1
  488. package/dist/integrations/openbanking/models.js.map +0 -1
  489. package/dist/integrations/openbanking/telemetry.d.ts +0 -16
  490. package/dist/integrations/openbanking/telemetry.d.ts.map +0 -1
  491. package/dist/integrations/openbanking/telemetry.js.map +0 -1
  492. package/dist/integrations/providers/calendar.d.ts +0 -79
  493. package/dist/integrations/providers/calendar.d.ts.map +0 -1
  494. package/dist/integrations/providers/elevenlabs.d.ts +0 -8
  495. package/dist/integrations/providers/elevenlabs.d.ts.map +0 -1
  496. package/dist/integrations/providers/elevenlabs.js.map +0 -1
  497. package/dist/integrations/providers/email.d.ts +0 -87
  498. package/dist/integrations/providers/email.d.ts.map +0 -1
  499. package/dist/integrations/providers/embedding.d.ts +0 -25
  500. package/dist/integrations/providers/embedding.d.ts.map +0 -1
  501. package/dist/integrations/providers/gcs-storage.d.ts +0 -8
  502. package/dist/integrations/providers/gcs-storage.d.ts.map +0 -1
  503. package/dist/integrations/providers/gcs-storage.js.map +0 -1
  504. package/dist/integrations/providers/gmail.d.ts +0 -8
  505. package/dist/integrations/providers/gmail.d.ts.map +0 -1
  506. package/dist/integrations/providers/gmail.js.map +0 -1
  507. package/dist/integrations/providers/google-calendar.d.ts +0 -8
  508. package/dist/integrations/providers/google-calendar.d.ts.map +0 -1
  509. package/dist/integrations/providers/google-calendar.js.map +0 -1
  510. package/dist/integrations/providers/impls/elevenlabs-voice.d.ts +0 -21
  511. package/dist/integrations/providers/impls/elevenlabs-voice.d.ts.map +0 -1
  512. package/dist/integrations/providers/impls/elevenlabs-voice.js.map +0 -1
  513. package/dist/integrations/providers/impls/gcs-storage.d.ts +0 -25
  514. package/dist/integrations/providers/impls/gcs-storage.d.ts.map +0 -1
  515. package/dist/integrations/providers/impls/gcs-storage.js.map +0 -1
  516. package/dist/integrations/providers/impls/gmail-inbound.d.ts +0 -27
  517. package/dist/integrations/providers/impls/gmail-inbound.d.ts.map +0 -1
  518. package/dist/integrations/providers/impls/gmail-inbound.js.map +0 -1
  519. package/dist/integrations/providers/impls/gmail-outbound.d.ts +0 -19
  520. package/dist/integrations/providers/impls/gmail-outbound.d.ts.map +0 -1
  521. package/dist/integrations/providers/impls/gmail-outbound.js.map +0 -1
  522. package/dist/integrations/providers/impls/google-calendar.d.ts +0 -24
  523. package/dist/integrations/providers/impls/google-calendar.d.ts.map +0 -1
  524. package/dist/integrations/providers/impls/google-calendar.js.map +0 -1
  525. package/dist/integrations/providers/impls/index.d.ts +0 -15
  526. package/dist/integrations/providers/impls/mistral-embedding.d.ts +0 -24
  527. package/dist/integrations/providers/impls/mistral-embedding.d.ts.map +0 -1
  528. package/dist/integrations/providers/impls/mistral-embedding.js.map +0 -1
  529. package/dist/integrations/providers/impls/mistral-llm.d.ts +0 -32
  530. package/dist/integrations/providers/impls/mistral-llm.d.ts.map +0 -1
  531. package/dist/integrations/providers/impls/mistral-llm.js.map +0 -1
  532. package/dist/integrations/providers/impls/postmark-email.d.ts +0 -20
  533. package/dist/integrations/providers/impls/postmark-email.d.ts.map +0 -1
  534. package/dist/integrations/providers/impls/postmark-email.js.map +0 -1
  535. package/dist/integrations/providers/impls/powens-client.d.ts +0 -125
  536. package/dist/integrations/providers/impls/powens-client.d.ts.map +0 -1
  537. package/dist/integrations/providers/impls/powens-client.js.map +0 -1
  538. package/dist/integrations/providers/impls/powens-openbanking.d.ts +0 -28
  539. package/dist/integrations/providers/impls/powens-openbanking.d.ts.map +0 -1
  540. package/dist/integrations/providers/impls/powens-openbanking.js.map +0 -1
  541. package/dist/integrations/providers/impls/provider-factory.d.ts +0 -27
  542. package/dist/integrations/providers/impls/provider-factory.d.ts.map +0 -1
  543. package/dist/integrations/providers/impls/provider-factory.js.map +0 -1
  544. package/dist/integrations/providers/impls/qdrant-vector.d.ts +0 -25
  545. package/dist/integrations/providers/impls/qdrant-vector.d.ts.map +0 -1
  546. package/dist/integrations/providers/impls/qdrant-vector.js.map +0 -1
  547. package/dist/integrations/providers/impls/stripe-payments.d.ts +0 -29
  548. package/dist/integrations/providers/impls/stripe-payments.d.ts.map +0 -1
  549. package/dist/integrations/providers/impls/stripe-payments.js.map +0 -1
  550. package/dist/integrations/providers/impls/twilio-sms.d.ts +0 -21
  551. package/dist/integrations/providers/impls/twilio-sms.d.ts.map +0 -1
  552. package/dist/integrations/providers/impls/twilio-sms.js.map +0 -1
  553. package/dist/integrations/providers/index.d.ts +0 -36
  554. package/dist/integrations/providers/llm.d.ts +0 -83
  555. package/dist/integrations/providers/llm.d.ts.map +0 -1
  556. package/dist/integrations/providers/mistral.d.ts +0 -8
  557. package/dist/integrations/providers/mistral.d.ts.map +0 -1
  558. package/dist/integrations/providers/mistral.js.map +0 -1
  559. package/dist/integrations/providers/openbanking.d.ts +0 -129
  560. package/dist/integrations/providers/openbanking.d.ts.map +0 -1
  561. package/dist/integrations/providers/payments.d.ts +0 -110
  562. package/dist/integrations/providers/payments.d.ts.map +0 -1
  563. package/dist/integrations/providers/postmark.d.ts +0 -8
  564. package/dist/integrations/providers/postmark.d.ts.map +0 -1
  565. package/dist/integrations/providers/postmark.js.map +0 -1
  566. package/dist/integrations/providers/powens.d.ts +0 -8
  567. package/dist/integrations/providers/powens.d.ts.map +0 -1
  568. package/dist/integrations/providers/powens.js.map +0 -1
  569. package/dist/integrations/providers/qdrant.d.ts +0 -8
  570. package/dist/integrations/providers/qdrant.d.ts.map +0 -1
  571. package/dist/integrations/providers/qdrant.js.map +0 -1
  572. package/dist/integrations/providers/sms.d.ts +0 -35
  573. package/dist/integrations/providers/sms.d.ts.map +0 -1
  574. package/dist/integrations/providers/storage.d.ts +0 -61
  575. package/dist/integrations/providers/storage.d.ts.map +0 -1
  576. package/dist/integrations/providers/stripe.d.ts +0 -8
  577. package/dist/integrations/providers/stripe.d.ts.map +0 -1
  578. package/dist/integrations/providers/stripe.js.map +0 -1
  579. package/dist/integrations/providers/twilio-sms.d.ts +0 -8
  580. package/dist/integrations/providers/twilio-sms.d.ts.map +0 -1
  581. package/dist/integrations/providers/twilio-sms.js.map +0 -1
  582. package/dist/integrations/providers/vector-store.d.ts +0 -44
  583. package/dist/integrations/providers/vector-store.d.ts.map +0 -1
  584. package/dist/integrations/providers/voice.d.ts +0 -35
  585. package/dist/integrations/providers/voice.d.ts.map +0 -1
  586. package/dist/integrations/runtime.d.ts +0 -100
  587. package/dist/integrations/runtime.d.ts.map +0 -1
  588. package/dist/integrations/runtime.js.map +0 -1
  589. package/dist/integrations/secrets/env-secret-provider.d.ts +0 -32
  590. package/dist/integrations/secrets/env-secret-provider.d.ts.map +0 -1
  591. package/dist/integrations/secrets/env-secret-provider.js.map +0 -1
  592. package/dist/integrations/secrets/gcp-secret-manager.d.ts +0 -33
  593. package/dist/integrations/secrets/gcp-secret-manager.d.ts.map +0 -1
  594. package/dist/integrations/secrets/gcp-secret-manager.js.map +0 -1
  595. package/dist/integrations/secrets/index.d.ts +0 -5
  596. package/dist/integrations/secrets/manager.d.ts +0 -48
  597. package/dist/integrations/secrets/manager.d.ts.map +0 -1
  598. package/dist/integrations/secrets/manager.js.map +0 -1
  599. package/dist/integrations/secrets/provider.d.ts +0 -53
  600. package/dist/integrations/secrets/provider.d.ts.map +0 -1
  601. package/dist/integrations/secrets/provider.js.map +0 -1
  602. package/dist/integrations/spec.d.ts +0 -80
  603. package/dist/integrations/spec.d.ts.map +0 -1
  604. package/dist/integrations/spec.js.map +0 -1
  605. package/dist/jobs/gcp-cloud-tasks.d.ts +0 -42
  606. package/dist/jobs/gcp-cloud-tasks.d.ts.map +0 -1
  607. package/dist/jobs/gcp-cloud-tasks.js.map +0 -1
  608. package/dist/jobs/gcp-pubsub.d.ts +0 -26
  609. package/dist/jobs/gcp-pubsub.d.ts.map +0 -1
  610. package/dist/jobs/gcp-pubsub.js.map +0 -1
  611. package/dist/jobs/handlers/gmail-sync-handler.d.ts +0 -10
  612. package/dist/jobs/handlers/gmail-sync-handler.d.ts.map +0 -1
  613. package/dist/jobs/handlers/gmail-sync-handler.js.map +0 -1
  614. package/dist/jobs/handlers/index.d.ts +0 -3
  615. package/dist/jobs/handlers/storage-document-handler.d.ts +0 -13
  616. package/dist/jobs/handlers/storage-document-handler.d.ts.map +0 -1
  617. package/dist/jobs/handlers/storage-document-handler.js.map +0 -1
  618. package/dist/jobs/index.d.ts +0 -7
  619. package/dist/jobs/memory-queue.d.ts +0 -19
  620. package/dist/jobs/memory-queue.d.ts.map +0 -1
  621. package/dist/jobs/memory-queue.js.map +0 -1
  622. package/dist/jobs/queue.d.ts +0 -27
  623. package/dist/jobs/queue.d.ts.map +0 -1
  624. package/dist/jsonschema.d.ts +0 -27
  625. package/dist/jsonschema.d.ts.map +0 -1
  626. package/dist/jsonschema.js.map +0 -1
  627. package/dist/knowledge/binding.d.ts +0 -26
  628. package/dist/knowledge/binding.d.ts.map +0 -1
  629. package/dist/knowledge/contracts.d.ts +0 -317
  630. package/dist/knowledge/contracts.d.ts.map +0 -1
  631. package/dist/knowledge/contracts.js.map +0 -1
  632. package/dist/knowledge/index.d.ts +0 -10
  633. package/dist/knowledge/ingestion/document-processor.d.ts +0 -25
  634. package/dist/knowledge/ingestion/document-processor.d.ts.map +0 -1
  635. package/dist/knowledge/ingestion/document-processor.js.map +0 -1
  636. package/dist/knowledge/ingestion/embedding-service.d.ts +0 -13
  637. package/dist/knowledge/ingestion/embedding-service.d.ts.map +0 -1
  638. package/dist/knowledge/ingestion/embedding-service.js.map +0 -1
  639. package/dist/knowledge/ingestion/gmail-adapter.d.ts +0 -19
  640. package/dist/knowledge/ingestion/gmail-adapter.d.ts.map +0 -1
  641. package/dist/knowledge/ingestion/gmail-adapter.js.map +0 -1
  642. package/dist/knowledge/ingestion/index.d.ts +0 -6
  643. package/dist/knowledge/ingestion/storage-adapter.d.ts +0 -16
  644. package/dist/knowledge/ingestion/storage-adapter.d.ts.map +0 -1
  645. package/dist/knowledge/ingestion/storage-adapter.js.map +0 -1
  646. package/dist/knowledge/ingestion/vector-indexer.d.ts +0 -19
  647. package/dist/knowledge/ingestion/vector-indexer.d.ts.map +0 -1
  648. package/dist/knowledge/ingestion/vector-indexer.js.map +0 -1
  649. package/dist/knowledge/query/index.d.ts +0 -2
  650. package/dist/knowledge/query/service.d.ts +0 -30
  651. package/dist/knowledge/query/service.d.ts.map +0 -1
  652. package/dist/knowledge/query/service.js.map +0 -1
  653. package/dist/knowledge/runtime.d.ts +0 -33
  654. package/dist/knowledge/runtime.d.ts.map +0 -1
  655. package/dist/knowledge/runtime.js.map +0 -1
  656. package/dist/knowledge/source.d.ts +0 -33
  657. package/dist/knowledge/source.d.ts.map +0 -1
  658. package/dist/knowledge/spaces/email-threads.d.ts +0 -8
  659. package/dist/knowledge/spaces/email-threads.d.ts.map +0 -1
  660. package/dist/knowledge/spaces/email-threads.js.map +0 -1
  661. package/dist/knowledge/spaces/financial-docs.d.ts +0 -8
  662. package/dist/knowledge/spaces/financial-docs.d.ts.map +0 -1
  663. package/dist/knowledge/spaces/financial-docs.js.map +0 -1
  664. package/dist/knowledge/spaces/financial-overview.d.ts +0 -8
  665. package/dist/knowledge/spaces/financial-overview.d.ts.map +0 -1
  666. package/dist/knowledge/spaces/financial-overview.js.map +0 -1
  667. package/dist/knowledge/spaces/index.d.ts +0 -7
  668. package/dist/knowledge/spaces/product-canon.d.ts +0 -8
  669. package/dist/knowledge/spaces/product-canon.d.ts.map +0 -1
  670. package/dist/knowledge/spaces/product-canon.js.map +0 -1
  671. package/dist/knowledge/spaces/support-faq.d.ts +0 -8
  672. package/dist/knowledge/spaces/support-faq.d.ts.map +0 -1
  673. package/dist/knowledge/spaces/support-faq.js.map +0 -1
  674. package/dist/knowledge/spaces/uploaded-docs.d.ts +0 -8
  675. package/dist/knowledge/spaces/uploaded-docs.d.ts.map +0 -1
  676. package/dist/knowledge/spaces/uploaded-docs.js.map +0 -1
  677. package/dist/knowledge/spec.d.ts +0 -53
  678. package/dist/knowledge/spec.d.ts.map +0 -1
  679. package/dist/knowledge/spec.js.map +0 -1
  680. package/dist/markdown.d.ts +0 -22
  681. package/dist/markdown.d.ts.map +0 -1
  682. package/dist/markdown.js.map +0 -1
  683. package/dist/migrations.d.ts +0 -53
  684. package/dist/migrations.d.ts.map +0 -1
  685. package/dist/migrations.js.map +0 -1
  686. package/dist/onboarding-base.d.ts +0 -138
  687. package/dist/onboarding-base.d.ts.map +0 -1
  688. package/dist/onboarding-base.js.map +0 -1
  689. package/dist/ownership.d.ts +0 -76
  690. package/dist/ownership.d.ts.map +0 -1
  691. package/dist/ownership.js.map +0 -1
  692. package/dist/policy/engine.d.ts +0 -40
  693. package/dist/policy/engine.d.ts.map +0 -1
  694. package/dist/policy/engine.js.map +0 -1
  695. package/dist/policy/opa-adapter.d.ts +0 -46
  696. package/dist/policy/opa-adapter.d.ts.map +0 -1
  697. package/dist/policy/opa-adapter.js.map +0 -1
  698. package/dist/policy/spec.d.ts +0 -115
  699. package/dist/policy/spec.d.ts.map +0 -1
  700. package/dist/policy/spec.js.map +0 -1
  701. package/dist/presentations.backcompat.d.ts +0 -8
  702. package/dist/presentations.backcompat.d.ts.map +0 -1
  703. package/dist/presentations.backcompat.js.map +0 -1
  704. package/dist/presentations.d.ts +0 -97
  705. package/dist/presentations.d.ts.map +0 -1
  706. package/dist/presentations.js.map +0 -1
  707. package/dist/presentations.v2.d.ts +0 -96
  708. package/dist/presentations.v2.d.ts.map +0 -1
  709. package/dist/presentations.v2.js.map +0 -1
  710. package/dist/prompt.d.ts +0 -61
  711. package/dist/prompt.d.ts.map +0 -1
  712. package/dist/prompt.js.map +0 -1
  713. package/dist/promptRegistry.d.ts +0 -16
  714. package/dist/promptRegistry.d.ts.map +0 -1
  715. package/dist/promptRegistry.js.map +0 -1
  716. package/dist/regenerator/adapters.d.ts +0 -20
  717. package/dist/regenerator/adapters.d.ts.map +0 -1
  718. package/dist/regenerator/executor.d.ts +0 -71
  719. package/dist/regenerator/executor.d.ts.map +0 -1
  720. package/dist/regenerator/executor.js.map +0 -1
  721. package/dist/regenerator/index.d.ts +0 -7
  722. package/dist/regenerator/service.d.ts +0 -34
  723. package/dist/regenerator/service.d.ts.map +0 -1
  724. package/dist/regenerator/service.js.map +0 -1
  725. package/dist/regenerator/sinks.d.ts +0 -27
  726. package/dist/regenerator/sinks.d.ts.map +0 -1
  727. package/dist/regenerator/sinks.js.map +0 -1
  728. package/dist/regenerator/types.d.ts +0 -108
  729. package/dist/regenerator/types.d.ts.map +0 -1
  730. package/dist/regenerator/utils.d.ts +0 -10
  731. package/dist/regenerator/utils.d.ts.map +0 -1
  732. package/dist/regenerator/utils.js.map +0 -1
  733. package/dist/registry.d.ts +0 -73
  734. package/dist/registry.d.ts.map +0 -1
  735. package/dist/registry.js.map +0 -1
  736. package/dist/resources.d.ts +0 -65
  737. package/dist/resources.d.ts.map +0 -1
  738. package/dist/resources.js.map +0 -1
  739. package/dist/schema/dist/EnumType.js +0 -1
  740. package/dist/schema/dist/FieldType.js +0 -2
  741. package/dist/schema/dist/FieldType.js.map +0 -1
  742. package/dist/schema/dist/ScalarTypeEnum.js +0 -2
  743. package/dist/schema/dist/ScalarTypeEnum.js.map +0 -1
  744. package/dist/schema/dist/SchemaModel.js +0 -2
  745. package/dist/schema/dist/SchemaModel.js.map +0 -1
  746. package/dist/schema/dist/index.js +0 -1
  747. package/dist/server/graphql-pothos.d.ts +0 -32
  748. package/dist/server/graphql-pothos.d.ts.map +0 -1
  749. package/dist/server/graphql-pothos.js.map +0 -1
  750. package/dist/server/graphql-schema-export.d.ts +0 -7
  751. package/dist/server/graphql-schema-export.d.ts.map +0 -1
  752. package/dist/server/graphql-schema-export.js +0 -2
  753. package/dist/server/graphql-schema-export.js.map +0 -1
  754. package/dist/server/index.d.ts +0 -9
  755. package/dist/server/provider-mcp.d.ts +0 -52
  756. package/dist/server/provider-mcp.d.ts.map +0 -1
  757. package/dist/server/provider-mcp.js.map +0 -1
  758. package/dist/server/rest-elysia.d.ts +0 -41
  759. package/dist/server/rest-elysia.d.ts.map +0 -1
  760. package/dist/server/rest-elysia.js.map +0 -1
  761. package/dist/server/rest-express.d.ts +0 -17
  762. package/dist/server/rest-express.d.ts.map +0 -1
  763. package/dist/server/rest-express.js.map +0 -1
  764. package/dist/server/rest-generic.d.ts +0 -33
  765. package/dist/server/rest-generic.d.ts.map +0 -1
  766. package/dist/server/rest-generic.js.map +0 -1
  767. package/dist/server/rest-next-app.d.ts +0 -36
  768. package/dist/server/rest-next-app.d.ts.map +0 -1
  769. package/dist/server/rest-next-app.js.map +0 -1
  770. package/dist/server/rest-next-mcp.d.ts +0 -12
  771. package/dist/server/rest-next-mcp.d.ts.map +0 -1
  772. package/dist/server/rest-next-mcp.js.map +0 -1
  773. package/dist/server/rest-next-pages.d.ts +0 -10
  774. package/dist/server/rest-next-pages.d.ts.map +0 -1
  775. package/dist/server/rest-next-pages.js.map +0 -1
  776. package/dist/spec.d.ts +0 -172
  777. package/dist/spec.d.ts.map +0 -1
  778. package/dist/spec.js.map +0 -1
  779. package/dist/telemetry/anomaly.d.ts +0 -28
  780. package/dist/telemetry/anomaly.d.ts.map +0 -1
  781. package/dist/telemetry/anomaly.js.map +0 -1
  782. package/dist/telemetry/index.d.ts +0 -4
  783. package/dist/telemetry/spec.d.ts +0 -99
  784. package/dist/telemetry/spec.d.ts.map +0 -1
  785. package/dist/telemetry/spec.js.map +0 -1
  786. package/dist/telemetry/tracker.d.ts +0 -52
  787. package/dist/telemetry/tracker.d.ts.map +0 -1
  788. package/dist/telemetry/tracker.js.map +0 -1
  789. package/dist/tests/index.d.ts +0 -3
  790. package/dist/tests/runner.d.ts +0 -44
  791. package/dist/tests/runner.d.ts.map +0 -1
  792. package/dist/tests/runner.js.map +0 -1
  793. package/dist/tests/spec.d.ts +0 -90
  794. package/dist/tests/spec.d.ts.map +0 -1
  795. package/dist/tests/spec.js.map +0 -1
  796. package/dist/themes.d.ts +0 -56
  797. package/dist/themes.d.ts.map +0 -1
  798. package/dist/themes.js.map +0 -1
  799. package/dist/translations/catalog.d.ts +0 -29
  800. package/dist/translations/catalog.d.ts.map +0 -1
  801. package/dist/translations/tenant.d.ts +0 -16
  802. package/dist/translations/tenant.d.ts.map +0 -1
  803. package/dist/types/all.d.ts +0 -60
  804. package/dist/types.d.ts +0 -89
  805. package/dist/types.d.ts.map +0 -1
  806. package/dist/workflow/adapters/db-adapter.d.ts +0 -35
  807. package/dist/workflow/adapters/db-adapter.d.ts.map +0 -1
  808. package/dist/workflow/adapters/db-adapter.js.map +0 -1
  809. package/dist/workflow/adapters/file-adapter.d.ts +0 -15
  810. package/dist/workflow/adapters/file-adapter.d.ts.map +0 -1
  811. package/dist/workflow/adapters/file-adapter.js.map +0 -1
  812. package/dist/workflow/adapters/index.d.ts +0 -4
  813. package/dist/workflow/adapters/memory-store.d.ts +0 -19
  814. package/dist/workflow/adapters/memory-store.d.ts.map +0 -1
  815. package/dist/workflow/adapters/memory-store.js.map +0 -1
  816. package/dist/workflow/expression.d.ts +0 -10
  817. package/dist/workflow/expression.d.ts.map +0 -1
  818. package/dist/workflow/expression.js.map +0 -1
  819. package/dist/workflow/index.d.ts +0 -10
  820. package/dist/workflow/runner.d.ts +0 -75
  821. package/dist/workflow/runner.d.ts.map +0 -1
  822. package/dist/workflow/runner.js.map +0 -1
  823. package/dist/workflow/sla-monitor.d.ts +0 -21
  824. package/dist/workflow/sla-monitor.d.ts.map +0 -1
  825. package/dist/workflow/sla-monitor.js.map +0 -1
  826. package/dist/workflow/spec.d.ts +0 -100
  827. package/dist/workflow/spec.d.ts.map +0 -1
  828. package/dist/workflow/spec.js.map +0 -1
  829. package/dist/workflow/state.d.ts +0 -36
  830. package/dist/workflow/state.d.ts.map +0 -1
  831. package/dist/workflow/validation.d.ts +0 -29
  832. package/dist/workflow/validation.d.ts.map +0 -1
  833. package/dist/workflow/validation.js.map +0 -1
package/README.md CHANGED
@@ -39,7 +39,7 @@ bun add @lssm/lib.contracts @lssm/lib.schema
39
39
 
40
40
  ```ts
41
41
  import { defineCommand, defineQuery } from '@lssm/lib.contracts';
42
- import { z } from 'zod';
42
+ import * as z from "zod";
43
43
  import { SchemaModel, ScalarTypeEnum } from '@lssm/lib.schema';
44
44
 
45
45
  const UserInput = new SchemaModel({
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));export{o as __commonJSMin,c as __toESM};
@@ -0,0 +1 @@
1
+ const e={meta:{key:`app-config`,title:`App Configuration`,description:`Tenant app configuration lifecycle management with draft, preview, and publish stages`,domain:`platform`,owners:[`@platform.sigil`],tags:[`app-config`,`lifecycle`,`configuration`,`tenant`],stability:`beta`},operations:[],events:[{name:`app_config.draft_created`,version:1},{name:`app_config.promoted_to_preview`,version:1},{name:`app_config.published`,version:1},{name:`app_config.rolled_back`,version:1}],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:`app-config`,version:1}],requires:[]}};export{e as AppConfigFeature};
@@ -1,2 +1 @@
1
- import{l as e}from"../schema/dist/ScalarTypeEnum.js";import{t}from"../schema/dist/SchemaModel.js";import"../schema/dist/index.js";import{defineCommand as n,defineQuery as r}from"../spec.js";import{OwnersEnum as i,StabilityEnum as a,TagsEnum as o}from"../ownership.js";const s=new t({name:`BrandingAssetInput`,fields:{type:{type:e.String_unsecure(),isOptional:!1},url:{type:e.URL(),isOptional:!1},mimeType:{type:e.String_unsecure(),isOptional:!0}}}),c=new t({name:`UpdateTenantBrandingInput`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},environment:{type:e.String_unsecure(),isOptional:!0},appName:{type:e.JSONObject(),isOptional:!0},assets:{type:s,isOptional:!0,isArray:!0},colors:{type:e.JSONObject(),isOptional:!0},customDomain:{type:e.String_unsecure(),isOptional:!0},subdomain:{type:e.String_unsecure(),isOptional:!0}}}),l=new t({name:`UpdateTenantBrandingOutput`,fields:{success:{type:e.Boolean(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),u=new t({name:`VerifyCustomDomainInput`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},domain:{type:e.String_unsecure(),isOptional:!1}}}),d=new t({name:`VerifyCustomDomainOutput`,fields:{status:{type:e.String_unsecure(),isOptional:!1},message:{type:e.String_unsecure(),isOptional:!0}}}),f=new t({name:`TranslationEntryInput`,fields:{key:{type:e.String_unsecure(),isOptional:!1},locale:{type:e.String_unsecure(),isOptional:!1},value:{type:e.String_unsecure(),isOptional:!1},context:{type:e.String_unsecure(),isOptional:!0}}}),p=new t({name:`UpdateBlueprintTranslationInput`,fields:{blueprintName:{type:e.String_unsecure(),isOptional:!1},blueprintVersion:{type:e.Int_unsecure(),isOptional:!1},catalogName:{type:e.String_unsecure(),isOptional:!1},catalogVersion:{type:e.Int_unsecure(),isOptional:!1},defaultLocale:{type:e.String_unsecure(),isOptional:!1},supportedLocales:{type:e.String_unsecure(),isOptional:!1,isArray:!0},entries:{type:f,isOptional:!1,isArray:!0}}}),m=new t({name:`UpdateTenantTranslationInput`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},entries:{type:f,isOptional:!1,isArray:!0},defaultLocale:{type:e.String_unsecure(),isOptional:!0},enabledLocales:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}}),h=new t({name:`MessageResolutionInput`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},locale:{type:e.String_unsecure(),isOptional:!1},key:{type:e.String_unsecure(),isOptional:!1}}}),g=new t({name:`MessageResolutionOutput`,fields:{value:{type:e.String_unsecure(),isOptional:!0},source:{type:e.String_unsecure(),isOptional:!0}}}),_=n({meta:{name:`appConfig.updateTenantBranding`,version:1,description:`Applies tenant branding overrides (names, assets, domains).`,owners:[i.PlatformSigil],tags:[`branding`],stability:a.Beta,goal:`Maintain tenant-specific branding assets and domains.`,context:`Invoked by the Studio or automation when a tenant updates branding settings.`},io:{input:c,output:l},policy:{auth:`admin`,policies:[{name:`platform.app-config.manage`,version:1}]}}),v=n({meta:{name:`appConfig.verifyCustomDomain`,version:1,description:`Validates DNS ownership for tenant custom domains.`,owners:[i.PlatformSigil],tags:[`branding`],stability:a.Experimental,goal:`Confirm tenant-provided domains before activation.`,context:`Triggered after the tenant adds DNS records to verify domain ownership.`},io:{input:u,output:d},policy:{auth:`admin`,policies:[{name:`platform.app-config.manage`,version:1}]}}),y=n({meta:{name:`appConfig.updateBlueprintTranslationCatalog`,version:1,description:`Registers or updates translation entries for a blueprint.`,owners:[i.PlatformSigil],tags:[o.I18n],stability:a.Beta,goal:`Keep blueprint translation catalogs in sync with shipped copy.`,context:`Executed by platform automation or CI when committing updated translation catalogs.`},io:{input:p,output:l},policy:{auth:`admin`,policies:[{name:`platform.app-config.manage`,version:1}]}}),b=n({meta:{name:`appConfig.updateTenantTranslations`,version:1,description:`Applies tenant-specific translation entries.`,owners:[i.PlatformSigil],tags:[o.I18n],stability:a.Beta,goal:`Allow tenants to override selected message keys.`,context:`Called by the Studio when a tenant customizes labels or copy for their locale.`},io:{input:m,output:l},policy:{auth:`admin`,policies:[{name:`platform.app-config.manage`,version:1}]}}),x=r({meta:{name:`appConfig.getResolvedBranding`,version:1,description:`Returns the resolved branding for a tenant/app/environment.`,owners:[i.PlatformSigil],tags:[`branding`],stability:a.Beta,goal:`Expose hydrated branding assets for rendering UI/email experiences.`,context:`Used by runtime surfaces to fetch brand assets prior to rendering tenant-specific experiences.`},io:{input:new t({name:`GetResolvedBrandingInput`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},environment:{type:e.String_unsecure(),isOptional:!0}}}),output:new t({name:`GetResolvedBrandingOutput`,fields:{branding:{type:e.JSONObject(),isOptional:!1}}})},policy:{auth:`admin`,policies:[{name:`platform.app-config.read`,version:1}]}}),S=r({meta:{name:`appConfig.resolveMessage`,version:1,description:`Resolves a translation key for a tenant in the requested locale.`,owners:[i.PlatformSigil],tags:[o.I18n],stability:a.Experimental,goal:`Expose a server-side API for resolving message keys on demand.`,context:`Used by backend services or scripts that need translated copy outside the front-end runtime.`},io:{input:h,output:g},policy:{auth:`admin`,policies:[{name:`platform.app-config.read`,version:1}]}}),C={UpdateTenantBrandingCommand:_,VerifyCustomDomainCommand:v,UpdateBlueprintTranslationCatalogCommand:y,UpdateTenantTranslationOverridesCommand:b,GetResolvedBrandingQuery:x,ResolveMessageQuery:S};function w(e){return e.register(_).register(v).register(y).register(b).register(x).register(S)}export{x as GetResolvedBrandingQuery,S as ResolveMessageQuery,y as UpdateBlueprintTranslationCatalogCommand,_ as UpdateTenantBrandingCommand,b as UpdateTenantTranslationOverridesCommand,v as VerifyCustomDomainCommand,C as appConfigContracts,w as registerAppConfigContracts};
2
- //# sourceMappingURL=contracts.js.map
1
+ import{defineCommand as e,defineQuery as t}from"../spec.js";import{OwnersEnum as n,StabilityEnum as r,TagsEnum as i}from"../ownership.js";import{ScalarTypeEnum as a,SchemaModel as o}from"@lssm/lib.schema";const s=new o({name:`BrandingAssetInput`,fields:{type:{type:a.String_unsecure(),isOptional:!1},url:{type:a.URL(),isOptional:!1},mimeType:{type:a.String_unsecure(),isOptional:!0}}}),c=new o({name:`UpdateTenantBrandingInput`,fields:{tenantId:{type:a.ID(),isOptional:!1},appId:{type:a.ID(),isOptional:!1},environment:{type:a.String_unsecure(),isOptional:!0},appName:{type:a.JSONObject(),isOptional:!0},assets:{type:s,isOptional:!0,isArray:!0},colors:{type:a.JSONObject(),isOptional:!0},customDomain:{type:a.String_unsecure(),isOptional:!0},subdomain:{type:a.String_unsecure(),isOptional:!0}}}),l=new o({name:`UpdateTenantBrandingOutput`,fields:{success:{type:a.Boolean(),isOptional:!1},updatedAt:{type:a.DateTime(),isOptional:!1}}}),u=new o({name:`VerifyCustomDomainInput`,fields:{tenantId:{type:a.ID(),isOptional:!1},appId:{type:a.ID(),isOptional:!1},domain:{type:a.String_unsecure(),isOptional:!1}}}),d=new o({name:`VerifyCustomDomainOutput`,fields:{status:{type:a.String_unsecure(),isOptional:!1},message:{type:a.String_unsecure(),isOptional:!0}}}),f=new o({name:`TranslationEntryInput`,fields:{key:{type:a.String_unsecure(),isOptional:!1},locale:{type:a.String_unsecure(),isOptional:!1},value:{type:a.String_unsecure(),isOptional:!1},context:{type:a.String_unsecure(),isOptional:!0}}}),p=new o({name:`UpdateBlueprintTranslationInput`,fields:{blueprintName:{type:a.String_unsecure(),isOptional:!1},blueprintVersion:{type:a.Int_unsecure(),isOptional:!1},catalogName:{type:a.String_unsecure(),isOptional:!1},catalogVersion:{type:a.Int_unsecure(),isOptional:!1},defaultLocale:{type:a.String_unsecure(),isOptional:!1},supportedLocales:{type:a.String_unsecure(),isOptional:!1,isArray:!0},entries:{type:f,isOptional:!1,isArray:!0}}}),m=new o({name:`UpdateTenantTranslationInput`,fields:{tenantId:{type:a.ID(),isOptional:!1},appId:{type:a.ID(),isOptional:!1},entries:{type:f,isOptional:!1,isArray:!0},defaultLocale:{type:a.String_unsecure(),isOptional:!0},enabledLocales:{type:a.String_unsecure(),isOptional:!0,isArray:!0}}}),h=new o({name:`MessageResolutionInput`,fields:{tenantId:{type:a.ID(),isOptional:!1},appId:{type:a.ID(),isOptional:!1},locale:{type:a.String_unsecure(),isOptional:!1},key:{type:a.String_unsecure(),isOptional:!1}}}),g=new o({name:`MessageResolutionOutput`,fields:{value:{type:a.String_unsecure(),isOptional:!0},source:{type:a.String_unsecure(),isOptional:!0}}}),_=e({meta:{name:`appConfig.updateTenantBranding`,version:1,description:`Applies tenant branding overrides (names, assets, domains).`,owners:[n.PlatformSigil],tags:[`branding`],stability:r.Beta,goal:`Maintain tenant-specific branding assets and domains.`,context:`Invoked by the Studio or automation when a tenant updates branding settings.`},io:{input:c,output:l},policy:{auth:`admin`,policies:[{name:`platform.app-config.manage`,version:1}]}}),v=e({meta:{name:`appConfig.verifyCustomDomain`,version:1,description:`Validates DNS ownership for tenant custom domains.`,owners:[n.PlatformSigil],tags:[`branding`],stability:r.Experimental,goal:`Confirm tenant-provided domains before activation.`,context:`Triggered after the tenant adds DNS records to verify domain ownership.`},io:{input:u,output:d},policy:{auth:`admin`,policies:[{name:`platform.app-config.manage`,version:1}]}}),y=e({meta:{name:`appConfig.updateBlueprintTranslationCatalog`,version:1,description:`Registers or updates translation entries for a blueprint.`,owners:[n.PlatformSigil],tags:[i.I18n],stability:r.Beta,goal:`Keep blueprint translation catalogs in sync with shipped copy.`,context:`Executed by platform automation or CI when committing updated translation catalogs.`},io:{input:p,output:l},policy:{auth:`admin`,policies:[{name:`platform.app-config.manage`,version:1}]}}),b=e({meta:{name:`appConfig.updateTenantTranslations`,version:1,description:`Applies tenant-specific translation entries.`,owners:[n.PlatformSigil],tags:[i.I18n],stability:r.Beta,goal:`Allow tenants to override selected message keys.`,context:`Called by the Studio when a tenant customizes labels or copy for their locale.`},io:{input:m,output:l},policy:{auth:`admin`,policies:[{name:`platform.app-config.manage`,version:1}]}}),x=t({meta:{name:`appConfig.getResolvedBranding`,version:1,description:`Returns the resolved branding for a tenant/app/environment.`,owners:[n.PlatformSigil],tags:[`branding`],stability:r.Beta,goal:`Expose hydrated branding assets for rendering UI/email experiences.`,context:`Used by runtime surfaces to fetch brand assets prior to rendering tenant-specific experiences.`},io:{input:new o({name:`GetResolvedBrandingInput`,fields:{tenantId:{type:a.ID(),isOptional:!1},appId:{type:a.ID(),isOptional:!1},environment:{type:a.String_unsecure(),isOptional:!0}}}),output:new o({name:`GetResolvedBrandingOutput`,fields:{branding:{type:a.JSONObject(),isOptional:!1}}})},policy:{auth:`admin`,policies:[{name:`platform.app-config.read`,version:1}]}}),S=t({meta:{name:`appConfig.resolveMessage`,version:1,description:`Resolves a translation key for a tenant in the requested locale.`,owners:[n.PlatformSigil],tags:[i.I18n],stability:r.Experimental,goal:`Expose a server-side API for resolving message keys on demand.`,context:`Used by backend services or scripts that need translated copy outside the front-end runtime.`},io:{input:h,output:g},policy:{auth:`admin`,policies:[{name:`platform.app-config.read`,version:1}]}}),C={UpdateTenantBrandingCommand:_,VerifyCustomDomainCommand:v,UpdateBlueprintTranslationCatalogCommand:y,UpdateTenantTranslationOverridesCommand:b,GetResolvedBrandingQuery:x,ResolveMessageQuery:S};function w(e){return e.register(_).register(v).register(y).register(b).register(x).register(S)}export{x as GetResolvedBrandingQuery,S as ResolveMessageQuery,y as UpdateBlueprintTranslationCatalogCommand,_ as UpdateTenantBrandingCommand,b as UpdateTenantTranslationOverridesCommand,v as VerifyCustomDomainCommand,C as appConfigContracts,w as registerAppConfigContracts};
@@ -0,0 +1,220 @@
1
+ import{registerDocBlocks as e}from"../../docs/registry.js";import"../../registry.js";const t=[{id:`docs.tech.contracts.app-config`,title:`App Configuration Layers`,summary:`App orchestration is split into three explicit layers:`,kind:`reference`,visibility:`public`,route:`/docs/tech/contracts/app-config`,tags:[`tech`,`contracts`,`app-config`],body:`## App Configuration Layers
2
+
3
+ App orchestration is split into three explicit layers:
4
+
5
+ 1. **AppBlueprintSpec** – global, versioned description of what an app can look like. Stored in Git, no tenant/environment data.
6
+ 2. **TenantAppConfig** – tenant/environment overrides that the future Studio edits. Stored per tenant (DB/contract), mutable at runtime.
7
+ 3. **ResolvedAppConfig** – pure, merged view consumed by the runtime. Derived in-memory from a blueprint + tenant config.
8
+
9
+ - Types & registry: \`packages/libs/contracts/src/app-config/spec.ts\`
10
+ - Resolution helpers: \`packages/libs/contracts/src/app-config/runtime.ts\`
11
+ - CLI wizard (blueprint scaffolding): \`contractspec create app-config\`
12
+
13
+ ### 1. AppBlueprintSpec
14
+
15
+ \`\`\`ts
16
+ export interface AppBlueprintSpec {
17
+ meta: AppBlueprintMeta; // { name, version, appId, ownership }
18
+ capabilities?: { enabled?: CapabilityRef[]; disabled?: CapabilityRef[] };
19
+ features?: { include?: FeatureRef[]; exclude?: FeatureRef[] };
20
+ integrationSlots?: AppIntegrationSlot[];
21
+ branding?: BrandingDefaults;
22
+ dataViews?: Record<string, SpecPointer>;
23
+ workflows?: Record<string, SpecPointer>;
24
+ policies?: PolicyRef[];
25
+ theme?: AppThemeBinding;
26
+ telemetry?: TelemetryBinding;
27
+ experiments?: { active?: ExperimentRef[]; paused?: ExperimentRef[] };
28
+ featureFlags?: FeatureFlagState[];
29
+ routes?: AppRouteConfig[];
30
+ notes?: string;
31
+ }
32
+ \`\`\`
33
+
34
+ Register blueprints with \`AppBlueprintRegistry\`. Blueprints only capture the default/global experience.
35
+
36
+ - **Integration slots** declare the categories and capability requirements an app expects (e.g. \`"primary-payments"\` must be a payments provider that supports managed or BYOK credentials). Slots never include secrets; tenants bind concrete connections later.
37
+ - **Branding defaults** provide message-key based names, placeholder assets, and theme token references that downstream tenants can override.
38
+
39
+ ### 2. TenantAppConfig
40
+
41
+ \`\`\`ts
42
+ export interface TenantAppConfig {
43
+ meta: TenantAppConfigMeta; // { id, tenantId, appId, blueprintName/version, environment?, version, timestamps }
44
+ capabilities?: { enable?: CapabilityRef[]; disable?: CapabilityRef[] };
45
+ features?: { include?: FeatureRef[]; exclude?: FeatureRef[] };
46
+ dataViewOverrides?: TenantSpecOverride[];
47
+ workflowOverrides?: TenantSpecOverride[];
48
+ additionalPolicies?: PolicyRef[];
49
+ themeOverride?: { primary?: ThemeRef | null; fallbacks?: ThemeRef[] };
50
+ telemetryOverride?: { spec?: SpecPointer | null; disabledEvents?: string[] };
51
+ experiments?: { active?: ExperimentRef[]; paused?: ExperimentRef[] };
52
+ featureFlags?: FeatureFlagState[];
53
+ routeOverrides?: TenantRouteOverride[];
54
+ integrations?: AppIntegrationBinding[];
55
+ knowledge?: AppKnowledgeBinding[];
56
+ branding?: TenantBrandingConfig;
57
+ notes?: string;
58
+ }
59
+ \`\`\`
60
+
61
+ This object represents what a tenant edits via the Studio (stored in DB/contracts later).
62
+
63
+ - **AppIntegrationBinding** now maps \`slotId\` → \`connectionId\` (plus optional workflow scopes). It no longer carries capability lists; those are defined once in the slot.
64
+ - **TenantBrandingConfig** allows per-tenant names, assets, and domain overrides while keeping secrets and large files out of blueprints.
65
+
66
+ ### 3. ResolvedAppConfig
67
+
68
+ \`\`\`ts
69
+ export interface ResolvedAppConfig {
70
+ appId: string;
71
+ tenantId: string;
72
+ environment?: string;
73
+ blueprintName: string;
74
+ blueprintVersion: number;
75
+ configVersion: number;
76
+ capabilities: { enabled: CapabilityRef[]; disabled: CapabilityRef[] };
77
+ features: { include: FeatureRef[]; exclude: FeatureRef[] };
78
+ dataViews: Record<string, SpecPointer>;
79
+ workflows: Record<string, SpecPointer>;
80
+ policies: PolicyRef[];
81
+ theme?: AppThemeBinding;
82
+ telemetry?: TelemetryBinding;
83
+ experiments: { catalog: ExperimentRef[]; active: ExperimentRef[]; paused: ExperimentRef[] };
84
+ featureFlags: FeatureFlagState[];
85
+ routes: AppRouteConfig[];
86
+ integrations: ResolvedIntegration[];
87
+ knowledge: ResolvedKnowledge[];
88
+ branding: ResolvedBranding;
89
+ notes?: string;
90
+ }
91
+ \`\`\`
92
+
93
+ Use \`resolveAppConfig(blueprint, tenant)\` to produce this merged view. No IO, no registry lookups—pure data merge.
94
+
95
+ - \`resolveAppConfig\` validates slot/category/mode constraints when \`integrationConnections\` and \`integrationSpecs\` are provided.
96
+ - \`branding\` merges blueprint defaults with tenant overrides, producing a runtime-friendly shape (resolved asset URLs, color values, and effective domain).
97
+
98
+ ### Materializing specs
99
+
100
+ \`composeAppConfig(blueprint, tenant, registries, { strict })\`:
101
+
102
+ 1. Calls \`resolveAppConfig\` to build the merged pointers.
103
+ 2. Looks up referenced specs in the provided registries.
104
+ 3. Returns:
105
+ - \`resolved\` – the merged pointer view
106
+ - \`capabilities\`, \`features\`, \`dataViews\`, \`workflows\`, \`policies\`, \`theme\`, \`telemetry\`, \`experiments\`
107
+ - \`missing\` – unresolved references (strict mode throws).
108
+
109
+ \`\`\`ts
110
+ const blueprint = blueprintRegistry.get('core.app', 1)!;
111
+ const tenant = loadTenantConfigFromDB();
112
+
113
+ const composition = composeAppConfig(blueprint, tenant, {
114
+ capabilities,
115
+ features,
116
+ dataViews,
117
+ workflows,
118
+ policies,
119
+ themes,
120
+ telemetry,
121
+ experiments,
122
+ });
123
+
124
+ if (composition.missing.length) {
125
+ console.warn('Unresolved references', composition.missing);
126
+ }
127
+ \`\`\`
128
+
129
+ ### CLI workflow
130
+
131
+ \`\`\`
132
+ contractspec create app-config
133
+ \`\`\`
134
+
135
+ Generates an \`AppBlueprintSpec\`. A separate flow will later scaffold tenant configs.
136
+
137
+ ### Best practices
138
+
139
+ 1. Keep blueprint and tenant versions monotonic; bump when referenced spec versions change.
140
+ 2. Favor stable slot keys (e.g. \`dataViews.dashboard\`) to align with Studio UX.
141
+ 3. Reference telemetry and experiments declared in their respective specs to maintain observability.
142
+ 4. Run \`resolveAppConfig\` in pure unit tests and \`composeAppConfig(..., { strict: true })\` in CI to catch drift early.
143
+ 5. Pair resolved configs with \`TestSpec\` scenarios to guard tenant experiences end-to-end.
144
+
145
+ ### Static validation
146
+
147
+ Use the validation helpers in \`@lssm/lib.contracts/app-config/validation\` to keep blueprints and tenant configs safe before publish time.
148
+
149
+ \`\`\`ts
150
+ import {
151
+ validateConfig,
152
+ validateBlueprint,
153
+ validateTenantConfig,
154
+ validateResolvedConfig,
155
+ } from '@lssm/lib.contracts/app-config/validation';
156
+
157
+ const context = {
158
+ integrationSpecs,
159
+ tenantConnections,
160
+ knowledgeSpaces,
161
+ knowledgeSources,
162
+ translationCatalogs: {
163
+ blueprint: blueprintCatalog,
164
+ platform: platformCatalog,
165
+ },
166
+ existingConfigs,
167
+ };
168
+
169
+ const blueprintReport = validateBlueprint(blueprint, context);
170
+ const tenantReport = validateTenantConfig(blueprint, tenant, context);
171
+ const publishReport = validateConfig(blueprint, tenant, context);
172
+ \`\`\`
173
+
174
+ - \`ValidationResult\` exposes \`valid\`, plus structured \`errors\`, \`warnings\`, and \`info\`.
175
+ - Core rules cover capability references, integration slot bindings (category/ownership/capabilities), knowledge bindings, branding constraints (domains + assets), and translation coverage.
176
+ - Call \`validateBlueprint\` in CI when committing new specs, and \`validateConfig\` before promoting/publishing a tenant config.
177
+ - \`validateResolvedConfig\` can be used as a runtime pre-flight check when composing full configs for workflows.
178
+ - CLI usage example (blueprint + tenant):
179
+
180
+ \`\`\`
181
+ pnpm contractspec validate \\
182
+ packages/examples/integration-stripe/blueprint.ts \\
183
+ --blueprint packages/examples/integration-stripe/blueprint.ts \\
184
+ --tenant-config packages/examples/integration-stripe/tenant.ts
185
+ \`\`\`
186
+ - Repository script:
187
+
188
+ \`\`\`
189
+ bun run validate:blueprints
190
+ \`\`\`
191
+
192
+ Runs the static validator for the sample blueprints/tenants and is wired into CI.
193
+
194
+
195
+ ### Lifecycle types & events
196
+
197
+ To model multi-step configuration changes, use the lifecycle helpers exported from \`@lssm/lib.contracts/app-config\`:
198
+
199
+ \`\`\`ts
200
+ import type {
201
+ ConfigStatus,
202
+ TenantAppConfigVersion,
203
+ ConfigTransition,
204
+ } from '@lssm/lib.contracts/app-config';
205
+ import {
206
+ ConfigDraftCreatedEvent,
207
+ ConfigPromotedToPreviewEvent,
208
+ ConfigPublishedEvent,
209
+ ConfigRolledBackEvent,
210
+ } from '@lssm/lib.contracts/app-config';
211
+ \`\`\`
212
+
213
+ - \`ConfigStatus\` enumerates the canonical states: \`draft\`, \`preview\`, \`published\`, \`archived\`, \`superseded\`.
214
+ - \`TenantAppConfigMeta\` now includes lifecycle metadata (\`status\`, \`createdBy\`, \`publishedBy\`, \`publishedAt\`, \`rolledBackFrom\`, \`rolledBackTo\`, \`changeSummary\`).
215
+ - \`TenantAppConfigVersion\` couples the lifecycle-aware metadata with the \`TenantAppConfig\` payload for history views.
216
+ - \`ConfigTransition\` captures state changes with actor, timestamp, and optional reason.
217
+ - Lifecycle events (\`app_config.draft_created\`, \`app_config.promoted_to_preview\`, \`app_config.published\`, \`app_config.rolled_back\`) standardize observability across services.
218
+ - Lifecycle contract specs (\`appConfig.lifecycle.*\`) expose typed commands/queries for create → preview → publish → rollback flows.
219
+
220
+ `}];e(t);export{t as tech_contracts_app_config_DocBlocks};
@@ -1,2 +1 @@
1
- import{l as e}from"../schema/dist/ScalarTypeEnum.js";import{t}from"../schema/dist/SchemaModel.js";import"../schema/dist/index.js";import{defineEvent as n}from"../events.js";import{OwnersEnum as r,StabilityEnum as i,TagsEnum as a}from"../ownership.js";const o={title:`Tenant App Config Lifecycle`,description:`Events emitted when tenant app configurations move through lifecycle stages.`,domain:`app-config.lifecycle`,owners:[r.PlatformSigil],tags:[a.Hygiene],stability:i.Beta},s=n({name:`app_config.draft_created`,version:1,description:`A new tenant config draft was created.`,ownership:o,payload:new t({name:`ConfigDraftCreatedPayload`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},version:{type:e.Int_unsecure(),isOptional:!1},blueprintName:{type:e.String_unsecure(),isOptional:!1},blueprintVersion:{type:e.Int_unsecure(),isOptional:!1},createdBy:{type:e.String_unsecure(),isOptional:!1},clonedFrom:{type:e.Int_unsecure(),isOptional:!0}}})}),c=n({name:`app_config.promoted_to_preview`,version:1,description:`A tenant config draft was promoted to preview.`,ownership:o,payload:new t({name:`ConfigPromotedToPreviewPayload`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},version:{type:e.Int_unsecure(),isOptional:!1},promotedBy:{type:e.String_unsecure(),isOptional:!1},warnings:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}})}),l=n({name:`app_config.published`,version:1,description:`A tenant config version was published to production.`,ownership:o,payload:new t({name:`ConfigPublishedPayload`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},version:{type:e.Int_unsecure(),isOptional:!1},previousVersion:{type:e.Int_unsecure(),isOptional:!0},publishedBy:{type:e.String_unsecure(),isOptional:!1},changeSummary:{type:e.String_unsecure(),isOptional:!0},changedSections:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}})}),u=n({name:`app_config.rolled_back`,version:1,description:`A tenant config was rolled back to a previous version.`,ownership:o,payload:new t({name:`ConfigRolledBackPayload`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},newVersion:{type:e.Int_unsecure(),isOptional:!1},rolledBackFrom:{type:e.Int_unsecure(),isOptional:!1},rolledBackTo:{type:e.Int_unsecure(),isOptional:!1},rolledBackBy:{type:e.String_unsecure(),isOptional:!1},reason:{type:e.String_unsecure(),isOptional:!1}}})});export{s as ConfigDraftCreatedEvent,c as ConfigPromotedToPreviewEvent,l as ConfigPublishedEvent,u as ConfigRolledBackEvent};
2
- //# sourceMappingURL=events.js.map
1
+ import{defineEvent as e}from"../events.js";import{OwnersEnum as t,StabilityEnum as n,TagsEnum as r}from"../ownership.js";import{ScalarTypeEnum as i,SchemaModel as a}from"@lssm/lib.schema";const o={title:`Tenant App Config Lifecycle`,description:`Events emitted when tenant app configurations move through lifecycle stages.`,domain:`app-config.lifecycle`,owners:[t.PlatformSigil],tags:[r.Hygiene],stability:n.Beta},s=e({name:`app_config.draft_created`,version:1,description:`A new tenant config draft was created.`,ownership:o,payload:new a({name:`ConfigDraftCreatedPayload`,fields:{tenantId:{type:i.ID(),isOptional:!1},appId:{type:i.ID(),isOptional:!1},version:{type:i.Int_unsecure(),isOptional:!1},blueprintName:{type:i.String_unsecure(),isOptional:!1},blueprintVersion:{type:i.Int_unsecure(),isOptional:!1},createdBy:{type:i.String_unsecure(),isOptional:!1},clonedFrom:{type:i.Int_unsecure(),isOptional:!0}}})}),c=e({name:`app_config.promoted_to_preview`,version:1,description:`A tenant config draft was promoted to preview.`,ownership:o,payload:new a({name:`ConfigPromotedToPreviewPayload`,fields:{tenantId:{type:i.ID(),isOptional:!1},appId:{type:i.ID(),isOptional:!1},version:{type:i.Int_unsecure(),isOptional:!1},promotedBy:{type:i.String_unsecure(),isOptional:!1},warnings:{type:i.String_unsecure(),isOptional:!0,isArray:!0}}})}),l=e({name:`app_config.published`,version:1,description:`A tenant config version was published to production.`,ownership:o,payload:new a({name:`ConfigPublishedPayload`,fields:{tenantId:{type:i.ID(),isOptional:!1},appId:{type:i.ID(),isOptional:!1},version:{type:i.Int_unsecure(),isOptional:!1},previousVersion:{type:i.Int_unsecure(),isOptional:!0},publishedBy:{type:i.String_unsecure(),isOptional:!1},changeSummary:{type:i.String_unsecure(),isOptional:!0},changedSections:{type:i.String_unsecure(),isOptional:!0,isArray:!0}}})}),u=e({name:`app_config.rolled_back`,version:1,description:`A tenant config was rolled back to a previous version.`,ownership:o,payload:new a({name:`ConfigRolledBackPayload`,fields:{tenantId:{type:i.ID(),isOptional:!1},appId:{type:i.ID(),isOptional:!1},newVersion:{type:i.Int_unsecure(),isOptional:!1},rolledBackFrom:{type:i.Int_unsecure(),isOptional:!1},rolledBackTo:{type:i.Int_unsecure(),isOptional:!1},rolledBackBy:{type:i.String_unsecure(),isOptional:!1},reason:{type:i.String_unsecure(),isOptional:!1}}})});export{s as ConfigDraftCreatedEvent,c as ConfigPromotedToPreviewEvent,l as ConfigPublishedEvent,u as ConfigRolledBackEvent};
@@ -1 +1 @@
1
- import{AppBlueprintRegistry as e,makeAppBlueprintKey as t}from"./spec.js";import{composeAppConfig as n,resolveAppConfig as r}from"./runtime.js";import{ConfigDraftCreatedEvent as i,ConfigPromotedToPreviewEvent as a,ConfigPublishedEvent as o,ConfigRolledBackEvent as s}from"./events.js";import{validateBlueprint as c,validateConfig as l,validateResolvedConfig as u,validateTenantConfig as d}from"./validation.js";import{CreateTenantConfigDraftCommand as f,GetTenantConfigVersionQuery as p,ListTenantConfigVersionsQuery as m,PromoteTenantConfigToPreviewCommand as h,PublishTenantConfigCommand as g,RollbackTenantConfigCommand as _,lifecycleContracts as v,registerAppConfigLifecycleContracts as y}from"./lifecycle-contracts.js";export{e as AppBlueprintRegistry,i as ConfigDraftCreatedEvent,a as ConfigPromotedToPreviewEvent,o as ConfigPublishedEvent,s as ConfigRolledBackEvent,f as CreateTenantConfigDraftCommand,p as GetTenantConfigVersionQuery,m as ListTenantConfigVersionsQuery,h as PromoteTenantConfigToPreviewCommand,g as PublishTenantConfigCommand,_ as RollbackTenantConfigCommand,n as composeAppConfig,v as lifecycleContracts,t as makeAppBlueprintKey,y as registerAppConfigLifecycleContracts,r as resolveAppConfig,c as validateBlueprint,l as validateConfig,u as validateResolvedConfig,d as validateTenantConfig};
1
+ import{AppBlueprintRegistry as e,makeAppBlueprintKey as t}from"./spec.js";import{composeAppConfig as n,resolveAppConfig as r}from"./runtime.js";import{AppConfigFeature as i}from"./app-config.feature.js";import{ConfigDraftCreatedEvent as a,ConfigPromotedToPreviewEvent as o,ConfigPublishedEvent as s,ConfigRolledBackEvent as c}from"./events.js";import{validateBlueprint as l,validateConfig as u,validateResolvedConfig as d,validateTenantConfig as f}from"./validation.js";import{CreateTenantConfigDraftCommand as p,GetTenantConfigVersionQuery as m,ListTenantConfigVersionsQuery as h,PromoteTenantConfigToPreviewCommand as g,PublishTenantConfigCommand as _,RollbackTenantConfigCommand as v,lifecycleContracts as y,registerAppConfigLifecycleContracts as b}from"./lifecycle-contracts.js";export{e as AppBlueprintRegistry,i as AppConfigFeature,a as ConfigDraftCreatedEvent,o as ConfigPromotedToPreviewEvent,s as ConfigPublishedEvent,c as ConfigRolledBackEvent,p as CreateTenantConfigDraftCommand,m as GetTenantConfigVersionQuery,h as ListTenantConfigVersionsQuery,g as PromoteTenantConfigToPreviewCommand,_ as PublishTenantConfigCommand,v as RollbackTenantConfigCommand,n as composeAppConfig,y as lifecycleContracts,t as makeAppBlueprintKey,b as registerAppConfigLifecycleContracts,r as resolveAppConfig,l as validateBlueprint,u as validateConfig,d as validateResolvedConfig,f as validateTenantConfig};
@@ -1,2 +1 @@
1
- import{l as e}from"../schema/dist/ScalarTypeEnum.js";import{t}from"../schema/dist/SchemaModel.js";import"../schema/dist/index.js";import{defineCommand as n,defineQuery as r}from"../spec.js";import{OwnersEnum as i,StabilityEnum as a,TagsEnum as o}from"../ownership.js";import{ConfigDraftCreatedEvent as s,ConfigPromotedToPreviewEvent as c,ConfigPublishedEvent as l,ConfigRolledBackEvent as u}from"./events.js";const d={auth:`admin`,policies:[{name:`platform.app-config.manage`,version:1}]},f={auth:`admin`,policies:[{name:`platform.app-config.read`,version:1}]},p=new t({name:`ConfigVersionRecord`,fields:{meta:{type:e.JSONObject(),isOptional:!1},config:{type:e.JSONObject(),isOptional:!1}}}),m=new t({name:`ConfigTransitionRecord`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},fromStatus:{type:e.String_unsecure(),isOptional:!1},toStatus:{type:e.String_unsecure(),isOptional:!1},version:{type:e.Int_unsecure(),isOptional:!1},timestamp:{type:e.DateTime(),isOptional:!1},actor:{type:e.String_unsecure(),isOptional:!1},reason:{type:e.String_unsecure(),isOptional:!0}}}),h=new t({name:`CreateTenantConfigDraftInput`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},blueprintName:{type:e.String_unsecure(),isOptional:!1},blueprintVersion:{type:e.Int_unsecure(),isOptional:!1},environment:{type:e.String_unsecure(),isOptional:!0},fromVersion:{type:e.Int_unsecure(),isOptional:!0},createdBy:{type:e.String_unsecure(),isOptional:!1}}}),g=new t({name:`CreateTenantConfigDraftOutput`,fields:{version:{type:e.Int_unsecure(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),_=n({meta:{name:`appConfig.lifecycle.createDraft`,version:1,description:`Creates a new draft tenant config version.`,owners:[i.PlatformSigil],tags:[o.Hygiene,`app-config`],stability:a.Experimental,goal:`Allow operators to start editing a new tenant config version.`,context:`Invoked by the Studio or automation when starting a new configuration run.`},io:{input:h,output:g},policy:d,sideEffects:{emits:[{ref:s,when:`after successful draft creation`}]}}),v=new t({name:`PromoteTenantConfigPreviewInput`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},version:{type:e.Int_unsecure(),isOptional:!1},promotedBy:{type:e.String_unsecure(),isOptional:!1}}}),y=new t({name:`PromoteTenantConfigPreviewOutput`,fields:{version:{type:e.Int_unsecure(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!1},warnings:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}}),b=n({meta:{name:`appConfig.lifecycle.promoteToPreview`,version:1,description:`Promotes a draft tenant config to preview/testing state.`,owners:[i.PlatformSigil],tags:[o.Hygiene,`app-config`],stability:a.Experimental,goal:`Enable validation and testing of draft configurations.`,context:`Called when a draft passes initial checks and should be exposed to preview environments.`},io:{input:v,output:y},policy:d,sideEffects:{emits:[{ref:c,when:`after promotion to preview`}]}}),x=new t({name:`PublishTenantConfigInput`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},version:{type:e.Int_unsecure(),isOptional:!1},environment:{type:e.String_unsecure(),isOptional:!0},publishedBy:{type:e.String_unsecure(),isOptional:!1},changeSummary:{type:e.String_unsecure(),isOptional:!0}}}),S=new t({name:`PublishTenantConfigOutput`,fields:{version:{type:e.Int_unsecure(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!1},previousVersion:{type:e.Int_unsecure(),isOptional:!0},publishedAt:{type:e.DateTime(),isOptional:!1}}}),C=n({meta:{name:`appConfig.lifecycle.publish`,version:1,description:`Publishes a preview tenant config to production.`,owners:[i.PlatformSigil],tags:[o.Hygiene,`app-config`],stability:a.Experimental,goal:`Promote tested configurations to production safely.`,context:`Triggered after validation passes and change management approvals are complete.`},io:{input:x,output:S},policy:d,sideEffects:{emits:[{ref:l,when:`after publish succeeds`}]}}),w=new t({name:`RollbackTenantConfigInput`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},toVersion:{type:e.Int_unsecure(),isOptional:!1},environment:{type:e.String_unsecure(),isOptional:!0},rolledBackBy:{type:e.String_unsecure(),isOptional:!1},reason:{type:e.String_unsecure(),isOptional:!1}}}),T=new t({name:`RollbackTenantConfigOutput`,fields:{newVersion:{type:e.Int_unsecure(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!1},rolledBackFrom:{type:e.Int_unsecure(),isOptional:!1}}}),E=n({meta:{name:`appConfig.lifecycle.rollback`,version:1,description:`Rolls back to a previously published tenant config version.`,owners:[i.PlatformSigil],tags:[o.Hygiene,`app-config`],stability:a.Experimental,goal:`Provide rapid recovery when new configs regress production.`,context:`Called manually or automatically when monitoring detects regression and a rollback is required.`},io:{input:w,output:T},policy:d,sideEffects:{emits:[{ref:u,when:`after rollback completes`}]}}),D=new t({name:`ListTenantConfigVersionsInput`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1}}}),O=new t({name:`ListTenantConfigVersionsOutput`,fields:{versions:{type:p,isOptional:!1,isArray:!0},transitions:{type:m,isOptional:!0,isArray:!0}}}),k=r({meta:{name:`appConfig.lifecycle.listVersions`,version:1,description:`Lists all versions of a tenant configuration.`,owners:[i.PlatformSigil],tags:[`app-config`,o.Hygiene],stability:a.Experimental,goal:`Support lifecycle views and change audit tooling.`,context:`Used by the Studio to render history timelines and by automation for change tracking.`},io:{input:D,output:O},policy:f}),A=new t({name:`GetTenantConfigVersionInput`,fields:{tenantId:{type:e.ID(),isOptional:!1},appId:{type:e.ID(),isOptional:!1},version:{type:e.Int_unsecure(),isOptional:!1}}}),j=new t({name:`GetTenantConfigVersionOutput`,fields:{version:{type:p,isOptional:!1}}}),M=r({meta:{name:`appConfig.lifecycle.getVersion`,version:1,description:`Fetches a single tenant config version by id.`,owners:[i.PlatformSigil],tags:[`app-config`,o.Hygiene],stability:a.Experimental,goal:`Allow detail drill-down for lifecycle entries.`,context:`Used by automation to fetch config payloads for comparison or export.`},io:{input:A,output:j},policy:f}),N={CreateTenantConfigDraftCommand:_,PromoteTenantConfigToPreviewCommand:b,PublishTenantConfigCommand:C,RollbackTenantConfigCommand:E,ListTenantConfigVersionsQuery:k,GetTenantConfigVersionQuery:M};function P(e){return e.register(_).register(b).register(C).register(E).register(k).register(M)}export{_ as CreateTenantConfigDraftCommand,M as GetTenantConfigVersionQuery,k as ListTenantConfigVersionsQuery,b as PromoteTenantConfigToPreviewCommand,C as PublishTenantConfigCommand,E as RollbackTenantConfigCommand,N as lifecycleContracts,P as registerAppConfigLifecycleContracts};
2
- //# sourceMappingURL=lifecycle-contracts.js.map
1
+ import{defineCommand as e,defineQuery as t}from"../spec.js";import{OwnersEnum as n,StabilityEnum as r,TagsEnum as i}from"../ownership.js";import{ConfigDraftCreatedEvent as a,ConfigPromotedToPreviewEvent as o,ConfigPublishedEvent as s,ConfigRolledBackEvent as c}from"./events.js";import{ScalarTypeEnum as l,SchemaModel as u}from"@lssm/lib.schema";const d={auth:`admin`,policies:[{name:`platform.app-config.manage`,version:1}]},f={auth:`admin`,policies:[{name:`platform.app-config.read`,version:1}]},p=new u({name:`ConfigVersionRecord`,fields:{meta:{type:l.JSONObject(),isOptional:!1},config:{type:l.JSONObject(),isOptional:!1}}}),m=new u({name:`ConfigTransitionRecord`,fields:{tenantId:{type:l.ID(),isOptional:!1},appId:{type:l.ID(),isOptional:!1},fromStatus:{type:l.String_unsecure(),isOptional:!1},toStatus:{type:l.String_unsecure(),isOptional:!1},version:{type:l.Int_unsecure(),isOptional:!1},timestamp:{type:l.DateTime(),isOptional:!1},actor:{type:l.String_unsecure(),isOptional:!1},reason:{type:l.String_unsecure(),isOptional:!0}}}),h=new u({name:`CreateTenantConfigDraftInput`,fields:{tenantId:{type:l.ID(),isOptional:!1},appId:{type:l.ID(),isOptional:!1},blueprintName:{type:l.String_unsecure(),isOptional:!1},blueprintVersion:{type:l.Int_unsecure(),isOptional:!1},environment:{type:l.String_unsecure(),isOptional:!0},fromVersion:{type:l.Int_unsecure(),isOptional:!0},createdBy:{type:l.String_unsecure(),isOptional:!1}}}),g=new u({name:`CreateTenantConfigDraftOutput`,fields:{version:{type:l.Int_unsecure(),isOptional:!1},status:{type:l.String_unsecure(),isOptional:!1},createdAt:{type:l.DateTime(),isOptional:!1}}}),_=e({meta:{name:`appConfig.lifecycle.createDraft`,version:1,description:`Creates a new draft tenant config version.`,owners:[n.PlatformSigil],tags:[i.Hygiene,`app-config`],stability:r.Experimental,goal:`Allow operators to start editing a new tenant config version.`,context:`Invoked by the Studio or automation when starting a new configuration run.`},io:{input:h,output:g},policy:d,sideEffects:{emits:[{ref:a,when:`after successful draft creation`}]}}),v=new u({name:`PromoteTenantConfigPreviewInput`,fields:{tenantId:{type:l.ID(),isOptional:!1},appId:{type:l.ID(),isOptional:!1},version:{type:l.Int_unsecure(),isOptional:!1},promotedBy:{type:l.String_unsecure(),isOptional:!1}}}),y=new u({name:`PromoteTenantConfigPreviewOutput`,fields:{version:{type:l.Int_unsecure(),isOptional:!1},status:{type:l.String_unsecure(),isOptional:!1},warnings:{type:l.String_unsecure(),isOptional:!0,isArray:!0}}}),b=e({meta:{name:`appConfig.lifecycle.promoteToPreview`,version:1,description:`Promotes a draft tenant config to preview/testing state.`,owners:[n.PlatformSigil],tags:[i.Hygiene,`app-config`],stability:r.Experimental,goal:`Enable validation and testing of draft configurations.`,context:`Called when a draft passes initial checks and should be exposed to preview environments.`},io:{input:v,output:y},policy:d,sideEffects:{emits:[{ref:o,when:`after promotion to preview`}]}}),x=new u({name:`PublishTenantConfigInput`,fields:{tenantId:{type:l.ID(),isOptional:!1},appId:{type:l.ID(),isOptional:!1},version:{type:l.Int_unsecure(),isOptional:!1},environment:{type:l.String_unsecure(),isOptional:!0},publishedBy:{type:l.String_unsecure(),isOptional:!1},changeSummary:{type:l.String_unsecure(),isOptional:!0}}}),S=new u({name:`PublishTenantConfigOutput`,fields:{version:{type:l.Int_unsecure(),isOptional:!1},status:{type:l.String_unsecure(),isOptional:!1},previousVersion:{type:l.Int_unsecure(),isOptional:!0},publishedAt:{type:l.DateTime(),isOptional:!1}}}),C=e({meta:{name:`appConfig.lifecycle.publish`,version:1,description:`Publishes a preview tenant config to production.`,owners:[n.PlatformSigil],tags:[i.Hygiene,`app-config`],stability:r.Experimental,goal:`Promote tested configurations to production safely.`,context:`Triggered after validation passes and change management approvals are complete.`},io:{input:x,output:S},policy:d,sideEffects:{emits:[{ref:s,when:`after publish succeeds`}]}}),w=new u({name:`RollbackTenantConfigInput`,fields:{tenantId:{type:l.ID(),isOptional:!1},appId:{type:l.ID(),isOptional:!1},toVersion:{type:l.Int_unsecure(),isOptional:!1},environment:{type:l.String_unsecure(),isOptional:!0},rolledBackBy:{type:l.String_unsecure(),isOptional:!1},reason:{type:l.String_unsecure(),isOptional:!1}}}),T=new u({name:`RollbackTenantConfigOutput`,fields:{newVersion:{type:l.Int_unsecure(),isOptional:!1},status:{type:l.String_unsecure(),isOptional:!1},rolledBackFrom:{type:l.Int_unsecure(),isOptional:!1}}}),E=e({meta:{name:`appConfig.lifecycle.rollback`,version:1,description:`Rolls back to a previously published tenant config version.`,owners:[n.PlatformSigil],tags:[i.Hygiene,`app-config`],stability:r.Experimental,goal:`Provide rapid recovery when new configs regress production.`,context:`Called manually or automatically when monitoring detects regression and a rollback is required.`},io:{input:w,output:T},policy:d,sideEffects:{emits:[{ref:c,when:`after rollback completes`}]}}),D=new u({name:`ListTenantConfigVersionsInput`,fields:{tenantId:{type:l.ID(),isOptional:!1},appId:{type:l.ID(),isOptional:!1}}}),O=new u({name:`ListTenantConfigVersionsOutput`,fields:{versions:{type:p,isOptional:!1,isArray:!0},transitions:{type:m,isOptional:!0,isArray:!0}}}),k=t({meta:{name:`appConfig.lifecycle.listVersions`,version:1,description:`Lists all versions of a tenant configuration.`,owners:[n.PlatformSigil],tags:[`app-config`,i.Hygiene],stability:r.Experimental,goal:`Support lifecycle views and change audit tooling.`,context:`Used by the Studio to render history timelines and by automation for change tracking.`},io:{input:D,output:O},policy:f}),A=new u({name:`GetTenantConfigVersionInput`,fields:{tenantId:{type:l.ID(),isOptional:!1},appId:{type:l.ID(),isOptional:!1},version:{type:l.Int_unsecure(),isOptional:!1}}}),j=new u({name:`GetTenantConfigVersionOutput`,fields:{version:{type:p,isOptional:!1}}}),M=t({meta:{name:`appConfig.lifecycle.getVersion`,version:1,description:`Fetches a single tenant config version by id.`,owners:[n.PlatformSigil],tags:[`app-config`,i.Hygiene],stability:r.Experimental,goal:`Allow detail drill-down for lifecycle entries.`,context:`Used by automation to fetch config payloads for comparison or export.`},io:{input:A,output:j},policy:f}),N={CreateTenantConfigDraftCommand:_,PromoteTenantConfigToPreviewCommand:b,PublishTenantConfigCommand:C,RollbackTenantConfigCommand:E,ListTenantConfigVersionsQuery:k,GetTenantConfigVersionQuery:M};function P(e){return e.register(_).register(b).register(C).register(E).register(k).register(M)}export{_ as CreateTenantConfigDraftCommand,M as GetTenantConfigVersionQuery,k as ListTenantConfigVersionsQuery,b as PromoteTenantConfigToPreviewCommand,C as PublishTenantConfigCommand,E as RollbackTenantConfigCommand,N as lifecycleContracts,P as registerAppConfigLifecycleContracts};
@@ -1,2 +1 @@
1
- function e(e,t,m={}){let g=n(e.capabilities,t.capabilities),_=r(e.features,t.features),v=i(e.dataViews??{},t.dataViewOverrides),y=i(e.workflows??{},t.workflowOverrides),b=a(e.policies??[],t.additionalPolicies??[]),x=o(e.theme,t.themeOverride),S=s(e.telemetry,t.telemetryOverride),C=c(e.experiments,t.experiments),w=d(e.featureFlags??[],t.featureFlags??[]),T=f(e.routes??[],t.routeOverrides??[]),{resolved:E}=p(e.integrationSlots,t.integrations,m.integrationConnections,m.integrationSpecs),D=h(t.knowledge,m.knowledgeSpaces,m.knowledgeSources),O=l(e.branding,t),k=u(e.translationCatalog,t.locales,t.translationOverrides);return{appId:e.meta.appId,tenantId:t.meta.tenantId,environment:t.meta.environment,blueprintName:e.meta.name,blueprintVersion:e.meta.version,configVersion:t.meta.version,capabilities:g,features:_,dataViews:v,workflows:y,policies:b,theme:x,telemetry:S,experiments:C,featureFlags:w,routes:T,integrations:E,knowledge:D,translation:k,branding:O,notes:t.notes??e.notes}}function t(t,n,r,i={}){let a=e(t,n,r),o=[],s=p(t.integrationSlots,n.integrations,r.integrationConnections,r.integrationSpecs);a.integrations=s.resolved,o.push(...s.missing),o.push(...g(n.knowledge??[],r.knowledgeSpaces,r.knowledgeSources));let c=_(a.capabilities.enabled,r.capabilities,o),l=v(a.features.include,r.features,o),u=y(a.dataViews,r.dataViews,`dataView`,o),d=y(a.workflows,r.workflows,`workflow`,o),f=b(a.policies,r.policies,o),{theme:m,fallbacks:h,themeMissing:w}=x(a.theme,r.themes);o.push(...w);let{telemetry:T,telemetryMissing:E}=S(a.telemetry,r.telemetry);o.push(...E);let D=C(a.experiments,r.experiments,o);if(i.strict&&o.length>0){let e=o.map(e=>`${e.type}:${e.identifier}`).join(`, `);throw Error(`composeAppConfig: missing references -> ${e}`)}return{resolved:a,capabilities:c,features:l,dataViews:u,workflows:d,policies:f,theme:m,themeFallbacks:h,telemetry:T,experiments:D,integrations:a.integrations,knowledge:a.knowledge,missing:o}}function n(e,t){let n=k([...e?.enabled??[],...t?.enable??[]],w),r=k([...e?.disabled??[],...t?.disable??[]],w),i=new Set(r.map(w));return{enabled:n.filter(e=>!i.has(w(e))),disabled:r}}function r(e,t){let n=k([...e?.include??[],...t?.include??[]],T),r=k([...e?.exclude??[],...t?.exclude??[]],T),i=new Set(r.map(T));return{include:n.filter(e=>!i.has(T(e))),exclude:r}}function i(e,t){let n={...e};if(!t)return n;for(let e of t)e&&(e.pointer?n[e.slot]=e.pointer:delete n[e.slot]);return n}function a(e,t){return k([...e,...t],D)}function o(e,t){if(!e&&!t)return;let n=t?.primary??e?.primary;if(n)return{primary:n,fallbacks:t?.fallbacks??e?.fallbacks??[]}}function s(e,t){if(!e&&!t)return;let n={spec:e?.spec,disabledEvents:e?.disabledEvents?[...e.disabledEvents]:void 0,samplingOverrides:e?.samplingOverrides?{...e.samplingOverrides}:void 0};if(t?.spec!==void 0&&(n.spec=t.spec??void 0),t?.disabledEvents&&(n.disabledEvents=A([...n.disabledEvents??[],...t.disabledEvents])),t?.samplingOverrides&&(n.samplingOverrides={...n.samplingOverrides??{},...t.samplingOverrides}),!(!n.spec&&!n.disabledEvents?.length))return n}function c(e,t){let n=e?.active??[],r=e?.paused??[],i=t?.active,a=t?.paused,o=i&&i.length>0?i:n,s=a&&a.length>0?a:r,c=k(o,O),l=k(s,O),u=new Set(c.map(O));return l=l.filter(e=>!u.has(O(e))),{catalog:k([...n,...r,...i??[],...a??[]],O),active:c,paused:l}}function l(e,t){let n=t.branding,r=t.meta,i=`app.localhost`,a=n?.customDomain??(n?.subdomain?`${n.subdomain}.${i}`:`${r.tenantId}.${i}`),o=[];t.locales?.defaultLocale&&o.push(t.locales.defaultLocale),n?.appName&&o.push(`default`,`en`);let s;if(n?.appName){for(let e of o){let t=n.appName[e];if(t){s=t;break}}if(!s){let[,e]=Object.entries(n.appName)[0]??[];typeof e==`string`&&(s=e)}}s||=e?.appNameKey??r.appId;let c=new Map,l=e=>{if(e)for(let t of e)t?.type&&`url`in t&&t.url&&c.set(t.type,t.url)};l(e?.assets),l(n?.assets);let u={logo:c.get(`logo`),logoDark:c.get(`logo-dark`),favicon:c.get(`favicon`),ogImage:c.get(`og-image`)},d={primary:n?.colors?.primary??e?.colorTokens?.primary??`#1f2937`,secondary:n?.colors?.secondary??e?.colorTokens?.secondary??`#4b5563`};return{appName:s,assets:u,colors:d,domain:a}}function u(e,t,n){let r=t?.defaultLocale??`en`;return{defaultLocale:r,supportedLocales:A([r,...t?.enabledLocales??[]]),blueprintCatalog:e,tenantOverrides:n?.entries??[]}}function d(e,t){let n=new Map;for(let t of e)n.set(t.key,{...t});for(let e of t)n.set(e.key,{...e});return[...n.values()]}function f(e,t){let n=new Map;for(let t of e)n.set(t.path,{...t});for(let e of t){let t=n.get(e.path)??{path:e.path};e.label!==void 0&&(e.label===null?delete t.label:t.label=e.label),e.dataView!==void 0&&(e.dataView===null?delete t.dataView:t.dataView=e.dataView),e.workflow!==void 0&&(e.workflow===null?delete t.workflow:t.workflow=e.workflow),e.guard!==void 0&&(e.guard===null?delete t.guard:t.guard=e.guard),e.featureFlag!==void 0&&(e.featureFlag===null?delete t.featureFlag:t.featureFlag=e.featureFlag),e.experiment!==void 0&&(e.experiment===null?delete t.experiment:t.experiment=e.experiment),n.set(t.path,t)}return[...n.values()]}function p(e,t,n,r){let i=[],a=[],o=new Set,s=e=>{let t=`${e.type}:${e.identifier}`;o.has(t)||(o.add(t),a.push(e))},c=e??[],l=new Map;for(let e of c)l.set(e.slotId,e);let u=new Map;for(let e of t??[]){if(!l.get(e.slotId)){s({type:`integrationSlot`,identifier:`slot:${e.slotId}`});continue}let t=u.get(e.slotId);t?t.push(e):u.set(e.slotId,[e])}for(let e of c){let t=u.get(e.slotId)??[];e.required&&t.length===0&&s({type:`integrationSlot`,identifier:`slot:${e.slotId}`})}if(!n||!r)return{resolved:i,missing:a};let d=new Map;for(let e of n)d.set(e.meta.id,e);for(let e of c){let t=u.get(e.slotId)??[];if(t.length===0)continue;let n=[...t].sort((e,t)=>{let n=e.priority??2**53-1,r=t.priority??2**53-1;return n===r?0:n<r?-1:1}),a=!1;for(let t of n){let n=d.get(t.connectionId);if(!n){s({type:`integrationConnection`,identifier:`connection:${t.connectionId}`});continue}let o=r.get(n.meta.integrationKey,n.meta.integrationVersion);if(!o){s({type:`integrationSpec`,identifier:`spec:${n.meta.integrationKey}.v${n.meta.integrationVersion}`});continue}if(o.meta.category!==e.requiredCategory){s({type:`integrationSpec`,identifier:`spec:${o.meta.key}.category`});continue}if(!o.supportedModes.includes(n.ownershipMode)){s({type:`integrationSpec`,identifier:`spec:${o.meta.key}.mode:${n.ownershipMode}`});continue}if(e.allowedModes&&e.allowedModes.length>0&&!e.allowedModes.includes(n.ownershipMode)){s({type:`integrationConnection`,identifier:`connection:${n.meta.id}:mode`});continue}if(e.requiredCapabilities&&!e.requiredCapabilities.every(e=>m(o,e))){s({type:`integrationSpec`,identifier:`spec:${o.meta.key}.capabilities`});continue}i.push({slot:e,binding:t,connection:n,spec:o}),a=!0;break}!a&&e.required&&s({type:`integrationSlot`,identifier:`slot:${e.slotId}`})}return{resolved:i,missing:a}}function m(e,t){return e.capabilities.provides.some(e=>e.key===t.key?t.version==null?!0:e.version===t.version:!1)}function h(e,t,n){if(!e?.length||!t)return[];let r=n??[];return e.map(e=>{let n=t.get(e.spaceKey,e.spaceVersion);return n?{binding:e,space:n,sources:r.filter(t=>t.meta.spaceKey===e.spaceKey?e.spaceVersion==null?!0:t.meta.spaceVersion===e.spaceVersion:!1)}:null}).filter(e=>e!==null)}function g(e,t,n){if(!e.length||!t)return[];let r=[],i=n??[];for(let a of e){if(!t.get(a.spaceKey,a.spaceVersion)){r.push({type:`knowledgeSpace`,identifier:a.spaceVersion?`${a.spaceKey}@${a.spaceVersion}`:a.spaceKey});continue}n&&i.filter(e=>e.meta.spaceKey===a.spaceKey?a.spaceVersion==null?!0:e.meta.spaceVersion===a.spaceVersion:!1).length===0&&r.push({type:`knowledgeSource`,identifier:a.spaceVersion?`${a.spaceKey}@${a.spaceVersion}`:a.spaceKey})}return r}function _(e,t,n){if(!t){if(e.length>0)for(let t of e)n.push({type:`capability`,identifier:w(t)});return[]}let r=[];for(let i of e){let e=t.get(i.key,i.version);if(!e){n.push({type:`capability`,identifier:w(i)});continue}r.push(e)}return r}function v(e,t,n){if(!t){if(e.length>0)for(let t of e)n.push({type:`feature`,identifier:t.key});return[]}let r=[];for(let i of e){let e=t.get(i.key);if(!e){n.push({type:`feature`,identifier:i.key});continue}r.push(e)}return r}function y(e,t,n,r){if(!t){if(Object.keys(e).length>0)for(let[t,i]of Object.entries(e))r.push({type:n,identifier:`${t} -> ${E(i)}`});return{}}let i={};for(let[a,o]of Object.entries(e)){let e=t.get(o.name,o.version);if(!e){r.push({type:n,identifier:`${a} -> ${E(o)}`});continue}i[a]=e}return i}function b(e,t,n){if(!t){if(e.length>0)for(let t of e)n.push({type:`policy`,identifier:D(t)});return[]}let r=[];for(let i of e){let e=t.get(i.name,i.version);if(!e){n.push({type:`policy`,identifier:D(i)});continue}r.push(e)}return r}function x(e,t){let n=[];if(!e)return{theme:void 0,fallbacks:[],themeMissing:n};if(!t){n.push({type:`theme`,identifier:`${e.primary.name}.v${e.primary.version}`});for(let t of e.fallbacks??[])n.push({type:`theme`,identifier:`${t.name}.v${t.version}`});return{theme:void 0,fallbacks:[],themeMissing:n}}let r=t.get(e.primary.name,e.primary.version);r||n.push({type:`theme`,identifier:`${e.primary.name}.v${e.primary.version}`});let i=[];for(let r of e.fallbacks??[]){let e=t.get(r.name,r.version);if(!e){n.push({type:`theme`,identifier:`${r.name}.v${r.version}`});continue}i.push(e)}return{theme:r??void 0,fallbacks:i,themeMissing:n}}function S(e,t){let n=[];if(!e?.spec)return{telemetry:void 0,telemetryMissing:n};if(!t)return n.push({type:`telemetry`,identifier:E(e.spec)}),{telemetry:void 0,telemetryMissing:n};let r=t.get(e.spec.name,e.spec.version);return r||n.push({type:`telemetry`,identifier:E(e.spec)}),{telemetry:r??void 0,telemetryMissing:n}}function C(e,t,n){let r=e=>{if(e.length===0)return[];if(!t){for(let t of e)n.push({type:`experiment`,identifier:O(t)});return[]}let r=[];for(let i of e){let e=t.get(i.name,i.version);if(!e){n.push({type:`experiment`,identifier:O(i)});continue}r.push(e)}return r};return{active:r(e.active),paused:r(e.paused)}}function w(e){return`${e.key}${e.version?`.v${e.version}`:``}`}function T(e){return e.key}function E(e){return`${e.name}${e.version?`.v${e.version}`:``}`}function D(e){return`${e.name}${e.version?`.v${e.version}`:``}`}function O(e){return`${e.name}${e.version?`.v${e.version}`:``}`}function k(e,t){let n=new Map;for(let r of e)n.set(t(r),r);return[...n.values()]}function A(e){return[...new Set(e)]}export{t as composeAppConfig,e as resolveAppConfig};
2
- //# sourceMappingURL=runtime.js.map
1
+ function e(e,t,m={}){let g=n(e.capabilities,t.capabilities),_=r(e.features,t.features),v=i(e.dataViews??{},t.dataViewOverrides),y=i(e.workflows??{},t.workflowOverrides),b=a(e.policies??[],t.additionalPolicies??[]),x=o(e.theme,t.themeOverride),S=s(e.telemetry,t.telemetryOverride),C=c(e.experiments,t.experiments),w=d(e.featureFlags??[],t.featureFlags??[]),T=f(e.routes??[],t.routeOverrides??[]),{resolved:E}=p(e.integrationSlots,t.integrations,m.integrationConnections,m.integrationSpecs),D=h(t.knowledge,m.knowledgeSpaces,m.knowledgeSources),O=l(e.branding,t),k=u(e.translationCatalog,t.locales,t.translationOverrides);return{appId:e.meta.appId,tenantId:t.meta.tenantId,environment:t.meta.environment,blueprintName:e.meta.name,blueprintVersion:e.meta.version,configVersion:t.meta.version,capabilities:g,features:_,dataViews:v,workflows:y,policies:b,theme:x,telemetry:S,experiments:C,featureFlags:w,routes:T,integrations:E,knowledge:D,translation:k,branding:O,notes:t.notes??e.notes}}function t(t,n,r,i={}){let a=e(t,n,r),o=[],s=p(t.integrationSlots,n.integrations,r.integrationConnections,r.integrationSpecs);a.integrations=s.resolved,o.push(...s.missing),o.push(...g(n.knowledge??[],r.knowledgeSpaces,r.knowledgeSources));let c=_(a.capabilities.enabled,r.capabilities,o),l=v(a.features.include,r.features,o),u=y(a.dataViews,r.dataViews,`dataView`,o),d=y(a.workflows,r.workflows,`workflow`,o),f=b(a.policies,r.policies,o),{theme:m,fallbacks:h,themeMissing:w}=x(a.theme,r.themes);o.push(...w);let{telemetry:T,telemetryMissing:E}=S(a.telemetry,r.telemetry);o.push(...E);let D=C(a.experiments,r.experiments,o);if(i.strict&&o.length>0){let e=o.map(e=>`${e.type}:${e.identifier}`).join(`, `);throw Error(`composeAppConfig: missing references -> ${e}`)}return{resolved:a,capabilities:c,features:l,dataViews:u,workflows:d,policies:f,theme:m,themeFallbacks:h,telemetry:T,experiments:D,integrations:a.integrations,knowledge:a.knowledge,missing:o}}function n(e,t){let n=k([...e?.enabled??[],...t?.enable??[]],w),r=k([...e?.disabled??[],...t?.disable??[]],w),i=new Set(r.map(w));return{enabled:n.filter(e=>!i.has(w(e))),disabled:r}}function r(e,t){let n=k([...e?.include??[],...t?.include??[]],T),r=k([...e?.exclude??[],...t?.exclude??[]],T),i=new Set(r.map(T));return{include:n.filter(e=>!i.has(T(e))),exclude:r}}function i(e,t){let n={...e};if(!t)return n;for(let e of t)e&&(e.pointer?n[e.slot]=e.pointer:delete n[e.slot]);return n}function a(e,t){return k([...e,...t],D)}function o(e,t){if(!e&&!t)return;let n=t?.primary??e?.primary;if(n)return{primary:n,fallbacks:t?.fallbacks??e?.fallbacks??[]}}function s(e,t){if(!e&&!t)return;let n={spec:e?.spec,disabledEvents:e?.disabledEvents?[...e.disabledEvents]:void 0,samplingOverrides:e?.samplingOverrides?{...e.samplingOverrides}:void 0};if(t?.spec!==void 0&&(n.spec=t.spec??void 0),t?.disabledEvents&&(n.disabledEvents=A([...n.disabledEvents??[],...t.disabledEvents])),t?.samplingOverrides&&(n.samplingOverrides={...n.samplingOverrides??{},...t.samplingOverrides}),!(!n.spec&&!n.disabledEvents?.length))return n}function c(e,t){let n=e?.active??[],r=e?.paused??[],i=t?.active,a=t?.paused,o=i&&i.length>0?i:n,s=a&&a.length>0?a:r,c=k(o,O),l=k(s,O),u=new Set(c.map(O));return l=l.filter(e=>!u.has(O(e))),{catalog:k([...n,...r,...i??[],...a??[]],O),active:c,paused:l}}function l(e,t){let n=t.branding,r=t.meta,i=`app.localhost`,a=n?.customDomain??(n?.subdomain?`${n.subdomain}.${i}`:`${r.tenantId}.${i}`),o=[];t.locales?.defaultLocale&&o.push(t.locales.defaultLocale),n?.appName&&o.push(`default`,`en`);let s;if(n?.appName){for(let e of o){let t=n.appName[e];if(t){s=t;break}}if(!s){let[,e]=Object.entries(n.appName)[0]??[];typeof e==`string`&&(s=e)}}s||=e?.appNameKey??r.appId;let c=new Map,l=e=>{if(e)for(let t of e)t?.type&&`url`in t&&t.url&&c.set(t.type,t.url)};l(e?.assets),l(n?.assets);let u={logo:c.get(`logo`),logoDark:c.get(`logo-dark`),favicon:c.get(`favicon`),ogImage:c.get(`og-image`)},d={primary:n?.colors?.primary??e?.colorTokens?.primary??`#1f2937`,secondary:n?.colors?.secondary??e?.colorTokens?.secondary??`#4b5563`};return{appName:s,assets:u,colors:d,domain:a}}function u(e,t,n){let r=t?.defaultLocale??`en`;return{defaultLocale:r,supportedLocales:A([r,...t?.enabledLocales??[]]),blueprintCatalog:e,tenantOverrides:n?.entries??[]}}function d(e,t){let n=new Map;for(let t of e)n.set(t.key,{...t});for(let e of t)n.set(e.key,{...e});return[...n.values()]}function f(e,t){let n=new Map;for(let t of e)n.set(t.path,{...t});for(let e of t){let t=n.get(e.path)??{path:e.path};e.label!==void 0&&(e.label===null?delete t.label:t.label=e.label),e.dataView!==void 0&&(e.dataView===null?delete t.dataView:t.dataView=e.dataView),e.workflow!==void 0&&(e.workflow===null?delete t.workflow:t.workflow=e.workflow),e.guard!==void 0&&(e.guard===null?delete t.guard:t.guard=e.guard),e.featureFlag!==void 0&&(e.featureFlag===null?delete t.featureFlag:t.featureFlag=e.featureFlag),e.experiment!==void 0&&(e.experiment===null?delete t.experiment:t.experiment=e.experiment),n.set(t.path,t)}return[...n.values()]}function p(e,t,n,r){let i=[],a=[],o=new Set,s=e=>{let t=`${e.type}:${e.identifier}`;o.has(t)||(o.add(t),a.push(e))},c=e??[],l=new Map;for(let e of c)l.set(e.slotId,e);let u=new Map;for(let e of t??[]){if(!l.get(e.slotId)){s({type:`integrationSlot`,identifier:`slot:${e.slotId}`});continue}let t=u.get(e.slotId);t?t.push(e):u.set(e.slotId,[e])}for(let e of c){let t=u.get(e.slotId)??[];e.required&&t.length===0&&s({type:`integrationSlot`,identifier:`slot:${e.slotId}`})}if(!n||!r)return{resolved:i,missing:a};let d=new Map;for(let e of n)d.set(e.meta.id,e);for(let e of c){let t=u.get(e.slotId)??[];if(t.length===0)continue;let n=[...t].sort((e,t)=>{let n=e.priority??2**53-1,r=t.priority??2**53-1;return n===r?0:n<r?-1:1}),a=!1;for(let t of n){let n=d.get(t.connectionId);if(!n){s({type:`integrationConnection`,identifier:`connection:${t.connectionId}`});continue}let o=r.get(n.meta.integrationKey,n.meta.integrationVersion);if(!o){s({type:`integrationSpec`,identifier:`spec:${n.meta.integrationKey}.v${n.meta.integrationVersion}`});continue}if(o.meta.category!==e.requiredCategory){s({type:`integrationSpec`,identifier:`spec:${o.meta.key}.category`});continue}if(!o.supportedModes.includes(n.ownershipMode)){s({type:`integrationSpec`,identifier:`spec:${o.meta.key}.mode:${n.ownershipMode}`});continue}if(e.allowedModes&&e.allowedModes.length>0&&!e.allowedModes.includes(n.ownershipMode)){s({type:`integrationConnection`,identifier:`connection:${n.meta.id}:mode`});continue}if(e.requiredCapabilities&&!e.requiredCapabilities.every(e=>m(o,e))){s({type:`integrationSpec`,identifier:`spec:${o.meta.key}.capabilities`});continue}i.push({slot:e,binding:t,connection:n,spec:o}),a=!0;break}!a&&e.required&&s({type:`integrationSlot`,identifier:`slot:${e.slotId}`})}return{resolved:i,missing:a}}function m(e,t){return e.capabilities.provides.some(e=>e.key===t.key?t.version==null?!0:e.version===t.version:!1)}function h(e,t,n){if(!e?.length||!t)return[];let r=n??[];return e.map(e=>{let n=t.get(e.spaceKey,e.spaceVersion);return n?{binding:e,space:n,sources:r.filter(t=>t.meta.spaceKey===e.spaceKey?e.spaceVersion==null?!0:t.meta.spaceVersion===e.spaceVersion:!1)}:null}).filter(e=>e!==null)}function g(e,t,n){if(!e.length||!t)return[];let r=[],i=n??[];for(let a of e){if(!t.get(a.spaceKey,a.spaceVersion)){r.push({type:`knowledgeSpace`,identifier:a.spaceVersion?`${a.spaceKey}@${a.spaceVersion}`:a.spaceKey});continue}n&&i.filter(e=>e.meta.spaceKey===a.spaceKey?a.spaceVersion==null?!0:e.meta.spaceVersion===a.spaceVersion:!1).length===0&&r.push({type:`knowledgeSource`,identifier:a.spaceVersion?`${a.spaceKey}@${a.spaceVersion}`:a.spaceKey})}return r}function _(e,t,n){if(!t){if(e.length>0)for(let t of e)n.push({type:`capability`,identifier:w(t)});return[]}let r=[];for(let i of e){let e=t.get(i.key,i.version);if(!e){n.push({type:`capability`,identifier:w(i)});continue}r.push(e)}return r}function v(e,t,n){if(!t){if(e.length>0)for(let t of e)n.push({type:`feature`,identifier:t.key});return[]}let r=[];for(let i of e){let e=t.get(i.key);if(!e){n.push({type:`feature`,identifier:i.key});continue}r.push(e)}return r}function y(e,t,n,r){if(!t){if(Object.keys(e).length>0)for(let[t,i]of Object.entries(e))r.push({type:n,identifier:`${t} -> ${E(i)}`});return{}}let i={};for(let[a,o]of Object.entries(e)){let e=t.get(o.name,o.version);if(!e){r.push({type:n,identifier:`${a} -> ${E(o)}`});continue}i[a]=e}return i}function b(e,t,n){if(!t){if(e.length>0)for(let t of e)n.push({type:`policy`,identifier:D(t)});return[]}let r=[];for(let i of e){let e=t.get(i.name,i.version);if(!e){n.push({type:`policy`,identifier:D(i)});continue}r.push(e)}return r}function x(e,t){let n=[];if(!e)return{theme:void 0,fallbacks:[],themeMissing:n};if(!t){n.push({type:`theme`,identifier:`${e.primary.name}.v${e.primary.version}`});for(let t of e.fallbacks??[])n.push({type:`theme`,identifier:`${t.name}.v${t.version}`});return{theme:void 0,fallbacks:[],themeMissing:n}}let r=t.get(e.primary.name,e.primary.version);r||n.push({type:`theme`,identifier:`${e.primary.name}.v${e.primary.version}`});let i=[];for(let r of e.fallbacks??[]){let e=t.get(r.name,r.version);if(!e){n.push({type:`theme`,identifier:`${r.name}.v${r.version}`});continue}i.push(e)}return{theme:r??void 0,fallbacks:i,themeMissing:n}}function S(e,t){let n=[];if(!e?.spec)return{telemetry:void 0,telemetryMissing:n};if(!t)return n.push({type:`telemetry`,identifier:E(e.spec)}),{telemetry:void 0,telemetryMissing:n};let r=t.get(e.spec.name,e.spec.version);return r||n.push({type:`telemetry`,identifier:E(e.spec)}),{telemetry:r??void 0,telemetryMissing:n}}function C(e,t,n){let r=e=>{if(e.length===0)return[];if(!t){for(let t of e)n.push({type:`experiment`,identifier:O(t)});return[]}let r=[];for(let i of e){let e=t.get(i.name,i.version);if(!e){n.push({type:`experiment`,identifier:O(i)});continue}r.push(e)}return r};return{active:r(e.active),paused:r(e.paused)}}function w(e){return`${e.key}${e.version?`.v${e.version}`:``}`}function T(e){return e.key}function E(e){return`${e.name}${e.version?`.v${e.version}`:``}`}function D(e){return`${e.name}${e.version?`.v${e.version}`:``}`}function O(e){return`${e.name}${e.version?`.v${e.version}`:``}`}function k(e,t){let n=new Map;for(let r of e)n.set(t(r),r);return[...n.values()]}function A(e){return[...new Set(e)]}export{t as composeAppConfig,e as resolveAppConfig};
@@ -1,2 +1 @@
1
- const e=e=>`${e.name}.v${e.version}`;var t=class{items=new Map;register(t){let n=e(t.meta);if(this.items.has(n))throw Error(`Duplicate AppBlueprint ${n}`);return this.items.set(n,t),this}list(){return[...this.items.values()]}get(t,n){if(n!=null)return this.items.get(e({name:t,version:n}));let r,i=-1/0;for(let e of this.items.values())e.meta.name===t&&e.meta.version>i&&(i=e.meta.version,r=e);return r}};function n(t){return e(t)}export{t as AppBlueprintRegistry,n as makeAppBlueprintKey};
2
- //# sourceMappingURL=spec.js.map
1
+ const e=e=>`${e.name}.v${e.version}`;var t=class{items=new Map;register(t){let n=e(t.meta);if(this.items.has(n))throw Error(`Duplicate AppBlueprint ${n}`);return this.items.set(n,t),this}list(){return[...this.items.values()]}get(t,n){if(n!=null)return this.items.get(e({name:t,version:n}));let r,i=-1/0;for(let e of this.items.values())e.meta.name===t&&e.meta.version>i&&(i=e.meta.version,r=e);return r}};function n(t){return e(t)}export{t as AppBlueprintRegistry,n as makeAppBlueprintKey};
@@ -1,2 +1 @@
1
- var e=class{blueprintRules=[];tenantRules=[];resolvedRules=[];register(e){return e.scope===`blueprint`?this.blueprintRules.push(e):e.scope===`tenant`?this.tenantRules.push(e):this.resolvedRules.push(e),this}validateBlueprint(e,t){return w(this.blueprintRules.flatMap(n=>n.validate(e,t)))}validateTenant(e,t,n){return w(this.tenantRules.flatMap(r=>r.validate(e,t,n)))}validateResolved(e,t,n){return w(this.resolvedRules.flatMap(r=>r.validate(e,t,n)))}};const t=/^(?!:\/\/)([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[A-Za-z]{2,}$/,n=/^https:\/\//i,r={logo:[`png`,`svg`,`webp`],"logo-dark":[`png`,`svg`,`webp`],favicon:[`ico`,`png`,`svg`],"og-image":[`png`,`jpg`,`jpeg`,`webp`]},i={};let a;function o(){return a||=p(),a}function s(e,t,n=i){let r=o();return f(d(r.validateBlueprint(e,n)),d(r.validateTenant(e,t,n)))}function c(e,t=i){return d(o().validateBlueprint(e,t))}function l(e,t,n=i){return d(o().validateTenant(e,t,n))}function u(e,t,n=i){return d(o().validateResolved(e,t,n))}function d(e){let t=e.filter(e=>e.severity===`error`),n=e.filter(e=>e.severity===`warning`),r=e.filter(e=>e.severity===`info`);return{valid:t.length===0,errors:t,warnings:n,info:r}}function f(...e){let t=e.flatMap(e=>e.errors),n=e.flatMap(e=>e.warnings),r=e.flatMap(e=>e.info);return{valid:t.length===0,errors:t,warnings:n,info:r}}function p(){return new e().register(m).register(h).register(g).register(_).register(v).register(y).register(b).register(x).register(S)}const m={scope:`blueprint`,name:`integration.duplicate-slots`,category:`integration`,validate(e){let t=[],n=new Set;for(let r of e.integrationSlots??[])n.has(r.slotId)?t.push(C({code:`DUPLICATE_SLOT`,severity:`error`,path:`integrationSlots.${r.slotId}`,message:`Duplicate integration slot id "${r.slotId}".`})):n.add(r.slotId),r.allowedModes&&r.allowedModes.length===0&&t.push(C({code:`EMPTY_ALLOWED_MODES`,severity:`warning`,path:`integrationSlots.${r.slotId}.allowedModes`,message:`allowedModes is empty; the slot will accept any supported mode.`}));return e.branding&&!e.branding.appNameKey.trim()&&t.push(C({code:`MISSING_APP_NAME_KEY`,severity:`warning`,path:`branding.appNameKey`,message:`branding.appNameKey should reference a translation catalog key.`})),t}},h={scope:`blueprint`,name:`capability.registry-check`,category:`capability`,validate(e,t){let n=[],r=t.capabilities;return r&&(e.capabilities?.enabled??[]).forEach((e,t)=>{r.get(e.key,e.version)||n.push(C({code:`MISSING_CAPABILITY`,severity:`error`,path:`capabilities.enabled[${t}]`,message:`Capability "${e.key}@${e.version}" is not registered.`}))}),n}},g={scope:`tenant`,name:`capability.required-enabled`,category:`capability`,validate(e,t,n){let r=[],i=n.capabilities,a=new Set((e.capabilities?.enabled??[]).map(T)),o=t.capabilities?.disable??[];return o.forEach((e,t)=>{a.has(T(e))&&r.push(C({code:`DISABLED_REQUIRED_CAPABILITY`,severity:`error`,path:`capabilities.disable[${t}]`,message:`Capability "${e.key}@${e.version}" is required by the blueprint and cannot be disabled.`}))}),i&&((t.capabilities?.enable??[]).forEach((e,t)=>{i.get(e.key,e.version)||r.push(C({code:`UNKNOWN_CAPABILITY_ENABLE`,severity:`error`,path:`capabilities.enable[${t}]`,message:`Capability "${e.key}@${e.version}" is not registered.`}))}),o.forEach((e,t)=>{i.get(e.key,e.version)||r.push(C({code:`UNKNOWN_CAPABILITY_DISABLE`,severity:`warning`,path:`capabilities.disable[${t}]`,message:`Capability "${e.key}@${e.version}" is not registered.`}))})),r}},_={scope:`tenant`,name:`integration.slot-binding`,category:`integration`,validate(e,t,n){let r=[],i=new Map((e.integrationSlots??[]).map(e=>[e.slotId,e])),a=t.integrations??[],o=n.tenantConnections?.reduce((e,t)=>e.set(t.meta.id,t),new Map)??new Map,s=new Set;a.forEach(e=>{let a=`integrations.${e.slotId}`,c=i.get(e.slotId);if(!c){r.push(C({code:`UNKNOWN_SLOT_BINDING`,severity:`error`,path:a,message:`Integration slot "${e.slotId}" is not defined in the blueprint.`}));return}let l=!0,u=o.get(e.connectionId);if(!u){r.push(C({code:`MISSING_INTEGRATION_CONNECTION`,severity:`error`,path:a,message:`Integration connection "${e.connectionId}" was not found for tenant "${t.meta.tenantId}".`})),l=!1;return}u.meta.tenantId!==t.meta.tenantId&&(r.push(C({code:`FOREIGN_CONNECTION`,severity:`error`,path:a,message:`Connection "${e.connectionId}" belongs to tenant "${u.meta.tenantId}", not "${t.meta.tenantId}".`})),l=!1),c.allowedModes&&c.allowedModes.length>0&&(c.allowedModes.includes(u.ownershipMode)||(r.push(C({code:`MODE_MISMATCH`,severity:`error`,path:a,message:`Slot "${c.slotId}" only allows modes [${c.allowedModes.join(`, `)}] but connection is "${u.ownershipMode}".`})),l=!1)),u.status===`disconnected`||u.status===`error`?(r.push(C({code:`CONNECTION_NOT_READY`,severity:`error`,path:a,message:`Connection "${u.meta.label}" is in status "${u.status}".`})),l=!1):u.status===`unknown`&&r.push(C({code:`CONNECTION_STATUS_UNKNOWN`,severity:`warning`,path:a,message:`Connection "${u.meta.label}" has unknown health status.`}));let d=D(n.integrationSpecs,u);if(!d){r.push(C({code:`INTEGRATION_SPEC_NOT_FOUND`,severity:`warning`,path:a,message:`Integration spec "${u.meta.integrationKey}@${u.meta.integrationVersion}" is not registered.`})),l=!1;return}d.meta.category!==c.requiredCategory&&(r.push(C({code:`CATEGORY_MISMATCH`,severity:`error`,path:a,message:`Slot "${c.slotId}" requires category "${c.requiredCategory}" but connection provides "${d.meta.category}".`})),l=!1),d.supportedModes.includes(u.ownershipMode)||(r.push(C({code:`UNSUPPORTED_OWNERSHIP_MODE`,severity:`error`,path:a,message:`Integration spec "${d.meta.key}" does not support ownership mode "${u.ownershipMode}".`})),l=!1);for(let e of c.requiredCapabilities??[])E(d,e)||(r.push(C({code:`CAPABILITY_NOT_PROVIDED`,severity:`error`,path:a,message:`Integration "${d.meta.key}" does not provide required capability "${e.key}@${e.version}".`})),l=!1);l&&s.add(c.slotId)});for(let e of i.values())e.required&&!s.has(e.slotId)&&r.push(C({code:`MISSING_REQUIRED_SLOT`,severity:`error`,path:`integrations.${e.slotId}`,message:`Required integration slot "${e.slotId}" is not bound.`}));return r}},v={scope:`tenant`,name:`knowledge.bindings`,category:`knowledge`,validate(e,t,n){let r=[],i=n.knowledgeSpaces;if(!i)return r;let a=n.knowledgeSources??[];return(t.knowledge??[]).forEach((e,n)=>{let o=`knowledge[${n}]`,s=i.get(e.spaceKey,e.spaceVersion);if(!s){r.push(C({code:`UNKNOWN_KNOWLEDGE_SPACE`,severity:`error`,path:`${o}.spaceKey`,message:`Knowledge space "${e.spaceKey}" is not registered.`}));return}a.some(t=>t.meta.spaceKey===e.spaceKey?e.spaceVersion==null?!0:t.meta.spaceVersion===e.spaceVersion:!1)||r.push(C({code:`MISSING_KNOWLEDGE_SOURCES`,severity:`error`,path:o,message:`Knowledge space "${e.spaceKey}" has no configured sources for tenant "${t.meta.tenantId}".`})),(s.meta.category===`external`||s.meta.category===`ephemeral`)&&r.push(C({code:`LOW_TRUST_KNOWLEDGE`,severity:`warning`,path:o,message:`Knowledge space "${e.spaceKey}" has category "${s.meta.category}". Avoid using it for irreversible or policy decisions.`}))}),r}},y={scope:`tenant`,name:`branding.constraints`,category:`branding`,validate(e,i,a){let o=[],s=i.branding;if(!s)return o;let c=s.customDomain?.trim();if(c){t.test(c)||o.push(C({code:`INVALID_DOMAIN`,severity:`error`,path:`branding.customDomain`,message:`Custom domain "${c}" is not a valid hostname.`}));let e=(a.existingConfigs??[]).find(e=>{if(e.meta.id===i.meta.id)return!1;let t=e.branding?.customDomain?.trim();return t?t.toLowerCase()===c.toLowerCase():!1});e&&o.push(C({code:`DUPLICATE_DOMAIN`,severity:`error`,path:`branding.customDomain`,message:`Custom domain "${c}" is already used by tenant "${e.meta.tenantId}".`}))}return(s.assets??[]).forEach((e,t)=>{let i=`branding.assets[${t}]`;n.test(e.url)||o.push(C({code:`INSECURE_ASSET_URL`,severity:`error`,path:`${i}.url`,message:`Branding asset "${e.type}" must use an HTTPS URL.`}));let a=r[e.type]??r.logo,s=O(e.url);s&&a&&!a.includes(s)&&o.push(C({code:`UNEXPECTED_ASSET_TYPE`,severity:`warning`,path:`${i}.url`,message:`Asset "${e.type}" should use one of: ${(a??[]).join(`, `)}. Detected "${s}".`}))}),o}},b={scope:`tenant`,name:`translation.consistency`,category:`translation`,validate(e,t,n){let r=[],i=e.translationCatalog,a=k(n.translationCatalogs),o=i?a.blueprint.find(e=>e.meta.name===i.name&&e.meta.version===i.version):void 0;i&&!o&&r.push(C({code:`MISSING_BLUEPRINT_CATALOG`,severity:`error`,path:`translationCatalog`,message:`Blueprint translation catalog "${i.name}@${i.version}" is not loaded in context.`}));let s=new Set;e.branding?.appNameKey&&(s.add(e.branding.appNameKey),o&&!A(o.entries,e.branding.appNameKey,o.defaultLocale)&&r.push(C({code:`MISSING_TRANSLATION_KEY`,severity:`error`,path:`branding.appNameKey`,message:`Translation key "${e.branding.appNameKey}" is missing for locale "${o.defaultLocale}".`})));let c=t.locales;if(c){let{defaultLocale:e,enabledLocales:t}=c;if(t.includes(e)||r.push(C({code:`LOCALE_NOT_ENABLED`,severity:`warning`,path:`locales.enabledLocales`,message:`enabledLocales does not include defaultLocale "${e}".`})),o){let n=new Set(o.supportedLocales);for(let i of[e,...t])n.has(i)||r.push(C({code:`UNSUPPORTED_LOCALE`,severity:`error`,path:`locales.enabledLocales`,message:`Locale "${i}" is not supported by blueprint catalog "${o.meta.name}".`}))}}let l=new Set;for(let e of a.blueprint)for(let t of e.entries)l.add(t.key);for(let e of a.platform)for(let t of e.entries)l.add(t.key);return(t.translationOverrides?.entries??[]).forEach((e,n)=>{let i=`translationOverrides.entries[${n}]`;l.has(e.key)||r.push(C({code:`UNKNOWN_TRANSLATION_KEY`,severity:`error`,path:i,message:`Override references unknown key "${e.key}".`})),o&&(new Set([...o.supportedLocales,...t.locales?.enabledLocales??[],t.locales?.defaultLocale??o.defaultLocale]).has(e.locale)||r.push(C({code:`UNSUPPORTED_LOCALE_OVERRIDE`,severity:`error`,path:i,message:`Locale "${e.locale}" is not enabled for tenant overrides.`})))}),r}},x={scope:`resolved`,name:`integration.required-slots`,category:`integration`,validate(e,t){let n=[],r=(e.integrationSlots??[]).filter(e=>e.required);for(let e of r)t.integrations.some(t=>t.slot.slotId===e.slotId)||n.push(C({code:`MISSING_REQUIRED_SLOT`,severity:`error`,path:`integrations.${e.slotId}`,message:`Resolved config is missing integration slot "${e.slotId}".`}));for(let e of t.integrations)(e.connection.status===`disconnected`||e.connection.status===`error`)&&n.push(C({code:`CONNECTION_NOT_READY`,severity:`error`,path:`integrations.${e.slot.slotId}`,message:`Resolved integration "${e.slot.slotId}" uses a connection in status "${e.connection.status}".`}));return n}},S={scope:`resolved`,name:`translation.default-locale`,category:`translation`,validate(e,t){let n=[],r=t.translation;return r&&!r.supportedLocales.includes(r.defaultLocale)&&n.push(C({code:`DEFAULT_LOCALE_NOT_SUPPORTED`,severity:`warning`,path:`translation.defaultLocale`,message:`supportedLocales should include defaultLocale for consistent fallback behaviour.`})),n}};function C(e){return e}function w(e){let t=new Map;for(let n of e){let e=`${n.code}|${n.path}|${n.severity}`;t.has(e)||t.set(e,n)}return[...t.values()]}function T(e){return`${e.key}@${e.version}`}function E(e,t){return e.capabilities.provides.some(e=>e.key===t.key&&e.version===t.version)}function D(e,t){if(e)return e.get(t.meta.integrationKey,t.meta.integrationVersion)}function O(e){let[t]=e.split(`?`);if(!t)return;let n=t.lastIndexOf(`.`);if(n!==-1)return t.slice(n+1).toLowerCase()}function k(e){return e?{platform:e.platform?Array.isArray(e.platform)?e.platform:[e.platform]:[],blueprint:e.blueprint?Array.isArray(e.blueprint)?e.blueprint:[e.blueprint]:[]}:{platform:[],blueprint:[]}}function A(e,t,n){return e.some(e=>e.key===t&&e.locale===n)}export{c as validateBlueprint,s as validateConfig,u as validateResolvedConfig,l as validateTenantConfig};
2
- //# sourceMappingURL=validation.js.map
1
+ var e=class{blueprintRules=[];tenantRules=[];resolvedRules=[];register(e){return e.scope===`blueprint`?this.blueprintRules.push(e):e.scope===`tenant`?this.tenantRules.push(e):this.resolvedRules.push(e),this}validateBlueprint(e,t){return w(this.blueprintRules.flatMap(n=>n.validate(e,t)))}validateTenant(e,t,n){return w(this.tenantRules.flatMap(r=>r.validate(e,t,n)))}validateResolved(e,t,n){return w(this.resolvedRules.flatMap(r=>r.validate(e,t,n)))}};const t=/^(?!:\/\/)([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[A-Za-z]{2,}$/,n=/^https:\/\//i,r={logo:[`png`,`svg`,`webp`],"logo-dark":[`png`,`svg`,`webp`],favicon:[`ico`,`png`,`svg`],"og-image":[`png`,`jpg`,`jpeg`,`webp`]},i={};let a;function o(){return a||=p(),a}function s(e,t,n=i){let r=o();return f(d(r.validateBlueprint(e,n)),d(r.validateTenant(e,t,n)))}function c(e,t=i){return d(o().validateBlueprint(e,t))}function l(e,t,n=i){return d(o().validateTenant(e,t,n))}function u(e,t,n=i){return d(o().validateResolved(e,t,n))}function d(e){let t=e.filter(e=>e.severity===`error`),n=e.filter(e=>e.severity===`warning`),r=e.filter(e=>e.severity===`info`);return{valid:t.length===0,errors:t,warnings:n,info:r}}function f(...e){let t=e.flatMap(e=>e.errors),n=e.flatMap(e=>e.warnings),r=e.flatMap(e=>e.info);return{valid:t.length===0,errors:t,warnings:n,info:r}}function p(){return new e().register(m).register(h).register(g).register(_).register(v).register(y).register(b).register(x).register(S)}const m={scope:`blueprint`,name:`integration.duplicate-slots`,category:`integration`,validate(e){let t=[],n=new Set;for(let r of e.integrationSlots??[])n.has(r.slotId)?t.push(C({code:`DUPLICATE_SLOT`,severity:`error`,path:`integrationSlots.${r.slotId}`,message:`Duplicate integration slot id "${r.slotId}".`})):n.add(r.slotId),r.allowedModes&&r.allowedModes.length===0&&t.push(C({code:`EMPTY_ALLOWED_MODES`,severity:`warning`,path:`integrationSlots.${r.slotId}.allowedModes`,message:`allowedModes is empty; the slot will accept any supported mode.`}));return e.branding&&!e.branding.appNameKey.trim()&&t.push(C({code:`MISSING_APP_NAME_KEY`,severity:`warning`,path:`branding.appNameKey`,message:`branding.appNameKey should reference a translation catalog key.`})),t}},h={scope:`blueprint`,name:`capability.registry-check`,category:`capability`,validate(e,t){let n=[],r=t.capabilities;return r&&(e.capabilities?.enabled??[]).forEach((e,t)=>{r.get(e.key,e.version)||n.push(C({code:`MISSING_CAPABILITY`,severity:`error`,path:`capabilities.enabled[${t}]`,message:`Capability "${e.key}@${e.version}" is not registered.`}))}),n}},g={scope:`tenant`,name:`capability.required-enabled`,category:`capability`,validate(e,t,n){let r=[],i=n.capabilities,a=new Set((e.capabilities?.enabled??[]).map(T)),o=t.capabilities?.disable??[];return o.forEach((e,t)=>{a.has(T(e))&&r.push(C({code:`DISABLED_REQUIRED_CAPABILITY`,severity:`error`,path:`capabilities.disable[${t}]`,message:`Capability "${e.key}@${e.version}" is required by the blueprint and cannot be disabled.`}))}),i&&((t.capabilities?.enable??[]).forEach((e,t)=>{i.get(e.key,e.version)||r.push(C({code:`UNKNOWN_CAPABILITY_ENABLE`,severity:`error`,path:`capabilities.enable[${t}]`,message:`Capability "${e.key}@${e.version}" is not registered.`}))}),o.forEach((e,t)=>{i.get(e.key,e.version)||r.push(C({code:`UNKNOWN_CAPABILITY_DISABLE`,severity:`warning`,path:`capabilities.disable[${t}]`,message:`Capability "${e.key}@${e.version}" is not registered.`}))})),r}},_={scope:`tenant`,name:`integration.slot-binding`,category:`integration`,validate(e,t,n){let r=[],i=new Map((e.integrationSlots??[]).map(e=>[e.slotId,e])),a=t.integrations??[],o=n.tenantConnections?.reduce((e,t)=>e.set(t.meta.id,t),new Map)??new Map,s=new Set;a.forEach(e=>{let a=`integrations.${e.slotId}`,c=i.get(e.slotId);if(!c){r.push(C({code:`UNKNOWN_SLOT_BINDING`,severity:`error`,path:a,message:`Integration slot "${e.slotId}" is not defined in the blueprint.`}));return}let l=!0,u=o.get(e.connectionId);if(!u){r.push(C({code:`MISSING_INTEGRATION_CONNECTION`,severity:`error`,path:a,message:`Integration connection "${e.connectionId}" was not found for tenant "${t.meta.tenantId}".`})),l=!1;return}u.meta.tenantId!==t.meta.tenantId&&(r.push(C({code:`FOREIGN_CONNECTION`,severity:`error`,path:a,message:`Connection "${e.connectionId}" belongs to tenant "${u.meta.tenantId}", not "${t.meta.tenantId}".`})),l=!1),c.allowedModes&&c.allowedModes.length>0&&(c.allowedModes.includes(u.ownershipMode)||(r.push(C({code:`MODE_MISMATCH`,severity:`error`,path:a,message:`Slot "${c.slotId}" only allows modes [${c.allowedModes.join(`, `)}] but connection is "${u.ownershipMode}".`})),l=!1)),u.status===`disconnected`||u.status===`error`?(r.push(C({code:`CONNECTION_NOT_READY`,severity:`error`,path:a,message:`Connection "${u.meta.label}" is in status "${u.status}".`})),l=!1):u.status===`unknown`&&r.push(C({code:`CONNECTION_STATUS_UNKNOWN`,severity:`warning`,path:a,message:`Connection "${u.meta.label}" has unknown health status.`}));let d=D(n.integrationSpecs,u);if(!d){r.push(C({code:`INTEGRATION_SPEC_NOT_FOUND`,severity:`warning`,path:a,message:`Integration spec "${u.meta.integrationKey}@${u.meta.integrationVersion}" is not registered.`})),l=!1;return}d.meta.category!==c.requiredCategory&&(r.push(C({code:`CATEGORY_MISMATCH`,severity:`error`,path:a,message:`Slot "${c.slotId}" requires category "${c.requiredCategory}" but connection provides "${d.meta.category}".`})),l=!1),d.supportedModes.includes(u.ownershipMode)||(r.push(C({code:`UNSUPPORTED_OWNERSHIP_MODE`,severity:`error`,path:a,message:`Integration spec "${d.meta.key}" does not support ownership mode "${u.ownershipMode}".`})),l=!1);for(let e of c.requiredCapabilities??[])E(d,e)||(r.push(C({code:`CAPABILITY_NOT_PROVIDED`,severity:`error`,path:a,message:`Integration "${d.meta.key}" does not provide required capability "${e.key}@${e.version}".`})),l=!1);l&&s.add(c.slotId)});for(let e of i.values())e.required&&!s.has(e.slotId)&&r.push(C({code:`MISSING_REQUIRED_SLOT`,severity:`error`,path:`integrations.${e.slotId}`,message:`Required integration slot "${e.slotId}" is not bound.`}));return r}},v={scope:`tenant`,name:`knowledge.bindings`,category:`knowledge`,validate(e,t,n){let r=[],i=n.knowledgeSpaces;if(!i)return r;let a=n.knowledgeSources??[];return(t.knowledge??[]).forEach((e,n)=>{let o=`knowledge[${n}]`,s=i.get(e.spaceKey,e.spaceVersion);if(!s){r.push(C({code:`UNKNOWN_KNOWLEDGE_SPACE`,severity:`error`,path:`${o}.spaceKey`,message:`Knowledge space "${e.spaceKey}" is not registered.`}));return}a.some(t=>t.meta.spaceKey===e.spaceKey?e.spaceVersion==null?!0:t.meta.spaceVersion===e.spaceVersion:!1)||r.push(C({code:`MISSING_KNOWLEDGE_SOURCES`,severity:`error`,path:o,message:`Knowledge space "${e.spaceKey}" has no configured sources for tenant "${t.meta.tenantId}".`})),(s.meta.category===`external`||s.meta.category===`ephemeral`)&&r.push(C({code:`LOW_TRUST_KNOWLEDGE`,severity:`warning`,path:o,message:`Knowledge space "${e.spaceKey}" has category "${s.meta.category}". Avoid using it for irreversible or policy decisions.`}))}),r}},y={scope:`tenant`,name:`branding.constraints`,category:`branding`,validate(e,i,a){let o=[],s=i.branding;if(!s)return o;let c=s.customDomain?.trim();if(c){t.test(c)||o.push(C({code:`INVALID_DOMAIN`,severity:`error`,path:`branding.customDomain`,message:`Custom domain "${c}" is not a valid hostname.`}));let e=(a.existingConfigs??[]).find(e=>{if(e.meta.id===i.meta.id)return!1;let t=e.branding?.customDomain?.trim();return t?t.toLowerCase()===c.toLowerCase():!1});e&&o.push(C({code:`DUPLICATE_DOMAIN`,severity:`error`,path:`branding.customDomain`,message:`Custom domain "${c}" is already used by tenant "${e.meta.tenantId}".`}))}return(s.assets??[]).forEach((e,t)=>{let i=`branding.assets[${t}]`;n.test(e.url)||o.push(C({code:`INSECURE_ASSET_URL`,severity:`error`,path:`${i}.url`,message:`Branding asset "${e.type}" must use an HTTPS URL.`}));let a=r[e.type]??r.logo,s=O(e.url);s&&a&&!a.includes(s)&&o.push(C({code:`UNEXPECTED_ASSET_TYPE`,severity:`warning`,path:`${i}.url`,message:`Asset "${e.type}" should use one of: ${(a??[]).join(`, `)}. Detected "${s}".`}))}),o}},b={scope:`tenant`,name:`translation.consistency`,category:`translation`,validate(e,t,n){let r=[],i=e.translationCatalog,a=k(n.translationCatalogs),o=i?a.blueprint.find(e=>e.meta.name===i.name&&e.meta.version===i.version):void 0;i&&!o&&r.push(C({code:`MISSING_BLUEPRINT_CATALOG`,severity:`error`,path:`translationCatalog`,message:`Blueprint translation catalog "${i.name}@${i.version}" is not loaded in context.`}));let s=new Set;e.branding?.appNameKey&&(s.add(e.branding.appNameKey),o&&!A(o.entries,e.branding.appNameKey,o.defaultLocale)&&r.push(C({code:`MISSING_TRANSLATION_KEY`,severity:`error`,path:`branding.appNameKey`,message:`Translation key "${e.branding.appNameKey}" is missing for locale "${o.defaultLocale}".`})));let c=t.locales;if(c){let{defaultLocale:e,enabledLocales:t}=c;if(t.includes(e)||r.push(C({code:`LOCALE_NOT_ENABLED`,severity:`warning`,path:`locales.enabledLocales`,message:`enabledLocales does not include defaultLocale "${e}".`})),o){let n=new Set(o.supportedLocales);for(let i of[e,...t])n.has(i)||r.push(C({code:`UNSUPPORTED_LOCALE`,severity:`error`,path:`locales.enabledLocales`,message:`Locale "${i}" is not supported by blueprint catalog "${o.meta.name}".`}))}}let l=new Set;for(let e of a.blueprint)for(let t of e.entries)l.add(t.key);for(let e of a.platform)for(let t of e.entries)l.add(t.key);return(t.translationOverrides?.entries??[]).forEach((e,n)=>{let i=`translationOverrides.entries[${n}]`;l.has(e.key)||r.push(C({code:`UNKNOWN_TRANSLATION_KEY`,severity:`error`,path:i,message:`Override references unknown key "${e.key}".`})),o&&(new Set([...o.supportedLocales,...t.locales?.enabledLocales??[],t.locales?.defaultLocale??o.defaultLocale]).has(e.locale)||r.push(C({code:`UNSUPPORTED_LOCALE_OVERRIDE`,severity:`error`,path:i,message:`Locale "${e.locale}" is not enabled for tenant overrides.`})))}),r}},x={scope:`resolved`,name:`integration.required-slots`,category:`integration`,validate(e,t){let n=[],r=(e.integrationSlots??[]).filter(e=>e.required);for(let e of r)t.integrations.some(t=>t.slot.slotId===e.slotId)||n.push(C({code:`MISSING_REQUIRED_SLOT`,severity:`error`,path:`integrations.${e.slotId}`,message:`Resolved config is missing integration slot "${e.slotId}".`}));for(let e of t.integrations)(e.connection.status===`disconnected`||e.connection.status===`error`)&&n.push(C({code:`CONNECTION_NOT_READY`,severity:`error`,path:`integrations.${e.slot.slotId}`,message:`Resolved integration "${e.slot.slotId}" uses a connection in status "${e.connection.status}".`}));return n}},S={scope:`resolved`,name:`translation.default-locale`,category:`translation`,validate(e,t){let n=[],r=t.translation;return r&&!r.supportedLocales.includes(r.defaultLocale)&&n.push(C({code:`DEFAULT_LOCALE_NOT_SUPPORTED`,severity:`warning`,path:`translation.defaultLocale`,message:`supportedLocales should include defaultLocale for consistent fallback behaviour.`})),n}};function C(e){return e}function w(e){let t=new Map;for(let n of e){let e=`${n.code}|${n.path}|${n.severity}`;t.has(e)||t.set(e,n)}return[...t.values()]}function T(e){return`${e.key}@${e.version}`}function E(e,t){return e.capabilities.provides.some(e=>e.key===t.key&&e.version===t.version)}function D(e,t){if(e)return e.get(t.meta.integrationKey,t.meta.integrationVersion)}function O(e){let[t]=e.split(`?`);if(!t)return;let n=t.lastIndexOf(`.`);if(n!==-1)return t.slice(n+1).toLowerCase()}function k(e){return e?{platform:e.platform?Array.isArray(e.platform)?e.platform:[e.platform]:[],blueprint:e.blueprint?Array.isArray(e.blueprint)?e.blueprint:[e.blueprint]:[]}:{platform:[],blueprint:[]}}function A(e,t,n){return e.some(e=>e.key===t&&e.locale===n)}export{c as validateBlueprint,s as validateConfig,u as validateResolvedConfig,l as validateTenantConfig};
@@ -0,0 +1 @@
1
+ import{registerDocBlocks as e}from"../../docs/registry.js";import"../../registry.js";const t=[{id:`docs.tech.contracts.capabilities`,title:`CapabilitySpec Overview`,summary:"Capability specs provide a canonical, versioned contract for what a module offers (`provides`) and what it depends on (`requires`). They enable safe composition across features, automated validation during `installFeature`, and consistent documentation for shared surfaces (APIs, events, workflows, UI, resources).",kind:`reference`,visibility:`public`,route:`/docs/tech/contracts/capabilities`,tags:[`tech`,`contracts`,`capabilities`],body:"# CapabilitySpec Overview\n\n## Purpose\n\nCapability specs provide a canonical, versioned contract for what a module offers (`provides`) and what it depends on (`requires`). They enable safe composition across features, automated validation during `installFeature`, and consistent documentation for shared surfaces (APIs, events, workflows, UI, resources).\n\n## Schema\n\nDefined in `@lssm/lib.contracts/src/capabilities.ts`.\n\n```ts\nexport interface CapabilitySpec {\n meta: CapabilityMeta; // ownership metadata + { key, version, kind }\n provides?: CapabilitySurfaceRef[]; // what concrete surfaces this capability exposes\n requires?: CapabilityRequirement[];// capabilities that must already exist\n}\n```\n\n- **CapabilityMeta**\n - `key`: stable slug (e.g., `payments.stripe`)\n - `version`: bump on breaking changes\n - `kind`: `'api' | 'event' | 'data' | 'ui' | 'integration'`\n - ownership fields (`title`, `description`, `domain`, `owners`, `tags`, `stability`)\n- **CapabilitySurfaceRef**\n - `surface`: `'operation' | 'event' | 'workflow' | 'presentation' | 'resource'`\n - `name` / `version`: points to the declared contract (operation name, event name, etc.)\n - optional `description`\n- **CapabilityRequirement**\n - `key`: capability slug to satisfy\n - `version?`: pin to an exact version when required (defaults to highest registered)\n - `kind?`: extra guard if the same key hosts multiple kinds\n - `optional?`: skip strict enforcement (informational requirement)\n - `reason?`: why this dependency exists (docs + tooling)\n\n## Registry\n\n`CapabilityRegistry` provides:\n\n- `register(spec)`: register a capability (`key + version` must be unique)\n- `get(key, version?)`: retrieve the exact or highest version\n- `list()`: inspect all capabilities\n- `satisfies(requirement, additional?)`: check if a requirement is met (includes locally provided capabilities passed via `additional`)\n\n## Feature Integration\n\n`FeatureModuleSpec` now accepts:\n\n```ts\ncapabilities?: {\n provides?: CapabilityRef[]; // capabilities this feature exposes\n requires?: CapabilityRequirement[]; // capabilities the feature needs\n};\n```\n\nDuring `installFeature`:\n\n1. `provides` entries must exist in the `CapabilityRegistry`.\n2. `requires` entries must be satisfied either by:\n - the same feature’s `provides`,\n - or existing capabilities already registered in the global registry.\n\nErrors are thrown when dependencies cannot be satisfied, preventing unsafe module composition.\n\n## Authoring Guidelines\n\n1. **Register capability specs** in a shared package (e.g., `packages/.../capabilities`) before referencing them in features.\n2. **Version consciously**: bump capability versions when the provided surfaces or contract semantics change.\n3. **Document dependencies** via `reason` strings to help operators understand why a capability is required.\n4. **Prefer stable keys** that map to business/technical domains (`billing.invoices`, `payments.stripe`, `cms.assets`).\n5. When introducing new capability kinds, update the `CapabilityKind` union and accompanying docs/tests.\n\n## Tooling (Roadmap)\n\n- CLI validation warns when feature specs reference missing capabilities.\n- Future build steps will leverage capability data to scaffold adapters and enforce policy in generated code.\n- Capability metadata will surface in docs/LLM guides to describe module marketplaces and installation flows.\n\n"}];e(t);export{t as tech_contracts_capabilities_DocBlocks};
@@ -1,2 +1 @@
1
- import{StabilityEnum as e}from"../ownership.js";const t=[`platform.finance`],n=[`open-banking`,`finance`],r={meta:{key:`openbanking.accounts.read`,version:1,kind:`integration`,title:`Open Banking Accounts (Read)`,description:`Provides read-only access to linked bank accounts, including account summaries and metadata.`,domain:`finance`,owners:[...t],tags:[...n],stability:e.Experimental},provides:[{surface:`operation`,name:`openbanking.accounts.list`,version:1,description:`List bank accounts linked to a Powens open banking connection.`},{surface:`operation`,name:`openbanking.accounts.get`,version:1,description:`Retrieve the canonical bank account record for a specific account.`},{surface:`operation`,name:`openbanking.accounts.sync`,version:1,description:`Trigger a refresh of bank account metadata from the open banking provider.`}]},i={meta:{key:`openbanking.transactions.read`,version:1,kind:`integration`,title:`Open Banking Transactions (Read)`,description:`Enables retrieval of transaction history for linked bank accounts via open banking providers.`,domain:`finance`,owners:[...t],tags:[...n,`transactions`],stability:e.Experimental},provides:[{surface:`operation`,name:`openbanking.transactions.list`,version:1,description:`List transactions for a given bank account with optional date filtering.`},{surface:`operation`,name:`openbanking.transactions.sync`,version:1,description:`Synchronise transactions from the open banking provider into the canonical ledger.`}]},a={meta:{key:`openbanking.balances.read`,version:1,kind:`integration`,title:`Open Banking Balances (Read)`,description:`Allows querying of current and available balances for linked bank accounts via open banking providers.`,domain:`finance`,owners:[...t],tags:[...n,`balances`],stability:e.Experimental},provides:[{surface:`operation`,name:`openbanking.balances.get`,version:1,description:`Retrieve the latest known balances for a specified bank account.`},{surface:`operation`,name:`openbanking.balances.refresh`,version:1,description:`Force a balance refresh from the open banking provider.`}]};function o(e){return e.register(r).register(i).register(a)}export{r as openBankingAccountsReadCapability,a as openBankingBalancesReadCapability,i as openBankingTransactionsReadCapability,o as registerOpenBankingCapabilities};
2
- //# sourceMappingURL=openbanking.js.map
1
+ import{StabilityEnum as e}from"../ownership.js";const t=[`platform.finance`],n=[`open-banking`,`finance`],r={meta:{key:`openbanking.accounts.read`,version:1,kind:`integration`,title:`Open Banking Accounts (Read)`,description:`Provides read-only access to linked bank accounts, including account summaries and metadata.`,domain:`finance`,owners:[...t],tags:[...n],stability:e.Experimental},provides:[{surface:`operation`,name:`openbanking.accounts.list`,version:1,description:`List bank accounts linked to a Powens open banking connection.`},{surface:`operation`,name:`openbanking.accounts.get`,version:1,description:`Retrieve the canonical bank account record for a specific account.`},{surface:`operation`,name:`openbanking.accounts.sync`,version:1,description:`Trigger a refresh of bank account metadata from the open banking provider.`}]},i={meta:{key:`openbanking.transactions.read`,version:1,kind:`integration`,title:`Open Banking Transactions (Read)`,description:`Enables retrieval of transaction history for linked bank accounts via open banking providers.`,domain:`finance`,owners:[...t],tags:[...n,`transactions`],stability:e.Experimental},provides:[{surface:`operation`,name:`openbanking.transactions.list`,version:1,description:`List transactions for a given bank account with optional date filtering.`},{surface:`operation`,name:`openbanking.transactions.sync`,version:1,description:`Synchronise transactions from the open banking provider into the canonical ledger.`}]},a={meta:{key:`openbanking.balances.read`,version:1,kind:`integration`,title:`Open Banking Balances (Read)`,description:`Allows querying of current and available balances for linked bank accounts via open banking providers.`,domain:`finance`,owners:[...t],tags:[...n,`balances`],stability:e.Experimental},provides:[{surface:`operation`,name:`openbanking.balances.get`,version:1,description:`Retrieve the latest known balances for a specified bank account.`},{surface:`operation`,name:`openbanking.balances.refresh`,version:1,description:`Force a balance refresh from the open banking provider.`}]};function o(e){return e.register(r).register(i).register(a)}export{r as openBankingAccountsReadCapability,a as openBankingBalancesReadCapability,i as openBankingTransactionsReadCapability,o as registerOpenBankingCapabilities};
@@ -1,2 +1 @@
1
- const e=(e,t)=>`${e}.v${t}`;var t=class{items=new Map;register(t){let n=e(t.meta.key,t.meta.version);if(this.items.has(n))throw Error(`Duplicate capability ${n}`);return this.items.set(n,t),this}list(){return[...this.items.values()]}get(t,n){if(n!=null)return this.items.get(e(t,n));let r,i=-1/0;for(let e of this.items.values())e.meta.key===t&&e.meta.version>i&&(i=e.meta.version,r=e);return r}satisfies(e,t){if(e.optional||t?.some(t=>n(t,e)))return!0;let r=e.version?this.get(e.key,e.version):this.get(e.key);return!(!r||e.kind&&r.meta.kind!==e.kind||e.version!=null&&r.meta.version!==e.version)}};function n(e,t){return!(e.key!==t.key||t.version!=null&&e.version!==t.version)}function r(t){return e(t.meta.key,t.meta.version)}function i(e){return e}export{t as CapabilityRegistry,r as capabilityKey,i as defineCapability};
2
- //# sourceMappingURL=capabilities.js.map
1
+ const e=(e,t)=>`${e}.v${t}`;var t=class{items=new Map;register(t){let n=e(t.meta.key,t.meta.version);if(this.items.has(n))throw Error(`Duplicate capability ${n}`);return this.items.set(n,t),this}list(){return[...this.items.values()]}get(t,n){if(n!=null)return this.items.get(e(t,n));let r,i=-1/0;for(let e of this.items.values())e.meta.key===t&&e.meta.version>i&&(i=e.meta.version,r=e);return r}satisfies(e,t){if(e.optional||t?.some(t=>n(t,e)))return!0;let r=e.version?this.get(e.key,e.version):this.get(e.key);return!(!r||e.kind&&r.meta.kind!==e.kind||e.version!=null&&r.meta.version!==e.version)}};function n(e,t){return!(e.key!==t.key||t.version!=null&&e.version!==t.version)}function r(t){return e(t.meta.key,t.meta.version)}function i(e){return e}export{t as CapabilityRegistry,r as capabilityKey,i as defineCapability};
@@ -1,2 +1 @@
1
- function e(e){return e}export{e as rnReusablesDriver};
2
- //# sourceMappingURL=rn-reusables.js.map
1
+ function e(e){return e}export{e as rnReusablesDriver};
@@ -1,2 +1 @@
1
- function e(e){return e}export{e as shadcnDriver};
2
- //# sourceMappingURL=shadcn.js.map
1
+ function e(e){return e}export{e as shadcnDriver};
@@ -1,2 +1 @@
1
- import{createDefaultTransformEngine as e,registerBasicValidation as t,registerDefaultReactRenderer as n}from"../../presentations.v2.js";import r from"react";function i(){return t(n(e()))}async function a(e,t,n,i){if(t===`react`){let t=await e.render(`react`,n);if(t.kind===`react_component`){let e=(i?.componentMap??{})[t.componentKey];if(!e)return null;let n={...t.props??{},...i?.reactProps??{}};return r.createElement(e,n)}return t.kind===`blocknotejs`?i?.renderBlockNote?i.renderBlockNote(t.docJson,t.blockConfig):r.createElement(`div`,{},`[BlockNote renderer not configured]`):null}return t===`markdown`||t===`application/json`||t===`application/xml`?e.render(t,n):null}function o(e,t){return{meta:e,...t}}function s(e,t){return e.register(t),e}export{i as createEngineWithDefaults,o as createFeatureModule,s as registerFeature,a as renderFeaturePresentation};
2
- //# sourceMappingURL=feature-render.js.map
1
+ import{createDefaultTransformEngine as e,registerBasicValidation as t,registerDefaultReactRenderer as n}from"../../presentations.v2.js";import r from"react";function i(){return t(n(e()))}async function a(e,t,n,i){if(t===`react`){let t=await e.render(`react`,n);if(t.kind===`react_component`){let e=(i?.componentMap??{})[t.componentKey];if(!e)return null;let n={...t.props??{},...i?.reactProps??{}};return r.createElement(e,n)}return t.kind===`blocknotejs`?i?.renderBlockNote?i.renderBlockNote(t.docJson,t.blockConfig):r.createElement(`div`,{},`[BlockNote renderer not configured]`):null}return t===`markdown`||t===`application/json`||t===`application/xml`?e.render(t,n):null}function o(e,t){return{meta:e,...t}}function s(e,t){return e.register(t),e}export{i as createEngineWithDefaults,o as createFeatureModule,s as registerFeature,a as renderFeaturePresentation};
@@ -1,2 +1 @@
1
- import{buildZodWithRelations as e,evalPredicate as t}from"../../forms.js";import n,{useEffect as r,useMemo as i,useState as a}from"react";import{Controller as o,useFieldArray as s,useForm as c}from"react-hook-form";import{zodResolver as l}from"@hookform/resolvers/zod";import{Fragment as u,jsx as d,jsxs as f}from"react/jsx-runtime";function p(e){if(e)return Array.isArray(e)?{kind:`static`,options:e}:e}function m(e,t){if(!t)return;let n=t.replace(/\[(\d+)\]/g,`.$1`).split(`.`).filter(Boolean),r=e;for(let e of n){if(r==null)return;r=r[e]}return r}function h(e,t){if(!t||t.length===0)return`[]`;try{return JSON.stringify(t.map(t=>m(e,t)))}catch{return`[]`}}function g(e,t,n){let[o,s]=a([]);return r(()=>{let r=!0;return(async()=>{if(!t)return s([]);if(t.kind===`static`)return s([...t.options??[]]);let i=n?.[t.resolverKey];if(!i)return s([]);let a=await i(e,t.args);r&&s([...a??[]])})(),()=>{r=!1}},[i(()=>t?t.kind===`static`?JSON.stringify(t.options??[]):h(e,t.deps):`nil`,[t,e]),t&&t.resolverKey]),o}function _(e,t,n){if(!t)return e??``;let r=typeof n==`number`?`${t.replace(/^\$index$/,String(n))}`:t;return e?`${e}${typeof n==`number`?`.${n}`:``}.${r}`.replace(/\.+/g,`.`):r}function v(r){let a=r,{driver:m}=a;function h(r){let{spec:a,options:h,merged:v}=r,y=i(()=>e(a),[a]),b=c({...v.formOptions,resolver:l(y),defaultValues:h?.defaultValues}),x=b.watch(),S=(e,r,i)=>{let a=m.Field,s=m.FieldLabel,c=m.FieldDescription,l=m.FieldError,h=_(r,e.name,i),y=t(x,e.visibleWhen),w=t(x,e.enabledWhen),T=!!b.getFieldState(h)?.invalid;if(!y)return null;let E=h?.replace(/\./g,`-`),D={"data-invalid":T,hidden:!y,disabled:!w},O=e.labelI18n?d(s,{htmlFor:E,children:e.labelI18n}):null,k=e.descriptionI18n?d(c,{children:e.descriptionI18n}):null;if(e.kind===`group`){let t=e.fields.map((e,t)=>d(n.Fragment,{children:S(e,h,i)},`${h}-${t}`));return f(a,{...D,children:[O,t,k]})}return e.kind===`array`?C(e,r):d(o,{name:h,control:b.control,render:({field:t,fieldState:n})=>{let r=n.error?[n.error]:[],i=n.invalid||void 0;if(e.kind===`text`){let o=m.Input;return f(a,{...D,children:[O,d(o,{id:E,"aria-invalid":i,placeholder:e.placeholderI18n,autoComplete:e.autoComplete,inputMode:e.inputMode,maxLength:e.maxLength,minLength:e.minLength,disabled:!w,...t,...e.uiProps,keyboard:e.keyboard,autoComplete:e.keyboard?.autoComplete??e.autoComplete}),k,n.invalid?d(l,{errors:r}):null]})}if(e.kind===`textarea`){let o=m.Textarea;return f(a,{...D,children:[O,d(o,{id:E,"aria-invalid":i,placeholder:e.placeholderI18n,rows:e.rows,maxLength:e.maxLength,disabled:!w,...t,...e.uiProps,keyboard:e.keyboard,autoComplete:e.keyboard?.autoComplete??e.autoComplete}),k,n.invalid?d(l,{errors:r}):null]})}if(e.kind===`select`){let o=m.Select,s=g(x,p(e.options),v.resolvers);return f(a,{...D,children:[O,d(o,{id:E,name:h,"aria-invalid":i,disabled:!w,value:t.value,onChange:e=>t.onChange(e),options:s,...e.uiProps}),k,n.invalid?d(l,{errors:r}):null]})}if(e.kind===`checkbox`){let i=m.Checkbox;return f(a,{...D,children:[O,d(i,{id:E,name:h,disabled:!w,checked:!!t.value,onCheckedChange:e=>t.onChange(e),...e.uiProps}),k,n.invalid?d(l,{errors:r}):null]})}if(e.kind===`radio`){let i=m.RadioGroup,o=g(x,p(e.options),v.resolvers);return f(a,{...D,children:[O,d(i,{id:E,name:h,disabled:!w,value:t.value,onValueChange:e=>t.onChange(e),options:o,...e.uiProps}),k,n.invalid?d(l,{errors:r}):null]})}if(e.kind===`switch`){let i=m.Switch;return f(a,{...D,children:[O,d(i,{id:E,name:h,disabled:!w,checked:!!t.value,onCheckedChange:e=>t.onChange(e),...e.uiProps}),k,n.invalid?d(l,{errors:r}):null]})}return d(u,{})}},h)},C=(e,t)=>{let n=_(t,e.name),{fields:r,append:i,remove:a}=s({control:b.control,name:n}),o=e.max==null||r.length<e.max,c=t=>(e.min==null?r.length>0:r.length>e.min)&&t>=0,l=m.Button,u=m.FieldLabel;return f(`div`,{children:[e.labelI18n?d(u,{children:e.labelI18n}):null,r.map((t,r)=>f(`div`,{children:[S(e.of,n,r),c(r)?d(l,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>a(r),children:`Remove`}):null]},t.id??r)),o?d(l,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>i({}),children:`Add`}):null]},n)},w=async e=>{let t=a.actions?.[0]?.key??`submit`;if(v.onSubmitOverride)return v.onSubmitOverride(e,t)},T=m.Button;return f(`form`,{onSubmit:b.handleSubmit(w),children:[(a.fields||[]).map((e,t)=>d(n.Fragment,{children:S(e)},t)),a.actions&&a.actions.length?d(`div`,{children:a.actions.map(e=>d(T,{type:`submit`,children:e.labelI18n},e.key))}):null]})}return{render:(e,t)=>d(h,{spec:e,options:t,merged:{...a,...t?.overrides??{}}})}}export{v as createFormRenderer};
2
- //# sourceMappingURL=form-render.js.map
1
+ import{buildZodWithRelations as e,evalPredicate as t}from"../../forms.js";import n,{useEffect as r,useMemo as i,useState as a}from"react";import{Controller as o,useFieldArray as s,useForm as c}from"react-hook-form";import{zodResolver as l}from"@hookform/resolvers/zod";import{Fragment as u,jsx as d,jsxs as f}from"react/jsx-runtime";function p(e){if(e)return Array.isArray(e)?{kind:`static`,options:e}:e}function m(e,t){if(!t)return;let n=t.replace(/\[(\d+)\]/g,`.$1`).split(`.`).filter(Boolean),r=e;for(let e of n){if(r==null)return;r=r[e]}return r}function h(e,t){if(!t||t.length===0)return`[]`;try{return JSON.stringify(t.map(t=>m(e,t)))}catch{return`[]`}}function g(e,t,n){let[o,s]=a([]);return r(()=>{let r=!0;return(async()=>{if(!t)return s([]);if(t.kind===`static`)return s([...t.options??[]]);let i=n?.[t.resolverKey];if(!i)return s([]);let a=await i(e,t.args);r&&s([...a??[]])})(),()=>{r=!1}},[i(()=>t?t.kind===`static`?JSON.stringify(t.options??[]):h(e,t.deps):`nil`,[t,e]),t&&t.resolverKey]),o}function _(e,t,n){if(!t)return e??``;let r=typeof n==`number`?`${t.replace(/^\$index$/,String(n))}`:t;return e?`${e}${typeof n==`number`?`.${n}`:``}.${r}`.replace(/\.+/g,`.`):r}function v(r){let a=r,{driver:m}=a;function h(r){let{spec:a,options:h,merged:v}=r,y=i(()=>e(a),[a]),b=c({...v.formOptions,resolver:l(y),defaultValues:h?.defaultValues}),x=b.watch(),S=(e,r,i)=>{let a=m.Field,s=m.FieldLabel,c=m.FieldDescription,l=m.FieldError,h=_(r,e.name,i),y=t(x,e.visibleWhen),w=t(x,e.enabledWhen),T=!!b.getFieldState(h)?.invalid;if(!y)return null;let E=h?.replace(/\./g,`-`),D={"data-invalid":T,hidden:!y,disabled:!w},O=e.labelI18n?d(s,{htmlFor:E,children:e.labelI18n}):null,k=e.descriptionI18n?d(c,{children:e.descriptionI18n}):null;if(e.kind===`group`){let t=e.fields.map((e,t)=>d(n.Fragment,{children:S(e,h,i)},`${h}-${t}`));return f(a,{...D,children:[O,t,k]})}return e.kind===`array`?C(e,r):d(o,{name:h,control:b.control,render:({field:t,fieldState:n})=>{let r=n.error?[n.error]:[],i=n.invalid||void 0;if(e.kind===`text`){let o=m.Input;return f(a,{...D,children:[O,d(o,{id:E,"aria-invalid":i,placeholder:e.placeholderI18n,autoComplete:e.autoComplete,inputMode:e.inputMode,maxLength:e.maxLength,minLength:e.minLength,disabled:!w,...t,...e.uiProps,keyboard:e.keyboard,autoComplete:e.keyboard?.autoComplete??e.autoComplete}),k,n.invalid?d(l,{errors:r}):null]})}if(e.kind===`textarea`){let o=m.Textarea;return f(a,{...D,children:[O,d(o,{id:E,"aria-invalid":i,placeholder:e.placeholderI18n,rows:e.rows,maxLength:e.maxLength,disabled:!w,...t,...e.uiProps,keyboard:e.keyboard,autoComplete:e.keyboard?.autoComplete??e.autoComplete}),k,n.invalid?d(l,{errors:r}):null]})}if(e.kind===`select`){let o=m.Select,s=g(x,p(e.options),v.resolvers);return f(a,{...D,children:[O,d(o,{id:E,name:h,"aria-invalid":i,disabled:!w,value:t.value,onChange:e=>t.onChange(e),options:s,...e.uiProps}),k,n.invalid?d(l,{errors:r}):null]})}if(e.kind===`checkbox`){let i=m.Checkbox;return f(a,{...D,children:[O,d(i,{id:E,name:h,disabled:!w,checked:!!t.value,onCheckedChange:e=>t.onChange(e),...e.uiProps}),k,n.invalid?d(l,{errors:r}):null]})}if(e.kind===`radio`){let i=m.RadioGroup,o=g(x,p(e.options),v.resolvers);return f(a,{...D,children:[O,d(i,{id:E,name:h,disabled:!w,value:t.value,onValueChange:e=>t.onChange(e),options:o,...e.uiProps}),k,n.invalid?d(l,{errors:r}):null]})}if(e.kind===`switch`){let i=m.Switch;return f(a,{...D,children:[O,d(i,{id:E,name:h,disabled:!w,checked:!!t.value,onCheckedChange:e=>t.onChange(e),...e.uiProps}),k,n.invalid?d(l,{errors:r}):null]})}return d(u,{})}},h)},C=(e,t)=>{let n=_(t,e.name),{fields:r,append:i,remove:a}=s({control:b.control,name:n}),o=e.max==null||r.length<e.max,c=t=>(e.min==null?r.length>0:r.length>e.min)&&t>=0,l=m.Button,u=m.FieldLabel;return f(`div`,{children:[e.labelI18n?d(u,{children:e.labelI18n}):null,r.map((t,r)=>f(`div`,{children:[S(e.of,n,r),c(r)?d(l,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>a(r),children:`Remove`}):null]},t.id??r)),o?d(l,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>i({}),children:`Add`}):null]},n)},w=async e=>{let t=a.actions?.[0]?.key??`submit`;if(v.onSubmitOverride)return v.onSubmitOverride(e,t)},T=m.Button;return f(`form`,{onSubmit:b.handleSubmit(w),children:[(a.fields||[]).map((e,t)=>d(n.Fragment,{children:S(e)},t)),a.actions&&a.actions.length?d(`div`,{children:a.actions.map(e=>d(T,{type:`submit`,children:e.labelI18n},e.key))}):null]})}return{render:(e,t)=>d(h,{spec:e,options:t,merged:{...a,...t?.overrides??{}}})}}export{v as createFormRenderer};
@@ -0,0 +1 @@
1
+ import{ContractRegistryFileSchema as e,ContractRegistryItemSchema as t,ContractRegistryItemTypeSchema as n,ContractRegistryManifestSchema as r}from"./schemas.js";export{e as ContractRegistryFileSchema,t as ContractRegistryItemSchema,n as ContractRegistryItemTypeSchema,r as ContractRegistryManifestSchema};
@@ -0,0 +1 @@
1
+ import{StabilityEnum as e}from"../ownership.js";import t from"zod";const n=t.enum([`contractspec:operation`,`contractspec:event`,`contractspec:presentation`,`contractspec:form`,`contractspec:feature`,`contractspec:workflow`,`contractspec:template`,`contractspec:integration`,`contractspec:data-view`,`contractspec:migration`,`contractspec:telemetry`,`contractspec:experiment`,`contractspec:app-config`,`contractspec:knowledge`]),r=t.object({path:t.string().min(1),type:t.string().min(1),content:t.string().optional()}),i=t.object({name:t.string().min(1),type:n,version:t.number().int().nonnegative(),title:t.string().min(1),description:t.string().min(1),meta:t.object({stability:t.enum([e.Idea,e.InCreation,e.Experimental,e.Beta,e.Stable,e.Deprecated]),owners:t.array(t.string().min(1)).default([]),tags:t.array(t.string().min(1)).default([])}),dependencies:t.array(t.string().min(1)).optional(),registryDependencies:t.array(t.string().min(1)).optional(),files:t.array(r).min(1),schema:t.object({input:t.unknown().optional(),output:t.unknown().optional()}).optional()}),a=t.object({$schema:t.string().min(1).optional(),name:t.string().min(1),homepage:t.string().min(1).optional(),items:t.array(i)});export{r as ContractRegistryFileSchema,i as ContractRegistryItemSchema,n as ContractRegistryItemTypeSchema,a as ContractRegistryManifestSchema};
File without changes
@@ -1,2 +1 @@
1
- function e(e){if(!e)return{isList:!1,inner:`JSON`};let t=String(e).trim();return t.startsWith(`[`)&&t.endsWith(`]`)?{isList:!0,inner:t.slice(1,-1).trim()}:{isList:!1,inner:t}}async function t(e,t,n){if(!e||!n.template)return t;let r=n.varName??`id`,i=async t=>{if(t&&t[r]!==void 0){let i=String(t[r]),a=n.template.replace(`{id}`,i),o=e.match(a);if(o){let e=await o.tmpl.resolve(o.params,{});try{return JSON.parse(String(e.data||`null`))}catch{return e.data}}}return t};return n.returns.isList&&Array.isArray(t)?await Promise.all(t.map(e=>i(e))):await i(t)}export{t as hydrateResourceIfNeeded,e as parseReturns};
2
- //# sourceMappingURL=contracts-adapter-hydration.js.map
1
+ function e(e){if(!e)return{isList:!1,inner:`JSON`};let t=String(e).trim();return t.startsWith(`[`)&&t.endsWith(`]`)?{isList:!0,inner:t.slice(1,-1).trim()}:{isList:!1,inner:t}}async function t(e,t,n){if(!e||!n.template)return t;let r=n.varName??`id`,i=async t=>{if(t&&t[r]!==void 0){let i=String(t[r]),a=n.template.replace(`{id}`,i),o=e.match(a);if(o){let e=await o.tmpl.resolve(o.params,{});try{return JSON.parse(String(e.data||`null`))}catch{return e.data}}}return t};return n.returns.isList&&Array.isArray(t)?await Promise.all(t.map(e=>i(e))):await i(t)}export{t as hydrateResourceIfNeeded,e as parseReturns};
@@ -1,2 +1 @@
1
- function e(e){return typeof e?.getPothosInput==`function`&&typeof e?.getZod==`function`}function t(e){return typeof e?.getPothos==`function`}function n(e){return typeof e?.getEnumValues==`function`&&typeof e?.getPothos==`function`}function r(e){return e===`Boolean_unsecure`?`Boolean`:e===`ID_unsecure`?`ID`:e===`String_unsecure`?`String`:e===`Int_unsecure`?`Int`:e===`Float_unsecure`?`Float`:e}function i(i){let a=new Map,o=new Set;function s(t){let r=Object.entries(t.config.fields);for(let[,t]of r)if(e(t.type))s(t.type);else if(n(t.type)){let e=t.type,n=e.getName?.()??e.getPothos().name;o.has(n)||(i.enumType(n,{values:e.getEnumValues()}),o.add(n))}}function c(n){let o=String(n.config?.name??`Input`),l=a.get(o);if(l)return l;s(n);let u=i.inputType(n.getPothosInput(),{fields:i=>{let a=Object.entries(n.config.fields),o={};for(let[n,s]of a)if(e(s.type)){let e=c(s.type),t=s.isArray?[e]:e;o[n]=i.field({type:t,required:!s.isOptional})}else if(t(s.type)){let e=r(String(s.type.getPothos().name)),t=s.isArray?[e]:e;o[n]=i.field({type:t,required:!s.isOptional})}else{let e=s.isArray?[`JSON`]:`JSON`;o[n]=i.field({type:e,required:!s.isOptional})}return o}});return a.set(o,u),u}function l(e){return!e||!e.config?.fields||Object.keys(e.config.fields).length===0?null:c(e)}return{buildInputFieldArgs:l}}export{i as createInputTypeBuilder,e as isSchemaModel};
2
- //# sourceMappingURL=contracts-adapter-input.js.map
1
+ function e(e){return typeof e?.getPothosInput==`function`&&typeof e?.getZod==`function`}function t(e){return typeof e?.getPothos==`function`}function n(e){return typeof e?.getEnumValues==`function`&&typeof e?.getPothos==`function`}function r(e){return e===`Boolean_unsecure`?`Boolean`:e===`ID_unsecure`?`ID`:e===`String_unsecure`?`String`:e===`Int_unsecure`?`Int`:e===`Float_unsecure`?`Float`:e}function i(i){let a=new Map,o=new Set;function s(t){let r=Object.entries(t.config.fields);for(let[,t]of r)if(e(t.type))s(t.type);else if(n(t.type)){let e=t.type,n=e.getName?.()??e.getPothos().name;o.has(n)||(i.enumType(n,{values:e.getEnumValues()}),o.add(n))}}function c(n){let o=String(n.config?.name??`Input`),l=a.get(o);if(l)return l;s(n);let u=i.inputType(n.getPothosInput(),{fields:i=>{let a=Object.entries(n.config.fields),o={};for(let[n,s]of a)if(e(s.type)){let e=c(s.type),t=s.isArray?[e]:e;o[n]=i.field({type:t,required:!s.isOptional})}else if(t(s.type)){let e=r(String(s.type.getPothos().name)),t=s.isArray?[e]:e;o[n]=i.field({type:t,required:!s.isOptional})}else{let e=s.isArray?[`JSON`]:`JSON`;o[n]=i.field({type:e,required:!s.isOptional})}return o}});return a.set(o,u),u}function l(e){return!e||!e.config?.fields||Object.keys(e.config.fields).length===0?null:c(e)}return{buildInputFieldArgs:l}}export{i as createInputTypeBuilder,e as isSchemaModel};
@@ -0,0 +1 @@
1
+ import{registerDocBlocks as e}from"../../docs/registry.js";import"../../registry.js";const t=[{id:`docs.tech.contracts.data-views`,title:`DataViewSpec Overview`,summary:"`DataViewSpec` is the declarative contract for projecting entities into list/detail/table/grid experiences. Each spec ties to contract operations (`source.primary`, `source.item`) and describes how the UI should present, sort, and filter records. Host applications use the spec to render UI with shared components (`DataViewRenderer`, `DataViewList`, `DataViewTable`, `DataViewDetail`) while keeping presentation logic in a single source of truth.",kind:`reference`,visibility:`public`,route:`/docs/tech/contracts/data-views`,tags:[`tech`,`contracts`,`data-views`],body:"# DataViewSpec Overview\n\n## Purpose\n\n`DataViewSpec` is the declarative contract for projecting entities into list/detail/table/grid experiences. Each spec ties to contract operations (`source.primary`, `source.item`) and describes how the UI should present, sort, and filter records. Host applications use the spec to render UI with shared components (`DataViewRenderer`, `DataViewList`, `DataViewTable`, `DataViewDetail`) while keeping presentation logic in a single source of truth.\n\n## Location\n\n- Type definitions and registry: `packages/libs/contracts/src/data-views.ts`\n- React renderers: `packages/libs/design-system/src/components/data-view`\n- CLI scaffolding: `contractspec create --type data-view`\n\n## Schema Highlights\n\n```ts\nexport interface DataViewSpec {\n meta: DataViewMeta; // ownership meta + { name, version, entity }\n source: DataViewSource; // contract operations and refresh events\n view: DataViewConfig; // union of list/detail/table/grid definitions\n states?: DataViewStates; // optional empty/error/loading presentations\n policy?: { flags?: string[]; pii?: string[] };\n}\n```\n\n- **DataViewMeta**: `name`, `version`, `entity`, ownership metadata (title, description, domain, owners, tags, stability).\n- **DataViewSource**:\n - `primary`: required query operation (`OpRef`) for fetching collections.\n - `item`: optional detail query (recommended for `detail` views).\n - `mutations`: optional create/update/delete operation refs.\n - `refreshEvents`: events that should trigger refresh.\n- **DataViewConfig** (union):\n - `list`: card/compact list, `primaryField`, `secondaryFields`.\n - `table`: column configuration (`columns`, alignments, density).\n - `detail`: sections of fields for record inspection.\n - `grid`: multi-column grid (rendered as card list today).\n- **DataViewField**: `key`, `label`, `dataPath`, formatting hints (`format`), sort/filter toggles, optional presentation override.\n- **DataViewFilter**: describes filter inputs (search, enum, number, date, boolean).\n- **DataViewAction**: simple declarative actions (`navigation` or `operation`).\n\n## Registry Usage\n\n```ts\nimport { DataViewRegistry } from '@lssm/lib.contracts/data-views';\nimport { ResidentsDataView } from './data-views/residents.data-view';\n\nconst registry = new DataViewRegistry();\nregistry.register(ResidentsDataView);\n\nconst listView = registry.get('residents.admin.list');\n```\n\nRegistries guard against duplicate `(name, version)` pairs and make latest-version lookup trivial.\n\n## Rendering\n\n```tsx\nimport { DataViewRenderer } from '@lssm/lib.design-system';\nimport { ResidentsDataView } from '../contracts/data-views/residents.data-view';\n\nfunction ResidentsTable({ rows }: { rows: Record<string, unknown>[] }) {\n return (\n <DataViewRenderer\n spec={ResidentsDataView}\n items={rows}\n onRowClick={(row) => console.log('Selected', row)}\n />\n );\n}\n```\n\nFor more control, use specific components:\n\n- `DataViewList` – friendly cards/rows\n- `DataViewTable` – tabular presentation with optional header/footers\n- `DataViewDetail` – two-column grouped layout for record inspection\n\nRenderers rely on the field definitions (`dataPath`, `format`) to extract values and render them consistently.\n\n## CLI Scaffolding\n\n```bash\n# Interactive wizard\ncontractspec create --type data-view\n\n# Generates packages/.../data-views/<name>.data-view.ts\n\n# Optional renderer scaffold\ncontractspec build path/to/<name>.data-view.ts\n# → produces <name>.renderer.tsx that wraps DataViewRenderer with sensible props\n```\n\nWizard prompts:\n- name (dot notation), version, entity\n- kind (`list`, `table`, `detail`, `grid`)\n- primary query operation (required) and optional item query\n- fields (label, data path, format, sorting/filtering)\n\n## Authoring Guidelines\n\n1. **Separation of data & presentation**: keep fetching logic inside contract operations; DataViewSpec only references them via `source`.\n2. **Versioning**: bump `meta.version` when field membership, ordering, or semantics change.\n3. **Consistency**: reuse common field keys across modules to enable shared renderers and filters.\n4. **States**: reference `PresentationRef` for empty/error/loader states to ensure consistent UX.\n5. **Actions**: prefer referencing contract operations instead of embedding business logic in the UI.\n\n## Roadmap\n\n- Derived filters from `fields.filterable` (auto-generated UI).\n- Table density presets per platform.\n- Bridge to PolicySpec for field-level visibility (Phase 2 policy expansion).\n- Automated docs/LLM sync via CLI.\n\n"}];e(t);export{t as tech_contracts_data_views_DocBlocks};
@@ -1,2 +1 @@
1
- var e=class{constructor(e){this.spec=e}generate(e){let{primary:t}=this.spec.source,n=e.pagination?.page??1,r=e.pagination?.pageSize??20,i=(n-1)*r,a=r,o={skip:i,take:a,...e.filters};return e.search&&(o.search=e.search),e.sort&&(o.orderBy={[e.sort.field]:e.sort.direction}),{operationName:t.name,input:o,meta:{pagination:{page:n,pageSize:r,skip:i,take:a},sorting:e.sort}}}validateParams(e){let t=[];if(e.filters&&this.spec.view.filters)for(let n of Object.keys(e.filters))this.spec.view.filters.find(e=>e.key===n)||t.push(`Unknown filter key: ${n}`);if(e.sort){let n=this.spec.view.fields.find(t=>t.key===e.sort.field);n?n.sortable===!1&&t.push(`Field is not sortable: ${e.sort.field}`):t.push(`Unknown sort field: ${e.sort.field}`)}return t}};export{e as DataViewQueryGenerator};
2
- //# sourceMappingURL=query-generator.js.map
1
+ var e=class{constructor(e){this.spec=e}generate(e){let{primary:t}=this.spec.source,n=e.pagination?.page??1,r=e.pagination?.pageSize??20,i=(n-1)*r,a=r,o={skip:i,take:a,...e.filters};return e.search&&(o.search=e.search),e.sort&&(o.orderBy={[e.sort.field]:e.sort.direction}),{operationName:t.name,input:o,meta:{pagination:{page:n,pageSize:r,skip:i,take:a},sorting:e.sort}}}validateParams(e){let t=[];if(e.filters&&this.spec.view.filters)for(let n of Object.keys(e.filters))this.spec.view.filters.find(e=>e.key===n)||t.push(`Unknown filter key: ${n}`);if(e.sort){let n=this.spec.view.fields.find(t=>t.key===e.sort.field);n?n.sortable===!1&&t.push(`Field is not sortable: ${e.sort.field}`):t.push(`Unknown sort field: ${e.sort.field}`)}return t}};export{e as DataViewQueryGenerator};
@@ -1,2 +1 @@
1
- var e=class{cache=new Map;subscriptions=new Map;constructor(e){this.config=e}register(e){this.config.registry.register(e)}getSpec(e,t){return this.config.registry.get(e,t)}async executeQuery(e,t){if(!this.getSpec(e))throw Error(`DataView spec not found: ${e}`);return{data:[],total:0,loading:!1}}invalidate(e){this.cache.delete(e),this.notifySubscribers(e)}subscribe(e,t){return this.subscriptions.has(e)||this.subscriptions.set(e,new Set),this.subscriptions.get(e).add(t),()=>{this.subscriptions.get(e)?.delete(t)}}notifySubscribers(e){this.subscriptions.get(e)?.forEach(e=>e())}};export{e as DataViewRuntime};
2
- //# sourceMappingURL=runtime.js.map
1
+ var e=class{cache=new Map;subscriptions=new Map;constructor(e){this.config=e}register(e){this.config.registry.register(e)}getSpec(e,t){return this.config.registry.get(e,t)}async executeQuery(e,t){if(!this.getSpec(e))throw Error(`DataView spec not found: ${e}`);return{data:[],total:0,loading:!1}}invalidate(e){this.cache.delete(e),this.notifySubscribers(e)}subscribe(e,t){return this.subscriptions.has(e)||this.subscriptions.set(e,new Set),this.subscriptions.get(e).add(t),()=>{this.subscriptions.get(e)?.delete(t)}}notifySubscribers(e){this.subscriptions.get(e)?.forEach(e=>e())}};export{e as DataViewRuntime};