@noodleseed/one 0.162.0 → 0.163.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/dist/commands/billing-catalog-ops.d.ts +4 -0
  2. package/dist/commands/billing-catalog-ops.d.ts.map +1 -0
  3. package/dist/commands/billing-catalog-ops.js +58 -0
  4. package/dist/commands/billing-catalog-ops.js.map +1 -0
  5. package/dist/commands/billing-ops.d.ts.map +1 -1
  6. package/dist/commands/billing-ops.js +3 -0
  7. package/dist/commands/billing-ops.js.map +1 -1
  8. package/dist/commands/catalog.d.ts.map +1 -1
  9. package/dist/commands/catalog.js +2 -0
  10. package/dist/commands/catalog.js.map +1 -1
  11. package/dist/commands/config-values.d.ts.map +1 -1
  12. package/dist/commands/config-values.js +16 -0
  13. package/dist/commands/config-values.js.map +1 -1
  14. package/dist/commands/installation-variables.d.ts +26 -0
  15. package/dist/commands/installation-variables.d.ts.map +1 -0
  16. package/dist/commands/installation-variables.js +171 -0
  17. package/dist/commands/installation-variables.js.map +1 -0
  18. package/dist/commands/solutions-activity.d.ts +5 -0
  19. package/dist/commands/solutions-activity.d.ts.map +1 -0
  20. package/dist/commands/solutions-activity.js +116 -0
  21. package/dist/commands/solutions-activity.js.map +1 -0
  22. package/dist/commands/solutions-connections.d.ts +7 -0
  23. package/dist/commands/solutions-connections.d.ts.map +1 -0
  24. package/dist/commands/solutions-connections.js +88 -0
  25. package/dist/commands/solutions-connections.js.map +1 -0
  26. package/dist/commands/solutions-installation-options.d.ts +5 -0
  27. package/dist/commands/solutions-installation-options.d.ts.map +1 -0
  28. package/dist/commands/solutions-installation-options.js +52 -0
  29. package/dist/commands/solutions-installation-options.js.map +1 -0
  30. package/dist/commands/solutions-onboarding.d.ts +5 -0
  31. package/dist/commands/solutions-onboarding.d.ts.map +1 -0
  32. package/dist/commands/solutions-onboarding.js +113 -0
  33. package/dist/commands/solutions-onboarding.js.map +1 -0
  34. package/dist/commands/solutions-ops.d.ts.map +1 -1
  35. package/dist/commands/solutions-ops.js +278 -17
  36. package/dist/commands/solutions-ops.js.map +1 -1
  37. package/dist/index.d.ts +1 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -1
  40. package/dist/index.js.map +1 -1
  41. package/node_modules/@noodle-borg/admission-limits/dist/counter-store.d.ts +21 -2
  42. package/node_modules/@noodle-borg/admission-limits/dist/counter-store.js +10 -1
  43. package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.d.ts +5 -1
  44. package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.js +31 -2
  45. package/node_modules/@noodle-borg/admission-limits/dist/portable.d.ts +3 -0
  46. package/node_modules/@noodle-borg/admission-limits/dist/portable.js +3 -0
  47. package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.d.ts +28 -0
  48. package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.js +124 -0
  49. package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.d.ts +54 -0
  50. package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.js +74 -0
  51. package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.d.ts +11 -0
  52. package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.js +19 -0
  53. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +2 -0
  54. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +5 -5
  55. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +3 -0
  56. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +15 -3
  57. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +1 -1
  58. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  59. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.d.ts +9 -1
  60. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.js +33 -2
  61. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.d.ts +3 -0
  62. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.js +29 -0
  63. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.d.ts +5 -3
  64. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.js +21 -10
  65. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.d.ts +1 -1
  66. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.js +3 -3
  67. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.d.ts +1 -0
  68. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.js +1 -0
  69. package/node_modules/@noodle-borg/assistant-gateway/dist/session-target.js +5 -4
  70. package/node_modules/@noodle-borg/authoring/dist/config.d.ts +20 -0
  71. package/node_modules/@noodle-borg/authoring/dist/config.js +29 -2
  72. package/node_modules/@noodle-borg/authoring/dist/connectors.d.ts +6 -1
  73. package/node_modules/@noodle-borg/authoring/dist/connectors.js +5 -0
  74. package/node_modules/@noodle-borg/authoring/dist/index.d.ts +2 -2
  75. package/node_modules/@noodle-borg/authoring/dist/json-schema.d.ts +1 -1
  76. package/node_modules/@noodle-borg/authoring/dist/json-schema.js +15 -2
  77. package/node_modules/@noodle-borg/authoring/dist/load-authored.js +1 -1
  78. package/node_modules/@noodle-borg/authoring/dist/managed-collection.d.ts +18 -4
  79. package/node_modules/@noodle-borg/authoring/dist/managed-collection.js +22 -3
  80. package/node_modules/@noodle-borg/authoring/dist/platform.d.ts +3 -0
  81. package/node_modules/@noodle-borg/authoring/dist/platform.js +4 -0
  82. package/node_modules/@noodle-borg/authoring/dist/server-presentation.js +43 -0
  83. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +3 -1
  84. package/node_modules/@noodle-borg/authoring/dist/server.js +4 -44
  85. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-billing.js +18 -0
  86. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-config.js +31 -4
  87. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-solutions.js +778 -0
  88. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-tenant-resources.js +0 -241
  89. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-types.js +7 -0
  90. package/node_modules/@noodle-borg/cli-catalog/dist/index.js +20 -0
  91. package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +2 -1
  92. package/node_modules/@noodle-borg/compiler/dist/artifact/catalog-emission.js +3 -1
  93. package/node_modules/@noodle-borg/compiler/dist/artifact/config.js +3 -0
  94. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +17 -1
  95. package/node_modules/@noodle-borg/compiler/dist/artifact/version.d.ts +6 -1
  96. package/node_modules/@noodle-borg/compiler/dist/artifact/version.js +6 -1
  97. package/node_modules/@noodle-borg/compiler/dist/business-variables.d.ts +27 -0
  98. package/node_modules/@noodle-borg/compiler/dist/business-variables.js +230 -0
  99. package/node_modules/@noodle-borg/compiler/dist/compile.js +7 -1
  100. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +1 -1
  101. package/node_modules/@noodle-borg/compiler/dist/index.d.ts +3 -0
  102. package/node_modules/@noodle-borg/compiler/dist/index.js +3 -0
  103. package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.d.ts +52 -0
  104. package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.js +92 -0
  105. package/node_modules/@noodle-borg/compiler/dist/managed-collections.d.ts +26 -1
  106. package/node_modules/@noodle-borg/compiler/dist/managed-collections.js +190 -1
  107. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +100 -36
  108. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +2 -0
  109. package/node_modules/@noodle-borg/compiler/dist/native-record-operations.d.ts +7 -0
  110. package/node_modules/@noodle-borg/compiler/dist/native-record-operations.js +59 -0
  111. package/node_modules/@noodle-borg/connector-defs/dist/compile-http.js +83 -8
  112. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts +31 -1
  113. package/node_modules/@noodle-borg/connector-defs/dist/schema.js +16 -0
  114. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +12 -3
  115. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +41 -2
  116. package/node_modules/@noodle-borg/connector-http/dist/http-response.js +3 -2
  117. package/node_modules/@noodle-borg/connector-http/dist/mcp/config.js +1 -1
  118. package/node_modules/@noodle-borg/connector-http/dist/url-resolution.js +1 -1
  119. package/node_modules/@noodle-borg/control-plane/dist/contracts.d.ts +2 -1
  120. package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.d.ts +3 -0
  121. package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.js +11 -0
  122. package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.d.ts +45 -0
  123. package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.js +74 -0
  124. package/node_modules/@noodle-borg/control-plane/dist/portable.d.ts +1 -0
  125. package/node_modules/@noodle-borg/control-plane/dist/portable.js +1 -0
  126. package/node_modules/@noodle-borg/module/dist/contract.d.ts +20 -0
  127. package/node_modules/@noodle-borg/module/dist/platform-human-identity.d.ts +2 -0
  128. package/node_modules/@noodle-borg/protocol/dist/request-deps.js +1 -0
  129. package/node_modules/@noodle-borg/protocol/dist/request-state.d.ts +1 -0
  130. package/node_modules/@noodle-borg/protocol/dist/request-state.js +11 -2
  131. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts +2 -0
  132. package/node_modules/@noodle-borg/protocol/dist/v2/input-required.js +2 -1
  133. package/node_modules/@noodle-borg/protocol/dist/v2/server.js +2 -1
  134. package/node_modules/@noodle-borg/runtime/dist/ambient-context.js +6 -1
  135. package/node_modules/@noodle-borg/runtime/dist/broker/types.d.ts +2 -0
  136. package/node_modules/@noodle-borg/runtime/dist/business-variables.d.ts +15 -0
  137. package/node_modules/@noodle-borg/runtime/dist/business-variables.js +75 -0
  138. package/node_modules/@noodle-borg/runtime/dist/confirmation-continuation.js +2 -1
  139. package/node_modules/@noodle-borg/runtime/dist/confirmation.js +23 -3
  140. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +17 -1
  141. package/node_modules/@noodle-borg/runtime/dist/connector-snapshot.js +6 -0
  142. package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +18 -3
  143. package/node_modules/@noodle-borg/runtime/dist/execute.js +13 -3
  144. package/node_modules/@noodle-borg/runtime/dist/index.d.ts +2 -0
  145. package/node_modules/@noodle-borg/runtime/dist/index.js +1 -0
  146. package/node_modules/@noodle-borg/runtime/dist/interactive.js +11 -0
  147. package/node_modules/@noodle-borg/runtime/dist/managed-origins.d.ts +3 -1
  148. package/node_modules/@noodle-borg/runtime/dist/managed-origins.js +32 -7
  149. package/node_modules/@noodle-borg/runtime/dist/operation-credential.js +6 -0
  150. package/node_modules/@noodle-borg/runtime/dist/operation-evidence.d.ts +30 -0
  151. package/node_modules/@noodle-borg/runtime/dist/operation-evidence.js +68 -0
  152. package/node_modules/@noodle-borg/runtime/dist/operation-execution.d.ts +2 -2
  153. package/node_modules/@noodle-borg/runtime/dist/operation-execution.js +142 -71
  154. package/node_modules/@noodle-borg/runtime/dist/result.d.ts +6 -4
  155. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.d.ts +7 -0
  156. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.js +48 -4
  157. package/node_modules/@noodle-borg/service/dist/admission.js +2 -1
  158. package/node_modules/@noodle-borg/service/dist/application-activity.js +236 -0
  159. package/node_modules/@noodle-borg/service/dist/application-business-notice.js +28 -0
  160. package/node_modules/@noodle-borg/service/dist/application-runtime-target.js +141 -0
  161. package/node_modules/@noodle-borg/service/dist/application-settings-targets.js +72 -0
  162. package/node_modules/@noodle-borg/service/dist/application-settings.js +210 -0
  163. package/node_modules/@noodle-borg/service/dist/business-api-admission.js +121 -0
  164. package/node_modules/@noodle-borg/service/dist/business-information/activity-pagination.js +73 -0
  165. package/node_modules/@noodle-borg/service/dist/business-information/business-notice.d.ts +24 -0
  166. package/node_modules/@noodle-borg/service/dist/business-information/business-notice.js +18 -0
  167. package/node_modules/@noodle-borg/service/dist/business-information/collection-controls.js +51 -0
  168. package/node_modules/@noodle-borg/service/dist/business-information/contracts.d.ts +439 -0
  169. package/node_modules/@noodle-borg/service/dist/business-information/definition-resolver.js +94 -0
  170. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-installation-lifecycle.js +136 -0
  171. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-invitations.js +160 -0
  172. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-locks.js +23 -0
  173. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-store.js +287 -132
  174. package/node_modules/@noodle-borg/service/dist/business-information/installation-capacity.js +10 -0
  175. package/node_modules/@noodle-borg/service/dist/business-information/invitations.js +68 -0
  176. package/node_modules/@noodle-borg/service/dist/business-information/legacy-request-migration.js +60 -0
  177. package/node_modules/@noodle-borg/service/dist/business-information/managed-releases.js +245 -0
  178. package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-blueprints.js +51 -0
  179. package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-executable.js +76 -0
  180. package/node_modules/@noodle-borg/service/dist/business-information/model.js +124 -23
  181. package/node_modules/@noodle-borg/service/dist/business-information/native-query.js +162 -0
  182. package/node_modules/@noodle-borg/service/dist/business-information/native-storage-budget.js +60 -0
  183. package/node_modules/@noodle-borg/service/dist/business-information/pagination.js +28 -0
  184. package/node_modules/@noodle-borg/service/dist/business-information/portable.js +9 -0
  185. package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.d.ts +11 -0
  186. package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.js +42 -0
  187. package/node_modules/@noodle-borg/service/dist/business-information/profiles.js +137 -6
  188. package/node_modules/@noodle-borg/service/dist/business-information/reader-floor.js +26 -0
  189. package/node_modules/@noodle-borg/service/dist/business-information/source-credential-fence.js +79 -0
  190. package/node_modules/@noodle-borg/service/dist/business-information/source-custody-budget.js +30 -0
  191. package/node_modules/@noodle-borg/service/dist/business-information/source-custody-memory.js +122 -0
  192. package/node_modules/@noodle-borg/service/dist/business-information/source-executor.js +191 -0
  193. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-contracts.js +2 -0
  194. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-coordinator.js +136 -0
  195. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-failures.js +32 -0
  196. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-state.js +154 -0
  197. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-store.js +568 -0
  198. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-types.js +26 -0
  199. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-values.js +59 -0
  200. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-pagination.js +54 -0
  201. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-validation.js +163 -0
  202. package/node_modules/@noodle-borg/service/dist/business-information/source-refresh-retention.js +29 -0
  203. package/node_modules/@noodle-borg/service/dist/business-information-runtime.js +80 -0
  204. package/node_modules/@noodle-borg/service/dist/business-onboarding.js +73 -0
  205. package/node_modules/@noodle-borg/service/dist/connections/types.js +8 -0
  206. package/node_modules/@noodle-borg/service/dist/credential-binding-index.js +38 -33
  207. package/node_modules/@noodle-borg/service/dist/deployment-execution.js +275 -0
  208. package/node_modules/@noodle-borg/service/dist/external-credential-binding-broker.js +19 -1
  209. package/node_modules/@noodle-borg/service/dist/external-credential-exchange.d.ts +16 -1
  210. package/node_modules/@noodle-borg/service/dist/modules/host.js +4 -1
  211. package/node_modules/@noodle-borg/service/dist/native-record-connector.d.ts +20 -0
  212. package/node_modules/@noodle-borg/service/dist/native-record-connector.js +206 -0
  213. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts +3 -0
  214. package/node_modules/@noodle-borg/service/dist/operation-evidence.js +89 -0
  215. package/node_modules/@noodle-borg/service/dist/recovery-quarantine.js +49 -0
  216. package/node_modules/@noodle-borg/service/dist/registry-compile.js +60 -11
  217. package/node_modules/@noodle-borg/service/dist/registry-deploy-transaction.js +18 -0
  218. package/node_modules/@noodle-borg/service/dist/registry-rollback.js +2 -1
  219. package/node_modules/@noodle-borg/service/dist/registry-state.d.ts +1 -1
  220. package/node_modules/@noodle-borg/service/dist/registry-state.js +6 -3
  221. package/node_modules/@noodle-borg/service/dist/registry-targets.js +49 -0
  222. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +2 -0
  223. package/node_modules/@noodle-borg/service/dist/registry.d.ts +15 -3
  224. package/node_modules/@noodle-borg/service/dist/registry.js +177 -137
  225. package/node_modules/@noodle-borg/service/dist/routes/assistant-appearance.js +3 -2
  226. package/node_modules/@noodle-borg/service/dist/routes/assistant-clients.js +2 -1
  227. package/node_modules/@noodle-borg/service/dist/routes/assistant-doctor.js +2 -1
  228. package/node_modules/@noodle-borg/service/dist/routes/assistant-embeds.js +8 -3
  229. package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.js +1 -1
  230. package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +48 -36
  231. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-configuration.js +3 -2
  232. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-session.js +10 -10
  233. package/node_modules/@noodle-borg/service/dist/routes/assistant-session-target.js +32 -3
  234. package/node_modules/@noodle-borg/service/dist/routes/assistant-suggestions.js +1 -1
  235. package/node_modules/@noodle-borg/service/dist/routes/assistant-transcript.js +1 -1
  236. package/node_modules/@noodle-borg/service/dist/routes/assistant.js +10 -10
  237. package/node_modules/@noodle-borg/service/dist/routes/business-information-activity.js +83 -0
  238. package/node_modules/@noodle-borg/service/dist/routes/business-information-admission.js +26 -0
  239. package/node_modules/@noodle-borg/service/dist/routes/business-information-channels.js +153 -0
  240. package/node_modules/@noodle-borg/service/dist/routes/business-information-connections.js +107 -0
  241. package/node_modules/@noodle-borg/service/dist/routes/business-information-dispatch.js +87 -4
  242. package/node_modules/@noodle-borg/service/dist/routes/business-information-external.js +79 -0
  243. package/node_modules/@noodle-borg/service/dist/routes/business-information-installation.js +24 -0
  244. package/node_modules/@noodle-borg/service/dist/routes/business-information-notice.js +69 -0
  245. package/node_modules/@noodle-borg/service/dist/routes/business-information-onboarding.js +58 -0
  246. package/node_modules/@noodle-borg/service/dist/routes/business-information-paths.js +76 -0
  247. package/node_modules/@noodle-borg/service/dist/routes/business-information-public.js +151 -0
  248. package/node_modules/@noodle-borg/service/dist/routes/business-information-reader-floor.js +15 -0
  249. package/node_modules/@noodle-borg/service/dist/routes/business-information-record-create.js +29 -0
  250. package/node_modules/@noodle-borg/service/dist/routes/business-information-record-reads.js +36 -0
  251. package/node_modules/@noodle-borg/service/dist/routes/business-information-request.js +64 -0
  252. package/node_modules/@noodle-borg/service/dist/routes/business-information-settings.js +64 -0
  253. package/node_modules/@noodle-borg/service/dist/routes/business-information-source.js +249 -0
  254. package/node_modules/@noodle-borg/service/dist/routes/business-information-staff.js +258 -0
  255. package/node_modules/@noodle-borg/service/dist/routes/business-information-wire.js +226 -26
  256. package/node_modules/@noodle-borg/service/dist/routes/business-information.js +238 -197
  257. package/node_modules/@noodle-borg/service/dist/routes/config-values-dispatch.js +1 -1
  258. package/node_modules/@noodle-borg/service/dist/routes/config-values.js +26 -4
  259. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +19 -233
  260. package/node_modules/@noodle-borg/service/dist/routes/deployment-activation-response.js +13 -4
  261. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +4 -0
  262. package/node_modules/@noodle-borg/service/dist/service.js +57 -11
  263. package/node_modules/@noodle-borg/service/dist/solution-installation-activation.js +149 -0
  264. package/node_modules/@noodle-borg/service/dist/source-configuration-authority.js +94 -0
  265. package/node_modules/@noodle-borg/service/dist/state-catalog.js +6 -5
  266. package/node_modules/@noodle-borg/service/dist/store/config-values.d.ts +42 -17
  267. package/node_modules/@noodle-borg/service/dist/store/config-values.js +123 -24
  268. package/node_modules/@noodle-borg/service/dist/store/in-memory.d.ts +1 -0
  269. package/node_modules/@noodle-borg/service/dist/store/in-memory.js +3 -0
  270. package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +1 -0
  271. package/node_modules/@noodle-borg/service/dist/store/json-file.js +3 -0
  272. package/node_modules/@noodle-borg/service/dist/store.d.ts +3 -1
  273. package/node_modules/@noodle-borg/service/package.json +2 -2
  274. package/node_modules/@noodle-borg/transport-http/dist/serve-request.js +9 -0
  275. package/node_modules/@noodle-borg/transport-http/package.json +1 -0
  276. package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.d.ts +143 -0
  277. package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.js +90 -0
  278. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.d.ts +130 -0
  279. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.js +77 -0
  280. package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.d.ts +105 -0
  281. package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.js +67 -0
  282. package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.d.ts +27 -0
  283. package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.js +28 -0
  284. package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.d.ts +112 -0
  285. package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.js +88 -0
  286. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts +1 -1
  287. package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.d.ts +62 -0
  288. package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.js +57 -0
  289. package/node_modules/@noodle-borg/wire-contracts/dist/billing-enforcement.d.ts +12 -12
  290. package/node_modules/@noodle-borg/wire-contracts/dist/billing-metering.d.ts +4 -4
  291. package/node_modules/@noodle-borg/wire-contracts/dist/billing-org-transfer.d.ts +3 -3
  292. package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.d.ts +25 -0
  293. package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.js +37 -0
  294. package/node_modules/@noodle-borg/wire-contracts/dist/business-information.d.ts +1816 -158
  295. package/node_modules/@noodle-borg/wire-contracts/dist/business-information.js +416 -41
  296. package/node_modules/@noodle-borg/wire-contracts/dist/control-plane.d.ts +2 -2
  297. package/node_modules/@noodle-borg/wire-contracts/dist/distribution.d.ts +5 -5
  298. package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +8 -0
  299. package/node_modules/@noodle-borg/wire-contracts/dist/index.js +8 -0
  300. package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts +3 -3
  301. package/node_modules/@noodle-borg/wire-contracts/dist/managed-assistant-sponsorship.d.ts +7 -7
  302. package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.d.ts +5 -0
  303. package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.js +1 -0
  304. package/node_modules/@noodle-borg/wire-contracts/dist/platform-auth.d.ts +66 -66
  305. package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.d.ts +143 -0
  306. package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.js +94 -0
  307. package/node_modules/@noodleseed/assistant/README.md +5 -0
  308. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- import { AssistantInteractionCapacityError, assistantConfirmationReview, assistantConfirmationTransition, assistantInputTransition, assistantInteractionTool, assistantPreparedArgumentReview, assistantPreparedToolContinuation, assistantSafeOutput, assistantToolContinuation, assistantViewAvailableData, auditAssistantInteraction, recoverableAssistantView, withAssistantSessionExecutionAuthority, } from '@noodle-borg/assistant-gateway/portable';
1
+ import { AssistantInteractionCapacityError, assistantConfirmationReview, assistantConfirmationTransition, assistantInputTransition, assistantInteractionTool, assistantPreparedArgumentReview, assistantPreparedToolContinuation, assistantSafeOutput, assistantToolContinuation, assistantViewAvailableData, auditAssistantInteraction, boundedAssistantExecution, recoverableAssistantView, withAssistantSessionExecutionAuthority, } from '@noodle-borg/assistant-gateway/portable';
2
2
  import { executePreparedTool, executeToolInteractive, resumeTool, resumeToolPreparation, } from '@noodle-borg/runtime';
3
3
  import { readJsonBody, sendJson } from '@noodle-borg/transport-http';
4
4
  import { applyBrowserCors, authenticateSession, now, } from './assistant.js';
@@ -49,7 +49,7 @@ async function handleResolution(req, res, deps, legacyAcceptOnly) {
49
49
  return sendJson(res, 409, { error: 'interaction is invalid or expired' });
50
50
  }
51
51
  if (response.value.action !== 'accept') {
52
- return resolveStop(res, deps, session, interaction, response.value.action, suggestions);
52
+ return resolveStop(req, res, deps, session, interaction, response.value.action, suggestions);
53
53
  }
54
54
  if (interaction.kind === 'confirmation' && response.value.content !== undefined) {
55
55
  return sendJson(res, 400, { error: 'confirmation content cannot replace reviewed arguments' });
@@ -76,13 +76,13 @@ async function handleResolution(req, res, deps, legacyAcceptOnly) {
76
76
  }
77
77
  acceptedContent = validated.value;
78
78
  }
79
- return resolveAccept(res, deps, session, interaction, acceptedContent, suggestions);
79
+ return resolveAccept(req, res, deps, session, interaction, acceptedContent, suggestions);
80
80
  }
81
- async function resolveAccept(res, deps, session, interaction, content, suggestions) {
81
+ async function resolveAccept(req, res, deps, session, interaction, content, suggestions) {
82
82
  if (interaction.status !== 'pending') {
83
83
  return replayOrConflict(res, deps, session, interaction, 'accept');
84
84
  }
85
- const target = await sessionScopedTarget(deps.registry, session);
85
+ const target = await sessionScopedTarget(deps.registry, session, deps.resolveRuntimeTarget, req);
86
86
  if (!target) {
87
87
  await auditAssistantInteraction({
88
88
  audit: deps.audit,
@@ -126,38 +126,50 @@ async function resolveAccept(res, deps, session, interaction, content, suggestio
126
126
  action: 'accept',
127
127
  status: 'accepted',
128
128
  });
129
- const executeDeps = {
130
- ...withAssistantSessionExecutionAuthority(target.served.deps, target.served.artifact, session),
131
- caller: session.caller,
132
- context,
133
- };
134
- let result;
135
- if (claimed.interaction.kind === 'confirmation') {
136
- const prepared = assistantPreparedToolContinuation(claimed.interaction);
137
- const tool = target.served.artifact.tools.find((candidate) => candidate.name === claimed.interaction.tool);
138
- if (!prepared &&
139
- tool?.fulfilment.kind === 'flow' &&
140
- tool.fulfilment.steps.some((step) => step.kind === 'elicit')) {
141
- result = {
142
- status: 'failed',
143
- error: {
144
- code: 'invalid_continuation',
145
- message: 'legacy confirmation did not capture elicited input',
146
- },
147
- };
129
+ const result = await boundedAssistantExecution(async (signal) => {
130
+ const executeDeps = {
131
+ ...withAssistantSessionExecutionAuthority(target.served.deps, target.served.artifact, session),
132
+ caller: session.caller,
133
+ context,
134
+ invocationId: claimed.interaction.id,
135
+ signal,
136
+ };
137
+ let result;
138
+ if (claimed.interaction.kind === 'confirmation') {
139
+ const prepared = assistantPreparedToolContinuation(claimed.interaction);
140
+ const tool = target.served.artifact.tools.find((candidate) => candidate.name === claimed.interaction.tool);
141
+ if (!prepared &&
142
+ tool?.fulfilment.kind === 'flow' &&
143
+ tool.fulfilment.steps.some((step) => step.kind === 'elicit')) {
144
+ result = {
145
+ status: 'failed',
146
+ error: {
147
+ code: 'invalid_continuation',
148
+ message: 'legacy confirmation did not capture elicited input',
149
+ },
150
+ };
151
+ }
152
+ else {
153
+ result = prepared
154
+ ? await executePreparedTool(target.served.artifact, prepared, executeDeps)
155
+ : await executeToolInteractive(target.served.artifact, claimed.interaction.tool, claimed.interaction.arguments, executeDeps);
156
+ }
148
157
  }
149
158
  else {
150
- result = prepared
151
- ? await executePreparedTool(target.served.artifact, prepared, executeDeps)
152
- : await executeToolInteractive(target.served.artifact, claimed.interaction.tool, claimed.interaction.arguments, executeDeps);
159
+ const continuation = assistantToolContinuation(claimed.interaction);
160
+ result = isToolPreparationContinuation(continuation)
161
+ ? await resumeToolPreparation(target.served.artifact, continuation, { action: 'accept', content }, executeDeps)
162
+ : await resumeTool(target.served.artifact, continuation, { action: 'accept', content }, executeDeps);
153
163
  }
154
- }
155
- else {
156
- const continuation = assistantToolContinuation(claimed.interaction);
157
- result = isToolPreparationContinuation(continuation)
158
- ? await resumeToolPreparation(target.served.artifact, continuation, { action: 'accept', content }, executeDeps)
159
- : await resumeTool(target.served.artifact, continuation, { action: 'accept', content }, executeDeps);
160
- }
164
+ return result;
165
+ }, () => ({
166
+ status: 'failed',
167
+ error: {
168
+ code: 'connector_error',
169
+ reason: 'operation_outcome_unknown',
170
+ message: 'Execution stopped. Verify the original outcome before requesting another write.',
171
+ },
172
+ }));
161
173
  return finishExecution(res, deps, session, claimed.interaction, context, result, target, suggestions);
162
174
  }
163
175
  async function finishExecution(res, deps, session, interaction, context, result, target, suggestions) {
@@ -371,11 +383,11 @@ async function finishExecution(res, deps, session, interaction, context, result,
371
383
  await narrateResolvedInteraction(res, deps, target, session, toolName, 'accept', safeOutput, context, suggestions);
372
384
  return endInteractionSse(res);
373
385
  }
374
- async function resolveStop(res, deps, session, interaction, action, suggestions) {
386
+ async function resolveStop(req, res, deps, session, interaction, action, suggestions) {
375
387
  if (interaction.status !== 'pending') {
376
388
  return replayOrConflict(res, deps, session, interaction, action);
377
389
  }
378
- const target = await sessionScopedTarget(deps.registry, session);
390
+ const target = await sessionScopedTarget(deps.registry, session, deps.resolveRuntimeTarget, req);
379
391
  const context = target
380
392
  ? await resolveAssistantInteractionContext(interaction, session, target, deps)
381
393
  : undefined;
@@ -1,6 +1,7 @@
1
1
  import { authorizePublicConfiguration, effectiveAssistantBrowserConfiguration, publicEmbedTenant, publicSurfaceOf, } from '@noodle-borg/assistant-gateway/portable';
2
2
  import { sendJson } from '@noodle-borg/transport-http';
3
3
  import { applyBrowserCors } from './assistant-route-http.js';
4
+ import { activeAssistantTarget } from './assistant-session-target.js';
4
5
  /** Browser-safe first paint for a public launcher; never mints a session or spends admission. */
5
6
  export async function handlePublicAssistantConfiguration(req, res, embedId, deps) {
6
7
  if (req.method !== 'GET')
@@ -13,7 +14,7 @@ export async function handlePublicAssistantConfiguration(req, res, embedId, deps
13
14
  const authorized = await authorizePublicConfiguration({ embedId, origin }, {
14
15
  embeds: deps.publicEmbeds,
15
16
  resolveActiveSurface: async (embed) => {
16
- state.target = await deps.registry.getActiveByTenant(publicEmbedTenant(embed));
17
+ state.target = await activeAssistantTarget(deps, publicEmbedTenant(embed));
17
18
  return state.target
18
19
  ? publicSurfaceOf(state.target.served.artifact.server.assistant)
19
20
  : undefined;
@@ -29,7 +30,7 @@ export async function handlePublicAssistantConfiguration(req, res, embedId, deps
29
30
  if (target === undefined) {
30
31
  return sendJson(res, 409, { error: 'assistant deployment is unavailable' });
31
32
  }
32
- const resolved = await effectiveAssistantBrowserConfiguration(target.served.artifact.server, publicEmbedTenant(authorized.embed), deps.appearance, 'public');
33
+ const resolved = await effectiveAssistantBrowserConfiguration(target.served.artifact.server, publicEmbedTenant(authorized.embed), deps.appearance, 'public', target.businessNotice);
33
34
  applyBrowserCors(req, res, origin);
34
35
  res.setHeader('cache-control', 'private, no-cache');
35
36
  return sendJson(res, 200, {
@@ -5,6 +5,7 @@ import { assistantSessionUsageRequestEvent, captureAssistantUsage, captureRefuse
5
5
  import { readJsonBody, sendJson } from '@noodle-borg/transport-http';
6
6
  import { assistantSessionResponseSchema } from '@noodle-borg/wire-contracts';
7
7
  import { applyBrowserCors, assistantSessionEndpoints, now } from './assistant-route-http.js';
8
+ import { activeAssistantTarget } from './assistant-session-target.js';
8
9
  /**
9
10
  * The transport half of anonymous session minting. Every decision — which refusal, in which order, and
10
11
  * whether the surface may serve at all — lives in `@noodle-borg/assistant-gateway`; this file parses a
@@ -28,11 +29,9 @@ export async function handlePublicAssistantSession(req, res, deps) {
28
29
  const { embedId, visitorId } = body.value;
29
30
  // The browser's Origin header is the claim under test. The body never asserts its own origin.
30
31
  const origin = typeof req.headers.origin === 'string' ? req.headers.origin : undefined;
31
- // Admission tier 3. Hashed here so no raw address crosses into the decision, a counter key, or an
32
- // audit payload; the socket address is Google's front end on Cloud Run, so the forwarded chain is the
33
- // only place the visitor appears. Unparseable ingress yields no bucket and the surface tier alone
34
- // applies — losing fairness, never solvency.
35
- const addressBucket = clientAddressBucket(typeof req.headers['x-forwarded-for'] === 'string' ? req.headers['x-forwarded-for'] : undefined);
32
+ // Without deployment-verified ingress attribution only the immediate peer is authoritative.
33
+ // A shared proxy bucket can reduce fairness, but forged forwarding headers cannot rotate it.
34
+ const addressBucket = clientAddressBucket(req.socket.remoteAddress);
36
35
  let configuration;
37
36
  let sponsoredBudget;
38
37
  let usageSession;
@@ -40,7 +39,7 @@ export async function handlePublicAssistantSession(req, res, deps) {
40
39
  embeds,
41
40
  counters,
42
41
  resolveActiveSurface: async (embed) => {
43
- const target = await deps.registry.getActiveByTenant(publicEmbedTenant(embed));
42
+ const target = await activeAssistantTarget(deps, publicEmbedTenant(embed));
44
43
  if (!target?.deploymentId)
45
44
  return undefined;
46
45
  if (target.served.artifact.server.assistant?.model.kind === 'noodle-managed') {
@@ -55,11 +54,12 @@ export async function handlePublicAssistantSession(req, res, deps) {
55
54
  },
56
55
  resolveBudgetBounds: async () => sponsoredBudget,
57
56
  createSession: async (input) => {
58
- const target = await deps.registry.getActiveByTenant(publicEmbedTenant(input.embed));
59
- if (!target?.deploymentId)
60
- throw new Error('assistant deployment vanished mid-mint');
57
+ const target = await activeAssistantTarget(deps, publicEmbedTenant(input.embed));
58
+ if (!target?.deploymentId ||
59
+ !publicSurfaceOf(target.served.artifact.server.assistant)?.origins.includes(input.origin))
60
+ throw new Error('assistant surface changed mid-mint');
61
61
  const current = now(deps);
62
- configuration = (await effectiveAssistantBrowserConfiguration(target.served.artifact.server, publicEmbedTenant(input.embed), deps.appearance, 'public')).effective;
62
+ configuration = (await effectiveAssistantBrowserConfiguration(target.served.artifact.server, publicEmbedTenant(input.embed), deps.appearance, 'public', target.businessNotice)).effective;
63
63
  const created = await deps.store.createSession({
64
64
  // A public surface has no client credential, so the embed id stands in as the minting
65
65
  // authority. It is not a secret and nothing downstream may begin treating it as one.
@@ -1,6 +1,35 @@
1
- import { resolveAssistantSessionTarget, } from '@noodle-borg/assistant-gateway/portable';
1
+ import { assistantConfigurationHasBusinessNotice, resolveAssistantSessionTarget, } from '@noodle-borg/assistant-gateway/portable';
2
+ import { resolveTargetOrigins } from '../application-runtime-target.js';
2
3
  /** Adapt the registry to the gateway-owned, surface-projected session target decision. */
3
- export function sessionScopedTarget(registry, session) {
4
- return resolveAssistantSessionTarget((deploymentId) => registry.get(deploymentId), session);
4
+ export async function sessionScopedTarget(registry, session, resolve = resolveTargetOrigins, req) {
5
+ const target = await resolveAssistantSessionTarget(async (deploymentId) => {
6
+ const target = await registry.get(deploymentId);
7
+ return target && resolve(target);
8
+ }, session);
9
+ if (target === undefined)
10
+ return undefined;
11
+ if (target.businessNotice &&
12
+ !assistantConfigurationHasBusinessNotice(session.configuration, target.businessNotice))
13
+ return undefined;
14
+ const publicAdmission = trustedPublicAdmission({
15
+ scope: `${session.tenant.org}/${session.tenant.app}/${session.tenant.env}`,
16
+ sourceAddress: req?.socket?.remoteAddress,
17
+ subject: session.caller.subject,
18
+ });
19
+ return {
20
+ ...target,
21
+ served: {
22
+ ...target.served,
23
+ deps: {
24
+ ...target.served.deps,
25
+ ...(publicAdmission === undefined ? {} : { publicAdmission }),
26
+ },
27
+ },
28
+ };
5
29
  }
30
+ export async function activeAssistantTarget(deps, tenant) {
31
+ const target = await deps.registry.getActiveByTenant(tenant);
32
+ return target && (deps.resolveRuntimeTarget ?? resolveTargetOrigins)(target);
33
+ }
34
+ import { trustedPublicAdmission } from '@noodle-borg/admission-limits/portable';
6
35
  //# sourceMappingURL=assistant-session-target.js.map
@@ -36,7 +36,7 @@ export async function handleAssistantSuggestions(req, res, deps) {
36
36
  }
37
37
  if (claim.disposition !== 'generate')
38
38
  return writeEmptySuggestions(res, session.origin);
39
- const target = await sessionScopedTarget(deps.registry, session);
39
+ const target = await sessionScopedTarget(deps.registry, session, deps.resolveRuntimeTarget, req);
40
40
  if (!target) {
41
41
  await deps.store.failInitialSuggestions(session.id);
42
42
  return writeEmptySuggestions(res, session.origin);
@@ -18,7 +18,7 @@ export async function handleAssistantTranscript(req, res, deps) {
18
18
  if (!session)
19
19
  return;
20
20
  applyBrowserCors(req, res, session.origin);
21
- const target = await sessionScopedTarget(deps.registry, session);
21
+ const target = await sessionScopedTarget(deps.registry, session, deps.resolveRuntimeTarget, req);
22
22
  const latestView = target && session.latestView
23
23
  ? assistantViewAvailableData(target.served.artifact, { ...session.latestView, replayed: true }, (failure) => deps.logger?.warn('assistant.view.unresolved', { ...failure }))
24
24
  : undefined;
@@ -13,7 +13,7 @@ import { createAssistantTurnStats, runAgentTurn } from './assistant-agent.js';
13
13
  import { elevateAssistantSession } from './assistant-elevation.js';
14
14
  import { executeAssistantKnowledgeSearch, findAssistantKnowledgeComponent, resolveAssistantKnowledge, } from './assistant-knowledge.js';
15
15
  import { applyBrowserCors, assistantSessionEndpoints, authenticateSession, handleAssistantPreflight, now, } from './assistant-route-http.js';
16
- import { sessionScopedTarget } from './assistant-session-target.js';
16
+ import { activeAssistantTarget, sessionScopedTarget } from './assistant-session-target.js';
17
17
  import { authorizeControlPlane } from './control-plane.js';
18
18
  export { applyBrowserCors, authenticateSession, handleAssistantPreflight, now };
19
19
  const SESSION_ABSOLUTE_MS = 2 * 60 * 60 * 1000;
@@ -62,7 +62,7 @@ export async function handleAssistantSession(req, res, deps) {
62
62
  // Clients are tenant-bound: sessions follow the tenant's ACTIVE deployment, and the origin
63
63
  // allowlist is read from the live artifact, so `noodle deploy` alone updates a live embed.
64
64
  // client.deploymentId/allowedOrigins remain as created-against audit data.
65
- const target = await deps.registry.getActiveByTenant(client.tenant);
65
+ const target = await activeAssistantTarget(deps, client.tenant);
66
66
  const assistant = target?.served.artifact.server.assistant;
67
67
  if (!target?.deploymentId || !assistant)
68
68
  return sendJson(res, 409, { error: 'assistant deployment is unavailable' });
@@ -98,7 +98,7 @@ export async function handleAssistantSession(req, res, deps) {
98
98
  const declaredClaims = assistant.sessionClaims ?? {};
99
99
  const claims = Object.fromEntries(Object.entries(isAssistantVerifiedClaims(parsed.claims) ? parsed.claims : {}).filter(([key]) => key in declaredClaims));
100
100
  const current = now(deps);
101
- const configuration = (await effectiveAssistantBrowserConfiguration(target.served.artifact.server, client.tenant, deps.appearance, surfaceBinding.kind === 'pre-surfaces' ? undefined : surfaceBinding.kind)).effective;
101
+ const configuration = (await effectiveAssistantBrowserConfiguration(target.served.artifact.server, client.tenant, deps.appearance, surfaceBinding.kind === 'pre-surfaces' ? undefined : surfaceBinding.kind, target.businessNotice)).effective;
102
102
  const roles = canonicalizeAuthorizationClaimValues(parsed.user.roles, 'role');
103
103
  const scopes = canonicalizeAuthorizationClaimValues(parsed.user.scopes, 'scope');
104
104
  // Hoisted so an elevation and a fresh exchange bind the *same* principal. Two constructions would be
@@ -195,7 +195,10 @@ export async function handleAssistantTurn(req, res, deps) {
195
195
  return sendJson(res, body.status, { error: body.error });
196
196
  // Admission tier 3, hashed here for the same reason the mint hashes it: no raw address may reach the
197
197
  // decision, a counter key, or an audit payload.
198
- const addressBucket = clientAddressBucket(typeof req.headers['x-forwarded-for'] === 'string' ? req.headers['x-forwarded-for'] : undefined);
198
+ const target = await sessionScopedTarget(deps.registry, session, deps.resolveRuntimeTarget, req);
199
+ if (!target)
200
+ return sendJson(res, 409, { error: 'assistant deployment is unavailable' });
201
+ const addressBucket = clientAddressBucket(req.socket.remoteAddress);
199
202
  let turn;
200
203
  let message;
201
204
  let resumedTool;
@@ -256,8 +259,8 @@ export async function handleAssistantTurn(req, res, deps) {
256
259
  if (message.trim().length === 0) {
257
260
  return sendJson(res, 400, { error: '"message" must be a non-empty string' });
258
261
  }
259
- // Admission before any metered work (ADR 0201 §8): ahead of the deployment read and well ahead
260
- // of the model, so a refused turn costs the customer nothing.
262
+ // Resolve live authority first: a paused application or removed origin spends no turn allowance.
263
+ // Admission still precedes every model request and business operation.
261
264
  const refusal = await refusePublicTurn(deps, session, message, addressBucket);
262
265
  if (refusal)
263
266
  return refuseTurn(deps, res, session, refusal, usageStartedAt);
@@ -265,9 +268,6 @@ export async function handleAssistantTurn(req, res, deps) {
265
268
  if (session.pendingResume)
266
269
  await deps.store.consumePendingResume(session.id);
267
270
  }
268
- const target = await sessionScopedTarget(deps.registry, session);
269
- if (!target)
270
- return sendJson(res, 409, { error: 'assistant deployment is unavailable' });
271
271
  if (resumedTool !== undefined &&
272
272
  !target.served.artifact.tools.some((tool) => tool.name === resumedTool)) {
273
273
  // The elevation landed on a surface whose projection does not offer the intercepted tool: fail
@@ -378,7 +378,7 @@ export async function handleAssistantAppRequest(req, res, deps) {
378
378
  !isRecord(body.value.params)) {
379
379
  return sendJson(res, 400, { error: 'invalid MCP App request' });
380
380
  }
381
- const target = await sessionScopedTarget(deps.registry, session);
381
+ const target = await sessionScopedTarget(deps.registry, session, deps.resolveRuntimeTarget, req);
382
382
  if (!target)
383
383
  return sendJson(res, 409, { error: 'assistant deployment is unavailable' });
384
384
  const method = body.value.method;
@@ -0,0 +1,83 @@
1
+ import { readJsonBody, sendJson } from '@noodle-borg/transport-http';
2
+ import { ApplicationActivityListResponseSchema, ApplicationActivityPreviewResponseSchema, ApplicationActivitySettingsResponseSchema, ApplicationActivitySettingsSaveRequestSchema, } from '@noodle-borg/wire-contracts';
3
+ import { ActivityPolicyError } from '../application-activity.js';
4
+ import { businessGrantAllows } from '../business-information/model.js';
5
+ import { requireIdentity, requireInstallationPermission, } from './business-information.js';
6
+ import { parseBusinessPaging } from './business-information-request.js';
7
+ export async function handleApplicationActivity(req, res, url, ref, deps) {
8
+ const settings = url.pathname.endsWith('/activity/settings');
9
+ const exporting = url.pathname.endsWith('/activity/export');
10
+ const preview = url.pathname.endsWith('/activity/preview');
11
+ if (req.method !== 'GET' && !(settings && req.method === 'PATCH')) {
12
+ res.setHeader('allow', settings ? 'GET, PATCH' : 'GET');
13
+ return sendJson(res, 405, { error: 'method not allowed' });
14
+ }
15
+ const identity = await requireIdentity(req, res, deps);
16
+ if (identity === false)
17
+ return;
18
+ const permission = req.method === 'PATCH'
19
+ ? 'installation:administer'
20
+ : exporting
21
+ ? 'records:export'
22
+ : 'records:read';
23
+ const authorized = await requireInstallationPermission(res, ref, identity, permission, deps);
24
+ if (!authorized)
25
+ return;
26
+ const reply = async (body) => {
27
+ if (await requireInstallationPermission(res, ref, identity, permission, deps))
28
+ sendJson(res, 200, body);
29
+ };
30
+ res.setHeader('cache-control', 'private, no-store');
31
+ try {
32
+ const allowedQuery = settings || preview ? [] : ['limit', 'cursor'];
33
+ for (const key of url.searchParams.keys())
34
+ if (!allowedQuery.includes(key) || url.searchParams.getAll(key).length !== 1)
35
+ throw new ActivityPolicyError('activity_invalid');
36
+ if (!deps.activity)
37
+ throw new ActivityPolicyError('activity_unavailable');
38
+ const canEdit = businessGrantAllows(authorized.grant, 'installation:administer');
39
+ if (settings && req.method === 'PATCH') {
40
+ const body = await readJsonBody(req, deps.maxBody);
41
+ if (!body.ok)
42
+ return sendJson(res, body.status, { error: body.error });
43
+ const parsed = ApplicationActivitySettingsSaveRequestSchema.safeParse(body.value);
44
+ if (!parsed.success)
45
+ throw new ActivityPolicyError('activity_invalid');
46
+ const data = await deps.activity.save(authorized.scope, parsed.data);
47
+ await deps.audit?.emit({
48
+ eventType: 'config.activity.retention_changed',
49
+ org: ref.org,
50
+ app: authorized.scope.app,
51
+ env: authorized.scope.env,
52
+ actorSubject: identity.subject,
53
+ details: { retentionDays: data.retentionDays },
54
+ });
55
+ return reply(ApplicationActivitySettingsResponseSchema.parse({ ok: true, data }));
56
+ }
57
+ if (preview)
58
+ return reply(ApplicationActivityPreviewResponseSchema.parse({
59
+ ok: true,
60
+ data: await deps.activity.preview(authorized.scope),
61
+ }));
62
+ if (settings)
63
+ return reply(ApplicationActivitySettingsResponseSchema.parse({
64
+ ok: true,
65
+ data: (await deps.activity.settings(authorized.scope, canEdit)).projection,
66
+ }));
67
+ const paging = parseBusinessPaging(url, 100);
68
+ if (!paging.ok)
69
+ return sendJson(res, 400, { error: paging.error });
70
+ const data = await deps.activity.page(authorized.scope, {
71
+ purpose: exporting ? 'export' : 'list',
72
+ limit: paging.value.limit ?? 50,
73
+ ...(paging.value.cursor === undefined ? {} : { cursor: paging.value.cursor }),
74
+ });
75
+ return reply(ApplicationActivityListResponseSchema.parse({ ok: true, data }));
76
+ }
77
+ catch (error) {
78
+ if (!(error instanceof ActivityPolicyError))
79
+ throw error;
80
+ sendJson(res, error.code === 'activity_unavailable' ? 503 : error.code === 'activity_conflict' ? 409 : 400, { code: error.code, error: error.message });
81
+ }
82
+ }
83
+ //# sourceMappingURL=business-information-activity.js.map
@@ -0,0 +1,26 @@
1
+ import { admitPublicRecord, clientAddressBucket, PUBLIC_ADMISSION_ASSERTION_HEADER, verifyPublicAdmissionAssertion, } from '@noodle-borg/admission-limits/portable';
2
+ /** Atomically apply every unavoidable public-intake ceiling to one new logical record. */
3
+ export async function consumePublicIntakeQuota(req, publicId, attempt, deps, binding) {
4
+ const timestamp = deps.now?.() ?? new Date();
5
+ // TLS proxy trust does not authenticate browser attribution. Until the Portal/service hop has its
6
+ // own verified assertion, use only the immediate peer and keep the installation ceiling as the
7
+ // unavoidable abuse bound. This deliberately collapses a Portal BFF to one fairness bucket instead
8
+ // of letting callers forge X-Forwarded-For into unlimited buckets.
9
+ const assertion = req.headers[PUBLIC_ADMISSION_ASSERTION_HEADER];
10
+ const attributed = typeof assertion === 'string' && binding && deps.publicAdmissionKeys
11
+ ? verifyPublicAdmissionAssertion(assertion, binding, deps.publicAdmissionKeys, timestamp)
12
+ : undefined;
13
+ if (assertion !== undefined && attributed === undefined)
14
+ return { allowed: false, reason: 'invalid_attribution' };
15
+ const peer = clientAddressBucket(req.socket.remoteAddress);
16
+ const buckets = attributed ?? (peer ? { network: peer } : {});
17
+ return admitPublicRecord({
18
+ counters: deps.publicCounters,
19
+ surfaceId: publicId,
20
+ attempt,
21
+ buckets,
22
+ now: timestamp,
23
+ ...(deps.publicAdmissionLimits ? { limits: deps.publicAdmissionLimits } : {}),
24
+ });
25
+ }
26
+ //# sourceMappingURL=business-information-admission.js.map
@@ -0,0 +1,153 @@
1
+ import { ADMISSION_DEFAULTS, clamp } from '@noodle-borg/admission-limits/portable';
2
+ import { assistantEmbedOperatorView, publicSurfaceOf, surfaceEnvelope, } from '@noodle-borg/assistant-gateway/portable';
3
+ import { readJsonBody, sendJson } from '@noodle-borg/transport-http';
4
+ import { ApplicationChannelsResponseSchema, ApplicationChannelsSaveRequestSchema, } from '@noodle-borg/wire-contracts';
5
+ import { resolveTargetOrigins } from '../application-runtime-target.js';
6
+ import { businessGrantAllows, } from '../business-information/portable.js';
7
+ import { mutationFailure, requireIdentity, requireInstallationPermission, } from './business-information.js';
8
+ import { tenantMcpUrl } from './endpoint-enrichment.js';
9
+ /** Business grants project the existing MCP/assistant channel authority without developer permissions. */
10
+ export async function handleBusinessChannels(req, res, ref, deps) {
11
+ if (req.method !== 'GET' && req.method !== 'PATCH') {
12
+ res.setHeader('Allow', 'GET, PATCH');
13
+ return sendJson(res, 405, { error: 'method not allowed' });
14
+ }
15
+ const identity = await requireIdentity(req, res, deps);
16
+ if (identity === false)
17
+ return;
18
+ const authorized = await requireInstallationPermission(res, ref, identity, req.method === 'PATCH' ? 'installation:administer' : 'records:read', deps);
19
+ if (!authorized)
20
+ return;
21
+ let installation = authorized.installation;
22
+ const setupReady = !deps.businessOnboarding || (await deps.businessOnboarding.ready(installation));
23
+ if (req.method === 'GET' && !setupReady)
24
+ return sendJson(res, 409, {
25
+ code: 'business_setup_required',
26
+ error: 'Complete the organization agreement and business notice before publishing agent channels.',
27
+ });
28
+ if (req.method === 'PATCH') {
29
+ const body = await readJsonBody(req, deps.maxBody);
30
+ if (!body.ok)
31
+ return sendJson(res, body.status, { error: body.error });
32
+ const parsed = ApplicationChannelsSaveRequestSchema.safeParse(body.value);
33
+ if (!parsed.success)
34
+ return sendJson(res, 400, { code: 'channels_invalid', error: 'invalid channel settings' });
35
+ if (parsed.data.active && !setupReady)
36
+ return sendJson(res, 409, {
37
+ code: 'business_setup_required',
38
+ error: 'Complete business setup before publishing agent channels.',
39
+ });
40
+ const result = await deps.store.setIntakeState({
41
+ scope: authorized.scope,
42
+ expectedRevision: parsed.data.expectedRevision,
43
+ active: parsed.data.active,
44
+ actorSubject: identity.subject,
45
+ });
46
+ if (!result.ok)
47
+ return mutationFailure(res, result);
48
+ installation = result.installation;
49
+ }
50
+ const projection = await projectBusinessChannels(installation, businessGrantAllows(authorized.grant, 'installation:administer'), deps.resolveEndpointBase(req), deps);
51
+ res.setHeader('cache-control', 'private, no-store');
52
+ sendJson(res, 200, ApplicationChannelsResponseSchema.parse({ ok: true, data: projection }));
53
+ }
54
+ export async function projectBusinessChannels(installation, canEdit, base, deps) {
55
+ const tenant = {
56
+ org: installation.scope.org,
57
+ app: installation.scope.app,
58
+ env: installation.scope.env,
59
+ };
60
+ const registered = await deps.registry.getActiveByTenant(tenant);
61
+ const target = registered && (await resolveTargetOrigins(registered));
62
+ const shared = { revision: installation.revision, active: installation.intakeActive, canEdit };
63
+ if (!target?.deploymentId)
64
+ return {
65
+ ...shared,
66
+ mcp: { status: 'unavailable' },
67
+ assistant: {
68
+ status: 'unavailable',
69
+ reason: 'The application has no active deployment.',
70
+ origins: [],
71
+ capabilities: [],
72
+ },
73
+ };
74
+ const endpointOptions = await deps.resolveEndpointUrlOptions?.(tenant.org);
75
+ const mcp = {
76
+ status: installation.intakeActive ? 'ready' : 'paused',
77
+ url: tenantMcpUrl(base, tenant, undefined, endpointOptions),
78
+ accessMode: target.accessMode,
79
+ };
80
+ const surface = publicSurfaceOf(target.served.artifact.server.assistant);
81
+ const emptyAssistant = {
82
+ status: 'unavailable',
83
+ origins: [...(surface?.origins ?? [])],
84
+ capabilities: surface?.capabilities.map((entry) => entry.name) ?? [],
85
+ };
86
+ const records = await deps.publicEmbeds?.list(tenant);
87
+ const record = records?.find((entry) => entry.revokedAt === undefined &&
88
+ entry.org === tenant.org &&
89
+ entry.app === tenant.app &&
90
+ entry.env === tenant.env);
91
+ const counters = deps.admissionCounters;
92
+ if (!surface || !record || !counters) {
93
+ return {
94
+ ...shared,
95
+ deploymentId: target.deploymentId,
96
+ mcp,
97
+ assistant: {
98
+ ...emptyAssistant,
99
+ reason: 'The public assistant is not configured for this deployment.',
100
+ },
101
+ };
102
+ }
103
+ const at = deps.now?.() ?? new Date();
104
+ const managed = target.served.artifact.server.assistant?.model?.kind === 'noodle-managed';
105
+ const binding = managed
106
+ ? await deps.managedModelResolver?.resolve({
107
+ tenant,
108
+ deploymentId: target.deploymentId,
109
+ })
110
+ : undefined;
111
+ const bounds = binding?.publicAdmission;
112
+ const modelUnavailable = managed && binding === undefined;
113
+ const view = await assistantEmbedOperatorView({
114
+ record,
115
+ surface,
116
+ envelope: surfaceEnvelope(clamp(deps.admissionEnvelope ?? ADMISSION_DEFAULTS), record, bounds),
117
+ peek: (key) => counters.peek(key, at),
118
+ ...(bounds?.spend ? { spend: bounds.spend } : {}),
119
+ });
120
+ const ready = surface.origins.length > 0 && surface.capabilities.length > 0 && !modelUnavailable;
121
+ return {
122
+ ...shared,
123
+ deploymentId: target.deploymentId,
124
+ mcp,
125
+ assistant: {
126
+ status: !ready
127
+ ? 'unavailable'
128
+ : !installation.intakeActive || view.turnsPerDay === 0 || view.mintsPerDay === 0
129
+ ? 'paused'
130
+ : 'ready',
131
+ ...(!ready
132
+ ? {
133
+ reason: modelUnavailable
134
+ ? 'Managed assistant availability is not configured for this application.'
135
+ : 'The application needs an allowed website origin and declared assistant capabilities.',
136
+ }
137
+ : {}),
138
+ embedId: record.embedId,
139
+ serviceUrl: base.replace(/\/+$/, ''),
140
+ scriptUrl: `${base.replace(/\/+$/, '')}/v1/assistant/embed.js`,
141
+ origins: [...view.origins],
142
+ capabilities: [...view.capabilities],
143
+ usage: {
144
+ turnsPerDay: view.turnsPerDay,
145
+ turnsToday: view.turnsToday,
146
+ mintsPerDay: view.mintsPerDay,
147
+ mintsToday: view.mintsToday,
148
+ ...(view.managedSpend ? { managedSpend: view.managedSpend } : {}),
149
+ },
150
+ },
151
+ };
152
+ }
153
+ //# sourceMappingURL=business-information-channels.js.map