@noodleseed/one 0.33.0 → 0.34.1

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 (255) hide show
  1. package/LICENSE +27 -1
  2. package/NOTICE +4 -0
  3. package/dist/assistant-embed-scaffold-template.d.ts +10 -0
  4. package/dist/assistant-embed-scaffold-template.d.ts.map +1 -0
  5. package/dist/assistant-embed-scaffold-template.js +74 -0
  6. package/dist/assistant-embed-scaffold-template.js.map +1 -0
  7. package/dist/bin.js +0 -0
  8. package/dist/commands/assistant-embed-ops.d.ts +2 -0
  9. package/dist/commands/assistant-embed-ops.d.ts.map +1 -0
  10. package/dist/commands/assistant-embed-ops.js +87 -0
  11. package/dist/commands/assistant-embed-ops.js.map +1 -0
  12. package/dist/commands/assistant-ops.d.ts.map +1 -1
  13. package/dist/commands/assistant-ops.js +36 -2
  14. package/dist/commands/assistant-ops.js.map +1 -1
  15. package/dist/commands/catalog-data-resources.d.ts.map +1 -1
  16. package/dist/commands/catalog-data-resources.js +11 -0
  17. package/dist/commands/catalog-data-resources.js.map +1 -1
  18. package/dist/commands/deploy-ops.d.ts +2 -0
  19. package/dist/commands/deploy-ops.d.ts.map +1 -1
  20. package/dist/commands/deploy-ops.js +18 -0
  21. package/dist/commands/deploy-ops.js.map +1 -1
  22. package/dist/commands/mcp-apps.d.ts.map +1 -1
  23. package/dist/commands/mcp-apps.js +40 -8
  24. package/dist/commands/mcp-apps.js.map +1 -1
  25. package/dist/commands/project-setup.d.ts +2 -2
  26. package/dist/commands/project-setup.d.ts.map +1 -1
  27. package/dist/commands/project-setup.js +5 -4
  28. package/dist/commands/project-setup.js.map +1 -1
  29. package/dist/control-plane.d.ts.map +1 -1
  30. package/dist/control-plane.js +2 -0
  31. package/dist/control-plane.js.map +1 -1
  32. package/dist/deploy.d.ts +2 -1
  33. package/dist/deploy.d.ts.map +1 -1
  34. package/dist/deploy.js +56 -39
  35. package/dist/deploy.js.map +1 -1
  36. package/dist/first-run.js +1 -1
  37. package/dist/first-run.js.map +1 -1
  38. package/dist/openapi-import.d.ts.map +1 -1
  39. package/dist/openapi-import.js +6 -1
  40. package/dist/openapi-import.js.map +1 -1
  41. package/dist/project-scaffold-templates.d.ts.map +1 -1
  42. package/dist/project-scaffold-templates.js +10 -3
  43. package/dist/project-scaffold-templates.js.map +1 -1
  44. package/dist/project.d.ts.map +1 -1
  45. package/dist/project.js +3 -1
  46. package/dist/project.js.map +1 -1
  47. package/dist/widget-focused-template.d.ts +4 -0
  48. package/dist/widget-focused-template.d.ts.map +1 -0
  49. package/dist/widget-focused-template.js +75 -0
  50. package/dist/widget-focused-template.js.map +1 -0
  51. package/dist/widget-scaffold-template.d.ts +1 -1
  52. package/dist/widget-scaffold-template.d.ts.map +1 -1
  53. package/dist/widget-scaffold-template.js +129 -41
  54. package/dist/widget-scaffold-template.js.map +1 -1
  55. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.d.ts.map +1 -1
  56. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +1 -0
  57. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js.map +1 -1
  58. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +7 -7
  59. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
  60. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
  61. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +1 -0
  62. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
  63. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.d.ts.map +1 -1
  64. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +32 -22
  65. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js.map +1 -1
  66. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.d.ts.map +1 -1
  67. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +6 -3
  68. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js.map +1 -1
  69. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.d.ts +3 -0
  70. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.d.ts.map +1 -0
  71. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js +214 -0
  72. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js.map +1 -0
  73. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.d.ts.map +1 -1
  74. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js +5 -0
  75. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js.map +1 -1
  76. package/node_modules/@noodle-borg/agent-kit/package.json +2 -1
  77. package/node_modules/@noodle-borg/auth/package.json +1 -0
  78. package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts +11 -0
  79. package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts.map +1 -1
  80. package/node_modules/@noodle-borg/authoring/dist/assistant.js +2 -1
  81. package/node_modules/@noodle-borg/authoring/dist/assistant.js.map +1 -1
  82. package/node_modules/@noodle-borg/authoring/dist/customer-auth.d.ts +5 -5
  83. package/node_modules/@noodle-borg/authoring/dist/customer-auth.d.ts.map +1 -1
  84. package/node_modules/@noodle-borg/authoring/dist/customer-auth.js +11 -5
  85. package/node_modules/@noodle-borg/authoring/dist/customer-auth.js.map +1 -1
  86. package/node_modules/@noodle-borg/authoring/dist/react/components.d.ts +1 -1
  87. package/node_modules/@noodle-borg/authoring/dist/react/components.d.ts.map +1 -1
  88. package/node_modules/@noodle-borg/authoring/dist/react/components.js +1 -1
  89. package/node_modules/@noodle-borg/authoring/dist/react/components.js.map +1 -1
  90. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +0 -1
  91. package/node_modules/@noodle-borg/authoring/dist/server.d.ts.map +1 -1
  92. package/node_modules/@noodle-borg/authoring/dist/server.js +4 -2
  93. package/node_modules/@noodle-borg/authoring/dist/server.js.map +1 -1
  94. package/node_modules/@noodle-borg/authoring/package.json +1 -0
  95. package/node_modules/@noodle-borg/capabilities/package.json +1 -0
  96. package/node_modules/@noodle-borg/compiler/dist/artifact/consent.d.ts +8 -0
  97. package/node_modules/@noodle-borg/compiler/dist/artifact/consent.d.ts.map +1 -0
  98. package/node_modules/@noodle-borg/compiler/dist/artifact/consent.js +12 -0
  99. package/node_modules/@noodle-borg/compiler/dist/artifact/consent.js.map +1 -0
  100. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +3 -1
  101. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts.map +1 -1
  102. package/node_modules/@noodle-borg/compiler/dist/compile.d.ts.map +1 -1
  103. package/node_modules/@noodle-borg/compiler/dist/compile.js +48 -3
  104. package/node_modules/@noodle-borg/compiler/dist/compile.js.map +1 -1
  105. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +1 -1
  106. package/node_modules/@noodle-borg/compiler/dist/errors.d.ts.map +1 -1
  107. package/node_modules/@noodle-borg/compiler/dist/fulfilment-emit.d.ts.map +1 -1
  108. package/node_modules/@noodle-borg/compiler/dist/fulfilment-emit.js +1 -4
  109. package/node_modules/@noodle-borg/compiler/dist/fulfilment-emit.js.map +1 -1
  110. package/node_modules/@noodle-borg/compiler/dist/fulfilment-structural.d.ts +7 -9
  111. package/node_modules/@noodle-borg/compiler/dist/fulfilment-structural.d.ts.map +1 -1
  112. package/node_modules/@noodle-borg/compiler/dist/fulfilment-structural.js +8 -18
  113. package/node_modules/@noodle-borg/compiler/dist/fulfilment-structural.js.map +1 -1
  114. package/node_modules/@noodle-borg/compiler/dist/index.d.ts +2 -1
  115. package/node_modules/@noodle-borg/compiler/dist/index.d.ts.map +1 -1
  116. package/node_modules/@noodle-borg/compiler/dist/index.js +2 -1
  117. package/node_modules/@noodle-borg/compiler/dist/index.js.map +1 -1
  118. package/node_modules/@noodle-borg/compiler/dist/manifest/csp-origins.js +2 -2
  119. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +4 -5
  120. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts.map +1 -1
  121. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +25 -8
  122. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js.map +1 -1
  123. package/node_modules/@noodle-borg/compiler/dist/schema-validation.d.ts +9 -0
  124. package/node_modules/@noodle-borg/compiler/dist/schema-validation.d.ts.map +1 -1
  125. package/node_modules/@noodle-borg/compiler/dist/schema-validation.js +42 -0
  126. package/node_modules/@noodle-borg/compiler/dist/schema-validation.js.map +1 -1
  127. package/node_modules/@noodle-borg/compiler/package.json +1 -0
  128. package/node_modules/@noodle-borg/compute/package.json +1 -0
  129. package/node_modules/@noodle-borg/connector-defs/package.json +1 -0
  130. package/node_modules/@noodle-borg/connector-http/package.json +1 -0
  131. package/node_modules/@noodle-borg/module/package.json +1 -0
  132. package/node_modules/@noodle-borg/module-audit/package.json +1 -0
  133. package/node_modules/@noodle-borg/openapi-import/dist/index.js +1 -1
  134. package/node_modules/@noodle-borg/openapi-import/dist/index.js.map +1 -1
  135. package/node_modules/@noodle-borg/openapi-import/package.json +1 -0
  136. package/node_modules/@noodle-borg/protocol/dist/input-validation.d.ts +9 -0
  137. package/node_modules/@noodle-borg/protocol/dist/input-validation.d.ts.map +1 -1
  138. package/node_modules/@noodle-borg/protocol/dist/input-validation.js +13 -1
  139. package/node_modules/@noodle-borg/protocol/dist/input-validation.js.map +1 -1
  140. package/node_modules/@noodle-borg/protocol/dist/sdk-server.js +8 -5
  141. package/node_modules/@noodle-borg/protocol/dist/sdk-server.js.map +1 -1
  142. package/node_modules/@noodle-borg/protocol/package.json +1 -0
  143. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +7 -0
  144. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts.map +1 -1
  145. package/node_modules/@noodle-borg/runtime/dist/connector/types.js.map +1 -1
  146. package/node_modules/@noodle-borg/runtime/package.json +1 -0
  147. package/node_modules/@noodle-borg/service/dist/assistant-model-stream.d.ts +19 -0
  148. package/node_modules/@noodle-borg/service/dist/assistant-model-stream.d.ts.map +1 -0
  149. package/node_modules/@noodle-borg/service/dist/assistant-model-stream.js +84 -0
  150. package/node_modules/@noodle-borg/service/dist/assistant-model-stream.js.map +1 -0
  151. package/node_modules/@noodle-borg/service/dist/assistant-store.d.ts +2 -0
  152. package/node_modules/@noodle-borg/service/dist/assistant-store.d.ts.map +1 -1
  153. package/node_modules/@noodle-borg/service/dist/assistant-store.js +11 -0
  154. package/node_modules/@noodle-borg/service/dist/assistant-store.js.map +1 -1
  155. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts +4 -0
  156. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts.map +1 -1
  157. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js +10 -1
  158. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js.map +1 -1
  159. package/node_modules/@noodle-borg/service/dist/build-info.d.ts +9 -0
  160. package/node_modules/@noodle-borg/service/dist/build-info.d.ts.map +1 -1
  161. package/node_modules/@noodle-borg/service/dist/build-info.js +50 -0
  162. package/node_modules/@noodle-borg/service/dist/build-info.js.map +1 -1
  163. package/node_modules/@noodle-borg/service/dist/client-compatibility.d.ts +5 -0
  164. package/node_modules/@noodle-borg/service/dist/client-compatibility.d.ts.map +1 -0
  165. package/node_modules/@noodle-borg/service/dist/client-compatibility.js +12 -0
  166. package/node_modules/@noodle-borg/service/dist/client-compatibility.js.map +1 -0
  167. package/node_modules/@noodle-borg/service/dist/index.d.ts +3 -1
  168. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  169. package/node_modules/@noodle-borg/service/dist/index.js +2 -0
  170. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  171. package/node_modules/@noodle-borg/service/dist/main.js +8 -0
  172. package/node_modules/@noodle-borg/service/dist/main.js.map +1 -1
  173. package/node_modules/@noodle-borg/service/dist/manifest-normalize.d.ts.map +1 -1
  174. package/node_modules/@noodle-borg/service/dist/manifest-normalize.js +13 -0
  175. package/node_modules/@noodle-borg/service/dist/manifest-normalize.js.map +1 -1
  176. package/node_modules/@noodle-borg/service/dist/options.d.ts +7 -0
  177. package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
  178. package/node_modules/@noodle-borg/service/dist/personal-workspace.d.ts +1 -0
  179. package/node_modules/@noodle-borg/service/dist/personal-workspace.d.ts.map +1 -1
  180. package/node_modules/@noodle-borg/service/dist/personal-workspace.js +4 -5
  181. package/node_modules/@noodle-borg/service/dist/personal-workspace.js.map +1 -1
  182. package/node_modules/@noodle-borg/service/dist/routes/access-mode.d.ts.map +1 -1
  183. package/node_modules/@noodle-borg/service/dist/routes/access-mode.js +2 -6
  184. package/node_modules/@noodle-borg/service/dist/routes/access-mode.js.map +1 -1
  185. package/node_modules/@noodle-borg/service/dist/routes/assets.d.ts +6 -2
  186. package/node_modules/@noodle-borg/service/dist/routes/assets.d.ts.map +1 -1
  187. package/node_modules/@noodle-borg/service/dist/routes/assets.js +12 -52
  188. package/node_modules/@noodle-borg/service/dist/routes/assets.js.map +1 -1
  189. package/node_modules/@noodle-borg/service/dist/routes/assistant-dispatch.d.ts.map +1 -1
  190. package/node_modules/@noodle-borg/service/dist/routes/assistant-dispatch.js +7 -2
  191. package/node_modules/@noodle-borg/service/dist/routes/assistant-dispatch.js.map +1 -1
  192. package/node_modules/@noodle-borg/service/dist/routes/assistant.d.ts +1 -0
  193. package/node_modules/@noodle-borg/service/dist/routes/assistant.d.ts.map +1 -1
  194. package/node_modules/@noodle-borg/service/dist/routes/assistant.js +224 -46
  195. package/node_modules/@noodle-borg/service/dist/routes/assistant.js.map +1 -1
  196. package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts.map +1 -1
  197. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +22 -27
  198. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js.map +1 -1
  199. package/node_modules/@noodle-borg/service/dist/routes/org-admin-dispatch.d.ts +3 -0
  200. package/node_modules/@noodle-borg/service/dist/routes/org-admin-dispatch.d.ts.map +1 -1
  201. package/node_modules/@noodle-borg/service/dist/routes/org-admin-dispatch.js +6 -1
  202. package/node_modules/@noodle-borg/service/dist/routes/org-admin-dispatch.js.map +1 -1
  203. package/node_modules/@noodle-borg/service/dist/routes/org-admin.d.ts +5 -1
  204. package/node_modules/@noodle-borg/service/dist/routes/org-admin.d.ts.map +1 -1
  205. package/node_modules/@noodle-borg/service/dist/routes/org-admin.js +31 -3
  206. package/node_modules/@noodle-borg/service/dist/routes/org-admin.js.map +1 -1
  207. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  208. package/node_modules/@noodle-borg/service/dist/serve.js +12 -0
  209. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  210. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  211. package/node_modules/@noodle-borg/service/dist/service.js +6 -3
  212. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  213. package/node_modules/@noodle-borg/service/dist/store/control-plane.d.ts +15 -1
  214. package/node_modules/@noodle-borg/service/dist/store/control-plane.d.ts.map +1 -1
  215. package/node_modules/@noodle-borg/service/dist/store/control-plane.js +81 -0
  216. package/node_modules/@noodle-borg/service/dist/store/control-plane.js.map +1 -1
  217. package/node_modules/@noodle-borg/service/dist/store/postgres-assistant.d.ts +1 -0
  218. package/node_modules/@noodle-borg/service/dist/store/postgres-assistant.d.ts.map +1 -1
  219. package/node_modules/@noodle-borg/service/dist/store/postgres-assistant.js +18 -0
  220. package/node_modules/@noodle-borg/service/dist/store/postgres-assistant.js.map +1 -1
  221. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.d.ts +15 -1
  222. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.d.ts.map +1 -1
  223. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.js +83 -0
  224. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.js.map +1 -1
  225. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts.map +1 -1
  226. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js +21 -0
  227. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js.map +1 -1
  228. package/node_modules/@noodle-borg/service/dist/store/postgres-signup.d.ts +22 -0
  229. package/node_modules/@noodle-borg/service/dist/store/postgres-signup.d.ts.map +1 -0
  230. package/node_modules/@noodle-borg/service/dist/store/postgres-signup.js +26 -0
  231. package/node_modules/@noodle-borg/service/dist/store/postgres-signup.js.map +1 -0
  232. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts +2 -1
  233. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts.map +1 -1
  234. package/node_modules/@noodle-borg/service/dist/store/postgres.js +10 -9
  235. package/node_modules/@noodle-borg/service/dist/store/postgres.js.map +1 -1
  236. package/node_modules/@noodle-borg/service/dist/store.d.ts +40 -0
  237. package/node_modules/@noodle-borg/service/dist/store.d.ts.map +1 -1
  238. package/node_modules/@noodle-borg/service/dist/store.js.map +1 -1
  239. package/node_modules/@noodle-borg/service/dist/welcome-email.d.ts +65 -0
  240. package/node_modules/@noodle-borg/service/dist/welcome-email.d.ts.map +1 -0
  241. package/node_modules/@noodle-borg/service/dist/welcome-email.js +243 -0
  242. package/node_modules/@noodle-borg/service/dist/welcome-email.js.map +1 -0
  243. package/node_modules/@noodle-borg/service/package.json +2 -0
  244. package/node_modules/@noodle-borg/transport-http/dist/examples/serve-demo.js +1 -1
  245. package/node_modules/@noodle-borg/transport-http/package.json +1 -0
  246. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts +26 -0
  247. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts.map +1 -0
  248. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.js +31 -0
  249. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.js.map +1 -0
  250. package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +261 -0
  251. package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts.map +1 -0
  252. package/node_modules/@noodle-borg/wire-contracts/dist/index.js +150 -0
  253. package/node_modules/@noodle-borg/wire-contracts/dist/index.js.map +1 -0
  254. package/node_modules/@noodle-borg/wire-contracts/package.json +31 -0
  255. package/package.json +7 -5
@@ -0,0 +1,65 @@
1
+ import type { Logger } from '@noodle-borg/transport-http';
2
+ import type { ControlPlaneStore, WelcomeEmailRecord } from './store.js';
3
+ export declare const WELCOME_EMAIL_SWEEP_INTERVAL_MS = 30000;
4
+ export interface RenderedWelcomeEmail {
5
+ readonly subject: string;
6
+ readonly text: string;
7
+ readonly html: string;
8
+ }
9
+ export declare function renderWelcomeEmail(input?: {
10
+ readonly firstName?: string;
11
+ }): RenderedWelcomeEmail;
12
+ export interface InvitationEmailContent {
13
+ readonly inviterEmail: string;
14
+ readonly orgName: string;
15
+ readonly role: 'owner' | 'developer';
16
+ readonly acceptUrl: string;
17
+ readonly expiresAt: string;
18
+ }
19
+ export declare function renderInvitationEmail(input: InvitationEmailContent): RenderedWelcomeEmail;
20
+ export interface InvitationEmailInput extends InvitationEmailContent {
21
+ readonly invitationId: string;
22
+ readonly email: string;
23
+ }
24
+ export interface InvitationEmailSender {
25
+ sendInvitation(input: InvitationEmailInput): Promise<{
26
+ readonly providerMessageId: string;
27
+ }>;
28
+ }
29
+ export interface WelcomeEmailSender {
30
+ send(input: Pick<WelcomeEmailRecord, 'subject' | 'email' | 'firstName'>): Promise<{
31
+ readonly providerMessageId: string;
32
+ }>;
33
+ }
34
+ export interface ResendEmailSenderOptions {
35
+ readonly apiKey: string;
36
+ readonly welcomeFrom: string;
37
+ readonly invitationFrom: string;
38
+ readonly welcomeReplyTo?: string;
39
+ readonly invitationReplyTo?: string;
40
+ readonly fetch?: typeof fetch;
41
+ }
42
+ export declare function resolveWelcomeEmailConfig(env: Readonly<Record<string, string | undefined>>): ResendEmailSenderOptions | undefined;
43
+ export declare class ResendEmailSender implements WelcomeEmailSender, InvitationEmailSender {
44
+ #private;
45
+ constructor(options: ResendEmailSenderOptions);
46
+ send(input: Pick<WelcomeEmailRecord, 'subject' | 'email' | 'firstName'>): Promise<{
47
+ readonly providerMessageId: string;
48
+ }>;
49
+ sendInvitation(input: InvitationEmailInput): Promise<{
50
+ readonly providerMessageId: string;
51
+ }>;
52
+ }
53
+ export interface WelcomeEmailWorkerOptions {
54
+ readonly store: ControlPlaneStore;
55
+ readonly sender: WelcomeEmailSender;
56
+ readonly clock?: () => Date;
57
+ readonly logger?: Logger;
58
+ }
59
+ export declare class WelcomeEmailWorker {
60
+ #private;
61
+ constructor(options: WelcomeEmailWorkerOptions);
62
+ runOnce(): Promise<void>;
63
+ }
64
+ export declare function startWelcomeEmailWorker(options: WelcomeEmailWorkerOptions): NodeJS.Timeout;
65
+ //# sourceMappingURL=welcome-email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome-email.d.ts","sourceRoot":"","sources":["../src/welcome-email.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,243 @@
1
+ import { createHash } from 'node:crypto';
2
+ const DOCS_URL = 'https://docs.noodleseed.dev/docs/quickstart';
3
+ const LOGO_URL = 'https://noodleseed.dev/noodle-seed-logo-light.svg';
4
+ const RESEND_ENDPOINT = 'https://api.resend.com/emails';
5
+ const DELIVERY_TIMEOUT_MS = 10_000;
6
+ const LEASE_MS = 30_000;
7
+ const BASE_RETRY_MS = 60_000;
8
+ const MAX_RETRY_MS = 24 * 60 * 60 * 1000;
9
+ const MAX_BATCH_SIZE = 25;
10
+ const DEFAULT_WELCOME_FROM = 'Asad <asad@noodleseed.com>';
11
+ const DEFAULT_INVITATION_FROM = 'Noodle Seed <hello@noodleseed.com>';
12
+ export const WELCOME_EMAIL_SWEEP_INTERVAL_MS = 30_000;
13
+ export function renderWelcomeEmail(input = {}) {
14
+ const subject = 'Welcome to Noodle Seed';
15
+ const greeting = input.firstName !== undefined ? `Hi ${plainText(input.firstName)},` : 'Hi,';
16
+ const text = `${greeting}
17
+
18
+ I'm Asad, founder of Noodle Seed. I wanted to personally welcome you to the developer platform.
19
+
20
+ We are building Noodle Seed so you can create and run production-grade AI apps, plugins, and MCP servers without stitching the infrastructure together yourself.
21
+
22
+ The quickest way to get started is here:
23
+ ${DOCS_URL}
24
+
25
+ If you get stuck, or simply want to share an idea, reply and tell me what you are building. I read every response.
26
+
27
+ Welcome aboard,
28
+ Asad - Co-Founder & CTO`;
29
+ const html = `<!doctype html>
30
+ <html lang="en">
31
+ <head>
32
+ <meta charset="utf-8">
33
+ <meta name="viewport" content="width=device-width, initial-scale=1">
34
+ <title>${subject}</title>
35
+ </head>
36
+ <body style="margin:0;background:#f4f2ed;color:#171714;font-family:Inter,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;">
37
+ <div style="display:none;max-height:0;overflow:hidden;opacity:0;">A personal welcome from Asad, founder of Noodle Seed.</div>
38
+ <table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="background:#f4f2ed;padding:32px 16px;">
39
+ <tr><td align="center">
40
+ <table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="max-width:600px;background:#ffffff;border:1px solid #dedbd3;border-radius:16px;">
41
+ <tr><td style="padding:40px 40px 18px;"><img src="${LOGO_URL}" width="200" height="31" alt="Noodle Seed" style="display:block;width:200px;max-width:100%;height:auto;"></td></tr>
42
+ <tr><td style="padding:0 40px 40px;">
43
+ <h1 style="margin:0 0 24px;font-size:30px;line-height:1.2;letter-spacing:-0.03em;">Welcome to Noodle Seed</h1>
44
+ <p style="margin:0 0 18px;font-size:16px;line-height:1.65;">${escapeHtml(greeting)}</p>
45
+ <p style="margin:0 0 18px;font-size:16px;line-height:1.65;">I'm Asad, founder of Noodle Seed. I wanted to personally welcome you to the developer platform.</p>
46
+ <p style="margin:0 0 26px;font-size:16px;line-height:1.65;">We are building Noodle Seed so you can create and run production-grade AI apps, plugins, and MCP servers without stitching the infrastructure together yourself.</p>
47
+ <a href="${DOCS_URL}" style="display:inline-block;background:#171714;color:#ffffff;text-decoration:none;font-size:15px;font-weight:650;padding:13px 20px;border-radius:999px;">Open the developer docs</a>
48
+ <p style="margin:28px 0 18px;font-size:16px;line-height:1.65;">If you get stuck, or simply want to share an idea, reply and tell me what you are building. I read every response.</p>
49
+ <p style="margin:0;font-size:16px;line-height:1.65;">Welcome aboard,<br><strong>Asad</strong> <span style="color:#6b685f;">- Co-Founder &amp; CTO</span></p>
50
+ </td></tr>
51
+ </table>
52
+ </td></tr>
53
+ </table>
54
+ </body>
55
+ </html>`;
56
+ return { subject, text, html };
57
+ }
58
+ export function renderInvitationEmail(input) {
59
+ const orgName = headerText(input.orgName);
60
+ const inviterEmail = headerText(input.inviterEmail);
61
+ const subject = `${displayNameFromEmail(inviterEmail)} invited you to ${orgName} on Noodle Seed`;
62
+ const text = `${inviterEmail} invited you to join ${orgName} as ${input.role} on Noodle Seed.
63
+
64
+ Accept invitation:
65
+ ${input.acceptUrl}
66
+
67
+ This invitation expires on ${input.expiresAt.slice(0, 10)}. If you were not expecting it, you can ignore this email.`;
68
+ const html = `<!doctype html>
69
+ <html lang="en">
70
+ <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>${escapeHtml(subject)}</title></head>
71
+ <body style="margin:0;background:#f4f2ed;color:#171714;font-family:Inter,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;">
72
+ <div style="display:none;max-height:0;overflow:hidden;opacity:0;">You have been invited to collaborate on Noodle Seed.</div>
73
+ <table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="background:#f4f2ed;padding:32px 16px;"><tr><td align="center">
74
+ <table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="max-width:600px;background:#ffffff;border:1px solid #dedbd3;border-radius:16px;">
75
+ <tr><td style="padding:40px 40px 18px;"><img src="${LOGO_URL}" width="200" height="31" alt="Noodle Seed" style="display:block;width:200px;max-width:100%;height:auto;"></td></tr>
76
+ <tr><td style="padding:0 40px 40px;">
77
+ <h1 style="margin:0 0 24px;font-size:30px;line-height:1.2;letter-spacing:-0.03em;">Join ${escapeHtml(orgName)}</h1>
78
+ <p style="margin:0 0 18px;font-size:16px;line-height:1.65;"><strong>${escapeHtml(inviterEmail)}</strong> invited you to join <strong>${escapeHtml(orgName)}</strong> as ${input.role}.</p>
79
+ <p style="margin:0 0 26px;font-size:16px;line-height:1.65;">Accept the invitation to collaborate on apps, deployments, and infrastructure in Noodle Seed.</p>
80
+ <a href="${escapeHtml(input.acceptUrl)}" style="display:inline-block;background:#171714;color:#ffffff;text-decoration:none;font-size:15px;font-weight:650;padding:13px 20px;border-radius:999px;">Accept invitation</a>
81
+ <p style="margin:28px 0 0;font-size:13px;line-height:1.6;color:#6b685f;">This invitation expires on ${escapeHtml(input.expiresAt.slice(0, 10))}. If you were not expecting it, you can ignore this email.</p>
82
+ </td></tr>
83
+ </table>
84
+ </td></tr></table>
85
+ </body>
86
+ </html>`;
87
+ return { subject, text, html };
88
+ }
89
+ export function resolveWelcomeEmailConfig(env) {
90
+ const apiKey = env.RESEND_API_KEY?.trim();
91
+ const welcomeFrom = env.NOODLE_WELCOME_EMAIL_FROM?.trim();
92
+ const invitationFrom = env.NOODLE_INVITATION_EMAIL_FROM?.trim();
93
+ const welcomeReplyTo = env.NOODLE_WELCOME_EMAIL_REPLY_TO?.trim();
94
+ const invitationReplyTo = env.NOODLE_INVITATION_EMAIL_REPLY_TO?.trim();
95
+ if (!apiKey && !welcomeFrom && !invitationFrom && !welcomeReplyTo && !invitationReplyTo) {
96
+ return undefined;
97
+ }
98
+ if (!apiKey)
99
+ throw new Error('RESEND_API_KEY is required when transactional email is configured');
100
+ return {
101
+ apiKey,
102
+ welcomeFrom: welcomeFrom || DEFAULT_WELCOME_FROM,
103
+ invitationFrom: invitationFrom || DEFAULT_INVITATION_FROM,
104
+ ...(welcomeReplyTo ? { welcomeReplyTo } : {}),
105
+ ...(invitationReplyTo ? { invitationReplyTo } : {}),
106
+ };
107
+ }
108
+ export class ResendEmailSender {
109
+ #apiKey;
110
+ #welcomeFrom;
111
+ #invitationFrom;
112
+ #welcomeReplyTo;
113
+ #invitationReplyTo;
114
+ #fetch;
115
+ constructor(options) {
116
+ this.#apiKey = options.apiKey;
117
+ this.#welcomeFrom = options.welcomeFrom;
118
+ this.#invitationFrom = options.invitationFrom;
119
+ this.#welcomeReplyTo = options.welcomeReplyTo;
120
+ this.#invitationReplyTo = options.invitationReplyTo;
121
+ this.#fetch = options.fetch ?? globalThis.fetch;
122
+ }
123
+ async send(input) {
124
+ return this.#send(input.email, `welcome.${hash(input.subject)}`, renderWelcomeEmail(input.firstName !== undefined ? { firstName: input.firstName } : {}), this.#welcomeFrom, this.#welcomeReplyTo);
125
+ }
126
+ sendInvitation(input) {
127
+ return this.#send(input.email, `invitation.${hash(input.invitationId)}`, renderInvitationEmail(input), this.#invitationFrom, this.#invitationReplyTo);
128
+ }
129
+ async #send(recipient, idempotencyKey, content, from, replyTo) {
130
+ const response = await this.#fetch(RESEND_ENDPOINT, {
131
+ method: 'POST',
132
+ redirect: 'error',
133
+ signal: AbortSignal.timeout(DELIVERY_TIMEOUT_MS),
134
+ headers: {
135
+ authorization: `Bearer ${this.#apiKey}`,
136
+ 'content-type': 'application/json',
137
+ 'idempotency-key': idempotencyKey,
138
+ },
139
+ body: JSON.stringify({
140
+ from,
141
+ to: [recipient],
142
+ ...(replyTo !== undefined ? { reply_to: replyTo } : {}),
143
+ ...content,
144
+ }),
145
+ });
146
+ if (!response.ok) {
147
+ throw new Error(`welcome email provider rejected request with status ${response.status}`);
148
+ }
149
+ const body = (await response.json());
150
+ if (typeof body.id !== 'string' || body.id.length === 0) {
151
+ throw new Error('welcome email provider returned an invalid response');
152
+ }
153
+ return { providerMessageId: body.id };
154
+ }
155
+ }
156
+ function hash(value) {
157
+ return createHash('sha256').update(value).digest('hex');
158
+ }
159
+ function headerText(value) {
160
+ return value
161
+ .replace(/[\r\n]+/g, ' ')
162
+ .trim()
163
+ .slice(0, 200);
164
+ }
165
+ function plainText(value) {
166
+ return value
167
+ .replace(/[\r\n]+/g, ' ')
168
+ .trim()
169
+ .slice(0, 100);
170
+ }
171
+ function displayNameFromEmail(email) {
172
+ const local = email.split('@')[0] ?? 'A teammate';
173
+ const words = local.split(/[._-]+/).filter(Boolean);
174
+ if (words.length === 0)
175
+ return 'A teammate';
176
+ return words.map((word) => `${word[0]?.toUpperCase() ?? ''}${word.slice(1)}`).join(' ');
177
+ }
178
+ function escapeHtml(value) {
179
+ return value
180
+ .replaceAll('&', '&amp;')
181
+ .replaceAll('<', '&lt;')
182
+ .replaceAll('>', '&gt;')
183
+ .replaceAll('"', '&quot;')
184
+ .replaceAll("'", '&#39;');
185
+ }
186
+ export class WelcomeEmailWorker {
187
+ #store;
188
+ #sender;
189
+ #clock;
190
+ #logger;
191
+ #running = false;
192
+ constructor(options) {
193
+ this.#store = options.store;
194
+ this.#sender = options.sender;
195
+ this.#clock = options.clock ?? (() => new Date());
196
+ this.#logger = options.logger;
197
+ }
198
+ async runOnce() {
199
+ if (this.#running)
200
+ return;
201
+ this.#running = true;
202
+ try {
203
+ for (let processed = 0; processed < MAX_BATCH_SIZE; processed += 1) {
204
+ const record = await this.#store.claimWelcomeEmail({
205
+ now: this.#clock(),
206
+ leaseMs: LEASE_MS,
207
+ });
208
+ if (record === undefined)
209
+ return;
210
+ try {
211
+ const result = await this.#sender.send(record);
212
+ await this.#store.markWelcomeEmailSent({
213
+ subject: record.subject,
214
+ providerMessageId: result.providerMessageId,
215
+ });
216
+ this.#logger?.info('welcome_email.delivered', { attempt: record.attemptCount });
217
+ }
218
+ catch {
219
+ const delay = Math.min(BASE_RETRY_MS * 2 ** (record.attemptCount - 1), MAX_RETRY_MS);
220
+ await this.#store.markWelcomeEmailFailed({
221
+ subject: record.subject,
222
+ nextAttemptAt: new Date(this.#clock().getTime() + delay),
223
+ });
224
+ this.#logger?.warn('welcome_email.delivery_failed', { attempt: record.attemptCount });
225
+ }
226
+ }
227
+ }
228
+ catch {
229
+ this.#logger?.warn('welcome_email.sweep_failed', { status: 500 });
230
+ }
231
+ finally {
232
+ this.#running = false;
233
+ }
234
+ }
235
+ }
236
+ export function startWelcomeEmailWorker(options) {
237
+ const worker = new WelcomeEmailWorker(options);
238
+ void worker.runOnce();
239
+ const timer = setInterval(() => void worker.runOnce(), WELCOME_EMAIL_SWEEP_INTERVAL_MS);
240
+ timer.unref?.();
241
+ return timer;
242
+ }
243
+ //# sourceMappingURL=welcome-email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome-email.js","sourceRoot":"","sources":["../src/welcome-email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,MAAM,QAAQ,GAAG,6CAA6C,CAAC;AAC/D,MAAM,QAAQ,GAAG,mDAAmD,CAAC;AACrE,MAAM,eAAe,GAAG,+BAA+B,CAAC;AACxD,MAAM,mBAAmB,GAAG,MAAM,CAAC;AACnC,MAAM,QAAQ,GAAG,MAAM,CAAC;AACxB,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACzC,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,oBAAoB,GAAG,4BAA4B,CAAC;AAC1D,MAAM,uBAAuB,GAAG,oCAAoC,CAAC;AAErE,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAC;AAQtD,MAAM,UAAU,kBAAkB,CAChC,QAAyC,EAAE;IAE3C,MAAM,OAAO,GAAG,wBAAwB,CAAC;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7F,MAAM,IAAI,GAAG,GAAG,QAAQ;;;;;;;EAOxB,QAAQ;;;;;wBAKc,CAAC;IACvB,MAAM,IAAI,GAAG;;;;;aAKF,OAAO;;;;;;;8DAO0C,QAAQ;;;0EAGI,UAAU,CAAC,QAAQ,CAAC;;;uBAGvE,QAAQ;;;;;;;;QAQvB,CAAC;IACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAUD,MAAM,UAAU,qBAAqB,CAAC,KAA6B;IACjE,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,GAAG,oBAAoB,CAAC,YAAY,CAAC,mBAAmB,OAAO,iBAAiB,CAAC;IACjG,MAAM,IAAI,GAAG,GAAG,YAAY,wBAAwB,OAAO,OAAO,KAAK,CAAC,IAAI;;;EAG5E,KAAK,CAAC,SAAS;;6BAEY,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,4DAA4D,CAAC;IACpH,MAAM,IAAI,GAAG;;2GAE4F,UAAU,CAAC,OAAO,CAAC;;;;;4DAKlE,QAAQ;;oGAEgC,UAAU,CAAC,OAAO,CAAC;gFACvC,UAAU,CAAC,YAAY,CAAC,yCAAyC,UAAU,CAAC,OAAO,CAAC,gBAAgB,KAAK,CAAC,IAAI;;qBAEzK,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;gHACgE,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;;;;;QAKhJ,CAAC;IACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AA0BD,MAAM,UAAU,yBAAyB,CACvC,GAAiD;IAEjD,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAC1C,MAAM,WAAW,GAAG,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,CAAC;IAC1D,MAAM,cAAc,GAAG,GAAG,CAAC,4BAA4B,EAAE,IAAI,EAAE,CAAC;IAChE,MAAM,cAAc,GAAG,GAAG,CAAC,6BAA6B,EAAE,IAAI,EAAE,CAAC;IACjE,MAAM,iBAAiB,GAAG,GAAG,CAAC,gCAAgC,EAAE,IAAI,EAAE,CAAC;IACvE,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACxF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IAClG,OAAO;QACL,MAAM;QACN,WAAW,EAAE,WAAW,IAAI,oBAAoB;QAChD,cAAc,EAAE,cAAc,IAAI,uBAAuB;QACzD,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,iBAAiB;IACnB,OAAO,CAAS;IAChB,YAAY,CAAS;IACrB,eAAe,CAAS;IACxB,eAAe,CAAqB;IACpC,kBAAkB,CAAqB;IACvC,MAAM,CAAe;IAE9B,YAAY,OAAiC;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;QACxC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;QAC9C,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACpD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAkE;QAG3E,OAAO,IAAI,CAAC,KAAK,CACf,KAAK,CAAC,KAAK,EACX,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAChC,kBAAkB,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACvF,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,eAAe,CACrB,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,KAA2B;QACxC,OAAO,IAAI,CAAC,KAAK,CACf,KAAK,CAAC,KAAK,EACX,cAAc,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EACxC,qBAAqB,CAAC,KAAK,CAAC,EAC5B,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,kBAAkB,CACxB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CACT,SAAiB,EACjB,cAAsB,EACtB,OAA6B,EAC7B,IAAY,EACZ,OAAgB;QAEhB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YAClD,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,mBAAmB,CAAC;YAChD,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;gBACvC,cAAc,EAAE,kBAAkB;gBAClC,iBAAiB,EAAE,cAAc;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,IAAI;gBACJ,EAAE,EAAE,CAAC,SAAS,CAAC;gBACf,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,OAAO;aACX,CAAC;SACH,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uDAAuD,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA8B,CAAC;QAClE,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IACxC,CAAC;CACF;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,IAAI,EAAE;SACN,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,IAAI,EAAE;SACN,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IAC5C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC;AASD,MAAM,OAAO,kBAAkB;IACpB,MAAM,CAAoB;IAC1B,OAAO,CAAqB;IAC5B,MAAM,CAAa;IACnB,OAAO,CAAqB;IACrC,QAAQ,GAAG,KAAK,CAAC;IAEjB,YAAY,OAAkC;QAC5C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC;YACH,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,cAAc,EAAE,SAAS,IAAI,CAAC,EAAE,CAAC;gBACnE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;oBACjD,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE;oBAClB,OAAO,EAAE,QAAQ;iBAClB,CAAC,CAAC;gBACH,IAAI,MAAM,KAAK,SAAS;oBAAE,OAAO;gBACjC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC/C,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;wBACrC,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;qBAC5C,CAAC,CAAC;oBACH,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;gBAClF,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;oBACrF,MAAM,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC;wBACvC,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,aAAa,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC;qBACzD,CAAC,CAAC;oBACH,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,+BAA+B,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;gBACxF,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAkC;IACxE,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC/C,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;IACtB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,EAAE,+BAA+B,CAAC,CAAC;IACxF,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAChB,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -2,6 +2,7 @@
2
2
  "name": "@noodle-borg/service",
3
3
  "version": "0.0.0",
4
4
  "private": true,
5
+ "license": "Apache-2.0",
5
6
  "type": "module",
6
7
  "engines": {
7
8
  "node": ">=24"
@@ -37,6 +38,7 @@
37
38
  "@noodle-borg/protocol": "0.0.0",
38
39
  "@noodle-borg/runtime": "0.0.0",
39
40
  "@noodle-borg/transport-http": "0.0.0",
41
+ "@noodle-borg/wire-contracts": "0.0.0",
40
42
  "jose": "^6.2.3",
41
43
  "yaml": "^2.9.0",
42
44
  "zod": "^4.4.3"
@@ -16,7 +16,7 @@ import { HttpConnector } from '@noodle-borg/connector-http';
16
16
  import { InMemoryConnectorRegistry, } from '@noodle-borg/runtime';
17
17
  import { serveHttp } from '../index.js';
18
18
  const MANIFEST = `
19
- manifestVersion: "0.2"
19
+ manifestVersion: "1"
20
20
  server:
21
21
  name: demo_chain
22
22
  version: 1.0.0
@@ -2,6 +2,7 @@
2
2
  "name": "@noodle-borg/transport-http",
3
3
  "version": "0.0.0",
4
4
  "private": true,
5
+ "license": "Apache-2.0",
5
6
  "type": "module",
6
7
  "engines": {
7
8
  "node": ">=24"
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The Embedded Assistant v1 session-exchange wire contract (ADR 0151): the response the hosted
3
+ * service returns from `POST /v1/assistant/sessions`, consumed by every published
4
+ * `@noodleseed/assistant` widget in the wild. The service parses its response through this schema
5
+ * before sending; the widget package stays dependency-free, so its side of the drift gate pins the
6
+ * golden fixture `contract/v1/assistant-session-response.json` instead of importing this module.
7
+ *
8
+ * The service must remain wire-compatible with the oldest supported published widget; changing a
9
+ * required field here is a coordinated widget-major event with a new pinned fixture, never a local
10
+ * edit (ADR 0151).
11
+ */
12
+ import { z } from 'zod';
13
+ export declare const assistantSessionResponseSchema: z.ZodObject<{
14
+ token: z.ZodString;
15
+ expiresAt: z.ZodString;
16
+ endpoints: z.ZodObject<{
17
+ turns: z.ZodURL;
18
+ toolConfirmations: z.ZodURL;
19
+ }, z.core.$strip>;
20
+ configuration: z.ZodOptional<z.ZodObject<{
21
+ branding: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
22
+ assistant: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
23
+ }, z.core.$strip>>;
24
+ }, z.core.$strip>;
25
+ export type AssistantSessionResponse = z.infer<typeof assistantSessionResponseSchema>;
26
+ //# sourceMappingURL=assistant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant.d.ts","sourceRoot":"","sources":["../src/assistant.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,8BAA8B;;;;;;;;;;;iBAQzC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The Embedded Assistant v1 session-exchange wire contract (ADR 0151): the response the hosted
3
+ * service returns from `POST /v1/assistant/sessions`, consumed by every published
4
+ * `@noodleseed/assistant` widget in the wild. The service parses its response through this schema
5
+ * before sending; the widget package stays dependency-free, so its side of the drift gate pins the
6
+ * golden fixture `contract/v1/assistant-session-response.json` instead of importing this module.
7
+ *
8
+ * The service must remain wire-compatible with the oldest supported published widget; changing a
9
+ * required field here is a coordinated widget-major event with a new pinned fixture, never a local
10
+ * edit (ADR 0151).
11
+ */
12
+ import { z } from 'zod';
13
+ /**
14
+ * Theming/behavior payload forwarded to the widget. Advisory presentation data: the widget renders
15
+ * safe defaults when it is absent, so only its envelope is pinned — the branding/assistant contents
16
+ * belong to the authoring/appearance layer and may grow additively without a contract event.
17
+ */
18
+ const assistantSessionConfigurationSchema = z.object({
19
+ branding: z.record(z.string(), z.unknown()).optional(),
20
+ assistant: z.record(z.string(), z.unknown()).optional(),
21
+ });
22
+ export const assistantSessionResponseSchema = z.object({
23
+ token: z.string().min(1),
24
+ expiresAt: z.string().min(1),
25
+ endpoints: z.object({
26
+ turns: z.url(),
27
+ toolConfirmations: z.url(),
28
+ }),
29
+ configuration: assistantSessionConfigurationSchema.optional(),
30
+ });
31
+ //# sourceMappingURL=assistant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../src/assistant.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,MAAM,mCAAmC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IACtD,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CACxD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC,MAAM,CAAC;IACrD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;QAClB,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE;QACd,iBAAiB,EAAE,CAAC,CAAC,GAAG,EAAE;KAC3B,CAAC;IACF,aAAa,EAAE,mCAAmC,CAAC,QAAQ,EAAE;CAC9D,CAAC,CAAC"}