@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,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) {