@lssm/lib.contracts 1.11.1 → 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 (457) 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 -1
  5. package/dist/app-config/docs/app-config.docblock.js +220 -0
  6. package/dist/app-config/events.js +1 -1
  7. package/dist/app-config/index.js +1 -1
  8. package/dist/app-config/lifecycle-contracts.js +1 -1
  9. package/dist/capabilities/docs/capabilities.docblock.js +1 -0
  10. package/dist/contract-registry/index.js +1 -0
  11. package/dist/contract-registry/schemas.js +1 -0
  12. package/dist/contract-registry/types.js +0 -0
  13. package/dist/data-views/docs/data-views.docblock.js +1 -0
  14. package/dist/docs/PUBLISHING.docblock.js +76 -0
  15. package/dist/docs/accessibility_wcag_compliance_specs.docblock.js +350 -0
  16. package/dist/docs/index.js +1 -0
  17. package/dist/docs/meta.docs.js +13 -0
  18. package/dist/docs/presentations.js +1 -0
  19. package/dist/docs/registry.js +1 -0
  20. package/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +383 -0
  21. package/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +68 -0
  22. package/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +140 -0
  23. package/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +86 -0
  24. package/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +1 -0
  25. package/dist/docs/tech/auth/better-auth-nextjs.docblock.js +58 -0
  26. package/dist/docs/tech/contracts/README.docblock.js +1 -0
  27. package/dist/docs/tech/contracts/create-subscription.docblock.js +1 -0
  28. package/dist/docs/tech/contracts/graphql-typed-outputs.docblock.js +180 -0
  29. package/dist/docs/tech/contracts/migrations.docblock.js +1 -0
  30. package/dist/docs/tech/contracts/openapi-export.docblock.js +38 -0
  31. package/dist/docs/tech/contracts/ops-to-presentation-linking.docblock.js +62 -0
  32. package/dist/docs/tech/contracts/overlays.docblock.js +68 -0
  33. package/dist/docs/tech/contracts/tests.docblock.js +132 -0
  34. package/dist/docs/tech/contracts/themes.docblock.js +1 -0
  35. package/dist/docs/tech/contracts/vertical-pocket-family-office.docblock.js +106 -0
  36. package/dist/docs/tech/lifecycle-stage-system.docblock.js +213 -0
  37. package/dist/docs/tech/llm/llm-integration.docblock.js +289 -0
  38. package/dist/docs/tech/mcp-endpoints.docblock.js +1 -0
  39. package/dist/docs/tech/presentation-runtime.docblock.js +1 -0
  40. package/dist/docs/tech/schema/README.docblock.js +262 -0
  41. package/dist/docs/tech/studio/learning-events.docblock.js +1 -0
  42. package/dist/docs/tech/studio/learning-journeys.docblock.js +57 -0
  43. package/dist/docs/tech/studio/platform-admin-panel.docblock.js +63 -0
  44. package/dist/docs/tech/studio/project-access-teams.docblock.js +36 -0
  45. package/dist/docs/tech/studio/project-routing.docblock.js +1 -0
  46. package/dist/docs/tech/studio/sandbox-unlogged.docblock.js +20 -0
  47. package/dist/docs/tech/studio/team-invitations.docblock.js +65 -0
  48. package/dist/docs/tech/studio/workspace-ops.docblock.js +1 -0
  49. package/dist/docs/tech/studio/workspaces.docblock.js +41 -0
  50. package/dist/docs/tech/telemetry-ingest.docblock.js +122 -0
  51. package/dist/docs/tech/templates/runtime.docblock.js +1 -0
  52. package/dist/docs/tech/vscode-extension.docblock.js +68 -0
  53. package/dist/docs/tech/workflows/overview.docblock.js +1 -0
  54. package/dist/docs/tech-contracts.docs.js +76 -0
  55. package/dist/docs/types.js +0 -0
  56. package/dist/events.js +1 -1
  57. package/dist/experiments/docs/experiments.docblock.js +128 -0
  58. package/dist/forms/docs/forms.docblock.js +1 -0
  59. package/dist/index.js +1 -1
  60. package/dist/install.js +1 -1
  61. package/dist/integrations/contracts.js +1 -1
  62. package/dist/integrations/docs/integrations.docblock.js +1 -0
  63. package/dist/integrations/index.js +1 -1
  64. package/dist/integrations/openbanking/contracts/accounts.js +1 -1
  65. package/dist/integrations/openbanking/contracts/balances.js +1 -1
  66. package/dist/integrations/openbanking/contracts/index.js +1 -1
  67. package/dist/integrations/openbanking/contracts/transactions.js +1 -1
  68. package/dist/integrations/openbanking/models.js +1 -1
  69. package/dist/integrations/openbanking/openbanking.feature.js +1 -0
  70. package/dist/integrations/providers/impls/index.js +1 -1
  71. package/dist/integrations/providers/impls/provider-factory.js +1 -1
  72. package/dist/integrations/providers/index.js +1 -1
  73. package/dist/integrations/providers/registry.js +1 -0
  74. package/dist/integrations/secrets/aws-secret-manager.js +1 -0
  75. package/dist/integrations/secrets/gcp-secret-manager.js +1 -1
  76. package/dist/integrations/secrets/index.js +1 -1
  77. package/dist/integrations/secrets/scaleway-secret-manager.js +1 -0
  78. package/dist/jobs/define-job.js +1 -0
  79. package/dist/jobs/gcp-cloud-tasks.js +1 -1
  80. package/dist/jobs/gcp-pubsub.js +1 -1
  81. package/dist/jobs/handlers/index.js +1 -1
  82. package/dist/jobs/handlers/ping-handler.js +1 -0
  83. package/dist/jobs/index.js +1 -1
  84. package/dist/jobs/memory-queue.js +1 -1
  85. package/dist/jobs/queue.js +1 -0
  86. package/dist/jobs/scaleway-sqs-queue.js +1 -0
  87. package/dist/knowledge/contracts.js +1 -1
  88. package/dist/knowledge/docs/knowledge.docblock.js +138 -0
  89. package/dist/llm/exporters.js +8 -0
  90. package/dist/llm/index.js +1 -0
  91. package/dist/llm/prompts.js +220 -0
  92. package/dist/llm/types.js +0 -0
  93. package/dist/node_modules/@pothos/plugin-complexity/esm/calculate-complexity.js +1 -0
  94. package/dist/node_modules/@pothos/plugin-complexity/esm/defaults.js +1 -0
  95. package/dist/node_modules/@pothos/plugin-complexity/esm/index.js +1 -0
  96. package/dist/node_modules/@pothos/plugin-complexity/esm/types.js +1 -0
  97. package/dist/node_modules/@pothos/plugin-complexity/esm/util.js +1 -0
  98. package/dist/node_modules/@pothos/plugin-complexity/esm/validator.js +1 -0
  99. package/dist/node_modules/@pothos/plugin-dataloader/esm/field-builder.js +1 -0
  100. package/dist/node_modules/@pothos/plugin-dataloader/esm/index.js +1 -0
  101. package/dist/node_modules/@pothos/plugin-dataloader/esm/refs/index.js +1 -0
  102. package/dist/node_modules/@pothos/plugin-dataloader/esm/refs/interface.js +1 -0
  103. package/dist/node_modules/@pothos/plugin-dataloader/esm/refs/node.js +1 -0
  104. package/dist/node_modules/@pothos/plugin-dataloader/esm/refs/object.js +1 -0
  105. package/dist/node_modules/@pothos/plugin-dataloader/esm/refs/union.js +1 -0
  106. package/dist/node_modules/@pothos/plugin-dataloader/esm/schema-builder.js +1 -0
  107. package/dist/node_modules/@pothos/plugin-dataloader/esm/util.js +1 -0
  108. package/dist/node_modules/@pothos/plugin-prisma/esm/connection-helpers.js +1 -0
  109. package/dist/node_modules/@pothos/plugin-prisma/esm/field-builder.js +1 -0
  110. package/dist/node_modules/@pothos/plugin-prisma/esm/index.js +1 -0
  111. package/dist/node_modules/@pothos/plugin-prisma/esm/interface-ref.js +1 -0
  112. package/dist/node_modules/@pothos/plugin-prisma/esm/model-loader.js +1 -0
  113. package/dist/node_modules/@pothos/plugin-prisma/esm/node-ref.js +1 -0
  114. package/dist/node_modules/@pothos/plugin-prisma/esm/object-ref.js +1 -0
  115. package/dist/node_modules/@pothos/plugin-prisma/esm/prisma-field-builder.js +1 -0
  116. package/dist/node_modules/@pothos/plugin-prisma/esm/schema-builder.js +1 -0
  117. package/dist/node_modules/@pothos/plugin-prisma/esm/types.js +0 -0
  118. package/dist/node_modules/@pothos/plugin-prisma/esm/util/cursors.js +1 -0
  119. package/dist/node_modules/@pothos/plugin-prisma/esm/util/datamodel.js +1 -0
  120. package/dist/node_modules/@pothos/plugin-prisma/esm/util/deep-equal.js +1 -0
  121. package/dist/node_modules/@pothos/plugin-prisma/esm/util/description.js +1 -0
  122. package/dist/node_modules/@pothos/plugin-prisma/esm/util/get-client.js +1 -0
  123. package/dist/node_modules/@pothos/plugin-prisma/esm/util/loader-map.js +1 -0
  124. package/dist/node_modules/@pothos/plugin-prisma/esm/util/map-query.js +1 -0
  125. package/dist/node_modules/@pothos/plugin-prisma/esm/util/relation-map.js +1 -0
  126. package/dist/node_modules/@pothos/plugin-prisma/esm/util/selections.js +1 -0
  127. package/dist/node_modules/@pothos/plugin-prisma/esm/util/usage.js +1 -0
  128. package/dist/node_modules/@pothos/plugin-tracing/esm/index.js +1 -0
  129. package/dist/node_modules/@pothos/plugin-tracing/esm/util.js +1 -0
  130. package/dist/node_modules/dataloader/index.js +7 -0
  131. package/dist/node_modules/graphql/error/GraphQLError.js +5 -0
  132. package/dist/node_modules/graphql/error/index.js +1 -0
  133. package/dist/node_modules/graphql/error/locatedError.js +1 -0
  134. package/dist/node_modules/graphql/error/syntaxError.js +1 -0
  135. package/dist/node_modules/graphql/execution/collectFields.js +1 -0
  136. package/dist/node_modules/graphql/execution/execute.js +1 -0
  137. package/dist/node_modules/graphql/execution/index.js +1 -0
  138. package/dist/node_modules/graphql/execution/mapAsyncIterator.js +1 -0
  139. package/dist/node_modules/graphql/execution/subscribe.js +1 -0
  140. package/dist/node_modules/graphql/execution/values.js +1 -0
  141. package/dist/node_modules/graphql/graphql.js +1 -0
  142. package/dist/node_modules/graphql/index.js +1 -0
  143. package/dist/node_modules/graphql/jsutils/Path.js +1 -0
  144. package/dist/node_modules/graphql/jsutils/devAssert.js +1 -0
  145. package/dist/node_modules/graphql/jsutils/didYouMean.js +1 -0
  146. package/dist/node_modules/graphql/jsutils/groupBy.js +1 -0
  147. package/dist/node_modules/graphql/jsutils/identityFunc.js +1 -0
  148. package/dist/node_modules/graphql/jsutils/inspect.js +1 -0
  149. package/dist/node_modules/graphql/jsutils/instanceOf.js +12 -0
  150. package/dist/node_modules/graphql/jsutils/invariant.js +1 -0
  151. package/dist/node_modules/graphql/jsutils/isAsyncIterable.js +1 -0
  152. package/dist/node_modules/graphql/jsutils/isIterableObject.js +1 -0
  153. package/dist/node_modules/graphql/jsutils/isObjectLike.js +1 -0
  154. package/dist/node_modules/graphql/jsutils/isPromise.js +1 -0
  155. package/dist/node_modules/graphql/jsutils/keyMap.js +1 -0
  156. package/dist/node_modules/graphql/jsutils/keyValMap.js +1 -0
  157. package/dist/node_modules/graphql/jsutils/mapValue.js +1 -0
  158. package/dist/node_modules/graphql/jsutils/memoize3.js +1 -0
  159. package/dist/node_modules/graphql/jsutils/naturalCompare.js +1 -0
  160. package/dist/node_modules/graphql/jsutils/printPathArray.js +1 -0
  161. package/dist/node_modules/graphql/jsutils/promiseForObject.js +1 -0
  162. package/dist/node_modules/graphql/jsutils/promiseReduce.js +1 -0
  163. package/dist/node_modules/graphql/jsutils/suggestionList.js +1 -0
  164. package/dist/node_modules/graphql/jsutils/toError.js +1 -0
  165. package/dist/node_modules/graphql/jsutils/toObjMap.js +1 -0
  166. package/dist/node_modules/graphql/language/ast.js +1 -0
  167. package/dist/node_modules/graphql/language/blockString.js +3 -0
  168. package/dist/node_modules/graphql/language/characterClasses.js +1 -0
  169. package/dist/node_modules/graphql/language/directiveLocation.js +1 -0
  170. package/dist/node_modules/graphql/language/index.js +1 -0
  171. package/dist/node_modules/graphql/language/kinds.js +1 -0
  172. package/dist/node_modules/graphql/language/lexer.js +3 -0
  173. package/dist/node_modules/graphql/language/location.js +1 -0
  174. package/dist/node_modules/graphql/language/parser.js +1 -0
  175. package/dist/node_modules/graphql/language/predicates.js +1 -0
  176. package/dist/node_modules/graphql/language/printLocation.js +2 -0
  177. package/dist/node_modules/graphql/language/printString.js +1 -0
  178. package/dist/node_modules/graphql/language/printer.js +34 -0
  179. package/dist/node_modules/graphql/language/schemaCoordinateLexer.js +1 -0
  180. package/dist/node_modules/graphql/language/source.js +1 -0
  181. package/dist/node_modules/graphql/language/tokenKind.js +1 -0
  182. package/dist/node_modules/graphql/language/visitor.js +1 -0
  183. package/dist/node_modules/graphql/type/assertName.js +1 -0
  184. package/dist/node_modules/graphql/type/definition.js +1 -0
  185. package/dist/node_modules/graphql/type/directives.js +1 -0
  186. package/dist/node_modules/graphql/type/index.js +1 -0
  187. package/dist/node_modules/graphql/type/introspection.js +3 -0
  188. package/dist/node_modules/graphql/type/scalars.js +1 -0
  189. package/dist/node_modules/graphql/type/schema.js +1 -0
  190. package/dist/node_modules/graphql/type/validate.js +3 -0
  191. package/dist/node_modules/graphql/utilities/TypeInfo.js +1 -0
  192. package/dist/node_modules/graphql/utilities/assertValidName.js +1 -0
  193. package/dist/node_modules/graphql/utilities/astFromValue.js +1 -0
  194. package/dist/node_modules/graphql/utilities/buildASTSchema.js +1 -0
  195. package/dist/node_modules/graphql/utilities/buildClientSchema.js +1 -0
  196. package/dist/node_modules/graphql/utilities/coerceInputValue.js +1 -0
  197. package/dist/node_modules/graphql/utilities/concatAST.js +1 -0
  198. package/dist/node_modules/graphql/utilities/extendSchema.js +1 -0
  199. package/dist/node_modules/graphql/utilities/findBreakingChanges.js +1 -0
  200. package/dist/node_modules/graphql/utilities/getIntrospectionQuery.js +107 -0
  201. package/dist/node_modules/graphql/utilities/getOperationAST.js +1 -0
  202. package/dist/node_modules/graphql/utilities/getOperationRootType.js +1 -0
  203. package/dist/node_modules/graphql/utilities/index.js +1 -0
  204. package/dist/node_modules/graphql/utilities/introspectionFromSchema.js +1 -0
  205. package/dist/node_modules/graphql/utilities/lexicographicSortSchema.js +1 -0
  206. package/dist/node_modules/graphql/utilities/printSchema.js +13 -0
  207. package/dist/node_modules/graphql/utilities/resolveSchemaCoordinate.js +1 -0
  208. package/dist/node_modules/graphql/utilities/separateOperations.js +1 -0
  209. package/dist/node_modules/graphql/utilities/sortValueNode.js +1 -0
  210. package/dist/node_modules/graphql/utilities/stripIgnoredCharacters.js +1 -0
  211. package/dist/node_modules/graphql/utilities/typeComparators.js +1 -0
  212. package/dist/node_modules/graphql/utilities/typeFromAST.js +1 -0
  213. package/dist/node_modules/graphql/utilities/valueFromAST.js +1 -0
  214. package/dist/node_modules/graphql/utilities/valueFromASTUntyped.js +1 -0
  215. package/dist/node_modules/graphql/validation/ValidationContext.js +1 -0
  216. package/dist/node_modules/graphql/validation/index.js +1 -0
  217. package/dist/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.js +1 -0
  218. package/dist/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js +1 -0
  219. package/dist/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.js +1 -0
  220. package/dist/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js +1 -0
  221. package/dist/node_modules/graphql/validation/rules/KnownDirectivesRule.js +1 -0
  222. package/dist/node_modules/graphql/validation/rules/KnownFragmentNamesRule.js +1 -0
  223. package/dist/node_modules/graphql/validation/rules/KnownTypeNamesRule.js +1 -0
  224. package/dist/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.js +1 -0
  225. package/dist/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.js +1 -0
  226. package/dist/node_modules/graphql/validation/rules/MaxIntrospectionDepthRule.js +1 -0
  227. package/dist/node_modules/graphql/validation/rules/NoFragmentCyclesRule.js +1 -0
  228. package/dist/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.js +1 -0
  229. package/dist/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.js +1 -0
  230. package/dist/node_modules/graphql/validation/rules/NoUnusedVariablesRule.js +1 -0
  231. package/dist/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.js +1 -0
  232. package/dist/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.js +1 -0
  233. package/dist/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.js +1 -0
  234. package/dist/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.js +1 -0
  235. package/dist/node_modules/graphql/validation/rules/ScalarLeafsRule.js +1 -0
  236. package/dist/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.js +1 -0
  237. package/dist/node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.js +1 -0
  238. package/dist/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.js +1 -0
  239. package/dist/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.js +1 -0
  240. package/dist/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.js +1 -0
  241. package/dist/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js +1 -0
  242. package/dist/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js +1 -0
  243. package/dist/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.js +1 -0
  244. package/dist/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.js +1 -0
  245. package/dist/node_modules/graphql/validation/rules/UniqueOperationNamesRule.js +1 -0
  246. package/dist/node_modules/graphql/validation/rules/UniqueOperationTypesRule.js +1 -0
  247. package/dist/node_modules/graphql/validation/rules/UniqueTypeNamesRule.js +1 -0
  248. package/dist/node_modules/graphql/validation/rules/UniqueVariableNamesRule.js +1 -0
  249. package/dist/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.js +1 -0
  250. package/dist/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.js +1 -0
  251. package/dist/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.js +1 -0
  252. package/dist/node_modules/graphql/validation/rules/custom/NoDeprecatedCustomRule.js +1 -0
  253. package/dist/node_modules/graphql/validation/rules/custom/NoSchemaIntrospectionCustomRule.js +1 -0
  254. package/dist/node_modules/graphql/validation/specifiedRules.js +1 -0
  255. package/dist/node_modules/graphql/validation/validate.js +5 -0
  256. package/dist/node_modules/graphql/version.js +1 -0
  257. package/dist/onboarding-base.js +1 -1
  258. package/dist/openapi.js +1 -0
  259. package/dist/openbanking/docs/openbanking.docblock.js +109 -0
  260. package/dist/policy/docs/policy.docblock.js +1 -0
  261. package/dist/presentations/docs/presentations-conventions.docblock.js +8 -0
  262. package/dist/presentations.js +1 -1
  263. package/dist/presentations.v2.js +7 -1
  264. package/dist/prompt.js +1 -1
  265. package/dist/promptRegistry.js +1 -1
  266. package/dist/regenerator/docs/regenerator.docblock.js +184 -0
  267. package/dist/registry.js +1 -1
  268. package/dist/resources.js +1 -1
  269. package/dist/schema-to-markdown.js +10 -0
  270. package/dist/server/graphql-pothos.js +1 -1
  271. package/dist/server/index.js +1 -1
  272. package/dist/server/mcp/createMcpServer.js +1 -0
  273. package/dist/server/mcp/mcpTypes.js +0 -0
  274. package/dist/server/mcp/registerPresentations.js +1 -0
  275. package/dist/server/mcp/registerPrompts.js +3 -0
  276. package/dist/server/mcp/registerResources.js +1 -0
  277. package/dist/server/mcp/registerTools.js +1 -0
  278. package/dist/server/provider-mcp.js +1 -1
  279. package/dist/telemetry/docs/telemetry.docblock.js +139 -0
  280. package/package.json +353 -193
  281. package/dist/app-config/branding.d.ts +0 -55
  282. package/dist/app-config/contracts.d.ts +0 -244
  283. package/dist/app-config/events.d.ts +0 -122
  284. package/dist/app-config/index.d.ts +0 -8
  285. package/dist/app-config/lifecycle-contracts.d.ts +0 -382
  286. package/dist/app-config/lifecycle.d.ts +0 -27
  287. package/dist/app-config/runtime.d.ts +0 -114
  288. package/dist/app-config/spec.d.ts +0 -175
  289. package/dist/app-config/validation.d.ts +0 -47
  290. package/dist/capabilities/openbanking.d.ts +0 -9
  291. package/dist/capabilities.d.ts +0 -45
  292. package/dist/client/index.d.ts +0 -6
  293. package/dist/client/react/drivers/rn-reusables.d.ts +0 -22
  294. package/dist/client/react/drivers/shadcn.d.ts +0 -12
  295. package/dist/client/react/feature-render.d.ts +0 -20
  296. package/dist/client/react/form-render.d.ts +0 -91
  297. package/dist/client/react/index.d.ts +0 -5
  298. package/dist/contracts-adapter-hydration.d.ts +0 -15
  299. package/dist/contracts-adapter-input.d.ts +0 -10
  300. package/dist/data-views/query-generator.d.ts +0 -39
  301. package/dist/data-views/runtime.d.ts +0 -26
  302. package/dist/data-views.d.ts +0 -131
  303. package/dist/events.d.ts +0 -44
  304. package/dist/experiments/evaluator.d.ts +0 -37
  305. package/dist/experiments/spec-resolver.d.ts +0 -16
  306. package/dist/experiments/spec.d.ts +0 -89
  307. package/dist/features.d.ts +0 -87
  308. package/dist/forms.d.ts +0 -258
  309. package/dist/graphql-federation/dist/index.js +0 -1
  310. package/dist/index.d.ts +0 -130
  311. package/dist/install.d.ts +0 -76
  312. package/dist/integrations/binding.d.ts +0 -17
  313. package/dist/integrations/connection.d.ts +0 -51
  314. package/dist/integrations/contracts.d.ts +0 -435
  315. package/dist/integrations/health.d.ts +0 -21
  316. package/dist/integrations/index.d.ts +0 -53
  317. package/dist/integrations/openbanking/contracts/accounts.d.ts +0 -287
  318. package/dist/integrations/openbanking/contracts/balances.d.ts +0 -163
  319. package/dist/integrations/openbanking/contracts/index.d.ts +0 -9
  320. package/dist/integrations/openbanking/contracts/transactions.d.ts +0 -211
  321. package/dist/integrations/openbanking/guards.d.ts +0 -12
  322. package/dist/integrations/openbanking/models.d.ts +0 -228
  323. package/dist/integrations/openbanking/telemetry.d.ts +0 -15
  324. package/dist/integrations/providers/calendar.d.ts +0 -78
  325. package/dist/integrations/providers/elevenlabs.d.ts +0 -7
  326. package/dist/integrations/providers/email.d.ts +0 -86
  327. package/dist/integrations/providers/embedding.d.ts +0 -24
  328. package/dist/integrations/providers/gcs-storage.d.ts +0 -7
  329. package/dist/integrations/providers/gmail.d.ts +0 -7
  330. package/dist/integrations/providers/google-calendar.d.ts +0 -7
  331. package/dist/integrations/providers/impls/elevenlabs-voice.d.ts +0 -20
  332. package/dist/integrations/providers/impls/gcs-storage.d.ts +0 -24
  333. package/dist/integrations/providers/impls/gmail-inbound.d.ts +0 -26
  334. package/dist/integrations/providers/impls/gmail-outbound.d.ts +0 -18
  335. package/dist/integrations/providers/impls/google-calendar.d.ts +0 -23
  336. package/dist/integrations/providers/impls/index.d.ts +0 -15
  337. package/dist/integrations/providers/impls/mistral-embedding.d.ts +0 -23
  338. package/dist/integrations/providers/impls/mistral-llm.d.ts +0 -31
  339. package/dist/integrations/providers/impls/postmark-email.d.ts +0 -19
  340. package/dist/integrations/providers/impls/powens-client.d.ts +0 -124
  341. package/dist/integrations/providers/impls/powens-openbanking.d.ts +0 -27
  342. package/dist/integrations/providers/impls/provider-factory.d.ts +0 -26
  343. package/dist/integrations/providers/impls/qdrant-vector.d.ts +0 -24
  344. package/dist/integrations/providers/impls/stripe-payments.d.ts +0 -28
  345. package/dist/integrations/providers/impls/twilio-sms.d.ts +0 -20
  346. package/dist/integrations/providers/index.d.ts +0 -36
  347. package/dist/integrations/providers/llm.d.ts +0 -82
  348. package/dist/integrations/providers/mistral.d.ts +0 -7
  349. package/dist/integrations/providers/openbanking.d.ts +0 -128
  350. package/dist/integrations/providers/payments.d.ts +0 -109
  351. package/dist/integrations/providers/postmark.d.ts +0 -7
  352. package/dist/integrations/providers/powens.d.ts +0 -7
  353. package/dist/integrations/providers/qdrant.d.ts +0 -7
  354. package/dist/integrations/providers/sms.d.ts +0 -34
  355. package/dist/integrations/providers/storage.d.ts +0 -60
  356. package/dist/integrations/providers/stripe.d.ts +0 -7
  357. package/dist/integrations/providers/twilio-sms.d.ts +0 -7
  358. package/dist/integrations/providers/vector-store.d.ts +0 -43
  359. package/dist/integrations/providers/voice.d.ts +0 -34
  360. package/dist/integrations/runtime.d.ts +0 -99
  361. package/dist/integrations/secrets/env-secret-provider.d.ts +0 -31
  362. package/dist/integrations/secrets/gcp-secret-manager.d.ts +0 -32
  363. package/dist/integrations/secrets/index.d.ts +0 -5
  364. package/dist/integrations/secrets/manager.d.ts +0 -47
  365. package/dist/integrations/secrets/provider.d.ts +0 -52
  366. package/dist/integrations/spec.d.ts +0 -79
  367. package/dist/jobs/gcp-cloud-tasks.d.ts +0 -41
  368. package/dist/jobs/gcp-pubsub.d.ts +0 -25
  369. package/dist/jobs/handlers/gmail-sync-handler.d.ts +0 -9
  370. package/dist/jobs/handlers/index.d.ts +0 -3
  371. package/dist/jobs/handlers/storage-document-handler.d.ts +0 -12
  372. package/dist/jobs/index.d.ts +0 -7
  373. package/dist/jobs/memory-queue.d.ts +0 -18
  374. package/dist/jobs/queue.d.ts +0 -26
  375. package/dist/jsonschema.d.ts +0 -26
  376. package/dist/knowledge/binding.d.ts +0 -25
  377. package/dist/knowledge/contracts.d.ts +0 -316
  378. package/dist/knowledge/index.d.ts +0 -10
  379. package/dist/knowledge/ingestion/document-processor.d.ts +0 -24
  380. package/dist/knowledge/ingestion/embedding-service.d.ts +0 -12
  381. package/dist/knowledge/ingestion/gmail-adapter.d.ts +0 -18
  382. package/dist/knowledge/ingestion/index.d.ts +0 -6
  383. package/dist/knowledge/ingestion/storage-adapter.d.ts +0 -15
  384. package/dist/knowledge/ingestion/vector-indexer.d.ts +0 -18
  385. package/dist/knowledge/query/index.d.ts +0 -2
  386. package/dist/knowledge/query/service.d.ts +0 -29
  387. package/dist/knowledge/runtime.d.ts +0 -32
  388. package/dist/knowledge/source.d.ts +0 -32
  389. package/dist/knowledge/spaces/email-threads.d.ts +0 -7
  390. package/dist/knowledge/spaces/financial-docs.d.ts +0 -7
  391. package/dist/knowledge/spaces/financial-overview.d.ts +0 -7
  392. package/dist/knowledge/spaces/index.d.ts +0 -7
  393. package/dist/knowledge/spaces/product-canon.d.ts +0 -7
  394. package/dist/knowledge/spaces/support-faq.d.ts +0 -7
  395. package/dist/knowledge/spaces/uploaded-docs.d.ts +0 -7
  396. package/dist/knowledge/spec.d.ts +0 -52
  397. package/dist/markdown.d.ts +0 -21
  398. package/dist/migrations.d.ts +0 -52
  399. package/dist/onboarding-base.d.ts +0 -137
  400. package/dist/ownership.d.ts +0 -75
  401. package/dist/policy/engine.d.ts +0 -39
  402. package/dist/policy/opa-adapter.d.ts +0 -45
  403. package/dist/policy/spec.d.ts +0 -114
  404. package/dist/presentations.backcompat.d.ts +0 -7
  405. package/dist/presentations.d.ts +0 -96
  406. package/dist/presentations.v2.d.ts +0 -95
  407. package/dist/prompt.d.ts +0 -60
  408. package/dist/promptRegistry.d.ts +0 -15
  409. package/dist/regenerator/adapters.d.ts +0 -19
  410. package/dist/regenerator/executor.d.ts +0 -70
  411. package/dist/regenerator/index.d.ts +0 -7
  412. package/dist/regenerator/service.d.ts +0 -33
  413. package/dist/regenerator/sinks.d.ts +0 -26
  414. package/dist/regenerator/types.d.ts +0 -107
  415. package/dist/regenerator/utils.d.ts +0 -9
  416. package/dist/registry.d.ts +0 -72
  417. package/dist/resources.d.ts +0 -64
  418. package/dist/schema/dist/EnumType.js +0 -1
  419. package/dist/schema/dist/FieldType.js +0 -1
  420. package/dist/schema/dist/ScalarTypeEnum.js +0 -1
  421. package/dist/schema/dist/SchemaModel.js +0 -1
  422. package/dist/schema/dist/index.js +0 -1
  423. package/dist/server/graphql-pothos.d.ts +0 -31
  424. package/dist/server/graphql-schema-export.d.ts +0 -6
  425. package/dist/server/graphql-schema-export.js +0 -1
  426. package/dist/server/index.d.ts +0 -9
  427. package/dist/server/provider-mcp.d.ts +0 -51
  428. package/dist/server/rest-elysia.d.ts +0 -40
  429. package/dist/server/rest-express.d.ts +0 -16
  430. package/dist/server/rest-generic.d.ts +0 -32
  431. package/dist/server/rest-next-app.d.ts +0 -35
  432. package/dist/server/rest-next-mcp.d.ts +0 -11
  433. package/dist/server/rest-next-pages.d.ts +0 -9
  434. package/dist/spec.d.ts +0 -171
  435. package/dist/telemetry/anomaly.d.ts +0 -27
  436. package/dist/telemetry/index.d.ts +0 -4
  437. package/dist/telemetry/spec.d.ts +0 -98
  438. package/dist/telemetry/tracker.d.ts +0 -51
  439. package/dist/tests/index.d.ts +0 -3
  440. package/dist/tests/runner.d.ts +0 -43
  441. package/dist/tests/spec.d.ts +0 -89
  442. package/dist/themes.d.ts +0 -55
  443. package/dist/translations/catalog.d.ts +0 -28
  444. package/dist/translations/tenant.d.ts +0 -15
  445. package/dist/types/all.d.ts +0 -60
  446. package/dist/types.d.ts +0 -88
  447. package/dist/workflow/adapters/db-adapter.d.ts +0 -34
  448. package/dist/workflow/adapters/file-adapter.d.ts +0 -14
  449. package/dist/workflow/adapters/index.d.ts +0 -4
  450. package/dist/workflow/adapters/memory-store.d.ts +0 -18
  451. package/dist/workflow/expression.d.ts +0 -9
  452. package/dist/workflow/index.d.ts +0 -10
  453. package/dist/workflow/runner.d.ts +0 -74
  454. package/dist/workflow/sla-monitor.d.ts +0 -20
  455. package/dist/workflow/spec.d.ts +0 -99
  456. package/dist/workflow/state.d.ts +0 -35
  457. package/dist/workflow/validation.d.ts +0 -28
@@ -1 +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}from"./ownership.js";const o=new t({name:`SaveOnboardingDraftInput`,description:`Input for saving onboarding draft`,fields:{data:{type:e.JSON(),isOptional:!1}}}),s=new t({name:`SaveOnboardingDraftOutput`,description:`Output for saving onboarding draft`,fields:{id:{type:e.ID(),isOptional:!1},organizationId:{type:e.ID(),isOptional:!1}}}),c=n({meta:{name:`base.onboarding.saveDraft`,version:1,stability:a.Beta,owners:[i.PlatformSigil],tags:[`onboarding`,`draft`],description:`Save or update onboarding draft for active organization`,goal:`Persist onboarding progress incrementally for resumption and safety`,context:`Auto-saves every few seconds during onboarding; enables users to leave and resume`},io:{input:o,output:s},policy:{auth:`user`,escalate:null},transport:{gql:{field:`saveOnboardingDraft`},rest:{method:`POST`}}}),l=new t({name:`GetOnboardingDraftOutput`,description:`Onboarding draft payload`,fields:{id:{type:e.ID(),isOptional:!0},organizationId:{type:e.ID(),isOptional:!0},data:{type:e.JSON(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!0},updatedAt:{type:e.DateTime(),isOptional:!0}}}),u=r({meta:{name:`base.onboarding.getDraft`,version:1,stability:a.Beta,owners:[i.PlatformSigil],tags:[`onboarding`,`draft`],description:`Get onboarding draft for active organization`,goal:`Retrieve saved onboarding progress`,context:`Called on mount to restore in-progress onboarding`},io:{input:null,output:l},policy:{auth:`user`,escalate:null},transport:{gql:{field:`getOnboardingDraft`},rest:{method:`GET`}}}),d=new t({name:`DeleteOnboardingDraftOutput`,description:`Result of delete operation`,fields:{ok:{type:e.Boolean(),isOptional:!1}}}),f=n({meta:{name:`base.onboarding.deleteDraft`,version:1,stability:a.Beta,owners:[i.PlatformSigil],tags:[`onboarding`,`draft`],description:`Delete onboarding draft for active organization`,goal:`Clear draft after completion or if user wants to restart`,context:`Called after successful onboarding or explicit user reset`},io:{input:null,output:d},policy:{auth:`user`,escalate:null},transport:{gql:{field:`deleteOnboardingDraft`},rest:{method:`POST`}}}),p=new t({name:`CompleteOnboardingBaseInput`,description:`Input for completing onboarding`,fields:{data:{type:e.JSON(),isOptional:!1}}}),m=new t({name:`CompleteOnboardingBaseOutput`,description:`Result of onboarding completion`,fields:{success:{type:e.Boolean(),isOptional:!1},userId:{type:e.ID(),isOptional:!0},organizationId:{type:e.ID(),isOptional:!0}}}),h=n({meta:{name:`base.onboarding.complete`,version:1,stability:a.Beta,owners:[i.PlatformSigil],tags:[`onboarding`],description:`Complete onboarding and finalize user/organization setup`,goal:`Transition from draft to active profile`,context:`Validates all required fields, creates/updates entities, marks onboarding complete`},io:{input:p,output:m},policy:{auth:`user`,escalate:null},transport:{gql:{field:`completeOnboarding`},rest:{method:`POST`}}});export{p as CompleteOnboardingBaseInput,m as CompleteOnboardingBaseOutput,h as CompleteOnboardingBaseSpec,f as DeleteOnboardingDraftBaseSpec,d as DeleteOnboardingDraftOutput,u as GetOnboardingDraftBaseSpec,l as GetOnboardingDraftOutput,c as SaveOnboardingDraftBaseSpec,o as SaveOnboardingDraftInput,s as SaveOnboardingDraftOutput};
1
+ import{defineCommand as e,defineQuery as t}from"./spec.js";import{OwnersEnum as n,StabilityEnum as r}from"./ownership.js";import{ScalarTypeEnum as i,SchemaModel as a}from"@lssm/lib.schema";const o=new a({name:`SaveOnboardingDraftInput`,description:`Input for saving onboarding draft`,fields:{data:{type:i.JSON(),isOptional:!1}}}),s=new a({name:`SaveOnboardingDraftOutput`,description:`Output for saving onboarding draft`,fields:{id:{type:i.ID(),isOptional:!1},organizationId:{type:i.ID(),isOptional:!1}}}),c=e({meta:{name:`base.onboarding.saveDraft`,version:1,stability:r.Beta,owners:[n.PlatformSigil],tags:[`onboarding`,`draft`],description:`Save or update onboarding draft for active organization`,goal:`Persist onboarding progress incrementally for resumption and safety`,context:`Auto-saves every few seconds during onboarding; enables users to leave and resume`},io:{input:o,output:s},policy:{auth:`user`,escalate:null},transport:{gql:{field:`saveOnboardingDraft`},rest:{method:`POST`}}}),l=new a({name:`GetOnboardingDraftOutput`,description:`Onboarding draft payload`,fields:{id:{type:i.ID(),isOptional:!0},organizationId:{type:i.ID(),isOptional:!0},data:{type:i.JSON(),isOptional:!0},createdAt:{type:i.DateTime(),isOptional:!0},updatedAt:{type:i.DateTime(),isOptional:!0}}}),u=t({meta:{name:`base.onboarding.getDraft`,version:1,stability:r.Beta,owners:[n.PlatformSigil],tags:[`onboarding`,`draft`],description:`Get onboarding draft for active organization`,goal:`Retrieve saved onboarding progress`,context:`Called on mount to restore in-progress onboarding`},io:{input:null,output:l},policy:{auth:`user`,escalate:null},transport:{gql:{field:`getOnboardingDraft`},rest:{method:`GET`}}}),d=new a({name:`DeleteOnboardingDraftOutput`,description:`Result of delete operation`,fields:{ok:{type:i.Boolean(),isOptional:!1}}}),f=e({meta:{name:`base.onboarding.deleteDraft`,version:1,stability:r.Beta,owners:[n.PlatformSigil],tags:[`onboarding`,`draft`],description:`Delete onboarding draft for active organization`,goal:`Clear draft after completion or if user wants to restart`,context:`Called after successful onboarding or explicit user reset`},io:{input:null,output:d},policy:{auth:`user`,escalate:null},transport:{gql:{field:`deleteOnboardingDraft`},rest:{method:`POST`}}}),p=new a({name:`CompleteOnboardingBaseInput`,description:`Input for completing onboarding`,fields:{data:{type:i.JSON(),isOptional:!1}}}),m=new a({name:`CompleteOnboardingBaseOutput`,description:`Result of onboarding completion`,fields:{success:{type:i.Boolean(),isOptional:!1},userId:{type:i.ID(),isOptional:!0},organizationId:{type:i.ID(),isOptional:!0}}}),h=e({meta:{name:`base.onboarding.complete`,version:1,stability:r.Beta,owners:[n.PlatformSigil],tags:[`onboarding`],description:`Complete onboarding and finalize user/organization setup`,goal:`Transition from draft to active profile`,context:`Validates all required fields, creates/updates entities, marks onboarding complete`},io:{input:p,output:m},policy:{auth:`user`,escalate:null},transport:{gql:{field:`completeOnboarding`},rest:{method:`POST`}}});export{p as CompleteOnboardingBaseInput,m as CompleteOnboardingBaseOutput,h as CompleteOnboardingBaseSpec,f as DeleteOnboardingDraftBaseSpec,d as DeleteOnboardingDraftOutput,u as GetOnboardingDraftBaseSpec,l as GetOnboardingDraftOutput,c as SaveOnboardingDraftBaseSpec,o as SaveOnboardingDraftInput,s as SaveOnboardingDraftOutput};
@@ -0,0 +1 @@
1
+ import{defaultRestPath as e,jsonSchemaForSpec as t}from"./jsonschema.js";function n(e,t){return`${e.replace(/\./g,`_`)}_v${t}`}function r(e,t,r){return`${e}_${n(t,r)}`}function i(e,t){return(t??(e===`query`?`GET`:`POST`)).toLowerCase()}function a(t){let n=t.transport?.rest?.path??e(t.meta.name,t.meta.version);return n.startsWith(`/`)?n:`/${n}`}function o(e,o={}){let s=e.listSpecs().filter(e=>e.meta.kind===`command`||e.meta.kind===`query`).slice().sort((e,t)=>{let n=e.meta.name.localeCompare(t.meta.name);return n===0?e.meta.version-t.meta.version:n}),c={openapi:`3.1.0`,info:{title:o.title??`ContractSpec API`,version:o.version??`0.0.0`,...o.description?{description:o.description}:{}},...o.servers?{servers:o.servers}:{},paths:{},components:{schemas:{}}};for(let e of s){let o=t(e),s=i(e.meta.kind,e.transport?.rest?.method),l=a(e),u=n(e.meta.name,e.meta.version),d=c.paths[l]??={},f={operationId:u,summary:e.meta.description??e.meta.name,description:e.meta.description,tags:e.meta.tags??[],"x-contractspec":{name:e.meta.name,version:e.meta.version,kind:e.meta.kind},responses:{}};if(o.input){let t=r(`Input`,e.meta.name,e.meta.version);c.components.schemas[t]=o.input,f.requestBody={required:!0,content:{"application/json":{schema:{$ref:`#/components/schemas/${t}`}}}}}let p={};if(o.output){let t=r(`Output`,e.meta.name,e.meta.version);c.components.schemas[t]=o.output,p[200]={description:`OK`,content:{"application/json":{schema:{$ref:`#/components/schemas/${t}`}}}}}else p[200]={description:`OK`};f.responses=p,d[s]=f}return c}export{o as openApiForRegistry};
@@ -0,0 +1,109 @@
1
+ import{registerDocBlocks as e}from"../../docs/registry.js";import"../../registry.js";const t=[{id:`docs.tech.contracts.openbanking`,title:`Open Banking (Powens) Overview`,summary:`The Pocket Family Office vertical now supports read-only open banking capabilities powered by Powens. This doc summarises the contract surfaces, canonical data models, workflows, telemetry, and guardrails introduced to make Powens a first-class integration.`,kind:`reference`,visibility:`public`,route:`/docs/tech/contracts/openbanking`,tags:[`tech`,`contracts`,`openbanking`],body:`# Open Banking (Powens) Overview
2
+
3
+ The Pocket Family Office vertical now supports read-only open banking capabilities powered by Powens. This doc summarises the contract surfaces, canonical data models, workflows, telemetry, and guardrails introduced to make Powens a first-class integration.
4
+
5
+ ## Integration Spec
6
+
7
+ Powens is registered under \`openbanking.powens\` with category \`open-banking\` and currently supports the BYOK ownership mode. The spec exposes three read-only capabilities:
8
+
9
+ - \`openbanking.accounts.read\`
10
+ - \`openbanking.transactions.read\`
11
+ - \`openbanking.balances.read\`
12
+
13
+ Configuration and secrets are separated:
14
+
15
+ | Config Field | Description |
16
+ | --- | --- |
17
+ | \`environment\` | Powens environment (\`sandbox\` \\| \`production\`) |
18
+ | \`baseUrl?\` | Optional API base URL override |
19
+ | \`region?\` | Optional Powens region identifier |
20
+ | \`pollingIntervalMs?\` | Optional custom sync cadence |
21
+
22
+ | Secret Field | Description |
23
+ | --- | --- |
24
+ | \`clientId\` | Powens OAuth client identifier |
25
+ | \`clientSecret\` | Powens OAuth client secret |
26
+ | \`apiKey?\` | Optional supplemental Powens API key |
27
+ | \`webhookSecret?\` | Optional webhook signing secret |
28
+
29
+ ## Canonical Data Models
30
+
31
+ Canonical schemas live in \`@lssm/lib.contracts/integrations/openbanking/models\`:
32
+
33
+ - \`BankAccountRecord\` – account metadata (institution, IBAN/BIC, masked numbers, balances, sync timestamps)
34
+ - \`BankTransactionRecord\` – transaction ledger (amounts, categories, counterparty, status)
35
+ - \`AccountBalanceRecord\` – balance snapshots per account and balance type
36
+
37
+ These schemas power the vertical contracts and workflows, ensuring downstream features never use raw Powens payloads directly.
38
+
39
+ ## Provider Implementation
40
+
41
+ \`PowensOpenBankingProvider\` wraps \`PowensClient\` which handles OAuth token management, request retries, and error mapping. The provider maps Powens payloads to the canonical interfaces exported from \`integrations/providers/openbanking\`.
42
+
43
+ Factory support lives in \`IntegrationProviderFactory.createOpenBankingProvider\`, which validates configuration, loads BYOK secrets, and instantiates the provider.
44
+
45
+ ## Contracts
46
+
47
+ Command/query contracts exist under \`integrations/openbanking/contracts\`:
48
+
49
+ - \`openbanking.accounts.sync\` & \`openbanking.accounts.list\`
50
+ - \`openbanking.transactions.sync\` & \`openbanking.transactions.list\`
51
+ - \`openbanking.balances.refresh\` & \`openbanking.balances.get\`
52
+
53
+ The Pocket Family Office bundle also exposes \`pfo.openbanking.generate-overview\`, which aggregates balances and transactions into a derived knowledge document.
54
+
55
+ ## Workflows
56
+
57
+ New workflow specs (all requiring the \`primaryOpenBanking\` slot) orchestrate the sync flows:
58
+
59
+ - \`pfo.workflow.sync-openbanking-accounts\`
60
+ - \`pfo.workflow.sync-openbanking-transactions\`
61
+ - \`pfo.workflow.refresh-openbanking-balances\`
62
+ - \`pfo.workflow.generate-openbanking-overview\`
63
+
64
+ Each workflow runs against the Powens provider, persists canonical records, and emits telemetry.
65
+
66
+ ## Knowledge & LLM Exposure
67
+
68
+ Raw Powens payloads are never stored in knowledge spaces. Instead, \`knowledge.financial-overview\` captures derived summaries (cashflow, category breakdowns, balance trends) produced by \`pfo.openbanking.generate-overview\`. The space is \`operational\` category with 180-day retention and automation write access.
69
+
70
+ When exposing data to LLMs or analytics:
71
+
72
+ - Use derived summaries only.
73
+ - Redact PII fields using \`redactOpenBankingTelemetryPayload\`.
74
+ - Never emit IBANs, unmasked account numbers, or counterparty detail in telemetry/logs.
75
+
76
+ ## Telemetry
77
+
78
+ Telemetry constants live in \`integrations/openbanking/telemetry\`. Key events:
79
+
80
+ - \`openbanking.accounts.synced\`
81
+ - \`openbanking.transactions.synced\`
82
+ - \`openbanking.balances.refreshed\`
83
+ - \`openbanking.overview.generated\`
84
+
85
+ All events require tenant/app/blueprint/config metadata, and sensitive properties are flagged to avoid accidental leakage.
86
+
87
+ ## Guardrails
88
+
89
+ \`ensurePrimaryOpenBankingIntegration\` verifies \`primaryOpenBanking\` is bound and healthy before workflows proceed. Runtime pre-flight checks already block workflows when the connection is disconnected or in error status.
90
+
91
+ ## Blueprint & Tenant Defaults
92
+
93
+ \`pocketFamilyOfficeBlueprint\` now includes:
94
+
95
+ - \`primaryOpenBanking\` slot (required, BYOK)
96
+ - \`openbanking.*.read\` capabilities enabled by default
97
+ - Workflow bindings for the new sync flows
98
+
99
+ Sample tenant bindings (\`tenant.sample.ts\`) reference \`conn-powens-primary\` and bind the new knowledge space.
100
+
101
+ ---
102
+
103
+ Follow this doc when extending open banking support (e.g., adding payment initiation, additional providers, or expanded analytics) to keep the integration consistent and audited.
104
+
105
+
106
+
107
+
108
+
109
+ `}];e(t);export{t as tech_contracts_openbanking_DocBlocks};
@@ -0,0 +1 @@
1
+ import{registerDocBlocks as e}from"../../docs/registry.js";import"../../registry.js";const t=[{id:`docs.tech.contracts.policy`,title:`PolicySpec & PolicyEngine`,summary:"`PolicySpec` gives a declarative, typed home for access-control logic covering:",kind:`reference`,visibility:`public`,route:`/docs/tech/contracts/policy`,tags:[`tech`,`contracts`,`policy`],body:"# PolicySpec & PolicyEngine\n\n## Purpose\n\n`PolicySpec` gives a declarative, typed home for access-control logic covering:\n- **Who** can perform an action (ABAC/ReBAC style rules)\n- **What** they can access (resources + optional field-level overrides)\n- **When** special conditions apply (contextual expressions)\n- **How** PII should be handled (consent/retention hints)\n\n`PolicyEngine` evaluates one or more policies and returns an `allow`/`deny` decision, field-level outcomes, and PII metadata suitable for downstream enforcement (`SpecRegistry` → `ctx.decide`).\n\n## Location\n\n- Types & registry: `packages/libs/contracts/src/policy/spec.ts`\n- Runtime evaluation: `packages/libs/contracts/src/policy/engine.ts`\n- Tests: `packages/.../policy/engine.test.ts`\n\n## `PolicySpec`\n\n```ts\nexport interface PolicySpec {\n meta: PolicyMeta; // ownership metadata + { name, version, scope? }\n rules: PolicyRule[]; // allow/deny rules for actions\n fieldPolicies?: FieldPolicyRule[];\n pii?: { fields: string[]; consentRequired?: boolean; retentionDays?: number };\n relationships?: RelationshipDefinition[];\n consents?: ConsentDefinition[];\n rateLimits?: RateLimitDefinition[];\n opa?: { package: string; decision?: string };\n}\n```\n\n- `PolicyRule`\n - `effect`: `'allow' | 'deny'`\n - `actions`: e.g., `['read', 'write', 'delete']` (string namespace is flexible)\n - `subject`: `{ roles?: string[]; attributes?: { attr: matcher } }`\n - `resource`: `{ type: string; fields?: string[]; attributes?: {...} }`\n - `relationships`: `{ relation, objectId?, objectType? }[]` → ReBAC checks (use `objectId: '$resource'` to target the current resource)\n - `requiresConsent`: `['consent_id']` → references spec-level consent definitions\n - `flags`: feature flags that must be enabled (`DecisionContext.flags`)\n - `rateLimit`: string reference to `rateLimits` entry or inline object `{ rpm, key?, windowSeconds?, burst? }`\n - `escalate`: `'human_review' | null` to indicate manual approval\n - `conditions`: optional expression snippets evaluated against `{ subject, resource, context }`\n- `FieldPolicyRule`\n - `field`: dot-path string (e.g., `contact.email`)\n - `actions`: subset of `['read', 'write']`\n - Same `subject` / `resource` / `conditions` shape\n - Useful for redacting specific fields, even when the global action is allowed\n- `RelationshipDefinition`\n - Canonical tuples for relationship graph (`subjectType`, `relation`, `objectType`, `transitive?`)\n- `ConsentDefinition`\n - `{ id, scope, purpose, lawfulBasis?, expiresInDays?, required? }`\n- `RateLimitDefinition`\n - `{ id, rpm, key?, windowSeconds?, burst? }`\n- `PolicyRef`\n - `{ name: string; version: number }` → attach to contract specs / workflows\n\n## Registry\n\n```ts\nconst registry = new PolicyRegistry();\nregistry.register(CorePolicySpec);\nconst spec = registry.get('core.default', 1);\n```\n\nGuarantees uniqueness per `(name, version)` and exposes helpers to resolve highest versions.\n\n## Engine\n\n```ts\nconst engine = new PolicyEngine(policyRegistry);\n\nconst decision = engine.decide({\n action: 'read',\n subject: { roles: ['admin'] },\n resource: { type: 'resident', fields: ['contact.email'] },\n policies: [{ name: 'core.default', version: 1 }],\n});\n/*\n{\n effect: 'allow',\n reason: 'core.default',\n fieldDecisions: [{ field: 'contact.email', effect: 'allow' }],\n pii: { fields: ['contact.email'], consentRequired: true }\n}\n*/\n```\n\n- First matching **deny** wins; otherwise the first **allow** is returned.\n- Field policies are aggregated across referenced policies:\n - Later denies override earlier allows for a given field.\n - Returned as `fieldDecisions` to simplify downstream masking.\n- PII metadata is surfaced when defined to help adapt logging/telemetry.\n\n### Expression Support\n\nConditions accept small JS snippets (e.g., `subject.attributes.orgId === context.orgId`). The engine runs them in a constrained scope (`subject`, `resource`, `context`) without access to global state.\n\n### ReBAC & Relationships\n\n- Provide relationship tuples via `PolicySpec.relationships` for documentation/validation.\n- Reference them inside rules with `relationships: [{ relation: 'manager_of', objectType: 'resident', objectId: '$resource' }]`.\n- The execution context must populate `subject.relationships` (`[{ relation, object, objectType }]`) for the engine to evaluate ReBAC guards.\n\n### Consent & Rate Limits\n\n- Declare reusable consent definitions under `consents`. Rules list the IDs they require; if a user session lacks the consent (`DecisionContext.consents`), the engine returns `effect: 'deny'` with `reason: 'consent_required'` and enumerates missing consents.\n- Attach rate limits either inline or via `rateLimits` references. When a rule matches, the engine surfaces `{ rpm, key, windowSeconds?, burst? }` so callers can feed it to shared limiters.\n\n### OPA Adapter\n\n- `OPAPolicyAdapter` bridges engine decisions to Open Policy Agent (OPA). It forwards the evaluation context + policies to OPA and merges any override result (`effect`, `reason`, `fieldDecisions`, `requiredConsents`).\n- Use when migrating to OPA policies or running defense-in-depth: call `engine.decide()`, then pass the preliminary decision to `adapter.evaluate(...)`. The adapter marks merged decisions with `evaluatedBy: 'opa'`.\n- OPA inputs include meta, rules, relationships, rate limits, and consent catalogs to simplify policy authoring on the OPA side.\n\n## Contract Integration\n\n`ContractSpec.policy` now supports:\n\n```ts\npolicy: {\n auth: 'anonymous' | 'user' | 'admin';\n ...\n policies?: PolicyRef[]; // policies evaluated before execution\n fieldPolicies?: { // field hints (read/write) per policy\n field: string;\n actions: ('read' | 'write')[];\n policy?: PolicyRef;\n }[];\n}\n```\n\nAdapters can resolve refs through a shared `PolicyEngine` and populate `ctx.decide` so `SpecRegistry.execute` benefits from centralized enforcement.\n\n## Authoring Guidelines\n\n1. Prefer **allow-by-default** policies but explicitly deny sensitive flows (defense-in-depth).\n2. Keep rule scopes narrow (per feature/operation) and compose multiple `PolicyRef`s when necessary.\n3. Store PII field lists here to avoid duplication across logs/telemetry.\n4. Use explicit rule reasons for auditability and better developer feedback.\n5. Treat versioning seriously; bump `meta.version` whenever behavior changes.\n\n## Future Enhancements\n\n- Richer expression language (composable predicates, time-based conditions).\n- Multi-tenant relationship graph services (store/resolve relationships at scale).\n- Tooling that auto-generates docs/tests for policies referenced in specs.\n\n"}];e(t);export{t as tech_contracts_policy_DocBlocks};
@@ -0,0 +1,8 @@
1
+ import{registerDocBlocks as e}from"../../docs/registry.js";import"../../registry.js";const t=[{id:`docs.tech.contracts.presentations-conventions`,title:`Presentations Conventions (A11y & i18n)`,summary:"- Always provide `meta.description` (≥ 3 chars) — used by a11y/docs/agents.",kind:`reference`,visibility:`public`,route:`/docs/tech/contracts/presentations-conventions`,tags:[`tech`,`contracts`,`presentations-conventions`],body:`## Presentations Conventions (A11y & i18n)
2
+
3
+ - Always provide \`meta.description\` (≥ 3 chars) — used by a11y/docs/agents.
4
+ - Prefer source = BlockNote for rich guides; use component key for interactive flows.
5
+ - i18n strings belong in host apps; descriptors carry keys/defaults only.
6
+ - Target selection: include only what you intend to support to avoid drift.
7
+ - PII: declare JSON-like paths under \`policy.pii\`; engine redacts in outputs.
8
+ `}];e(t);export{t as tech_contracts_presentations_conventions_DocBlocks};
@@ -1 +1 @@
1
- import e from"zod";function t(e){return`${e.meta.name}.v${e.meta.version}`}var n=class{items=new Map;register(e){let n=t(e);if(this.items.has(n))throw Error(`Duplicate presentation ${n}`);return this.items.set(n,e),this}list(){return[...this.items.values()]}get(e,t){if(t!=null)return this.items.get(`${e}.v${t}`);let n,r=-1/0;for(let[t,i]of this.items.entries())t.startsWith(`${e}.v`)&&i.meta.version>r&&(r=i.meta.version,n=i);return n}};function r(t){let n={meta:{name:t.meta.name,version:t.meta.version,stability:t.meta.stability??`stable`,tags:t.meta.tags??[],description:t.meta.description??``},kind:t.content.kind};return t.content.kind===`web_component`?{...n,framework:t.content.framework,componentKey:t.content.componentKey,props:e.toJSONSchema(t.content.props.getZod())}:t.content.kind===`markdown`?{...n,content:t.content.content,resourceUri:t.content.resourceUri}:{...n,mimeType:t.content.mimeType,model:e.toJSONSchema(t.content.model.getZod())}}export{n as PresentationRegistry,r as jsonSchemaForPresentation};
1
+ import e from"zod";function t(e){return`${e.meta.name}.v${e.meta.version}`}var n=class{items=new Map;constructor(e){e&&e.forEach(e=>this.register(e))}register(e){let n=t(e);if(this.items.has(n))throw Error(`Duplicate presentation ${n}`);return this.items.set(n,e),this}list(){return[...this.items.values()]}get(e,t){if(t!=null)return this.items.get(`${e}.v${t}`);let n,r=-1/0;for(let[t,i]of this.items.entries())t.startsWith(`${e}.v`)&&i.meta.version>r&&(r=i.meta.version,n=i);return n}};function r(t){let n={meta:{name:t.meta.name,version:t.meta.version,stability:t.meta.stability??`stable`,tags:t.meta.tags??[],description:t.meta.description??``},kind:t.content.kind};return t.content.kind===`web_component`?{...n,framework:t.content.framework,componentKey:t.content.componentKey,props:e.toJSONSchema(t.content.props.getZod())}:t.content.kind===`markdown`?{...n,content:t.content.content,resourceUri:t.content.resourceUri}:{...n,mimeType:t.content.mimeType,model:e.toJSONSchema(t.content.model.getZod())}}export{n as PresentationRegistry,r as jsonSchemaForPresentation};
@@ -1 +1,7 @@
1
- var e=class{renderers=new Map;validators=[];register(e){let t=this.renderers.get(e.target)??[];return t.push(e),this.renderers.set(e.target,t),this}addValidator(e){return this.validators.push(e),this}async render(e,t,n){if(!t.targets.includes(e))throw Error(`Target ${e} not declared for ${t.meta.name}.v${t.meta.version}`);for(let r of this.validators)await r.validate(t,e,n);let r=this.renderers.get(e)??[];for(let e of r)try{return await e.render(t,n)}catch{}throw Error(`No renderer available for ${e}`)}};function t(){let t=new e,n=(e,t)=>{let n=JSON.parse(JSON.stringify(t)),r=e.policy?.pii??[],i=(e,t)=>{let n=t.replace(/^\//,``).replace(/\[(\d+)\]/g,`.$1`).split(`.`).filter(Boolean),r=e;for(let e=0;e<n.length-1;e++){let t=n[e];if(r&&typeof r==`object`&&t in r)r=r[t];else return}let i=n[n.length-1];r&&typeof r==`object`&&i&&i in r&&(r[i]=`[REDACTED]`)};for(let e of r)i(n,e);return n};return t.register({target:`markdown`,async render(e){if(e.source.type===`blocknotejs`){let t=n(e,{text:typeof e.source.docJson==`string`?e.source.docJson:JSON.stringify(e.source.docJson)});return{mimeType:`text/markdown`,body:String(t.text)}}if(e.source.type===`component`)return{mimeType:`text/markdown`,body:`${`# ${e.meta.name} v${e.meta.version}`}${e.meta.description?`\n\n${e.meta.description}`:``}${e.meta.tags&&e.meta.tags.length?`\n\nTags: ${e.meta.tags.join(`, `)}`:``}${e.meta.owners&&e.meta.owners.length?`\n\nOwners: ${e.meta.owners.join(`, `)}`:``}${`\n\nComponent: \`${e.source.componentKey}\``}${e.policy?.pii?.length?`\n\nRedacted paths: ${e.policy.pii.map(e=>`\`${e}\``).join(`, `)}`:``}`};throw Error(`unsupported`)}}),t.register({target:`application/json`,async render(e){let t=n(e,{meta:e.meta,source:e.source});return{mimeType:`application/json`,body:JSON.stringify(t,null,2)}}}),t.register({target:`application/xml`,async render(e){let t=n(e,{meta:e.meta,source:e.source});return{mimeType:`application/xml`,body:`<presentation name="${e.meta.name}" version="${e.meta.version}"><json>${encodeURIComponent(JSON.stringify(t))}</json></presentation>`}}}),t}function n(e){return e.register({target:`react`,async render(e){if(e.source.type===`component`){let t=e.source.props&&e.source.props.getZod().safeParse({}).success?{}:void 0;return{kind:`react_component`,componentKey:e.source.componentKey,props:t}}return{kind:`blocknotejs`,docJson:e.source.docJson,blockConfig:e.source.blockConfig}}}),e}function r(e){return e.addValidator({validate(e){if(!e.meta.description||e.meta.description.length<3)throw Error(`Presentation ${e.meta.name}.v${e.meta.version} missing meta.description`)}}),e}export{e as TransformEngine,t as createDefaultTransformEngine,r as registerBasicValidation,n as registerDefaultReactRenderer};
1
+ import{schemaToMarkdown as e}from"./schema-to-markdown.js";import t from"react";import n from"turndown";const r=new n;function i(e){let t=e.text??``;return!e.marks||e.marks.length===0?t:e.marks.reduce((e,t)=>{switch(t.type){case`bold`:return`**${e}**`;case`italic`:return`*${e}*`;case`underline`:return`__${e}__`;case`strike`:return`~~${e}~~`;case`code`:return`\`${e}\``;case`link`:{let n=t.attrs?.href??``;return n?`[${e}](${n})`:e}default:return e}},t)}function a(e){return e?.length?e.map(e=>s(e)).join(``):``}function o(e,t=!1){if(!e?.length)return``;let n=1;return e.map(e=>{let r=a(e.content??[]);return r?`${t?`${n++}. `:`- `}${r}`:``}).filter(Boolean).join(`
2
+ `)}function s(e){switch(e.type){case`doc`:return a(e.content);case`paragraph`:{let t=a(e.content);return t.trim().length?t:``}case`heading`:{let t=Math.min(Math.max(e.attrs?.level??1,1),6);return`${`#`.repeat(t)} ${a(e.content)}`.trim()}case`bullet_list`:return o(e.content,!1);case`ordered_list`:return o(e.content,!0);case`list_item`:return a(e.content);case`blockquote`:return a(e.content).split(`
3
+ `).map(e=>`> ${e}`).join(`
4
+ `);case`code_block`:{let t=a(e.content);return t?`\`\`\`\n${t}\n\`\`\``:``}case`horizontal_rule`:return`---`;case`hard_break`:return`
5
+ `;case`text`:return i(e);default:return e.text?i(e):``}}function c(e){if(typeof e==`string`)return e;if(e&&typeof e==`object`&&`html`in e){let t=String(e.html);return r.turndown(t)}let t=e;if(t?.type===`doc`||t?.content)return(t.content??[]).map(e=>s(e)).filter(Boolean).join(`
6
+
7
+ `).trim();try{return JSON.stringify(e,null,2)}catch{return String(e)}}var l=class{renderers=new Map;validators=[];register(e){let t=this.renderers.get(e.target)??[];return t.push(e),this.renderers.set(e.target,t),this}prependRegister(e){let t=this.renderers.get(e.target)??[];return t.unshift(e),this.renderers.set(e.target,t),this}addValidator(e){return this.validators.push(e),this}async render(e,t,n){if(!t.targets.includes(e))throw Error(`Target ${e} not declared for ${t.meta.name}.v${t.meta.version}`);for(let r of this.validators)await r.validate(t,e,n);let r=this.renderers.get(e)??[];for(let e of r)try{return await e.render(t,n)}catch{}throw Error(`No renderer available for ${e}`)}};function u(){let t=new l,n=(e,t)=>{let n=JSON.parse(JSON.stringify(t)),r=e.policy?.pii??[],i=(e,t)=>{let n=t.replace(/^\//,``).replace(/\[(\d+)\]/g,`.$1`).split(`.`).filter(Boolean),r=e;for(let e=0;e<n.length-1;e++){let t=n[e];if(r&&typeof r==`object`&&t in r)r=r[t];else return}let i=n[n.length-1];r&&typeof r==`object`&&i&&i in r&&(r[i]=`[REDACTED]`)};for(let e of r)i(n,e);return n};return t.register({target:`markdown`,async render(t,r){let i=r?.data;if(!i&&r?.fetchData&&(i=await r.fetchData()),t.source.type===`component`&&t.source.props&&i!==void 0){let n=Array.isArray(i),r=!n&&typeof i==`object`&&!!i&&!Object.values(i).some(e=>Array.isArray(e)||typeof e==`object`&&!!e);if(n||r)return{mimeType:`text/markdown`,body:e(t.source.props,i,{title:t.meta.description??t.meta.name,description:`${t.meta.name} v${t.meta.version}`})};throw Error(`Complex data structure for ${t.meta.name} - expecting custom renderer`)}if(t.source.type===`blocknotejs`){let e=n(t,{text:c(t.source.docJson)});return{mimeType:`text/markdown`,body:String(e.text)}}if(t.source.type===`component`&&i!==void 0)throw Error(`No schema (source.props) available for ${t.meta.name} - expecting custom renderer`);if(t.source.type===`component`)return{mimeType:`text/markdown`,body:`${`# ${t.meta.name} v${t.meta.version}`}${t.meta.description?`\n\n${t.meta.description}`:``}${t.meta.tags&&t.meta.tags.length?`\n\nTags: ${t.meta.tags.join(`, `)}`:``}${t.meta.owners&&t.meta.owners.length?`\n\nOwners: ${t.meta.owners.join(`, `)}`:``}${`\n\nComponent: \`${t.source.componentKey}\``}${t.policy?.pii?.length?`\n\nRedacted paths: ${t.policy.pii.map(e=>`\`${e}\``).join(`, `)}`:``}`};throw Error(`unsupported`)}}),t.register({target:`application/json`,async render(e){let t=n(e,{meta:e.meta,source:e.source});return{mimeType:`application/json`,body:JSON.stringify(t,null,2)}}}),t.register({target:`application/xml`,async render(e){let t=n(e,{meta:e.meta,source:e.source});return{mimeType:`application/xml`,body:`<presentation name="${e.meta.name}" version="${e.meta.version}"><json>${encodeURIComponent(JSON.stringify(t))}</json></presentation>`}}}),t}function d(e){return e.register({target:`react`,async render(e){if(e.source.type===`component`){let t=e.source.props&&e.source.props.getZod().safeParse({}).success?{}:void 0;return{kind:`react_component`,componentKey:e.source.componentKey,props:t}}return{kind:`blocknotejs`,docJson:e.source.docJson,blockConfig:e.source.blockConfig}}}),e}function f(e){return e.addValidator({validate(e){if(!e.meta.description||e.meta.description.length<3)throw Error(`Presentation ${e.meta.name}.v${e.meta.version} missing meta.description`)}}),e}function p(e,r){let i=new n({headingStyle:`atx`,codeBlockStyle:`fenced`,bulletListMarker:`-`});return i.addRule(`link`,{filter:`a`,replacement:(e,t)=>{let n=t.href;return n&&e?`[${e}](${n})`:e||``}}),e.prependRegister({target:`markdown`,async render(e,n){if(e.source.type!==`component`)throw Error(`React-to-markdown renderer only handles component presentations`);let{renderToStaticMarkup:a}=await import(`react-dom/server`),o=r[e.source.componentKey];if(!o)throw Error(`Component ${e.source.componentKey} not found in componentMap`);let s;try{s=a(t.createElement(o,e.source.props?{}:void 0))}catch(t){throw Error(`Failed to render component ${e.source.componentKey}: ${t instanceof Error?t.message:`Unknown error`}`)}let c;try{c=i.turndown(s)}catch(e){throw Error(`Failed to convert HTML to markdown: ${e instanceof Error?e.message:`Unknown error`}`)}return e.policy?.pii&&e.policy.pii.length>0?{mimeType:`text/markdown`,body:c.replace(/\[REDACTED\]/g,`[REDACTED]`)}:{mimeType:`text/markdown`,body:c}}}),e}export{l as TransformEngine,u as createDefaultTransformEngine,f as registerBasicValidation,d as registerDefaultReactRenderer,p as registerReactToMarkdownRenderer};
package/dist/prompt.js CHANGED
@@ -1 +1 @@
1
- import{z as e}from"zod";function t(e){return e}export{t as definePrompt};
1
+ import"zod";function e(e){return e}export{e as definePrompt};
@@ -1 +1 @@
1
- import{z as e}from"zod";var t=class{prompts=new Map;register(e){let t=`${e.meta.name}.v${e.meta.version}`;if(this.prompts.has(t))throw Error(`Duplicate prompt ${t}`);return this.prompts.set(t,e),this}list(){return[...this.prompts.values()]}get(e,t){if(t!=null)return this.prompts.get(`${e}.v${t}`);let n,r=-1/0;for(let[t,i]of this.prompts.entries())t.startsWith(`${e}.v`)&&i.meta.version>r&&(r=i.meta.version,n=i);return n}};export{t as PromptRegistry};
1
+ import"zod";var e=class{prompts=new Map;register(e){let t=`${e.meta.name}.v${e.meta.version}`;if(this.prompts.has(t))throw Error(`Duplicate prompt ${t}`);return this.prompts.set(t,e),this}list(){return[...this.prompts.values()]}get(e,t){if(t!=null)return this.prompts.get(`${e}.v${t}`);let n,r=-1/0;for(let[t,i]of this.prompts.entries())t.startsWith(`${e}.v`)&&i.meta.version>r&&(r=i.meta.version,n=i);return n}};export{e as PromptRegistry};
@@ -0,0 +1,184 @@
1
+ import{registerDocBlocks as e}from"../../docs/registry.js";import"../../registry.js";const t=[{id:`docs.tech.contracts.regenerator`,title:`Regenerator Service`,summary:`The Regenerator daemon observes telemetry, error, and behavior streams, then suggests spec-level changes (not code patches) that can be reviewed and applied through the App Studio.`,kind:`reference`,visibility:`public`,route:`/docs/tech/contracts/regenerator`,tags:[`tech`,`contracts`,`regenerator`],body:`## Regenerator Service
2
+
3
+ The Regenerator daemon observes telemetry, error, and behavior streams, then suggests spec-level changes (not code patches) that can be reviewed and applied through the App Studio.
4
+
5
+ - Runtime entrypoint: \`packages/libs/contracts/src/regenerator/service.ts\`
6
+ - Types/interfaces: \`packages/libs/contracts/src/regenerator/types.ts\`
7
+ - Signal adapters: \`packages/libs/contracts/src/regenerator/adapters.ts\`
8
+
9
+ ### Architecture
10
+
11
+ \`\`\`text
12
+ Signal Adapters ──► RegeneratorService ──► Rules ──► ProposalSink
13
+ ▲ │
14
+ │ ▼
15
+ Telemetry / Errors / Behavior Spec change proposals
16
+ \`\`\`
17
+
18
+ 1. **Signal adapters** pull batches of telemetry, error logs, or behavior metrics for each \`RegenerationContext\`.
19
+ 2. \`RegeneratorService\` schedules polling (\`resolveAppConfig\` + \`composeAppConfig\` provide context).
20
+ 3. **Rules** implement domain heuristics and emit \`SpecChangeProposal\` objects.
21
+ 4. **Proposal sinks** persist or forward proposals for human review.
22
+
23
+ ### Key types
24
+
25
+ \`\`\`ts
26
+ export interface RegenerationContext {
27
+ id: string;
28
+ blueprint: AppBlueprintSpec;
29
+ tenantConfig: TenantAppConfig;
30
+ resolved: ResolvedAppConfig;
31
+ }
32
+
33
+ export interface RegeneratorRule {
34
+ id: string;
35
+ description: string;
36
+ evaluate(
37
+ context: RegenerationContext,
38
+ signals: RegeneratorSignal[]
39
+ ): Promise<SpecChangeProposal[]>;
40
+ }
41
+
42
+ export interface SpecChangeProposal {
43
+ id: string;
44
+ title: string;
45
+ summary: string;
46
+ confidence: 'low' | 'medium' | 'high';
47
+ target: ProposalTarget;
48
+ actions: ProposalAction[];
49
+ blockers?: ProposalBlocker[];
50
+ signalIds: string[];
51
+ createdAt: Date;
52
+ }
53
+ \`\`\`
54
+
55
+ - Signals are normalized envelopes: telemetry (\`count\`, anomaly score), errors, and behavior trends.
56
+ - Proposals reference blueprint or tenant specs via \`ProposalTarget\`.
57
+ - Actions encode what the automation should perform (update blueprint, run tests/migrations, trigger regeneration).
58
+
59
+ ### Providing signals
60
+
61
+ Implement \`TelemetrySignalProvider\`, \`ErrorSignalProvider\`, or \`BehaviorSignalProvider\`:
62
+
63
+ \`\`\`ts
64
+ const service = new RegeneratorService({
65
+ contexts,
66
+ adapters: {
67
+ telemetry: new PosthogTelemetryAdapter(),
68
+ errors: new SentryErrorAdapter(),
69
+ },
70
+ rules: [new WorkflowFailureRule(), new DataViewUsageRule()],
71
+ sink: new ProposalQueueSink(),
72
+ pollIntervalMs: 60_000,
73
+ });
74
+ \`\`\`
75
+
76
+ Adapters receive the full \`RegenerationContext\`, making it easy to scope queries per tenant/app.
77
+
78
+ ### Authoring rules
79
+
80
+ Rules focus on signals → proposals:
81
+
82
+ \`\`\`ts
83
+ class WorkflowFailureRule implements RegeneratorRule {
84
+ id = 'workflow-failure';
85
+ description = 'Suggest splitting workflows that exceed failure thresholds';
86
+
87
+ async evaluate(context, signals) {
88
+ const failures = signals.filter(
89
+ (signal) =>
90
+ signal.type === 'telemetry' &&
91
+ signal.signal.eventName === 'workflow.failure' &&
92
+ signal.signal.count >= 10
93
+ );
94
+
95
+ if (failures.length === 0) return [];
96
+
97
+ return [
98
+ {
99
+ id: \`\${this.id}-\${context.id}\`,
100
+ title: 'Split onboarding workflow',
101
+ summary: 'Step 3 fails consistently; propose dedicated remediation branch.',
102
+ confidence: 'medium',
103
+ rationale: ['Failure count ≥ 10 within last window'],
104
+ target: {
105
+ specType: 'workflow',
106
+ reference: { name: 'onboarding.workflow', version: 1 },
107
+ tenantScoped: true,
108
+ },
109
+ actions: [
110
+ { kind: 'update_tenant_config', summary: 'Add alternate fallback path' },
111
+ { kind: 'run_tests', tests: ['workflows/onboarding.spec.ts'] },
112
+ ],
113
+ signalIds: failures.map((f) => f.signal.eventName),
114
+ createdAt: new Date(),
115
+ },
116
+ ];
117
+ }
118
+ }
119
+ \`\`\`
120
+
121
+ ### Reviewing proposals
122
+
123
+ Proposals flow to a \`ProposalSink\` (queue, DB, messaging bus). The Studio will surface:
124
+
125
+ 1. Signal evidence (telemetry counts, error metadata)
126
+ 2. Proposed spec diffs and required actions (tests/migrations)
127
+ 3. Approval workflow (approve → write spec diff → run automation)
128
+
129
+ ### CLI driver
130
+
131
+ Run the regenerator daemon from the CLI:
132
+
133
+ \`\`\`bash
134
+ bunx contracts regenerator ./app.blueprint.ts ./tenant.config.ts ./regenerator.rules.ts auto \\
135
+ --executor ./regenerator.executor.ts \\
136
+ --poll-interval 60000 \\
137
+ --batch-duration 300000 \\
138
+ --dry-run
139
+ \`\`\`
140
+
141
+ - Expects modules exporting default \`AppBlueprintSpec\`, \`TenantAppConfig\`, and one or more \`RegenerationRule\`s.
142
+ - Pass a sink module path, or use the special \`auto\` value with \`--executor <module>\` to instantiate an \`ExecutorProposalSink\`.
143
+ - Executor modules can export a \`ProposalExecutor\` instance, a factory, or a plain dependency object for the executor constructor. Optional exports: \`sinkOptions\`, \`logger\`, \`onResult\`, \`dryRun\`.
144
+ - Optionally provide \`--contexts ./contexts.ts\` to load custom context arrays (advanced multi-tenant scenarios).
145
+ - Use \`--dry-run\` to preview actions without mutating specs/configs, and \`--once\` for CI smoke tests.
146
+
147
+ ### Proposal executor
148
+
149
+ \`ProposalExecutor\` + \`ExecutorProposalSink\` orchestrate follow-up actions once a proposal is approved:
150
+
151
+ - Interfaces for applying blueprint or tenant-config updates (\`BlueprintUpdater\`, \`TenantConfigUpdater\`).
152
+ - Hooks for running contract tests and migrations (\`TestExecutor\`, \`MigrationExecutor\`).
153
+ - Optional trigger to recompose the runtime (\`RegenerationTrigger\`).
154
+ - Built-in \`dryRun\` mode to preview outcomes.
155
+ - Pluggable result logging/forwarding via \`ExecutorSinkOptions\`.
156
+
157
+ \`\`\`ts
158
+ import {
159
+ ProposalExecutor,
160
+ ExecutorProposalSink,
161
+ } from '@lssm/lib.contracts/regenerator';
162
+
163
+ const executor = new ProposalExecutor({
164
+ tenantConfigUpdater,
165
+ testExecutor,
166
+ migrationExecutor,
167
+ regenerationTrigger,
168
+ });
169
+
170
+ const sink = new ExecutorProposalSink(executor, {
171
+ dryRun: false,
172
+ onResult: ({ result }) => console.log(result.status),
173
+ });
174
+ \`\`\`
175
+
176
+ Execution results include per-action status (\`success\`, \`skipped\`, \`failed\`) plus aggregated proposal status (\`success\`, \`partial\`, \`failed\`). Missing dependencies mark actions as \`skipped\`, making it easy to plug into partial automation flows today and extend later.
177
+
178
+ ### Next steps
179
+
180
+ - Build adapters for existing telemetry/error providers.
181
+ - Encode canonical rules (workflow failure, feature under-use, high latency).
182
+ - Integrate with App Studio proposal inbox and automate acceptance (write spec diff, run tests, queue migrations).
183
+
184
+ `}];e(t);export{t as tech_contracts_regenerator_DocBlocks};
package/dist/registry.js CHANGED
@@ -1 +1 @@
1
- import{eventKey as e}from"./events.js";import{isEmitDeclRef as t}from"./spec.js";function n(e,t){return`${e}.v${t}`}var r=class{specs=new Map;handlers=new Map;register(e){let t=n(e.meta.name,e.meta.version);if(this.specs.has(t))throw Error(`Duplicate spec ${t}`);return this.specs.set(t,e),this}bind(e,t){let r=n(e.meta.name,e.meta.version);if(!this.specs.has(r))throw Error(`Cannot bind; spec not found: ${r}`);if(this.handlers.has(r))throw Error(`Handler already bound for ${r}`);return this.handlers.set(r,t),this}getSpec(e,t){if(t!=null)return this.specs.get(n(e,t));let r,i=-1/0;for(let[t,n]of this.specs.entries())t.startsWith(`${e}.v`)&&n.meta.version>i&&(i=n.meta.version,r=n);return r}getHandler(e,t){let r=this.getSpec(e,t);if(r)return this.handlers.get(n(r.meta.name,r.meta.version))}listSpecs(){return[...this.specs.values()]}listBound(){let e=[];for(let[t,n]of this.specs.entries()){let r=this.handlers.get(t);r&&e.push({spec:n,handler:r})}return e}async execute(r,i,a,o){let s=this.getSpec(r,i);if(!s)throw Error(`Spec not found for ${r}${i?`.v${i}`:``}`);let c=await o.specVariantResolver?.resolve({name:s.meta.name,version:s.meta.version,kind:s.meta.kind},o)??s,l=n(c.meta.name,c.meta.version),u=this.handlers.get(l);if(!u){let e=n(s.meta.name,s.meta.version);u=this.handlers.get(e),l=e}if(!u)throw Error(`No handler bound for ${l}`);let d=c.io.input?.getZod().parse(a);if(o.decide){let[e,t]=c.meta.name.split(`.`),n=await o.decide({service:e,command:t,version:c.meta.version,actor:o.actor??`anonymous`,channel:o.channel,roles:o.roles,organizationId:o.organizationId,userId:o.userId,flags:[]});if(n.effect===`deny`)throw Error(`PolicyDenied: ${c.meta.name}.v${c.meta.version}`);if(n.rateLimit&&o.rateLimit){let e=n.rateLimit.key??`default`,t=n.rateLimit.rpm??60;await o.rateLimit(e,1,t)}}let f=new Map;if(c.sideEffects?.emits)for(let e of c.sideEffects.emits)t(e)?f.set(`${e.ref.name}.v${e.ref.version}`,e.ref.payload):f.set(`${e.name}.v${e.version}`,e.payload);let p=async(t,r,i)=>{let a=e(t,r),s=f.get(a);if(!s)throw Error(`UndeclaredEvent: ${a} not allowed by ${n(c.meta.name,c.meta.version)}`);let l=s.getZod().parse(i);await o.eventPublisher?.({name:t,version:r,payload:l,traceId:o.traceId})};o.appConfig&&(o.branding||=o.appConfig.branding,o.translation?o.translation.config||(o.translation={...o.translation,config:o.appConfig.translation}):o.translation={config:o.appConfig.translation});let m=o.telemetry,h=async(e,t)=>{if(!(!m||!e?.event))try{let n=e.properties?.(t)??{};await m.track(e.event.name,e.event.version??1,n,{tenantId:o.organizationId??void 0,organizationId:o.organizationId,userId:o.userId,actor:o.actor,channel:o.channel,metadata:o.traceId?{traceId:o.traceId}:void 0})}catch{}},g;try{g=await u(d,{...o,__emitGuard__:p})}catch(e){throw c.telemetry?.failure&&await h(c.telemetry.failure,{input:d??a,error:e}),e}c.telemetry?.success&&await h(c.telemetry.success,{input:d??a,output:g});let _=c.io.output;return _?.getZod?_.getZod().parse(g):g}};export{r as SpecRegistry,n as opKey};
1
+ import{eventKey as e}from"./events.js";import{isEmitDeclRef as t}from"./spec.js";import{defaultDocRegistry as n,docId as r,registerDocBlocks as i}from"./docs/registry.js";function a(e,t){return`${e}.v${t}`}var o=class{specs=new Map;handlers=new Map;register(e){let t=a(e.meta.name,e.meta.version);if(this.specs.has(t))throw Error(`Duplicate spec ${t}`);return this.specs.set(t,e),this}bind(e,t){let n=a(e.meta.name,e.meta.version);if(!this.specs.has(n))throw Error(`Cannot bind; spec not found: ${n}`);if(this.handlers.has(n))throw Error(`Handler already bound for ${n}`);return this.handlers.set(n,t),this}getSpec(e,t){if(t!=null)return this.specs.get(a(e,t));let n,r=-1/0;for(let[t,i]of this.specs.entries())t.startsWith(`${e}.v`)&&i.meta.version>r&&(r=i.meta.version,n=i);return n}getHandler(e,t){let n=this.getSpec(e,t);if(n)return this.handlers.get(a(n.meta.name,n.meta.version))}listSpecs(){return[...this.specs.values()]}listBound(){let e=[];for(let[t,n]of this.specs.entries()){let r=this.handlers.get(t);r&&e.push({spec:n,handler:r})}return e}async execute(n,r,i,o){let s=this.getSpec(n,r);if(!s)throw Error(`Spec not found for ${n}${r?`.v${r}`:``}`);let c=await o.specVariantResolver?.resolve({name:s.meta.name,version:s.meta.version,kind:s.meta.kind},o)??s,l=a(c.meta.name,c.meta.version),u=this.handlers.get(l);if(!u){let e=a(s.meta.name,s.meta.version);u=this.handlers.get(e),l=e}if(!u)throw Error(`No handler bound for ${l}`);let d=c.io.input?.getZod().parse(i);if(o.decide){let[e,t]=c.meta.name.split(`.`),n=await o.decide({service:e,command:t,version:c.meta.version,actor:o.actor??`anonymous`,channel:o.channel,roles:o.roles,organizationId:o.organizationId,userId:o.userId,flags:[]});if(n.effect===`deny`)throw Error(`PolicyDenied: ${c.meta.name}.v${c.meta.version}`);if(n.rateLimit&&o.rateLimit){let e=n.rateLimit.key??`default`,t=n.rateLimit.rpm??60;await o.rateLimit(e,1,t)}}let f=new Map;if(c.sideEffects?.emits)for(let e of c.sideEffects.emits)t(e)?f.set(`${e.ref.name}.v${e.ref.version}`,e.ref.payload):f.set(`${e.name}.v${e.version}`,e.payload);let p=async(t,n,r)=>{let i=e(t,n),s=f.get(i);if(!s)throw Error(`UndeclaredEvent: ${i} not allowed by ${a(c.meta.name,c.meta.version)}`);let l=s.getZod().parse(r);await o.eventPublisher?.({name:t,version:n,payload:l,traceId:o.traceId})};o.appConfig&&(o.branding||=o.appConfig.branding,o.translation?o.translation.config||(o.translation={...o.translation,config:o.appConfig.translation}):o.translation={config:o.appConfig.translation});let m=o.telemetry,h=async(e,t)=>{if(!(!m||!e?.event))try{let n=e.properties?.(t)??{};await m.track(e.event.name,e.event.version??1,n,{tenantId:o.organizationId??void 0,organizationId:o.organizationId,userId:o.userId,actor:o.actor,channel:o.channel,metadata:o.traceId?{traceId:o.traceId}:void 0})}catch{}},g;try{g=await u(d,{...o,__emitGuard__:p})}catch(e){throw c.telemetry?.failure&&await h(c.telemetry.failure,{input:d??i,error:e}),e}c.telemetry?.success&&await h(c.telemetry.success,{input:d??i,output:g});let _=c.io.output;return _?.getZod?_.getZod().parse(g):g}};export{o as SpecRegistry,n as defaultDocRegistry,r as docId,a as opKey,i as registerDocBlocks};
package/dist/resources.js CHANGED
@@ -1 +1 @@
1
- import{z as e}from"zod";function t(e){return e}var n=class{templates=[];register(e){return this.templates.push(e),this}listTemplates(){return[...this.templates]}match(e){for(let t of this.templates){let n=RegExp(`^`+t.meta.uriTemplate.replace(/\{[^}]+\}/g,`([^/]+)`)+`$`),r=e.match(n);if(!r)continue;let i=[...t.meta.uriTemplate.matchAll(/\{([^}]+)\}/g)].map(e=>e[1]),a={};return i.forEach((e,t)=>a[e]=decodeURIComponent(r[t+1])),{tmpl:t,params:a}}}};function r(e,t){return{kind:`resource_ref`,uriTemplate:e,varName:t.varName??`id`,graphQLType:t.graphQLType,many:t.many}}function i(e){let t=e;return!!t&&t.kind===`resource_ref`&&typeof t.uriTemplate==`string`}export{n as ResourceRegistry,t as defineResourceTemplate,i as isResourceRef,r as resourceRef};
1
+ import"zod";function e(e){return e}var t=class{templates=[];register(e){return this.templates.push(e),this}listTemplates(){return[...this.templates]}match(e){for(let t of this.templates){let n=RegExp(`^`+t.meta.uriTemplate.replace(/\{[^}]+\}/g,`([^/]+)`)+`$`),r=e.match(n);if(!r)continue;let i=[...t.meta.uriTemplate.matchAll(/\{([^}]+)\}/g)].map(e=>e[1]),a={};return i.forEach((e,t)=>a[e]=decodeURIComponent(r[t+1])),{tmpl:t,params:a}}}};function n(e,t){return{kind:`resource_ref`,uriTemplate:e,varName:t.varName??`id`,graphQLType:t.graphQLType,many:t.many}}function r(e){let t=e;return!!t&&t.kind===`resource_ref`&&typeof t.uriTemplate==`string`}export{t as ResourceRegistry,e as defineResourceTemplate,r as isResourceRef,n as resourceRef};
@@ -0,0 +1,10 @@
1
+ function e(e,i,a={}){let{format:o=`auto`,title:s,description:c,maxDepth:l=2}=a,u=[];s&&u.push(`# ${s}`,``),c&&u.push(`> ${c}`,``);let d=o===`auto`?Array.isArray(i)?`table`:`detail`:o;return d===`table`&&Array.isArray(i)?u.push(t(e,i,a)):d===`list`&&Array.isArray(i)?u.push(n(e,i,a)):!Array.isArray(i)&&typeof i==`object`&&i?u.push(r(e,i,{...a,maxDepth:l})):u.push(`**Data:** ${String(i)}`,``),u.join(`
2
+ `)}function t(e,t,n={}){let{maxItems:r=100,includeFields:i,excludeFields:c=[]}=n,l=a(e,i,c);if(l.length===0||t.length===0)return`_No data available_
3
+ `;let u=t.slice(0,r),d=[],f=l.map(e=>e.label);d.push(`| ${f.join(` | `)} |`),d.push(`| ${f.map(()=>`---`).join(` | `)} |`);for(let e of u){let t=l.map(t=>s(o(e,t.name)));d.push(`| ${t.join(` | `)} |`)}return t.length>r&&d.push(``,`_Showing ${r} of ${t.length} items_`),d.push(``),d.join(`
4
+ `)}function n(e,t,n={}){let{maxItems:r=50,summaryFields:i,includeFields:c,excludeFields:l=[]}=n,u=a(e,c,l),d=i?u.filter(e=>i.includes(e.name)):u.slice(0,3);if(d.length===0||t.length===0)return`_No data available_
5
+ `;let f=t.slice(0,r),p=[];for(let e of f){let t=s(o(e,d[0]?.name??`id`)),n=d.slice(1).map(t=>`${t.label}: ${s(o(e,t.name))}`).join(` · `),r=n?`- **${t}** (${n})`:`- **${t}**`;p.push(r)}return t.length>r&&p.push(``,`_Showing ${r} of ${t.length} items_`),p.push(``),p.join(`
6
+ `)}function r(e,t,n={}){let{includeFields:r,excludeFields:i=[],maxDepth:s=2}=n;if(typeof t!=`object`||!t)return`_No data available_
7
+ `;let l=a(e,r,i);if(l.length===0)return`_No fields to display_
8
+ `;let u=[];for(let e of l){let n=c(o(t,e.name),s,0);u.push(`**${e.label}:** ${n}`)}return u.push(``),u.join(`
9
+ `)}function i(e,t,n={}){let{numericFields:r=[],countByField:i}=n,a=[];a.push(`**Total Items:** ${t.length}`);for(let e of r){let n=t.map(t=>o(t,e)).filter(e=>typeof e==`number`);if(n.length>0){let t=n.reduce((e,t)=>e+t,0),r=t/n.length,i=Math.min(...n),o=Math.max(...n);a.push(`**${l(e)}:** Sum: ${u(t)}, Avg: ${u(r)}, Min: ${u(i)}, Max: ${u(o)}`)}}if(i){let e={};for(let n of t){let t=String(o(n,i)??`Unknown`);e[t]=(e[t]??0)+1}a.push(``,`**By ${l(i)}:**`);for(let[t,n]of Object.entries(e))a.push(`- ${t}: ${n}`)}return a.push(``),a.join(`
10
+ `)}function a(e,t,n=[]){let r=e.config.fields;return Object.keys(r).filter(e=>!(n.includes(e)||t&&!t.includes(e))).map(e=>{let t=r[e],n=!!(t?.type&&typeof t.type==`object`&&`config`in t.type&&typeof t.type.config?.fields==`object`);return{name:e,label:l(e),isOptional:t?.isOptional??!1,isArray:t?.isArray===!0,isNested:n}})}function o(e,t){if(typeof e!=`object`||!e)return;let n=e;if(t.includes(`.`)){let e=t.split(`.`),r=n;for(let t of e){if(typeof r!=`object`||!r)return;r=r[t]}return r}return n[t]}function s(e){if(e==null)return`-`;if(typeof e==`boolean`)return e?`✓`:`✗`;if(typeof e==`number`)return u(e);if(e instanceof Date)return d(e);if(typeof e==`string`&&f(e))return d(new Date(e));if(Array.isArray(e))return`[${e.length} items]`;if(typeof e==`object`)return`[Object]`;let t=String(e);return t.length>50?`${t.slice(0,47)}...`:t.replace(/\|/g,`\\|`)}function c(e,t,n){return e==null?`_none_`:typeof e==`boolean`?e?`Yes`:`No`:typeof e==`number`?u(e):e instanceof Date?d(e):typeof e==`string`&&f(e)?d(new Date(e)):Array.isArray(e)?e.length===0?`_empty list_`:n>=t?`[${e.length} items]`:e.length<=5&&e.every(e=>typeof e!=`object`)?e.map(e=>s(e)).join(`, `):`[${e.length} items]`:typeof e==`object`?n>=t?`[Object]`:`{${Object.keys(e).length} fields}`:String(e)}function l(e){return e.replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/_/g,` `).replace(/^\w/,e=>e.toUpperCase())}function u(e){return Math.abs(e)>=1e3?new Intl.NumberFormat(`en-US`,{maximumFractionDigits:2}).format(e):Number.isInteger(e)?String(e):e.toFixed(2)}function d(e){return e.toLocaleDateString(`en-US`,{year:`numeric`,month:`short`,day:`numeric`})}function f(e){if(!/^\d{4}-\d{2}-\d{2}/.test(e))return!1;let t=new Date(e);return!isNaN(t.getTime())}export{e as schemaToMarkdown,r as schemaToMarkdownDetail,n as schemaToMarkdownList,i as schemaToMarkdownSummary,t as schemaToMarkdownTable};
@@ -1 +1 @@
1
- import{hydrateResourceIfNeeded as e,parseReturns as t}from"../contracts-adapter-hydration.js";import{createInputTypeBuilder as n}from"../contracts-adapter-input.js";import{defaultGqlField as r}from"../jsonschema.js";import"@pothos/plugin-prisma";import"@pothos/plugin-complexity";import"@pothos/plugin-relay";import"@pothos/plugin-dataloader";import"@pothos/plugin-tracing";function i(i,a,o){let{buildInputFieldArgs:s}=n(i),c=new Map;for(let e of a.listSpecs()){let t=e.io.output;if(t&&`getZod`in t&&typeof t.getZod==`function`){let e=t,n=e.config?.name??`UnknownOutput`;c.has(n)||c.set(n,e)}}for(let[e,t]of c.entries())i.objectType(e,{fields:e=>{let n=Object.entries(t.config.fields),r={};for(let[t,i]of n){let n=i.type,a=`JSON`;n&&typeof n.getPothos==`function`&&(a=n.getPothos().name||`JSON`,a===`String_unsecure`&&(a=`String`),a===`Int_unsecure`&&(a=`Int`),a===`Float_unsecure`&&(a=`Float`),a===`Boolean_unsecure`&&(a=`Boolean`),a===`ID_unsecure`&&(a=`ID`));let o=i.isArray?[a]:a;r[t]=e.field({type:o,nullable:i.isOptional,resolve:e=>e[t]})}return r}});function l(e){let t=e.transport?.gql?.returns;if(t)return t;let n=e.io.output??{};if(n&&`kind`in n&&n.kind===`resource_ref`&&`graphQLType`in n&&n.graphQLType)return String(n.graphQLType);if(n&&`getZod`in n&&typeof n.getZod==`function`){let e=n.config?.name;if(e&&c.has(e))return e}return`JSON`}for(let n of a.listSpecs()){let c=n.transport?.gql?.field??r(n.meta.name,n.meta.version);n.transport?.gql?.returns;let u=n.transport?.gql?.byIdField??`id`,d=n.transport?.gql?.resource,f=n.meta.kind===`query`,p=l(n),m=n.transport?.gql?.returns,h=t(m??p),g=async(t,r,i)=>{if(n.policy.auth!==`anonymous`&&!i.user)throw Error(`Unauthorized`);let s={traceId:i.logger?.getTraceId?.()??void 0,userId:i.user?.id??null,organizationId:i.session?.activeOrganizationId??null,actor:i.user?`user`:`anonymous`,channel:`web`,eventPublisher:i.eventPublisher},c=n.io.input?.getZod().parse(r.input??{}),l=await a.execute(n.meta.name,n.meta.version,c,s),f=n.io.output;if(o&&(d||f?.kind===`resource_ref`)){let t=u??f?.varName??`id`,n=await e(o,l,{template:d??f?.uriTemplate,varName:t,returns:h});if(n!==l)return n}return p?h.inner===`Boolean`&&!h.isList?!!(l?.ok??l):l:n.io.output.getZod().parse(l)},_=e=>{let t=s(n.io.input);return e.field({type:h.isList?[h.inner]:h.inner,complexity:()=>10,resolve:g,args:t?{input:e.arg({type:t,required:!0})}:void 0})};f?i.queryField(c,_):i.mutationField(c,_)}}export{i as registerContractsOnBuilder};
1
+ import{hydrateResourceIfNeeded as e,parseReturns as t}from"../contracts-adapter-hydration.js";import{createInputTypeBuilder as n}from"../contracts-adapter-input.js";import{defaultGqlField as r}from"../jsonschema.js";import"../node_modules/@pothos/plugin-prisma/esm/index.js";import"../node_modules/@pothos/plugin-complexity/esm/index.js";import"../node_modules/@pothos/plugin-dataloader/esm/index.js";import"../node_modules/@pothos/plugin-tracing/esm/index.js";import"@pothos/plugin-relay";function i(i,a,o){let{buildInputFieldArgs:s}=n(i),c=new Map;for(let e of a.listSpecs()){let t=e.io.output;if(t&&`getZod`in t&&typeof t.getZod==`function`){let e=t,n=e.config?.name??`UnknownOutput`;c.has(n)||c.set(n,e)}}for(let[e,t]of c.entries())i.objectType(e,{fields:e=>{let n=Object.entries(t.config.fields),r={};for(let[t,i]of n){let n=i.type,a=`JSON`;n&&typeof n.getPothos==`function`&&(a=n.getPothos().name||`JSON`,a===`String_unsecure`&&(a=`String`),a===`Int_unsecure`&&(a=`Int`),a===`Float_unsecure`&&(a=`Float`),a===`Boolean_unsecure`&&(a=`Boolean`),a===`ID_unsecure`&&(a=`ID`));let o=i.isArray?[a]:a;r[t]=e.field({type:o,nullable:i.isOptional,resolve:e=>e[t]})}return r}});function l(e){let t=e.transport?.gql?.returns;if(t)return t;let n=e.io.output??{};if(n&&`kind`in n&&n.kind===`resource_ref`&&`graphQLType`in n&&n.graphQLType)return String(n.graphQLType);if(n&&`getZod`in n&&typeof n.getZod==`function`){let e=n.config?.name;if(e&&c.has(e))return e}return`JSON`}for(let n of a.listSpecs()){let c=n.transport?.gql?.field??r(n.meta.name,n.meta.version);n.transport?.gql?.returns;let u=n.transport?.gql?.byIdField??`id`,d=n.transport?.gql?.resource,f=n.meta.kind===`query`,p=l(n),m=n.transport?.gql?.returns,h=t(m??p),g=async(t,r,i)=>{if(n.policy.auth!==`anonymous`&&!i.user)throw Error(`Unauthorized`);let s={traceId:i.logger?.getTraceId?.()??void 0,userId:i.user?.id??null,organizationId:i.session?.activeOrganizationId??null,actor:i.user?`user`:`anonymous`,channel:`web`,eventPublisher:i.eventPublisher},c=n.io.input?.getZod().parse(r.input??{}),l=await a.execute(n.meta.name,n.meta.version,c,s),f=n.io.output;if(o&&(d||f?.kind===`resource_ref`)){let t=u??f?.varName??`id`,n=await e(o,l,{template:d??f?.uriTemplate,varName:t,returns:h});if(n!==l)return n}return p?h.inner===`Boolean`&&!h.isList?!!(l?.ok??l):l:n.io.output.getZod().parse(l)},_=e=>{let t=s(n.io.input);return e.field({type:h.isList?[h.inner]:h.inner,complexity:()=>10,resolve:g,args:t?{input:e.arg({type:t,required:!0})}:void 0})};f?i.queryField(c,_):i.mutationField(c,_)}}export{i as registerContractsOnBuilder};
@@ -1 +1 @@
1
- import{registerContractsOnBuilder as e}from"./graphql-pothos.js";import{exportContractsToGraphQLSchema as t}from"./graphql-schema-export.js";import{createMcpServer as n}from"./provider-mcp.js";import{createFetchHandler as r}from"./rest-generic.js";import{elysiaPlugin as i}from"./rest-elysia.js";import{expressRouter as a}from"./rest-express.js";import{makeNextAppHandler as o}from"./rest-next-app.js";import{makeNextPagesHandler as s}from"./rest-next-pages.js";export{r as createFetchHandler,n as createMcpServer,i as elysiaPlugin,t as exportContractsToGraphQLSchema,a as expressRouter,o as makeNextAppHandler,s as makeNextPagesHandler,e as registerContractsOnBuilder};
1
+ import{registerContractsOnBuilder as e}from"./graphql-pothos.js";import{createMcpServer as t}from"./mcp/createMcpServer.js";import"./provider-mcp.js";import{createFetchHandler as n}from"./rest-generic.js";import{elysiaPlugin as r}from"./rest-elysia.js";import{expressRouter as i}from"./rest-express.js";import{makeNextAppHandler as a}from"./rest-next-app.js";import{makeNextPagesHandler as o}from"./rest-next-pages.js";export{n as createFetchHandler,t as createMcpServer,r as elysiaPlugin,i as expressRouter,a as makeNextAppHandler,o as makeNextPagesHandler,e as registerContractsOnBuilder};
@@ -0,0 +1 @@
1
+ import{registerMcpTools as e}from"./registerTools.js";import{registerMcpResources as t}from"./registerResources.js";import{registerMcpPrompts as n}from"./registerPrompts.js";import{registerMcpPresentations as r}from"./registerPresentations.js";function i(i,a,o,s,c){return c.logger.info(`Creating MCP server`),e(i,a,{toolCtx:c.toolCtx}),t(i,o,{logger:c.logger,resourceCtx:c.resourceCtx}),r(i,{logger:c.logger,presentations:c.presentations,presentationsV2:c.presentationsV2}),n(i,s,{promptCtx:c.promptCtx}),i}export{i as createMcpServer};
File without changes
@@ -0,0 +1 @@
1
+ import{createDefaultTransformEngine as e,registerBasicValidation as t,registerDefaultReactRenderer as n}from"../../presentations.v2.js";import{jsonSchemaForPresentation as r}from"../../presentations.js";function i(e){return!e||typeof e!=`object`?!1:`body`in e&&typeof e.body==`string`}function a(a,o){let s=o.presentations,c=o.presentationsV2;if(s)for(let e of s.list()){let t=`presentation.${e.meta.name.replace(/\./g,`_`)}.v${e.meta.version}`,n=`presentation://${e.meta.name}/v${e.meta.version}`;a.registerResource(t,n,{title:`${e.meta.name} v${e.meta.version}`,description:e.meta.description??`Presentation`},async()=>{if(e.content.kind===`markdown`)return{contents:[{uri:n,mimeType:`text/markdown`,text:e.content.content?e.content.content:`See resource: ${e.content.resourceUri??``}`}]};if(e.content.kind===`data`){let t=r(e);return{contents:[{uri:n,mimeType:`application/json`,text:JSON.stringify(t,null,2)}]}}let t={name:e.meta.name,version:e.meta.version,kind:e.content.kind,description:e.meta.description??``};return{contents:[{uri:n,mimeType:`application/json`,text:JSON.stringify(t,null,2)}]}});for(let i of[{ext:`.md`,target:`markdown`},{ext:`.json`,target:`application/json`},{ext:`.xml`,target:`application/xml`}]){let s=`${t}${i.ext}`,c=`${n}${i.ext}`;o.logger.info(`Registering presentation resource ${c} for ${s}`),a.registerResource(s,c,{title:`${e.meta.name} v${e.meta.version} (${i.ext})`,description:`${e.meta.description??`Presentation`} (${i.ext})`},async()=>{if(e.content.kind===`markdown`&&i.target===`markdown`)return{contents:[{uri:c,mimeType:`text/markdown`,text:e.content.content??`See resource: ${e.content.resourceUri??``}`}]};if(e.content.kind===`data`&&i.target===`application/json`)return{contents:[{uri:c,mimeType:`application/json`,text:JSON.stringify(r(e),null,2)}]};let t=JSON.stringify({meta:e.meta,content:e.content},null,2);return i.target===`application/json`?{contents:[{uri:c,mimeType:`application/json`,text:t}]}:i.target===`application/xml`?{contents:[{uri:c,mimeType:`application/xml`,text:`<presentation name="${e.meta.name}" version="${e.meta.version}"><json>${encodeURIComponent(t)}</json></presentation>`}]}:{contents:[{uri:c,mimeType:`text/markdown`,text:`Unsupported presentation for markdown`}]}})}}if(c&&c.length){let r=t(n(e()));for(let e of c){let t=`presentation.${e.meta.name.replace(/\./g,`_`)}.v${e.meta.version}`,n=`presentation://${e.meta.name}/v${e.meta.version}`;o.logger.info(`Registering presentation descriptor ${n} for ${t}`),a.registerResource(t,n,{title:`${e.meta.name} v${e.meta.version}`,description:e.meta.description??`Presentation`,mimeType:`application/json`},async()=>({contents:[{uri:n,mimeType:`application/json`,text:JSON.stringify({meta:e.meta,source:e.source,targets:e.targets},null,2)}]}));for(let o of[{ext:`.md`,target:`markdown`},{ext:`.json`,target:`application/json`},{ext:`.xml`,target:`application/xml`}]){let s=`${t}${o.ext}`,c=`${n}${o.ext}`;a.registerResource(s,c,{title:`${e.meta.name} v${e.meta.version} (${o.ext})`,description:`${e.meta.description??`Presentation`} (${o.ext})`},async()=>{let t=await r.render(o.target,e);return{contents:[{uri:c,mimeType:i(t)&&t.mimeType?t.mimeType:o.target===`markdown`?`text/markdown`:o.target,text:i(t)&&typeof t.body==`string`?t.body:String(t)}]}})}}}}export{a as registerMcpPresentations};
@@ -0,0 +1,3 @@
1
+ import e from"zod";function t(e){let t={};for(let n of e)t[n.name]=n.schema;return t}function n(e,n,r){for(let i of n.list())e.registerPrompt(i.meta.name,{title:i.meta.title,description:i.meta.description,argsSchema:t(i.args)},async e=>{let t=(e,t)=>{let n=e;for(let[e,r]of Object.entries(t))n=n.replace(RegExp(`\\{${e}\\}`,`g`),encodeURIComponent(String(r)));return n};return{messages:[{role:`assistant`,content:{type:`text`,text:(await i.render(i.input.parse(e),{...r.promptCtx(),link:t})).map(e=>e.type===`text`?e.text:`See resource: ${e.title??e.uri}\nURI: ${e.uri}`).join(`
2
+
3
+ `)}}],description:i.meta.description}})}export{n as registerMcpPrompts};
@@ -0,0 +1 @@
1
+ import{ResourceTemplate as e}from"@modelcontextprotocol/sdk/server/mcp.js";import{Buffer as t}from"node:buffer";function n(e){return{title:e.meta.title,description:e.meta.description,mimeType:e.meta.mimeType,_meta:{tags:e.meta.tags??[]}}}function r(r,i,a){for(let o of i.listTemplates())a.logger.info(`Registering resource: `+o.meta.uriTemplate),r.registerResource(o.meta.uriTemplate,new e(o.meta.uriTemplate,{list:void 0}),n(o),async(e,n)=>{let r=o.input.parse(n),i=await o.resolve(r,a.resourceCtx());return typeof i.data==`string`?{contents:[{uri:i.uri,mimeType:i.mimeType??o.meta.mimeType,text:i.data}]}:{contents:[{uri:i.uri,mimeType:i.mimeType??o.meta.mimeType,blob:t.from(i.data).toString(`base64`)}]}}),a.logger.info(`Registered resource: `+o.meta.uriTemplate)}export{r as registerMcpResources};
@@ -0,0 +1 @@
1
+ import{defaultMcpTool as e}from"../../jsonschema.js";function t(t,n,r){for(let i of n.listSpecs()){if(i.meta.kind!==`command`)continue;let a=i.transport?.mcp?.toolName??e(i.meta.name,i.meta.version);t.registerTool(a,{description:i.meta.description,inputSchema:i.io.input?.getZod()},async e=>{let t=await n.execute(i.meta.name,i.meta.version,e??{},r.toolCtx());return{content:[{type:`text`,text:JSON.stringify(t,null,4)}]}})}}export{t as registerMcpTools};
@@ -1 +1 @@
1
- import{createDefaultTransformEngine as e,registerBasicValidation as t,registerDefaultReactRenderer as n}from"../presentations.v2.js";import{defaultMcpTool as r,jsonSchemaForSpec as i}from"../jsonschema.js";import{jsonSchemaForPresentation as a}from"../presentations.js";import o from"zod";import{McpServer as s,ResourceTemplate as c}from"@modelcontextprotocol/sdk/server/mcp.js";import{zodToJsonSchema as l}from"zod-to-json-schema";function u(s,u,d,f,p){for(let e of u.listSpecs()){if(e.meta.kind!==`command`)continue;let{input:t}=i(e),n=e.transport?.mcp?.toolName??r(e.meta.name,e.meta.version);s.registerTool(n,{description:e.meta.description,inputSchema:t},async(t,n)=>{let r=await u.execute(e.meta.name,e.meta.version,t??{},p.toolCtx());return{content:[{type:`text`,text:JSON.stringify(r,null,4)}]}})}for(let e of d.listTemplates())s.registerResource(e.meta.uriTemplate.split(`:`)[0],new c(e.meta.uriTemplate,{}),{description:e.meta.description,inputSchema:l(e.input,{})},async(t,n,r)=>{let i=p.resourceCtx(),a=await e.resolve(n,i);return typeof a.data==`string`?{contents:[{uri:a.uri,mimeType:a.mimeType??e.meta.mimeType,text:a.data}]}:{contents:[{uri:a.uri,mimeType:a.mimeType??e.meta.mimeType,blob:a.data.toString()}]}});let m=p.presentations,h=p.presentationsV2;if(m){t(n(e()));for(let e of m.list()){let t=`presentation.${e.meta.name.replace(/\./g,`_`)}.v${e.meta.version}`,n=`presentation://${e.meta.name}/v${e.meta.version}`;s.registerResource(t,new c(n,{}),{description:e.meta.description??`Presentation`,inputSchema:o.toJSONSchema(o.object({}))},async(t,r,i)=>{if(e.content.kind===`markdown`)return{contents:[{uri:n,mimeType:`text/markdown`,text:e.content.content?e.content.content:`See resource: ${e.content.resourceUri??``}`}]};if(e.content.kind===`data`){let t=a(e);return{contents:[{uri:n,mimeType:`application/json`,text:JSON.stringify(t,null,2)}]}}let o={name:e.meta.name,version:e.meta.version,kind:e.content.kind,description:e.meta.description??``};return{contents:[{uri:n,mimeType:`application/json`,text:JSON.stringify(o,null,2)}]}});for(let r of[{ext:`.md`,target:`markdown`},{ext:`.json`,target:`application/json`},{ext:`.xml`,target:`application/xml`}]){let i=`${t}${r.ext}`,l=`${n}${r.ext}`;s.registerResource(i,new c(l,{}),{description:`${e.meta.description??`Presentation`} (${r.ext})`,inputSchema:o.toJSONSchema(o.object({}))},async()=>{if(e.content.kind===`markdown`&&r.target===`markdown`)return{contents:[{uri:l,mimeType:`text/markdown`,text:e.content.content??`See resource: ${e.content.resourceUri??``}`}]};if(e.content.kind===`data`&&r.target===`application/json`)return{contents:[{uri:l,mimeType:`application/json`,text:JSON.stringify(a(e),null,2)}]};let t=JSON.stringify({meta:e.meta,content:e.content},null,2);return r.target===`application/json`?{contents:[{uri:l,mimeType:`application/json`,text:t}]}:r.target===`application/xml`?{contents:[{uri:l,mimeType:`application/xml`,text:`<presentation name="${e.meta.name}" version="${e.meta.version}"><json>${encodeURIComponent(t)}</json></presentation>`}]}:{contents:[{uri:l,mimeType:`text/markdown`,text:`Unsupported presentation for markdown`}]}})}}}if(h&&h.length){let r=t(n(e()));for(let e of h){let t=`presentation.${e.meta.name.replace(/\./g,`_`)}.v${e.meta.version}`,n=`presentation://${e.meta.name}/v${e.meta.version}`;s.registerResource(t,new c(n,{}),{description:e.meta.description??`Presentation`,inputSchema:o.toJSONSchema(o.object({}))},async()=>({contents:[{uri:n,mimeType:`application/json`,text:JSON.stringify({meta:e.meta,source:e.source,targets:e.targets},null,2)}]}));for(let i of[{ext:`.md`,target:`markdown`},{ext:`.json`,target:`application/json`},{ext:`.xml`,target:`application/xml`}]){let a=`${t}${i.ext}`,l=`${n}${i.ext}`;s.registerResource(a,new c(l,{}),{description:`${e.meta.description??`Presentation`} (${i.ext})`,inputSchema:o.toJSONSchema(o.object({}))},async()=>{let t=await r.render(i.target,e);return{contents:[{uri:l,mimeType:t.mimeType??(i.target===`markdown`?`text/markdown`:i.target),text:t.body??String(t)}]}})}}}for(let e of f.list())s.registerPrompt(e.meta.name,{title:e.meta.title,description:e.meta.title,argsSchema:l(e.input)},async(t,n)=>{let r=(e,t)=>{let n=e;for(let[e,r]of Object.entries(t))n=n.replace(RegExp(`\\{${e}\\}`,`g`),encodeURIComponent(String(r)));return n};return{messages:[{role:`assistant`,content:(await e.render(e.input.parse(t),{...p.promptCtx(),link:r})).map(e=>e.type===`text`?{type:`text`,text:e.text}:{type:`text`,text:`See resource: ${e.title??e.uri}\nURI: ${e.uri}`})[0]}],description:e.meta.description}});return s}export{u as createMcpServer};
1
+ import{createMcpServer as e}from"./mcp/createMcpServer.js";export{e as createMcpServer};