@noodleseed/one 0.162.0 → 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 (308) hide show
  1. package/dist/commands/billing-catalog-ops.d.ts +4 -0
  2. package/dist/commands/billing-catalog-ops.d.ts.map +1 -0
  3. package/dist/commands/billing-catalog-ops.js +58 -0
  4. package/dist/commands/billing-catalog-ops.js.map +1 -0
  5. package/dist/commands/billing-ops.d.ts.map +1 -1
  6. package/dist/commands/billing-ops.js +3 -0
  7. package/dist/commands/billing-ops.js.map +1 -1
  8. package/dist/commands/catalog.d.ts.map +1 -1
  9. package/dist/commands/catalog.js +2 -0
  10. package/dist/commands/catalog.js.map +1 -1
  11. package/dist/commands/config-values.d.ts.map +1 -1
  12. package/dist/commands/config-values.js +16 -0
  13. package/dist/commands/config-values.js.map +1 -1
  14. package/dist/commands/installation-variables.d.ts +26 -0
  15. package/dist/commands/installation-variables.d.ts.map +1 -0
  16. package/dist/commands/installation-variables.js +171 -0
  17. package/dist/commands/installation-variables.js.map +1 -0
  18. package/dist/commands/solutions-activity.d.ts +5 -0
  19. package/dist/commands/solutions-activity.d.ts.map +1 -0
  20. package/dist/commands/solutions-activity.js +116 -0
  21. package/dist/commands/solutions-activity.js.map +1 -0
  22. package/dist/commands/solutions-connections.d.ts +7 -0
  23. package/dist/commands/solutions-connections.d.ts.map +1 -0
  24. package/dist/commands/solutions-connections.js +88 -0
  25. package/dist/commands/solutions-connections.js.map +1 -0
  26. package/dist/commands/solutions-installation-options.d.ts +5 -0
  27. package/dist/commands/solutions-installation-options.d.ts.map +1 -0
  28. package/dist/commands/solutions-installation-options.js +52 -0
  29. package/dist/commands/solutions-installation-options.js.map +1 -0
  30. package/dist/commands/solutions-onboarding.d.ts +5 -0
  31. package/dist/commands/solutions-onboarding.d.ts.map +1 -0
  32. package/dist/commands/solutions-onboarding.js +113 -0
  33. package/dist/commands/solutions-onboarding.js.map +1 -0
  34. package/dist/commands/solutions-ops.d.ts.map +1 -1
  35. package/dist/commands/solutions-ops.js +278 -17
  36. package/dist/commands/solutions-ops.js.map +1 -1
  37. package/dist/index.d.ts +1 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -1
  40. package/dist/index.js.map +1 -1
  41. package/node_modules/@noodle-borg/admission-limits/dist/counter-store.d.ts +21 -2
  42. package/node_modules/@noodle-borg/admission-limits/dist/counter-store.js +10 -1
  43. package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.d.ts +5 -1
  44. package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.js +31 -2
  45. package/node_modules/@noodle-borg/admission-limits/dist/portable.d.ts +3 -0
  46. package/node_modules/@noodle-borg/admission-limits/dist/portable.js +3 -0
  47. package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.d.ts +28 -0
  48. package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.js +124 -0
  49. package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.d.ts +54 -0
  50. package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.js +74 -0
  51. package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.d.ts +11 -0
  52. package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.js +19 -0
  53. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +2 -0
  54. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +5 -5
  55. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +3 -0
  56. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +15 -3
  57. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +1 -1
  58. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  59. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.d.ts +9 -1
  60. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.js +33 -2
  61. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.d.ts +3 -0
  62. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.js +29 -0
  63. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.d.ts +5 -3
  64. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.js +21 -10
  65. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.d.ts +1 -1
  66. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.js +3 -3
  67. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.d.ts +1 -0
  68. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.js +1 -0
  69. package/node_modules/@noodle-borg/assistant-gateway/dist/session-target.js +5 -4
  70. package/node_modules/@noodle-borg/authoring/dist/config.d.ts +20 -0
  71. package/node_modules/@noodle-borg/authoring/dist/config.js +29 -2
  72. package/node_modules/@noodle-borg/authoring/dist/connectors.d.ts +6 -1
  73. package/node_modules/@noodle-borg/authoring/dist/connectors.js +5 -0
  74. package/node_modules/@noodle-borg/authoring/dist/index.d.ts +2 -2
  75. package/node_modules/@noodle-borg/authoring/dist/json-schema.d.ts +1 -1
  76. package/node_modules/@noodle-borg/authoring/dist/json-schema.js +15 -2
  77. package/node_modules/@noodle-borg/authoring/dist/load-authored.js +1 -1
  78. package/node_modules/@noodle-borg/authoring/dist/managed-collection.d.ts +18 -4
  79. package/node_modules/@noodle-borg/authoring/dist/managed-collection.js +22 -3
  80. package/node_modules/@noodle-borg/authoring/dist/platform.d.ts +3 -0
  81. package/node_modules/@noodle-borg/authoring/dist/platform.js +4 -0
  82. package/node_modules/@noodle-borg/authoring/dist/server-presentation.js +43 -0
  83. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +3 -1
  84. package/node_modules/@noodle-borg/authoring/dist/server.js +4 -44
  85. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-billing.js +18 -0
  86. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-config.js +31 -4
  87. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-solutions.js +778 -0
  88. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-tenant-resources.js +0 -241
  89. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-types.js +7 -0
  90. package/node_modules/@noodle-borg/cli-catalog/dist/index.js +20 -0
  91. package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +2 -1
  92. package/node_modules/@noodle-borg/compiler/dist/artifact/catalog-emission.js +3 -1
  93. package/node_modules/@noodle-borg/compiler/dist/artifact/config.js +3 -0
  94. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +17 -1
  95. package/node_modules/@noodle-borg/compiler/dist/artifact/version.d.ts +6 -1
  96. package/node_modules/@noodle-borg/compiler/dist/artifact/version.js +6 -1
  97. package/node_modules/@noodle-borg/compiler/dist/business-variables.d.ts +27 -0
  98. package/node_modules/@noodle-borg/compiler/dist/business-variables.js +230 -0
  99. package/node_modules/@noodle-borg/compiler/dist/compile.js +7 -1
  100. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +1 -1
  101. package/node_modules/@noodle-borg/compiler/dist/index.d.ts +3 -0
  102. package/node_modules/@noodle-borg/compiler/dist/index.js +3 -0
  103. package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.d.ts +52 -0
  104. package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.js +92 -0
  105. package/node_modules/@noodle-borg/compiler/dist/managed-collections.d.ts +26 -1
  106. package/node_modules/@noodle-borg/compiler/dist/managed-collections.js +190 -1
  107. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +100 -36
  108. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +2 -0
  109. package/node_modules/@noodle-borg/compiler/dist/native-record-operations.d.ts +7 -0
  110. package/node_modules/@noodle-borg/compiler/dist/native-record-operations.js +59 -0
  111. package/node_modules/@noodle-borg/connector-defs/dist/compile-http.js +83 -8
  112. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts +31 -1
  113. package/node_modules/@noodle-borg/connector-defs/dist/schema.js +16 -0
  114. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +12 -3
  115. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +41 -2
  116. package/node_modules/@noodle-borg/connector-http/dist/http-response.js +3 -2
  117. package/node_modules/@noodle-borg/connector-http/dist/mcp/config.js +1 -1
  118. package/node_modules/@noodle-borg/connector-http/dist/url-resolution.js +1 -1
  119. package/node_modules/@noodle-borg/control-plane/dist/contracts.d.ts +2 -1
  120. package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.d.ts +3 -0
  121. package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.js +11 -0
  122. package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.d.ts +45 -0
  123. package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.js +74 -0
  124. package/node_modules/@noodle-borg/control-plane/dist/portable.d.ts +1 -0
  125. package/node_modules/@noodle-borg/control-plane/dist/portable.js +1 -0
  126. package/node_modules/@noodle-borg/module/dist/contract.d.ts +20 -0
  127. package/node_modules/@noodle-borg/module/dist/platform-human-identity.d.ts +2 -0
  128. package/node_modules/@noodle-borg/protocol/dist/request-deps.js +1 -0
  129. package/node_modules/@noodle-borg/protocol/dist/request-state.d.ts +1 -0
  130. package/node_modules/@noodle-borg/protocol/dist/request-state.js +11 -2
  131. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts +2 -0
  132. package/node_modules/@noodle-borg/protocol/dist/v2/input-required.js +2 -1
  133. package/node_modules/@noodle-borg/protocol/dist/v2/server.js +2 -1
  134. package/node_modules/@noodle-borg/runtime/dist/ambient-context.js +6 -1
  135. package/node_modules/@noodle-borg/runtime/dist/broker/types.d.ts +2 -0
  136. package/node_modules/@noodle-borg/runtime/dist/business-variables.d.ts +15 -0
  137. package/node_modules/@noodle-borg/runtime/dist/business-variables.js +75 -0
  138. package/node_modules/@noodle-borg/runtime/dist/confirmation-continuation.js +2 -1
  139. package/node_modules/@noodle-borg/runtime/dist/confirmation.js +23 -3
  140. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +17 -1
  141. package/node_modules/@noodle-borg/runtime/dist/connector-snapshot.js +6 -0
  142. package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +18 -3
  143. package/node_modules/@noodle-borg/runtime/dist/execute.js +13 -3
  144. package/node_modules/@noodle-borg/runtime/dist/index.d.ts +2 -0
  145. package/node_modules/@noodle-borg/runtime/dist/index.js +1 -0
  146. package/node_modules/@noodle-borg/runtime/dist/interactive.js +11 -0
  147. package/node_modules/@noodle-borg/runtime/dist/managed-origins.d.ts +3 -1
  148. package/node_modules/@noodle-borg/runtime/dist/managed-origins.js +32 -7
  149. package/node_modules/@noodle-borg/runtime/dist/operation-credential.js +6 -0
  150. package/node_modules/@noodle-borg/runtime/dist/operation-evidence.d.ts +30 -0
  151. package/node_modules/@noodle-borg/runtime/dist/operation-evidence.js +68 -0
  152. package/node_modules/@noodle-borg/runtime/dist/operation-execution.d.ts +2 -2
  153. package/node_modules/@noodle-borg/runtime/dist/operation-execution.js +142 -71
  154. package/node_modules/@noodle-borg/runtime/dist/result.d.ts +6 -4
  155. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.d.ts +7 -0
  156. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.js +48 -4
  157. package/node_modules/@noodle-borg/service/dist/admission.js +2 -1
  158. package/node_modules/@noodle-borg/service/dist/application-activity.js +236 -0
  159. package/node_modules/@noodle-borg/service/dist/application-business-notice.js +28 -0
  160. package/node_modules/@noodle-borg/service/dist/application-runtime-target.js +141 -0
  161. package/node_modules/@noodle-borg/service/dist/application-settings-targets.js +72 -0
  162. package/node_modules/@noodle-borg/service/dist/application-settings.js +210 -0
  163. package/node_modules/@noodle-borg/service/dist/business-api-admission.js +121 -0
  164. package/node_modules/@noodle-borg/service/dist/business-information/activity-pagination.js +73 -0
  165. package/node_modules/@noodle-borg/service/dist/business-information/business-notice.d.ts +24 -0
  166. package/node_modules/@noodle-borg/service/dist/business-information/business-notice.js +18 -0
  167. package/node_modules/@noodle-borg/service/dist/business-information/collection-controls.js +51 -0
  168. package/node_modules/@noodle-borg/service/dist/business-information/contracts.d.ts +439 -0
  169. package/node_modules/@noodle-borg/service/dist/business-information/definition-resolver.js +94 -0
  170. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-installation-lifecycle.js +136 -0
  171. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-invitations.js +160 -0
  172. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-locks.js +23 -0
  173. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-store.js +287 -132
  174. package/node_modules/@noodle-borg/service/dist/business-information/installation-capacity.js +10 -0
  175. package/node_modules/@noodle-borg/service/dist/business-information/invitations.js +68 -0
  176. package/node_modules/@noodle-borg/service/dist/business-information/legacy-request-migration.js +60 -0
  177. package/node_modules/@noodle-borg/service/dist/business-information/managed-releases.js +245 -0
  178. package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-blueprints.js +51 -0
  179. package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-executable.js +76 -0
  180. package/node_modules/@noodle-borg/service/dist/business-information/model.js +124 -23
  181. package/node_modules/@noodle-borg/service/dist/business-information/native-query.js +162 -0
  182. package/node_modules/@noodle-borg/service/dist/business-information/native-storage-budget.js +60 -0
  183. package/node_modules/@noodle-borg/service/dist/business-information/pagination.js +28 -0
  184. package/node_modules/@noodle-borg/service/dist/business-information/portable.js +9 -0
  185. package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.d.ts +11 -0
  186. package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.js +42 -0
  187. package/node_modules/@noodle-borg/service/dist/business-information/profiles.js +137 -6
  188. package/node_modules/@noodle-borg/service/dist/business-information/reader-floor.js +26 -0
  189. package/node_modules/@noodle-borg/service/dist/business-information/source-credential-fence.js +79 -0
  190. package/node_modules/@noodle-borg/service/dist/business-information/source-custody-budget.js +30 -0
  191. package/node_modules/@noodle-borg/service/dist/business-information/source-custody-memory.js +122 -0
  192. package/node_modules/@noodle-borg/service/dist/business-information/source-executor.js +191 -0
  193. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-contracts.js +2 -0
  194. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-coordinator.js +136 -0
  195. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-failures.js +32 -0
  196. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-state.js +154 -0
  197. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-store.js +568 -0
  198. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-types.js +26 -0
  199. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-values.js +59 -0
  200. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-pagination.js +54 -0
  201. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-validation.js +163 -0
  202. package/node_modules/@noodle-borg/service/dist/business-information/source-refresh-retention.js +29 -0
  203. package/node_modules/@noodle-borg/service/dist/business-information-runtime.js +80 -0
  204. package/node_modules/@noodle-borg/service/dist/business-onboarding.js +73 -0
  205. package/node_modules/@noodle-borg/service/dist/connections/types.js +8 -0
  206. package/node_modules/@noodle-borg/service/dist/credential-binding-index.js +38 -33
  207. package/node_modules/@noodle-borg/service/dist/deployment-execution.js +275 -0
  208. package/node_modules/@noodle-borg/service/dist/external-credential-binding-broker.js +19 -1
  209. package/node_modules/@noodle-borg/service/dist/external-credential-exchange.d.ts +16 -1
  210. package/node_modules/@noodle-borg/service/dist/modules/host.js +4 -1
  211. package/node_modules/@noodle-borg/service/dist/native-record-connector.d.ts +20 -0
  212. package/node_modules/@noodle-borg/service/dist/native-record-connector.js +206 -0
  213. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts +3 -0
  214. package/node_modules/@noodle-borg/service/dist/operation-evidence.js +89 -0
  215. package/node_modules/@noodle-borg/service/dist/recovery-quarantine.js +49 -0
  216. package/node_modules/@noodle-borg/service/dist/registry-compile.js +60 -11
  217. package/node_modules/@noodle-borg/service/dist/registry-deploy-transaction.js +18 -0
  218. package/node_modules/@noodle-borg/service/dist/registry-rollback.js +2 -1
  219. package/node_modules/@noodle-borg/service/dist/registry-state.d.ts +1 -1
  220. package/node_modules/@noodle-borg/service/dist/registry-state.js +6 -3
  221. package/node_modules/@noodle-borg/service/dist/registry-targets.js +49 -0
  222. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +2 -0
  223. package/node_modules/@noodle-borg/service/dist/registry.d.ts +15 -3
  224. package/node_modules/@noodle-borg/service/dist/registry.js +177 -137
  225. package/node_modules/@noodle-borg/service/dist/routes/assistant-appearance.js +3 -2
  226. package/node_modules/@noodle-borg/service/dist/routes/assistant-clients.js +2 -1
  227. package/node_modules/@noodle-borg/service/dist/routes/assistant-doctor.js +2 -1
  228. package/node_modules/@noodle-borg/service/dist/routes/assistant-embeds.js +8 -3
  229. package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.js +1 -1
  230. package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +48 -36
  231. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-configuration.js +3 -2
  232. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-session.js +10 -10
  233. package/node_modules/@noodle-borg/service/dist/routes/assistant-session-target.js +32 -3
  234. package/node_modules/@noodle-borg/service/dist/routes/assistant-suggestions.js +1 -1
  235. package/node_modules/@noodle-borg/service/dist/routes/assistant-transcript.js +1 -1
  236. package/node_modules/@noodle-borg/service/dist/routes/assistant.js +10 -10
  237. package/node_modules/@noodle-borg/service/dist/routes/business-information-activity.js +83 -0
  238. package/node_modules/@noodle-borg/service/dist/routes/business-information-admission.js +26 -0
  239. package/node_modules/@noodle-borg/service/dist/routes/business-information-channels.js +153 -0
  240. package/node_modules/@noodle-borg/service/dist/routes/business-information-connections.js +107 -0
  241. package/node_modules/@noodle-borg/service/dist/routes/business-information-dispatch.js +87 -4
  242. package/node_modules/@noodle-borg/service/dist/routes/business-information-external.js +79 -0
  243. package/node_modules/@noodle-borg/service/dist/routes/business-information-installation.js +24 -0
  244. package/node_modules/@noodle-borg/service/dist/routes/business-information-notice.js +69 -0
  245. package/node_modules/@noodle-borg/service/dist/routes/business-information-onboarding.js +58 -0
  246. package/node_modules/@noodle-borg/service/dist/routes/business-information-paths.js +76 -0
  247. package/node_modules/@noodle-borg/service/dist/routes/business-information-public.js +151 -0
  248. package/node_modules/@noodle-borg/service/dist/routes/business-information-reader-floor.js +15 -0
  249. package/node_modules/@noodle-borg/service/dist/routes/business-information-record-create.js +29 -0
  250. package/node_modules/@noodle-borg/service/dist/routes/business-information-record-reads.js +36 -0
  251. package/node_modules/@noodle-borg/service/dist/routes/business-information-request.js +64 -0
  252. package/node_modules/@noodle-borg/service/dist/routes/business-information-settings.js +64 -0
  253. package/node_modules/@noodle-borg/service/dist/routes/business-information-source.js +249 -0
  254. package/node_modules/@noodle-borg/service/dist/routes/business-information-staff.js +258 -0
  255. package/node_modules/@noodle-borg/service/dist/routes/business-information-wire.js +226 -26
  256. package/node_modules/@noodle-borg/service/dist/routes/business-information.js +238 -197
  257. package/node_modules/@noodle-borg/service/dist/routes/config-values-dispatch.js +1 -1
  258. package/node_modules/@noodle-borg/service/dist/routes/config-values.js +26 -4
  259. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +19 -233
  260. package/node_modules/@noodle-borg/service/dist/routes/deployment-activation-response.js +13 -4
  261. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +4 -0
  262. package/node_modules/@noodle-borg/service/dist/service.js +57 -11
  263. package/node_modules/@noodle-borg/service/dist/solution-installation-activation.js +149 -0
  264. package/node_modules/@noodle-borg/service/dist/source-configuration-authority.js +94 -0
  265. package/node_modules/@noodle-borg/service/dist/state-catalog.js +6 -5
  266. package/node_modules/@noodle-borg/service/dist/store/config-values.d.ts +42 -17
  267. package/node_modules/@noodle-borg/service/dist/store/config-values.js +123 -24
  268. package/node_modules/@noodle-borg/service/dist/store/in-memory.d.ts +1 -0
  269. package/node_modules/@noodle-borg/service/dist/store/in-memory.js +3 -0
  270. package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +1 -0
  271. package/node_modules/@noodle-borg/service/dist/store/json-file.js +3 -0
  272. package/node_modules/@noodle-borg/service/dist/store.d.ts +3 -1
  273. package/node_modules/@noodle-borg/service/package.json +2 -2
  274. package/node_modules/@noodle-borg/transport-http/dist/serve-request.js +9 -0
  275. package/node_modules/@noodle-borg/transport-http/package.json +1 -0
  276. package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.d.ts +143 -0
  277. package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.js +90 -0
  278. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.d.ts +130 -0
  279. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.js +77 -0
  280. package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.d.ts +105 -0
  281. package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.js +67 -0
  282. package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.d.ts +27 -0
  283. package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.js +28 -0
  284. package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.d.ts +112 -0
  285. package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.js +88 -0
  286. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts +1 -1
  287. package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.d.ts +62 -0
  288. package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.js +57 -0
  289. package/node_modules/@noodle-borg/wire-contracts/dist/billing-enforcement.d.ts +12 -12
  290. package/node_modules/@noodle-borg/wire-contracts/dist/billing-metering.d.ts +4 -4
  291. package/node_modules/@noodle-borg/wire-contracts/dist/billing-org-transfer.d.ts +3 -3
  292. package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.d.ts +25 -0
  293. package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.js +37 -0
  294. package/node_modules/@noodle-borg/wire-contracts/dist/business-information.d.ts +1816 -158
  295. package/node_modules/@noodle-borg/wire-contracts/dist/business-information.js +416 -41
  296. package/node_modules/@noodle-borg/wire-contracts/dist/control-plane.d.ts +2 -2
  297. package/node_modules/@noodle-borg/wire-contracts/dist/distribution.d.ts +5 -5
  298. package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +8 -0
  299. package/node_modules/@noodle-borg/wire-contracts/dist/index.js +8 -0
  300. package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts +3 -3
  301. package/node_modules/@noodle-borg/wire-contracts/dist/managed-assistant-sponsorship.d.ts +7 -7
  302. package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.d.ts +5 -0
  303. package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.js +1 -0
  304. package/node_modules/@noodle-borg/wire-contracts/dist/platform-auth.d.ts +66 -66
  305. package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.d.ts +143 -0
  306. package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.js +94 -0
  307. package/node_modules/@noodleseed/assistant/README.md +5 -0
  308. package/package.json +2 -2
@@ -0,0 +1,107 @@
1
+ import { readJsonBody, sendJson } from '@noodle-borg/transport-http';
2
+ import { ApplicationConnectionCallbackRequestSchema, ApplicationConnectionCallbackResponseSchema, ApplicationConnectionConnectRequestSchema, ApplicationConnectionConnectResponseSchema, ApplicationConnectionDisconnectRequestSchema, ApplicationConnectionsResponseSchema, } from '@noodle-borg/wire-contracts';
3
+ import { businessGrantAllows, } from '../business-information/portable.js';
4
+ import { ConnectionError, } from '../connections/types.js';
5
+ import { requireIdentity, requireInstallationPermission, } from './business-information.js';
6
+ export async function handleApplicationConnections(req, res, ref, deps) {
7
+ const mutation = ref.connectionAction !== undefined;
8
+ if (req.method !== (mutation ? 'POST' : 'GET')) {
9
+ res.setHeader('allow', mutation ? 'POST' : 'GET');
10
+ return sendJson(res, 405, { error: 'method not allowed' });
11
+ }
12
+ const identity = await requireIdentity(req, res, deps);
13
+ if (identity === false)
14
+ return;
15
+ const authorized = await requireInstallationPermission(res, ref, identity, mutation ? 'installation:administer' : 'records:read', deps);
16
+ if (authorized === undefined)
17
+ return;
18
+ if (authorized.grant.role === 'viewer')
19
+ return sendJson(res, 403, {
20
+ code: 'connection_denied',
21
+ error: 'Integration access requires an operator grant.',
22
+ });
23
+ res.setHeader('cache-control', 'private, no-store');
24
+ if (!deps.connections || !deps.resolveConnectionTargets)
25
+ return failure(res, new ConnectionError('connection_unavailable'));
26
+ try {
27
+ const targets = await deps.resolveConnectionTargets(authorized.installation);
28
+ const connections = deps.connections;
29
+ const projection = async () => ({
30
+ connections: await Promise.all(targets.map((target) => connections.inspect(target))),
31
+ canEdit: businessGrantAllows(authorized.grant, 'installation:administer'),
32
+ });
33
+ if (!mutation)
34
+ return sendJson(res, 200, ApplicationConnectionsResponseSchema.parse({ ok: true, data: await projection() }));
35
+ const target = targets.find((item) => item.key.connectionId === ref.connectionId);
36
+ if (!target)
37
+ return sendJson(res, 404, {
38
+ code: 'connection_unavailable',
39
+ error: 'Connection is unavailable.',
40
+ });
41
+ const body = await readJsonBody(req, Math.min(deps.maxBody, 16_384));
42
+ if (!body.ok)
43
+ return sendJson(res, body.status, { error: body.error });
44
+ if (ref.connectionAction === 'connect') {
45
+ const input = ApplicationConnectionConnectRequestSchema.safeParse(body.value);
46
+ if (!input.success)
47
+ return failure(res, new ConnectionError('connection_invalid'));
48
+ const data = await connections.connect(target, input.data, identity.subject);
49
+ return sendJson(res, 200, ApplicationConnectionConnectResponseSchema.parse({ ok: true, data }));
50
+ }
51
+ const input = ApplicationConnectionDisconnectRequestSchema.safeParse(body.value);
52
+ if (!input.success)
53
+ return failure(res, new ConnectionError('connection_invalid'));
54
+ await connections.disconnect(target, input.data.expectedRevision, identity.subject);
55
+ await deps.audit?.emit({
56
+ eventType: 'config.connection.disconnected',
57
+ org: authorized.scope.org,
58
+ app: authorized.scope.app,
59
+ env: authorized.scope.env,
60
+ actorSubject: identity.subject,
61
+ details: { connectionId: target.key.connectionId },
62
+ });
63
+ sendJson(res, 200, ApplicationConnectionsResponseSchema.parse({ ok: true, data: await projection() }));
64
+ }
65
+ catch (error) {
66
+ if (!(error instanceof ConnectionError))
67
+ throw error;
68
+ failure(res, error);
69
+ }
70
+ }
71
+ export async function handleApplicationConnectionCallback(req, res, deps) {
72
+ if (req.method !== 'POST') {
73
+ res.setHeader('allow', 'POST');
74
+ return sendJson(res, 405, { error: 'method not allowed' });
75
+ }
76
+ const identity = await requireIdentity(req, res, deps);
77
+ if (identity === false)
78
+ return;
79
+ res.setHeader('cache-control', 'private, no-store');
80
+ if (!deps.connections)
81
+ return failure(res, new ConnectionError('connection_unavailable'));
82
+ const body = await readJsonBody(req, Math.min(deps.maxBody, 16_384));
83
+ if (!body.ok)
84
+ return sendJson(res, body.status, { error: body.error });
85
+ const input = ApplicationConnectionCallbackRequestSchema.safeParse(body.value);
86
+ if (!input.success)
87
+ return failure(res, new ConnectionError('connection_invalid'));
88
+ try {
89
+ const data = await deps.connections.callback(input.data, identity.subject);
90
+ sendJson(res, 200, ApplicationConnectionCallbackResponseSchema.parse({ ok: true, data }));
91
+ }
92
+ catch (error) {
93
+ if (!(error instanceof ConnectionError))
94
+ throw error;
95
+ failure(res, error);
96
+ }
97
+ }
98
+ function failure(res, error) {
99
+ sendJson(res, error.code === 'connection_denied'
100
+ ? 403
101
+ : error.code === 'connection_conflict'
102
+ ? 409
103
+ : error.code === 'connection_unavailable'
104
+ ? 503
105
+ : 400, { code: error.code, error: 'Connection request could not be completed.' });
106
+ }
107
+ //# sourceMappingURL=business-information-connections.js.map
@@ -1,10 +1,44 @@
1
+ import { OrganizationAgreementError } from '@noodle-borg/control-plane/portable';
2
+ import { sendJson } from '@noodle-borg/transport-http';
3
+ import { BusinessNoticeError } from '../business-information/business-notice.js';
4
+ import { InstallationCapacityError } from '../business-information/installation-capacity.js';
5
+ import { NativeStorageLimitError } from '../business-information/native-storage-budget.js';
6
+ import { SourceCredentialError } from '../business-information/source-credential-fence.js';
7
+ import { SourceCapacityError } from '../business-information/source-custody-budget.js';
1
8
  import { respondRouteError } from '../http-util.js';
2
- import { handleBusinessGrants, handleManagedRecords, handlePublicSolutionIntake, handleSolutionCatalog, handleSolutionInstallations, } from './business-information.js';
3
- import { parsePublicSolutionIntakePath, parseSolutionInstallationPath, } from './business-information-paths.js';
9
+ import { handleBusinessGrants, handleManagedRecords, handleSolutionCatalog, handleSolutionInstallations, } from './business-information.js';
10
+ import { handleApplicationActivity, } from './business-information-activity.js';
11
+ import { handleBusinessChannels, } from './business-information-channels.js';
12
+ import { handleApplicationConnectionCallback, handleApplicationConnections, } from './business-information-connections.js';
13
+ import { handleBusinessNotice, handleOrganizationAgreement, } from './business-information-notice.js';
14
+ import { handleSolutionInstallationOptions } from './business-information-onboarding.js';
15
+ import { parsePublicSolutionIntakePath, parseSolutionInstallationPath, parseSolutionInvitationAcceptPath, } from './business-information-paths.js';
16
+ import { handlePublicSolutionIntake } from './business-information-public.js';
17
+ import { handleBusinessInformationReaderFloor } from './business-information-reader-floor.js';
18
+ import { handleBusinessSettings } from './business-information-settings.js';
19
+ import { handleCollectionSource } from './business-information-source.js';
20
+ import { handleBusinessInvitationAccept, handleBusinessInvitations, handleEligibleBusinessAssignees, handleMySolutionInstallations, } from './business-information-staff.js';
4
21
  export function dispatchBusinessInformationRoutes(req, res, url, deps) {
22
+ const agreement = /^\/v1\/orgs\/([a-z0-9][a-z0-9-]{0,62})\/agreement$/.exec(url.pathname);
23
+ if (agreement?.[1])
24
+ return run(req, res, deps, () => handleOrganizationAgreement(req, res, agreement[1], deps));
25
+ if (url.pathname === '/v1/solution-connections/callback')
26
+ return run(req, res, deps, () => handleApplicationConnectionCallback(req, res, deps));
27
+ if (url.pathname === '/v1/service/business-information-reader-floor') {
28
+ return run(req, res, deps, () => handleBusinessInformationReaderFloor(req, res, deps));
29
+ }
5
30
  if (url.pathname === '/v1/solutions/catalog') {
6
31
  return run(req, res, deps, () => Promise.resolve(handleSolutionCatalog(req, res)));
7
32
  }
33
+ if (url.pathname === '/v1/me/solution-installations') {
34
+ return run(req, res, deps, () => handleMySolutionInstallations(req, res, deps));
35
+ }
36
+ if (url.pathname === '/v1/me/solution-installation-options')
37
+ return run(req, res, deps, () => handleSolutionInstallationOptions(req, res, deps));
38
+ const invitationToken = parseSolutionInvitationAcceptPath(url.pathname);
39
+ if (invitationToken !== undefined) {
40
+ return run(req, res, deps, () => handleBusinessInvitationAccept(req, res, invitationToken, deps));
41
+ }
8
42
  const publicRef = parsePublicSolutionIntakePath(url.pathname);
9
43
  if (publicRef !== undefined) {
10
44
  deps.applySecurityHeaders(res, deps.tls);
@@ -16,15 +50,43 @@ export function dispatchBusinessInformationRoutes(req, res, url, deps) {
16
50
  res.end();
17
51
  return true;
18
52
  }
19
- void handlePublicSolutionIntake(req, res, publicRef, deps).catch((error) => respondRouteError(deps.logger, res, 'business_information.public_route.failed', error));
53
+ void handlePublicSolutionIntake(req, res, publicRef, deps).catch((error) => respondBusinessError(deps, res, 'business_information.public_route.failed', error));
20
54
  return true;
21
55
  }
22
56
  const installationRef = parseSolutionInstallationPath(url.pathname);
23
57
  if (installationRef === undefined)
24
58
  return false;
59
+ if (installationRef.action === 'notice')
60
+ return run(req, res, deps, () => handleBusinessNotice(req, res, installationRef, deps));
61
+ if (installationRef.action === 'activity' && installationRef.collection === undefined)
62
+ return run(req, res, deps, () => handleApplicationActivity(req, res, url, installationRef, deps));
63
+ if (installationRef.action === 'connections')
64
+ return run(req, res, deps, () => handleApplicationConnections(req, res, installationRef, deps));
65
+ if (installationRef.action === 'settings') {
66
+ return run(req, res, deps, () => handleBusinessSettings(req, res, installationRef, deps));
67
+ }
68
+ if (installationRef.action === 'channels' &&
69
+ deps.registry !== undefined &&
70
+ deps.resolveEndpointBase !== undefined) {
71
+ const channelDeps = {
72
+ ...deps,
73
+ registry: deps.registry,
74
+ resolveEndpointBase: deps.resolveEndpointBase,
75
+ };
76
+ return run(req, res, deps, () => handleBusinessChannels(req, res, installationRef, channelDeps));
77
+ }
25
78
  if (installationRef.action === 'grants') {
26
79
  return run(req, res, deps, () => handleBusinessGrants(req, res, installationRef, deps));
27
80
  }
81
+ if (installationRef.action === 'invitations') {
82
+ return run(req, res, deps, () => handleBusinessInvitations(req, res, installationRef, deps));
83
+ }
84
+ if (installationRef.action === 'assignees') {
85
+ return run(req, res, deps, () => handleEligibleBusinessAssignees(req, res, installationRef, deps));
86
+ }
87
+ if (installationRef.action === 'source') {
88
+ return run(req, res, deps, () => handleCollectionSource(req, res, installationRef, deps));
89
+ }
28
90
  if (installationRef.action === 'records' ||
29
91
  installationRef.action === 'activity' ||
30
92
  installationRef.action === 'export') {
@@ -42,7 +104,28 @@ function run(req, res, deps, handle) {
42
104
  deps.applySecurityHeaders(res, deps.tls);
43
105
  if (deps.enforceHttps(req, res, deps.tls))
44
106
  return true;
45
- void handle().catch((error) => respondRouteError(deps.logger, res, 'business_information.route.failed', error));
107
+ void handle().catch((error) => respondBusinessError(deps, res, 'business_information.route.failed', error));
46
108
  return true;
47
109
  }
110
+ function respondBusinessError(deps, res, event, error) {
111
+ if (error instanceof OrganizationAgreementError || error instanceof BusinessNoticeError) {
112
+ const forbidden = error.code === 'agreement_owner_required' || error.code === 'business_notice_forbidden';
113
+ sendJson(res, forbidden ? 403 : 409, { error: error.message, code: error.code });
114
+ return;
115
+ }
116
+ if (error instanceof SourceCredentialError) {
117
+ sendJson(res, 503, {
118
+ error: 'Collection source authorization changed; reconnect and replace its binding.',
119
+ code: 'source_unavailable',
120
+ });
121
+ return;
122
+ }
123
+ if (error instanceof NativeStorageLimitError ||
124
+ error instanceof SourceCapacityError ||
125
+ error instanceof InstallationCapacityError) {
126
+ sendJson(res, 409, { error: error.message, code: error.code });
127
+ return;
128
+ }
129
+ respondRouteError(deps.logger, res, event, error);
130
+ }
48
131
  //# sourceMappingURL=business-information-dispatch.js.map
@@ -0,0 +1,79 @@
1
+ import { sendJson } from '@noodle-borg/transport-http';
2
+ import { CursorValidationError, } from '../business-information/portable.js';
3
+ import { externalRecordToWire } from './business-information-wire.js';
4
+ export function sourceBindingKey(installation, collection) {
5
+ return {
6
+ scope: installation.scope,
7
+ collectionKey: collection.key,
8
+ id: collection.key,
9
+ };
10
+ }
11
+ export async function loadExternalRecords(installation, collection, deps, paging = {}) {
12
+ if (deps.sourceStore === undefined)
13
+ return undefined;
14
+ const key = sourceBindingKey(installation, collection);
15
+ const binding = await deps.sourceStore.getBinding(key);
16
+ if (binding === undefined)
17
+ return undefined;
18
+ if (binding.state === 'revoked' || binding.health === 'reauth_required')
19
+ return undefined;
20
+ const page = await deps.sourceStore.listExternalRecords({
21
+ ...key,
22
+ generation: binding.generation,
23
+ ...paging,
24
+ });
25
+ return { binding, ...page };
26
+ }
27
+ export async function loadExternalRecord(installation, collection, recordId, deps) {
28
+ if (deps.sourceStore === undefined)
29
+ return undefined;
30
+ const key = sourceBindingKey(installation, collection);
31
+ const binding = await deps.sourceStore.getBinding(key);
32
+ if (binding === undefined ||
33
+ binding.state === 'revoked' ||
34
+ binding.health === 'reauth_required') {
35
+ return undefined;
36
+ }
37
+ const record = await deps.sourceStore.getExternalRecord({
38
+ ...key,
39
+ generation: binding.generation,
40
+ recordId,
41
+ });
42
+ return { binding, record };
43
+ }
44
+ export async function sendExternalRecordPage(res, installation, collection, paging, deps) {
45
+ let loaded;
46
+ try {
47
+ loaded = await loadExternalRecords(installation, collection, deps, paging);
48
+ }
49
+ catch (error) {
50
+ if (!(error instanceof CursorValidationError))
51
+ throw error;
52
+ sendJson(res, 400, { error: 'cursor is invalid', code: 'invalid_cursor' });
53
+ return;
54
+ }
55
+ if (loaded === undefined) {
56
+ sendJson(res, 503, {
57
+ error: 'collection source is not configured or unavailable',
58
+ code: 'source_unavailable',
59
+ });
60
+ return;
61
+ }
62
+ sendJson(res, 200, {
63
+ ok: true,
64
+ data: {
65
+ records: loaded.records.map((record) => externalRecordToWire(record, loaded.binding)),
66
+ ...(loaded.nextCursor === undefined ? {} : { nextCursor: loaded.nextCursor }),
67
+ },
68
+ });
69
+ }
70
+ export function unsupportedExternalOperation(res, operation) {
71
+ const normalized = operation === 'set-status' ? 'set-status' : operation;
72
+ sendJson(res, 405, {
73
+ ok: false,
74
+ error: 'externally authoritative collections are read-only replicas; use an application tool for source changes',
75
+ code: 'operation_not_supported',
76
+ details: { authority: 'external', operation: normalized },
77
+ });
78
+ }
79
+ //# sourceMappingURL=business-information-external.js.map
@@ -0,0 +1,24 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { builtInDefinition, } from '../business-information/portable.js';
3
+ export function stableInstallationId(org, app, env) {
4
+ return `ins-${createHash('sha256').update(`${org}\0${app}\0${env}`).digest('hex').slice(0, 24)}`;
5
+ }
6
+ export async function resolveInstallDefinition(selector, installingOrg, resolvePrivateDefinition) {
7
+ if (selector.kind === 'managed') {
8
+ return builtInDefinition(selector.profileId);
9
+ }
10
+ if (selector.publisherOrg !== installingOrg ||
11
+ selector.publisherOrg === undefined ||
12
+ selector.app === undefined ||
13
+ selector.environment === undefined ||
14
+ selector.deploymentId === undefined) {
15
+ return undefined;
16
+ }
17
+ return resolvePrivateDefinition?.({
18
+ publisherOrg: selector.publisherOrg,
19
+ app: selector.app,
20
+ environment: selector.environment,
21
+ deploymentId: selector.deploymentId,
22
+ });
23
+ }
24
+ //# sourceMappingURL=business-information-installation.js.map
@@ -0,0 +1,69 @@
1
+ import { readJsonBody, sendJson } from '@noodle-borg/transport-http';
2
+ import { BusinessNoticeResponseSchema, BusinessNoticeSaveRequestSchema, OrganizationAgreementAcceptRequestSchema, OrganizationAgreementResponseSchema, } from '@noodle-borg/wire-contracts';
3
+ import { admitBusinessTarget } from '../business-api-admission.js';
4
+ import { sendForbidden } from '../http-util.js';
5
+ import { invalid, methodNotAllowed, requireIdentity, requireInstallationGrant, requireInstallationPermission, } from './business-information.js';
6
+ import { canManageMembers } from './org-admin.js';
7
+ export async function handleOrganizationAgreement(req, res, org, deps) {
8
+ if (req.method !== 'GET' && req.method !== 'POST')
9
+ return methodNotAllowed(res);
10
+ const identity = await requireIdentity(req, res, deps);
11
+ if (identity === false)
12
+ return;
13
+ if (!(await canManageMembers(deps.controlPlane, org, identity)))
14
+ return sendForbidden(res, 'organization owner required');
15
+ if (!(await admitBusinessTarget(res, { org })))
16
+ return;
17
+ const onboarding = deps.businessOnboarding;
18
+ if (!onboarding)
19
+ return sendJson(res, 503, {
20
+ code: 'business_setup_unavailable',
21
+ error: 'Business agreement configuration is unavailable.',
22
+ });
23
+ let status = await onboarding.status(org, identity.subject);
24
+ if (req.method === 'POST') {
25
+ const body = await readJsonBody(req, deps.maxBody);
26
+ if (!body.ok)
27
+ return sendJson(res, body.status, { error: body.error });
28
+ const parsed = OrganizationAgreementAcceptRequestSchema.safeParse(body.value);
29
+ if (!parsed.success)
30
+ return invalid(res, parsed.error);
31
+ status = await onboarding.accept(org, identity.subject, parsed.data);
32
+ }
33
+ return sendJson(res, 200, OrganizationAgreementResponseSchema.parse({ ok: true, data: status }));
34
+ }
35
+ export async function handleBusinessNotice(req, res, ref, deps) {
36
+ if (req.method !== 'GET' && req.method !== 'PUT')
37
+ return methodNotAllowed(res);
38
+ const identity = await requireIdentity(req, res, deps);
39
+ if (identity === false)
40
+ return;
41
+ const authorized = req.method === 'PUT'
42
+ ? await requireInstallationPermission(res, ref, identity, 'installation:administer', deps)
43
+ : await requireInstallationGrant(res, ref, identity, deps);
44
+ if (!authorized)
45
+ return;
46
+ let record = await deps.store.getBusinessNotice(authorized.scope);
47
+ if (req.method === 'PUT') {
48
+ const body = await readJsonBody(req, deps.maxBody);
49
+ if (!body.ok)
50
+ return sendJson(res, body.status, { error: body.error });
51
+ const parsed = BusinessNoticeSaveRequestSchema.safeParse(body.value);
52
+ if (!parsed.success)
53
+ return invalid(res, parsed.error);
54
+ record = await deps.store.setBusinessNotice({
55
+ scope: authorized.scope,
56
+ ...parsed.data,
57
+ actorSubject: identity.subject,
58
+ });
59
+ }
60
+ return sendJson(res, 200, BusinessNoticeResponseSchema.parse({
61
+ ok: true,
62
+ data: {
63
+ revision: record?.revision ?? 0,
64
+ notice: record?.notice ?? null,
65
+ canEdit: authorized.grant.role === 'administrator',
66
+ },
67
+ }));
68
+ }
69
+ //# sourceMappingURL=business-information-notice.js.map
@@ -0,0 +1,58 @@
1
+ import { sendJson } from '@noodle-borg/transport-http';
2
+ import { SolutionInstallationOptionsQuerySchema, SolutionInstallationOptionsResponseSchema, } from '@noodle-borg/wire-contracts';
3
+ import { requireIdentity } from './business-information.js';
4
+ import { canManageMembers } from './org-admin.js';
5
+ /** Installation permission only. Deployment still owns transactional capacity admission. */
6
+ export async function handleSolutionInstallationOptions(req, res, deps) {
7
+ if (req.method !== 'GET') {
8
+ res.setHeader('allow', 'GET');
9
+ return sendJson(res, 405, { error: 'method not allowed' });
10
+ }
11
+ const identity = await requireIdentity(req, res, deps);
12
+ if (identity === false)
13
+ return;
14
+ const params = new URL(req.url ?? '/', 'http://service.invalid').searchParams;
15
+ const parsed = SolutionInstallationOptionsQuerySchema.safeParse(Object.fromEntries(params));
16
+ if (!parsed.success || [...params.keys()].some((key) => params.getAll(key).length !== 1))
17
+ return sendJson(res, 400, {
18
+ error: 'invalid installation options query',
19
+ code: 'invalid_query',
20
+ });
21
+ const { cursor, limit } = parsed.data;
22
+ const after = cursor === undefined ? undefined : Buffer.from(cursor, 'base64url').toString('utf8');
23
+ if (after !== undefined &&
24
+ (!/^[a-z][a-z0-9-]{0,99}$/.test(after) || Buffer.from(after).toString('base64url') !== cursor))
25
+ return sendJson(res, 400, {
26
+ error: 'invalid installation options cursor',
27
+ code: 'invalid_query',
28
+ });
29
+ const organizations = identity.superAdmin
30
+ ? await deps.controlPlane.listOrgs()
31
+ : await deps.controlPlane.listOrgsForSubject(identity.subject);
32
+ const eligible = [];
33
+ for (const organization of [...organizations].sort((left, right) => left.slug < right.slug ? -1 : left.slug > right.slug ? 1 : 0)) {
34
+ if (after !== undefined && organization.slug <= after)
35
+ continue;
36
+ if (!(await canManageMembers(deps.controlPlane, organization.slug, identity)))
37
+ continue;
38
+ eligible.push({
39
+ slug: organization.slug,
40
+ ...(organization.displayName === undefined ? {} : { displayName: organization.displayName }),
41
+ });
42
+ if (eligible.length > limit)
43
+ break;
44
+ }
45
+ const page = eligible.slice(0, limit);
46
+ const last = page.at(-1);
47
+ res.setHeader('cache-control', 'no-store');
48
+ sendJson(res, 200, SolutionInstallationOptionsResponseSchema.parse({
49
+ ok: true,
50
+ data: {
51
+ organizations: page,
52
+ ...(eligible.length > limit && last !== undefined
53
+ ? { nextCursor: Buffer.from(last.slug).toString('base64url') }
54
+ : {}),
55
+ },
56
+ }));
57
+ }
58
+ //# sourceMappingURL=business-information-onboarding.js.map
@@ -11,6 +11,36 @@ function decoded(match, index) {
11
11
  }
12
12
  }
13
13
  export function parseSolutionInstallationPath(pathname) {
14
+ const connection = /^\/v1\/orgs\/([^/]+)\/solution-installations\/([^/]+)\/connections(?:\/([^/]+)\/(connect|disconnect))?$/.exec(pathname);
15
+ if (connection !== null) {
16
+ const org = decoded(connection, 1), installationId = decoded(connection, 2), connectionId = decoded(connection, 3);
17
+ const connectionAction = connection[4];
18
+ return org === undefined ||
19
+ installationId === undefined ||
20
+ (connectionAction !== undefined && connectionId === undefined)
21
+ ? undefined
22
+ : {
23
+ org,
24
+ installationId,
25
+ action: 'connections',
26
+ ...(connectionId === undefined ? {} : { connectionId }),
27
+ ...(connectionAction === undefined ? {} : { connectionAction }),
28
+ };
29
+ }
30
+ const application = /^\/v1\/orgs\/([^/]+)\/solution-installations\/([^/]+)\/(settings|notice|channels|activity(?:\/(?:settings|export|preview))?)$/.exec(pathname);
31
+ if (application !== null) {
32
+ const org = decoded(application, 1);
33
+ const installationId = decoded(application, 2);
34
+ return org === undefined || installationId === undefined
35
+ ? undefined
36
+ : {
37
+ org,
38
+ installationId,
39
+ action: application[3]?.startsWith('activity')
40
+ ? 'activity'
41
+ : application[3],
42
+ };
43
+ }
14
44
  let match = /^\/v1\/orgs\/([^/]+)\/solution-installations$/.exec(pathname);
15
45
  if (match !== null) {
16
46
  const org = decoded(match, 1);
@@ -39,6 +69,48 @@ export function parseSolutionInstallationPath(pathname) {
39
69
  ? undefined
40
70
  : { org, installationId, subject, action: 'grants' };
41
71
  }
72
+ match = /^\/v1\/orgs\/([^/]+)\/solution-installations\/([^/]+)\/invitations$/.exec(pathname);
73
+ if (match !== null) {
74
+ const org = decoded(match, 1);
75
+ const installationId = decoded(match, 2);
76
+ return org === undefined || installationId === undefined
77
+ ? undefined
78
+ : { org, installationId, action: 'invitations' };
79
+ }
80
+ match = /^\/v1\/orgs\/([^/]+)\/solution-installations\/([^/]+)\/invitations\/([^/]+)$/.exec(pathname);
81
+ if (match !== null) {
82
+ const org = decoded(match, 1);
83
+ const installationId = decoded(match, 2);
84
+ const invitationId = decoded(match, 3);
85
+ return org === undefined || installationId === undefined || invitationId === undefined
86
+ ? undefined
87
+ : { org, installationId, invitationId, action: 'invitations' };
88
+ }
89
+ match = /^\/v1\/orgs\/([^/]+)\/solution-installations\/([^/]+)\/assignees$/.exec(pathname);
90
+ if (match !== null) {
91
+ const org = decoded(match, 1);
92
+ const installationId = decoded(match, 2);
93
+ return org === undefined || installationId === undefined
94
+ ? undefined
95
+ : { org, installationId, action: 'assignees' };
96
+ }
97
+ match =
98
+ /^\/v1\/orgs\/([^/]+)\/solution-installations\/([^/]+)\/collections\/([^/]+)\/source(?:\/(pause|resume|refresh))?$/.exec(pathname);
99
+ if (match !== null) {
100
+ const org = decoded(match, 1);
101
+ const installationId = decoded(match, 2);
102
+ const collection = decoded(match, 3);
103
+ const sourceAction = match[4];
104
+ return org === undefined || installationId === undefined || collection === undefined
105
+ ? undefined
106
+ : {
107
+ org,
108
+ installationId,
109
+ collection,
110
+ action: 'source',
111
+ ...(sourceAction === undefined ? {} : { sourceAction }),
112
+ };
113
+ }
42
114
  match =
43
115
  /^\/v1\/orgs\/([^/]+)\/solution-installations\/([^/]+)\/collections\/([^/]+)\/records(?:\/(export))?$/.exec(pathname);
44
116
  if (match !== null) {
@@ -76,6 +148,10 @@ export function parseSolutionInstallationPath(pathname) {
76
148
  }
77
149
  return undefined;
78
150
  }
151
+ export function parseSolutionInvitationAcceptPath(pathname) {
152
+ const match = /^\/v1\/solution-invitations\/([^/]+)\/accept$/.exec(pathname);
153
+ return match === null ? undefined : decoded(match, 1);
154
+ }
79
155
  export function parsePublicSolutionIntakePath(pathname) {
80
156
  let match = /^\/v1\/solution-intake\/([^/]+)$/.exec(pathname);
81
157
  if (match !== null) {