@noodleseed/one 0.162.0 → 0.164.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 (326) hide show
  1. package/dist/banner.d.ts +6 -0
  2. package/dist/banner.d.ts.map +1 -0
  3. package/dist/banner.js +29 -0
  4. package/dist/banner.js.map +1 -0
  5. package/dist/commands/billing-catalog-ops.d.ts +4 -0
  6. package/dist/commands/billing-catalog-ops.d.ts.map +1 -0
  7. package/dist/commands/billing-catalog-ops.js +58 -0
  8. package/dist/commands/billing-catalog-ops.js.map +1 -0
  9. package/dist/commands/billing-ops.d.ts.map +1 -1
  10. package/dist/commands/billing-ops.js +3 -0
  11. package/dist/commands/billing-ops.js.map +1 -1
  12. package/dist/commands/catalog.d.ts.map +1 -1
  13. package/dist/commands/catalog.js +2 -0
  14. package/dist/commands/catalog.js.map +1 -1
  15. package/dist/commands/config-values.d.ts.map +1 -1
  16. package/dist/commands/config-values.js +16 -0
  17. package/dist/commands/config-values.js.map +1 -1
  18. package/dist/commands/installation-variables.d.ts +26 -0
  19. package/dist/commands/installation-variables.d.ts.map +1 -0
  20. package/dist/commands/installation-variables.js +171 -0
  21. package/dist/commands/installation-variables.js.map +1 -0
  22. package/dist/commands/project-setup.d.ts.map +1 -1
  23. package/dist/commands/project-setup.js +2 -0
  24. package/dist/commands/project-setup.js.map +1 -1
  25. package/dist/commands/solutions-activity.d.ts +5 -0
  26. package/dist/commands/solutions-activity.d.ts.map +1 -0
  27. package/dist/commands/solutions-activity.js +116 -0
  28. package/dist/commands/solutions-activity.js.map +1 -0
  29. package/dist/commands/solutions-connections.d.ts +7 -0
  30. package/dist/commands/solutions-connections.d.ts.map +1 -0
  31. package/dist/commands/solutions-connections.js +88 -0
  32. package/dist/commands/solutions-connections.js.map +1 -0
  33. package/dist/commands/solutions-installation-options.d.ts +5 -0
  34. package/dist/commands/solutions-installation-options.d.ts.map +1 -0
  35. package/dist/commands/solutions-installation-options.js +52 -0
  36. package/dist/commands/solutions-installation-options.js.map +1 -0
  37. package/dist/commands/solutions-onboarding.d.ts +5 -0
  38. package/dist/commands/solutions-onboarding.d.ts.map +1 -0
  39. package/dist/commands/solutions-onboarding.js +113 -0
  40. package/dist/commands/solutions-onboarding.js.map +1 -0
  41. package/dist/commands/solutions-ops.d.ts.map +1 -1
  42. package/dist/commands/solutions-ops.js +278 -17
  43. package/dist/commands/solutions-ops.js.map +1 -1
  44. package/dist/first-run.d.ts.map +1 -1
  45. package/dist/first-run.js +2 -0
  46. package/dist/first-run.js.map +1 -1
  47. package/dist/index.d.ts +1 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +1 -1
  50. package/dist/index.js.map +1 -1
  51. package/node_modules/@noodle-borg/admission-limits/dist/counter-store.d.ts +21 -2
  52. package/node_modules/@noodle-borg/admission-limits/dist/counter-store.js +10 -1
  53. package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.d.ts +5 -1
  54. package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.js +31 -2
  55. package/node_modules/@noodle-borg/admission-limits/dist/portable.d.ts +3 -0
  56. package/node_modules/@noodle-borg/admission-limits/dist/portable.js +3 -0
  57. package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.d.ts +28 -0
  58. package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.js +124 -0
  59. package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.d.ts +54 -0
  60. package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.js +74 -0
  61. package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.d.ts +11 -0
  62. package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.js +19 -0
  63. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +2 -0
  64. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +5 -5
  65. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +3 -0
  66. package/node_modules/@noodle-borg/agent-kit/dist/index.d.ts +1 -0
  67. package/node_modules/@noodle-borg/agent-kit/dist/index.js +1 -0
  68. package/node_modules/@noodle-borg/agent-kit/dist/plugin-bootstrap-skill.js +10 -0
  69. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +15 -3
  70. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +1 -1
  71. package/node_modules/@noodle-borg/agent-kit/dist/welcome-wordmark.d.ts +3 -0
  72. package/node_modules/@noodle-borg/agent-kit/dist/welcome-wordmark.js +10 -0
  73. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  74. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.d.ts +9 -1
  75. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.js +33 -2
  76. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.d.ts +3 -0
  77. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.js +29 -0
  78. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.d.ts +5 -3
  79. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.js +21 -10
  80. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.d.ts +1 -1
  81. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.js +3 -3
  82. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.d.ts +1 -0
  83. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.js +1 -0
  84. package/node_modules/@noodle-borg/assistant-gateway/dist/session-target.js +5 -4
  85. package/node_modules/@noodle-borg/assistant-gateway/package.json +1 -1
  86. package/node_modules/@noodle-borg/authoring/dist/config.d.ts +20 -0
  87. package/node_modules/@noodle-borg/authoring/dist/config.js +29 -2
  88. package/node_modules/@noodle-borg/authoring/dist/connectors.d.ts +6 -1
  89. package/node_modules/@noodle-borg/authoring/dist/connectors.js +5 -0
  90. package/node_modules/@noodle-borg/authoring/dist/index.d.ts +2 -2
  91. package/node_modules/@noodle-borg/authoring/dist/json-schema.d.ts +1 -1
  92. package/node_modules/@noodle-borg/authoring/dist/json-schema.js +15 -2
  93. package/node_modules/@noodle-borg/authoring/dist/load-authored.js +1 -1
  94. package/node_modules/@noodle-borg/authoring/dist/managed-collection.d.ts +18 -4
  95. package/node_modules/@noodle-borg/authoring/dist/managed-collection.js +22 -3
  96. package/node_modules/@noodle-borg/authoring/dist/platform.d.ts +3 -0
  97. package/node_modules/@noodle-borg/authoring/dist/platform.js +4 -0
  98. package/node_modules/@noodle-borg/authoring/dist/server-presentation.js +43 -0
  99. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +3 -1
  100. package/node_modules/@noodle-borg/authoring/dist/server.js +4 -44
  101. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-billing.js +18 -0
  102. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-config.js +31 -4
  103. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-solutions.js +778 -0
  104. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-tenant-resources.js +0 -241
  105. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-types.js +7 -0
  106. package/node_modules/@noodle-borg/cli-catalog/dist/index.js +20 -0
  107. package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +2 -1
  108. package/node_modules/@noodle-borg/compiler/dist/artifact/catalog-emission.js +3 -1
  109. package/node_modules/@noodle-borg/compiler/dist/artifact/config.js +3 -0
  110. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +17 -1
  111. package/node_modules/@noodle-borg/compiler/dist/artifact/version.d.ts +6 -1
  112. package/node_modules/@noodle-borg/compiler/dist/artifact/version.js +6 -1
  113. package/node_modules/@noodle-borg/compiler/dist/business-variables.d.ts +27 -0
  114. package/node_modules/@noodle-borg/compiler/dist/business-variables.js +230 -0
  115. package/node_modules/@noodle-borg/compiler/dist/compile.js +7 -1
  116. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +1 -1
  117. package/node_modules/@noodle-borg/compiler/dist/index.d.ts +3 -0
  118. package/node_modules/@noodle-borg/compiler/dist/index.js +3 -0
  119. package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.d.ts +52 -0
  120. package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.js +92 -0
  121. package/node_modules/@noodle-borg/compiler/dist/managed-collections.d.ts +26 -1
  122. package/node_modules/@noodle-borg/compiler/dist/managed-collections.js +190 -1
  123. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +100 -36
  124. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +2 -0
  125. package/node_modules/@noodle-borg/compiler/dist/native-record-operations.d.ts +7 -0
  126. package/node_modules/@noodle-borg/compiler/dist/native-record-operations.js +59 -0
  127. package/node_modules/@noodle-borg/connector-defs/dist/compile-http.js +83 -8
  128. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts +31 -1
  129. package/node_modules/@noodle-borg/connector-defs/dist/schema.js +16 -0
  130. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +12 -3
  131. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +41 -2
  132. package/node_modules/@noodle-borg/connector-http/dist/http-response.js +3 -2
  133. package/node_modules/@noodle-borg/connector-http/dist/mcp/config.js +1 -1
  134. package/node_modules/@noodle-borg/connector-http/dist/url-resolution.js +1 -1
  135. package/node_modules/@noodle-borg/control-plane/dist/contracts.d.ts +4 -1
  136. package/node_modules/@noodle-borg/control-plane/dist/deploy-gates.js +1 -0
  137. package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.d.ts +3 -0
  138. package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.js +11 -0
  139. package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.d.ts +45 -0
  140. package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.js +74 -0
  141. package/node_modules/@noodle-borg/control-plane/dist/portable.d.ts +1 -0
  142. package/node_modules/@noodle-borg/control-plane/dist/portable.js +1 -0
  143. package/node_modules/@noodle-borg/module/dist/contract.d.ts +22 -0
  144. package/node_modules/@noodle-borg/module/dist/platform-human-identity.d.ts +2 -0
  145. package/node_modules/@noodle-borg/protocol/dist/request-deps.js +1 -0
  146. package/node_modules/@noodle-borg/protocol/dist/request-state.d.ts +1 -0
  147. package/node_modules/@noodle-borg/protocol/dist/request-state.js +11 -2
  148. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts +2 -0
  149. package/node_modules/@noodle-borg/protocol/dist/v2/input-required.js +2 -1
  150. package/node_modules/@noodle-borg/protocol/dist/v2/server.js +2 -1
  151. package/node_modules/@noodle-borg/runtime/dist/ambient-context.js +6 -1
  152. package/node_modules/@noodle-borg/runtime/dist/broker/types.d.ts +2 -0
  153. package/node_modules/@noodle-borg/runtime/dist/business-variables.d.ts +15 -0
  154. package/node_modules/@noodle-borg/runtime/dist/business-variables.js +75 -0
  155. package/node_modules/@noodle-borg/runtime/dist/confirmation-continuation.js +2 -1
  156. package/node_modules/@noodle-borg/runtime/dist/confirmation.js +23 -3
  157. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +17 -1
  158. package/node_modules/@noodle-borg/runtime/dist/connector-snapshot.js +6 -0
  159. package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +18 -3
  160. package/node_modules/@noodle-borg/runtime/dist/execute.js +13 -3
  161. package/node_modules/@noodle-borg/runtime/dist/index.d.ts +2 -0
  162. package/node_modules/@noodle-borg/runtime/dist/index.js +1 -0
  163. package/node_modules/@noodle-borg/runtime/dist/interactive.js +11 -0
  164. package/node_modules/@noodle-borg/runtime/dist/managed-origins.d.ts +3 -1
  165. package/node_modules/@noodle-borg/runtime/dist/managed-origins.js +32 -7
  166. package/node_modules/@noodle-borg/runtime/dist/operation-credential.js +6 -0
  167. package/node_modules/@noodle-borg/runtime/dist/operation-evidence.d.ts +30 -0
  168. package/node_modules/@noodle-borg/runtime/dist/operation-evidence.js +68 -0
  169. package/node_modules/@noodle-borg/runtime/dist/operation-execution.d.ts +2 -2
  170. package/node_modules/@noodle-borg/runtime/dist/operation-execution.js +142 -71
  171. package/node_modules/@noodle-borg/runtime/dist/result.d.ts +6 -4
  172. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.d.ts +7 -0
  173. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.js +48 -4
  174. package/node_modules/@noodle-borg/service/dist/admission.js +2 -1
  175. package/node_modules/@noodle-borg/service/dist/application-activity.js +236 -0
  176. package/node_modules/@noodle-borg/service/dist/application-business-notice.js +28 -0
  177. package/node_modules/@noodle-borg/service/dist/application-runtime-target.js +141 -0
  178. package/node_modules/@noodle-borg/service/dist/application-settings-targets.js +72 -0
  179. package/node_modules/@noodle-borg/service/dist/application-settings.js +210 -0
  180. package/node_modules/@noodle-borg/service/dist/business-api-admission.js +121 -0
  181. package/node_modules/@noodle-borg/service/dist/business-information/activity-pagination.js +73 -0
  182. package/node_modules/@noodle-borg/service/dist/business-information/business-notice.d.ts +24 -0
  183. package/node_modules/@noodle-borg/service/dist/business-information/business-notice.js +18 -0
  184. package/node_modules/@noodle-borg/service/dist/business-information/collection-controls.js +51 -0
  185. package/node_modules/@noodle-borg/service/dist/business-information/contracts.d.ts +439 -0
  186. package/node_modules/@noodle-borg/service/dist/business-information/definition-resolver.js +94 -0
  187. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-installation-lifecycle.js +136 -0
  188. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-invitations.js +160 -0
  189. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-locks.js +23 -0
  190. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-store.js +287 -132
  191. package/node_modules/@noodle-borg/service/dist/business-information/installation-capacity.js +10 -0
  192. package/node_modules/@noodle-borg/service/dist/business-information/invitations.js +68 -0
  193. package/node_modules/@noodle-borg/service/dist/business-information/legacy-request-migration.js +60 -0
  194. package/node_modules/@noodle-borg/service/dist/business-information/managed-releases.js +245 -0
  195. package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-blueprints.js +51 -0
  196. package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-executable.js +76 -0
  197. package/node_modules/@noodle-borg/service/dist/business-information/model.js +124 -23
  198. package/node_modules/@noodle-borg/service/dist/business-information/native-query.js +162 -0
  199. package/node_modules/@noodle-borg/service/dist/business-information/native-storage-budget.js +60 -0
  200. package/node_modules/@noodle-borg/service/dist/business-information/pagination.js +28 -0
  201. package/node_modules/@noodle-borg/service/dist/business-information/portable.js +9 -0
  202. package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.d.ts +11 -0
  203. package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.js +42 -0
  204. package/node_modules/@noodle-borg/service/dist/business-information/profiles.js +137 -6
  205. package/node_modules/@noodle-borg/service/dist/business-information/reader-floor.js +26 -0
  206. package/node_modules/@noodle-borg/service/dist/business-information/source-credential-fence.js +79 -0
  207. package/node_modules/@noodle-borg/service/dist/business-information/source-custody-budget.js +30 -0
  208. package/node_modules/@noodle-borg/service/dist/business-information/source-custody-memory.js +122 -0
  209. package/node_modules/@noodle-borg/service/dist/business-information/source-executor.js +191 -0
  210. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-contracts.js +2 -0
  211. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-coordinator.js +136 -0
  212. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-failures.js +32 -0
  213. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-state.js +154 -0
  214. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-store.js +568 -0
  215. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-types.js +26 -0
  216. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-values.js +59 -0
  217. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-pagination.js +54 -0
  218. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-validation.js +163 -0
  219. package/node_modules/@noodle-borg/service/dist/business-information/source-refresh-retention.js +29 -0
  220. package/node_modules/@noodle-borg/service/dist/business-information-runtime.js +80 -0
  221. package/node_modules/@noodle-borg/service/dist/business-onboarding.js +73 -0
  222. package/node_modules/@noodle-borg/service/dist/connections/types.js +8 -0
  223. package/node_modules/@noodle-borg/service/dist/credential-binding-index.js +38 -33
  224. package/node_modules/@noodle-borg/service/dist/deployment-execution.js +275 -0
  225. package/node_modules/@noodle-borg/service/dist/external-credential-binding-broker.js +19 -1
  226. package/node_modules/@noodle-borg/service/dist/external-credential-exchange.d.ts +16 -1
  227. package/node_modules/@noodle-borg/service/dist/modules/host.js +4 -1
  228. package/node_modules/@noodle-borg/service/dist/native-record-connector.d.ts +20 -0
  229. package/node_modules/@noodle-borg/service/dist/native-record-connector.js +206 -0
  230. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts +3 -0
  231. package/node_modules/@noodle-borg/service/dist/operation-evidence.js +89 -0
  232. package/node_modules/@noodle-borg/service/dist/recovery-quarantine.js +49 -0
  233. package/node_modules/@noodle-borg/service/dist/registry-compile.js +60 -11
  234. package/node_modules/@noodle-borg/service/dist/registry-deploy-transaction.js +18 -0
  235. package/node_modules/@noodle-borg/service/dist/registry-rollback.js +2 -1
  236. package/node_modules/@noodle-borg/service/dist/registry-state.d.ts +1 -1
  237. package/node_modules/@noodle-borg/service/dist/registry-state.js +6 -3
  238. package/node_modules/@noodle-borg/service/dist/registry-targets.js +49 -0
  239. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +2 -0
  240. package/node_modules/@noodle-borg/service/dist/registry.d.ts +15 -3
  241. package/node_modules/@noodle-borg/service/dist/registry.js +177 -137
  242. package/node_modules/@noodle-borg/service/dist/routes/assistant-appearance.js +3 -2
  243. package/node_modules/@noodle-borg/service/dist/routes/assistant-clients.js +2 -1
  244. package/node_modules/@noodle-borg/service/dist/routes/assistant-doctor.js +2 -1
  245. package/node_modules/@noodle-borg/service/dist/routes/assistant-embeds.js +8 -3
  246. package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.js +1 -1
  247. package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +48 -36
  248. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-configuration.js +3 -2
  249. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-session.js +10 -10
  250. package/node_modules/@noodle-borg/service/dist/routes/assistant-session-target.js +32 -3
  251. package/node_modules/@noodle-borg/service/dist/routes/assistant-suggestions.js +1 -1
  252. package/node_modules/@noodle-borg/service/dist/routes/assistant-transcript.js +1 -1
  253. package/node_modules/@noodle-borg/service/dist/routes/assistant.js +10 -10
  254. package/node_modules/@noodle-borg/service/dist/routes/business-information-activity.js +83 -0
  255. package/node_modules/@noodle-borg/service/dist/routes/business-information-admission.js +26 -0
  256. package/node_modules/@noodle-borg/service/dist/routes/business-information-channels.js +153 -0
  257. package/node_modules/@noodle-borg/service/dist/routes/business-information-connections.js +107 -0
  258. package/node_modules/@noodle-borg/service/dist/routes/business-information-dispatch.js +87 -4
  259. package/node_modules/@noodle-borg/service/dist/routes/business-information-external.js +79 -0
  260. package/node_modules/@noodle-borg/service/dist/routes/business-information-installation.js +24 -0
  261. package/node_modules/@noodle-borg/service/dist/routes/business-information-notice.js +69 -0
  262. package/node_modules/@noodle-borg/service/dist/routes/business-information-onboarding.js +58 -0
  263. package/node_modules/@noodle-borg/service/dist/routes/business-information-paths.js +76 -0
  264. package/node_modules/@noodle-borg/service/dist/routes/business-information-public.js +151 -0
  265. package/node_modules/@noodle-borg/service/dist/routes/business-information-reader-floor.js +15 -0
  266. package/node_modules/@noodle-borg/service/dist/routes/business-information-record-create.js +29 -0
  267. package/node_modules/@noodle-borg/service/dist/routes/business-information-record-reads.js +36 -0
  268. package/node_modules/@noodle-borg/service/dist/routes/business-information-request.js +64 -0
  269. package/node_modules/@noodle-borg/service/dist/routes/business-information-settings.js +64 -0
  270. package/node_modules/@noodle-borg/service/dist/routes/business-information-source.js +249 -0
  271. package/node_modules/@noodle-borg/service/dist/routes/business-information-staff.js +258 -0
  272. package/node_modules/@noodle-borg/service/dist/routes/business-information-wire.js +226 -26
  273. package/node_modules/@noodle-borg/service/dist/routes/business-information.js +238 -197
  274. package/node_modules/@noodle-borg/service/dist/routes/config-values-dispatch.js +1 -1
  275. package/node_modules/@noodle-borg/service/dist/routes/config-values.js +26 -4
  276. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +33 -234
  277. package/node_modules/@noodle-borg/service/dist/routes/deployment-activation-response.js +13 -4
  278. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +4 -0
  279. package/node_modules/@noodle-borg/service/dist/service.js +57 -11
  280. package/node_modules/@noodle-borg/service/dist/solution-installation-activation.js +149 -0
  281. package/node_modules/@noodle-borg/service/dist/source-configuration-authority.js +94 -0
  282. package/node_modules/@noodle-borg/service/dist/state-catalog.js +6 -5
  283. package/node_modules/@noodle-borg/service/dist/store/config-values.d.ts +42 -17
  284. package/node_modules/@noodle-borg/service/dist/store/config-values.js +123 -24
  285. package/node_modules/@noodle-borg/service/dist/store/in-memory.d.ts +1 -0
  286. package/node_modules/@noodle-borg/service/dist/store/in-memory.js +3 -0
  287. package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +1 -0
  288. package/node_modules/@noodle-borg/service/dist/store/json-file.js +3 -0
  289. package/node_modules/@noodle-borg/service/dist/store.d.ts +3 -1
  290. package/node_modules/@noodle-borg/service/package.json +2 -2
  291. package/node_modules/@noodle-borg/transport-http/dist/serve-request.js +9 -0
  292. package/node_modules/@noodle-borg/transport-http/package.json +1 -0
  293. package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.d.ts +143 -0
  294. package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.js +90 -0
  295. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.d.ts +130 -0
  296. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.js +77 -0
  297. package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.d.ts +105 -0
  298. package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.js +67 -0
  299. package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.d.ts +27 -0
  300. package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.js +28 -0
  301. package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.d.ts +112 -0
  302. package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.js +88 -0
  303. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts +1 -1
  304. package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.d.ts +62 -0
  305. package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.js +57 -0
  306. package/node_modules/@noodle-borg/wire-contracts/dist/billing-enforcement.d.ts +12 -12
  307. package/node_modules/@noodle-borg/wire-contracts/dist/billing-metering.d.ts +4 -4
  308. package/node_modules/@noodle-borg/wire-contracts/dist/billing-org-transfer.d.ts +3 -3
  309. package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.d.ts +25 -0
  310. package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.js +37 -0
  311. package/node_modules/@noodle-borg/wire-contracts/dist/business-information.d.ts +1816 -158
  312. package/node_modules/@noodle-borg/wire-contracts/dist/business-information.js +416 -41
  313. package/node_modules/@noodle-borg/wire-contracts/dist/control-plane.d.ts +2 -2
  314. package/node_modules/@noodle-borg/wire-contracts/dist/distribution.d.ts +5 -5
  315. package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +8 -0
  316. package/node_modules/@noodle-borg/wire-contracts/dist/index.js +8 -0
  317. package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts +3 -3
  318. package/node_modules/@noodle-borg/wire-contracts/dist/managed-assistant-sponsorship.d.ts +7 -7
  319. package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.d.ts +5 -0
  320. package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.js +1 -0
  321. package/node_modules/@noodle-borg/wire-contracts/dist/platform-auth.d.ts +66 -66
  322. package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.d.ts +143 -0
  323. package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.js +94 -0
  324. package/node_modules/@noodleseed/assistant/README.md +5 -0
  325. package/node_modules/@noodleseed/assistant/package.json +1 -1
  326. package/package.json +2 -2
@@ -0,0 +1,210 @@
1
+ import { canonicalJson, MAX_VARIABLE_VALUE_BYTES, sha256Canonical, validateJsonSchema, validateVariableDeclaration, } from '@noodle-borg/compiler';
2
+ import { ApplicationSettingsProjectionSchema, ApplicationSettingsSaveRequestSchema, } from '@noodle-borg/wire-contracts';
3
+ import { scopeChain, } from './store/config-values.js';
4
+ export function installationSettingsTarget(installation) {
5
+ return {
6
+ scope: {
7
+ level: 'env',
8
+ org: installation.scope.org,
9
+ app: installation.scope.app,
10
+ env: installation.scope.env,
11
+ },
12
+ releaseDigest: installation.definition.reference.digest,
13
+ declarations: installation.definition.variables ?? [],
14
+ };
15
+ }
16
+ export class SettingsError extends Error {
17
+ code;
18
+ constructor(code, message) {
19
+ super(message);
20
+ this.code = code;
21
+ }
22
+ }
23
+ /** Business settings are a validated projection of the existing hierarchical config authority. */
24
+ export class ApplicationSettings {
25
+ config;
26
+ constructor(config) {
27
+ this.config = config;
28
+ }
29
+ async initialize(target) {
30
+ await this.transaction(target.scope.org, async (transaction) => {
31
+ const exact = await transaction.listConfigValues('variable', target.scope);
32
+ const existing = new Set(exact.map((entry) => entry.name));
33
+ for (const declaration of target.declarations) {
34
+ if (!Object.hasOwn(declaration, 'default') || existing.has(declaration.name))
35
+ continue;
36
+ validateValue(declaration, declaration.default);
37
+ await transaction.setConfigValue({
38
+ kind: 'variable',
39
+ scope: target.scope,
40
+ name: declaration.name,
41
+ value: canonicalJson(declaration.default),
42
+ valueOrigin: 'default',
43
+ });
44
+ }
45
+ });
46
+ }
47
+ read(target, canEdit) {
48
+ return this.transaction(target.scope.org, (transaction) => projectSettings(transaction, target, canEdit));
49
+ }
50
+ async save(target, request, actor, resolveTargets) {
51
+ const parsed = ApplicationSettingsSaveRequestSchema.safeParse(request);
52
+ if (!parsed.success)
53
+ throw new SettingsError('settings_invalid', 'Invalid settings update.');
54
+ return this.transaction(target.scope.org, async (transaction) => {
55
+ const targets = resolveTargets ? await resolveTargets() : [target];
56
+ if (!targets.some((entry) => withinScope(target.scope, entry.scope) &&
57
+ entry.releaseDigest === target.releaseDigest &&
58
+ sha256Canonical(entry.declarations) === sha256Canonical(target.declarations)))
59
+ throw new SettingsError('settings_conflict', 'Application release changed. Reload before saving.');
60
+ const current = await projectSettings(transaction, target, true);
61
+ if (current.revision !== request.expectedRevision ||
62
+ current.schemaDigest !== request.schemaDigest) {
63
+ throw new SettingsError('settings_conflict', 'Settings or application release changed. Reload before saving.');
64
+ }
65
+ const declarations = new Map(target.declarations
66
+ .filter((entry) => entry.portal !== undefined)
67
+ .map((entry) => [entry.name, entry]));
68
+ for (const [name, value] of Object.entries(request.values)) {
69
+ const declaration = declarations.get(name);
70
+ if (declaration === undefined)
71
+ throw new SettingsError('settings_invalid', 'Setting is not exposed to this business.');
72
+ validateValue(declaration, value);
73
+ await transaction.setConfigValue({
74
+ kind: 'variable',
75
+ scope: target.scope,
76
+ name,
77
+ value: canonicalJson(value),
78
+ updatedBySubject: actor,
79
+ });
80
+ }
81
+ for (const name of request.resetKeys ?? []) {
82
+ const declaration = declarations.get(name);
83
+ if (declaration === undefined)
84
+ throw new SettingsError('settings_invalid', 'Setting is not exposed to this business.');
85
+ if (Object.hasOwn(declaration, 'default')) {
86
+ await transaction.setConfigValue({
87
+ kind: 'variable',
88
+ scope: target.scope,
89
+ name,
90
+ value: canonicalJson(declaration.default),
91
+ valueOrigin: 'default',
92
+ updatedBySubject: actor,
93
+ });
94
+ }
95
+ else {
96
+ await transaction.deleteConfigValue('variable', target.scope, name);
97
+ }
98
+ }
99
+ for (const entry of targets)
100
+ if (withinScope(target.scope, entry.scope))
101
+ await projectSettings(transaction, entry, false);
102
+ return projectSettings(transaction, target, true);
103
+ });
104
+ }
105
+ /** Technical API/CLI changes share validation and the same hierarchy transaction as Portal. */
106
+ writeTechnical(targets, input) {
107
+ return this.transaction(input.scope.org, async (transaction) => {
108
+ const currentTargets = typeof targets === 'function' ? await targets() : targets;
109
+ const affected = currentTargets.filter((target) => withinScope(input.scope, target.scope));
110
+ if (input.kind === 'variable' && input.value !== undefined) {
111
+ for (const target of affected) {
112
+ const declaration = target.declarations.find((entry) => entry.name === input.name);
113
+ if (declaration !== undefined)
114
+ validateValue(declaration, decodeValue(input.value));
115
+ }
116
+ }
117
+ const result = input.value === undefined
118
+ ? await transaction.deleteConfigValue(input.kind, input.scope, input.name)
119
+ : await transaction.setConfigValue({ ...input, value: input.value });
120
+ if (input.kind === 'variable') {
121
+ // Includes reset/delete and changes inherited by multiple installed applications.
122
+ for (const target of affected)
123
+ await projectSettings(transaction, target, false);
124
+ }
125
+ return result;
126
+ });
127
+ }
128
+ transaction(org, work) {
129
+ if (this.config.transactConfig === undefined)
130
+ throw new SettingsError('settings_unavailable', 'Atomic configuration storage is unavailable.');
131
+ return this.config.transactConfig(org, work);
132
+ }
133
+ }
134
+ async function projectSettings(config, target, canEdit) {
135
+ const rows = [];
136
+ for (const scope of scopeChain(target.scope))
137
+ rows.push(...(await config.listConfigValues('variable', scope)));
138
+ const declarations = target.declarations.filter((entry) => entry.portal !== undefined);
139
+ const declaredNames = new Set(target.declarations.map((entry) => entry.name));
140
+ const scopedRows = rows.filter((row) => declaredNames.has(row.name));
141
+ const values = {};
142
+ const provenance = {};
143
+ const missing = new Map();
144
+ for (const declaration of target.declarations) {
145
+ const { schemaDigest: _digest, ...manifest } = declaration;
146
+ if (validateVariableDeclaration(manifest).length > 0)
147
+ throw new SettingsError('settings_invalid', 'Application has an invalid setting declaration.');
148
+ const candidates = scopedRows.filter((row) => row.name === declaration.name);
149
+ const chosen = candidates.filter((row) => row.valueOrigin !== 'default').at(-1) ?? candidates.at(-1);
150
+ const value = chosen?.value === undefined ? declaration.default : decodeValue(chosen.value);
151
+ if (value !== undefined)
152
+ validateValue(declaration, value);
153
+ if (declaration.portal !== undefined) {
154
+ if (value !== undefined)
155
+ values[declaration.name] = value;
156
+ provenance[declaration.name] =
157
+ chosen?.valueOrigin === 'default' || (chosen === undefined && value !== undefined)
158
+ ? 'default'
159
+ : chosen?.scope.level === 'org'
160
+ ? 'organization'
161
+ : chosen?.scope.level === 'app'
162
+ ? 'app'
163
+ : chosen !== undefined
164
+ ? 'operator'
165
+ : 'unset';
166
+ for (const tool of declaration.requiredFor) {
167
+ const names = missing.get(tool) ?? [];
168
+ if (value === undefined)
169
+ names.push(declaration.name);
170
+ missing.set(tool, names);
171
+ }
172
+ }
173
+ }
174
+ const schemaDigest = sha256Canonical(target.declarations);
175
+ return ApplicationSettingsProjectionSchema.parse({
176
+ revision: sha256Canonical({ release: target.releaseDigest, schemaDigest, rows: scopedRows }),
177
+ schemaDigest,
178
+ releaseDigest: target.releaseDigest,
179
+ declarations,
180
+ values,
181
+ provenance,
182
+ readiness: [...missing.entries()]
183
+ .sort(([a], [b]) => a.localeCompare(b))
184
+ .map(([tool, names]) => ({ tool, ready: names.length === 0, missing: names })),
185
+ canEdit,
186
+ });
187
+ }
188
+ function decodeValue(value) {
189
+ if (Buffer.byteLength(value) > MAX_VARIABLE_VALUE_BYTES)
190
+ throw new SettingsError('settings_invalid', 'Setting exceeds the maximum value size.');
191
+ try {
192
+ return JSON.parse(value);
193
+ }
194
+ catch {
195
+ throw new SettingsError('settings_invalid', 'Declared setting values must be encoded as JSON.');
196
+ }
197
+ }
198
+ function validateValue(declaration, value) {
199
+ const serialized = canonicalJson(value);
200
+ if (Buffer.byteLength(serialized) > MAX_VARIABLE_VALUE_BYTES ||
201
+ validateJsonSchema(declaration.valueSchema, value).length > 0) {
202
+ throw new SettingsError('settings_invalid', `Invalid value for ${declaration.portal?.label ?? declaration.name}.`);
203
+ }
204
+ }
205
+ function withinScope(parent, child) {
206
+ return (parent.org === child.org &&
207
+ (parent.level === 'org' ||
208
+ (parent.app === child.app && (parent.level === 'app' || parent.env === child.env))));
209
+ }
210
+ //# sourceMappingURL=application-settings.js.map
@@ -0,0 +1,121 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { nextReset, } from '@noodle-borg/admission-limits/portable';
3
+ import { sendJson } from '@noodle-borg/transport-http';
4
+ import { parseSolutionInstallationPath } from './routes/business-information-paths.js';
5
+ import { authorizeControlPlane } from './routes/control-plane.js';
6
+ /** Technical HTTP work allowances; they do not spend tool calls or commercial entitlements. */
7
+ export const BUSINESS_API_LIMITS = {
8
+ read: { subject: 6_000, installation: 30_000, org: 60_000 },
9
+ mutation: { subject: 1_200, installation: 6_000, org: 12_000 },
10
+ recovery: { subject: 6_000, installation: 30_000, org: 60_000 },
11
+ };
12
+ const requests = new WeakMap();
13
+ const responses = new WeakMap();
14
+ export function businessApiCounter(lane, bucket, scope) {
15
+ const digest = createHash('sha256').update(JSON.stringify(scope)).digest('hex');
16
+ return {
17
+ key: `business-api:${lane}:${bucket}:${digest}`,
18
+ limit: BUSINESS_API_LIMITS[lane][bucket],
19
+ window: 'minute',
20
+ };
21
+ }
22
+ function laneFor(req) {
23
+ const ref = parseSolutionInstallationPath(new URL(req.url ?? '/', 'http://service.invalid').pathname);
24
+ if (req.method === 'DELETE' ||
25
+ ref?.action === 'export' ||
26
+ (req.method === 'GET' && ref?.action === 'activity'))
27
+ return 'recovery';
28
+ if (req.method === 'GET' || req.method === 'HEAD')
29
+ return 'read';
30
+ if ((req.method === 'PATCH' && ref?.installationId && (!ref.action || ref.action === 'channels')) ||
31
+ ref?.sourceAction ||
32
+ ref?.connectionAction === 'disconnect' ||
33
+ (req.method === 'POST' && ref?.action === 'records' && !ref.recordId))
34
+ return 'recovery';
35
+ return 'mutation';
36
+ }
37
+ /** One verified identity and one subject attempt per request; invalid targets never spend victim capacity. */
38
+ export async function authorizeBusinessApi(req, res, deps) {
39
+ let pending = requests.get(req);
40
+ if (!pending) {
41
+ pending = (async () => {
42
+ const identity = await authorizeControlPlane(req, res, deps.gate, { requireIdentity: true });
43
+ if (identity === false)
44
+ return false;
45
+ const context = {
46
+ identity,
47
+ counters: deps.publicCounters,
48
+ lane: laneFor(req),
49
+ now: deps.now?.() ?? new Date(),
50
+ admissions: new Map(),
51
+ };
52
+ return (await subject(context, res, context.lane)) ? context : false;
53
+ })();
54
+ requests.set(req, pending);
55
+ }
56
+ responses.set(res, pending);
57
+ const context = await pending;
58
+ return context === false ? false : context.identity;
59
+ }
60
+ /** Invoke only after the existing live grant/permission or organization-owner check succeeds. */
61
+ export async function admitBusinessTarget(res, target) {
62
+ const context = await responses.get(res);
63
+ return context ? targetAdmission(context, res, target, context.lane) : unavailable(res);
64
+ }
65
+ /** A validated missing native receipt needs an additional mutation admission; completed receipts do not. */
66
+ export async function admitBusinessMutation(res, target) {
67
+ const context = await responses.get(res);
68
+ return context
69
+ ? (await subject(context, res, 'mutation')) &&
70
+ (await targetAdmission(context, res, target, 'mutation'))
71
+ : unavailable(res);
72
+ }
73
+ function subject(context, res, lane) {
74
+ return consume(context, res, lane, `${lane}:subject`, [
75
+ businessApiCounter(lane, 'subject', context.identity.subject),
76
+ ]);
77
+ }
78
+ function targetAdmission(context, res, target, lane) {
79
+ const counters = [businessApiCounter(lane, 'org', target.org)];
80
+ if (target.installationId)
81
+ counters.push(businessApiCounter(lane, 'installation', [target.org, target.installationId]));
82
+ return consume(context, res, lane, `${lane}:${counters.map((counter) => counter.key).join(':')}`, counters);
83
+ }
84
+ function consume(context, res, lane, key, batch) {
85
+ const existing = context.admissions.get(key);
86
+ if (existing)
87
+ return existing;
88
+ const pending = (async () => {
89
+ const store = context.counters;
90
+ if (typeof store.consumeAll !== 'function')
91
+ return unavailable(res);
92
+ try {
93
+ if (await store.consumeAll(batch, context.now))
94
+ return true;
95
+ }
96
+ catch {
97
+ return unavailable(res);
98
+ }
99
+ const resetAt = nextReset(context.now, 'minute');
100
+ res.setHeader('Retry-After', String(Math.max(1, Math.ceil((resetAt.getTime() - context.now.getTime()) / 1000))));
101
+ sendJson(res, 429, {
102
+ error: 'This business API allowance is temporarily exhausted. Retry after the indicated time.',
103
+ code: 'business_api_rate_limited',
104
+ resetAt: resetAt.toISOString(),
105
+ category: lane,
106
+ limits: BUSINESS_API_LIMITS[lane],
107
+ });
108
+ return false;
109
+ })();
110
+ context.admissions.set(key, pending);
111
+ return pending;
112
+ }
113
+ function unavailable(res) {
114
+ if (!res.writableEnded)
115
+ sendJson(res, 503, {
116
+ error: 'Business API admission is temporarily unavailable. Retry later.',
117
+ code: 'business_api_admission_unavailable',
118
+ });
119
+ return false;
120
+ }
121
+ //# sourceMappingURL=business-api-admission.js.map
@@ -0,0 +1,73 @@
1
+ import { cloneActivity } from './model.js';
2
+ import { scopeKey } from './pagination.js';
3
+ import { boundedPageSize, CursorValidationError, validateScalar } from './validation.js';
4
+ export function activityPaging(scope, collection, record, input = {}) {
5
+ const limit = boundedPageSize(input.limit);
6
+ if (input.cursor === undefined)
7
+ return { limit };
8
+ try {
9
+ const value = JSON.parse(Buffer.from(validateScalar('cursor', input.cursor, 2048), 'base64url').toString('utf8'));
10
+ if (typeof value !== 'object' ||
11
+ value === null ||
12
+ !('version' in value) ||
13
+ value.version !== 1 ||
14
+ !('kind' in value) ||
15
+ value.kind !== 'record-activity' ||
16
+ !('scope' in value) ||
17
+ value.scope !== scopeKey(scope) ||
18
+ !('collection' in value) ||
19
+ value.collection !== collection ||
20
+ !('record' in value) ||
21
+ value.record !== record ||
22
+ !('before' in value) ||
23
+ typeof value.before !== 'number' ||
24
+ !Number.isSafeInteger(value.before) ||
25
+ value.before < 1)
26
+ throw new CursorValidationError();
27
+ return { limit, before: value.before };
28
+ }
29
+ catch {
30
+ throw new CursorValidationError('cursor does not belong to this record history');
31
+ }
32
+ }
33
+ export function activityPage(scope, collection, record, rows, limit) {
34
+ const activities = rows.slice(0, limit);
35
+ const last = activities.at(-1);
36
+ return {
37
+ activities,
38
+ ...(rows.length > limit && last !== undefined
39
+ ? {
40
+ nextCursor: Buffer.from(JSON.stringify({
41
+ version: 1,
42
+ kind: 'record-activity',
43
+ scope: scopeKey(scope),
44
+ collection,
45
+ record,
46
+ before: last.revision,
47
+ })).toString('base64url'),
48
+ }
49
+ : {}),
50
+ };
51
+ }
52
+ /** History is append-only in revision order; select a bounded window without copying the full array. */
53
+ export function memoryActivityPage(scope, collection, record, history, input) {
54
+ const paging = activityPaging(scope, collection, record, input);
55
+ let end = history.length;
56
+ if (paging.before !== undefined) {
57
+ let low = 0;
58
+ while (low < end) {
59
+ const middle = Math.floor((low + end) / 2);
60
+ const entry = history[middle];
61
+ if (entry !== undefined && entry.revision < paging.before)
62
+ low = middle + 1;
63
+ else
64
+ end = middle;
65
+ }
66
+ }
67
+ const selected = history
68
+ .slice(Math.max(0, end - paging.limit - 1), end)
69
+ .reverse()
70
+ .map(cloneActivity);
71
+ return activityPage(scope, collection, record, selected, paging.limit);
72
+ }
73
+ //# sourceMappingURL=activity-pagination.js.map
@@ -0,0 +1,24 @@
1
+ import { type BusinessNotice } from '@noodle-borg/wire-contracts';
2
+ import type { InstallationScope } from './contracts.js';
3
+ export interface BusinessNoticeRecord {
4
+ readonly notice: BusinessNotice;
5
+ readonly revision: number;
6
+ readonly updatedAt: string;
7
+ readonly updatedBySubject: string;
8
+ }
9
+ export interface BusinessNoticeInput {
10
+ readonly scope: InstallationScope;
11
+ readonly notice: BusinessNotice;
12
+ readonly expectedRevision: number;
13
+ readonly actorSubject: string;
14
+ }
15
+ export interface BusinessNoticeStore {
16
+ getBusinessNotice(scope: InstallationScope): Promise<BusinessNoticeRecord | undefined>;
17
+ setBusinessNotice(input: BusinessNoticeInput): Promise<BusinessNoticeRecord>;
18
+ }
19
+ export declare class BusinessNoticeError extends Error {
20
+ readonly code: 'business_notice_forbidden' | 'business_notice_conflict';
21
+ constructor(code: 'business_notice_forbidden' | 'business_notice_conflict');
22
+ }
23
+ export declare function validatedNotice(input: BusinessNoticeInput): BusinessNotice;
24
+ //# sourceMappingURL=business-notice.d.ts.map
@@ -0,0 +1,18 @@
1
+ import { BusinessNoticeSaveRequestSchema } from '@noodle-borg/wire-contracts';
2
+ export class BusinessNoticeError extends Error {
3
+ code;
4
+ constructor(code) {
5
+ super(code === 'business_notice_forbidden'
6
+ ? 'Installation administrator required.'
7
+ : 'Business notice changed. Reload before saving.');
8
+ this.code = code;
9
+ this.name = 'BusinessNoticeError';
10
+ }
11
+ }
12
+ export function validatedNotice(input) {
13
+ return BusinessNoticeSaveRequestSchema.parse({
14
+ expectedRevision: input.expectedRevision,
15
+ notice: input.notice,
16
+ }).notice;
17
+ }
18
+ //# sourceMappingURL=business-notice.js.map
@@ -0,0 +1,51 @@
1
+ import { validateJsonSchemaWithDefaults } from '@noodle-borg/compiler';
2
+ import { PayloadValidationError, validateManagedPayload } from './validation.js';
3
+ export function collectionControlEnabled(collection, control) {
4
+ if (collection.authority.authority !== 'native')
5
+ return false;
6
+ if (collection.management !== undefined)
7
+ return collection.management[control] === true;
8
+ return collection.behavior?.kind === 'request';
9
+ }
10
+ export function collectionPublicFields(collection) {
11
+ return (collection.publicFields ??
12
+ (collection.behavior?.kind === 'request' ? Object.keys(recordProperties(collection)) : []));
13
+ }
14
+ export function creationPayload(collection, value, publicInput) {
15
+ const payload = validateManagedPayload(value);
16
+ if (publicInput)
17
+ assertFields(payload, collectionPublicFields(collection), 'public');
18
+ const defaulted = validateJsonSchemaWithDefaults(collection.recordSchema, payload);
19
+ if (defaulted.issues.length > 0)
20
+ throw new PayloadValidationError('invalid_json', 'managed payload does not match collection schema');
21
+ return validateManagedPayload(defaulted.value);
22
+ }
23
+ export function patchedPayload(collection, current, patch, unset = []) {
24
+ const admitted = validateManagedPayload(patch);
25
+ if (!Array.isArray(unset) ||
26
+ unset.length > 128 ||
27
+ new Set(unset).size !== unset.length ||
28
+ unset.some((name) => typeof name !== 'string' ||
29
+ name.length < 1 ||
30
+ name.length > 64 ||
31
+ Object.hasOwn(admitted, name) ||
32
+ (Array.isArray(collection.recordSchema.required) &&
33
+ collection.recordSchema.required.includes(name))))
34
+ throw new PayloadValidationError('invalid_json', 'Removal keys must be unique optional fields outside the patch.');
35
+ assertFields({ ...admitted, ...Object.fromEntries(unset.map((name) => [name, null])) }, collection.editableFields ?? Object.keys(recordProperties(collection)), 'editable');
36
+ const result = { ...current, ...admitted };
37
+ for (const name of unset)
38
+ delete result[name];
39
+ return validateManagedPayload(result);
40
+ }
41
+ function assertFields(payload, allowed, label) {
42
+ if (Object.keys(payload).some((name) => !allowed.includes(name)))
43
+ throw new PayloadValidationError('prohibited_field', `managed payload includes a field outside the ${label} field set`);
44
+ }
45
+ function recordProperties(collection) {
46
+ const properties = collection.recordSchema.properties;
47
+ return properties !== null && typeof properties === 'object' && !Array.isArray(properties)
48
+ ? properties
49
+ : {};
50
+ }
51
+ //# sourceMappingURL=collection-controls.js.map