@noodleseed/one 0.162.0 → 0.164.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/dist/banner.d.ts +6 -0
  2. package/dist/banner.d.ts.map +1 -0
  3. package/dist/banner.js +29 -0
  4. package/dist/banner.js.map +1 -0
  5. package/dist/commands/billing-catalog-ops.d.ts +4 -0
  6. package/dist/commands/billing-catalog-ops.d.ts.map +1 -0
  7. package/dist/commands/billing-catalog-ops.js +58 -0
  8. package/dist/commands/billing-catalog-ops.js.map +1 -0
  9. package/dist/commands/billing-ops.d.ts.map +1 -1
  10. package/dist/commands/billing-ops.js +3 -0
  11. package/dist/commands/billing-ops.js.map +1 -1
  12. package/dist/commands/catalog.d.ts.map +1 -1
  13. package/dist/commands/catalog.js +2 -0
  14. package/dist/commands/catalog.js.map +1 -1
  15. package/dist/commands/config-values.d.ts.map +1 -1
  16. package/dist/commands/config-values.js +16 -0
  17. package/dist/commands/config-values.js.map +1 -1
  18. package/dist/commands/installation-variables.d.ts +26 -0
  19. package/dist/commands/installation-variables.d.ts.map +1 -0
  20. package/dist/commands/installation-variables.js +171 -0
  21. package/dist/commands/installation-variables.js.map +1 -0
  22. package/dist/commands/project-setup.d.ts.map +1 -1
  23. package/dist/commands/project-setup.js +2 -0
  24. package/dist/commands/project-setup.js.map +1 -1
  25. package/dist/commands/solutions-activity.d.ts +5 -0
  26. package/dist/commands/solutions-activity.d.ts.map +1 -0
  27. package/dist/commands/solutions-activity.js +116 -0
  28. package/dist/commands/solutions-activity.js.map +1 -0
  29. package/dist/commands/solutions-connections.d.ts +7 -0
  30. package/dist/commands/solutions-connections.d.ts.map +1 -0
  31. package/dist/commands/solutions-connections.js +88 -0
  32. package/dist/commands/solutions-connections.js.map +1 -0
  33. package/dist/commands/solutions-installation-options.d.ts +5 -0
  34. package/dist/commands/solutions-installation-options.d.ts.map +1 -0
  35. package/dist/commands/solutions-installation-options.js +52 -0
  36. package/dist/commands/solutions-installation-options.js.map +1 -0
  37. package/dist/commands/solutions-onboarding.d.ts +5 -0
  38. package/dist/commands/solutions-onboarding.d.ts.map +1 -0
  39. package/dist/commands/solutions-onboarding.js +113 -0
  40. package/dist/commands/solutions-onboarding.js.map +1 -0
  41. package/dist/commands/solutions-ops.d.ts.map +1 -1
  42. package/dist/commands/solutions-ops.js +278 -17
  43. package/dist/commands/solutions-ops.js.map +1 -1
  44. package/dist/first-run.d.ts.map +1 -1
  45. package/dist/first-run.js +2 -0
  46. package/dist/first-run.js.map +1 -1
  47. package/dist/index.d.ts +1 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +1 -1
  50. package/dist/index.js.map +1 -1
  51. package/node_modules/@noodle-borg/admission-limits/dist/counter-store.d.ts +21 -2
  52. package/node_modules/@noodle-borg/admission-limits/dist/counter-store.js +10 -1
  53. package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.d.ts +5 -1
  54. package/node_modules/@noodle-borg/admission-limits/dist/in-memory-counter-store.js +31 -2
  55. package/node_modules/@noodle-borg/admission-limits/dist/portable.d.ts +3 -0
  56. package/node_modules/@noodle-borg/admission-limits/dist/portable.js +3 -0
  57. package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.d.ts +28 -0
  58. package/node_modules/@noodle-borg/admission-limits/dist/public-admission-assertion.js +124 -0
  59. package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.d.ts +54 -0
  60. package/node_modules/@noodle-borg/admission-limits/dist/public-record-admission.js +74 -0
  61. package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.d.ts +11 -0
  62. package/node_modules/@noodle-borg/admission-limits/dist/request-attribution.js +19 -0
  63. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +2 -0
  64. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +5 -5
  65. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +3 -0
  66. package/node_modules/@noodle-borg/agent-kit/dist/index.d.ts +1 -0
  67. package/node_modules/@noodle-borg/agent-kit/dist/index.js +1 -0
  68. package/node_modules/@noodle-borg/agent-kit/dist/plugin-bootstrap-skill.js +10 -0
  69. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +15 -3
  70. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +1 -1
  71. package/node_modules/@noodle-borg/agent-kit/dist/welcome-wordmark.d.ts +3 -0
  72. package/node_modules/@noodle-borg/agent-kit/dist/welcome-wordmark.js +10 -0
  73. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  74. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.d.ts +9 -1
  75. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.js +33 -2
  76. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.d.ts +3 -0
  77. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-execution-bound.js +29 -0
  78. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.d.ts +5 -3
  79. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interaction-state.js +21 -10
  80. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.d.ts +1 -1
  81. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.js +3 -3
  82. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.d.ts +1 -0
  83. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.js +1 -0
  84. package/node_modules/@noodle-borg/assistant-gateway/dist/session-target.js +5 -4
  85. package/node_modules/@noodle-borg/assistant-gateway/package.json +1 -1
  86. package/node_modules/@noodle-borg/authoring/dist/config.d.ts +20 -0
  87. package/node_modules/@noodle-borg/authoring/dist/config.js +29 -2
  88. package/node_modules/@noodle-borg/authoring/dist/connectors.d.ts +6 -1
  89. package/node_modules/@noodle-borg/authoring/dist/connectors.js +5 -0
  90. package/node_modules/@noodle-borg/authoring/dist/index.d.ts +2 -2
  91. package/node_modules/@noodle-borg/authoring/dist/json-schema.d.ts +1 -1
  92. package/node_modules/@noodle-borg/authoring/dist/json-schema.js +15 -2
  93. package/node_modules/@noodle-borg/authoring/dist/load-authored.js +1 -1
  94. package/node_modules/@noodle-borg/authoring/dist/managed-collection.d.ts +18 -4
  95. package/node_modules/@noodle-borg/authoring/dist/managed-collection.js +22 -3
  96. package/node_modules/@noodle-borg/authoring/dist/platform.d.ts +3 -0
  97. package/node_modules/@noodle-borg/authoring/dist/platform.js +4 -0
  98. package/node_modules/@noodle-borg/authoring/dist/server-presentation.js +43 -0
  99. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +3 -1
  100. package/node_modules/@noodle-borg/authoring/dist/server.js +4 -44
  101. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-billing.js +18 -0
  102. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-config.js +31 -4
  103. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-solutions.js +778 -0
  104. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-tenant-resources.js +0 -241
  105. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-types.js +7 -0
  106. package/node_modules/@noodle-borg/cli-catalog/dist/index.js +20 -0
  107. package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +2 -1
  108. package/node_modules/@noodle-borg/compiler/dist/artifact/catalog-emission.js +3 -1
  109. package/node_modules/@noodle-borg/compiler/dist/artifact/config.js +3 -0
  110. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +17 -1
  111. package/node_modules/@noodle-borg/compiler/dist/artifact/version.d.ts +6 -1
  112. package/node_modules/@noodle-borg/compiler/dist/artifact/version.js +6 -1
  113. package/node_modules/@noodle-borg/compiler/dist/business-variables.d.ts +27 -0
  114. package/node_modules/@noodle-borg/compiler/dist/business-variables.js +230 -0
  115. package/node_modules/@noodle-borg/compiler/dist/compile.js +7 -1
  116. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +1 -1
  117. package/node_modules/@noodle-borg/compiler/dist/index.d.ts +3 -0
  118. package/node_modules/@noodle-borg/compiler/dist/index.js +3 -0
  119. package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.d.ts +52 -0
  120. package/node_modules/@noodle-borg/compiler/dist/managed-collection-controls.js +92 -0
  121. package/node_modules/@noodle-borg/compiler/dist/managed-collections.d.ts +26 -1
  122. package/node_modules/@noodle-borg/compiler/dist/managed-collections.js +190 -1
  123. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +100 -36
  124. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +2 -0
  125. package/node_modules/@noodle-borg/compiler/dist/native-record-operations.d.ts +7 -0
  126. package/node_modules/@noodle-borg/compiler/dist/native-record-operations.js +59 -0
  127. package/node_modules/@noodle-borg/connector-defs/dist/compile-http.js +83 -8
  128. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts +31 -1
  129. package/node_modules/@noodle-borg/connector-defs/dist/schema.js +16 -0
  130. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +12 -3
  131. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +41 -2
  132. package/node_modules/@noodle-borg/connector-http/dist/http-response.js +3 -2
  133. package/node_modules/@noodle-borg/connector-http/dist/mcp/config.js +1 -1
  134. package/node_modules/@noodle-borg/connector-http/dist/url-resolution.js +1 -1
  135. package/node_modules/@noodle-borg/control-plane/dist/contracts.d.ts +4 -1
  136. package/node_modules/@noodle-borg/control-plane/dist/deploy-gates.js +1 -0
  137. package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.d.ts +3 -0
  138. package/node_modules/@noodle-borg/control-plane/dist/in-memory-organization-store.js +11 -0
  139. package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.d.ts +45 -0
  140. package/node_modules/@noodle-borg/control-plane/dist/organization-agreements.js +74 -0
  141. package/node_modules/@noodle-borg/control-plane/dist/portable.d.ts +1 -0
  142. package/node_modules/@noodle-borg/control-plane/dist/portable.js +1 -0
  143. package/node_modules/@noodle-borg/module/dist/contract.d.ts +22 -0
  144. package/node_modules/@noodle-borg/module/dist/platform-human-identity.d.ts +2 -0
  145. package/node_modules/@noodle-borg/protocol/dist/request-deps.js +1 -0
  146. package/node_modules/@noodle-borg/protocol/dist/request-state.d.ts +1 -0
  147. package/node_modules/@noodle-borg/protocol/dist/request-state.js +11 -2
  148. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts +2 -0
  149. package/node_modules/@noodle-borg/protocol/dist/v2/input-required.js +2 -1
  150. package/node_modules/@noodle-borg/protocol/dist/v2/server.js +2 -1
  151. package/node_modules/@noodle-borg/runtime/dist/ambient-context.js +6 -1
  152. package/node_modules/@noodle-borg/runtime/dist/broker/types.d.ts +2 -0
  153. package/node_modules/@noodle-borg/runtime/dist/business-variables.d.ts +15 -0
  154. package/node_modules/@noodle-borg/runtime/dist/business-variables.js +75 -0
  155. package/node_modules/@noodle-borg/runtime/dist/confirmation-continuation.js +2 -1
  156. package/node_modules/@noodle-borg/runtime/dist/confirmation.js +23 -3
  157. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +17 -1
  158. package/node_modules/@noodle-borg/runtime/dist/connector-snapshot.js +6 -0
  159. package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +18 -3
  160. package/node_modules/@noodle-borg/runtime/dist/execute.js +13 -3
  161. package/node_modules/@noodle-borg/runtime/dist/index.d.ts +2 -0
  162. package/node_modules/@noodle-borg/runtime/dist/index.js +1 -0
  163. package/node_modules/@noodle-borg/runtime/dist/interactive.js +11 -0
  164. package/node_modules/@noodle-borg/runtime/dist/managed-origins.d.ts +3 -1
  165. package/node_modules/@noodle-borg/runtime/dist/managed-origins.js +32 -7
  166. package/node_modules/@noodle-borg/runtime/dist/operation-credential.js +6 -0
  167. package/node_modules/@noodle-borg/runtime/dist/operation-evidence.d.ts +30 -0
  168. package/node_modules/@noodle-borg/runtime/dist/operation-evidence.js +68 -0
  169. package/node_modules/@noodle-borg/runtime/dist/operation-execution.d.ts +2 -2
  170. package/node_modules/@noodle-borg/runtime/dist/operation-execution.js +142 -71
  171. package/node_modules/@noodle-borg/runtime/dist/result.d.ts +6 -4
  172. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.d.ts +7 -0
  173. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.js +48 -4
  174. package/node_modules/@noodle-borg/service/dist/admission.js +2 -1
  175. package/node_modules/@noodle-borg/service/dist/application-activity.js +236 -0
  176. package/node_modules/@noodle-borg/service/dist/application-business-notice.js +28 -0
  177. package/node_modules/@noodle-borg/service/dist/application-runtime-target.js +141 -0
  178. package/node_modules/@noodle-borg/service/dist/application-settings-targets.js +72 -0
  179. package/node_modules/@noodle-borg/service/dist/application-settings.js +210 -0
  180. package/node_modules/@noodle-borg/service/dist/business-api-admission.js +121 -0
  181. package/node_modules/@noodle-borg/service/dist/business-information/activity-pagination.js +73 -0
  182. package/node_modules/@noodle-borg/service/dist/business-information/business-notice.d.ts +24 -0
  183. package/node_modules/@noodle-borg/service/dist/business-information/business-notice.js +18 -0
  184. package/node_modules/@noodle-borg/service/dist/business-information/collection-controls.js +51 -0
  185. package/node_modules/@noodle-borg/service/dist/business-information/contracts.d.ts +439 -0
  186. package/node_modules/@noodle-borg/service/dist/business-information/definition-resolver.js +94 -0
  187. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-installation-lifecycle.js +136 -0
  188. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-invitations.js +160 -0
  189. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-locks.js +23 -0
  190. package/node_modules/@noodle-borg/service/dist/business-information/in-memory-store.js +287 -132
  191. package/node_modules/@noodle-borg/service/dist/business-information/installation-capacity.js +10 -0
  192. package/node_modules/@noodle-borg/service/dist/business-information/invitations.js +68 -0
  193. package/node_modules/@noodle-borg/service/dist/business-information/legacy-request-migration.js +60 -0
  194. package/node_modules/@noodle-borg/service/dist/business-information/managed-releases.js +245 -0
  195. package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-blueprints.js +51 -0
  196. package/node_modules/@noodle-borg/service/dist/business-information/managed-solution-executable.js +76 -0
  197. package/node_modules/@noodle-borg/service/dist/business-information/model.js +124 -23
  198. package/node_modules/@noodle-borg/service/dist/business-information/native-query.js +162 -0
  199. package/node_modules/@noodle-borg/service/dist/business-information/native-storage-budget.js +60 -0
  200. package/node_modules/@noodle-borg/service/dist/business-information/pagination.js +28 -0
  201. package/node_modules/@noodle-borg/service/dist/business-information/portable.js +9 -0
  202. package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.d.ts +11 -0
  203. package/node_modules/@noodle-borg/service/dist/business-information/principal-authority.js +42 -0
  204. package/node_modules/@noodle-borg/service/dist/business-information/profiles.js +137 -6
  205. package/node_modules/@noodle-borg/service/dist/business-information/reader-floor.js +26 -0
  206. package/node_modules/@noodle-borg/service/dist/business-information/source-credential-fence.js +79 -0
  207. package/node_modules/@noodle-borg/service/dist/business-information/source-custody-budget.js +30 -0
  208. package/node_modules/@noodle-borg/service/dist/business-information/source-custody-memory.js +122 -0
  209. package/node_modules/@noodle-borg/service/dist/business-information/source-executor.js +191 -0
  210. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-contracts.js +2 -0
  211. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-coordinator.js +136 -0
  212. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-failures.js +32 -0
  213. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-state.js +154 -0
  214. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-store.js +568 -0
  215. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-types.js +26 -0
  216. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-memory-values.js +59 -0
  217. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-pagination.js +54 -0
  218. package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-validation.js +163 -0
  219. package/node_modules/@noodle-borg/service/dist/business-information/source-refresh-retention.js +29 -0
  220. package/node_modules/@noodle-borg/service/dist/business-information-runtime.js +80 -0
  221. package/node_modules/@noodle-borg/service/dist/business-onboarding.js +73 -0
  222. package/node_modules/@noodle-borg/service/dist/connections/types.js +8 -0
  223. package/node_modules/@noodle-borg/service/dist/credential-binding-index.js +38 -33
  224. package/node_modules/@noodle-borg/service/dist/deployment-execution.js +275 -0
  225. package/node_modules/@noodle-borg/service/dist/external-credential-binding-broker.js +19 -1
  226. package/node_modules/@noodle-borg/service/dist/external-credential-exchange.d.ts +16 -1
  227. package/node_modules/@noodle-borg/service/dist/modules/host.js +4 -1
  228. package/node_modules/@noodle-borg/service/dist/native-record-connector.d.ts +20 -0
  229. package/node_modules/@noodle-borg/service/dist/native-record-connector.js +206 -0
  230. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts +3 -0
  231. package/node_modules/@noodle-borg/service/dist/operation-evidence.js +89 -0
  232. package/node_modules/@noodle-borg/service/dist/recovery-quarantine.js +49 -0
  233. package/node_modules/@noodle-borg/service/dist/registry-compile.js +60 -11
  234. package/node_modules/@noodle-borg/service/dist/registry-deploy-transaction.js +18 -0
  235. package/node_modules/@noodle-borg/service/dist/registry-rollback.js +2 -1
  236. package/node_modules/@noodle-borg/service/dist/registry-state.d.ts +1 -1
  237. package/node_modules/@noodle-borg/service/dist/registry-state.js +6 -3
  238. package/node_modules/@noodle-borg/service/dist/registry-targets.js +49 -0
  239. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +2 -0
  240. package/node_modules/@noodle-borg/service/dist/registry.d.ts +15 -3
  241. package/node_modules/@noodle-borg/service/dist/registry.js +177 -137
  242. package/node_modules/@noodle-borg/service/dist/routes/assistant-appearance.js +3 -2
  243. package/node_modules/@noodle-borg/service/dist/routes/assistant-clients.js +2 -1
  244. package/node_modules/@noodle-borg/service/dist/routes/assistant-doctor.js +2 -1
  245. package/node_modules/@noodle-borg/service/dist/routes/assistant-embeds.js +8 -3
  246. package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.js +1 -1
  247. package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +48 -36
  248. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-configuration.js +3 -2
  249. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-session.js +10 -10
  250. package/node_modules/@noodle-borg/service/dist/routes/assistant-session-target.js +32 -3
  251. package/node_modules/@noodle-borg/service/dist/routes/assistant-suggestions.js +1 -1
  252. package/node_modules/@noodle-borg/service/dist/routes/assistant-transcript.js +1 -1
  253. package/node_modules/@noodle-borg/service/dist/routes/assistant.js +10 -10
  254. package/node_modules/@noodle-borg/service/dist/routes/business-information-activity.js +83 -0
  255. package/node_modules/@noodle-borg/service/dist/routes/business-information-admission.js +26 -0
  256. package/node_modules/@noodle-borg/service/dist/routes/business-information-channels.js +153 -0
  257. package/node_modules/@noodle-borg/service/dist/routes/business-information-connections.js +107 -0
  258. package/node_modules/@noodle-borg/service/dist/routes/business-information-dispatch.js +87 -4
  259. package/node_modules/@noodle-borg/service/dist/routes/business-information-external.js +79 -0
  260. package/node_modules/@noodle-borg/service/dist/routes/business-information-installation.js +24 -0
  261. package/node_modules/@noodle-borg/service/dist/routes/business-information-notice.js +69 -0
  262. package/node_modules/@noodle-borg/service/dist/routes/business-information-onboarding.js +58 -0
  263. package/node_modules/@noodle-borg/service/dist/routes/business-information-paths.js +76 -0
  264. package/node_modules/@noodle-borg/service/dist/routes/business-information-public.js +151 -0
  265. package/node_modules/@noodle-borg/service/dist/routes/business-information-reader-floor.js +15 -0
  266. package/node_modules/@noodle-borg/service/dist/routes/business-information-record-create.js +29 -0
  267. package/node_modules/@noodle-borg/service/dist/routes/business-information-record-reads.js +36 -0
  268. package/node_modules/@noodle-borg/service/dist/routes/business-information-request.js +64 -0
  269. package/node_modules/@noodle-borg/service/dist/routes/business-information-settings.js +64 -0
  270. package/node_modules/@noodle-borg/service/dist/routes/business-information-source.js +249 -0
  271. package/node_modules/@noodle-borg/service/dist/routes/business-information-staff.js +258 -0
  272. package/node_modules/@noodle-borg/service/dist/routes/business-information-wire.js +226 -26
  273. package/node_modules/@noodle-borg/service/dist/routes/business-information.js +238 -197
  274. package/node_modules/@noodle-borg/service/dist/routes/config-values-dispatch.js +1 -1
  275. package/node_modules/@noodle-borg/service/dist/routes/config-values.js +26 -4
  276. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +33 -234
  277. package/node_modules/@noodle-borg/service/dist/routes/deployment-activation-response.js +13 -4
  278. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +4 -0
  279. package/node_modules/@noodle-borg/service/dist/service.js +57 -11
  280. package/node_modules/@noodle-borg/service/dist/solution-installation-activation.js +149 -0
  281. package/node_modules/@noodle-borg/service/dist/source-configuration-authority.js +94 -0
  282. package/node_modules/@noodle-borg/service/dist/state-catalog.js +6 -5
  283. package/node_modules/@noodle-borg/service/dist/store/config-values.d.ts +42 -17
  284. package/node_modules/@noodle-borg/service/dist/store/config-values.js +123 -24
  285. package/node_modules/@noodle-borg/service/dist/store/in-memory.d.ts +1 -0
  286. package/node_modules/@noodle-borg/service/dist/store/in-memory.js +3 -0
  287. package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +1 -0
  288. package/node_modules/@noodle-borg/service/dist/store/json-file.js +3 -0
  289. package/node_modules/@noodle-borg/service/dist/store.d.ts +3 -1
  290. package/node_modules/@noodle-borg/service/package.json +2 -2
  291. package/node_modules/@noodle-borg/transport-http/dist/serve-request.js +9 -0
  292. package/node_modules/@noodle-borg/transport-http/package.json +1 -0
  293. package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.d.ts +143 -0
  294. package/node_modules/@noodle-borg/wire-contracts/dist/application-activity.js +90 -0
  295. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.d.ts +130 -0
  296. package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.js +77 -0
  297. package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.d.ts +105 -0
  298. package/node_modules/@noodle-borg/wire-contracts/dist/application-connections.js +67 -0
  299. package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.d.ts +27 -0
  300. package/node_modules/@noodle-borg/wire-contracts/dist/application-onboarding.js +28 -0
  301. package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.d.ts +112 -0
  302. package/node_modules/@noodle-borg/wire-contracts/dist/application-settings.js +88 -0
  303. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts +1 -1
  304. package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.d.ts +62 -0
  305. package/node_modules/@noodle-borg/wire-contracts/dist/billing-catalog.js +57 -0
  306. package/node_modules/@noodle-borg/wire-contracts/dist/billing-enforcement.d.ts +12 -12
  307. package/node_modules/@noodle-borg/wire-contracts/dist/billing-metering.d.ts +4 -4
  308. package/node_modules/@noodle-borg/wire-contracts/dist/billing-org-transfer.d.ts +3 -3
  309. package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.d.ts +25 -0
  310. package/node_modules/@noodle-borg/wire-contracts/dist/business-information-query.js +37 -0
  311. package/node_modules/@noodle-borg/wire-contracts/dist/business-information.d.ts +1816 -158
  312. package/node_modules/@noodle-borg/wire-contracts/dist/business-information.js +416 -41
  313. package/node_modules/@noodle-borg/wire-contracts/dist/control-plane.d.ts +2 -2
  314. package/node_modules/@noodle-borg/wire-contracts/dist/distribution.d.ts +5 -5
  315. package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +8 -0
  316. package/node_modules/@noodle-borg/wire-contracts/dist/index.js +8 -0
  317. package/node_modules/@noodle-borg/wire-contracts/dist/knowledge.d.ts +3 -3
  318. package/node_modules/@noodle-borg/wire-contracts/dist/managed-assistant-sponsorship.d.ts +7 -7
  319. package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.d.ts +5 -0
  320. package/node_modules/@noodle-borg/wire-contracts/dist/platform-account-reset.js +1 -0
  321. package/node_modules/@noodle-borg/wire-contracts/dist/platform-auth.d.ts +66 -66
  322. package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.d.ts +143 -0
  323. package/node_modules/@noodle-borg/wire-contracts/dist/solution-onboarding.js +94 -0
  324. package/node_modules/@noodleseed/assistant/README.md +5 -0
  325. package/node_modules/@noodleseed/assistant/package.json +1 -1
  326. package/package.json +2 -2
@@ -1,3 +1,4 @@
1
+ import { resolveVariableEnvironment, validateVariableContinuation } from './business-variables.js';
1
2
  import { preflightFulfilmentCustomerRoutes } from './customer-routing.js';
2
3
  import { validateElicitationContent } from './elicitation-response.js';
3
4
  import { ExpressionEvalError, evaluateCondition } from './eval/evaluate.js';
@@ -13,6 +14,10 @@ export async function executeToolInteractive(artifact, toolName, input, deps) {
13
14
  const tool = artifact.tools.find((candidate) => candidate.name === toolName);
14
15
  if (!tool)
15
16
  return interactiveFail('unknown_tool', `no tool named "${toolName}"`);
17
+ const variables = resolveVariableEnvironment(artifact.server.variables ?? [], await resolveEnv(deps), toolName);
18
+ if (!variables.ok)
19
+ return { status: 'failed', error: variables.error };
20
+ deps = { ...deps, env: variables.env };
16
21
  if (tool.fulfilment.kind !== 'flow' || !tool.fulfilment.steps.some((s) => s.kind === 'elicit')) {
17
22
  return toInteractive(await runFulfilment(tool.fulfilment, input, toolName, deps, deps.beforeDispatch));
18
23
  }
@@ -32,6 +37,12 @@ export async function resumeTool(artifact, continuation, response, deps) {
32
37
  }
33
38
  if (response.action !== 'accept')
34
39
  return { status: 'stopped', action: response.action };
40
+ if ((artifact.server.variables?.length ?? 0) > 0) {
41
+ const variables = resolveVariableEnvironment(artifact.server.variables ?? [], await resolveEnv(deps), continuation.toolName);
42
+ const configurationError = validateVariableContinuation(artifact, continuation.env, variables);
43
+ if (configurationError)
44
+ return { status: 'failed', error: configurationError };
45
+ }
35
46
  const validated = validateElicitationContent(response.content ?? {}, continuation.pending.requestedSchema, `steps.${continuation.pending.id}`);
36
47
  if (!validated.ok)
37
48
  return { status: 'failed', error: validated.error };
@@ -11,6 +11,8 @@ export type ManagedOriginResolutionResult = {
11
11
  readonly errors: readonly ManagedOriginError[];
12
12
  };
13
13
  /** Bind operator-owned exact origins into every runtime authority and host projection. */
14
- export declare function resolveManagedOrigins(artifact: RuntimeArtifact, variables: Readonly<Record<string, string>>): ManagedOriginResolutionResult;
14
+ export declare function resolveManagedOrigins(artifact: RuntimeArtifact, variables: Readonly<Record<string, unknown>>, options?: {
15
+ readonly allowUnconfiguredPortal?: boolean;
16
+ }): ManagedOriginResolutionResult;
15
17
  export {};
16
18
  //# sourceMappingURL=managed-origins.d.ts.map
@@ -1,9 +1,10 @@
1
+ import { resolveVariableEnvironment } from './business-variables.js';
1
2
  const MANAGED_ORIGIN = /^\$\{env\.([A-Za-z0-9_]+)\}$/;
2
3
  /** Bind operator-owned exact origins into every runtime authority and host projection. */
3
- export function resolveManagedOrigins(artifact, variables) {
4
+ export function resolveManagedOrigins(artifact, variables, options = {}) {
4
5
  const errors = [];
5
6
  const replacements = new Map();
6
- const resolveList = (values, path, allowLoopback) => values.map((value, index) => resolveManagedOrigin(value, variables, `${path}.${index}`, allowLoopback, replacements, errors));
7
+ const resolveList = (values, path, allowLoopback) => values.flatMap((value, index) => resolveManagedOrigin(value, variables, `${path}.${index}`, allowLoopback, replacements, errors, artifact.server.variables?.find((declaration) => declaration.name === MANAGED_ORIGIN.exec(value)?.[1]), options.allowUnconfiguredPortal === true));
7
8
  const assistant = artifact.server.assistant;
8
9
  const resolvedAssistant = assistant === undefined
9
10
  ? undefined
@@ -26,6 +27,21 @@ export function resolveManagedOrigins(artifact, variables) {
26
27
  ...handoff,
27
28
  allowedDomains: resolveList(handoff.allowedDomains, 'handoff.allowedDomains', false),
28
29
  };
30
+ const owners = new Map();
31
+ resolvedAssistant?.surfaces?.forEach((surface, index) => {
32
+ for (const origin of surface.origins) {
33
+ const prior = owners.get(origin);
34
+ if (prior !== undefined && prior !== index)
35
+ errors.push({
36
+ code: 'invalid_shape',
37
+ path: `server.assistant.surfaces.${index}.origins`,
38
+ variableName: '',
39
+ reason: 'invalid',
40
+ message: 'Assistant surfaces must have distinct configured origins.',
41
+ });
42
+ owners.set(origin, index);
43
+ }
44
+ });
29
45
  if (errors.length > 0)
30
46
  return { ok: false, errors };
31
47
  return {
@@ -45,12 +61,17 @@ export function resolveManagedOrigins(artifact, variables) {
45
61
  },
46
62
  };
47
63
  }
48
- function resolveManagedOrigin(value, variables, path, allowLoopback, replacements, errors) {
64
+ function resolveManagedOrigin(value, variables, path, allowLoopback, replacements, errors, declaration, allowUnconfiguredPortal) {
49
65
  const match = MANAGED_ORIGIN.exec(value);
50
66
  if (match?.[1] === undefined)
51
67
  return value;
52
- const resolved = variables[match[1]];
53
- if (resolved === undefined) {
68
+ const decoded = declaration === undefined ? undefined : resolveVariableEnvironment([declaration], variables);
69
+ const resolved = decoded?.ok ? decoded.env[match[1]] : variables[match[1]];
70
+ if (resolved === undefined && decoded?.ok !== false) {
71
+ if (allowUnconfiguredPortal && declaration?.portal !== undefined) {
72
+ replacements.set(value, '');
73
+ return [];
74
+ }
54
75
  errors.push({
55
76
  code: 'invalid_shape',
56
77
  variableName: match[1],
@@ -60,7 +81,9 @@ function resolveManagedOrigin(value, variables, path, allowLoopback, replacement
60
81
  });
61
82
  return value;
62
83
  }
63
- if (!isCanonicalOrigin(resolved, allowLoopback)) {
84
+ if (decoded?.ok === false ||
85
+ typeof resolved !== 'string' ||
86
+ !isCanonicalOrigin(resolved, allowLoopback)) {
64
87
  errors.push({
65
88
  code: 'invalid_shape',
66
89
  variableName: match[1],
@@ -94,7 +117,9 @@ function replaceValue(value, replacements) {
94
117
  if (typeof value === 'string')
95
118
  return replaceStrings(value, replacements);
96
119
  if (Array.isArray(value))
97
- return value.map((item) => replaceValue(item, replacements));
120
+ return value.flatMap((item) => typeof item === 'string' && replacements.get(item) === ''
121
+ ? []
122
+ : [replaceValue(item, replacements)]);
98
123
  if (value !== null && typeof value === 'object') {
99
124
  return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, replaceValue(item, replacements)]));
100
125
  }
@@ -7,6 +7,12 @@ export async function acquireOperationCredential(ref, deps, customerRoute) {
7
7
  connectorVersion: ref.connectorVersion,
8
8
  operation: ref.operation,
9
9
  ...(ref.credentialBinding ?? {}),
10
+ ...(ref.credentialBinding?.connectionId === undefined ||
11
+ deps.executionBinding?.connections[ref.credentialBinding.connectionId] === undefined
12
+ ? {}
13
+ : {
14
+ expectedConnectionGeneration: deps.executionBinding.connections[ref.credentialBinding.connectionId],
15
+ }),
10
16
  ...(deps.tenantId !== undefined ? { tenantId: deps.tenantId } : {}),
11
17
  ...(deps.deploymentId !== undefined ? { deploymentId: deps.deploymentId } : {}),
12
18
  ...(deps.caller !== undefined ? { caller: deps.caller } : {}),
@@ -0,0 +1,30 @@
1
+ import type { ResolvedOperationRef } from '@noodle-borg/compiler';
2
+ import type { CallerIdentity } from './connector/types.js';
3
+ import type { ExecutionResult } from './result.js';
4
+ /** Explicit connector evidence. A returned tool result alone does not prove a business task completed. */
5
+ export interface OperationEvidence {
6
+ readonly outcome: 'completed' | 'rejected' | 'accepted' | 'unknown' | 'returned';
7
+ /** Opaque provider resource/job reference; protected by the service, never an authorization grant. */
8
+ readonly reference?: string;
9
+ }
10
+ export interface OperationEvidenceIntent {
11
+ readonly id: string;
12
+ readonly tool: string;
13
+ readonly operation: ResolvedOperationRef;
14
+ readonly arguments: Readonly<Record<string, unknown>>;
15
+ readonly executionRevision?: string;
16
+ readonly executionBoundMs?: number;
17
+ readonly caller?: CallerIdentity;
18
+ }
19
+ /** Hosting-owned durable intent/evidence authority. No provider transport or business-record custody. */
20
+ export interface OperationEvidencePort {
21
+ /** Atomically claims an original invocation before I/O; undefined means it was already spent. */
22
+ begin(intent: OperationEvidenceIntent): Promise<{
23
+ finish(evidence: OperationEvidence): Promise<void>;
24
+ } | undefined>;
25
+ }
26
+ /** Shared by every connector action, including nested calls; persistence failure cannot enable I/O. */
27
+ export declare function withOperationEvidence(port: OperationEvidencePort | undefined, intent: OperationEvidenceIntent, work: (report: (evidence: OperationEvidence) => void) => Promise<ExecutionResult>): Promise<ExecutionResult>;
28
+ /** Invalid or credential-like reference mappings never become success evidence or retained payloads. */
29
+ export declare function safeOperationEvidence(value: OperationEvidence): OperationEvidence;
30
+ //# sourceMappingURL=operation-evidence.d.ts.map
@@ -0,0 +1,68 @@
1
+ /** Shared by every connector action, including nested calls; persistence failure cannot enable I/O. */
2
+ export async function withOperationEvidence(port, intent, work) {
3
+ let claimed;
4
+ try {
5
+ claimed = await port?.begin(intent);
6
+ }
7
+ catch {
8
+ return {
9
+ ok: false,
10
+ error: {
11
+ code: 'execution_admission_error',
12
+ message: 'Operation evidence unavailable; no action dispatched.',
13
+ },
14
+ };
15
+ }
16
+ if (port && !claimed)
17
+ return {
18
+ ok: false,
19
+ error: {
20
+ code: 'duplicate_execution_suppressed',
21
+ message: 'This operation was already dispatched. Verify its original outcome before making a new request.',
22
+ },
23
+ };
24
+ let evidence;
25
+ let result;
26
+ try {
27
+ result = await work((value) => {
28
+ evidence = safeOperationEvidence(value);
29
+ });
30
+ }
31
+ catch {
32
+ result = {
33
+ ok: false,
34
+ error: {
35
+ code: 'connector_error',
36
+ reason: 'operation_outcome_unknown',
37
+ message: 'Operation outcome is unknown; verify the original effect before trying again.',
38
+ },
39
+ };
40
+ }
41
+ try {
42
+ await claimed?.finish(evidence ?? { outcome: result.ok ? 'returned' : 'unknown' });
43
+ }
44
+ catch {
45
+ return {
46
+ ok: false,
47
+ error: {
48
+ code: 'connector_error',
49
+ reason: 'operation_outcome_unknown',
50
+ message: 'Operation outcome could not be recorded. Do not repeat the write; verify its original outcome.',
51
+ },
52
+ };
53
+ }
54
+ return result;
55
+ }
56
+ /** Invalid or credential-like reference mappings never become success evidence or retained payloads. */
57
+ export function safeOperationEvidence(value) {
58
+ if (!['completed', 'rejected', 'accepted', 'unknown', 'returned'].includes(value.outcome))
59
+ return { outcome: 'unknown' };
60
+ if (value.reference !== undefined &&
61
+ (!/^[A-Za-z0-9._:@/-]{1,256}$/.test(value.reference) || value.reference.includes('://')))
62
+ return { outcome: 'unknown' };
63
+ return Object.freeze({
64
+ outcome: value.outcome,
65
+ ...(value.reference === undefined ? {} : { reference: value.reference }),
66
+ });
67
+ }
68
+ //# sourceMappingURL=operation-evidence.js.map
@@ -13,7 +13,7 @@ import { type ToolDispatchHook } from './tool-dispatch.js';
13
13
  /** @internal Shared with the suspension-aware flow executor. */
14
14
  export declare function runOperation(ref: ResolvedOperationRef | {
15
15
  resolved: false;
16
- }, argsAst: ExprMap, scope: EvalScope, toolName: string, deps: ExecuteDeps, policy: PolicyGate, host: ConnectorCallHost, env: Record<string, string>, argsPath: string, outputPath: string, reviewedAction?: PreparedOperationAction, beforeDispatch?: ToolDispatchHook): Promise<ExecutionResult>;
16
+ }, argsAst: ExprMap, scope: EvalScope, toolName: string, deps: ExecuteDeps, policy: PolicyGate, host: ConnectorCallHost, env: Record<string, unknown>, argsPath: string, outputPath: string, reviewedAction?: PreparedOperationAction, beforeDispatch?: ToolDispatchHook): Promise<ExecutionResult>;
17
17
  type PreparedOperationActionResult = {
18
18
  readonly ok: true;
19
19
  readonly action: PreparedOperationAction;
@@ -28,7 +28,7 @@ export declare function prepareOperationAction(ref: ResolvedOperationRef | {
28
28
  resolved: false;
29
29
  }, argsAst: ExprMap, scope: EvalScope, deps: ExecuteDeps, argsPath: string, additionalOperationCount?: number): PreparedOperationActionResult;
30
30
  /** @internal Shared with the suspension-aware flow executor. */
31
- export declare function createHost(toolName: string, deps: ExecuteDeps, policy: PolicyGate, env: Record<string, string>, callStack: string[], beforeDispatch?: ToolDispatchHook): ConnectorCallHost;
31
+ export declare function createHost(toolName: string, deps: ExecuteDeps, policy: PolicyGate, env: Record<string, unknown>, callStack: string[], beforeDispatch?: ToolDispatchHook): ConnectorCallHost;
32
32
  export declare function fail(code: ExecutionError['code'], message: string, pathOrDetails?: string | Pick<ExecutionError, 'reason' | 'fix' | 'next' | 'connector'>): ExecutionResult;
33
33
  export {};
34
34
  //# sourceMappingURL=operation-execution.d.ts.map
@@ -1,13 +1,15 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
1
2
  import { sanitizeConnectorFailureDetails } from './connector/failure-details.js';
2
3
  import { isConnectorInvocationError } from './connector/types.js';
3
4
  import { preflightOperationCustomerRoutes, resolveCustomerActionRouteBindings, resolveCustomerConnectorRoute, } from './customer-routing.js';
4
5
  import { ExpressionEvalError } from './eval/evaluate.js';
5
6
  import { acquireOperationCredential } from './operation-credential.js';
7
+ import { withOperationEvidence } from './operation-evidence.js';
6
8
  import { checkSignature, evalExprMap, validateAgainstSchema } from './operation-validation.js';
7
9
  import { samePreparedAction } from './prepared-action-match.js';
8
10
  import { splitResultMeta } from './result-meta.js';
9
11
  import { cloneRoutedOutput } from './routed-output-guard.js';
10
- import { admitToolDispatch } from './tool-dispatch.js';
12
+ import { admitToolDispatch, admittedExecutionSignal, executionCancellation, } from './tool-dispatch.js';
11
13
  /**
12
14
  * Run one connector operation end to end: resolve the connector, verify the signature has not
13
15
  * drifted, gate with policy, evaluate + validate arguments, mint a downstream credential, invoke,
@@ -111,11 +113,15 @@ export function prepareOperationAction(ref, argsAst, scope, deps, argsPath, addi
111
113
  * manifest operation steps and host-mediated sandbox calls.
112
114
  */
113
115
  async function invokeOperation(ref, args, sig, toolName, deps, policy, host, env, argsPath, outputPath, beforeDispatch) {
116
+ const initialCancellation = executionCancellation(deps.signal, beforeDispatch);
117
+ if (initialCancellation)
118
+ return { ok: false, error: initialCancellation };
114
119
  const callKey = operationKey(ref);
115
120
  if (hostCallStack(host).includes(callKey)) {
116
121
  return fail('circular_call_dependency', `circular connector operation call detected at ${callKey}`, outputPath);
117
122
  }
118
123
  hostCallStack(host).push(callKey);
124
+ let disposeSignal;
119
125
  try {
120
126
  const connector = deps.connectors.resolve(ref);
121
127
  if (!connector) {
@@ -143,6 +149,9 @@ async function invokeOperation(ref, args, sig, toolName, deps, policy, host, env
143
149
  }
144
150
  if (!decision.allow)
145
151
  return fail('policy_denied', decision.reason);
152
+ const cancellation = executionCancellation(deps.signal, beforeDispatch);
153
+ if (cancellation)
154
+ return { ok: false, error: cancellation };
146
155
  const acquired = await acquireOperationCredential(ref, deps, customerRoute);
147
156
  if (!acquired.ok)
148
157
  return { ok: false, error: acquired.error };
@@ -157,89 +166,133 @@ async function invokeOperation(ref, args, sig, toolName, deps, policy, host, env
157
166
  const admissionError = await admitToolDispatch(beforeDispatch, { toolName });
158
167
  if (admissionError !== null)
159
168
  return { ok: false, error: admissionError };
160
- let output;
161
- try {
162
- output = await connector.invoke({
163
- operation: ref.operation,
164
- args: connectorArgs,
165
- env,
166
- ...(deps.signal === undefined ? {} : { signal: deps.signal }),
167
- credential,
168
- ...(ref.credentialBinding === undefined
169
- ? {}
170
- : { credentialPresentation: ref.credentialBinding.presentation }),
171
- ...(deps.caller !== undefined ? { caller: deps.caller } : {}),
172
- ...(customerRoute === undefined ? {} : { route: customerRoute }),
173
- host,
174
- ...(deps.trace === undefined ? {} : { trace: deps.trace }),
175
- });
176
- }
177
- catch (error) {
178
- const hostCall = hostCallErrorSnapshot(error);
179
- if (hostCall !== undefined) {
180
- return fail(hostCall.code, hostCall.message, hostCall.path);
181
- }
182
- if (isConnectorInvocationError(error)) {
183
- const failureDetails = sanitizeConnectorFailureDetails(error, {
184
- includeResponseExcerpt: customerRoute === undefined,
185
- });
186
- deps.trace?.record({
187
- kind: 'connector',
188
- connectorId: ref.connectorId,
189
- connectorVersion: ref.connectorVersion,
169
+ const admitted = admittedExecutionSignal(deps.signal);
170
+ disposeSignal = admitted.dispose;
171
+ const execution = operationIdentity(host, deps, toolName, ref, argsPath);
172
+ const executionBoundMs = connector.executionBoundMs?.(ref.operation);
173
+ const deadline = executionBoundMs === undefined ? undefined : AbortSignal.timeout(executionBoundMs);
174
+ const signal = deadline === undefined
175
+ ? admitted.signal
176
+ : admitted.signal === undefined
177
+ ? deadline
178
+ : AbortSignal.any([deadline, admitted.signal]);
179
+ return await withOperationEvidence(sig.type === 'action' ? deps.operationEvidence : undefined, {
180
+ id: execution.id,
181
+ tool: toolName,
182
+ operation: ref,
183
+ arguments: connectorArgs,
184
+ ...(deps.caller === undefined ? {} : { caller: deps.caller }),
185
+ ...(deps.executionBinding === undefined
186
+ ? {}
187
+ : { executionRevision: deps.executionBinding.revision }),
188
+ ...(executionBoundMs === undefined ? {} : { executionBoundMs }),
189
+ }, async (reportOutcome) => {
190
+ let output;
191
+ try {
192
+ if (signal?.aborted)
193
+ return fail('execution_cancelled', 'Execution deadline elapsed before connector dispatch.');
194
+ output = await connector.invoke({
190
195
  operation: ref.operation,
191
- ...failureDetails,
196
+ execution,
197
+ reportOutcome,
198
+ ...(deps.publicAdmission === undefined
199
+ ? {}
200
+ : { publicAdmission: deps.publicAdmission }),
201
+ args: connectorArgs,
202
+ env,
203
+ ...(signal === undefined ? {} : { signal }),
204
+ credential,
205
+ acquireTransportCredential: async () => {
206
+ const { credentialBinding: _accountBinding, ...transportRef } = ref;
207
+ const transport = await acquireOperationCredential(transportRef, deps, customerRoute);
208
+ if (!transport.ok)
209
+ throw new Error('Independent transport credential unavailable');
210
+ return transport.credential;
211
+ },
212
+ ...(ref.credentialBinding === undefined
213
+ ? {}
214
+ : { credentialPresentation: ref.credentialBinding.presentation }),
215
+ ...(deps.caller !== undefined ? { caller: deps.caller } : {}),
216
+ ...(customerRoute === undefined ? {} : { route: customerRoute }),
217
+ host,
218
+ ...(deps.trace === undefined ? {} : { trace: deps.trace }),
192
219
  });
193
- // Attribution keeps the sanitized classification (never the excerpt) so analytics can name
194
- // the failing connector/operation/stage while the wire result stays generic (#1309).
195
- const status = statusClass(failureDetails.status);
220
+ }
221
+ catch (error) {
222
+ const hostCall = hostCallErrorSnapshot(error);
223
+ if (hostCall !== undefined) {
224
+ return fail(hostCall.code, hostCall.message, hostCall.path);
225
+ }
226
+ if (isConnectorInvocationError(error)) {
227
+ const failureDetails = sanitizeConnectorFailureDetails(error, {
228
+ includeResponseExcerpt: customerRoute === undefined,
229
+ });
230
+ deps.trace?.record({
231
+ kind: 'connector',
232
+ connectorId: ref.connectorId,
233
+ connectorVersion: ref.connectorVersion,
234
+ operation: ref.operation,
235
+ ...failureDetails,
236
+ });
237
+ // Attribution keeps the sanitized classification (never the excerpt) so analytics can name
238
+ // the failing connector/operation/stage while the wire result stays generic (#1309).
239
+ const status = statusClass(failureDetails.status);
240
+ const reason = failureDetails.status === 401 || failureDetails.status === 403
241
+ ? 'upstream_authentication_lost'
242
+ : failureDetails.category;
243
+ return fail('connector_error', `connector failed for operation "${ref.operation}"`, {
244
+ ...(reason === undefined ? {} : { reason }),
245
+ connector: {
246
+ connectorId: ref.connectorId,
247
+ connectorVersion: ref.connectorVersion,
248
+ operation: ref.operation,
249
+ ...(failureDetails.category === undefined
250
+ ? {}
251
+ : { category: failureDetails.category }),
252
+ ...(status === undefined ? {} : { statusClass: status }),
253
+ ...(failureDetails.attempts === undefined
254
+ ? {}
255
+ : { attempts: failureDetails.attempts }),
256
+ ...(failureDetails.retryable === undefined
257
+ ? {}
258
+ : { retryable: failureDetails.retryable }),
259
+ },
260
+ });
261
+ }
262
+ // Normalize connector failures; never surface backend internals or credentials.
196
263
  return fail('connector_error', `connector failed for operation "${ref.operation}"`, {
197
- ...(failureDetails.category === undefined ? {} : { reason: failureDetails.category }),
198
264
  connector: {
199
265
  connectorId: ref.connectorId,
200
266
  connectorVersion: ref.connectorVersion,
201
267
  operation: ref.operation,
202
- ...(failureDetails.category === undefined ? {} : { category: failureDetails.category }),
203
- ...(status === undefined ? {} : { statusClass: status }),
204
- ...(failureDetails.attempts === undefined ? {} : { attempts: failureDetails.attempts }),
205
- ...(failureDetails.retryable === undefined
206
- ? {}
207
- : { retryable: failureDetails.retryable }),
208
268
  },
209
269
  });
210
270
  }
211
- // Normalize connector failures; never surface backend internals or credentials.
212
- return fail('connector_error', `connector failed for operation "${ref.operation}"`, {
213
- connector: {
214
- connectorId: ref.connectorId,
215
- connectorVersion: ref.connectorVersion,
216
- operation: ref.operation,
217
- },
218
- });
219
- }
220
- if (customerRoute !== undefined) {
221
- const cloned = cloneRoutedOutput(output, customerRoute.baseUrl);
222
- if (!cloned.ok) {
223
- return fail('connector_error', `connector failed for operation "${ref.operation}"`);
271
+ if (customerRoute !== undefined) {
272
+ const cloned = cloneRoutedOutput(output, customerRoute.baseUrl);
273
+ if (!cloned.ok) {
274
+ return fail('connector_error', `connector failed for operation "${ref.operation}"`);
275
+ }
276
+ output = cloned.value;
224
277
  }
225
- output = cloned.value;
226
- }
227
- let redacted;
228
- try {
229
- redacted = await policy.after(context, output);
230
- }
231
- catch {
232
- return fail('policy_error', 'policy after hook failed');
233
- }
234
- // Projection metadata is a reserved runtime envelope, not part of the connector's visible output
235
- // contract. Validate the visible value deeply while preserving policy-processed metadata for the
236
- // flow/result projection channel.
237
- const outputError = validateAgainstSchema(splitResultMeta(redacted).visible, sig.output, outputPath, 'output_invalid', 'output field');
238
- if (outputError)
239
- return { ok: false, error: outputError };
240
- return { ok: true, output: redacted };
278
+ let redacted;
279
+ try {
280
+ redacted = await policy.after(context, output);
281
+ }
282
+ catch {
283
+ return fail('policy_error', 'policy after hook failed');
284
+ }
285
+ // Projection metadata is a reserved runtime envelope, not part of the connector's visible output
286
+ // contract. Validate the visible value deeply while preserving policy-processed metadata for the
287
+ // flow/result projection channel.
288
+ const outputError = validateAgainstSchema(splitResultMeta(redacted).visible, sig.output, outputPath, 'output_invalid', 'output field');
289
+ if (outputError)
290
+ return { ok: false, error: outputError };
291
+ return { ok: true, output: redacted };
292
+ });
241
293
  }
242
294
  finally {
295
+ disposeSignal?.();
243
296
  hostCallStack(host).pop();
244
297
  }
245
298
  }
@@ -247,6 +300,7 @@ async function invokeOperation(ref, args, sig, toolName, deps, policy, host, env
247
300
  export function createHost(toolName, deps, policy, env, callStack, beforeDispatch) {
248
301
  const host = {
249
302
  [CALL_STACK]: callStack,
303
+ [INVOCATION]: { id: deps.invocationId ?? randomUUID(), occurrences: new Map() },
250
304
  async callOperation(ref, args, path) {
251
305
  const connector = deps.connectors.resolve(ref);
252
306
  if (!connector)
@@ -269,6 +323,23 @@ export function createHost(toolName, deps, policy, env, callStack, beforeDispatc
269
323
  return host;
270
324
  }
271
325
  const CALL_STACK = Symbol('noodle.connectorCallStack');
326
+ const INVOCATION = Symbol('noodle.connectorInvocation');
327
+ function operationIdentity(host, deps, tool, ref, path) {
328
+ const invocation = host[INVOCATION];
329
+ const location = JSON.stringify([hostCallStack(host), path]);
330
+ const occurrence = invocation.occurrences.get(location) ?? 0;
331
+ invocation.occurrences.set(location, occurrence + 1);
332
+ const binding = [
333
+ invocation.id,
334
+ deps.tenantId,
335
+ deps.deploymentId,
336
+ tool,
337
+ operationKey(ref),
338
+ location,
339
+ occurrence,
340
+ ];
341
+ return Object.freeze({ id: createHash('sha256').update(JSON.stringify(binding)).digest('hex') });
342
+ }
272
343
  function operationKey(ref) {
273
344
  return JSON.stringify([ref.connectorId, ref.connectorVersion, ref.operation]);
274
345
  }
@@ -2,7 +2,7 @@ import type { CredentialProfile } from '@noodle-borg/compiler';
2
2
  import type { ConnectorFailureCategory } from './connector/types.js';
3
3
  import type { CustomerRouteBinding } from './customer-routing.js';
4
4
  /** Why a tool call could not be fulfilled. Protocol and embedded adapters map this internal contract. */
5
- export type ExecutionErrorCode = 'shape_only_artifact' | 'unknown_tool' | 'unknown_resource' | 'unknown_prompt' | 'unsupported_fulfilment' | 'connector_unavailable' | 'connector_route_unavailable' | 'credential_unavailable' | 'signature_drift' | 'policy_denied' | 'policy_error' | 'dispatch_denied' | 'usage_limit_exceeded' | 'duplicate_execution_suppressed' | 'execution_admission_error' | 'execution_cancelled' | 'arg_invalid' | 'invalid_continuation' | 'invalid_elicitation_flow' | 'invalid_confirmation_flow' | 'expression_error' | 'circular_call_dependency' | 'connector_error' | 'output_invalid';
5
+ export type ExecutionErrorCode = 'shape_only_artifact' | 'unknown_tool' | 'unknown_resource' | 'unknown_prompt' | 'configuration_required' | 'configuration_invalid' | 'configuration_changed' | 'unsupported_fulfilment' | 'connector_unavailable' | 'connector_route_unavailable' | 'credential_unavailable' | 'signature_drift' | 'policy_denied' | 'policy_error' | 'dispatch_denied' | 'usage_limit_exceeded' | 'duplicate_execution_suppressed' | 'execution_admission_error' | 'execution_cancelled' | 'arg_invalid' | 'invalid_continuation' | 'invalid_elicitation_flow' | 'invalid_confirmation_flow' | 'expression_error' | 'circular_call_dependency' | 'connector_error' | 'output_invalid';
6
6
  /**
7
7
  * Safe connector failure attribution for operator analytics (issue #1309): platform identifiers and
8
8
  * bounded classification only — never an upstream message, response body, credential, or exact URL.
@@ -72,7 +72,7 @@ export interface ToolContinuation {
72
72
  readonly nextStepIndex: number;
73
73
  readonly completedSteps: Readonly<Record<string, unknown>>;
74
74
  readonly resultMetas: readonly Readonly<Record<string, unknown>>[];
75
- readonly env: Readonly<Record<string, string>>;
75
+ readonly env: Readonly<Record<string, unknown>>;
76
76
  readonly pending: ElicitationRequest;
77
77
  }
78
78
  interface ContinuationArtifactIdentity {
@@ -94,7 +94,7 @@ export interface ToolPreparationContinuation {
94
94
  readonly nextStepIndex: number;
95
95
  readonly completedSteps: Readonly<Record<string, unknown>>;
96
96
  readonly elicited: Readonly<Record<string, unknown>>;
97
- readonly env: Readonly<Record<string, string>>;
97
+ readonly env: Readonly<Record<string, unknown>>;
98
98
  readonly pending: ElicitationRequest;
99
99
  }
100
100
  /**
@@ -103,6 +103,8 @@ export interface ToolPreparationContinuation {
103
103
  */
104
104
  export interface PreparedToolContinuation {
105
105
  readonly kind: 'prepared_confirmation';
106
+ /** Private hosting snapshot; never projected into a model-visible confirmation. */
107
+ readonly executionRevision?: string;
106
108
  readonly version: 1;
107
109
  readonly artifact: ContinuationArtifactIdentity;
108
110
  readonly toolName: string;
@@ -110,7 +112,7 @@ export interface PreparedToolContinuation {
110
112
  /** First flow step not evaluated during preparation; zero for a single-operation fulfilment. */
111
113
  readonly nextStepIndex: number;
112
114
  readonly completedSteps: Readonly<Record<string, unknown>>;
113
- readonly env: Readonly<Record<string, string>>;
115
+ readonly env: Readonly<Record<string, unknown>>;
114
116
  /** Exact first connector invocation approved by the user; absent for a pure flow. */
115
117
  readonly reviewedAction?: PreparedOperationAction;
116
118
  }
@@ -6,6 +6,13 @@ export interface ToolDispatchContext {
6
6
  }
7
7
  /** Called at connector boundaries and successful connector-free completion; latched once per logical call. */
8
8
  export type ToolDispatchHook = (context: ToolDispatchContext) => ToolDispatchDecision | Promise<ToolDispatchDecision>;
9
+ /** Client cancellation stops unadmitted work; a host execution deadline remains authoritative. */
10
+ export declare function executionCancellation(signal: AbortSignal | undefined, admission: ToolDispatchHook | undefined): ExecutionError | null;
11
+ /** After admission a client disconnect cannot cancel the effect, but a hard deadline still can. */
12
+ export declare function admittedExecutionSignal(parent: AbortSignal | undefined): {
13
+ readonly signal: AbortSignal | undefined;
14
+ dispose(): void;
15
+ };
9
16
  /** Latch cancellation and admission once for every logical protocol operation. */
10
17
  export declare function latchToolDispatchAdmission(hook: ToolDispatchHook | undefined, signal: AbortSignal | undefined): ToolDispatchHook | undefined;
11
18
  /** Apply a hook as a fail-closed runtime admission decision without exposing implementation errors. */