@noodleseed/one 0.161.2 → 0.163.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +3 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/billing-catalog-ops.d.ts +4 -0
  5. package/dist/commands/billing-catalog-ops.d.ts.map +1 -0
  6. package/dist/commands/billing-catalog-ops.js +58 -0
  7. package/dist/commands/billing-catalog-ops.js.map +1 -0
  8. package/dist/commands/billing-ops.d.ts.map +1 -1
  9. package/dist/commands/billing-ops.js +3 -0
  10. package/dist/commands/billing-ops.js.map +1 -1
  11. package/dist/commands/catalog.d.ts.map +1 -1
  12. package/dist/commands/catalog.js +3 -0
  13. package/dist/commands/catalog.js.map +1 -1
  14. package/dist/commands/config-values.d.ts.map +1 -1
  15. package/dist/commands/config-values.js +16 -0
  16. package/dist/commands/config-values.js.map +1 -1
  17. package/dist/commands/installation-variables.d.ts +26 -0
  18. package/dist/commands/installation-variables.d.ts.map +1 -0
  19. package/dist/commands/installation-variables.js +171 -0
  20. package/dist/commands/installation-variables.js.map +1 -0
  21. package/dist/commands/solutions-activity.d.ts +5 -0
  22. package/dist/commands/solutions-activity.d.ts.map +1 -0
  23. package/dist/commands/solutions-activity.js +116 -0
  24. package/dist/commands/solutions-activity.js.map +1 -0
  25. package/dist/commands/solutions-connections.d.ts +7 -0
  26. package/dist/commands/solutions-connections.d.ts.map +1 -0
  27. package/dist/commands/solutions-connections.js +88 -0
  28. package/dist/commands/solutions-connections.js.map +1 -0
  29. package/dist/commands/solutions-installation-options.d.ts +5 -0
  30. package/dist/commands/solutions-installation-options.d.ts.map +1 -0
  31. package/dist/commands/solutions-installation-options.js +52 -0
  32. package/dist/commands/solutions-installation-options.js.map +1 -0
  33. package/dist/commands/solutions-onboarding.d.ts +5 -0
  34. package/dist/commands/solutions-onboarding.d.ts.map +1 -0
  35. package/dist/commands/solutions-onboarding.js +113 -0
  36. package/dist/commands/solutions-onboarding.js.map +1 -0
  37. package/dist/commands/solutions-ops.d.ts +7 -0
  38. package/dist/commands/solutions-ops.d.ts.map +1 -0
  39. package/dist/commands/solutions-ops.js +544 -0
  40. package/dist/commands/solutions-ops.js.map +1 -0
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1 -1
  44. package/dist/index.js.map +1 -1
  45. package/node_modules/@noodle-borg/admission-limits/dist/counter-store.d.ts +21 -2
  46. package/node_modules/@noodle-borg/admission-limits/dist/counter-store.js +10 -1
  47. package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.d.ts +5 -1
  48. package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.js +31 -2
  49. package/node_modules/@noodle-borg/admission-limits/dist/portable.d.ts +3 -0
  50. package/node_modules/@noodle-borg/admission-limits/dist/portable.js +3 -0
  51. package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.d.ts +28 -0
  52. package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.js +124 -0
  53. package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.d.ts +54 -0
  54. package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.js +74 -0
  55. package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.d.ts +11 -0
  56. package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.js +19 -0
  57. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
  58. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +4 -1
  59. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +5 -5
  60. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +6 -0
  61. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +21 -2
  62. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +1 -1
  63. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  64. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.d.ts +9 -1
  65. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.js +33 -2
  66. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.d.ts +3 -0
  67. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.js +29 -0
  68. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.d.ts +5 -3
  69. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.js +21 -10
  70. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.d.ts +1 -1
  71. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.js +3 -3
  72. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.d.ts +1 -0
  73. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.js +1 -0
  74. package/node_modules/@noodle-borg/assistant-gateway/dist/session-target.js +5 -4
  75. package/node_modules/@noodle-borg/authoring/dist/config.d.ts +20 -0
  76. package/node_modules/@noodle-borg/authoring/dist/config.js +29 -2
  77. package/node_modules/@noodle-borg/authoring/dist/connectors.d.ts +6 -1
  78. package/node_modules/@noodle-borg/authoring/dist/connectors.js +5 -0
  79. package/node_modules/@noodle-borg/authoring/dist/index.d.ts +2 -1
  80. package/node_modules/@noodle-borg/authoring/dist/index.js +1 -0
  81. package/node_modules/@noodle-borg/authoring/dist/json-schema.d.ts +1 -1
  82. package/node_modules/@noodle-borg/authoring/dist/json-schema.js +15 -2
  83. package/node_modules/@noodle-borg/authoring/dist/load-authored.js +1 -1
  84. package/node_modules/@noodle-borg/authoring/dist/managed-collection.d.ts +40 -0
  85. package/node_modules/@noodle-borg/authoring/dist/managed-collection.js +39 -0
  86. package/node_modules/@noodle-borg/authoring/dist/platform.d.ts +3 -0
  87. package/node_modules/@noodle-borg/authoring/dist/platform.js +4 -0
  88. package/node_modules/@noodle-borg/authoring/dist/server-presentation.js +43 -0
  89. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +6 -1
  90. package/node_modules/@noodle-borg/authoring/dist/server.js +5 -43
  91. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-billing.js +18 -0
  92. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-config.js +31 -4
  93. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-solutions.js +778 -0
  94. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-types.js +7 -0
  95. package/node_modules/@noodle-borg/cli-catalog/dist/index.js +20 -0
  96. package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +5 -1
  97. package/node_modules/@noodle-borg/compiler/dist/artifact/catalog-emission.js +3 -1
  98. package/node_modules/@noodle-borg/compiler/dist/artifact/config.js +3 -0
  99. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +26 -0
  100. package/node_modules/@noodle-borg/compiler/dist/artifact/version.d.ts +9 -1
  101. package/node_modules/@noodle-borg/compiler/dist/artifact/version.js +9 -1
  102. package/node_modules/@noodle-borg/compiler/dist/business-variables.d.ts +27 -0
  103. package/node_modules/@noodle-borg/compiler/dist/business-variables.js +230 -0
  104. package/node_modules/@noodle-borg/compiler/dist/compile.js +9 -0
  105. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +1 -1
  106. package/node_modules/@noodle-borg/compiler/dist/index.d.ts +5 -1
  107. package/node_modules/@noodle-borg/compiler/dist/index.js +4 -0
  108. package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.d.ts +52 -0
  109. package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.js +92 -0
  110. package/node_modules/@noodle-borg/compiler/dist/managed-collections.d.ts +50 -0
  111. package/node_modules/@noodle-borg/compiler/dist/managed-collections.js +373 -0
  112. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +114 -36
  113. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +5 -0
  114. package/node_modules/@noodle-borg/compiler/dist/native-record-operations.d.ts +7 -0
  115. package/node_modules/@noodle-borg/compiler/dist/native-record-operations.js +59 -0
  116. package/node_modules/@noodle-borg/connector-defs/dist/compile-http.js +83 -8
  117. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts +31 -1
  118. package/node_modules/@noodle-borg/connector-defs/dist/schema.js +16 -0
  119. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +12 -3
  120. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +41 -2
  121. package/node_modules/@noodle-borg/connector-http/dist/http-response.js +3 -2
  122. package/node_modules/@noodle-borg/connector-http/dist/mcp/config.js +1 -1
  123. package/node_modules/@noodle-borg/connector-http/dist/url-resolution.js +1 -1
  124. package/node_modules/@noodle-borg/control-plane/dist/contracts.d.ts +2 -1
  125. package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.d.ts +3 -0
  126. package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.js +11 -0
  127. package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.d.ts +45 -0
  128. package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.js +74 -0
  129. package/node_modules/@noodle-borg/control-plane/dist/portable.d.ts +1 -0
  130. package/node_modules/@noodle-borg/control-plane/dist/portable.js +1 -0
  131. package/node_modules/@noodle-borg/module/dist/contract.d.ts +20 -0
  132. package/node_modules/@noodle-borg/module/dist/platform-human-identity.d.ts +2 -0
  133. package/node_modules/@noodle-borg/protocol/dist/request-deps.js +1 -0
  134. package/node_modules/@noodle-borg/protocol/dist/request-state.d.ts +1 -0
  135. package/node_modules/@noodle-borg/protocol/dist/request-state.js +11 -2
  136. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts +2 -0
  137. package/node_modules/@noodle-borg/protocol/dist/v2/input-required.js +2 -1
  138. package/node_modules/@noodle-borg/protocol/dist/v2/server.js +2 -1
  139. package/node_modules/@noodle-borg/runtime/dist/ambient-context.js +6 -1
  140. package/node_modules/@noodle-borg/runtime/dist/broker/types.d.ts +2 -0
  141. package/node_modules/@noodle-borg/runtime/dist/business-variables.d.ts +15 -0
  142. package/node_modules/@noodle-borg/runtime/dist/business-variables.js +75 -0
  143. package/node_modules/@noodle-borg/runtime/dist/confirmation-continuation.js +2 -1
  144. package/node_modules/@noodle-borg/runtime/dist/confirmation.js +23 -3
  145. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +17 -1
  146. package/node_modules/@noodle-borg/runtime/dist/connector-snapshot.js +6 -0
  147. package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +18 -3
  148. package/node_modules/@noodle-borg/runtime/dist/execute.js +13 -3
  149. package/node_modules/@noodle-borg/runtime/dist/index.d.ts +2 -0
  150. package/node_modules/@noodle-borg/runtime/dist/index.js +1 -0
  151. package/node_modules/@noodle-borg/runtime/dist/interactive.js +11 -0
  152. package/node_modules/@noodle-borg/runtime/dist/managed-origins.d.ts +3 -1
  153. package/node_modules/@noodle-borg/runtime/dist/managed-origins.js +32 -7
  154. package/node_modules/@noodle-borg/runtime/dist/operation-credential.js +6 -0
  155. package/node_modules/@noodle-borg/runtime/dist/operation-evidence.d.ts +30 -0
  156. package/node_modules/@noodle-borg/runtime/dist/operation-evidence.js +68 -0
  157. package/node_modules/@noodle-borg/runtime/dist/operation-execution.d.ts +2 -2
  158. package/node_modules/@noodle-borg/runtime/dist/operation-execution.js +142 -71
  159. package/node_modules/@noodle-borg/runtime/dist/result.d.ts +6 -4
  160. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.d.ts +7 -0
  161. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.js +48 -4
  162. package/node_modules/@noodle-borg/service/dist/admission.js +2 -1
  163. package/node_modules/@noodle-borg/service/dist/application-activity.js +236 -0
  164. package/node_modules/@noodle-borg/service/dist/application-business-notice.js +28 -0
  165. package/node_modules/@noodle-borg/service/dist/application-runtime-target.js +141 -0
  166. package/node_modules/@noodle-borg/service/dist/application-settings-targets.js +72 -0
  167. package/node_modules/@noodle-borg/service/dist/application-settings.js +210 -0
  168. package/node_modules/@noodle-borg/service/dist/business-api-admission.js +121 -0
  169. package/node_modules/@noodle-borg/service/dist/business-information/activity-pagination.js +73 -0
  170. package/node_modules/@noodle-borg/service/dist/business-information/business-notice.d.ts +24 -0
  171. package/node_modules/@noodle-borg/service/dist/business-information/business-notice.js +18 -0
  172. package/node_modules/@noodle-borg/service/dist/business-information/collection-controls.js +51 -0
  173. package/node_modules/@noodle-borg/service/dist/business-information/contracts.d.ts +439 -0
  174. package/node_modules/@noodle-borg/service/dist/business-information/contracts.js +5 -0
  175. package/node_modules/@noodle-borg/service/dist/business-information/definition-resolver.js +94 -0
  176. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-installation-lifecycle.js +136 -0
  177. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-invitations.js +160 -0
  178. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-locks.js +23 -0
  179. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-store.js +557 -0
  180. package/node_modules/@noodle-borg/service/dist/business-information/installation-capacity.js +10 -0
  181. package/node_modules/@noodle-borg/service/dist/business-information/invitations.js +68 -0
  182. package/node_modules/@noodle-borg/service/dist/business-information/legacy-request-migration.js +60 -0
  183. package/node_modules/@noodle-borg/service/dist/business-information/managed-releases.js +245 -0
  184. package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-blueprints.js +51 -0
  185. package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-executable.js +76 -0
  186. package/node_modules/@noodle-borg/service/dist/business-information/model.js +393 -0
  187. package/node_modules/@noodle-borg/service/dist/business-information/native-query.js +162 -0
  188. package/node_modules/@noodle-borg/service/dist/business-information/native-storage-budget.js +60 -0
  189. package/node_modules/@noodle-borg/service/dist/business-information/pagination.js +78 -0
  190. package/node_modules/@noodle-borg/service/dist/business-information/portable.js +15 -0
  191. package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.d.ts +11 -0
  192. package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.js +42 -0
  193. package/node_modules/@noodle-borg/service/dist/business-information/profiles.js +252 -0
  194. package/node_modules/@noodle-borg/service/dist/business-information/reader-floor.js +26 -0
  195. package/node_modules/@noodle-borg/service/dist/business-information/source-credential-fence.js +79 -0
  196. package/node_modules/@noodle-borg/service/dist/business-information/source-custody-budget.js +30 -0
  197. package/node_modules/@noodle-borg/service/dist/business-information/source-custody-memory.js +122 -0
  198. package/node_modules/@noodle-borg/service/dist/business-information/source-executor.js +191 -0
  199. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-contracts.js +2 -0
  200. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-coordinator.js +136 -0
  201. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-failures.js +32 -0
  202. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-state.js +154 -0
  203. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-store.js +568 -0
  204. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-types.js +26 -0
  205. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-values.js +59 -0
  206. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-pagination.js +54 -0
  207. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-validation.js +163 -0
  208. package/node_modules/@noodle-borg/service/dist/business-information/source-refresh-retention.js +29 -0
  209. package/node_modules/@noodle-borg/service/dist/business-information/validation.js +200 -0
  210. package/node_modules/@noodle-borg/service/dist/business-information-runtime.js +80 -0
  211. package/node_modules/@noodle-borg/service/dist/business-onboarding.js +73 -0
  212. package/node_modules/@noodle-borg/service/dist/connections/types.js +8 -0
  213. package/node_modules/@noodle-borg/service/dist/credential-binding-index.js +38 -33
  214. package/node_modules/@noodle-borg/service/dist/deployment-execution.js +275 -0
  215. package/node_modules/@noodle-borg/service/dist/external-credential-binding-broker.js +19 -1
  216. package/node_modules/@noodle-borg/service/dist/external-credential-exchange.d.ts +16 -1
  217. package/node_modules/@noodle-borg/service/dist/modules/host.js +4 -1
  218. package/node_modules/@noodle-borg/service/dist/native-record-connector.d.ts +20 -0
  219. package/node_modules/@noodle-borg/service/dist/native-record-connector.js +206 -0
  220. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts +5 -2
  221. package/node_modules/@noodle-borg/service/dist/operation-evidence.js +89 -0
  222. package/node_modules/@noodle-borg/service/dist/recovery-quarantine.js +49 -0
  223. package/node_modules/@noodle-borg/service/dist/registry-compile.js +60 -11
  224. package/node_modules/@noodle-borg/service/dist/registry-deploy-transaction.js +18 -0
  225. package/node_modules/@noodle-borg/service/dist/registry-rollback.js +2 -1
  226. package/node_modules/@noodle-borg/service/dist/registry-state.d.ts +1 -1
  227. package/node_modules/@noodle-borg/service/dist/registry-state.js +6 -3
  228. package/node_modules/@noodle-borg/service/dist/registry-targets.js +49 -0
  229. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +2 -0
  230. package/node_modules/@noodle-borg/service/dist/registry.d.ts +15 -3
  231. package/node_modules/@noodle-borg/service/dist/registry.js +177 -137
  232. package/node_modules/@noodle-borg/service/dist/routes/assistant-appearance.js +3 -2
  233. package/node_modules/@noodle-borg/service/dist/routes/assistant-clients.js +2 -1
  234. package/node_modules/@noodle-borg/service/dist/routes/assistant-doctor.js +2 -1
  235. package/node_modules/@noodle-borg/service/dist/routes/assistant-embeds.js +8 -3
  236. package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.js +1 -1
  237. package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +48 -36
  238. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-configuration.js +3 -2
  239. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-session.js +10 -10
  240. package/node_modules/@noodle-borg/service/dist/routes/assistant-session-target.js +32 -3
  241. package/node_modules/@noodle-borg/service/dist/routes/assistant-suggestions.js +1 -1
  242. package/node_modules/@noodle-borg/service/dist/routes/assistant-transcript.js +1 -1
  243. package/node_modules/@noodle-borg/service/dist/routes/assistant.js +10 -10
  244. package/node_modules/@noodle-borg/service/dist/routes/business-information-activity.js +83 -0
  245. package/node_modules/@noodle-borg/service/dist/routes/business-information-admission.js +26 -0
  246. package/node_modules/@noodle-borg/service/dist/routes/business-information-channels.js +153 -0
  247. package/node_modules/@noodle-borg/service/dist/routes/business-information-connections.js +107 -0
  248. package/node_modules/@noodle-borg/service/dist/routes/business-information-dispatch.js +131 -0
  249. package/node_modules/@noodle-borg/service/dist/routes/business-information-external.js +79 -0
  250. package/node_modules/@noodle-borg/service/dist/routes/business-information-installation.js +24 -0
  251. package/node_modules/@noodle-borg/service/dist/routes/business-information-notice.js +69 -0
  252. package/node_modules/@noodle-borg/service/dist/routes/business-information-onboarding.js +58 -0
  253. package/node_modules/@noodle-borg/service/dist/routes/business-information-paths.js +168 -0
  254. package/node_modules/@noodle-borg/service/dist/routes/business-information-public.js +151 -0
  255. package/node_modules/@noodle-borg/service/dist/routes/business-information-reader-floor.js +15 -0
  256. package/node_modules/@noodle-borg/service/dist/routes/business-information-record-create.js +29 -0
  257. package/node_modules/@noodle-borg/service/dist/routes/business-information-record-reads.js +36 -0
  258. package/node_modules/@noodle-borg/service/dist/routes/business-information-request.js +64 -0
  259. package/node_modules/@noodle-borg/service/dist/routes/business-information-settings.js +64 -0
  260. package/node_modules/@noodle-borg/service/dist/routes/business-information-source.js +249 -0
  261. package/node_modules/@noodle-borg/service/dist/routes/business-information-staff.js +258 -0
  262. package/node_modules/@noodle-borg/service/dist/routes/business-information-wire.js +317 -0
  263. package/node_modules/@noodle-borg/service/dist/routes/business-information.js +592 -0
  264. package/node_modules/@noodle-borg/service/dist/routes/config-values-dispatch.js +1 -1
  265. package/node_modules/@noodle-borg/service/dist/routes/config-values.js +26 -4
  266. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +19 -233
  267. package/node_modules/@noodle-borg/service/dist/routes/deployment-activation-response.js +13 -4
  268. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +6 -0
  269. package/node_modules/@noodle-borg/service/dist/service.js +77 -6
  270. package/node_modules/@noodle-borg/service/dist/solution-installation-activation.js +149 -0
  271. package/node_modules/@noodle-borg/service/dist/source-configuration-authority.js +94 -0
  272. package/node_modules/@noodle-borg/service/dist/state-catalog.js +6 -5
  273. package/node_modules/@noodle-borg/service/dist/store/config-values.d.ts +42 -17
  274. package/node_modules/@noodle-borg/service/dist/store/config-values.js +123 -24
  275. package/node_modules/@noodle-borg/service/dist/store/in-memory.d.ts +1 -0
  276. package/node_modules/@noodle-borg/service/dist/store/in-memory.js +3 -0
  277. package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +1 -0
  278. package/node_modules/@noodle-borg/service/dist/store/json-file.js +3 -0
  279. package/node_modules/@noodle-borg/service/dist/store.d.ts +3 -1
  280. package/node_modules/@noodle-borg/service/package.json +2 -2
  281. package/node_modules/@noodle-borg/transport-http/dist/serve-request.js +9 -0
  282. package/node_modules/@noodle-borg/transport-http/package.json +1 -0
  283. package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.d.ts +143 -0
  284. package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.js +90 -0
  285. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.d.ts +130 -0
  286. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.js +77 -0
  287. package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.d.ts +105 -0
  288. package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.js +67 -0
  289. package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.d.ts +27 -0
  290. package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.js +28 -0
  291. package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.d.ts +112 -0
  292. package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.js +88 -0
  293. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts +1 -1
  294. package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.d.ts +62 -0
  295. package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.js +57 -0
  296. package/node_modules/@noodle-borg/wire-contracts/dist/billing-enforcement.d.ts +12 -12
  297. package/node_modules/@noodle-borg/wire-contracts/dist/billing-metering.d.ts +4 -4
  298. package/node_modules/@noodle-borg/wire-contracts/dist/billing-org-transfer.d.ts +3 -3
  299. package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.d.ts +25 -0
  300. package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.js +37 -0
  301. package/node_modules/@noodle-borg/wire-contracts/dist/business-information.d.ts +2241 -0
  302. package/node_modules/@noodle-borg/wire-contracts/dist/business-information.js +580 -0
  303. package/node_modules/@noodle-borg/wire-contracts/dist/control-plane.d.ts +2 -2
  304. package/node_modules/@noodle-borg/wire-contracts/dist/distribution.d.ts +5 -5
  305. package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +12 -3
  306. package/node_modules/@noodle-borg/wire-contracts/dist/index.js +9 -0
  307. package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts +6 -6
  308. package/node_modules/@noodle-borg/wire-contracts/dist/managed-assistant-sponsorship.d.ts +15 -15
  309. package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.d.ts +5 -0
  310. package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.js +1 -0
  311. package/node_modules/@noodle-borg/wire-contracts/dist/platform-auth.d.ts +66 -66
  312. package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.d.ts +143 -0
  313. package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.js +94 -0
  314. package/node_modules/@noodleseed/assistant/README.md +5 -0
  315. package/package.json +2 -2
@@ -1,17 +1,13 @@
1
- import { cspFaultsInManifest } from '@noodle-borg/compiler';
2
1
  import { ensurePersonalWorkspace } from '@noodle-borg/control-plane/portable';
3
2
  import { DEVELOPER_ASSISTANT_PATH, DEVELOPER_CLI_PATH, } from '@noodle-borg/developer-mcp';
4
3
  import { normalizeServerVersion } from '@noodle-borg/module';
5
- import { noopLogger, readDeployBody, sendJson } from '@noodle-borg/transport-http';
4
+ import { readDeployBody, sendJson } from '@noodle-borg/transport-http';
6
5
  import { deployRequestSchema, formatWireError, WhoamiIdentityResponseSchema, } from '@noodle-borg/wire-contracts';
7
6
  import { authorizeDeveloperGrant, } from '../auth/developer-grant-guard.js';
7
+ import { executeAuthorizedDeployment } from '../deployment-execution.js';
8
8
  import { baseFromRequest, sendForbidden, sendUnauthorized } from '../http-util.js';
9
9
  import { endpointUrlOptionsForOrg } from '../mcp-public-routing.js';
10
- import { manifestUsesUserRoot } from '../registry-access.js';
11
- import { isIdentityAccessMode } from './access-mode.js';
12
10
  import { validateDeployIdempotency } from './deploy-idempotency.js';
13
- import { provisionPublicEmbed } from './deploy-public-embed.js';
14
- import { respondDeploymentActivationError } from './deployment-activation-response.js';
15
11
  import { tenantMcpUrl } from './endpoint-enrichment.js';
16
12
  import { canManageMembers } from './org-admin.js';
17
13
  export async function handleDeploy(req, res, registry, options, maxBody, tenant, gate, controlPlane, audit) {
@@ -172,235 +168,25 @@ export async function handleDeploy(req, res, registry, options, maxBody, tenant,
172
168
  code: 'owner_only_unsupported_for_automation',
173
169
  });
174
170
  }
175
- // Identity access modes bind the data plane to verified identity, so the deployer must be authenticated.
176
- // (Localhost dev runs the gate open; such deploys are rejected for lack of an owner/audit actor.)
177
- if (isIdentityAccessMode(accessMode) && !identity) {
178
- return sendJson(res, 401, {
179
- error: `${accessMode} deployments require an authenticated deployer`,
180
- });
181
- }
182
- if (accessMode === 'public' && manifestUsesUserRoot(manifest)) {
183
- return sendJson(res, 400, {
184
- error: 'public access mode cannot reference ${user}; use mixed for optional identity',
185
- });
186
- }
187
- // Widget CSP gate (deploy-only): a CSP origin the host renderer will silently drop breaks the widget
188
- // for end users, so the deploy is refused here. The compiler surfaces the same faults as non-blocking
189
- // warnings, so `noodle dev`/`validate` still render the widget locally — only shipping is gated.
190
- const [cspFault] = cspFaultsInManifest(manifest);
191
- if (cspFault !== undefined) {
192
- return sendJson(res, 400, {
193
- error: `widget "${cspFault.widget}" CSP ${cspFault.list} origin "${cspFault.value}" is not an ` +
194
- `absolute https:// origin and would be dropped by the host renderer` +
195
- (cspFault.suggestion !== undefined ? `; use "${cspFault.suggestion}"` : ''),
196
- });
197
- }
198
- if ((await controlPlane.getOrg(tenant.org)) === undefined) {
199
- await audit.emit({
200
- eventType: 'deploy.rejected',
201
- org: tenant.org,
202
- app: tenant.app,
203
- env: tenant.env,
204
- decision: 'deny',
205
- status: 404,
206
- reasonCode: 'organization_not_found',
207
- ...(identity?.subject !== undefined ? { actorSubject: identity.subject } : {}),
208
- ...(identity?.email !== undefined ? { actorEmail: identity.email } : {}),
209
- });
210
- return sendJson(res, 404, {
211
- code: 'organization_not_found',
212
- error: 'organization must be created before deploy',
213
- });
214
- }
215
- const logger = options.logger ?? noopLogger;
216
- if (hostedAssets !== undefined && hostedAssets.length > 0) {
217
- if (options.assetStore === undefined) {
218
- await audit.emit({
219
- eventType: 'asset.rejected',
220
- org: tenant.org,
221
- app: tenant.app,
222
- env: tenant.env,
223
- decision: 'deny',
224
- status: 400,
225
- reasonCode: 'asset_store_not_configured',
226
- ...(identity?.subject !== undefined ? { actorSubject: identity.subject } : {}),
227
- ...(identity?.email !== undefined ? { actorEmail: identity.email } : {}),
228
- details: { assetCount: hostedAssets.length },
229
- });
230
- return sendJson(res, 400, { error: 'hosted assets are not configured for this service' });
231
- }
232
- const verified = await options.assetStore.verifyUploadedAssets({
233
- scope: tenant,
234
- assets: hostedAssets,
235
- });
236
- if (!verified.ok) {
237
- await audit.emit({
238
- eventType: 'asset.rejected',
239
- org: tenant.org,
240
- app: tenant.app,
241
- env: tenant.env,
242
- decision: 'deny',
243
- status: 400,
244
- reasonCode: 'asset_verification_failed',
245
- ...(identity?.subject !== undefined ? { actorSubject: identity.subject } : {}),
246
- ...(identity?.email !== undefined ? { actorEmail: identity.email } : {}),
247
- details: { assetCount: hostedAssets.length },
248
- });
249
- return sendJson(res, 400, { error: verified.error });
250
- }
251
- hostedAssets = verified.assets;
252
- }
253
- let result;
254
- try {
255
- result = await registry.deploy(tenant, manifest, {
256
- connectors,
257
- actor: identity || undefined,
258
- accessMode,
259
- ownerSubject,
260
- ...(orgMembershipSources !== undefined ? { orgMembershipSources } : {}),
261
- hostedAssets,
262
- serverVersion,
263
- deploymentSource: automationId === undefined ? (deploymentSource ?? 'api') : 'github',
264
- ...(idempotency.key !== undefined ? { idempotencyKey: idempotency.key } : {}),
265
- ...(automationId === undefined ? {} : { automationId }),
266
- });
267
- }
268
- catch (error) {
269
- const handled = await respondDeploymentActivationError(res, error, {
270
- audit,
271
- eventType: 'deploy.rejected',
272
- org: tenant.org,
273
- app: tenant.app,
274
- env: tenant.env,
275
- ...(identity?.subject !== undefined ? { actorSubject: identity.subject } : {}),
276
- ...(identity?.email !== undefined ? { actorEmail: identity.email } : {}),
277
- });
278
- if (handled)
279
- return;
280
- throw error;
281
- }
282
- if (!result.ok) {
283
- if ('conflict' in result) {
284
- if (result.code === 'deployment_locked') {
285
- await audit.emit({
286
- eventType: 'deploy.rejected',
287
- org: tenant.org,
288
- app: tenant.app,
289
- env: tenant.env,
290
- decision: 'deny',
291
- status: 409,
292
- reasonCode: result.code,
293
- ...(identity?.subject !== undefined ? { actorSubject: identity.subject } : {}),
294
- ...(identity?.email !== undefined ? { actorEmail: identity.email } : {}),
295
- details: { serverVersion },
296
- });
297
- }
298
- return sendJson(res, 409, {
299
- ok: false,
300
- code: result.code,
301
- error: result.message,
302
- });
303
- }
304
- if ('superseded' in result) {
305
- if (automationId !== undefined) {
306
- await options.deploymentAutomation
307
- ?.recordSuperseded?.({ automationId, target: tenant })
308
- .catch(() => undefined);
309
- }
310
- return sendJson(res, 409, {
311
- ok: false,
312
- code: 'run_superseded',
313
- error: 'a newer GitHub deploy run exists for this app/env; this run was not activated',
314
- deploymentId: result.deploymentId,
315
- ...(result.serverVersion !== undefined ? { serverVersion: result.serverVersion } : {}),
316
- });
317
- }
318
- // Codes are safe enum strings; never a path-with-value. No secret name or value is logged.
319
- const codes = result.errors.map((error) => error.code).join(',');
320
- logger.warn('deploy.rejected', {
321
- status: 400,
322
- errorCount: result.errors.length,
323
- codes,
324
- });
325
- // Durable audit: a rejected deploy is a governance event. Safe fields only — no manifest body.
326
- await audit.emit({
327
- eventType: 'deploy.rejected',
328
- org: tenant.org,
329
- app: tenant.app,
330
- env: tenant.env,
331
- decision: 'deny',
332
- status: 400,
333
- reasonCode: 'compile_failed',
334
- ...(identity?.subject !== undefined ? { actorSubject: identity.subject } : {}),
335
- ...(identity?.email !== undefined ? { actorEmail: identity.email } : {}),
336
- details: { errorCount: result.errors.length, codes },
337
- });
338
- return sendJson(res, 400, { ok: false, errors: result.errors });
339
- }
340
- // Counts only — never secret names or values.
341
- logger.info('deploy.ok', {
342
- deploymentId: result.deploymentId,
343
- serverVersion: result.serverVersion,
344
- org: tenant.org,
345
- app: tenant.app,
346
- env: tenant.env,
347
- hasConnectors: connectors !== undefined,
348
- });
349
- await audit.emit({
350
- eventType: 'deploy.accepted',
351
- org: tenant.org,
352
- app: tenant.app,
353
- env: tenant.env,
354
- decision: 'allow',
355
- status: 201,
356
- ...(result.deploymentId !== undefined ? { deploymentId: result.deploymentId } : {}),
357
- ...(identity?.subject !== undefined ? { actorSubject: identity.subject } : {}),
358
- ...(identity?.email !== undefined ? { actorEmail: identity.email } : {}),
359
- details: {
360
- accessMode: result.accessMode ?? accessMode,
361
- deploymentSource: automationId === undefined ? (deploymentSource ?? 'api') : 'github',
362
- ...(ownerSubject !== undefined ? { ownerSubject } : {}),
363
- serverVersion: result.serverVersion,
364
- hasConnectors: connectors !== undefined,
365
- },
366
- });
367
- // Tenant-safe developer-facing log (M3, ADR 0101): a safe deploy-lifecycle record the developer can read
368
- // via `noodle logs`. Only scalar metadata, no manifest/secret/payload material.
369
- await options.userAppLogStore?.emit({
370
- level: 'info',
371
- message: 'deployment live',
372
- org: tenant.org,
373
- app: tenant.app,
374
- env: tenant.env,
375
- ...(result.deploymentId !== undefined ? { deploymentId: result.deploymentId } : {}),
376
- details: { accessMode: result.accessMode ?? accessMode, serverVersion: result.serverVersion },
377
- });
378
- if (result.ok && hostedAssets !== undefined && hostedAssets.length > 0) {
379
- await audit.emit({
380
- eventType: 'asset.activation.accepted',
381
- org: tenant.org,
382
- app: tenant.app,
383
- env: tenant.env,
384
- decision: 'allow',
385
- status: 201,
386
- deploymentId: result.deploymentId,
387
- ...(identity?.subject !== undefined ? { actorSubject: identity.subject } : {}),
388
- ...(identity?.email !== undefined ? { actorEmail: identity.email } : {}),
389
- details: {
390
- assetCount: hostedAssets.length,
391
- totalBytes: hostedAssets.reduce((sum, asset) => sum + asset.byteLength, 0),
392
- },
393
- });
394
- await options.assetStore?.recordReachability({
395
- scope: tenant,
396
- deploymentId: result.deploymentId,
397
- deploymentVersion: result.deploymentVersion,
398
- assets: hostedAssets,
399
- });
400
- }
171
+ const executed = await executeAuthorizedDeployment({
172
+ tenant,
173
+ manifest,
174
+ connectors,
175
+ hostedAssets,
176
+ accessMode,
177
+ identity,
178
+ ownerSubject,
179
+ orgMembershipSources,
180
+ deploymentSource,
181
+ serverVersion,
182
+ idempotencyKey: idempotency.key,
183
+ automationId,
184
+ }, { registry, options, controlPlane, audit });
185
+ if (!executed.ok)
186
+ return sendJson(res, executed.status, executed.body);
187
+ const { result, embedId } = executed;
401
188
  const base = options.publicBaseUrl ?? baseFromRequest(req, options.tls ?? {});
402
189
  const endpointOptions = await endpointUrlOptionsForOrg(options, controlPlane, tenant.org);
403
- const embedId = await provisionPublicEmbed(registry, options, tenant, result.deploymentId);
404
190
  return sendJson(res, 201, {
405
191
  ok: true,
406
192
  org: tenant.org,
@@ -2,11 +2,18 @@ import { DeploymentActivationError } from '@noodle-borg/module';
2
2
  import { sendJson } from '@noodle-borg/transport-http';
3
3
  /** Translate provider-neutral activation failures without exposing commercial account details. */
4
4
  export async function respondDeploymentActivationError(res, error, context) {
5
- if (!(error instanceof DeploymentActivationError))
5
+ const rejected = await deploymentActivationRejection(error, context);
6
+ if (rejected === undefined)
6
7
  return false;
8
+ sendJson(res, rejected.status, rejected.body);
9
+ return true;
10
+ }
11
+ export async function deploymentActivationRejection(error, context) {
12
+ if (!(error instanceof DeploymentActivationError))
13
+ return undefined;
7
14
  const response = deploymentActivationResponse(error.code);
8
15
  if (response === undefined)
9
- return false;
16
+ return undefined;
10
17
  await context.audit.emit({
11
18
  eventType: context.eventType,
12
19
  org: context.org,
@@ -18,8 +25,10 @@ export async function respondDeploymentActivationError(res, error, context) {
18
25
  ...(context.actorSubject !== undefined ? { actorSubject: context.actorSubject } : {}),
19
26
  ...(context.actorEmail !== undefined ? { actorEmail: context.actorEmail } : {}),
20
27
  });
21
- sendJson(res, response.status, { ok: false, code: error.code, error: response.message });
22
- return true;
28
+ return {
29
+ status: response.status,
30
+ body: { ok: false, code: error.code, error: response.message },
31
+ };
23
32
  }
24
33
  function deploymentActivationResponse(code) {
25
34
  if (code === 'production_app_limit_exceeded') {
@@ -4,6 +4,12 @@ export async function closeServiceResources(input) {
4
4
  clearInterval(input.welcomeEmailTimer);
5
5
  if (input.feedbackOperationsTimer !== undefined)
6
6
  clearInterval(input.feedbackOperationsTimer);
7
+ if (input.businessInformationTimer !== undefined)
8
+ clearInterval(input.businessInformationTimer);
9
+ input.stopBusinessInformationSweep?.();
10
+ if (input.businessInformationSourceTimer !== undefined) {
11
+ clearInterval(input.businessInformationSourceTimer);
12
+ }
7
13
  clearInterval(input.alertTimer);
8
14
  const errors = [];
9
15
  const moduleHost = input.moduleHost;
@@ -1,13 +1,17 @@
1
+ import { InMemoryDailyCounterStore } from '@noodle-borg/admission-limits/portable';
1
2
  import { InMemoryAssistantAppearanceSettingsStore, InMemoryAssistantStore, } from '@noodle-borg/assistant-gateway/portable';
2
3
  import { allowAllGate, InMemoryControlPlaneStore } from '@noodle-borg/control-plane/portable';
3
4
  import { dispatchKnowledgeRequest } from '@noodle-borg/knowledge-operations/portable';
4
5
  import { OPENAI_APPS_CHALLENGE_PATH } from '@noodle-borg/module';
5
6
  import { applySecurityHeaders, createMcpRouter, enforceHttps, noopLogger, sendJson, } from '@noodle-borg/transport-http';
6
7
  import { AnonymousConsumerLimiter, createAdmissionGate } from './admission.js';
8
+ import { ApplicationActivity } from './application-activity.js';
9
+ import { createApplicationServingRuntime } from './application-runtime-target.js';
7
10
  import { createArchivePreflight } from './archive-preflight.js';
8
11
  import { ArchiveSweeper, resolveArchiveRetentionDays } from './archive-sweeper.js';
9
12
  import { serveLocalAsset } from './assets.js';
10
13
  import { resolveBuildInfo, serviceInfoPayload } from './build-info.js';
14
+ import { createBusinessInformationRuntime, resolvePrivateInstallationDefinition, } from './business-information-runtime.js';
11
15
  import { serviceCapabilityReport } from './capabilities.js';
12
16
  import { rejectIncompatibleCli } from './client-compatibility.js';
13
17
  import { createDataPlaneMembershipAuthorizer } from './data-plane-membership.js';
@@ -21,6 +25,7 @@ import { createServiceModuleProviders } from './modules/host.js';
21
25
  import { dispatchModuleRoutes } from './modules/route-dispatch.js';
22
26
  import { isAuthServerPath } from './oauth/paths.js';
23
27
  import { createIntentTargetResolver, createObservabilityDispatcher, createObservabilityStores, } from './observability-runtime.js';
28
+ import { createRecoveryQuarantineHandler, resolveRecoveryMode } from './recovery-quarantine.js';
24
29
  import { handleAccessUpdate } from './routes/access.js';
25
30
  import { dispatchAlertRoutes } from './routes/alerts-dispatch.js';
26
31
  import { handleAppPurgeReconciliationRoute, } from './routes/app-purge-reconciliation.js';
@@ -28,6 +33,7 @@ import { handleAppArchive, handleAppRestore } from './routes/archive.js';
28
33
  import { handleAssetPreflight } from './routes/asset-control-plane.js';
29
34
  import { dispatchAssistantRoutes } from './routes/assistant-dispatch.js';
30
35
  import { dispatchAuthDiscoveryRoute } from './routes/auth-discovery.js';
36
+ import { dispatchBusinessInformationRoutes } from './routes/business-information-dispatch.js';
31
37
  import { dispatchConfigValueRequest } from './routes/config-values-dispatch.js';
32
38
  import { authorizeTenantControl, handleDeploymentStatus, handleWhoami, } from './routes/control-plane.js';
33
39
  import { dispatchCredentialAuthRoutes } from './routes/credential-auth-dispatch.js';
@@ -44,13 +50,14 @@ import { dispatchResourceReads } from './routes/resource-read-dispatch.js';
44
50
  import { handleRollback } from './routes/rollback.js';
45
51
  import { createServicePrincipalDispatcher } from './routes/service-principals-dispatch.js';
46
52
  import { servicePrincipalDataPlaneHooks } from './service-principal-data-plane.js';
47
- import { BUILTIN_STATE_CATALOG_CONNECTOR } from './state-catalog.js';
48
53
  import { InMemoryAlertRuleStore } from './store/alert-rules.js';
49
54
  import { StdoutAuditSink } from './store/audit.js';
50
55
  const DEFAULT_MAX_BODY = 1 << 20;
51
56
  const DEFAULT_MAX_DEPLOY_BODY = 32 * 1024 * 1024;
52
57
  /** The combined service listener: tenant-scoped deploy management plus the multi-tenant MCP router. */
53
58
  export function createServiceHandler(registry, options = {}) {
59
+ if (resolveRecoveryMode(options.recoveryMode) === 'quarantined')
60
+ return createRecoveryQuarantineHandler(options);
54
61
  const logger = options.logger ?? noopLogger;
55
62
  const tls = options.tls ?? {};
56
63
  const buildInfo = options.buildInfo ?? resolveBuildInfo();
@@ -62,14 +69,19 @@ export function createServiceHandler(registry, options = {}) {
62
69
  const assistantStore = options.assistantStore ?? new InMemoryAssistantStore();
63
70
  const assistantAppearance = options.assistantAppearance ?? new InMemoryAssistantAppearanceSettingsStore();
64
71
  const anonymousLimiter = new AnonymousConsumerLimiter();
65
- registry.setPlatformConnectors({ catalog: [BUILTIN_STATE_CATALOG_CONNECTOR], connectors: [] });
72
+ const publicCounters = options.admissionCounters ?? new InMemoryDailyCounterStore();
73
+ const { businessInformationStore, businessInformationSourceStore, sourceCoordinator } = createBusinessInformationRuntime(registry, options, publicCounters);
66
74
  const moduleProviders = createServiceModuleProviders({
67
75
  options,
68
76
  auditMirror: new StdoutAuditSink(logger),
69
77
  admissionGate: createAdmissionGate(anonymousLimiter, { emit: (event) => activeAudit.emit(event) }, options.admissionGate),
70
78
  });
71
79
  const moduleHost = moduleProviders.host;
72
- const providerOptions = moduleProviders.options;
80
+ businessInformationStore?.configurePrincipalAuthority(moduleHost.platformHumanIdentity);
81
+ const providerOptions = {
82
+ ...moduleProviders.options,
83
+ ...(businessInformationStore ? { businessInformationStore } : {}),
84
+ };
73
85
  const verifyOwnerToken = moduleProviders.verifyOwnerToken;
74
86
  const capabilityReport = serviceCapabilityReport(moduleHost);
75
87
  registry.setServiceCapabilities(capabilityReport.capabilities);
@@ -77,8 +89,16 @@ export function createServiceHandler(registry, options = {}) {
77
89
  activeAudit = audit;
78
90
  const { publicTenantRouting } = mcp.mcpRoutingOptions(options, controlPlane);
79
91
  const resolveEndpointOptions = (org) => mcp.endpointUrlOptionsForOrg(options, controlPlane, org);
92
+ const activity = options.operationEvidence === undefined
93
+ ? undefined
94
+ : new ApplicationActivity({
95
+ ...options.operationEvidence,
96
+ allowance: async (org, request) => moduleHost.resolveActivityHistoryAllowance?.(org, request),
97
+ });
80
98
  const withIntentMode = createIntentTargetResolver(intentSettings, intentPreviewOrgs);
81
- const router = createMcpRouter(async (id) => withIntentMode(await registry.getServing(id)), {
99
+ const { activateInstallation, resolveRuntimeTarget, businessOnboarding } = createApplicationServingRuntime(registry, providerOptions, controlPlane, audit, activity);
100
+ const runtimeTarget = async (target) => target === undefined ? undefined : resolveRuntimeTarget(target);
101
+ const router = createMcpRouter(async (id) => withIntentMode(await runtimeTarget(await registry.getServing(id))), {
82
102
  logger,
83
103
  tls,
84
104
  protocolMode: options.mcpProtocolMode ?? 'dual',
@@ -108,9 +128,9 @@ export function createServiceHandler(registry, options = {}) {
108
128
  }),
109
129
  admissionGate: moduleHost.admissionGate,
110
130
  ...(publicTenantRouting !== undefined ? { publicTenantRouting } : {}),
111
- tenantLookup: async (ref) => withIntentMode(ref.serverVersion === undefined
131
+ tenantLookup: async (ref) => withIntentMode(await runtimeTarget(ref.serverVersion === undefined
112
132
  ? await registry.getActiveByTenant(ref)
113
- : await registry.getActiveByTenantVersion(ref, ref.serverVersion), ref),
133
+ : await registry.getActiveByTenantVersion(ref, ref.serverVersion)), ref),
114
134
  tenantPreflight: createArchivePreflight(registry),
115
135
  });
116
136
  const maxBody = options.maxBodyBytes ?? DEFAULT_MAX_BODY;
@@ -256,8 +276,56 @@ export function createServiceHandler(registry, options = {}) {
256
276
  }
257
277
  if (servicePrincipalDispatcher?.(req, res, url))
258
278
  return;
279
+ if (businessInformationStore !== undefined &&
280
+ options.businessInformationEnabled !== false &&
281
+ dispatchBusinessInformationRoutes(req, res, url, {
282
+ store: businessInformationStore,
283
+ ...(businessOnboarding ? { businessOnboarding } : {}),
284
+ activateInstallation,
285
+ ...(activity === undefined ? {} : { activity }),
286
+ ...(options.connectionRuntime === undefined
287
+ ? {}
288
+ : {
289
+ connections: options.connectionRuntime.connections,
290
+ resolveConnectionTargets: options.connectionRuntime.resolveConnectionTargets,
291
+ }),
292
+ configStore,
293
+ registry,
294
+ resolveEndpointBase: (request) => options.publicBaseUrl ?? baseFromRequest(request, tls),
295
+ resolveEndpointUrlOptions: resolveEndpointOptions,
296
+ ...(options.publicEmbeds === undefined ? {} : { publicEmbeds: options.publicEmbeds }),
297
+ admissionCounters: publicCounters,
298
+ ...(options.admissionEnvelope === undefined
299
+ ? {}
300
+ : { admissionEnvelope: options.admissionEnvelope }),
301
+ ...(options.managedAssistantModelResolver === undefined
302
+ ? {}
303
+ : { managedModelResolver: options.managedAssistantModelResolver }),
304
+ gate,
305
+ controlPlane,
306
+ maxBody,
307
+ publicCounters,
308
+ audit: activeAudit,
309
+ trustProxy: tls.trustProxy === true,
310
+ publicIntakeEnabled: options.businessInformationPublicIntakeEnabled !== false,
311
+ resolvePrivateDefinition: (selector) => resolvePrivateInstallationDefinition(registry, selector),
312
+ ...(businessInformationSourceStore === undefined
313
+ ? {}
314
+ : { sourceStore: businessInformationSourceStore }),
315
+ ...(sourceCoordinator === undefined
316
+ ? {}
317
+ : { runSourceIngestion: async () => void (await sourceCoordinator.runOne()) }),
318
+ ...(options.clock === undefined ? {} : { now: options.clock }),
319
+ logger,
320
+ tls,
321
+ applySecurityHeaders,
322
+ enforceHttps,
323
+ })) {
324
+ return;
325
+ }
259
326
  if (dispatchAssistantRoutes(req, res, url, {
260
327
  registry,
328
+ resolveRuntimeTarget,
261
329
  store: assistantStore,
262
330
  appearance: assistantAppearance,
263
331
  ...(options.publicEmbeds !== undefined ? { publicEmbeds: options.publicEmbeds } : {}),
@@ -398,6 +466,9 @@ export function createServiceHandler(registry, options = {}) {
398
466
  controlPlane,
399
467
  configStore,
400
468
  registry,
469
+ ...(businessInformationStore === undefined
470
+ ? {}
471
+ : { installations: businessInformationStore }),
401
472
  maxBody,
402
473
  audit,
403
474
  ...(options.developerGrantStore !== undefined
@@ -0,0 +1,149 @@
1
+ import { sha256Canonical } from '@noodle-borg/app-package';
2
+ import { ApplicationSettings, installationSettingsTarget } from './application-settings.js';
3
+ import { privateDefinitionFromDeployment } from './business-information/definition-resolver.js';
4
+ import { managedSolutionManifest } from './business-information/managed-solution-executable.js';
5
+ import { BUSINESS_SETUP_MESSAGE, BusinessOnboarding } from './business-onboarding.js';
6
+ import { executeAuthorizedDeployment, } from './deployment-execution.js';
7
+ /** Called after installation authorization, and by the managed-runtime refresh boundary. Never copies configuration. */
8
+ export async function activateSolutionInstallation(input, dependencies) {
9
+ const { installation, actor } = input;
10
+ if (dependencies.options.businessOnboarding !== undefined &&
11
+ (!dependencies.businessInformationStore ||
12
+ !(await new BusinessOnboarding(dependencies.options.businessOnboarding, dependencies.controlPlane, dependencies.businessInformationStore).ready(installation)))) {
13
+ return reject(409, 'business_setup_required', BUSINESS_SETUP_MESSAGE);
14
+ }
15
+ const tenant = {
16
+ org: installation.scope.org,
17
+ app: installation.scope.app,
18
+ env: installation.scope.env,
19
+ };
20
+ const store = dependencies.businessInformationStore;
21
+ const stored = (await store?.getInstallation(installation.scope)) ?? installation;
22
+ const generation = await dependencies.registry.getAppGeneration(tenant.org, tenant.app);
23
+ if ((await dependencies.registry.getAppArchivedAt(tenant.org, tenant.app)) !== undefined ||
24
+ (stored.applicationGeneration !== 'pending' &&
25
+ (generation === undefined ||
26
+ (stored.applicationGeneration !== undefined &&
27
+ stored.applicationGeneration !== generation)))) {
28
+ return reject(409, 'installation_application_unavailable', 'Restore the original application before activation. Retained records remain accessible.');
29
+ }
30
+ if (store &&
31
+ stored.applicationGeneration !== 'pending' &&
32
+ !(await store.bindApplication(installation.scope, generation ?? ''))) {
33
+ return reject(409, 'installation_application_unavailable', 'The retained installation requires application ownership recovery before activation.');
34
+ }
35
+ const bind = async (deploymentId) => {
36
+ const currentGeneration = await dependencies.registry.getAppGeneration(tenant.org, tenant.app);
37
+ if (store &&
38
+ (!currentGeneration || !(await store.bindApplication(installation.scope, currentGeneration))))
39
+ return reject(409, 'installation_application_unavailable', 'Application activation was interrupted; retained records remain accessible.');
40
+ if ((installation.definition.variables?.length ?? 0) > 0)
41
+ await new ApplicationSettings(dependencies.registry.configStore).initialize(installationSettingsTarget(installation));
42
+ return { ok: true, deploymentId };
43
+ };
44
+ const source = await executableSource(installation, dependencies.registry);
45
+ if (!source.ok)
46
+ return source;
47
+ const current = await dependencies.registry.getActiveByTenant(tenant);
48
+ const declarations = current?.served.artifact.server.variables ?? installation.definition.variables ?? [];
49
+ if (declarations.length > 0)
50
+ await new ApplicationSettings(dependencies.registry.configStore).initialize({
51
+ ...installationSettingsTarget(installation),
52
+ declarations,
53
+ });
54
+ const accessMode = current?.accessMode ?? source.value.accessMode;
55
+ const ownerSubject = accessMode === 'owner-only'
56
+ ? (current?.ownerSubject ?? installation.createdBySubject)
57
+ : undefined;
58
+ const currentSource = current?.deploymentId === undefined
59
+ ? undefined
60
+ : await dependencies.registry.getDeploymentSource(tenant, current.deploymentId);
61
+ if (current?.deploymentId !== undefined &&
62
+ currentSource !== undefined &&
63
+ currentSource.manifest === source.value.manifest &&
64
+ currentSource.connectors === source.value.connectors &&
65
+ JSON.stringify(currentSource.hostedAssets) === JSON.stringify(source.value.hostedAssets)) {
66
+ return bind(current.deploymentId);
67
+ }
68
+ const key = sha256Canonical({
69
+ scope: installation.scope,
70
+ definition: installation.definition.reference,
71
+ executable: source.value,
72
+ accessMode,
73
+ ownerSubject: ownerSubject ?? null,
74
+ orgMembershipSources: current?.orgMembershipSources ?? null,
75
+ predecessor: current?.deploymentId ?? null,
76
+ });
77
+ const deployed = await executeAuthorizedDeployment({
78
+ ...source.value,
79
+ tenant,
80
+ identity: actor,
81
+ accessMode,
82
+ ...(ownerSubject === undefined ? {} : { ownerSubject }),
83
+ ...(current?.orgMembershipSources === undefined
84
+ ? {}
85
+ : { orgMembershipSources: current.orgMembershipSources }),
86
+ deploymentSource: 'api',
87
+ idempotencyKey: key,
88
+ }, dependencies);
89
+ if (!deployed.ok)
90
+ return {
91
+ ok: false,
92
+ status: deployed.status,
93
+ code: typeof deployed.body.code === 'string'
94
+ ? deployed.body.code
95
+ : 'installation_activation_failed',
96
+ message: 'The installation is saved, but its application could not be activated. Retry installation after resolving the deployment requirement.',
97
+ };
98
+ return bind(deployed.result.deploymentId);
99
+ }
100
+ async function executableSource(installation, registry) {
101
+ const reference = installation.definition.reference;
102
+ if (reference.kind === 'managed') {
103
+ return {
104
+ ok: true,
105
+ value: {
106
+ manifest: JSON.stringify(managedSolutionManifest(installation.definition)),
107
+ accessMode: 'public',
108
+ serverVersion: '1',
109
+ },
110
+ };
111
+ }
112
+ if (reference.kind !== 'private')
113
+ return reject(409, 'definition_unavailable', 'This historical definition has no executable application.');
114
+ if (reference.publisherOrg !== installation.scope.org)
115
+ return reject(403, 'definition_forbidden', 'Private definitions must belong to the installation organization.');
116
+ const sourceScope = { org: reference.publisherOrg, app: reference.app, env: reference.env };
117
+ const source = await registry.getDeploymentSource(sourceScope, reference.deploymentId);
118
+ if (source === undefined)
119
+ return reject(409, 'definition_unavailable', 'The immutable source deployment is unavailable or archived.');
120
+ const target = await registry.get(reference.deploymentId);
121
+ if (target === undefined)
122
+ return reject(409, 'definition_unavailable', 'The immutable source deployment cannot be loaded.');
123
+ const verified = privateDefinitionFromDeployment({
124
+ publisherOrg: reference.publisherOrg,
125
+ app: reference.app,
126
+ environment: reference.env,
127
+ deploymentId: reference.deploymentId,
128
+ }, {
129
+ ...sourceScope,
130
+ environment: sourceScope.env,
131
+ deploymentId: reference.deploymentId,
132
+ artifact: target.served.artifact,
133
+ });
134
+ if (verified.reference.digest !== reference.digest)
135
+ return reject(409, 'definition_changed', 'The installation definition does not match its immutable source deployment.');
136
+ return {
137
+ ok: true,
138
+ value: {
139
+ ...source,
140
+ accessMode: source.accessMode ?? 'public',
141
+ serverVersion: source.serverVersion ?? '1',
142
+ assetSourceScope: sourceScope,
143
+ },
144
+ };
145
+ }
146
+ function reject(status, code, message) {
147
+ return { ok: false, status, code, message };
148
+ }
149
+ //# sourceMappingURL=solution-installation-activation.js.map