@rudderhq/server 0.6.6-canary.8 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
  2. package/dist/bootstrap/register-api-routes.js +6 -0
  3. package/dist/bootstrap/register-api-routes.js.map +1 -1
  4. package/dist/bundled-plugins/plugin-linear/dist/worker.js +152 -9
  5. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +3 -3
  6. package/dist/routes/access.d.ts.map +1 -1
  7. package/dist/routes/access.js +6 -0
  8. package/dist/routes/access.js.map +1 -1
  9. package/dist/routes/agents.management-routes.d.ts.map +1 -1
  10. package/dist/routes/agents.management-routes.js +22 -0
  11. package/dist/routes/agents.management-routes.js.map +1 -1
  12. package/dist/routes/ai-search.d.ts +3 -0
  13. package/dist/routes/ai-search.d.ts.map +1 -0
  14. package/dist/routes/ai-search.js +17 -0
  15. package/dist/routes/ai-search.js.map +1 -0
  16. package/dist/routes/app-builder.d.ts +3 -0
  17. package/dist/routes/app-builder.d.ts.map +1 -0
  18. package/dist/routes/app-builder.js +305 -0
  19. package/dist/routes/app-builder.js.map +1 -0
  20. package/dist/routes/browser.d.ts.map +1 -1
  21. package/dist/routes/browser.js +6 -2
  22. package/dist/routes/browser.js.map +1 -1
  23. package/dist/routes/chats.annotation-routes.d.ts.map +1 -1
  24. package/dist/routes/chats.annotation-routes.js +10 -1
  25. package/dist/routes/chats.annotation-routes.js.map +1 -1
  26. package/dist/routes/chats.d.ts.map +1 -1
  27. package/dist/routes/chats.js +1 -0
  28. package/dist/routes/chats.js.map +1 -1
  29. package/dist/routes/chats.runtime-controls.d.ts +1 -0
  30. package/dist/routes/chats.runtime-controls.d.ts.map +1 -1
  31. package/dist/routes/chats.stream-routes.d.ts.map +1 -1
  32. package/dist/routes/chats.stream-routes.js +52 -4
  33. package/dist/routes/chats.stream-routes.js.map +1 -1
  34. package/dist/routes/chats.stream-support.d.ts +1 -0
  35. package/dist/routes/chats.stream-support.d.ts.map +1 -1
  36. package/dist/routes/chats.stream-support.js +8 -0
  37. package/dist/routes/chats.stream-support.js.map +1 -1
  38. package/dist/routes/health.d.ts.map +1 -1
  39. package/dist/routes/health.js +1 -0
  40. package/dist/routes/health.js.map +1 -1
  41. package/dist/routes/index.d.ts +2 -0
  42. package/dist/routes/index.d.ts.map +1 -1
  43. package/dist/routes/index.js +2 -0
  44. package/dist/routes/index.js.map +1 -1
  45. package/dist/routes/issues.mutations.d.ts +1 -1
  46. package/dist/routes/issues.mutations.d.ts.map +1 -1
  47. package/dist/routes/issues.mutations.js +71 -7
  48. package/dist/routes/issues.mutations.js.map +1 -1
  49. package/dist/routes/onboarding.d.ts.map +1 -1
  50. package/dist/routes/onboarding.js +35 -32
  51. package/dist/routes/onboarding.js.map +1 -1
  52. package/dist/routes/orgs.js +1 -1
  53. package/dist/routes/orgs.js.map +1 -1
  54. package/dist/routes/product-analytics-collector.d.ts +10 -0
  55. package/dist/routes/product-analytics-collector.d.ts.map +1 -0
  56. package/dist/routes/product-analytics-collector.js +28 -0
  57. package/dist/routes/product-analytics-collector.js.map +1 -0
  58. package/dist/routes/product-analytics.d.ts +3 -0
  59. package/dist/routes/product-analytics.d.ts.map +1 -0
  60. package/dist/routes/product-analytics.js +169 -0
  61. package/dist/routes/product-analytics.js.map +1 -0
  62. package/dist/routes/website-metadata.d.ts +2 -2
  63. package/dist/routes/website-metadata.d.ts.map +1 -1
  64. package/dist/routes/website-metadata.js +15 -2
  65. package/dist/routes/website-metadata.js.map +1 -1
  66. package/dist/services/activity.d.ts +3 -1
  67. package/dist/services/activity.d.ts.map +1 -1
  68. package/dist/services/activity.js +55 -6
  69. package/dist/services/activity.js.map +1 -1
  70. package/dist/services/agent-run-context.d.ts.map +1 -1
  71. package/dist/services/agent-run-context.js +8 -2
  72. package/dist/services/agent-run-context.js.map +1 -1
  73. package/dist/services/agents.d.ts +84 -13
  74. package/dist/services/agents.d.ts.map +1 -1
  75. package/dist/services/agents.js +35 -1
  76. package/dist/services/agents.js.map +1 -1
  77. package/dist/services/ai-search.d.ts +6 -0
  78. package/dist/services/ai-search.d.ts.map +1 -0
  79. package/dist/services/ai-search.js +238 -0
  80. package/dist/services/ai-search.js.map +1 -0
  81. package/dist/services/ai-search.test.d.ts +2 -0
  82. package/dist/services/ai-search.test.d.ts.map +1 -0
  83. package/dist/services/ai-search.test.js +52 -0
  84. package/dist/services/ai-search.test.js.map +1 -0
  85. package/dist/services/app-builder.d.ts +13 -0
  86. package/dist/services/app-builder.d.ts.map +1 -0
  87. package/dist/services/app-builder.js +241 -0
  88. package/dist/services/app-builder.js.map +1 -0
  89. package/dist/services/approvals.d.ts +3 -3
  90. package/dist/services/automations.d.ts +1 -0
  91. package/dist/services/automations.d.ts.map +1 -1
  92. package/dist/services/automations.js +33 -1
  93. package/dist/services/automations.js.map +1 -1
  94. package/dist/services/browser-broker.d.ts +1 -0
  95. package/dist/services/browser-broker.d.ts.map +1 -1
  96. package/dist/services/browser-broker.js +34 -2
  97. package/dist/services/browser-broker.js.map +1 -1
  98. package/dist/services/browser-broker.test.js +73 -0
  99. package/dist/services/browser-broker.test.js.map +1 -1
  100. package/dist/services/budgets.d.ts +1 -6
  101. package/dist/services/budgets.d.ts.map +1 -1
  102. package/dist/services/budgets.js +30 -103
  103. package/dist/services/budgets.js.map +1 -1
  104. package/dist/services/chat-annotation-copy-lineage.d.ts.map +1 -1
  105. package/dist/services/chat-annotation-copy-lineage.js +6 -1
  106. package/dist/services/chat-annotation-copy-lineage.js.map +1 -1
  107. package/dist/services/chat-assistant.annotations.d.ts.map +1 -1
  108. package/dist/services/chat-assistant.annotations.js +4 -1
  109. package/dist/services/chat-assistant.annotations.js.map +1 -1
  110. package/dist/services/chat-assistant.annotations.test.js +18 -2
  111. package/dist/services/chat-assistant.annotations.test.js.map +1 -1
  112. package/dist/services/chat-family-groups.d.ts +1 -1
  113. package/dist/services/chat-family-groups.d.ts.map +1 -1
  114. package/dist/services/chat-family-groups.js +17 -1
  115. package/dist/services/chat-family-groups.js.map +1 -1
  116. package/dist/services/chat-inline-annotation-validation.d.ts.map +1 -1
  117. package/dist/services/chat-inline-annotation-validation.js +301 -8
  118. package/dist/services/chat-inline-annotation-validation.js.map +1 -1
  119. package/dist/services/chat-inline-annotations.test.js +249 -1
  120. package/dist/services/chat-inline-annotations.test.js.map +1 -1
  121. package/dist/services/chat-message-branch.d.ts +5 -0
  122. package/dist/services/chat-message-branch.d.ts.map +1 -0
  123. package/dist/services/chat-message-branch.js +9 -0
  124. package/dist/services/chat-message-branch.js.map +1 -0
  125. package/dist/services/chat-work-manifest.d.ts.map +1 -1
  126. package/dist/services/chat-work-manifest.js +6 -0
  127. package/dist/services/chat-work-manifest.js.map +1 -1
  128. package/dist/services/chats.create.d.ts +2 -0
  129. package/dist/services/chats.create.d.ts.map +1 -1
  130. package/dist/services/chats.create.js +76 -4
  131. package/dist/services/chats.create.js.map +1 -1
  132. package/dist/services/chats.d.ts +33 -13
  133. package/dist/services/chats.d.ts.map +1 -1
  134. package/dist/services/chats.inline-visual-persistence.d.ts.map +1 -1
  135. package/dist/services/chats.inline-visual-persistence.js +7 -0
  136. package/dist/services/chats.inline-visual-persistence.js.map +1 -1
  137. package/dist/services/chats.js +46 -24
  138. package/dist/services/chats.js.map +1 -1
  139. package/dist/services/dashboard.d.ts +0 -1
  140. package/dist/services/dashboard.d.ts.map +1 -1
  141. package/dist/services/dashboard.js +0 -1
  142. package/dist/services/dashboard.js.map +1 -1
  143. package/dist/services/heartbeat-run-summary.d.ts.map +1 -1
  144. package/dist/services/heartbeat-run-summary.js +6 -0
  145. package/dist/services/heartbeat-run-summary.js.map +1 -1
  146. package/dist/services/index.d.ts +2 -0
  147. package/dist/services/index.d.ts.map +1 -1
  148. package/dist/services/index.js +2 -0
  149. package/dist/services/index.js.map +1 -1
  150. package/dist/services/instance-settings.d.ts.map +1 -1
  151. package/dist/services/instance-settings.js +4 -6
  152. package/dist/services/instance-settings.js.map +1 -1
  153. package/dist/services/issue-approvals.d.ts +1 -1
  154. package/dist/services/issues.d.ts +2 -2
  155. package/dist/services/issues.d.ts.map +1 -1
  156. package/dist/services/issues.js +69 -2
  157. package/dist/services/issues.js.map +1 -1
  158. package/dist/services/knowledge-portability/organization-portability.import.d.ts.map +1 -1
  159. package/dist/services/knowledge-portability/organization-portability.import.js +1 -0
  160. package/dist/services/knowledge-portability/organization-portability.import.js.map +1 -1
  161. package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
  162. package/dist/services/knowledge-portability/organization-skills.js +6 -2
  163. package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
  164. package/dist/services/legacy-operator-state.d.ts +14 -0
  165. package/dist/services/legacy-operator-state.d.ts.map +1 -0
  166. package/dist/services/legacy-operator-state.js +251 -0
  167. package/dist/services/legacy-operator-state.js.map +1 -0
  168. package/dist/services/local-account-auth.d.ts.map +1 -1
  169. package/dist/services/local-account-auth.js +21 -3
  170. package/dist/services/local-account-auth.js.map +1 -1
  171. package/dist/services/messenger-custom-groups.d.ts +15 -0
  172. package/dist/services/messenger-custom-groups.d.ts.map +1 -0
  173. package/dist/services/messenger-custom-groups.js +155 -0
  174. package/dist/services/messenger-custom-groups.js.map +1 -0
  175. package/dist/services/messenger-saved-views.d.ts +32 -8
  176. package/dist/services/messenger-saved-views.d.ts.map +1 -1
  177. package/dist/services/messenger-saved-views.js +67 -2
  178. package/dist/services/messenger-saved-views.js.map +1 -1
  179. package/dist/services/messenger.d.ts +3 -3
  180. package/dist/services/messenger.d.ts.map +1 -1
  181. package/dist/services/messenger.js +110 -166
  182. package/dist/services/messenger.js.map +1 -1
  183. package/dist/services/orgs.d.ts +11 -2
  184. package/dist/services/orgs.d.ts.map +1 -1
  185. package/dist/services/orgs.js +23 -1
  186. package/dist/services/orgs.js.map +1 -1
  187. package/dist/services/product-analytics-collector.d.ts +86 -0
  188. package/dist/services/product-analytics-collector.d.ts.map +1 -0
  189. package/dist/services/product-analytics-collector.js +172 -0
  190. package/dist/services/product-analytics-collector.js.map +1 -0
  191. package/dist/services/product-analytics-collector.test.d.ts +2 -0
  192. package/dist/services/product-analytics-collector.test.d.ts.map +1 -0
  193. package/dist/services/product-analytics-collector.test.js +81 -0
  194. package/dist/services/product-analytics-collector.test.js.map +1 -0
  195. package/dist/services/product-analytics.d.ts +385 -0
  196. package/dist/services/product-analytics.d.ts.map +1 -0
  197. package/dist/services/product-analytics.js +698 -0
  198. package/dist/services/product-analytics.js.map +1 -0
  199. package/dist/services/product-analytics.test.d.ts +2 -0
  200. package/dist/services/product-analytics.test.d.ts.map +1 -0
  201. package/dist/services/product-analytics.test.js +136 -0
  202. package/dist/services/product-analytics.test.js.map +1 -0
  203. package/dist/services/projects.d.ts +1 -1
  204. package/dist/services/runtime-kernel/heartbeat.d.ts +4 -0
  205. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  206. package/dist/services/runtime-kernel/heartbeat.js +53 -1
  207. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  208. package/dist/services/runtime-kernel/heartbeat.misc.d.ts.map +1 -1
  209. package/dist/services/runtime-kernel/heartbeat.misc.js +5 -10
  210. package/dist/services/runtime-kernel/heartbeat.misc.js.map +1 -1
  211. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts +3 -0
  212. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts.map +1 -1
  213. package/dist/services/runtime-kernel/heartbeat.terminal.js +56 -1
  214. package/dist/services/runtime-kernel/heartbeat.terminal.js.map +1 -1
  215. package/dist/services/runtime-kernel/heartbeat.wakeup.d.ts.map +1 -1
  216. package/dist/services/runtime-kernel/heartbeat.wakeup.js +9 -2
  217. package/dist/services/runtime-kernel/heartbeat.wakeup.js.map +1 -1
  218. package/dist/services/secrets.d.ts +1 -1
  219. package/dist/services/side-chats.d.ts +3 -0
  220. package/dist/services/side-chats.d.ts.map +1 -1
  221. package/dist/services/side-chats.js +30 -15
  222. package/dist/services/side-chats.js.map +1 -1
  223. package/dist/services/website-metadata.d.ts +3 -0
  224. package/dist/services/website-metadata.d.ts.map +1 -1
  225. package/dist/services/website-metadata.js +331 -88
  226. package/dist/services/website-metadata.js.map +1 -1
  227. package/package.json +16 -14
  228. package/resources/bundled-skills/app-builder/SKILL.md +104 -0
  229. package/resources/bundled-skills/app-builder/agents/openai.yaml +14 -0
  230. package/resources/bundled-skills/app-builder/assets/scaffold/.env.example +3 -0
  231. package/resources/bundled-skills/app-builder/assets/scaffold/app/api/%5F%5Frudder/health/route.ts +20 -0
  232. package/resources/bundled-skills/app-builder/assets/scaffold/app/api/contacts/[id]/route.ts +39 -0
  233. package/resources/bundled-skills/app-builder/assets/scaffold/app/api/contacts/route.ts +31 -0
  234. package/resources/bundled-skills/app-builder/assets/scaffold/app/api/data/export/route.ts +19 -0
  235. package/resources/bundled-skills/app-builder/assets/scaffold/app/api/data/import/route.ts +40 -0
  236. package/resources/bundled-skills/app-builder/assets/scaffold/app/globals.css +32 -0
  237. package/resources/bundled-skills/app-builder/assets/scaffold/app/layout.tsx +15 -0
  238. package/resources/bundled-skills/app-builder/assets/scaffold/app/page.tsx +9 -0
  239. package/resources/bundled-skills/app-builder/assets/scaffold/components/contacts-workspace.tsx +292 -0
  240. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/button.tsx +42 -0
  241. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/card.tsx +19 -0
  242. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/input.tsx +17 -0
  243. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/label.tsx +6 -0
  244. package/resources/bundled-skills/app-builder/assets/scaffold/data/.gitkeep +1 -0
  245. package/resources/bundled-skills/app-builder/assets/scaffold/drizzle.config.ts +18 -0
  246. package/resources/bundled-skills/app-builder/assets/scaffold/instrumentation.ts +5 -0
  247. package/resources/bundled-skills/app-builder/assets/scaffold/lib/data-transfer.ts +44 -0
  248. package/resources/bundled-skills/app-builder/assets/scaffold/lib/db/client.ts +78 -0
  249. package/resources/bundled-skills/app-builder/assets/scaffold/lib/db/schema.ts +35 -0
  250. package/resources/bundled-skills/app-builder/assets/scaffold/lib/domain.ts +18 -0
  251. package/resources/bundled-skills/app-builder/assets/scaffold/lib/jobs/runner.ts +56 -0
  252. package/resources/bundled-skills/app-builder/assets/scaffold/lib/utils.ts +6 -0
  253. package/resources/bundled-skills/app-builder/assets/scaffold/migrations/0000_app_builder_foundation.sql +27 -0
  254. package/resources/bundled-skills/app-builder/assets/scaffold/migrations/meta/_journal.json +13 -0
  255. package/resources/bundled-skills/app-builder/assets/scaffold/next-env.d.ts +6 -0
  256. package/resources/bundled-skills/app-builder/assets/scaffold/next.config.ts +8 -0
  257. package/resources/bundled-skills/app-builder/assets/scaffold/package.json +47 -0
  258. package/resources/bundled-skills/app-builder/assets/scaffold/playwright.config.ts +30 -0
  259. package/resources/bundled-skills/app-builder/assets/scaffold/pnpm-lock.yaml +2687 -0
  260. package/resources/bundled-skills/app-builder/assets/scaffold/postcss.config.mjs +5 -0
  261. package/resources/bundled-skills/app-builder/assets/scaffold/rudder.app.json +32 -0
  262. package/resources/bundled-skills/app-builder/assets/scaffold/scripts/migrate.ts +21 -0
  263. package/resources/bundled-skills/app-builder/assets/scaffold/scripts/seed.ts +31 -0
  264. package/resources/bundled-skills/app-builder/assets/scaffold/scripts/snapshot.ts +17 -0
  265. package/resources/bundled-skills/app-builder/assets/scaffold/tests/e2e/app.spec.ts +50 -0
  266. package/resources/bundled-skills/app-builder/assets/scaffold/tests/unit/data-transfer.test.ts +28 -0
  267. package/resources/bundled-skills/app-builder/assets/scaffold/tests/unit/domain.test.ts +23 -0
  268. package/resources/bundled-skills/app-builder/assets/scaffold/tsconfig.json +41 -0
  269. package/resources/bundled-skills/app-builder/assets/scaffold/vitest.config.ts +14 -0
  270. package/resources/bundled-skills/app-builder/evals/evals.json +65 -0
  271. package/resources/bundled-skills/app-builder/references/data-safety.md +38 -0
  272. package/resources/bundled-skills/app-builder/references/design-guidelines.md +20 -0
  273. package/resources/bundled-skills/app-builder/references/migrations-and-promotion.md +36 -0
  274. package/resources/bundled-skills/app-builder/references/scaffold-contract.md +77 -0
  275. package/resources/bundled-skills/app-builder/references/verification.md +23 -0
  276. package/resources/bundled-skills/app-builder/scripts/scaffold.mjs +58 -0
  277. package/resources/bundled-skills/app-builder/scripts/validate-manifest.mjs +63 -0
  278. package/skills/app-builder/SKILL.md +104 -0
  279. package/skills/app-builder/agents/openai.yaml +14 -0
  280. package/skills/app-builder/assets/scaffold/.env.example +3 -0
  281. package/skills/app-builder/assets/scaffold/app/api/%5F%5Frudder/health/route.ts +20 -0
  282. package/skills/app-builder/assets/scaffold/app/api/contacts/[id]/route.ts +39 -0
  283. package/skills/app-builder/assets/scaffold/app/api/contacts/route.ts +31 -0
  284. package/skills/app-builder/assets/scaffold/app/api/data/export/route.ts +19 -0
  285. package/skills/app-builder/assets/scaffold/app/api/data/import/route.ts +40 -0
  286. package/skills/app-builder/assets/scaffold/app/globals.css +32 -0
  287. package/skills/app-builder/assets/scaffold/app/layout.tsx +15 -0
  288. package/skills/app-builder/assets/scaffold/app/page.tsx +9 -0
  289. package/skills/app-builder/assets/scaffold/components/contacts-workspace.tsx +292 -0
  290. package/skills/app-builder/assets/scaffold/components/ui/button.tsx +42 -0
  291. package/skills/app-builder/assets/scaffold/components/ui/card.tsx +19 -0
  292. package/skills/app-builder/assets/scaffold/components/ui/input.tsx +17 -0
  293. package/skills/app-builder/assets/scaffold/components/ui/label.tsx +6 -0
  294. package/skills/app-builder/assets/scaffold/data/.gitkeep +1 -0
  295. package/skills/app-builder/assets/scaffold/drizzle.config.ts +18 -0
  296. package/skills/app-builder/assets/scaffold/instrumentation.ts +5 -0
  297. package/skills/app-builder/assets/scaffold/lib/data-transfer.ts +44 -0
  298. package/skills/app-builder/assets/scaffold/lib/db/client.ts +78 -0
  299. package/skills/app-builder/assets/scaffold/lib/db/schema.ts +35 -0
  300. package/skills/app-builder/assets/scaffold/lib/domain.ts +18 -0
  301. package/skills/app-builder/assets/scaffold/lib/jobs/runner.ts +56 -0
  302. package/skills/app-builder/assets/scaffold/lib/utils.ts +6 -0
  303. package/skills/app-builder/assets/scaffold/migrations/0000_app_builder_foundation.sql +27 -0
  304. package/skills/app-builder/assets/scaffold/migrations/meta/_journal.json +13 -0
  305. package/skills/app-builder/assets/scaffold/next-env.d.ts +6 -0
  306. package/skills/app-builder/assets/scaffold/next.config.ts +8 -0
  307. package/skills/app-builder/assets/scaffold/package.json +47 -0
  308. package/skills/app-builder/assets/scaffold/playwright.config.ts +30 -0
  309. package/skills/app-builder/assets/scaffold/pnpm-lock.yaml +2687 -0
  310. package/skills/app-builder/assets/scaffold/postcss.config.mjs +5 -0
  311. package/skills/app-builder/assets/scaffold/rudder.app.json +32 -0
  312. package/skills/app-builder/assets/scaffold/scripts/migrate.ts +21 -0
  313. package/skills/app-builder/assets/scaffold/scripts/seed.ts +31 -0
  314. package/skills/app-builder/assets/scaffold/scripts/snapshot.ts +17 -0
  315. package/skills/app-builder/assets/scaffold/tests/e2e/app.spec.ts +50 -0
  316. package/skills/app-builder/assets/scaffold/tests/unit/data-transfer.test.ts +28 -0
  317. package/skills/app-builder/assets/scaffold/tests/unit/domain.test.ts +23 -0
  318. package/skills/app-builder/assets/scaffold/tsconfig.json +41 -0
  319. package/skills/app-builder/assets/scaffold/vitest.config.ts +14 -0
  320. package/skills/app-builder/evals/evals.json +65 -0
  321. package/skills/app-builder/references/data-safety.md +38 -0
  322. package/skills/app-builder/references/design-guidelines.md +20 -0
  323. package/skills/app-builder/references/migrations-and-promotion.md +36 -0
  324. package/skills/app-builder/references/scaffold-contract.md +77 -0
  325. package/skills/app-builder/references/verification.md +23 -0
  326. package/skills/app-builder/scripts/scaffold.mjs +58 -0
  327. package/skills/app-builder/scripts/validate-manifest.mjs +63 -0
  328. package/ui-dist/assets/LibraryLiveSurface-DeUIV5N_.js +1 -0
  329. package/ui-dist/assets/{abnfDiagram-VRR7QNED-BdM6grBK.js → abnfDiagram-VRR7QNED-BaoLM9Pd.js} +1 -1
  330. package/ui-dist/assets/{arc-B8Tukeix.js → arc-Cx0L6o2z.js} +1 -1
  331. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-DP_lYJIS.js → architectureDiagram-ZJ3FMSHR-zVfZP7v4.js} +1 -1
  332. package/ui-dist/assets/{blockDiagram-677ZJIJ3-D_QKZNjP.js → blockDiagram-677ZJIJ3-BiWWFP9R.js} +1 -1
  333. package/ui-dist/assets/{c4Diagram-LMCZKHZV-DJwVavN4.js → c4Diagram-LMCZKHZV-CX65GSJ6.js} +1 -1
  334. package/ui-dist/assets/channel-CHc3ibOz.js +1 -0
  335. package/ui-dist/assets/{chunk-2Q5K7J3B-BjdKg2cx.js → chunk-2Q5K7J3B-CH6PlelX.js} +1 -1
  336. package/ui-dist/assets/{chunk-32BRIVSS-C_u4l725.js → chunk-32BRIVSS-C7ZEXYO8.js} +1 -1
  337. package/ui-dist/assets/{chunk-5VM5RSS4-DtzEQCc9.js → chunk-5VM5RSS4-CyInWuue.js} +1 -1
  338. package/ui-dist/assets/{chunk-EX3LRPZG-Ds_gCBVz.js → chunk-EX3LRPZG-D58qFIdM.js} +1 -1
  339. package/ui-dist/assets/{chunk-JWPE2WC7-CHX9VuQf.js → chunk-JWPE2WC7-CJ3Qx30f.js} +1 -1
  340. package/ui-dist/assets/{chunk-MOJQB5TN-D_pj9OWe.js → chunk-MOJQB5TN-BO4bKVLH.js} +1 -1
  341. package/ui-dist/assets/{chunk-RYQCIY6F-aMYmnUaJ.js → chunk-RYQCIY6F-DxBmxcYc.js} +1 -1
  342. package/ui-dist/assets/{chunk-V7JOEXUC-Db3LrL-P.js → chunk-V7JOEXUC-Chdnd6Lq.js} +1 -1
  343. package/ui-dist/assets/{chunk-VR4S4FIN-BssuUpMr.js → chunk-VR4S4FIN-GkW_x_pD.js} +1 -1
  344. package/ui-dist/assets/{chunk-XXDRQBXY-DVzY-_Tv.js → chunk-XXDRQBXY-BJyBGcSF.js} +1 -1
  345. package/ui-dist/assets/classDiagram-OUVF2IWQ-9iLZpz3t.js +1 -0
  346. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-9iLZpz3t.js +1 -0
  347. package/ui-dist/assets/{cose-bilkent-JH36ORCC-Ch-fM2pW.js → cose-bilkent-JH36ORCC-BWP2r8TX.js} +1 -1
  348. package/ui-dist/assets/{cynefin-VYW2F7L2-C7gJeesr.js → cynefin-VYW2F7L2-C08dfI3w.js} +1 -1
  349. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BwMpD6aZ.js → cynefinDiagram-TSTJHNR4-h6dXjTaO.js} +1 -1
  350. package/ui-dist/assets/{dagre-VKFMJZFB-8TgHu2tj.js → dagre-VKFMJZFB-CWDgoFQD.js} +1 -1
  351. package/ui-dist/assets/{diagram-FQU43EPY-ChODej8C.js → diagram-FQU43EPY-CK1j48d-.js} +1 -1
  352. package/ui-dist/assets/{diagram-G47NLZAW-CVq1GXvV.js → diagram-G47NLZAW-CoSiG57q.js} +1 -1
  353. package/ui-dist/assets/{diagram-NH7WQ7WH-D1IO7xe3.js → diagram-NH7WQ7WH-DRG-xXGQ.js} +1 -1
  354. package/ui-dist/assets/{diagram-OA4YK3LP-CKlttJto.js → diagram-OA4YK3LP-D04mMwYs.js} +1 -1
  355. package/ui-dist/assets/{diagram-WEI45ONY-DigjsORo.js → diagram-WEI45ONY-ZkC1ZQMq.js} +1 -1
  356. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-CZwO7RGO.js → ebnfDiagram-CCIWWBDH-BxMIw9PZ.js} +1 -1
  357. package/ui-dist/assets/{erDiagram-Q63AITRT-C3fFVPod.js → erDiagram-Q63AITRT-B4Zwbn84.js} +1 -1
  358. package/ui-dist/assets/{flowDiagram-23GEKE2U-CpccWfFo.js → flowDiagram-23GEKE2U-D5pYz8Px.js} +1 -1
  359. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-g3KL--4W.js → ganttDiagram-NO4QXBWP-RSramodc.js} +1 -1
  360. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-Bn59AW1B.js → gitGraphDiagram-IHSO6WYX-BFQfCkMd.js} +1 -1
  361. package/ui-dist/assets/{graph-LZSMW9ku.js → graph-DuSS8poS.js} +1 -1
  362. package/ui-dist/assets/{index-CPIoQKcG.js → index-5tzBDABj.js} +1 -1
  363. package/ui-dist/assets/index-9U78M9Np.js +1 -0
  364. package/ui-dist/assets/index-B-NP8fOI.js +1 -0
  365. package/ui-dist/assets/index-BADa8mxG.js +1 -0
  366. package/ui-dist/assets/index-BGcgy63z.js +1 -0
  367. package/ui-dist/assets/index-BKXUkeeU.js +1 -0
  368. package/ui-dist/assets/{index-CrU5g0XU.js → index-BU0KLNTt.js} +588 -558
  369. package/ui-dist/assets/index-BpvytaKr.js +1 -0
  370. package/ui-dist/assets/index-CHbXMgL0.js +7 -0
  371. package/ui-dist/assets/index-Cyq94-QT.js +1 -0
  372. package/ui-dist/assets/{index-BI9d3zXw.js → index-DRbt_Svi.js} +2 -2
  373. package/ui-dist/assets/index-De3vaw_P.js +1 -0
  374. package/ui-dist/assets/index-DzdRgH-y.js +1 -0
  375. package/ui-dist/assets/index-QrRs-r-4.css +1 -0
  376. package/ui-dist/assets/index-olsHIcXs.js +1 -0
  377. package/ui-dist/assets/index-wZlfBtwh.js +1 -0
  378. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-uxPSmmcv.js → infoDiagram-FWYZ7A6U-f5i4pO3J.js} +1 -1
  379. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-BeKQmaaL.js → ishikawaDiagram-FXEZZL3T-CVEdv5i_.js} +1 -1
  380. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-Cnqh1Fyp.js → journeyDiagram-5HDEW3XC-Cvp7vWcy.js} +1 -1
  381. package/ui-dist/assets/{kanban-definition-HUTT4EX6-DRvoG8e7.js → kanban-definition-HUTT4EX6-C6dURjjK.js} +1 -1
  382. package/ui-dist/assets/{layout-By7bOuHZ.js → layout-DxdOu9MY.js} +1 -1
  383. package/ui-dist/assets/{linear-D-kfwm1O.js → linear-CRi8RB_7.js} +1 -1
  384. package/ui-dist/assets/{map-d3zaWROJ.js → map-BlpDrw_l.js} +1 -1
  385. package/ui-dist/assets/{mermaid.core-1JtOXpMA.js → mermaid.core-2Gz9YusH.js} +4 -4
  386. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-D8Jge-_m.js → mindmap-definition-LN4V7U3C-BmSjJLTI.js} +1 -1
  387. package/ui-dist/assets/{pegDiagram-2B236MQR-UCd9-Gfd.js → pegDiagram-2B236MQR-BTUboUw8.js} +1 -1
  388. package/ui-dist/assets/{pieDiagram-ENE6RG2P-DffPYn-P.js → pieDiagram-ENE6RG2P-CVPP8SYv.js} +1 -1
  389. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-Ds1lQ25G.js → quadrantDiagram-ABIIQ3AL-BG4FmirT.js} +1 -1
  390. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-P_pLStbY.js → railroadDiagram-RFXS5EU6-DFRNo9hF.js} +1 -1
  391. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-E_1U7w_T.js → requirementDiagram-TGXJPOKE-DpnVF9qP.js} +1 -1
  392. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-DFgwdZz7.js → sankeyDiagram-HTMAVEWB-D1ETFdSE.js} +1 -1
  393. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-CbI2EnTH.js → sequenceDiagram-DBY2YBRQ-CNqzB_AL.js} +1 -1
  394. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-Axl0diWc.js → sizeCapture-X5ZJPWSS-DuoMCjdH.js} +1 -1
  395. package/ui-dist/assets/{stateDiagram-2N3HPSRC-DxZLENhX.js → stateDiagram-2N3HPSRC-fmHeKL8l.js} +1 -1
  396. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-DajAVikh.js +1 -0
  397. package/ui-dist/assets/swimlanes-5IMT3BWC-hjosaIhT.js +2 -0
  398. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-DJjG9OJ-.js +8 -0
  399. package/ui-dist/assets/{timeline-definition-FHXFAJF6-B0Ha5bZS.js → timeline-definition-FHXFAJF6-xoMEClc-.js} +1 -1
  400. package/ui-dist/assets/{vennDiagram-L72KCM5P-BskD_1N5.js → vennDiagram-L72KCM5P-sdSXQfX-.js} +1 -1
  401. package/ui-dist/assets/{wardleyDiagram-EHGQE667-1wE4bYQ8.js → wardleyDiagram-EHGQE667-BbQBSKlD.js} +1 -1
  402. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-DfcOAfb8.js → xychartDiagram-FW5EYKEG-BfAtadyK.js} +1 -1
  403. package/ui-dist/index.html +2 -2
  404. package/ui-dist/assets/LibraryLiveSurface-CUgoFYvG.js +0 -1
  405. package/ui-dist/assets/channel-Cd4sqN24.js +0 -1
  406. package/ui-dist/assets/classDiagram-OUVF2IWQ-Bi3tsM-q.js +0 -1
  407. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-Bi3tsM-q.js +0 -1
  408. package/ui-dist/assets/index-BG46qMXw.js +0 -1
  409. package/ui-dist/assets/index-BLUJslyp.js +0 -1
  410. package/ui-dist/assets/index-BQv2nBgV.js +0 -1
  411. package/ui-dist/assets/index-BkbdH2n-.js +0 -1
  412. package/ui-dist/assets/index-BqhkUdAT.js +0 -1
  413. package/ui-dist/assets/index-C-qWhcfC.css +0 -1
  414. package/ui-dist/assets/index-C3e6slEn.js +0 -1
  415. package/ui-dist/assets/index-C5hYxLM9.js +0 -1
  416. package/ui-dist/assets/index-CLETiubs.js +0 -7
  417. package/ui-dist/assets/index-CLnCobCG.js +0 -1
  418. package/ui-dist/assets/index-CQLLvEua.js +0 -1
  419. package/ui-dist/assets/index-CVwGLbgm.js +0 -1
  420. package/ui-dist/assets/index-ChTD9DV4.js +0 -1
  421. package/ui-dist/assets/index-CiyYjAsy.js +0 -1
  422. package/ui-dist/assets/index-EqVfudOJ.js +0 -1
  423. package/ui-dist/assets/index-ZFb9ZHAH.js +0 -6
  424. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-KzYOpJ1T.js +0 -1
  425. package/ui-dist/assets/swimlanes-5IMT3BWC-1G26qvUm.js +0 -2
  426. package/ui-dist/assets/swimlanesDiagram-G3AALYLV--Vi3kUvi.js +0 -8
@@ -0,0 +1,19 @@
1
+ import { cn } from "@/lib/utils";
2
+ import * as React from "react";
3
+
4
+ export function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
5
+ return (
6
+ <section
7
+ className={cn("rounded-xl border bg-[var(--card)] text-[var(--card-foreground)] shadow-sm", className)}
8
+ {...props}
9
+ />
10
+ );
11
+ }
12
+
13
+ export function CardHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
14
+ return <div className={cn("border-b px-5 py-4", className)} {...props} />;
15
+ }
16
+
17
+ export function CardContent({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
18
+ return <div className={cn("p-5", className)} {...props} />;
19
+ }
@@ -0,0 +1,17 @@
1
+ import { cn } from "@/lib/utils";
2
+ import * as React from "react";
3
+
4
+ export const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>(
5
+ ({ className, type, ...props }, ref) => (
6
+ <input
7
+ ref={ref}
8
+ type={type}
9
+ className={cn(
10
+ "flex h-10 w-full rounded-lg border bg-white px-3 py-2 text-sm outline-none placeholder:text-[var(--muted-foreground)] focus:ring-2 focus:ring-[var(--ring)] disabled:opacity-50",
11
+ className,
12
+ )}
13
+ {...props}
14
+ />
15
+ ),
16
+ );
17
+ Input.displayName = "Input";
@@ -0,0 +1,6 @@
1
+ import { cn } from "@/lib/utils";
2
+ import * as React from "react";
3
+
4
+ export function Label({ className, ...props }: React.LabelHTMLAttributes<HTMLLabelElement>) {
5
+ return <label className={cn("text-sm font-medium", className)} {...props} />;
6
+ }
@@ -0,0 +1,18 @@
1
+ import { defineConfig } from "drizzle-kit";
2
+ import path from "node:path";
3
+
4
+ const dataDir = process.env.RUDDER_APP_DATA_DIR
5
+ ? path.resolve(process.env.RUDDER_APP_DATA_DIR)
6
+ : path.resolve("data");
7
+ const mode = process.env.RUDDER_APP_DATA_MODE === "production"
8
+ ? "app.sqlite"
9
+ : "dev.sqlite";
10
+
11
+ export default defineConfig({
12
+ dialect: "sqlite",
13
+ schema: "./lib/db/schema.ts",
14
+ out: "./migrations",
15
+ dbCredentials: {
16
+ url: path.join(dataDir, mode),
17
+ },
18
+ });
@@ -0,0 +1,5 @@
1
+ export async function register() {
2
+ if (process.env.NEXT_RUNTIME !== "nodejs") return;
3
+ const { startJobRunner } = await import("@/lib/jobs/runner");
4
+ startJobRunner();
5
+ }
@@ -0,0 +1,44 @@
1
+ import { z } from "zod";
2
+ import { contactStatusSchema } from "./domain";
3
+
4
+ export const exportedContactSchema = z.object({
5
+ id: z.string().uuid(),
6
+ name: z.string().min(1).max(120),
7
+ email: z.email().max(320),
8
+ company: z.string().max(160),
9
+ status: contactStatusSchema,
10
+ createdAt: z.iso.datetime(),
11
+ updatedAt: z.iso.datetime(),
12
+ });
13
+
14
+ export const importEnvelopeSchema = z.object({
15
+ format: z.literal("rudder-app-data/v1"),
16
+ exportedAt: z.iso.datetime(),
17
+ data: z.object({
18
+ contacts: z.array(exportedContactSchema).max(100_000),
19
+ }),
20
+ }).strict();
21
+
22
+ type ContactRow = {
23
+ id: string;
24
+ name: string;
25
+ email: string;
26
+ company: string;
27
+ status: "new" | "contacted" | "replied" | "paused";
28
+ createdAt: Date;
29
+ updatedAt: Date;
30
+ };
31
+
32
+ export function buildExportEnvelope(rows: ContactRow[]) {
33
+ return {
34
+ format: "rudder-app-data/v1" as const,
35
+ exportedAt: new Date().toISOString(),
36
+ data: {
37
+ contacts: rows.map((row) => ({
38
+ ...row,
39
+ createdAt: row.createdAt.toISOString(),
40
+ updatedAt: row.updatedAt.toISOString(),
41
+ })),
42
+ },
43
+ };
44
+ }
@@ -0,0 +1,78 @@
1
+ import {
2
+ drizzle,
3
+ type SqliteRemoteDatabase,
4
+ } from "drizzle-orm/sqlite-proxy";
5
+ import { mkdirSync } from "node:fs";
6
+ import path from "node:path";
7
+ import { DatabaseSync, type SQLInputValue } from "node:sqlite";
8
+ import * as schema from "./schema";
9
+
10
+ type DatabaseHandle = {
11
+ sqlite: DatabaseSync;
12
+ db: SqliteRemoteDatabase<typeof schema>;
13
+ filePath: string;
14
+ };
15
+
16
+ const handles = new Map<string, DatabaseHandle>();
17
+
18
+ export function dataMode() {
19
+ return process.env.RUDDER_APP_DATA_MODE === "production"
20
+ ? "production"
21
+ : "development";
22
+ }
23
+
24
+ export function dataDirectory() {
25
+ return process.env.RUDDER_APP_DATA_DIR
26
+ ? path.resolve(process.env.RUDDER_APP_DATA_DIR)
27
+ : path.resolve("data");
28
+ }
29
+
30
+ export function databasePath() {
31
+ if (process.env.RUDDER_APP_DATA_DIR) {
32
+ return path.join(
33
+ dataDirectory(),
34
+ dataMode() === "production" ? "app.sqlite" : "dev.sqlite",
35
+ );
36
+ }
37
+ return path.join(
38
+ dataDirectory(),
39
+ dataMode() === "production" ? "production/app.sqlite" : "development/dev.sqlite",
40
+ );
41
+ }
42
+
43
+ export function getDatabase(): DatabaseHandle {
44
+ const filePath = databasePath();
45
+ const cached = handles.get(filePath);
46
+ if (cached) return cached;
47
+
48
+ mkdirSync(path.dirname(filePath), { recursive: true });
49
+ const sqlite = new DatabaseSync(filePath);
50
+ sqlite.exec("PRAGMA journal_mode = WAL");
51
+ sqlite.exec("PRAGMA foreign_keys = ON");
52
+ sqlite.exec("PRAGMA busy_timeout = 5000");
53
+ const db = drizzle(async (query, parameters, method): Promise<{ rows: unknown[] }> => {
54
+ const statement = sqlite.prepare(query);
55
+ statement.setReturnArrays(true);
56
+ const values = parameters as SQLInputValue[];
57
+ if (method === "run") {
58
+ statement.run(...values);
59
+ return { rows: [] };
60
+ }
61
+ if (method === "get") {
62
+ return { rows: statement.get(...values) as unknown as unknown[] };
63
+ }
64
+ return { rows: statement.all(...values) as unknown as unknown[][] };
65
+ }, { schema });
66
+ const handle: DatabaseHandle = {
67
+ sqlite,
68
+ db,
69
+ filePath,
70
+ };
71
+ handles.set(filePath, handle);
72
+ return handle;
73
+ }
74
+
75
+ export function closeDatabases() {
76
+ for (const handle of handles.values()) handle.sqlite.close();
77
+ handles.clear();
78
+ }
@@ -0,0 +1,35 @@
1
+ import { integer, sqliteTable, text, uniqueIndex } from "drizzle-orm/sqlite-core";
2
+
3
+ export const contacts = sqliteTable("contacts", {
4
+ id: text("id").primaryKey(),
5
+ name: text("name").notNull(),
6
+ email: text("email").notNull(),
7
+ company: text("company").notNull().default(""),
8
+ status: text("status", { enum: ["new", "contacted", "replied", "paused"] })
9
+ .notNull()
10
+ .default("new"),
11
+ createdAt: integer("created_at", { mode: "timestamp_ms" }).notNull(),
12
+ updatedAt: integer("updated_at", { mode: "timestamp_ms" }).notNull(),
13
+ }, (table) => [
14
+ uniqueIndex("contacts_email_uq").on(table.email),
15
+ ]);
16
+
17
+ export const jobs = sqliteTable("jobs", {
18
+ id: text("id").primaryKey(),
19
+ kind: text("kind").notNull(),
20
+ idempotencyKey: text("idempotency_key").notNull(),
21
+ payloadJson: text("payload_json").notNull().default("{}"),
22
+ status: text("status", { enum: ["pending", "running", "completed", "failed", "missed"] })
23
+ .notNull()
24
+ .default("pending"),
25
+ catchUpPolicy: text("catch_up_policy", { enum: ["run", "skip", "prompt"] })
26
+ .notNull()
27
+ .default("prompt"),
28
+ scheduledFor: integer("scheduled_for", { mode: "timestamp_ms" }).notNull(),
29
+ attempts: integer("attempts").notNull().default(0),
30
+ lastError: text("last_error"),
31
+ createdAt: integer("created_at", { mode: "timestamp_ms" }).notNull(),
32
+ updatedAt: integer("updated_at", { mode: "timestamp_ms" }).notNull(),
33
+ }, (table) => [
34
+ uniqueIndex("jobs_idempotency_key_uq").on(table.idempotencyKey),
35
+ ]);
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+
3
+ export const contactStatusSchema = z.enum(["new", "contacted", "replied", "paused"]);
4
+
5
+ export const contactCreateSchema = z.object({
6
+ name: z.string().trim().min(1).max(120),
7
+ email: z.email().max(320),
8
+ company: z.string().trim().max(160).default(""),
9
+ status: contactStatusSchema.default("new"),
10
+ });
11
+
12
+ export const contactUpdateSchema = contactCreateSchema.partial().refine(
13
+ (value) => Object.keys(value).length > 0,
14
+ "At least one contact field is required",
15
+ );
16
+
17
+ export type ContactInput = z.infer<typeof contactCreateSchema>;
18
+ export type ContactStatus = z.infer<typeof contactStatusSchema>;
@@ -0,0 +1,56 @@
1
+ import { getDatabase } from "@/lib/db/client";
2
+
3
+ type RunnerState = {
4
+ timer: NodeJS.Timeout | null;
5
+ ticking: boolean;
6
+ };
7
+
8
+ const globalState = globalThis as typeof globalThis & {
9
+ __rudderAppJobRunner?: RunnerState;
10
+ };
11
+
12
+ function state(): RunnerState {
13
+ globalState.__rudderAppJobRunner ??= { timer: null, ticking: false };
14
+ return globalState.__rudderAppJobRunner;
15
+ }
16
+
17
+ async function tick() {
18
+ const current = state();
19
+ if (current.ticking) return;
20
+ current.ticking = true;
21
+ try {
22
+ const { sqlite } = getDatabase();
23
+ const now = Date.now();
24
+ sqlite.prepare(`
25
+ update jobs
26
+ set status = case catch_up_policy
27
+ when 'skip' then 'missed'
28
+ when 'run' then 'pending'
29
+ else 'missed'
30
+ end,
31
+ updated_at = ?
32
+ where status = 'pending' and scheduled_for < ?
33
+ `).run(now, now - 60_000);
34
+ // Domain-specific handlers should claim one pending job transactionally,
35
+ // execute it with the persisted idempotency key, and then complete/fail it.
36
+ } catch {
37
+ // The health endpoint remains authoritative. A missing pre-migration table
38
+ // must not create an unhandled background rejection during startup.
39
+ } finally {
40
+ current.ticking = false;
41
+ }
42
+ }
43
+
44
+ export function startJobRunner() {
45
+ const current = state();
46
+ if (current.timer) return;
47
+ current.timer = setInterval(() => void tick(), 15_000);
48
+ current.timer.unref();
49
+ void tick();
50
+ }
51
+
52
+ export function stopJobRunner() {
53
+ const current = state();
54
+ if (current.timer) clearInterval(current.timer);
55
+ current.timer = null;
56
+ }
@@ -0,0 +1,6 @@
1
+ import { clsx, type ClassValue } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs));
6
+ }
@@ -0,0 +1,27 @@
1
+ CREATE TABLE `contacts` (
2
+ `id` text PRIMARY KEY NOT NULL,
3
+ `name` text NOT NULL,
4
+ `email` text NOT NULL,
5
+ `company` text DEFAULT '' NOT NULL,
6
+ `status` text DEFAULT 'new' NOT NULL,
7
+ `created_at` integer NOT NULL,
8
+ `updated_at` integer NOT NULL
9
+ );
10
+ --> statement-breakpoint
11
+ CREATE UNIQUE INDEX `contacts_email_uq` ON `contacts` (`email`);
12
+ --> statement-breakpoint
13
+ CREATE TABLE `jobs` (
14
+ `id` text PRIMARY KEY NOT NULL,
15
+ `kind` text NOT NULL,
16
+ `idempotency_key` text NOT NULL,
17
+ `payload_json` text DEFAULT '{}' NOT NULL,
18
+ `status` text DEFAULT 'pending' NOT NULL,
19
+ `catch_up_policy` text DEFAULT 'prompt' NOT NULL,
20
+ `scheduled_for` integer NOT NULL,
21
+ `attempts` integer DEFAULT 0 NOT NULL,
22
+ `last_error` text,
23
+ `created_at` integer NOT NULL,
24
+ `updated_at` integer NOT NULL
25
+ );
26
+ --> statement-breakpoint
27
+ CREATE UNIQUE INDEX `jobs_idempotency_key_uq` ON `jobs` (`idempotency_key`);
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "sqlite",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "6",
8
+ "when": 1785312000000,
9
+ "tag": "0000_app_builder_foundation",
10
+ "breakpoints": true
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,6 @@
1
+ /// <reference types="next" />
2
+ /// <reference types="next/image-types/global" />
3
+ import "./.next/dev/types/routes.d.ts";
4
+
5
+ // NOTE: This file should not be edited
6
+ // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
@@ -0,0 +1,8 @@
1
+ import type { NextConfig } from "next";
2
+
3
+ const nextConfig: NextConfig = {
4
+ output: "standalone",
5
+ poweredByHeader: false,
6
+ };
7
+
8
+ export default nextConfig;
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "rudder-app",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "engines": {
7
+ "node": ">=22.5.0"
8
+ },
9
+ "scripts": {
10
+ "dev": "next dev --hostname 127.0.0.1",
11
+ "build": "next build",
12
+ "start": "next start --hostname 127.0.0.1",
13
+ "typecheck": "tsc --noEmit",
14
+ "test": "vitest run",
15
+ "test:e2e": "playwright test",
16
+ "db:generate": "drizzle-kit generate",
17
+ "db:migrate": "tsx scripts/migrate.ts",
18
+ "db:seed": "tsx scripts/seed.ts",
19
+ "data:snapshot": "tsx scripts/snapshot.ts",
20
+ "verify": "tsc --noEmit && vitest run && next build",
21
+ "predev": "tsx scripts/migrate.ts && tsx scripts/seed.ts"
22
+ },
23
+ "dependencies": {
24
+ "@radix-ui/react-slot": "1.2.4",
25
+ "class-variance-authority": "0.7.1",
26
+ "clsx": "2.1.1",
27
+ "drizzle-orm": "0.45.2",
28
+ "lucide-react": "1.27.0",
29
+ "next": "16.2.12",
30
+ "react": "19.2.8",
31
+ "react-dom": "19.2.8",
32
+ "tailwind-merge": "3.6.0",
33
+ "zod": "4.4.3"
34
+ },
35
+ "devDependencies": {
36
+ "@playwright/test": "1.58.2",
37
+ "@tailwindcss/postcss": "4.3.3",
38
+ "@types/node": "24.12.0",
39
+ "@types/react": "19.2.7",
40
+ "@types/react-dom": "19.2.3",
41
+ "drizzle-kit": "0.31.10",
42
+ "tailwindcss": "4.3.3",
43
+ "tsx": "4.23.1",
44
+ "typescript": "5.9.3",
45
+ "vitest": "3.2.7"
46
+ }
47
+ }
@@ -0,0 +1,30 @@
1
+ import { defineConfig, devices } from "@playwright/test";
2
+
3
+ export default defineConfig({
4
+ testDir: "./tests/e2e",
5
+ fullyParallel: false,
6
+ retries: 0,
7
+ reporter: "list",
8
+ use: {
9
+ baseURL: process.env.RUDDER_APP_BASE_URL ?? "http://127.0.0.1:3000",
10
+ trace: "retain-on-failure",
11
+ },
12
+ webServer: process.env.RUDDER_APP_BASE_URL
13
+ ? undefined
14
+ : {
15
+ command: "pnpm exec next dev --hostname 127.0.0.1 --port 3000",
16
+ url: "http://127.0.0.1:3000/api/__rudder/health",
17
+ reuseExistingServer: true,
18
+ timeout: 120_000,
19
+ },
20
+ projects: [
21
+ { name: "desktop", use: { ...devices["Desktop Chrome"] } },
22
+ {
23
+ name: "mobile",
24
+ use: {
25
+ viewport: { width: 390, height: 844 },
26
+ isMobile: true,
27
+ },
28
+ },
29
+ ],
30
+ });