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,176 @@
1
+ /**
2
+ * Relational {@link OAuthStore} for the self-hosted authorization server (OA-2,
3
+ * [ADR 0042](../../../../docs/decisions/0042-self-hosted-oauth-authorization-server.md)). Shares the injected
4
+ * `pg.Pool` with {@link PostgresArtifactStore} so the AS state lives in the same strongly-consistent store
5
+ * that backs deployments — any Cloud Run instance can complete a flow another started.
6
+ *
7
+ * Single-use semantics are enforced in SQL: `DELETE … RETURNING` (codes, pending auth, refresh tokens) is
8
+ * row-atomic, so two concurrent redemptions of the same value yield exactly one winner; the loser gets zero
9
+ * rows. Expired rows are still deleted on consume (and returned as `undefined`), which doubles as cleanup.
10
+ */
11
+ export class PostgresOAuthStore {
12
+ #pool;
13
+ constructor(pool) {
14
+ this.#pool = pool;
15
+ }
16
+ /** Create the OAuth tables if absent (idempotent). Run once at startup before serving AS endpoints. */
17
+ async ensureSchema() {
18
+ await this.#pool.query(`
19
+ CREATE TABLE IF NOT EXISTS oauth_clients (
20
+ client_id text PRIMARY KEY,
21
+ client jsonb NOT NULL,
22
+ created_at timestamptz NOT NULL DEFAULT now()
23
+ )
24
+ `);
25
+ await this.#pool.query(`
26
+ CREATE TABLE IF NOT EXISTS oauth_pending_authorizations (
27
+ state text PRIMARY KEY,
28
+ client_id text NOT NULL,
29
+ redirect_uri text NOT NULL,
30
+ code_challenge text NOT NULL,
31
+ client_state text,
32
+ resource text NOT NULL,
33
+ scope text,
34
+ expires_at timestamptz NOT NULL
35
+ )
36
+ `);
37
+ await this.#pool.query(`
38
+ CREATE TABLE IF NOT EXISTS oauth_authorization_codes (
39
+ code text PRIMARY KEY,
40
+ client_id text NOT NULL,
41
+ code_challenge text NOT NULL,
42
+ redirect_uri text NOT NULL,
43
+ resource text NOT NULL,
44
+ owner_subject text NOT NULL,
45
+ owner_email text,
46
+ scope text,
47
+ expires_at timestamptz NOT NULL
48
+ )
49
+ `);
50
+ await this.#pool.query(`
51
+ CREATE TABLE IF NOT EXISTS oauth_refresh_tokens (
52
+ token text PRIMARY KEY,
53
+ client_id text NOT NULL,
54
+ owner_subject text NOT NULL,
55
+ owner_email text,
56
+ resource text NOT NULL,
57
+ scope text,
58
+ expires_at timestamptz NOT NULL
59
+ )
60
+ `);
61
+ }
62
+ async getClient(clientId) {
63
+ const { rows } = await this.#pool.query('SELECT client FROM oauth_clients WHERE client_id = $1', [clientId]);
64
+ return rows[0]?.client;
65
+ }
66
+ async putClient(client) {
67
+ await this.#pool.query(`INSERT INTO oauth_clients (client_id, client) VALUES ($1, $2::jsonb)
68
+ ON CONFLICT (client_id) DO UPDATE SET client = EXCLUDED.client`, [client.client_id, JSON.stringify(client)]);
69
+ return client;
70
+ }
71
+ async createPendingAuthorization(record) {
72
+ await this.#pool.query(`INSERT INTO oauth_pending_authorizations
73
+ (state, client_id, redirect_uri, code_challenge, client_state, resource, scope, expires_at)
74
+ VALUES ($1, $2, $3, $4, $5, $6, $7, to_timestamp($8))`, [
75
+ record.state,
76
+ record.clientId,
77
+ record.redirectUri,
78
+ record.codeChallenge,
79
+ record.clientState ?? null,
80
+ record.resource,
81
+ record.scope ?? null,
82
+ record.expiresAt,
83
+ ]);
84
+ }
85
+ async consumePendingAuthorization(state) {
86
+ const { rows } = await this.#pool.query('DELETE FROM oauth_pending_authorizations WHERE state = $1 RETURNING *', [state]);
87
+ const row = rows[0];
88
+ if (!row || !live(row.expires_at))
89
+ return undefined;
90
+ return {
91
+ state: row.state,
92
+ clientId: row.client_id,
93
+ redirectUri: row.redirect_uri,
94
+ codeChallenge: row.code_challenge,
95
+ ...(row.client_state !== null ? { clientState: row.client_state } : {}),
96
+ resource: row.resource,
97
+ ...(row.scope !== null ? { scope: row.scope } : {}),
98
+ expiresAt: epochSeconds(row.expires_at),
99
+ };
100
+ }
101
+ async createAuthorizationCode(record) {
102
+ await this.#pool.query(`INSERT INTO oauth_authorization_codes
103
+ (code, client_id, code_challenge, redirect_uri, resource, owner_subject, owner_email, scope, expires_at)
104
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, to_timestamp($9))`, [
105
+ record.code,
106
+ record.clientId,
107
+ record.codeChallenge,
108
+ record.redirectUri,
109
+ record.resource,
110
+ record.ownerSubject,
111
+ record.ownerEmail ?? null,
112
+ record.scope ?? null,
113
+ record.expiresAt,
114
+ ]);
115
+ }
116
+ async getAuthorizationCode(code) {
117
+ const { rows } = await this.#pool.query('SELECT * FROM oauth_authorization_codes WHERE code = $1 AND expires_at > now()', [code]);
118
+ const row = rows[0];
119
+ return row ? authCodeRowToRecord(row) : undefined;
120
+ }
121
+ async redeemAuthorizationCode(code) {
122
+ const { rows } = await this.#pool.query('DELETE FROM oauth_authorization_codes WHERE code = $1 RETURNING *', [code]);
123
+ const row = rows[0];
124
+ if (!row || !live(row.expires_at))
125
+ return undefined;
126
+ return authCodeRowToRecord(row);
127
+ }
128
+ async createRefreshToken(record) {
129
+ await this.#pool.query(`INSERT INTO oauth_refresh_tokens
130
+ (token, client_id, owner_subject, owner_email, resource, scope, expires_at)
131
+ VALUES ($1, $2, $3, $4, $5, $6, to_timestamp($7))`, [
132
+ record.token,
133
+ record.clientId,
134
+ record.ownerSubject,
135
+ record.ownerEmail ?? null,
136
+ record.resource,
137
+ record.scope ?? null,
138
+ record.expiresAt,
139
+ ]);
140
+ }
141
+ async consumeRefreshToken(token) {
142
+ const { rows } = await this.#pool.query('DELETE FROM oauth_refresh_tokens WHERE token = $1 RETURNING *', [token]);
143
+ const row = rows[0];
144
+ if (!row || !live(row.expires_at))
145
+ return undefined;
146
+ return {
147
+ token: row.token,
148
+ clientId: row.client_id,
149
+ ownerSubject: row.owner_subject,
150
+ ...(row.owner_email !== null ? { ownerEmail: row.owner_email } : {}),
151
+ resource: row.resource,
152
+ ...(row.scope !== null ? { scope: row.scope } : {}),
153
+ expiresAt: epochSeconds(row.expires_at),
154
+ };
155
+ }
156
+ }
157
+ function authCodeRowToRecord(row) {
158
+ return {
159
+ code: row.code,
160
+ clientId: row.client_id,
161
+ codeChallenge: row.code_challenge,
162
+ redirectUri: row.redirect_uri,
163
+ resource: row.resource,
164
+ ownerSubject: row.owner_subject,
165
+ ...(row.owner_email !== null ? { ownerEmail: row.owner_email } : {}),
166
+ ...(row.scope !== null ? { scope: row.scope } : {}),
167
+ expiresAt: epochSeconds(row.expires_at),
168
+ };
169
+ }
170
+ function epochSeconds(date) {
171
+ return Math.floor(new Date(date).getTime() / 1000);
172
+ }
173
+ function live(expiresAt) {
174
+ return new Date(expiresAt).getTime() > Date.now();
175
+ }
176
+ //# sourceMappingURL=store-postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-postgres.js","sourceRoot":"","sources":["../../src/oauth/store-postgres.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import type { OAuthClientInformationFull } from '@modelcontextprotocol/sdk/shared/auth.js';
2
+ /**
3
+ * Durable state for the self-hosted OAuth authorization server (OA-2,
4
+ * [ADR 0042](../../../../docs/decisions/0042-self-hosted-oauth-authorization-server.md)). All four record
5
+ * kinds are short-lived OAuth state that must be **multi-instance-safe** (any Cloud Run instance can complete
6
+ * a flow another instance started — [ADR 0036](../../../../docs/decisions/0036-stateless-registry-lazy-recompile.md)),
7
+ * so they live in the shared store, not process memory.
8
+ *
9
+ * Opaque secrets (authorization codes, refresh tokens, the Google-leg `state` nonce) are keyed by their
10
+ * **hash** — the caller hashes the raw value and passes only the hash here, so a store dump never yields a
11
+ * usable credential. This module is the dumb keyed store; entropy, hashing, and TTL policy live in the
12
+ * provider layer.
13
+ */
14
+ /** A PKCE-bound, single-use authorization code (the `code` field is the hash of the raw code). */
15
+ export interface AuthorizationCodeRecord {
16
+ readonly code: string;
17
+ readonly clientId: string;
18
+ /** PKCE `code_challenge` (S256). Validated by the SDK token handler before redemption. */
19
+ readonly codeChallenge: string;
20
+ readonly redirectUri: string;
21
+ /** Canonical tenant MCP URL the resulting token is bound to (RFC 8707 audience). */
22
+ readonly resource: string;
23
+ /** The authenticated owner's Google subject. */
24
+ readonly ownerSubject: string;
25
+ readonly ownerEmail?: string;
26
+ readonly scope?: string;
27
+ /** Expiry, epoch seconds. */
28
+ readonly expiresAt: number;
29
+ }
30
+ /** State carried across the "Sign in with Google" round-trip (`state` is the hash of the Google `state` nonce). */
31
+ export interface PendingAuthorizationRecord {
32
+ readonly state: string;
33
+ readonly clientId: string;
34
+ readonly redirectUri: string;
35
+ readonly codeChallenge: string;
36
+ /** The MCP client's own `state`, echoed back on the final redirect. */
37
+ readonly clientState?: string;
38
+ readonly resource: string;
39
+ readonly scope?: string;
40
+ readonly expiresAt: number;
41
+ }
42
+ /** A rotating, revocable refresh token (`token` is the hash of the raw refresh token). */
43
+ export interface RefreshTokenRecord {
44
+ readonly token: string;
45
+ readonly clientId: string;
46
+ readonly ownerSubject: string;
47
+ readonly ownerEmail?: string;
48
+ readonly resource: string;
49
+ readonly scope?: string;
50
+ readonly expiresAt: number;
51
+ }
52
+ export interface OAuthStore {
53
+ /** Dynamic client registration (RFC 7591): persist + read the SDK-generated client info. */
54
+ getClient(clientId: string): Promise<OAuthClientInformationFull | undefined>;
55
+ putClient(client: OAuthClientInformationFull): Promise<OAuthClientInformationFull>;
56
+ /** Pending authorization (single-use): created in `authorize`, consumed in the Google callback. */
57
+ createPendingAuthorization(record: PendingAuthorizationRecord): Promise<void>;
58
+ consumePendingAuthorization(state: string): Promise<PendingAuthorizationRecord | undefined>;
59
+ /** Authorization code: created after consent, read non-destructively for the PKCE challenge, then redeemed once. */
60
+ createAuthorizationCode(record: AuthorizationCodeRecord): Promise<void>;
61
+ getAuthorizationCode(code: string): Promise<AuthorizationCodeRecord | undefined>;
62
+ /** Atomic single-use redeem — returns the record only on the first call for a live, unredeemed code. */
63
+ redeemAuthorizationCode(code: string): Promise<AuthorizationCodeRecord | undefined>;
64
+ /** Refresh token: created on token issuance, consumed once on rotation (reuse → `undefined`). */
65
+ createRefreshToken(record: RefreshTokenRecord): Promise<void>;
66
+ consumeRefreshToken(token: string): Promise<RefreshTokenRecord | undefined>;
67
+ }
68
+ /**
69
+ * In-memory {@link OAuthStore} for tests and non-persistent dev. Single-use operations are atomic by
70
+ * construction: the check-and-delete runs synchronously (no `await` between read and mutation), so two
71
+ * concurrent redemptions of the same code/token resolve with exactly one winner.
72
+ */
73
+ export declare class InMemoryOAuthStore implements OAuthStore {
74
+ #private;
75
+ getClient(clientId: string): Promise<OAuthClientInformationFull | undefined>;
76
+ putClient(client: OAuthClientInformationFull): Promise<OAuthClientInformationFull>;
77
+ createPendingAuthorization(record: PendingAuthorizationRecord): Promise<void>;
78
+ consumePendingAuthorization(state: string): Promise<PendingAuthorizationRecord | undefined>;
79
+ createAuthorizationCode(record: AuthorizationCodeRecord): Promise<void>;
80
+ getAuthorizationCode(code: string): Promise<AuthorizationCodeRecord | undefined>;
81
+ redeemAuthorizationCode(code: string): Promise<AuthorizationCodeRecord | undefined>;
82
+ createRefreshToken(record: RefreshTokenRecord): Promise<void>;
83
+ consumeRefreshToken(token: string): Promise<RefreshTokenRecord | undefined>;
84
+ }
85
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/oauth/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ function live(expiresAt) {
2
+ return expiresAt * 1000 > Date.now();
3
+ }
4
+ /**
5
+ * In-memory {@link OAuthStore} for tests and non-persistent dev. Single-use operations are atomic by
6
+ * construction: the check-and-delete runs synchronously (no `await` between read and mutation), so two
7
+ * concurrent redemptions of the same code/token resolve with exactly one winner.
8
+ */
9
+ export class InMemoryOAuthStore {
10
+ #clients = new Map();
11
+ #pending = new Map();
12
+ #codes = new Map();
13
+ #refresh = new Map();
14
+ getClient(clientId) {
15
+ return Promise.resolve(this.#clients.get(clientId));
16
+ }
17
+ putClient(client) {
18
+ this.#clients.set(client.client_id, client);
19
+ return Promise.resolve(client);
20
+ }
21
+ createPendingAuthorization(record) {
22
+ this.#pending.set(record.state, record);
23
+ return Promise.resolve();
24
+ }
25
+ consumePendingAuthorization(state) {
26
+ const record = this.#pending.get(state);
27
+ this.#pending.delete(state); // single-use: gone whether or not it was still live
28
+ return Promise.resolve(record && live(record.expiresAt) ? record : undefined);
29
+ }
30
+ createAuthorizationCode(record) {
31
+ this.#codes.set(record.code, record);
32
+ return Promise.resolve();
33
+ }
34
+ getAuthorizationCode(code) {
35
+ const record = this.#codes.get(code);
36
+ return Promise.resolve(record && live(record.expiresAt) ? record : undefined);
37
+ }
38
+ redeemAuthorizationCode(code) {
39
+ const record = this.#codes.get(code);
40
+ if (record === undefined)
41
+ return Promise.resolve(undefined);
42
+ this.#codes.delete(code); // atomic single-use: the second concurrent redeem sees nothing
43
+ return Promise.resolve(live(record.expiresAt) ? record : undefined);
44
+ }
45
+ createRefreshToken(record) {
46
+ this.#refresh.set(record.token, record);
47
+ return Promise.resolve();
48
+ }
49
+ consumeRefreshToken(token) {
50
+ const record = this.#refresh.get(token);
51
+ if (record === undefined)
52
+ return Promise.resolve(undefined);
53
+ this.#refresh.delete(token); // rotation: a refresh token is single-use; reuse → undefined
54
+ return Promise.resolve(live(record.expiresAt) ? record : undefined);
55
+ }
56
+ }
57
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/oauth/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** A high-entropy (256-bit) opaque token — used for authorization codes, refresh tokens, and the Google `state` nonce. */
2
+ export declare function randomToken(): string;
3
+ /**
4
+ * SHA-256 hash (hex) of an opaque token. The authorization server stores only the hash, so a store dump
5
+ * never yields a usable credential; the raw value is returned to the client and re-hashed on lookup.
6
+ */
7
+ export declare function hashToken(raw: string): string;
8
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/oauth/tokens.ts"],"names":[],"mappings":"AAEA,0HAA0H;AAC1H,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C"}
@@ -0,0 +1,13 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ /** A high-entropy (256-bit) opaque token — used for authorization codes, refresh tokens, and the Google `state` nonce. */
3
+ export function randomToken() {
4
+ return randomBytes(32).toString('base64url');
5
+ }
6
+ /**
7
+ * SHA-256 hash (hex) of an opaque token. The authorization server stores only the hash, so a store dump
8
+ * never yields a usable credential; the raw value is returned to the client and re-hashed on lookup.
9
+ */
10
+ export function hashToken(raw) {
11
+ return createHash('sha256').update(raw).digest('hex');
12
+ }
13
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/oauth/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD,0HAA0H;AAC1H,MAAM,UAAU,WAAW;IACzB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { WrappingMasterKey } from '@noodle-borg/runtime';
2
+ /**
3
+ * Cloud KMS master-key (KEK) custodian (ADR 0037). The KEK never leaves KMS: this adapter only asks KMS to
4
+ * **wrap/unwrap** a per-record 32-byte data key (DEK), which `SecretBox` uses for v2 envelope encryption.
5
+ *
6
+ * Lives in `service` (not `runtime`) so the heavy `@google-cloud/kms` SDK stays out of the runtime/CLI
7
+ * dependency graph; `serveService` dynamic-imports this module only when a KMS key is configured, and the
8
+ * SDK itself is loaded lazily on the first wrap/unwrap (or never, when a `client` is injected in tests).
9
+ */
10
+ export interface GcpKmsConfig {
11
+ /**
12
+ * Cloud KMS **cryptoKey** resource name: `projects/P/locations/L/keyRings/R/cryptoKeys/K`. Symmetric
13
+ * encrypt/decrypt operate on the cryptoKey (not a version) — KMS uses the primary version to encrypt and
14
+ * auto-selects the version to decrypt, so this is rotation-safe (old ciphertexts keep decrypting).
15
+ */
16
+ readonly keyName: string;
17
+ /** Injected client (tests). Defaults to a real `KeyManagementServiceClient`, lazily imported. */
18
+ readonly client?: KmsClient;
19
+ }
20
+ /** The slice of the Cloud KMS client this adapter uses. Lets tests inject a fake (no SDK, no network). */
21
+ export interface KmsClient {
22
+ encrypt(request: {
23
+ name: string;
24
+ plaintext: Buffer;
25
+ }): Promise<[{
26
+ ciphertext?: Uint8Array | string | null;
27
+ }, ...unknown[]]>;
28
+ decrypt(request: {
29
+ name: string;
30
+ ciphertext: Buffer;
31
+ }): Promise<[{
32
+ plaintext?: Uint8Array | string | null;
33
+ }, ...unknown[]]>;
34
+ }
35
+ export declare function gcpKmsMasterKeyProvider(config: GcpKmsConfig): WrappingMasterKey;
36
+ //# sourceMappingURL=kms-master-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kms-master-key.d.ts","sourceRoot":"","sources":["../../src/secret/kms-master-key.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iGAAiG;IACjG,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;CAC7B;AAED,0GAA0G;AAC1G,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,OAAO,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,CAAC;QAAE,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,OAAO,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,CAAC;QAAE,SAAS,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;CACzE;AAWD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,iBAAiB,CAsC/E"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Build a {@link WrappingMasterKey} backed by Cloud KMS. `wrapDek`/`unwrapDek` call KMS
3
+ * `encrypt`/`decrypt` on the configured cryptoKey; `keyId` records that cryptoKey name in each sealed
4
+ * record. A decrypt that returns anything other than 32 bytes is rejected (defends against a misconfigured
5
+ * key wrapping the wrong material).
6
+ */
7
+ /** A Cloud KMS cryptoKey resource name: `projects/P/locations/L/keyRings/R/cryptoKeys/K` (version optional). */
8
+ const CRYPTO_KEY_NAME = /^projects\/[^/]+\/locations\/[^/]+\/keyRings\/[^/]+\/cryptoKeys\/[^/]+/;
9
+ export function gcpKmsMasterKeyProvider(config) {
10
+ const name = config.keyName;
11
+ // Fail closed at construction (symmetry with `staticMasterKeyProvider`): a misconfigured KMS key must
12
+ // crash boot, not defer to an opaque per-deploy decrypt failure after the service is already serving.
13
+ if (!CRYPTO_KEY_NAME.test(name.trim())) {
14
+ throw new Error('Cloud KMS key name must be a cryptoKey resource ' +
15
+ '(projects/<p>/locations/<l>/keyRings/<r>/cryptoKeys/<k>)');
16
+ }
17
+ let clientPromise;
18
+ const getClient = () => {
19
+ if (config.client)
20
+ return Promise.resolve(config.client);
21
+ // Lazy: the SDK loads only on first real use, never in injected-client (test) paths.
22
+ clientPromise ??= import('@google-cloud/kms').then((m) => new m.KeyManagementServiceClient());
23
+ return clientPromise;
24
+ };
25
+ return {
26
+ kind: 'wrapping',
27
+ keyId: name,
28
+ async wrapDek(dek) {
29
+ const client = await getClient();
30
+ const [res] = await client.encrypt({ name, plaintext: dek });
31
+ return toBuffer(res.ciphertext, 'encrypt ciphertext');
32
+ },
33
+ async unwrapDek(wrapped) {
34
+ const client = await getClient();
35
+ const [res] = await client.decrypt({ name, ciphertext: wrapped });
36
+ const dek = toBuffer(res.plaintext, 'decrypt plaintext');
37
+ if (dek.length !== 32) {
38
+ throw new Error('Cloud KMS decrypt returned a non-32-byte data key');
39
+ }
40
+ return dek;
41
+ },
42
+ };
43
+ }
44
+ /** Coerce a KMS payload (Buffer/Uint8Array in gRPC; base64 string in REST) to a non-empty Buffer. */
45
+ function toBuffer(value, what) {
46
+ // `.length === 0` catches the empty-string (REST `""`) and zero-length-buffer shapes too, not just null.
47
+ if (value == null || value.length === 0)
48
+ throw new Error(`Cloud KMS ${what} was empty`);
49
+ return typeof value === 'string' ? Buffer.from(value, 'base64') : Buffer.from(value);
50
+ }
51
+ //# sourceMappingURL=kms-master-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kms-master-key.js","sourceRoot":"","sources":["../../src/secret/kms-master-key.ts"],"names":[],"mappings":"AAiCA;;;;;GAKG;AACH,gHAAgH;AAChH,MAAM,eAAe,GAAG,wEAAwE,CAAC;AAEjG,MAAM,UAAU,uBAAuB,CAAC,MAAoB;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAC5B,sGAAsG;IACtG,sGAAsG;IACtG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,kDAAkD;YAChD,0DAA0D,CAC7D,CAAC;IACJ,CAAC;IACD,IAAI,aAA6C,CAAC;IAClD,MAAM,SAAS,GAAG,GAAuB,EAAE;QACzC,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzD,qFAAqF;QACrF,aAAa,KAAK,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,0BAA0B,EAA0B,CAClE,CAAC;QACF,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,IAAI;QACX,KAAK,CAAC,OAAO,CAAC,GAAG;YACf,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7D,OAAO,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,OAAO;YACrB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;YAClE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;YACzD,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,SAAS,QAAQ,CAAC,KAA6C,EAAE,IAAY;IAC3E,yGAAyG;IACzG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,YAAY,CAAC,CAAC;IACxF,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC"}