noodleseed-cli 0.1.4

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 (356) hide show
  1. package/LICENSE +176 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +625 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config.d.ts +52 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +77 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/control-plane.d.ts +33 -0
  11. package/dist/control-plane.d.ts.map +1 -0
  12. package/dist/control-plane.js +223 -0
  13. package/dist/control-plane.js.map +1 -0
  14. package/dist/deploy.d.ts +62 -0
  15. package/dist/deploy.d.ts.map +1 -0
  16. package/dist/deploy.js +182 -0
  17. package/dist/deploy.js.map +1 -0
  18. package/dist/dev.d.ts +50 -0
  19. package/dist/dev.d.ts.map +1 -0
  20. package/dist/dev.js +223 -0
  21. package/dist/dev.js.map +1 -0
  22. package/dist/index.d.ts +6 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +6 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/validate.d.ts +37 -0
  27. package/dist/validate.d.ts.map +1 -0
  28. package/dist/validate.js +46 -0
  29. package/dist/validate.js.map +1 -0
  30. package/node_modules/@noodle-borg/auth/dist/index.d.ts +14 -0
  31. package/node_modules/@noodle-borg/auth/dist/index.d.ts.map +1 -0
  32. package/node_modules/@noodle-borg/auth/dist/index.js +14 -0
  33. package/node_modules/@noodle-borg/auth/dist/index.js.map +1 -0
  34. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.d.ts +21 -0
  35. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.d.ts.map +1 -0
  36. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.js +24 -0
  37. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.js.map +1 -0
  38. package/node_modules/@noodle-borg/auth/dist/metadata.d.ts +27 -0
  39. package/node_modules/@noodle-borg/auth/dist/metadata.d.ts.map +1 -0
  40. package/node_modules/@noodle-borg/auth/dist/metadata.js +21 -0
  41. package/node_modules/@noodle-borg/auth/dist/metadata.js.map +1 -0
  42. package/node_modules/@noodle-borg/auth/dist/signer.d.ts +45 -0
  43. package/node_modules/@noodle-borg/auth/dist/signer.d.ts.map +1 -0
  44. package/node_modules/@noodle-borg/auth/dist/signer.js +47 -0
  45. package/node_modules/@noodle-borg/auth/dist/signer.js.map +1 -0
  46. package/node_modules/@noodle-borg/auth/dist/verify.d.ts +42 -0
  47. package/node_modules/@noodle-borg/auth/dist/verify.d.ts.map +1 -0
  48. package/node_modules/@noodle-borg/auth/dist/verify.js +48 -0
  49. package/node_modules/@noodle-borg/auth/dist/verify.js.map +1 -0
  50. package/node_modules/@noodle-borg/auth/package.json +27 -0
  51. package/node_modules/@noodle-borg/authoring/dist/index.d.ts +200 -0
  52. package/node_modules/@noodle-borg/authoring/dist/index.d.ts.map +1 -0
  53. package/node_modules/@noodle-borg/authoring/dist/index.js +504 -0
  54. package/node_modules/@noodle-borg/authoring/dist/index.js.map +1 -0
  55. package/node_modules/@noodle-borg/authoring/package.json +29 -0
  56. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +203 -0
  57. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts.map +1 -0
  58. package/node_modules/@noodle-borg/compiler/dist/artifact/types.js +20 -0
  59. package/node_modules/@noodle-borg/compiler/dist/artifact/types.js.map +1 -0
  60. package/node_modules/@noodle-borg/compiler/dist/catalog/in-memory.d.ts +13 -0
  61. package/node_modules/@noodle-borg/compiler/dist/catalog/in-memory.d.ts.map +1 -0
  62. package/node_modules/@noodle-borg/compiler/dist/catalog/in-memory.js +19 -0
  63. package/node_modules/@noodle-borg/compiler/dist/catalog/in-memory.js.map +1 -0
  64. package/node_modules/@noodle-borg/compiler/dist/catalog/signature.d.ts +11 -0
  65. package/node_modules/@noodle-borg/compiler/dist/catalog/signature.d.ts.map +1 -0
  66. package/node_modules/@noodle-borg/compiler/dist/catalog/signature.js +31 -0
  67. package/node_modules/@noodle-borg/compiler/dist/catalog/signature.js.map +1 -0
  68. package/node_modules/@noodle-borg/compiler/dist/catalog/types.d.ts +43 -0
  69. package/node_modules/@noodle-borg/compiler/dist/catalog/types.d.ts.map +1 -0
  70. package/node_modules/@noodle-borg/compiler/dist/catalog/types.js +11 -0
  71. package/node_modules/@noodle-borg/compiler/dist/catalog/types.js.map +1 -0
  72. package/node_modules/@noodle-borg/compiler/dist/cli.d.ts +3 -0
  73. package/node_modules/@noodle-borg/compiler/dist/cli.d.ts.map +1 -0
  74. package/node_modules/@noodle-borg/compiler/dist/cli.js +19 -0
  75. package/node_modules/@noodle-borg/compiler/dist/cli.js.map +1 -0
  76. package/node_modules/@noodle-borg/compiler/dist/compile.d.ts +50 -0
  77. package/node_modules/@noodle-borg/compiler/dist/compile.d.ts.map +1 -0
  78. package/node_modules/@noodle-borg/compiler/dist/compile.js +719 -0
  79. package/node_modules/@noodle-borg/compiler/dist/compile.js.map +1 -0
  80. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +27 -0
  81. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts.map +1 -0
  82. package/node_modules/@noodle-borg/compiler/dist/errors.js +2 -0
  83. package/node_modules/@noodle-borg/compiler/dist/errors.js.map +1 -0
  84. package/node_modules/@noodle-borg/compiler/dist/index.d.ts +13 -0
  85. package/node_modules/@noodle-borg/compiler/dist/index.d.ts.map +1 -0
  86. package/node_modules/@noodle-borg/compiler/dist/index.js +11 -0
  87. package/node_modules/@noodle-borg/compiler/dist/index.js.map +1 -0
  88. package/node_modules/@noodle-borg/compiler/dist/manifest/expression.d.ts +136 -0
  89. package/node_modules/@noodle-borg/compiler/dist/manifest/expression.d.ts.map +1 -0
  90. package/node_modules/@noodle-borg/compiler/dist/manifest/expression.js +552 -0
  91. package/node_modules/@noodle-borg/compiler/dist/manifest/expression.js.map +1 -0
  92. package/node_modules/@noodle-borg/compiler/dist/manifest/naming.d.ts +14 -0
  93. package/node_modules/@noodle-borg/compiler/dist/manifest/naming.d.ts.map +1 -0
  94. package/node_modules/@noodle-borg/compiler/dist/manifest/naming.js +18 -0
  95. package/node_modules/@noodle-borg/compiler/dist/manifest/naming.js.map +1 -0
  96. package/node_modules/@noodle-borg/compiler/dist/manifest/schema-refs.d.ts +24 -0
  97. package/node_modules/@noodle-borg/compiler/dist/manifest/schema-refs.d.ts.map +1 -0
  98. package/node_modules/@noodle-borg/compiler/dist/manifest/schema-refs.js +149 -0
  99. package/node_modules/@noodle-borg/compiler/dist/manifest/schema-refs.js.map +1 -0
  100. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +97 -0
  101. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts.map +1 -0
  102. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +157 -0
  103. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js.map +1 -0
  104. package/node_modules/@noodle-borg/compiler/dist/schema-export.d.ts +6 -0
  105. package/node_modules/@noodle-borg/compiler/dist/schema-export.d.ts.map +1 -0
  106. package/node_modules/@noodle-borg/compiler/dist/schema-export.js +28 -0
  107. package/node_modules/@noodle-borg/compiler/dist/schema-export.js.map +1 -0
  108. package/node_modules/@noodle-borg/compiler/dist/suggest.d.ts +41 -0
  109. package/node_modules/@noodle-borg/compiler/dist/suggest.d.ts.map +1 -0
  110. package/node_modules/@noodle-borg/compiler/dist/suggest.js +105 -0
  111. package/node_modules/@noodle-borg/compiler/dist/suggest.js.map +1 -0
  112. package/node_modules/@noodle-borg/compiler/dist/uri-template.d.ts +33 -0
  113. package/node_modules/@noodle-borg/compiler/dist/uri-template.d.ts.map +1 -0
  114. package/node_modules/@noodle-borg/compiler/dist/uri-template.js +83 -0
  115. package/node_modules/@noodle-borg/compiler/dist/uri-template.js.map +1 -0
  116. package/node_modules/@noodle-borg/compiler/package.json +32 -0
  117. package/node_modules/@noodle-borg/compute/dist/code-connector.d.ts +45 -0
  118. package/node_modules/@noodle-borg/compute/dist/code-connector.d.ts.map +1 -0
  119. package/node_modules/@noodle-borg/compute/dist/code-connector.js +53 -0
  120. package/node_modules/@noodle-borg/compute/dist/code-connector.js.map +1 -0
  121. package/node_modules/@noodle-borg/compute/dist/engine.d.ts +73 -0
  122. package/node_modules/@noodle-borg/compute/dist/engine.d.ts.map +1 -0
  123. package/node_modules/@noodle-borg/compute/dist/engine.js +31 -0
  124. package/node_modules/@noodle-borg/compute/dist/engine.js.map +1 -0
  125. package/node_modules/@noodle-borg/compute/dist/index.d.ts +4 -0
  126. package/node_modules/@noodle-borg/compute/dist/index.d.ts.map +1 -0
  127. package/node_modules/@noodle-borg/compute/dist/index.js +4 -0
  128. package/node_modules/@noodle-borg/compute/dist/index.js.map +1 -0
  129. package/node_modules/@noodle-borg/compute/dist/quickjs-engine.d.ts +31 -0
  130. package/node_modules/@noodle-borg/compute/dist/quickjs-engine.d.ts.map +1 -0
  131. package/node_modules/@noodle-borg/compute/dist/quickjs-engine.js +271 -0
  132. package/node_modules/@noodle-borg/compute/dist/quickjs-engine.js.map +1 -0
  133. package/node_modules/@noodle-borg/compute/package.json +29 -0
  134. package/node_modules/@noodle-borg/connector-defs/dist/compile.d.ts +46 -0
  135. package/node_modules/@noodle-borg/connector-defs/dist/compile.d.ts.map +1 -0
  136. package/node_modules/@noodle-borg/connector-defs/dist/compile.js +289 -0
  137. package/node_modules/@noodle-borg/connector-defs/dist/compile.js.map +1 -0
  138. package/node_modules/@noodle-borg/connector-defs/dist/index.d.ts +3 -0
  139. package/node_modules/@noodle-borg/connector-defs/dist/index.d.ts.map +1 -0
  140. package/node_modules/@noodle-borg/connector-defs/dist/index.js +3 -0
  141. package/node_modules/@noodle-borg/connector-defs/dist/index.js.map +1 -0
  142. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts +332 -0
  143. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts.map +1 -0
  144. package/node_modules/@noodle-borg/connector-defs/dist/schema.js +105 -0
  145. package/node_modules/@noodle-borg/connector-defs/dist/schema.js.map +1 -0
  146. package/node_modules/@noodle-borg/connector-defs/package.json +32 -0
  147. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +86 -0
  148. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts.map +1 -0
  149. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +138 -0
  150. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js.map +1 -0
  151. package/node_modules/@noodle-borg/connector-http/dist/index.d.ts +3 -0
  152. package/node_modules/@noodle-borg/connector-http/dist/index.d.ts.map +1 -0
  153. package/node_modules/@noodle-borg/connector-http/dist/index.js +3 -0
  154. package/node_modules/@noodle-borg/connector-http/dist/index.js.map +1 -0
  155. package/node_modules/@noodle-borg/connector-http/dist/ssrf.d.ts +45 -0
  156. package/node_modules/@noodle-borg/connector-http/dist/ssrf.d.ts.map +1 -0
  157. package/node_modules/@noodle-borg/connector-http/dist/ssrf.js +57 -0
  158. package/node_modules/@noodle-borg/connector-http/dist/ssrf.js.map +1 -0
  159. package/node_modules/@noodle-borg/connector-http/package.json +30 -0
  160. package/node_modules/@noodle-borg/protocol/dist/adapter.d.ts +73 -0
  161. package/node_modules/@noodle-borg/protocol/dist/adapter.d.ts.map +1 -0
  162. package/node_modules/@noodle-borg/protocol/dist/adapter.js +2 -0
  163. package/node_modules/@noodle-borg/protocol/dist/adapter.js.map +1 -0
  164. package/node_modules/@noodle-borg/protocol/dist/adapters/mcp-2025-11-25.d.ts +19 -0
  165. package/node_modules/@noodle-borg/protocol/dist/adapters/mcp-2025-11-25.d.ts.map +1 -0
  166. package/node_modules/@noodle-borg/protocol/dist/adapters/mcp-2025-11-25.js +34 -0
  167. package/node_modules/@noodle-borg/protocol/dist/adapters/mcp-2025-11-25.js.map +1 -0
  168. package/node_modules/@noodle-borg/protocol/dist/index.d.ts +5 -0
  169. package/node_modules/@noodle-borg/protocol/dist/index.d.ts.map +1 -0
  170. package/node_modules/@noodle-borg/protocol/dist/index.js +5 -0
  171. package/node_modules/@noodle-borg/protocol/dist/index.js.map +1 -0
  172. package/node_modules/@noodle-borg/protocol/dist/jsonrpc.d.ts +19 -0
  173. package/node_modules/@noodle-borg/protocol/dist/jsonrpc.d.ts.map +1 -0
  174. package/node_modules/@noodle-borg/protocol/dist/jsonrpc.js +14 -0
  175. package/node_modules/@noodle-borg/protocol/dist/jsonrpc.js.map +1 -0
  176. package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts +133 -0
  177. package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts.map +1 -0
  178. package/node_modules/@noodle-borg/protocol/dist/mapping.js +181 -0
  179. package/node_modules/@noodle-borg/protocol/dist/mapping.js.map +1 -0
  180. package/node_modules/@noodle-borg/protocol/dist/negotiate.d.ts +13 -0
  181. package/node_modules/@noodle-borg/protocol/dist/negotiate.d.ts.map +1 -0
  182. package/node_modules/@noodle-borg/protocol/dist/negotiate.js +18 -0
  183. package/node_modules/@noodle-borg/protocol/dist/negotiate.js.map +1 -0
  184. package/node_modules/@noodle-borg/protocol/dist/registry.d.ts +17 -0
  185. package/node_modules/@noodle-borg/protocol/dist/registry.d.ts.map +1 -0
  186. package/node_modules/@noodle-borg/protocol/dist/registry.js +33 -0
  187. package/node_modules/@noodle-borg/protocol/dist/registry.js.map +1 -0
  188. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts +22 -0
  189. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts.map +1 -0
  190. package/node_modules/@noodle-borg/protocol/dist/sdk-server.js +91 -0
  191. package/node_modules/@noodle-borg/protocol/dist/sdk-server.js.map +1 -0
  192. package/node_modules/@noodle-borg/protocol/dist/server.d.ts +38 -0
  193. package/node_modules/@noodle-borg/protocol/dist/server.d.ts.map +1 -0
  194. package/node_modules/@noodle-borg/protocol/dist/server.js +89 -0
  195. package/node_modules/@noodle-borg/protocol/dist/server.js.map +1 -0
  196. package/node_modules/@noodle-borg/protocol/dist/stateless.d.ts +14 -0
  197. package/node_modules/@noodle-borg/protocol/dist/stateless.d.ts.map +1 -0
  198. package/node_modules/@noodle-borg/protocol/dist/stateless.js +28 -0
  199. package/node_modules/@noodle-borg/protocol/dist/stateless.js.map +1 -0
  200. package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.d.ts +24 -0
  201. package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.d.ts.map +1 -0
  202. package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.js +165 -0
  203. package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.js.map +1 -0
  204. package/node_modules/@noodle-borg/protocol/dist/widget/ext-apps-bundle.d.ts +4 -0
  205. package/node_modules/@noodle-borg/protocol/dist/widget/ext-apps-bundle.d.ts.map +1 -0
  206. package/node_modules/@noodle-borg/protocol/dist/widget/ext-apps-bundle.js +10 -0
  207. package/node_modules/@noodle-borg/protocol/dist/widget/ext-apps-bundle.js.map +1 -0
  208. package/node_modules/@noodle-borg/protocol/dist/widget/inject.d.ts +8 -0
  209. package/node_modules/@noodle-borg/protocol/dist/widget/inject.d.ts.map +1 -0
  210. package/node_modules/@noodle-borg/protocol/dist/widget/inject.js +36 -0
  211. package/node_modules/@noodle-borg/protocol/dist/widget/inject.js.map +1 -0
  212. package/node_modules/@noodle-borg/protocol/package.json +29 -0
  213. package/node_modules/@noodle-borg/runtime/dist/broker/map.d.ts +29 -0
  214. package/node_modules/@noodle-borg/runtime/dist/broker/map.d.ts.map +1 -0
  215. package/node_modules/@noodle-borg/runtime/dist/broker/map.js +38 -0
  216. package/node_modules/@noodle-borg/runtime/dist/broker/map.js.map +1 -0
  217. package/node_modules/@noodle-borg/runtime/dist/broker/secret-box.d.ts +103 -0
  218. package/node_modules/@noodle-borg/runtime/dist/broker/secret-box.d.ts.map +1 -0
  219. package/node_modules/@noodle-borg/runtime/dist/broker/secret-box.js +118 -0
  220. package/node_modules/@noodle-borg/runtime/dist/broker/secret-box.js.map +1 -0
  221. package/node_modules/@noodle-borg/runtime/dist/broker/static.d.ts +12 -0
  222. package/node_modules/@noodle-borg/runtime/dist/broker/static.d.ts.map +1 -0
  223. package/node_modules/@noodle-borg/runtime/dist/broker/static.js +15 -0
  224. package/node_modules/@noodle-borg/runtime/dist/broker/static.js.map +1 -0
  225. package/node_modules/@noodle-borg/runtime/dist/broker/types.d.ts +28 -0
  226. package/node_modules/@noodle-borg/runtime/dist/broker/types.d.ts.map +1 -0
  227. package/node_modules/@noodle-borg/runtime/dist/broker/types.js +2 -0
  228. package/node_modules/@noodle-borg/runtime/dist/broker/types.js.map +1 -0
  229. package/node_modules/@noodle-borg/runtime/dist/connector/in-memory.d.ts +29 -0
  230. package/node_modules/@noodle-borg/runtime/dist/connector/in-memory.d.ts.map +1 -0
  231. package/node_modules/@noodle-borg/runtime/dist/connector/in-memory.js +37 -0
  232. package/node_modules/@noodle-borg/runtime/dist/connector/in-memory.js.map +1 -0
  233. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +41 -0
  234. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts.map +1 -0
  235. package/node_modules/@noodle-borg/runtime/dist/connector/types.js +2 -0
  236. package/node_modules/@noodle-borg/runtime/dist/connector/types.js.map +1 -0
  237. package/node_modules/@noodle-borg/runtime/dist/eval/evaluate.d.ts +39 -0
  238. package/node_modules/@noodle-borg/runtime/dist/eval/evaluate.d.ts.map +1 -0
  239. package/node_modules/@noodle-borg/runtime/dist/eval/evaluate.js +117 -0
  240. package/node_modules/@noodle-borg/runtime/dist/eval/evaluate.js.map +1 -0
  241. package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +47 -0
  242. package/node_modules/@noodle-borg/runtime/dist/execute.d.ts.map +1 -0
  243. package/node_modules/@noodle-borg/runtime/dist/execute.js +297 -0
  244. package/node_modules/@noodle-borg/runtime/dist/execute.js.map +1 -0
  245. package/node_modules/@noodle-borg/runtime/dist/index.d.ts +12 -0
  246. package/node_modules/@noodle-borg/runtime/dist/index.d.ts.map +1 -0
  247. package/node_modules/@noodle-borg/runtime/dist/index.js +8 -0
  248. package/node_modules/@noodle-borg/runtime/dist/index.js.map +1 -0
  249. package/node_modules/@noodle-borg/runtime/dist/policy/allow-all.d.ts +10 -0
  250. package/node_modules/@noodle-borg/runtime/dist/policy/allow-all.d.ts.map +1 -0
  251. package/node_modules/@noodle-borg/runtime/dist/policy/allow-all.js +13 -0
  252. package/node_modules/@noodle-borg/runtime/dist/policy/allow-all.js.map +1 -0
  253. package/node_modules/@noodle-borg/runtime/dist/policy/types.d.ts +25 -0
  254. package/node_modules/@noodle-borg/runtime/dist/policy/types.d.ts.map +1 -0
  255. package/node_modules/@noodle-borg/runtime/dist/policy/types.js +2 -0
  256. package/node_modules/@noodle-borg/runtime/dist/policy/types.js.map +1 -0
  257. package/node_modules/@noodle-borg/runtime/dist/result.d.ts +19 -0
  258. package/node_modules/@noodle-borg/runtime/dist/result.d.ts.map +1 -0
  259. package/node_modules/@noodle-borg/runtime/dist/result.js +2 -0
  260. package/node_modules/@noodle-borg/runtime/dist/result.js.map +1 -0
  261. package/node_modules/@noodle-borg/runtime/package.json +27 -0
  262. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts +48 -0
  263. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts.map +1 -0
  264. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js +79 -0
  265. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js.map +1 -0
  266. package/node_modules/@noodle-borg/service/dist/index.d.ts +7 -0
  267. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -0
  268. package/node_modules/@noodle-borg/service/dist/index.js +7 -0
  269. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -0
  270. package/node_modules/@noodle-borg/service/dist/main.d.ts +3 -0
  271. package/node_modules/@noodle-borg/service/dist/main.d.ts.map +1 -0
  272. package/node_modules/@noodle-borg/service/dist/main.js +171 -0
  273. package/node_modules/@noodle-borg/service/dist/main.js.map +1 -0
  274. package/node_modules/@noodle-borg/service/dist/oauth/app.d.ts +14 -0
  275. package/node_modules/@noodle-borg/service/dist/oauth/app.d.ts.map +1 -0
  276. package/node_modules/@noodle-borg/service/dist/oauth/app.js +48 -0
  277. package/node_modules/@noodle-borg/service/dist/oauth/app.js.map +1 -0
  278. package/node_modules/@noodle-borg/service/dist/oauth/consent.d.ts +18 -0
  279. package/node_modules/@noodle-borg/service/dist/oauth/consent.d.ts.map +1 -0
  280. package/node_modules/@noodle-borg/service/dist/oauth/consent.js +55 -0
  281. package/node_modules/@noodle-borg/service/dist/oauth/consent.js.map +1 -0
  282. package/node_modules/@noodle-borg/service/dist/oauth/google.d.ts +31 -0
  283. package/node_modules/@noodle-borg/service/dist/oauth/google.d.ts.map +1 -0
  284. package/node_modules/@noodle-borg/service/dist/oauth/google.js +39 -0
  285. package/node_modules/@noodle-borg/service/dist/oauth/google.js.map +1 -0
  286. package/node_modules/@noodle-borg/service/dist/oauth/paths.d.ts +3 -0
  287. package/node_modules/@noodle-borg/service/dist/oauth/paths.d.ts.map +1 -0
  288. package/node_modules/@noodle-borg/service/dist/oauth/paths.js +19 -0
  289. package/node_modules/@noodle-borg/service/dist/oauth/paths.js.map +1 -0
  290. package/node_modules/@noodle-borg/service/dist/oauth/provider.d.ts +61 -0
  291. package/node_modules/@noodle-borg/service/dist/oauth/provider.d.ts.map +1 -0
  292. package/node_modules/@noodle-borg/service/dist/oauth/provider.js +313 -0
  293. package/node_modules/@noodle-borg/service/dist/oauth/provider.js.map +1 -0
  294. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.d.ts +29 -0
  295. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.d.ts.map +1 -0
  296. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.js +176 -0
  297. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.js.map +1 -0
  298. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts +85 -0
  299. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts.map +1 -0
  300. package/node_modules/@noodle-borg/service/dist/oauth/store.js +57 -0
  301. package/node_modules/@noodle-borg/service/dist/oauth/store.js.map +1 -0
  302. package/node_modules/@noodle-borg/service/dist/oauth/tokens.d.ts +8 -0
  303. package/node_modules/@noodle-borg/service/dist/oauth/tokens.d.ts.map +1 -0
  304. package/node_modules/@noodle-borg/service/dist/oauth/tokens.js +13 -0
  305. package/node_modules/@noodle-borg/service/dist/oauth/tokens.js.map +1 -0
  306. package/node_modules/@noodle-borg/service/dist/secret/kms-master-key.d.ts +36 -0
  307. package/node_modules/@noodle-borg/service/dist/secret/kms-master-key.d.ts.map +1 -0
  308. package/node_modules/@noodle-borg/service/dist/secret/kms-master-key.js +51 -0
  309. package/node_modules/@noodle-borg/service/dist/secret/kms-master-key.js.map +1 -0
  310. package/node_modules/@noodle-borg/service/dist/service.d.ts +221 -0
  311. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -0
  312. package/node_modules/@noodle-borg/service/dist/service.js +1163 -0
  313. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -0
  314. package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.d.ts +34 -0
  315. package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.d.ts.map +1 -0
  316. package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.js +38 -0
  317. package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.js.map +1 -0
  318. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts +56 -0
  319. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts.map +1 -0
  320. package/node_modules/@noodle-borg/service/dist/store/postgres.js +372 -0
  321. package/node_modules/@noodle-borg/service/dist/store/postgres.js.map +1 -0
  322. package/node_modules/@noodle-borg/service/dist/store.d.ts +192 -0
  323. package/node_modules/@noodle-borg/service/dist/store.d.ts.map +1 -0
  324. package/node_modules/@noodle-borg/service/dist/store.js +230 -0
  325. package/node_modules/@noodle-borg/service/dist/store.js.map +1 -0
  326. package/node_modules/@noodle-borg/service/package.json +44 -0
  327. package/node_modules/@noodle-borg/transport-http/dist/caller-auth.d.ts +15 -0
  328. package/node_modules/@noodle-borg/transport-http/dist/caller-auth.d.ts.map +1 -0
  329. package/node_modules/@noodle-borg/transport-http/dist/caller-auth.js +38 -0
  330. package/node_modules/@noodle-borg/transport-http/dist/caller-auth.js.map +1 -0
  331. package/node_modules/@noodle-borg/transport-http/dist/examples/serve-demo.d.ts +2 -0
  332. package/node_modules/@noodle-borg/transport-http/dist/examples/serve-demo.d.ts.map +1 -0
  333. package/node_modules/@noodle-borg/transport-http/dist/examples/serve-demo.js +129 -0
  334. package/node_modules/@noodle-borg/transport-http/dist/examples/serve-demo.js.map +1 -0
  335. package/node_modules/@noodle-borg/transport-http/dist/front-door.d.ts +46 -0
  336. package/node_modules/@noodle-borg/transport-http/dist/front-door.d.ts.map +1 -0
  337. package/node_modules/@noodle-borg/transport-http/dist/front-door.js +75 -0
  338. package/node_modules/@noodle-borg/transport-http/dist/front-door.js.map +1 -0
  339. package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts +142 -0
  340. package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts.map +1 -0
  341. package/node_modules/@noodle-borg/transport-http/dist/handler.js +387 -0
  342. package/node_modules/@noodle-borg/transport-http/dist/handler.js.map +1 -0
  343. package/node_modules/@noodle-borg/transport-http/dist/index.d.ts +6 -0
  344. package/node_modules/@noodle-borg/transport-http/dist/index.d.ts.map +1 -0
  345. package/node_modules/@noodle-borg/transport-http/dist/index.js +6 -0
  346. package/node_modules/@noodle-borg/transport-http/dist/index.js.map +1 -0
  347. package/node_modules/@noodle-borg/transport-http/dist/logging.d.ts +41 -0
  348. package/node_modules/@noodle-borg/transport-http/dist/logging.d.ts.map +1 -0
  349. package/node_modules/@noodle-borg/transport-http/dist/logging.js +71 -0
  350. package/node_modules/@noodle-borg/transport-http/dist/logging.js.map +1 -0
  351. package/node_modules/@noodle-borg/transport-http/dist/serve.d.ts +22 -0
  352. package/node_modules/@noodle-borg/transport-http/dist/serve.d.ts.map +1 -0
  353. package/node_modules/@noodle-borg/transport-http/dist/serve.js +25 -0
  354. package/node_modules/@noodle-borg/transport-http/dist/serve.js.map +1 -0
  355. package/node_modules/@noodle-borg/transport-http/package.json +30 -0
  356. package/package.json +78 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ext-apps-bundle.js","sourceRoot":"","sources":["../../src/widget/ext-apps-bundle.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,0FAA0F;AAC1F,mGAAmG;AACnG,qFAAqF;AACrF,qCAAqC;AACrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAExC,sFAAsF;AACtF,MAAM,CAAC,MAAM,eAAe,GAAW,0skUAA0skU,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Inject the MCP Apps client bridge into a widget body, gated strictly on the
3
+ * `text/html;profile=mcp-app` mime type. No-op for every other content type, and idempotent (a body that
4
+ * already inlines the bundle is returned unchanged). The script is added before `</body>` when present, else
5
+ * appended.
6
+ */
7
+ export declare function injectWidgetBridge(mimeType: string | undefined, html: string): string;
8
+ //# sourceMappingURL=inject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject.d.ts","sourceRoot":"","sources":["../../src/widget/inject.ts"],"names":[],"mappings":"AAuBA;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrF"}
@@ -0,0 +1,36 @@
1
+ import { MCP_APP_MIME_TYPE } from '@noodle-borg/compiler';
2
+ import { WIDGET_BOOTSTRAP_SOURCE } from './bootstrap.js';
3
+ import { EXT_APPS_BUNDLE } from './ext-apps-bundle.js';
4
+ /**
5
+ * Serve-time injection of the MCP Apps client bridge into a widget's HTML body.
6
+ *
7
+ * A host (Claude/ChatGPT) renders a widget's `ui://` resource in a sandboxed iframe, but keeps the frame
8
+ * **blank** until the widget connects over the `ui/*` bridge — and the iframe CSP blocks CDN script fetches,
9
+ * so the bridge client must be **inlined**. We add the vendored `@modelcontextprotocol/ext-apps` bundle plus
10
+ * the widget runtime bootstrap (`./bootstrap.ts`) here, at serve time, as **shared runtime infrastructure**:
11
+ * it is not stored per artifact and is not counted against the author's widget-`html` size budget. The author
12
+ * writes static HTML (with `data-bind*`/`data-action` attributes); the runtime supplies the bridge, host
13
+ * theming, auto-resize, the live tool result/input, and UI-initiated actions. See
14
+ * docs/decisions/0022-adopt-mcp-ui-for-apps-widgets.md (W2 / W2.5).
15
+ */
16
+ /** `</script>` inside the minified bundle would close the host `<script>` tag early — neutralize it once. */
17
+ const SAFE_BUNDLE = EXT_APPS_BUNDLE.replace(/<\/(script)/gi, '<\\/$1');
18
+ /** The injected bridge: the ext-apps bundle + the widget runtime bootstrap, as one inline module script. */
19
+ const BRIDGE_SCRIPT = `<script type="module">\n${SAFE_BUNDLE}\n${WIDGET_BOOTSTRAP_SOURCE}\n</script>`;
20
+ /**
21
+ * Inject the MCP Apps client bridge into a widget body, gated strictly on the
22
+ * `text/html;profile=mcp-app` mime type. No-op for every other content type, and idempotent (a body that
23
+ * already inlines the bundle is returned unchanged). The script is added before `</body>` when present, else
24
+ * appended.
25
+ */
26
+ export function injectWidgetBridge(mimeType, html) {
27
+ if (mimeType !== MCP_APP_MIME_TYPE)
28
+ return html;
29
+ if (html.includes('globalThis.ExtApps'))
30
+ return html;
31
+ const idx = html.toLowerCase().lastIndexOf('</body>');
32
+ return idx === -1
33
+ ? `${html}\n${BRIDGE_SCRIPT}`
34
+ : `${html.slice(0, idx)}${BRIDGE_SCRIPT}\n${html.slice(idx)}`;
35
+ }
36
+ //# sourceMappingURL=inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject.js","sourceRoot":"","sources":["../../src/widget/inject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;;;;;;;GAWG;AAEH,6GAA6G;AAC7G,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;AAEvE,4GAA4G;AAC5G,MAAM,aAAa,GAAG,2BAA2B,WAAW,KAAK,uBAAuB,aAAa,CAAC;AAEtG;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAA4B,EAAE,IAAY;IAC3E,IAAI,QAAQ,KAAK,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACtD,OAAO,GAAG,KAAK,CAAC,CAAC;QACf,CAAC,CAAC,GAAG,IAAI,KAAK,aAAa,EAAE;QAC7B,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,aAAa,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClE,CAAC"}
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@noodle-borg/protocol",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc -p tsconfig.json",
19
+ "typecheck": "tsc -p tsconfig.json --noEmit"
20
+ },
21
+ "dependencies": {
22
+ "@modelcontextprotocol/sdk": "^1.29.0",
23
+ "@noodle-borg/compiler": "0.0.0",
24
+ "@noodle-borg/runtime": "0.0.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^24.0.0"
28
+ }
29
+ }
@@ -0,0 +1,29 @@
1
+ import type { CredentialBroker, CredentialRequest, DownstreamCredential } from './types.js';
2
+ /**
3
+ * Build the lookup key for a connector operation. With `operation`, it keys an exact
4
+ * `(connectorId, operation)` entry; without, it keys the connector-level default.
5
+ */
6
+ declare function entryKey(connectorId: string, operation?: string): string;
7
+ /**
8
+ * A service-credential broker backed by a resolved map. It resolves a {@link DownstreamCredential} by
9
+ * `(connectorId, operation)`, falling back to a connector-level default, then to a shared `fallback`
10
+ * (an empty token by default, so operations with no declared auth keep calling public endpoints exactly
11
+ * as before).
12
+ *
13
+ * It holds only already-resolved `{token}` values — it has no knowledge of auth schemes or secret names
14
+ * (those are joined away at deploy time). "Missing secret" is therefore caught at deploy, not here, so
15
+ * this broker never rejects: an unbound operation simply gets the empty-token fallback.
16
+ *
17
+ * The {@link CredentialBroker} port is unchanged, so a later multi-tenant model (tenant + environment
18
+ * scoping, environments inheriting their tenant's secrets) layers on top by changing only how this map
19
+ * is constructed — not the port the runtime depends on.
20
+ */
21
+ export declare class MapServiceBroker implements CredentialBroker {
22
+ #private;
23
+ constructor(entries: ReadonlyMap<string, DownstreamCredential>, fallback?: DownstreamCredential);
24
+ getCredential(request: CredentialRequest): Promise<DownstreamCredential>;
25
+ /** Build the map key for `(connectorId, operation?)`; exported so callers can populate the entries. */
26
+ static key: typeof entryKey;
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/broker/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAI5F;;;GAGG;AACH,iBAAS,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAiB,YAAW,gBAAgB;;gBAKrD,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAClD,QAAQ,GAAE,oBAAoC;IAMhD,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAMxE,uGAAuG;IACvG,MAAM,CAAC,GAAG,kBAAY;CACvB"}
@@ -0,0 +1,38 @@
1
+ const SEP = '\u0000';
2
+ /**
3
+ * Build the lookup key for a connector operation. With `operation`, it keys an exact
4
+ * `(connectorId, operation)` entry; without, it keys the connector-level default.
5
+ */
6
+ function entryKey(connectorId, operation) {
7
+ return operation === undefined ? connectorId : `${connectorId}${SEP}${operation}`;
8
+ }
9
+ /**
10
+ * A service-credential broker backed by a resolved map. It resolves a {@link DownstreamCredential} by
11
+ * `(connectorId, operation)`, falling back to a connector-level default, then to a shared `fallback`
12
+ * (an empty token by default, so operations with no declared auth keep calling public endpoints exactly
13
+ * as before).
14
+ *
15
+ * It holds only already-resolved `{token}` values — it has no knowledge of auth schemes or secret names
16
+ * (those are joined away at deploy time). "Missing secret" is therefore caught at deploy, not here, so
17
+ * this broker never rejects: an unbound operation simply gets the empty-token fallback.
18
+ *
19
+ * The {@link CredentialBroker} port is unchanged, so a later multi-tenant model (tenant + environment
20
+ * scoping, environments inheriting their tenant's secrets) layers on top by changing only how this map
21
+ * is constructed — not the port the runtime depends on.
22
+ */
23
+ export class MapServiceBroker {
24
+ #byKey;
25
+ #fallback;
26
+ constructor(entries, fallback = { token: '' }) {
27
+ this.#byKey = entries;
28
+ this.#fallback = fallback;
29
+ }
30
+ getCredential(request) {
31
+ const exact = this.#byKey.get(entryKey(request.connectorId, request.operation));
32
+ const connectorDefault = this.#byKey.get(entryKey(request.connectorId));
33
+ return Promise.resolve(exact ?? connectorDefault ?? this.#fallback);
34
+ }
35
+ /** Build the map key for `(connectorId, operation?)`; exported so callers can populate the entries. */
36
+ static key = entryKey;
37
+ }
38
+ //# sourceMappingURL=map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/broker/map.ts"],"names":[],"mappings":"AAEA,MAAM,GAAG,GAAG,QAAQ,CAAC;AAErB;;;GAGG;AACH,SAAS,QAAQ,CAAC,WAAmB,EAAE,SAAkB;IACvD,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,GAAG,GAAG,SAAS,EAAE,CAAC;AACpF,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,gBAAgB;IAClB,MAAM,CAA4C;IAClD,SAAS,CAAuB;IAEzC,YACE,OAAkD,EAClD,WAAiC,EAAE,KAAK,EAAE,EAAE,EAAE;QAE9C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,aAAa,CAAC,OAA0B;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAChF,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QACxE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,gBAAgB,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,uGAAuG;IACvG,MAAM,CAAC,GAAG,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,103 @@
1
+ /** The AES-256-GCM ciphertext components (all base64) shared by the sealed envelope and DEK wrapping. */
2
+ interface AesGcmParts {
3
+ /** base64; 12 random bytes, fresh per encryption. */
4
+ readonly iv: string;
5
+ /** base64 GCM authentication tag (tamper-evident). */
6
+ readonly tag: string;
7
+ /** base64 ciphertext. */
8
+ readonly ct: string;
9
+ }
10
+ /**
11
+ * A serializable, AES-256-GCM-sealed secret value. Holds **no** plaintext — only base64 IV/tag/ciphertext,
12
+ * plus the key id + algorithm (and, for v2, the wrapped data key) so the open path can select the right key
13
+ * across mixed-vintage records during a migration.
14
+ *
15
+ * - **v1** (ADR 0028): the blob is encrypted **directly** with a static 32-byte master key. Emitted by
16
+ * {@link staticMasterKeyProvider} (dev/offline); still fully readable.
17
+ * - **v2** (ADR 0037): **envelope encryption** — a fresh per-record 32-byte data key (DEK) encrypts the
18
+ * blob, and the KEK custodian (e.g. Cloud KMS) wraps the DEK (`wrappedDek`). The KEK never enters the
19
+ * process. Emitted by a {@link WrappingMasterKey} provider.
20
+ */
21
+ export type SealedSecret = SealedSecretV1 | SealedSecretV2;
22
+ export interface SealedSecretV1 extends AesGcmParts {
23
+ readonly v: 1;
24
+ readonly algo: 'AES-256-GCM';
25
+ /** The static key id (e.g. `'static'`) that encrypted the blob. */
26
+ readonly keyId: string;
27
+ }
28
+ export interface SealedSecretV2 extends AesGcmParts {
29
+ readonly v: 2;
30
+ readonly algo: 'AES-256-GCM';
31
+ /** The KEK id (e.g. a Cloud KMS cryptoKey resource name) that wrapped {@link wrappedDek}. */
32
+ readonly keyId: string;
33
+ /** base64 KEK-ciphertext of the 32-byte DEK that encrypted the blob ({@link AesGcmParts.ct}). */
34
+ readonly wrappedDek: string;
35
+ }
36
+ /**
37
+ * Thrown when a {@link SecretBox} cannot decrypt — a wrong/missing key or KEK, tampered ciphertext, or a
38
+ * record/provider version mismatch. Never includes the plaintext or the ciphertext in its message.
39
+ */
40
+ export declare class SecretDecryptError extends Error {
41
+ constructor(message?: string);
42
+ }
43
+ /**
44
+ * Custodian of the key-encrypting key (KEK). Two shapes (ADR 0037), discriminated by `kind`:
45
+ *
46
+ * - {@link StaticMasterKey} — a raw 32-byte key held in-process (dev/offline); {@link SecretBox} seals
47
+ * **v1** (the blob is encrypted directly with the key).
48
+ * - {@link WrappingMasterKey} — the KEK never leaves a custodian (e.g. Cloud KMS); it only wrap/unwraps a
49
+ * per-record DEK, so {@link SecretBox} seals **v2** (envelope encryption). Async — the custodian is a
50
+ * network call.
51
+ *
52
+ * `keyId` is stamped into each {@link SealedSecret} so the right key can be selected to open it later.
53
+ */
54
+ export type MasterKeyProvider = StaticMasterKey | WrappingMasterKey;
55
+ export interface StaticMasterKey {
56
+ readonly kind: 'static';
57
+ readonly keyId: string;
58
+ /** Exactly 32 bytes. Held in-process — dev/offline only. */
59
+ key(): Buffer;
60
+ }
61
+ export interface WrappingMasterKey {
62
+ readonly kind: 'wrapping';
63
+ readonly keyId: string;
64
+ /** Wrap (encrypt) a 32-byte DEK with the KEK. The KEK never leaves the custodian. */
65
+ wrapDek(dek: Buffer): Promise<Buffer>;
66
+ /** Unwrap (decrypt) a previously wrapped DEK. Throws if the KEK cannot open it. */
67
+ unwrapDek(wrapped: Buffer): Promise<Buffer>;
68
+ }
69
+ /**
70
+ * A {@link StaticMasterKey} backed by a base64-encoded 32-byte key (e.g. from an env var). Validates the
71
+ * length eagerly: an absent/short/invalid key throws **here**, so a misconfigured deployment fails closed
72
+ * rather than persisting or reading secrets in the clear.
73
+ */
74
+ export declare function staticMasterKeyProvider(base64Key: string, keyId?: string): StaticMasterKey;
75
+ /**
76
+ * Reversible envelope encryption for secret values at rest (Slice 26, ADR 0028; KEK custody ADR 0037).
77
+ * Unlike the caller-key — which is hash-at-rest because it is only ever *verified* — a connector secret
78
+ * must be reproduced verbatim to send downstream, so it is **encrypted, not hashed**. AES-256-GCM via
79
+ * `node:crypto`, a fresh random IV per seal, and the GCM tag authenticates the ciphertext.
80
+ *
81
+ * `seal`/`open` are **async** because a wrapping (KMS) provider round-trips to the custodian; a static
82
+ * provider resolves immediately. The live in-memory broker still holds plaintext — only the *persisted
83
+ * projection* is sealed.
84
+ */
85
+ export declare class SecretBox {
86
+ #private;
87
+ constructor(provider: MasterKeyProvider);
88
+ /**
89
+ * Seal a plaintext. A static provider emits **v1** (blob encrypted directly with its key — byte-identical
90
+ * to ADR 0028); a wrapping provider emits **v2** (a fresh per-record DEK encrypts the blob, the KEK wraps
91
+ * the DEK).
92
+ */
93
+ seal(plaintext: string): Promise<SealedSecret>;
94
+ /**
95
+ * Open a {@link SealedSecret}. Dispatches on its version against the provider: **v1** needs the static
96
+ * key; **v2** unwraps the per-record DEK via the wrapping provider. Any failure — wrong key/KEK, tampered
97
+ * ciphertext, an unavailable KMS, or a version/provider mismatch — is normalized to
98
+ * {@link SecretDecryptError}, whose message leaks neither plaintext nor ciphertext.
99
+ */
100
+ open(sealed: SealedSecret): Promise<string>;
101
+ }
102
+ export {};
103
+ //# sourceMappingURL=secret-box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-box.d.ts","sourceRoot":"","sources":["../../src/broker/secret-box.ts"],"names":[],"mappings":"AAEA,yGAAyG;AACzG,UAAU,WAAW;IACnB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,cAAc,CAAC;AAE3D,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACd,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACd,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iGAAiG;IACjG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,SAAgE;CAIpF;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG,iBAAiB,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,GAAG,IAAI,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,mFAAmF;IACnF,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAW,GAAG,eAAe,CAM5F;AAED;;;;;;;;;GASG;AACH,qBAAa,SAAS;;gBAGR,QAAQ,EAAE,iBAAiB;IAIvC;;;;OAIG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAiBpD;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;CAkBlD"}
@@ -0,0 +1,118 @@
1
+ import { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';
2
+ /**
3
+ * Thrown when a {@link SecretBox} cannot decrypt — a wrong/missing key or KEK, tampered ciphertext, or a
4
+ * record/provider version mismatch. Never includes the plaintext or the ciphertext in its message.
5
+ */
6
+ export class SecretDecryptError extends Error {
7
+ constructor(message = 'failed to decrypt secret (wrong key or tampered ciphertext)') {
8
+ super(message);
9
+ this.name = 'SecretDecryptError';
10
+ }
11
+ }
12
+ /**
13
+ * A {@link StaticMasterKey} backed by a base64-encoded 32-byte key (e.g. from an env var). Validates the
14
+ * length eagerly: an absent/short/invalid key throws **here**, so a misconfigured deployment fails closed
15
+ * rather than persisting or reading secrets in the clear.
16
+ */
17
+ export function staticMasterKeyProvider(base64Key, keyId = 'static') {
18
+ const key = Buffer.from(base64Key, 'base64');
19
+ if (key.length !== 32) {
20
+ throw new Error(`secret master key must decode to 32 bytes (base64); got ${key.length}`);
21
+ }
22
+ return { kind: 'static', keyId, key: () => key };
23
+ }
24
+ /**
25
+ * Reversible envelope encryption for secret values at rest (Slice 26, ADR 0028; KEK custody ADR 0037).
26
+ * Unlike the caller-key — which is hash-at-rest because it is only ever *verified* — a connector secret
27
+ * must be reproduced verbatim to send downstream, so it is **encrypted, not hashed**. AES-256-GCM via
28
+ * `node:crypto`, a fresh random IV per seal, and the GCM tag authenticates the ciphertext.
29
+ *
30
+ * `seal`/`open` are **async** because a wrapping (KMS) provider round-trips to the custodian; a static
31
+ * provider resolves immediately. The live in-memory broker still holds plaintext — only the *persisted
32
+ * projection* is sealed.
33
+ */
34
+ export class SecretBox {
35
+ #provider;
36
+ constructor(provider) {
37
+ this.#provider = provider;
38
+ }
39
+ /**
40
+ * Seal a plaintext. A static provider emits **v1** (blob encrypted directly with its key — byte-identical
41
+ * to ADR 0028); a wrapping provider emits **v2** (a fresh per-record DEK encrypts the blob, the KEK wraps
42
+ * the DEK).
43
+ */
44
+ async seal(plaintext) {
45
+ if (this.#provider.kind === 'static') {
46
+ return {
47
+ v: 1,
48
+ algo: 'AES-256-GCM',
49
+ keyId: this.#provider.keyId,
50
+ ...aesEncrypt(this.#provider.key(), plaintext),
51
+ };
52
+ }
53
+ const dek = randomBytes(32);
54
+ const wrappedDek = (await this.#provider.wrapDek(dek)).toString('base64');
55
+ // Bind the v2 header (version, algo, keyId, wrappedDek) into the GCM tag as AAD so the record is
56
+ // self-describing and tamper-evident on those fields — not just transitively via the unique DEK.
57
+ const parts = aesEncrypt(dek, plaintext, v2Aad(this.#provider.keyId, wrappedDek));
58
+ return { v: 2, algo: 'AES-256-GCM', keyId: this.#provider.keyId, wrappedDek, ...parts };
59
+ }
60
+ /**
61
+ * Open a {@link SealedSecret}. Dispatches on its version against the provider: **v1** needs the static
62
+ * key; **v2** unwraps the per-record DEK via the wrapping provider. Any failure — wrong key/KEK, tampered
63
+ * ciphertext, an unavailable KMS, or a version/provider mismatch — is normalized to
64
+ * {@link SecretDecryptError}, whose message leaks neither plaintext nor ciphertext.
65
+ */
66
+ async open(sealed) {
67
+ try {
68
+ if (sealed.v === 2) {
69
+ if (this.#provider.kind !== 'wrapping') {
70
+ throw new Error('a v2 (KMS-wrapped) record requires a wrapping master-key provider');
71
+ }
72
+ const dek = await this.#provider.unwrapDek(Buffer.from(sealed.wrappedDek, 'base64'));
73
+ return aesDecrypt(dek, sealed, v2Aad(sealed.keyId, sealed.wrappedDek));
74
+ }
75
+ if (this.#provider.kind !== 'static') {
76
+ throw new Error('a v1 (static-key) record requires the static master-key provider');
77
+ }
78
+ return aesDecrypt(this.#provider.key(), sealed);
79
+ }
80
+ catch {
81
+ // Normalize every failure (wrong key, bad tag, KMS error, version mismatch) to one opaque error.
82
+ throw new SecretDecryptError();
83
+ }
84
+ }
85
+ }
86
+ /**
87
+ * The v2 additional authenticated data: the header fields bound into the GCM tag so any tampering of the
88
+ * version/algo/keyId/wrappedDek is caught on open. A deterministic, fixed-key-order JSON so `seal` and
89
+ * `open` reconstruct byte-identical AAD. (v1 uses no AAD, staying byte-identical to ADR 0028.)
90
+ */
91
+ function v2Aad(keyId, wrappedDek) {
92
+ return Buffer.from(JSON.stringify({ v: 2, algo: 'AES-256-GCM', keyId, wrappedDek }), 'utf8');
93
+ }
94
+ /** AES-256-GCM encrypt `plaintext` under `key` (32 bytes), optionally bound to `aad`. */
95
+ function aesEncrypt(key, plaintext, aad) {
96
+ const iv = randomBytes(12);
97
+ const cipher = createCipheriv('aes-256-gcm', key, iv);
98
+ if (aad)
99
+ cipher.setAAD(aad);
100
+ const ct = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
101
+ return {
102
+ iv: iv.toString('base64'),
103
+ tag: cipher.getAuthTag().toString('base64'),
104
+ ct: ct.toString('base64'),
105
+ };
106
+ }
107
+ /** AES-256-GCM decrypt {@link AesGcmParts} under `key`; throws on a wrong key, wrong `aad`, or tampering. */
108
+ function aesDecrypt(key, parts, aad) {
109
+ const decipher = createDecipheriv('aes-256-gcm', key, Buffer.from(parts.iv, 'base64'), {
110
+ authTagLength: 16,
111
+ });
112
+ if (aad)
113
+ decipher.setAAD(aad);
114
+ decipher.setAuthTag(Buffer.from(parts.tag, 'base64'));
115
+ const pt = Buffer.concat([decipher.update(Buffer.from(parts.ct, 'base64')), decipher.final()]);
116
+ return pt.toString('utf8');
117
+ }
118
+ //# sourceMappingURL=secret-box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-box.js","sourceRoot":"","sources":["../../src/broker/secret-box.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { CredentialBroker, CredentialRequest, DownstreamCredential } from './types.js';
2
+ /**
3
+ * A development/test broker that hands out a single fixed service credential for every request.
4
+ * Stands in for the real credential broker until Phase 3 introduces delegated end-user credentials.
5
+ * It never sees an inbound token, upholding the no-token-forwarding invariant by construction.
6
+ */
7
+ export declare class StaticServiceBroker implements CredentialBroker {
8
+ #private;
9
+ constructor(credential: DownstreamCredential);
10
+ getCredential(_request: CredentialRequest): Promise<DownstreamCredential>;
11
+ }
12
+ //# sourceMappingURL=static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../src/broker/static.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE5F;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,gBAAgB;;gBAG9C,UAAU,EAAE,oBAAoB;IAI5C,aAAa,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAG1E"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * A development/test broker that hands out a single fixed service credential for every request.
3
+ * Stands in for the real credential broker until Phase 3 introduces delegated end-user credentials.
4
+ * It never sees an inbound token, upholding the no-token-forwarding invariant by construction.
5
+ */
6
+ export class StaticServiceBroker {
7
+ #credential;
8
+ constructor(credential) {
9
+ this.#credential = credential;
10
+ }
11
+ getCredential(_request) {
12
+ return Promise.resolve(this.#credential);
13
+ }
14
+ }
15
+ //# sourceMappingURL=static.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/broker/static.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IACrB,WAAW,CAAuB;IAE3C,YAAY,UAAgC;QAC1C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,aAAa,CAAC,QAA2B;QACvC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * A downstream-scoped credential minted by the {@link CredentialBroker} for a single connector
3
+ * operation. It is opaque to the runtime, which only forwards it to the connector and never logs
4
+ * or inspects it. It is NOT an inbound MCP/OAuth bearer token — the runtime never forwards those
5
+ * to business backends (docs/SPEC.md "Auth And Identity").
6
+ */
7
+ export interface DownstreamCredential {
8
+ /** Opaque secret material the connector presents to its backing system. */
9
+ readonly token: string;
10
+ /** Optional scope marker, for the broker's own bookkeeping. */
11
+ readonly scope?: string;
12
+ }
13
+ /** What the runtime tells the broker about the call it is credentialing. */
14
+ export interface CredentialRequest {
15
+ readonly connectorId: string;
16
+ readonly connectorVersion: string;
17
+ readonly operation: string;
18
+ }
19
+ /**
20
+ * Exchanges validated identity for a downstream-scoped credential. In Phase 1 there is no end-user
21
+ * identity, so the broker returns a *service* credential. The broker is the only source of
22
+ * connector credentials; the runtime never derives one from an inbound token (docs/SPEC.md
23
+ * "Auth And Identity", "Policy And Security"; [ADR 0005](../../../../docs/decisions/0005-runtime-execution-boundary.md)).
24
+ */
25
+ export interface CredentialBroker {
26
+ getCredential(request: CredentialRequest): Promise<DownstreamCredential>;
27
+ }
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/broker/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC1E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/broker/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import type { OperationSignature, ResolvedOperationRef } from '@noodle-borg/compiler';
2
+ import type { DownstreamCredential } from '../broker/types.js';
3
+ import type { Connector, ConnectorCall, ConnectorRegistry } from './types.js';
4
+ /** A handler runs one operation: pure data in, data out. It receives the broker credential. */
5
+ export type OperationHandler = (args: Readonly<Record<string, unknown>>, credential: DownstreamCredential) => Promise<unknown> | unknown;
6
+ /** An in-memory operation: its signature plus the function that fulfils it. */
7
+ export interface InMemoryOperation {
8
+ readonly signature: OperationSignature;
9
+ readonly handler: OperationHandler;
10
+ }
11
+ /**
12
+ * A connector whose operations are plain in-process functions. Used for tests and for the first
13
+ * execution-plane slice; no network egress. The `http`/`custom` kinds arrive in later slices.
14
+ */
15
+ export declare class InMemoryConnector implements Connector {
16
+ #private;
17
+ readonly id: string;
18
+ readonly version: string;
19
+ constructor(id: string, version: string, operations: Record<string, InMemoryOperation>);
20
+ signature(operation: string): OperationSignature | undefined;
21
+ invoke(call: ConnectorCall): Promise<unknown>;
22
+ }
23
+ /** A registry backed by a fixed set of connectors, keyed by `id@version`. */
24
+ export declare class InMemoryConnectorRegistry implements ConnectorRegistry {
25
+ #private;
26
+ constructor(connectors: readonly Connector[]);
27
+ resolve(ref: ResolvedOperationRef): Connector | undefined;
28
+ }
29
+ //# sourceMappingURL=in-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.d.ts","sourceRoot":"","sources":["../../src/connector/in-memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE9E,+FAA+F;AAC/F,MAAM,MAAM,gBAAgB,GAAG,CAC7B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,UAAU,EAAE,oBAAoB,KAC7B,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAEhC,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,SAAS;;IACjD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAGb,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAMtF,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAItD,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;CAKpD;AAED,6EAA6E;AAC7E,qBAAa,yBAA0B,YAAW,iBAAiB;;gBAGrD,UAAU,EAAE,SAAS,SAAS,EAAE;IAI5C,OAAO,CAAC,GAAG,EAAE,oBAAoB,GAAG,SAAS,GAAG,SAAS;CAG1D"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * A connector whose operations are plain in-process functions. Used for tests and for the first
3
+ * execution-plane slice; no network egress. The `http`/`custom` kinds arrive in later slices.
4
+ */
5
+ export class InMemoryConnector {
6
+ id;
7
+ version;
8
+ #operations;
9
+ constructor(id, version, operations) {
10
+ this.id = id;
11
+ this.version = version;
12
+ this.#operations = operations;
13
+ }
14
+ signature(operation) {
15
+ return this.#operations[operation]?.signature;
16
+ }
17
+ async invoke(call) {
18
+ const op = this.#operations[call.operation];
19
+ if (!op)
20
+ throw new Error(`connector "${this.id}" has no operation "${call.operation}"`);
21
+ return op.handler(call.args, call.credential);
22
+ }
23
+ }
24
+ /** A registry backed by a fixed set of connectors, keyed by `id@version`. */
25
+ export class InMemoryConnectorRegistry {
26
+ #byKey;
27
+ constructor(connectors) {
28
+ this.#byKey = new Map(connectors.map((c) => [key(c.id, c.version), c]));
29
+ }
30
+ resolve(ref) {
31
+ return this.#byKey.get(key(ref.connectorId, ref.connectorVersion));
32
+ }
33
+ }
34
+ function key(id, version) {
35
+ return `${id}@${version}`;
36
+ }
37
+ //# sourceMappingURL=in-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.js","sourceRoot":"","sources":["../../src/connector/in-memory.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACnB,EAAE,CAAS;IACX,OAAO,CAAS;IAChB,WAAW,CAA8C;IAElE,YAAY,EAAU,EAAE,OAAe,EAAE,UAA6C;QACpF,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,SAAS,CAAC,SAAiB;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAmB;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,EAAE,uBAAuB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACxF,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,OAAO,yBAAyB;IAC3B,MAAM,CAAyB;IAExC,YAAY,UAAgC;QAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,CAAC,GAAyB;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACrE,CAAC;CACF;AAED,SAAS,GAAG,CAAC,EAAU,EAAE,OAAe;IACtC,OAAO,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { OperationSignature, ResolvedOperationRef } from '@noodle-borg/compiler';
2
+ import type { DownstreamCredential } from '../broker/types.js';
3
+ /**
4
+ * Host capability exposed to connectors that need to call another connector operation on behalf of
5
+ * sandboxed code. The runtime owns the implementation so nested calls still pass through signature
6
+ * drift checks, policy, broker credentials, connector invocation, redaction, and output validation.
7
+ */
8
+ export interface ConnectorCallHost {
9
+ callOperation(ref: ResolvedOperationRef, args: Readonly<Record<string, unknown>>, path: string): Promise<unknown>;
10
+ }
11
+ /** A single connector-operation invocation, fully resolved and credentialed by the runtime. */
12
+ export interface ConnectorCall {
13
+ readonly operation: string;
14
+ /** Evaluated, validated arguments. */
15
+ readonly args: Readonly<Record<string, unknown>>;
16
+ /**
17
+ * The downstream-scoped credential minted by the broker — never an inbound bearer token
18
+ * (docs/SPEC.md "Auth And Identity").
19
+ */
20
+ readonly credential: DownstreamCredential;
21
+ /** Optional host capability for sandboxed connectors; ignored by ordinary connectors. */
22
+ readonly host?: ConnectorCallHost;
23
+ }
24
+ /**
25
+ * A connector: a versioned integration exposing typed operations. Phase 1 ships only an in-memory
26
+ * implementation; the `http` and sandboxed `custom` kinds are later slices. The runtime treats a
27
+ * connector as a port — it owns its transport, retries, and error normalization.
28
+ */
29
+ export interface Connector {
30
+ readonly id: string;
31
+ readonly version: string;
32
+ /** The operation's signature, used for signature-drift verification and argument/output checks. */
33
+ signature(operation: string): OperationSignature | undefined;
34
+ /** Invoke the operation. May reject; the runtime normalizes the failure (no secret leakage). */
35
+ invoke(call: ConnectorCall): Promise<unknown>;
36
+ }
37
+ /** Maps a resolved operation reference to the connector that can serve it. */
38
+ export interface ConnectorRegistry {
39
+ resolve(ref: ResolvedOperationRef): Connector | undefined;
40
+ }
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/connector/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,aAAa,CACX,GAAG,EAAE,oBAAoB,EACzB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,+FAA+F;AAC/F,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,yFAAyF;IACzF,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC;CACnC;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,mGAAmG;IACnG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;IAC7D,gGAAgG;IAChG,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/C;AAED,8EAA8E;AAC9E,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,GAAG,EAAE,oBAAoB,GAAG,SAAS,GAAG,SAAS,CAAC;CAC3D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/connector/types.ts"],"names":[],"mappings":""}