@noodleseed/one 0.161.2 → 0.163.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 (315) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +3 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/billing-catalog-ops.d.ts +4 -0
  5. package/dist/commands/billing-catalog-ops.d.ts.map +1 -0
  6. package/dist/commands/billing-catalog-ops.js +58 -0
  7. package/dist/commands/billing-catalog-ops.js.map +1 -0
  8. package/dist/commands/billing-ops.d.ts.map +1 -1
  9. package/dist/commands/billing-ops.js +3 -0
  10. package/dist/commands/billing-ops.js.map +1 -1
  11. package/dist/commands/catalog.d.ts.map +1 -1
  12. package/dist/commands/catalog.js +3 -0
  13. package/dist/commands/catalog.js.map +1 -1
  14. package/dist/commands/config-values.d.ts.map +1 -1
  15. package/dist/commands/config-values.js +16 -0
  16. package/dist/commands/config-values.js.map +1 -1
  17. package/dist/commands/installation-variables.d.ts +26 -0
  18. package/dist/commands/installation-variables.d.ts.map +1 -0
  19. package/dist/commands/installation-variables.js +171 -0
  20. package/dist/commands/installation-variables.js.map +1 -0
  21. package/dist/commands/solutions-activity.d.ts +5 -0
  22. package/dist/commands/solutions-activity.d.ts.map +1 -0
  23. package/dist/commands/solutions-activity.js +116 -0
  24. package/dist/commands/solutions-activity.js.map +1 -0
  25. package/dist/commands/solutions-connections.d.ts +7 -0
  26. package/dist/commands/solutions-connections.d.ts.map +1 -0
  27. package/dist/commands/solutions-connections.js +88 -0
  28. package/dist/commands/solutions-connections.js.map +1 -0
  29. package/dist/commands/solutions-installation-options.d.ts +5 -0
  30. package/dist/commands/solutions-installation-options.d.ts.map +1 -0
  31. package/dist/commands/solutions-installation-options.js +52 -0
  32. package/dist/commands/solutions-installation-options.js.map +1 -0
  33. package/dist/commands/solutions-onboarding.d.ts +5 -0
  34. package/dist/commands/solutions-onboarding.d.ts.map +1 -0
  35. package/dist/commands/solutions-onboarding.js +113 -0
  36. package/dist/commands/solutions-onboarding.js.map +1 -0
  37. package/dist/commands/solutions-ops.d.ts +7 -0
  38. package/dist/commands/solutions-ops.d.ts.map +1 -0
  39. package/dist/commands/solutions-ops.js +544 -0
  40. package/dist/commands/solutions-ops.js.map +1 -0
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1 -1
  44. package/dist/index.js.map +1 -1
  45. package/node_modules/@noodle-borg/admission-limits/dist/counter-store.d.ts +21 -2
  46. package/node_modules/@noodle-borg/admission-limits/dist/counter-store.js +10 -1
  47. package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.d.ts +5 -1
  48. package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.js +31 -2
  49. package/node_modules/@noodle-borg/admission-limits/dist/portable.d.ts +3 -0
  50. package/node_modules/@noodle-borg/admission-limits/dist/portable.js +3 -0
  51. package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.d.ts +28 -0
  52. package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.js +124 -0
  53. package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.d.ts +54 -0
  54. package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.js +74 -0
  55. package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.d.ts +11 -0
  56. package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.js +19 -0
  57. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
  58. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +4 -1
  59. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +5 -5
  60. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +6 -0
  61. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +21 -2
  62. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +1 -1
  63. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  64. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.d.ts +9 -1
  65. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.js +33 -2
  66. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.d.ts +3 -0
  67. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.js +29 -0
  68. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.d.ts +5 -3
  69. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.js +21 -10
  70. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.d.ts +1 -1
  71. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.js +3 -3
  72. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.d.ts +1 -0
  73. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.js +1 -0
  74. package/node_modules/@noodle-borg/assistant-gateway/dist/session-target.js +5 -4
  75. package/node_modules/@noodle-borg/authoring/dist/config.d.ts +20 -0
  76. package/node_modules/@noodle-borg/authoring/dist/config.js +29 -2
  77. package/node_modules/@noodle-borg/authoring/dist/connectors.d.ts +6 -1
  78. package/node_modules/@noodle-borg/authoring/dist/connectors.js +5 -0
  79. package/node_modules/@noodle-borg/authoring/dist/index.d.ts +2 -1
  80. package/node_modules/@noodle-borg/authoring/dist/index.js +1 -0
  81. package/node_modules/@noodle-borg/authoring/dist/json-schema.d.ts +1 -1
  82. package/node_modules/@noodle-borg/authoring/dist/json-schema.js +15 -2
  83. package/node_modules/@noodle-borg/authoring/dist/load-authored.js +1 -1
  84. package/node_modules/@noodle-borg/authoring/dist/managed-collection.d.ts +40 -0
  85. package/node_modules/@noodle-borg/authoring/dist/managed-collection.js +39 -0
  86. package/node_modules/@noodle-borg/authoring/dist/platform.d.ts +3 -0
  87. package/node_modules/@noodle-borg/authoring/dist/platform.js +4 -0
  88. package/node_modules/@noodle-borg/authoring/dist/server-presentation.js +43 -0
  89. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +6 -1
  90. package/node_modules/@noodle-borg/authoring/dist/server.js +5 -43
  91. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-billing.js +18 -0
  92. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-config.js +31 -4
  93. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-solutions.js +778 -0
  94. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-types.js +7 -0
  95. package/node_modules/@noodle-borg/cli-catalog/dist/index.js +20 -0
  96. package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +5 -1
  97. package/node_modules/@noodle-borg/compiler/dist/artifact/catalog-emission.js +3 -1
  98. package/node_modules/@noodle-borg/compiler/dist/artifact/config.js +3 -0
  99. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +26 -0
  100. package/node_modules/@noodle-borg/compiler/dist/artifact/version.d.ts +9 -1
  101. package/node_modules/@noodle-borg/compiler/dist/artifact/version.js +9 -1
  102. package/node_modules/@noodle-borg/compiler/dist/business-variables.d.ts +27 -0
  103. package/node_modules/@noodle-borg/compiler/dist/business-variables.js +230 -0
  104. package/node_modules/@noodle-borg/compiler/dist/compile.js +9 -0
  105. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +1 -1
  106. package/node_modules/@noodle-borg/compiler/dist/index.d.ts +5 -1
  107. package/node_modules/@noodle-borg/compiler/dist/index.js +4 -0
  108. package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.d.ts +52 -0
  109. package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.js +92 -0
  110. package/node_modules/@noodle-borg/compiler/dist/managed-collections.d.ts +50 -0
  111. package/node_modules/@noodle-borg/compiler/dist/managed-collections.js +373 -0
  112. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +114 -36
  113. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +5 -0
  114. package/node_modules/@noodle-borg/compiler/dist/native-record-operations.d.ts +7 -0
  115. package/node_modules/@noodle-borg/compiler/dist/native-record-operations.js +59 -0
  116. package/node_modules/@noodle-borg/connector-defs/dist/compile-http.js +83 -8
  117. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts +31 -1
  118. package/node_modules/@noodle-borg/connector-defs/dist/schema.js +16 -0
  119. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +12 -3
  120. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +41 -2
  121. package/node_modules/@noodle-borg/connector-http/dist/http-response.js +3 -2
  122. package/node_modules/@noodle-borg/connector-http/dist/mcp/config.js +1 -1
  123. package/node_modules/@noodle-borg/connector-http/dist/url-resolution.js +1 -1
  124. package/node_modules/@noodle-borg/control-plane/dist/contracts.d.ts +2 -1
  125. package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.d.ts +3 -0
  126. package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.js +11 -0
  127. package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.d.ts +45 -0
  128. package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.js +74 -0
  129. package/node_modules/@noodle-borg/control-plane/dist/portable.d.ts +1 -0
  130. package/node_modules/@noodle-borg/control-plane/dist/portable.js +1 -0
  131. package/node_modules/@noodle-borg/module/dist/contract.d.ts +20 -0
  132. package/node_modules/@noodle-borg/module/dist/platform-human-identity.d.ts +2 -0
  133. package/node_modules/@noodle-borg/protocol/dist/request-deps.js +1 -0
  134. package/node_modules/@noodle-borg/protocol/dist/request-state.d.ts +1 -0
  135. package/node_modules/@noodle-borg/protocol/dist/request-state.js +11 -2
  136. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts +2 -0
  137. package/node_modules/@noodle-borg/protocol/dist/v2/input-required.js +2 -1
  138. package/node_modules/@noodle-borg/protocol/dist/v2/server.js +2 -1
  139. package/node_modules/@noodle-borg/runtime/dist/ambient-context.js +6 -1
  140. package/node_modules/@noodle-borg/runtime/dist/broker/types.d.ts +2 -0
  141. package/node_modules/@noodle-borg/runtime/dist/business-variables.d.ts +15 -0
  142. package/node_modules/@noodle-borg/runtime/dist/business-variables.js +75 -0
  143. package/node_modules/@noodle-borg/runtime/dist/confirmation-continuation.js +2 -1
  144. package/node_modules/@noodle-borg/runtime/dist/confirmation.js +23 -3
  145. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +17 -1
  146. package/node_modules/@noodle-borg/runtime/dist/connector-snapshot.js +6 -0
  147. package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +18 -3
  148. package/node_modules/@noodle-borg/runtime/dist/execute.js +13 -3
  149. package/node_modules/@noodle-borg/runtime/dist/index.d.ts +2 -0
  150. package/node_modules/@noodle-borg/runtime/dist/index.js +1 -0
  151. package/node_modules/@noodle-borg/runtime/dist/interactive.js +11 -0
  152. package/node_modules/@noodle-borg/runtime/dist/managed-origins.d.ts +3 -1
  153. package/node_modules/@noodle-borg/runtime/dist/managed-origins.js +32 -7
  154. package/node_modules/@noodle-borg/runtime/dist/operation-credential.js +6 -0
  155. package/node_modules/@noodle-borg/runtime/dist/operation-evidence.d.ts +30 -0
  156. package/node_modules/@noodle-borg/runtime/dist/operation-evidence.js +68 -0
  157. package/node_modules/@noodle-borg/runtime/dist/operation-execution.d.ts +2 -2
  158. package/node_modules/@noodle-borg/runtime/dist/operation-execution.js +142 -71
  159. package/node_modules/@noodle-borg/runtime/dist/result.d.ts +6 -4
  160. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.d.ts +7 -0
  161. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.js +48 -4
  162. package/node_modules/@noodle-borg/service/dist/admission.js +2 -1
  163. package/node_modules/@noodle-borg/service/dist/application-activity.js +236 -0
  164. package/node_modules/@noodle-borg/service/dist/application-business-notice.js +28 -0
  165. package/node_modules/@noodle-borg/service/dist/application-runtime-target.js +141 -0
  166. package/node_modules/@noodle-borg/service/dist/application-settings-targets.js +72 -0
  167. package/node_modules/@noodle-borg/service/dist/application-settings.js +210 -0
  168. package/node_modules/@noodle-borg/service/dist/business-api-admission.js +121 -0
  169. package/node_modules/@noodle-borg/service/dist/business-information/activity-pagination.js +73 -0
  170. package/node_modules/@noodle-borg/service/dist/business-information/business-notice.d.ts +24 -0
  171. package/node_modules/@noodle-borg/service/dist/business-information/business-notice.js +18 -0
  172. package/node_modules/@noodle-borg/service/dist/business-information/collection-controls.js +51 -0
  173. package/node_modules/@noodle-borg/service/dist/business-information/contracts.d.ts +439 -0
  174. package/node_modules/@noodle-borg/service/dist/business-information/contracts.js +5 -0
  175. package/node_modules/@noodle-borg/service/dist/business-information/definition-resolver.js +94 -0
  176. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-installation-lifecycle.js +136 -0
  177. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-invitations.js +160 -0
  178. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-locks.js +23 -0
  179. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-store.js +557 -0
  180. package/node_modules/@noodle-borg/service/dist/business-information/installation-capacity.js +10 -0
  181. package/node_modules/@noodle-borg/service/dist/business-information/invitations.js +68 -0
  182. package/node_modules/@noodle-borg/service/dist/business-information/legacy-request-migration.js +60 -0
  183. package/node_modules/@noodle-borg/service/dist/business-information/managed-releases.js +245 -0
  184. package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-blueprints.js +51 -0
  185. package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-executable.js +76 -0
  186. package/node_modules/@noodle-borg/service/dist/business-information/model.js +393 -0
  187. package/node_modules/@noodle-borg/service/dist/business-information/native-query.js +162 -0
  188. package/node_modules/@noodle-borg/service/dist/business-information/native-storage-budget.js +60 -0
  189. package/node_modules/@noodle-borg/service/dist/business-information/pagination.js +78 -0
  190. package/node_modules/@noodle-borg/service/dist/business-information/portable.js +15 -0
  191. package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.d.ts +11 -0
  192. package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.js +42 -0
  193. package/node_modules/@noodle-borg/service/dist/business-information/profiles.js +252 -0
  194. package/node_modules/@noodle-borg/service/dist/business-information/reader-floor.js +26 -0
  195. package/node_modules/@noodle-borg/service/dist/business-information/source-credential-fence.js +79 -0
  196. package/node_modules/@noodle-borg/service/dist/business-information/source-custody-budget.js +30 -0
  197. package/node_modules/@noodle-borg/service/dist/business-information/source-custody-memory.js +122 -0
  198. package/node_modules/@noodle-borg/service/dist/business-information/source-executor.js +191 -0
  199. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-contracts.js +2 -0
  200. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-coordinator.js +136 -0
  201. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-failures.js +32 -0
  202. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-state.js +154 -0
  203. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-store.js +568 -0
  204. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-types.js +26 -0
  205. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-values.js +59 -0
  206. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-pagination.js +54 -0
  207. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-validation.js +163 -0
  208. package/node_modules/@noodle-borg/service/dist/business-information/source-refresh-retention.js +29 -0
  209. package/node_modules/@noodle-borg/service/dist/business-information/validation.js +200 -0
  210. package/node_modules/@noodle-borg/service/dist/business-information-runtime.js +80 -0
  211. package/node_modules/@noodle-borg/service/dist/business-onboarding.js +73 -0
  212. package/node_modules/@noodle-borg/service/dist/connections/types.js +8 -0
  213. package/node_modules/@noodle-borg/service/dist/credential-binding-index.js +38 -33
  214. package/node_modules/@noodle-borg/service/dist/deployment-execution.js +275 -0
  215. package/node_modules/@noodle-borg/service/dist/external-credential-binding-broker.js +19 -1
  216. package/node_modules/@noodle-borg/service/dist/external-credential-exchange.d.ts +16 -1
  217. package/node_modules/@noodle-borg/service/dist/modules/host.js +4 -1
  218. package/node_modules/@noodle-borg/service/dist/native-record-connector.d.ts +20 -0
  219. package/node_modules/@noodle-borg/service/dist/native-record-connector.js +206 -0
  220. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts +5 -2
  221. package/node_modules/@noodle-borg/service/dist/operation-evidence.js +89 -0
  222. package/node_modules/@noodle-borg/service/dist/recovery-quarantine.js +49 -0
  223. package/node_modules/@noodle-borg/service/dist/registry-compile.js +60 -11
  224. package/node_modules/@noodle-borg/service/dist/registry-deploy-transaction.js +18 -0
  225. package/node_modules/@noodle-borg/service/dist/registry-rollback.js +2 -1
  226. package/node_modules/@noodle-borg/service/dist/registry-state.d.ts +1 -1
  227. package/node_modules/@noodle-borg/service/dist/registry-state.js +6 -3
  228. package/node_modules/@noodle-borg/service/dist/registry-targets.js +49 -0
  229. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +2 -0
  230. package/node_modules/@noodle-borg/service/dist/registry.d.ts +15 -3
  231. package/node_modules/@noodle-borg/service/dist/registry.js +177 -137
  232. package/node_modules/@noodle-borg/service/dist/routes/assistant-appearance.js +3 -2
  233. package/node_modules/@noodle-borg/service/dist/routes/assistant-clients.js +2 -1
  234. package/node_modules/@noodle-borg/service/dist/routes/assistant-doctor.js +2 -1
  235. package/node_modules/@noodle-borg/service/dist/routes/assistant-embeds.js +8 -3
  236. package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.js +1 -1
  237. package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +48 -36
  238. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-configuration.js +3 -2
  239. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-session.js +10 -10
  240. package/node_modules/@noodle-borg/service/dist/routes/assistant-session-target.js +32 -3
  241. package/node_modules/@noodle-borg/service/dist/routes/assistant-suggestions.js +1 -1
  242. package/node_modules/@noodle-borg/service/dist/routes/assistant-transcript.js +1 -1
  243. package/node_modules/@noodle-borg/service/dist/routes/assistant.js +10 -10
  244. package/node_modules/@noodle-borg/service/dist/routes/business-information-activity.js +83 -0
  245. package/node_modules/@noodle-borg/service/dist/routes/business-information-admission.js +26 -0
  246. package/node_modules/@noodle-borg/service/dist/routes/business-information-channels.js +153 -0
  247. package/node_modules/@noodle-borg/service/dist/routes/business-information-connections.js +107 -0
  248. package/node_modules/@noodle-borg/service/dist/routes/business-information-dispatch.js +131 -0
  249. package/node_modules/@noodle-borg/service/dist/routes/business-information-external.js +79 -0
  250. package/node_modules/@noodle-borg/service/dist/routes/business-information-installation.js +24 -0
  251. package/node_modules/@noodle-borg/service/dist/routes/business-information-notice.js +69 -0
  252. package/node_modules/@noodle-borg/service/dist/routes/business-information-onboarding.js +58 -0
  253. package/node_modules/@noodle-borg/service/dist/routes/business-information-paths.js +168 -0
  254. package/node_modules/@noodle-borg/service/dist/routes/business-information-public.js +151 -0
  255. package/node_modules/@noodle-borg/service/dist/routes/business-information-reader-floor.js +15 -0
  256. package/node_modules/@noodle-borg/service/dist/routes/business-information-record-create.js +29 -0
  257. package/node_modules/@noodle-borg/service/dist/routes/business-information-record-reads.js +36 -0
  258. package/node_modules/@noodle-borg/service/dist/routes/business-information-request.js +64 -0
  259. package/node_modules/@noodle-borg/service/dist/routes/business-information-settings.js +64 -0
  260. package/node_modules/@noodle-borg/service/dist/routes/business-information-source.js +249 -0
  261. package/node_modules/@noodle-borg/service/dist/routes/business-information-staff.js +258 -0
  262. package/node_modules/@noodle-borg/service/dist/routes/business-information-wire.js +317 -0
  263. package/node_modules/@noodle-borg/service/dist/routes/business-information.js +592 -0
  264. package/node_modules/@noodle-borg/service/dist/routes/config-values-dispatch.js +1 -1
  265. package/node_modules/@noodle-borg/service/dist/routes/config-values.js +26 -4
  266. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +19 -233
  267. package/node_modules/@noodle-borg/service/dist/routes/deployment-activation-response.js +13 -4
  268. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +6 -0
  269. package/node_modules/@noodle-borg/service/dist/service.js +77 -6
  270. package/node_modules/@noodle-borg/service/dist/solution-installation-activation.js +149 -0
  271. package/node_modules/@noodle-borg/service/dist/source-configuration-authority.js +94 -0
  272. package/node_modules/@noodle-borg/service/dist/state-catalog.js +6 -5
  273. package/node_modules/@noodle-borg/service/dist/store/config-values.d.ts +42 -17
  274. package/node_modules/@noodle-borg/service/dist/store/config-values.js +123 -24
  275. package/node_modules/@noodle-borg/service/dist/store/in-memory.d.ts +1 -0
  276. package/node_modules/@noodle-borg/service/dist/store/in-memory.js +3 -0
  277. package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +1 -0
  278. package/node_modules/@noodle-borg/service/dist/store/json-file.js +3 -0
  279. package/node_modules/@noodle-borg/service/dist/store.d.ts +3 -1
  280. package/node_modules/@noodle-borg/service/package.json +2 -2
  281. package/node_modules/@noodle-borg/transport-http/dist/serve-request.js +9 -0
  282. package/node_modules/@noodle-borg/transport-http/package.json +1 -0
  283. package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.d.ts +143 -0
  284. package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.js +90 -0
  285. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.d.ts +130 -0
  286. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.js +77 -0
  287. package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.d.ts +105 -0
  288. package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.js +67 -0
  289. package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.d.ts +27 -0
  290. package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.js +28 -0
  291. package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.d.ts +112 -0
  292. package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.js +88 -0
  293. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts +1 -1
  294. package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.d.ts +62 -0
  295. package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.js +57 -0
  296. package/node_modules/@noodle-borg/wire-contracts/dist/billing-enforcement.d.ts +12 -12
  297. package/node_modules/@noodle-borg/wire-contracts/dist/billing-metering.d.ts +4 -4
  298. package/node_modules/@noodle-borg/wire-contracts/dist/billing-org-transfer.d.ts +3 -3
  299. package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.d.ts +25 -0
  300. package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.js +37 -0
  301. package/node_modules/@noodle-borg/wire-contracts/dist/business-information.d.ts +2241 -0
  302. package/node_modules/@noodle-borg/wire-contracts/dist/business-information.js +580 -0
  303. package/node_modules/@noodle-borg/wire-contracts/dist/control-plane.d.ts +2 -2
  304. package/node_modules/@noodle-borg/wire-contracts/dist/distribution.d.ts +5 -5
  305. package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +12 -3
  306. package/node_modules/@noodle-borg/wire-contracts/dist/index.js +9 -0
  307. package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts +6 -6
  308. package/node_modules/@noodle-borg/wire-contracts/dist/managed-assistant-sponsorship.d.ts +15 -15
  309. package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.d.ts +5 -0
  310. package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.js +1 -0
  311. package/node_modules/@noodle-borg/wire-contracts/dist/platform-auth.d.ts +66 -66
  312. package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.d.ts +143 -0
  313. package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.js +94 -0
  314. package/node_modules/@noodleseed/assistant/README.md +5 -0
  315. package/package.json +2 -2
@@ -0,0 +1,393 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { projectManagedCollectionControls, validateJsonSchema, validateManagedCollectionControls, } from '@noodle-borg/compiler';
3
+ import { collectionControlEnabled, creationPayload, patchedPayload, } from './collection-controls.js';
4
+ import { collectionForStoredRecord, resolveManagedInstallation, } from './managed-releases.js';
5
+ import { builtInDefinition } from './profiles.js';
6
+ import { PayloadValidationError, validateEmail, validateManagedPayload, validateRetentionDays, validateRevision, validateScalar, validateScope, } from './validation.js';
7
+ const ROLE_PERMISSIONS = {
8
+ administrator: [
9
+ 'installation:administer',
10
+ 'grants:manage',
11
+ 'records:create',
12
+ 'records:read',
13
+ 'records:update',
14
+ 'records:assign',
15
+ 'records:status',
16
+ 'records:note',
17
+ 'records:delete',
18
+ 'records:export',
19
+ ],
20
+ manager: [
21
+ 'records:create',
22
+ 'records:read',
23
+ 'records:update',
24
+ 'records:assign',
25
+ 'records:status',
26
+ 'records:note',
27
+ 'records:export',
28
+ ],
29
+ operator: [
30
+ 'records:create',
31
+ 'records:read',
32
+ 'records:update',
33
+ 'records:assign',
34
+ 'records:status',
35
+ 'records:note',
36
+ ],
37
+ viewer: ['records:read'],
38
+ };
39
+ export function permissionsForBusinessRole(role) {
40
+ const permissions = ROLE_PERMISSIONS[role];
41
+ if (permissions === undefined)
42
+ throw new Error(`unknown business role "${String(role)}"`);
43
+ return permissions;
44
+ }
45
+ export function businessGrantAllows(grant, permission) {
46
+ return (grant !== undefined &&
47
+ grant.revokedAt === undefined &&
48
+ permissionsForBusinessRole(grant.role).includes(permission));
49
+ }
50
+ export function normalizeInstallationInput(input) {
51
+ const scope = { ...validateScope(input.scope) };
52
+ if ((input.profileKey === undefined) === (input.definition === undefined)) {
53
+ throw new Error('installation requires exactly one managed profile or private definition');
54
+ }
55
+ const definition = input.definition ??
56
+ builtInDefinition(input.profileKey);
57
+ validateDefinition(definition);
58
+ const managedCollections = [...new Set(input.managedCollections)].sort();
59
+ for (const collectionKey of managedCollections) {
60
+ if (!definition.collections.some((collection) => collection.key === collectionKey)) {
61
+ throw new Error(`collection "${collectionKey}" is not declared by the installed definition`);
62
+ }
63
+ }
64
+ const profileKey = input.profileKey ??
65
+ (definition.reference.kind === 'private'
66
+ ? definition.reference.app
67
+ : definition.reference.definitionId);
68
+ const profileVersion = definition.reference.kind === 'private'
69
+ ? parseDefinitionVersion(definition.reference.version)
70
+ : definition.reference.release;
71
+ return {
72
+ scope,
73
+ profileKey,
74
+ profileVersion,
75
+ definition: structuredClone(definition),
76
+ managedCollections,
77
+ retentionDays: validateRetentionDays(input.retentionDays),
78
+ actorSubject: validateScalar('actor subject', input.actorSubject, 256),
79
+ ...(input.actorEmail === undefined ? {} : { actorEmail: validateEmail(input.actorEmail) }),
80
+ };
81
+ }
82
+ export function installationFingerprint(input) {
83
+ const definitionIntent = input.definition.reference.kind === 'managed'
84
+ ? { managedDefinitionId: input.definition.reference.definitionId }
85
+ : { profileVersion: input.profileVersion, definition: input.definition };
86
+ return digest({
87
+ scope: input.scope,
88
+ profileKey: input.profileKey,
89
+ ...definitionIntent,
90
+ managedCollections: input.managedCollections,
91
+ retentionDays: input.retentionDays,
92
+ actorSubject: input.actorSubject,
93
+ ...(input.definition.reference.kind === 'managed' ? {} : { actorEmail: input.actorEmail }),
94
+ });
95
+ }
96
+ /** Compatibility for rows whose pre-update fingerprint included the resolved managed release. */
97
+ export function managedInstallationIntentMatches(existing, input) {
98
+ const existingReference = existing.definition.reference;
99
+ const inputReference = input.definition.reference;
100
+ return (existingReference.kind === 'managed' &&
101
+ inputReference.kind === 'managed' &&
102
+ existingReference.definitionId === inputReference.definitionId &&
103
+ digest(existing.scope) === digest(input.scope) &&
104
+ existing.profileKey === input.profileKey &&
105
+ digest([...existing.managedCollections].sort()) === digest(input.managedCollections) &&
106
+ existing.retentionDays === input.retentionDays &&
107
+ existing.createdBySubject === input.actorSubject);
108
+ }
109
+ export function requestFingerprint(input) {
110
+ return digest(input);
111
+ }
112
+ export function idempotencyDigest(value) {
113
+ return digest(validateScalar('idempotency key', value, 128));
114
+ }
115
+ export function validateCollectionEnabled(installation, collectionKey) {
116
+ const normalized = validateScalar('collection key', collectionKey, 64);
117
+ if (!installation.managedCollections.includes(normalized)) {
118
+ throw new Error(`managed collection "${normalized}" is not enabled for this installation`);
119
+ }
120
+ const collection = installation.definition.collections.find((candidate) => candidate.key === normalized);
121
+ if (collection === undefined)
122
+ throw new Error(`managed collection "${normalized}" is missing from the installed definition`);
123
+ return collection;
124
+ }
125
+ export function initialRecord(input) {
126
+ const collection = validateCollectionEnabled(input.installation, input.collectionKey);
127
+ if (collection.authority.authority !== 'native') {
128
+ throw new Error(`managed collection "${collection.key}" is externally authoritative and read-only`);
129
+ }
130
+ const payload = creationPayload(collection, input.payload, input.publicInput === true || input.origin.kind === 'embedded');
131
+ const actor = validateScalar('actor subject', input.actorSubject, 256);
132
+ const id = validateScalar('record id', input.id, 128);
133
+ const createdAt = input.now.toISOString();
134
+ return {
135
+ scope: { ...input.installation.scope },
136
+ collectionKey: collection.key,
137
+ id,
138
+ profileKey: input.installation.profileKey,
139
+ profileVersion: input.installation.profileVersion,
140
+ schemaVersion: collection.schemaVersion,
141
+ schemaDigest: collection.schemaDigest,
142
+ ...(collection.behavior?.kind === 'request' ? { status: 'new' } : {}),
143
+ origin: normalizeOrigin(input.origin),
144
+ revision: 1,
145
+ retentionExpiresAt: new Date(input.now.getTime() + input.installation.retentionDays * 24 * 60 * 60 * 1000).toISOString(),
146
+ createdAt,
147
+ createdBySubject: actor,
148
+ updatedAt: createdAt,
149
+ updatedBySubject: actor,
150
+ content: { payload, notes: [] },
151
+ };
152
+ }
153
+ export function applyRequestOperation(current, collection, operation, actorSubject, now, noteId) {
154
+ if (current.deletedAt !== undefined || current.content === undefined)
155
+ return undefined;
156
+ if (collection.authority.authority !== 'native')
157
+ return undefined;
158
+ const actor = validateScalar('actor subject', actorSubject, 256);
159
+ const revision = current.revision + 1;
160
+ const updatedAt = now.toISOString();
161
+ if (operation.kind === 'update') {
162
+ const payload = validateCollectionPayload(collection, patchedPayload(collection, current.content.payload, operation.payload, operation.unset));
163
+ return {
164
+ record: cloneRecord({
165
+ ...current,
166
+ revision,
167
+ updatedAt,
168
+ updatedBySubject: actor,
169
+ content: { payload, notes: current.content.notes },
170
+ }),
171
+ activityKind: 'updated',
172
+ };
173
+ }
174
+ if (operation.kind === 'assign') {
175
+ if (!collectionControlEnabled(collection, 'assignment'))
176
+ return undefined;
177
+ const assignee = operation.assigneeSubject === undefined
178
+ ? undefined
179
+ : validateScalar('assignee subject', operation.assigneeSubject, 256);
180
+ const { assigneeSubject: ignoredAssignee, ...withoutAssignee } = current;
181
+ void ignoredAssignee;
182
+ return {
183
+ record: cloneRecord({
184
+ ...withoutAssignee,
185
+ ...(assignee === undefined ? {} : { assigneeSubject: assignee }),
186
+ revision,
187
+ updatedAt,
188
+ updatedBySubject: actor,
189
+ }),
190
+ activityKind: 'assigned',
191
+ };
192
+ }
193
+ if (operation.kind === 'set_status') {
194
+ if (collection.behavior?.kind !== 'request' || current.status === undefined)
195
+ return undefined;
196
+ if (!validStatusTransition(current.status, operation.status))
197
+ return undefined;
198
+ return {
199
+ record: cloneRecord({
200
+ ...current,
201
+ status: operation.status,
202
+ revision,
203
+ updatedAt,
204
+ updatedBySubject: actor,
205
+ }),
206
+ activityKind: 'status_changed',
207
+ };
208
+ }
209
+ if (!collectionControlEnabled(collection, 'notes'))
210
+ return undefined;
211
+ const note = validateNote(operation.note);
212
+ if (current.content.notes.length >= 50)
213
+ throw new PayloadValidationError('array_too_large', 'A record cannot have more than 50 notes.');
214
+ return {
215
+ record: cloneRecord({
216
+ ...current,
217
+ revision,
218
+ updatedAt,
219
+ updatedBySubject: actor,
220
+ content: {
221
+ payload: current.content.payload,
222
+ notes: [
223
+ ...current.content.notes,
224
+ {
225
+ id: validateScalar('note id', noteId(), 128),
226
+ text: note,
227
+ createdAt: updatedAt,
228
+ createdBySubject: actor,
229
+ },
230
+ ],
231
+ },
232
+ }),
233
+ activityKind: 'note_added',
234
+ };
235
+ }
236
+ export function validateStoredRecord(installation, record) {
237
+ const collection = collectionForStoredRecord(installation, record);
238
+ if (record.content !== undefined)
239
+ validateCollectionPayload(collection, record.content.payload);
240
+ return collection;
241
+ }
242
+ export function deletedRecord(current, actorSubject, now, reason) {
243
+ const actor = validateScalar('actor subject', actorSubject, 256);
244
+ const deletedAt = now.toISOString();
245
+ const { content: ignoredContent, ...metadata } = current;
246
+ void ignoredContent;
247
+ return cloneRecord({
248
+ ...metadata,
249
+ origin: { kind: current.origin.kind },
250
+ revision: current.revision + 1,
251
+ updatedAt: deletedAt,
252
+ updatedBySubject: actor,
253
+ deletedAt,
254
+ deletionReason: reason,
255
+ });
256
+ }
257
+ export function activityFromRecord(record, kind) {
258
+ return {
259
+ scope: { ...record.scope },
260
+ collectionKey: record.collectionKey,
261
+ recordId: record.id,
262
+ revision: record.revision,
263
+ kind,
264
+ ...(record.status === undefined ? {} : { status: record.status }),
265
+ ...(record.assigneeSubject === undefined ? {} : { assigneeSubject: record.assigneeSubject }),
266
+ occurredAt: record.updatedAt,
267
+ actorSubject: record.updatedBySubject,
268
+ ...(record.content === undefined ? {} : { content: cloneContent(record.content) }),
269
+ };
270
+ }
271
+ export function cloneRecord(record) {
272
+ return {
273
+ ...record,
274
+ ...(record.originalSchema === undefined
275
+ ? {}
276
+ : { originalSchema: { ...record.originalSchema } }),
277
+ scope: { ...record.scope },
278
+ origin: { ...record.origin },
279
+ ...(record.content === undefined ? {} : { content: cloneContent(record.content) }),
280
+ };
281
+ }
282
+ export function cloneContent(content) {
283
+ return {
284
+ payload: structuredClone(content.payload),
285
+ notes: content.notes.map((note) => ({ ...note })),
286
+ };
287
+ }
288
+ export function cloneInstallation(installation) {
289
+ return {
290
+ ...installation,
291
+ scope: { ...installation.scope },
292
+ managedCollections: [...installation.managedCollections],
293
+ definition: structuredClone(installation.definition),
294
+ };
295
+ }
296
+ /**
297
+ * Managed verticals are one centrally released application definition. Existing installations keep
298
+ * identity, grants, records and retention while compatible catalog releases update their effective
299
+ * collections for every customer on the next read. Private and legacy definitions stay pinned.
300
+ */
301
+ export function effectiveInstallation(installation, resolveCurrent) {
302
+ return resolveManagedInstallation(installation, resolveCurrent);
303
+ }
304
+ export function cloneGrant(grant) {
305
+ return { ...grant, scope: { ...grant.scope } };
306
+ }
307
+ export function cloneActivity(activity) {
308
+ return {
309
+ ...activity,
310
+ scope: { ...activity.scope },
311
+ ...(activity.content === undefined ? {} : { content: cloneContent(activity.content) }),
312
+ };
313
+ }
314
+ export function validateExpectedRevision(value) {
315
+ return validateRevision(value);
316
+ }
317
+ function normalizeOrigin(origin) {
318
+ const kinds = ['embedded', 'mcp', 'portal', 'api', 'import'];
319
+ if (!kinds.includes(origin.kind))
320
+ throw new Error('unsupported managed request origin');
321
+ return {
322
+ kind: origin.kind,
323
+ ...(origin.reference === undefined
324
+ ? {}
325
+ : { reference: validateScalar('origin reference', origin.reference, 256) }),
326
+ };
327
+ }
328
+ function validateNote(note) {
329
+ const normalized = note.trim();
330
+ if (!normalized || normalized.length > 4_000 || normalized.includes('\0'))
331
+ throw new PayloadValidationError('string_too_long', 'A note must contain 1 to 4,000 characters.');
332
+ validateManagedPayload({ note: normalized });
333
+ return normalized;
334
+ }
335
+ function validStatusTransition(from, to) {
336
+ if (from === to)
337
+ return true;
338
+ if (from === 'closed')
339
+ return false;
340
+ if (from === 'resolved')
341
+ return to === 'in_progress' || to === 'closed';
342
+ return to === 'new' || to === 'in_progress' || to === 'resolved' || to === 'closed';
343
+ }
344
+ export function validateCollectionPayload(collection, value) {
345
+ const payload = validateManagedPayload(value);
346
+ const issues = validateJsonSchema(collection.recordSchema, payload);
347
+ if (issues.length > 0) {
348
+ throw new PayloadValidationError('invalid_json', `managed payload does not match collection schema: ${issues[0]?.message ?? 'invalid value'}`);
349
+ }
350
+ return payload;
351
+ }
352
+ function validateDefinition(definition) {
353
+ validateScalar('definition title', definition.title, 120);
354
+ validateScalar('definition description', definition.description, 1000);
355
+ if (definition.collections.length > 16) {
356
+ throw new Error('definition may declare at most sixteen collections');
357
+ }
358
+ const keys = new Set();
359
+ for (const collection of definition.collections) {
360
+ const issues = [];
361
+ validateManagedCollectionControls(projectManagedCollectionControls(collection), collection.recordSchema, collection.authority.authority === 'external', `collections.${collection.key}`, issues);
362
+ if (issues.length > 0)
363
+ throw new Error(issues[0]?.message ?? 'invalid collection controls');
364
+ validateScalar('collection key', collection.key, 64);
365
+ if (keys.has(collection.key))
366
+ throw new Error(`duplicate collection "${collection.key}"`);
367
+ keys.add(collection.key);
368
+ if (!/^[a-f0-9]{64}$/.test(collection.schemaDigest.replace(/^sha256:/, ''))) {
369
+ throw new Error(`collection "${collection.key}" has an invalid schema digest`);
370
+ }
371
+ }
372
+ }
373
+ function parseDefinitionVersion(version) {
374
+ const [major] = version.split('.');
375
+ const parsed = Number(major);
376
+ return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : 1;
377
+ }
378
+ function digest(value) {
379
+ return createHash('sha256').update(stableJson(value)).digest('hex');
380
+ }
381
+ function stableJson(value) {
382
+ if (Array.isArray(value))
383
+ return `[${value.map(stableJson).join(',')}]`;
384
+ if (value !== null && typeof value === 'object') {
385
+ return `{${Object.entries(value)
386
+ .filter(([, entry]) => entry !== undefined)
387
+ .sort(([left], [right]) => left.localeCompare(right))
388
+ .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)
389
+ .join(',')}}`;
390
+ }
391
+ return JSON.stringify(value);
392
+ }
393
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1,162 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { canonicalJson, validateJsonSchema } from '@noodle-borg/compiler';
3
+ import { MANAGED_RECORD_QUERY_SCAN_LIMIT, ManagedRecordQuerySchema, } from '@noodle-borg/wire-contracts';
4
+ import { cloneRecord } from './model.js';
5
+ import { compareRecords, scopeKey } from './pagination.js';
6
+ import { boundedPageSize, CursorValidationError } from './validation.js';
7
+ export class NativeQueryError extends Error {
8
+ code;
9
+ constructor(code, message) {
10
+ super(message);
11
+ this.code = code;
12
+ }
13
+ }
14
+ export async function planNativeQuery(input, collection, now, loadAnchor) {
15
+ const parsed = ManagedRecordQuerySchema.safeParse({
16
+ ...(input.filters === undefined ? {} : { filters: input.filters }),
17
+ ...(input.sortField === undefined ? {} : { sortField: input.sortField }),
18
+ ...(input.sortDirection === undefined ? {} : { sortDirection: input.sortDirection }),
19
+ ...(input.createdAtFrom === undefined ? {} : { createdAtFrom: input.createdAtFrom }),
20
+ ...(input.createdAtTo === undefined ? {} : { createdAtTo: input.createdAtTo }),
21
+ });
22
+ if (!parsed.success)
23
+ throw new NativeQueryError('invalid_query', 'Invalid bounded collection query.');
24
+ const properties = collection.recordSchema.properties;
25
+ for (const filter of parsed.data.filters ?? []) {
26
+ if (!collection.filterFields?.includes(filter.field))
27
+ throw new NativeQueryError('invalid_query', 'Filter field must be declared in filterFields.');
28
+ if (validateJsonSchema(properties?.[filter.field], filter.value)
29
+ .length > 0)
30
+ throw new NativeQueryError('invalid_query', 'Filter value must match its field schema.');
31
+ }
32
+ if (input.sortField !== undefined && !collection.sortFields?.includes(input.sortField))
33
+ throw new NativeQueryError('invalid_query', 'Sort field must be declared in sortFields.');
34
+ const normalized = {
35
+ ...input,
36
+ filters: [...(parsed.data.filters ?? [])].sort((a, b) => a.field.localeCompare(b.field)),
37
+ ...(input.sortField === undefined
38
+ ? {}
39
+ : { sortDirection: input.sortDirection ?? 'asc' }),
40
+ ...(input.createdAtFrom === undefined
41
+ ? {}
42
+ : { createdAtFrom: new Date(input.createdAtFrom).toISOString() }),
43
+ ...(input.createdAtTo === undefined
44
+ ? {}
45
+ : { createdAtTo: new Date(input.createdAtTo).toISOString() }),
46
+ };
47
+ const limit = boundedPageSize(input.limit);
48
+ const digest = createHash('sha256')
49
+ .update(canonicalJson({
50
+ scope: scopeKey(input.scope),
51
+ collection: collection.key,
52
+ schema: collection.schemaDigest,
53
+ filters: normalized.filters,
54
+ sortField: input.sortField ?? null,
55
+ sortDirection: normalized.sortDirection ?? null,
56
+ createdAtFrom: normalized.createdAtFrom ?? null,
57
+ createdAtTo: normalized.createdAtTo ?? null,
58
+ status: input.status ?? null,
59
+ assigneeSubject: input.assigneeSubject ?? null,
60
+ includeDeleted: input.includeDeleted === true,
61
+ }))
62
+ .digest('hex');
63
+ const cursor = input.cursor === undefined ? undefined : readQueryCursor(input.cursor, digest, now);
64
+ const anchor = cursor === undefined ? undefined : await loadAnchor(cursor.lastId);
65
+ if (cursor !== undefined && (anchor === undefined || anchor.revision !== cursor.lastRevision))
66
+ throw new CursorValidationError('cursor anchor changed or was deleted; restart this query');
67
+ return {
68
+ input: normalized,
69
+ limit,
70
+ digest,
71
+ payloadQuery: normalized.filters.length > 0 || input.sortField !== undefined,
72
+ snapshotAt: cursor?.snapshotAt ?? now.toISOString(),
73
+ ...(anchor === undefined ? {} : { anchor }),
74
+ };
75
+ }
76
+ function readQueryCursor(encoded, digest, now) {
77
+ try {
78
+ if (encoded.length > 2048)
79
+ throw new Error();
80
+ const value = JSON.parse(Buffer.from(encoded, 'base64url').toString());
81
+ if (value === null || typeof value !== 'object')
82
+ throw new Error();
83
+ const cursor = value;
84
+ if (cursor.version !== 2 ||
85
+ cursor.digest !== digest ||
86
+ typeof cursor.lastId !== 'string' ||
87
+ cursor.lastId.length > 128 ||
88
+ typeof cursor.lastRevision !== 'number' ||
89
+ !Number.isSafeInteger(cursor.lastRevision) ||
90
+ cursor.lastRevision < 1 ||
91
+ typeof cursor.snapshotAt !== 'string' ||
92
+ !Number.isFinite(Date.parse(cursor.snapshotAt)) ||
93
+ Date.parse(cursor.snapshotAt) > now.getTime())
94
+ throw new Error();
95
+ return cursor;
96
+ }
97
+ catch {
98
+ throw new CursorValidationError('cursor does not belong to this query and schema');
99
+ }
100
+ }
101
+ export function matchesNativeQueryMetadata(record, plan, now) {
102
+ const input = plan.input;
103
+ return (scopeKey(record.scope) === scopeKey(input.scope) &&
104
+ record.collectionKey === input.collectionKey &&
105
+ (input.includeDeleted === true || record.deletedAt === undefined) &&
106
+ (record.deletedAt !== undefined || record.retentionExpiresAt > now.toISOString()) &&
107
+ (input.status === undefined || record.status === input.status) &&
108
+ (input.assigneeSubject === undefined || record.assigneeSubject === input.assigneeSubject) &&
109
+ record.createdAt <= plan.snapshotAt &&
110
+ (input.createdAtFrom === undefined || record.createdAt >= input.createdAtFrom) &&
111
+ (input.createdAtTo === undefined || record.createdAt <= input.createdAtTo));
112
+ }
113
+ /** Source is already scoped/date filtered and createdAt/id ordered; retains only page + one candidates. */
114
+ export async function runNativeQuery(plan, source) {
115
+ const selected = [];
116
+ let scanned = 0;
117
+ for await (const record of source) {
118
+ if (plan.payloadQuery && ++scanned > MANAGED_RECORD_QUERY_SCAN_LIMIT)
119
+ throw new NativeQueryError('query_limit_exceeded', 'This query exceeds 10,000 scanned records. Narrow createdAtFrom/createdAtTo and retry.');
120
+ if (!plan.input.filters?.every((filter) => record.content?.payload[filter.field] === filter.value))
121
+ continue;
122
+ if (plan.anchor !== undefined && compareQueryRecords(record, plan.anchor, plan) <= 0)
123
+ continue;
124
+ selected.push(record);
125
+ selected.sort((a, b) => compareQueryRecords(a, b, plan));
126
+ if (selected.length > plan.limit + 1)
127
+ selected.pop();
128
+ if (!plan.payloadQuery && selected.length > plan.limit)
129
+ break;
130
+ }
131
+ const records = selected.slice(0, plan.limit).map(cloneRecord);
132
+ const last = records.at(-1);
133
+ return {
134
+ records,
135
+ ...(selected.length > plan.limit && last !== undefined
136
+ ? {
137
+ nextCursor: Buffer.from(JSON.stringify({
138
+ version: 2,
139
+ digest: plan.digest,
140
+ snapshotAt: plan.snapshotAt,
141
+ lastId: last.id,
142
+ lastRevision: last.revision,
143
+ })).toString('base64url'),
144
+ }
145
+ : {}),
146
+ };
147
+ }
148
+ function compareQueryRecords(a, b, plan) {
149
+ const field = plan.input.sortField;
150
+ if (field === undefined)
151
+ return compareRecords(a, b);
152
+ const left = a.content?.payload[field];
153
+ const right = b.content?.payload[field];
154
+ // Missing historical/optional fields sort last in both directions.
155
+ if (left === undefined || left === null)
156
+ return right === undefined || right === null ? compareRecords(a, b) : 1;
157
+ if (right === undefined || right === null)
158
+ return -1;
159
+ const compared = left === right ? 0 : left < right ? -1 : 1;
160
+ return (plan.input.sortDirection === 'desc' ? -compared : compared) || compareRecords(a, b);
161
+ }
162
+ //# sourceMappingURL=native-query.js.map
@@ -0,0 +1,60 @@
1
+ /** Engineering bound, not a commercial storage allowance or estimate of disk/WAL usage. */
2
+ export const NATIVE_RETAINED_BYTES_LIMIT = 1024 ** 3;
3
+ /** Prepaid by every live record; funds the bounded terminal receipt even at the ceiling. */
4
+ export const NATIVE_TERMINAL_RESERVE_BYTES = 16 * 1024;
5
+ export class NativeStorageLimitError extends Error {
6
+ code = 'managed_record_storage_limit';
7
+ constructor() {
8
+ super('Managed record storage is full. Erase retained records to reclaim capacity.');
9
+ this.name = 'NativeStorageLimitError';
10
+ }
11
+ }
12
+ /** Local/test accounting uses its plaintext serialized representation; PostgreSQL counts ciphertext. */
13
+ export function nativeCustodyBytes(value) {
14
+ return (Buffer.byteLength(JSON.stringify(value), 'utf8') +
15
+ ('retentionExpiresAt' in value && value.deletedAt === undefined
16
+ ? NATIVE_TERMINAL_RESERVE_BYTES
17
+ : 0));
18
+ }
19
+ export class NativeStorageBudget {
20
+ maximum;
21
+ #totals = new Map();
22
+ constructor(maximum = NATIVE_RETAINED_BYTES_LIMIT) {
23
+ this.maximum = maximum;
24
+ }
25
+ replace(scope, previousBytes, nextBytes) {
26
+ const current = this.#totals.get(scope) ?? 0;
27
+ const delta = nextBytes - previousBytes;
28
+ const next = current + delta;
29
+ if (!Number.isSafeInteger(next) || next < 0)
30
+ throw new Error('Invalid native custody accounting');
31
+ if (delta > 0 && next > this.maximum)
32
+ throw new NativeStorageLimitError();
33
+ this.#totals.set(scope, next);
34
+ }
35
+ }
36
+ /** Commit checks precede every map mutation, including history and the caller's idempotency insert. */
37
+ export function commitNativeMemoryRecord(records, activities, budget, key, record, activity) {
38
+ const previous = records.get(key);
39
+ const history = activities.get(key) ?? [];
40
+ let previousBytes = previous === undefined ? 0 : nativeCustodyBytes(previous);
41
+ let nextBytes = nativeCustodyBytes(record) + nativeCustodyBytes(activity);
42
+ let retainedHistory = history;
43
+ if (record.deletedAt !== undefined) {
44
+ retainedHistory = history.map((entry) => {
45
+ const { content: ignored, ...metadata } = entry;
46
+ void ignored;
47
+ previousBytes += nativeCustodyBytes(entry);
48
+ nextBytes += nativeCustodyBytes(metadata);
49
+ return metadata;
50
+ });
51
+ }
52
+ const scope = record.scope;
53
+ budget.replace(`${scope.org}\0${scope.app}\0${scope.env}\0${scope.installationId}`, previousBytes, nextBytes);
54
+ records.set(key, record);
55
+ if (retainedHistory !== history || previous === undefined)
56
+ activities.set(key, [...retainedHistory, activity]);
57
+ else
58
+ history.push(activity);
59
+ }
60
+ //# sourceMappingURL=native-storage-budget.js.map