@voltro/cli 0.1.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 (626) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/LICENSE +57 -0
  3. package/README.md +26 -0
  4. package/SECURITY.md +56 -0
  5. package/THIRD-PARTY-NOTICES.md +20236 -0
  6. package/bin/voltro.mjs +43 -0
  7. package/dist/bin.d.ts +1 -0
  8. package/dist/bin.js +9 -0
  9. package/dist/commands-CfPH2Wf4.js +18061 -0
  10. package/dist/frameworkInspectState-CX2250XB.js +86 -0
  11. package/dist/index.d.ts +48 -0
  12. package/dist/index.js +5 -0
  13. package/dist/inspectState.d.ts +116 -0
  14. package/dist/inspectState.js +2 -0
  15. package/dist/startup.d.ts +26 -0
  16. package/dist/startup.js +2 -0
  17. package/dist/startupRunner-CRhuUl91.js +71 -0
  18. package/package.json +88 -0
  19. package/templates/AGENTS.core.md +258 -0
  20. package/templates/AGENTS.md +351 -0
  21. package/templates/agent-docs/_index.md +93 -0
  22. package/templates/agent-docs/_manifest.json +655 -0
  23. package/templates/agent-docs/ai.md +1845 -0
  24. package/templates/agent-docs/authentication.md +1788 -0
  25. package/templates/agent-docs/caching.md +624 -0
  26. package/templates/agent-docs/cli.md +1650 -0
  27. package/templates/agent-docs/configuration.md +295 -0
  28. package/templates/agent-docs/data.md +2172 -0
  29. package/templates/agent-docs/database/advancedqueries.md +1583 -0
  30. package/templates/agent-docs/database/columntypes.md +1200 -0
  31. package/templates/agent-docs/database/hosting.md +881 -0
  32. package/templates/agent-docs/database/migrations.md +2938 -0
  33. package/templates/agent-docs/database/misc.md +270 -0
  34. package/templates/agent-docs/database/overview.md +108 -0
  35. package/templates/agent-docs/database/querying.md +1622 -0
  36. package/templates/agent-docs/database/scaling.md +331 -0
  37. package/templates/agent-docs/database/schema.md +1458 -0
  38. package/templates/agent-docs/database/seedsdialects.md +1235 -0
  39. package/templates/agent-docs/database/transactions.md +285 -0
  40. package/templates/agent-docs/deployment.md +999 -0
  41. package/templates/agent-docs/internationalization.md +359 -0
  42. package/templates/agent-docs/introduction.md +438 -0
  43. package/templates/agent-docs/multi-tenancy.md +610 -0
  44. package/templates/agent-docs/observability.md +350 -0
  45. package/templates/agent-docs/plugins.md +1273 -0
  46. package/templates/agent-docs/reference.md +978 -0
  47. package/templates/agent-docs/routing.md +1553 -0
  48. package/templates/agent-docs/scheduling.md +666 -0
  49. package/templates/agent-docs/schema-driven-ui.md +607 -0
  50. package/templates/agent-docs/security.md +42 -0
  51. package/templates/agent-docs/templates/apibackends.md +3214 -0
  52. package/templates/agent-docs/templates/appshells.md +2062 -0
  53. package/templates/agent-docs/templates/custom.md +128 -0
  54. package/templates/agent-docs/templates/overview.md +122 -0
  55. package/templates/agent-docs/templates/serverless.md +315 -0
  56. package/templates/agent-docs/testing.md +376 -0
  57. package/templates/agent-docs/workflows.md +1351 -0
  58. package/templates/apps/api-ai/README.md +105 -0
  59. package/templates/apps/api-ai/actions/summarize.action.server.tsx +32 -0
  60. package/templates/apps/api-ai/actions/summarize.action.ts +33 -0
  61. package/templates/apps/api-ai/agents/support.agent.server.tsx +31 -0
  62. package/templates/apps/api-ai/agents/support.agent.tsx +27 -0
  63. package/templates/apps/api-ai/app.config.ts +57 -0
  64. package/templates/apps/api-ai/database/schema.ts +67 -0
  65. package/templates/apps/api-ai/package.json +27 -0
  66. package/templates/apps/api-ai/seeds/docs.seed.ts +67 -0
  67. package/templates/apps/api-ai/template.json +6 -0
  68. package/templates/apps/api-ai/tests/summarize.test.ts +50 -0
  69. package/templates/apps/api-ai/tools/searchDocs.tool.tsx +60 -0
  70. package/templates/apps/api-ai/tsconfig.json +5 -0
  71. package/templates/apps/api-auth/.env +17 -0
  72. package/templates/apps/api-auth/README.md +109 -0
  73. package/templates/apps/api-auth/actions/me.action.server.ts +20 -0
  74. package/templates/apps/api-auth/actions/me.action.ts +19 -0
  75. package/templates/apps/api-auth/app.config.ts +59 -0
  76. package/templates/apps/api-auth/database/schema.ts +26 -0
  77. package/templates/apps/api-auth/package.json +28 -0
  78. package/templates/apps/api-auth/template.json +6 -0
  79. package/templates/apps/api-auth/tests/me.test.ts +37 -0
  80. package/templates/apps/api-auth/tsconfig.json +5 -0
  81. package/templates/apps/api-backend/README.md +25 -0
  82. package/templates/apps/api-backend/app.config.ts +39 -0
  83. package/templates/apps/api-backend/database/schema.ts +57 -0
  84. package/templates/apps/api-backend/mutations/notes.create.mutation.server.ts +19 -0
  85. package/templates/apps/api-backend/mutations/notes.create.mutation.ts +37 -0
  86. package/templates/apps/api-backend/package.json +28 -0
  87. package/templates/apps/api-backend/queries/notes.query.server.ts +14 -0
  88. package/templates/apps/api-backend/queries/notes.query.ts +20 -0
  89. package/templates/apps/api-backend/template.json +6 -0
  90. package/templates/apps/api-backend/tests/notes.create.test.ts +50 -0
  91. package/templates/apps/api-backend/tsconfig.json +5 -0
  92. package/templates/apps/api-backend-deactivation/README.md +49 -0
  93. package/templates/apps/api-backend-deactivation/actions/users.get.action.server.ts +17 -0
  94. package/templates/apps/api-backend-deactivation/actions/users.get.action.ts +18 -0
  95. package/templates/apps/api-backend-deactivation/app.config.ts +20 -0
  96. package/templates/apps/api-backend-deactivation/database/schema.ts +41 -0
  97. package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.server.ts +6 -0
  98. package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.ts +16 -0
  99. package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.server.ts +10 -0
  100. package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.ts +19 -0
  101. package/templates/apps/api-backend-deactivation/package.json +28 -0
  102. package/templates/apps/api-backend-deactivation/template.json +6 -0
  103. package/templates/apps/api-backend-deactivation/tests/users.deactivate.test.ts +47 -0
  104. package/templates/apps/api-backend-deactivation/tsconfig.json +5 -0
  105. package/templates/apps/api-backend-mail/README.md +39 -0
  106. package/templates/apps/api-backend-mail/actions/sendWelcome.action.server.ts +15 -0
  107. package/templates/apps/api-backend-mail/actions/sendWelcome.action.ts +21 -0
  108. package/templates/apps/api-backend-mail/app.config.ts +34 -0
  109. package/templates/apps/api-backend-mail/database/schema.ts +57 -0
  110. package/templates/apps/api-backend-mail/emails/welcome.email.tsx +106 -0
  111. package/templates/apps/api-backend-mail/mutations/notes.create.mutation.server.ts +19 -0
  112. package/templates/apps/api-backend-mail/mutations/notes.create.mutation.ts +37 -0
  113. package/templates/apps/api-backend-mail/package.json +30 -0
  114. package/templates/apps/api-backend-mail/queries/notes.query.server.ts +14 -0
  115. package/templates/apps/api-backend-mail/queries/notes.query.ts +20 -0
  116. package/templates/apps/api-backend-mail/template.json +6 -0
  117. package/templates/apps/api-backend-mail/tests/notes.create.test.ts +50 -0
  118. package/templates/apps/api-backend-mail/tsconfig.json +5 -0
  119. package/templates/apps/api-backend-mariadb/.env.example +35 -0
  120. package/templates/apps/api-backend-mariadb/README.md +31 -0
  121. package/templates/apps/api-backend-mariadb/app.config.ts +68 -0
  122. package/templates/apps/api-backend-mariadb/database/schema.ts +57 -0
  123. package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.server.ts +19 -0
  124. package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.ts +37 -0
  125. package/templates/apps/api-backend-mariadb/package.json +30 -0
  126. package/templates/apps/api-backend-mariadb/queries/notes.query.server.ts +14 -0
  127. package/templates/apps/api-backend-mariadb/queries/notes.query.ts +20 -0
  128. package/templates/apps/api-backend-mariadb/template.json +6 -0
  129. package/templates/apps/api-backend-mariadb/tests/notes.create.test.ts +50 -0
  130. package/templates/apps/api-backend-mariadb/tsconfig.json +5 -0
  131. package/templates/apps/api-backend-storage/README.md +86 -0
  132. package/templates/apps/api-backend-storage/actions/uploadAvatar.action.server.ts +21 -0
  133. package/templates/apps/api-backend-storage/actions/uploadAvatar.action.ts +21 -0
  134. package/templates/apps/api-backend-storage/actions/uploadDocument.action.server.ts +21 -0
  135. package/templates/apps/api-backend-storage/actions/uploadDocument.action.ts +20 -0
  136. package/templates/apps/api-backend-storage/app.config.ts +38 -0
  137. package/templates/apps/api-backend-storage/database/schema.ts +57 -0
  138. package/templates/apps/api-backend-storage/mutations/notes.create.mutation.server.ts +19 -0
  139. package/templates/apps/api-backend-storage/mutations/notes.create.mutation.ts +37 -0
  140. package/templates/apps/api-backend-storage/package.json +27 -0
  141. package/templates/apps/api-backend-storage/queries/notes.query.server.ts +14 -0
  142. package/templates/apps/api-backend-storage/queries/notes.query.ts +20 -0
  143. package/templates/apps/api-backend-storage/template.json +6 -0
  144. package/templates/apps/api-backend-storage/tests/notes.create.test.ts +50 -0
  145. package/templates/apps/api-backend-storage/tsconfig.json +5 -0
  146. package/templates/apps/api-data-advanced/.env +17 -0
  147. package/templates/apps/api-data-advanced/README.md +88 -0
  148. package/templates/apps/api-data-advanced/app.config.ts +56 -0
  149. package/templates/apps/api-data-advanced/database/actors.entity.ts +14 -0
  150. package/templates/apps/api-data-advanced/database/authors.entity.ts +30 -0
  151. package/templates/apps/api-data-advanced/database/authors.relations.ts +15 -0
  152. package/templates/apps/api-data-advanced/database/books.entity.ts +59 -0
  153. package/templates/apps/api-data-advanced/database/books.relations.ts +10 -0
  154. package/templates/apps/api-data-advanced/database/index.ts +23 -0
  155. package/templates/apps/api-data-advanced/database/tenants.entity.ts +11 -0
  156. package/templates/apps/api-data-advanced/package.json +28 -0
  157. package/templates/apps/api-data-advanced/queries/authors.withBooks.query.server.ts +18 -0
  158. package/templates/apps/api-data-advanced/queries/authors.withBooks.query.ts +40 -0
  159. package/templates/apps/api-data-advanced/queries/books.search.query.server.ts +17 -0
  160. package/templates/apps/api-data-advanced/queries/books.search.query.ts +39 -0
  161. package/templates/apps/api-data-advanced/seeds/catalog.seed.ts +101 -0
  162. package/templates/apps/api-data-advanced/template.json +6 -0
  163. package/templates/apps/api-data-advanced/tests/queries.test.ts +124 -0
  164. package/templates/apps/api-data-advanced/tsconfig.json +5 -0
  165. package/templates/apps/api-durable/README.md +81 -0
  166. package/templates/apps/api-durable/aggregates/orderStats.aggregate.ts +49 -0
  167. package/templates/apps/api-durable/app.config.ts +41 -0
  168. package/templates/apps/api-durable/database/schema.ts +65 -0
  169. package/templates/apps/api-durable/mutations/orders.approve.mutation.server.ts +43 -0
  170. package/templates/apps/api-durable/mutations/orders.approve.mutation.ts +23 -0
  171. package/templates/apps/api-durable/mutations/orders.place.mutation.server.ts +45 -0
  172. package/templates/apps/api-durable/mutations/orders.place.mutation.ts +40 -0
  173. package/templates/apps/api-durable/package.json +28 -0
  174. package/templates/apps/api-durable/schedules/nightlyReport.cron.tsx +37 -0
  175. package/templates/apps/api-durable/startup/warm.startup.tsx +33 -0
  176. package/templates/apps/api-durable/subscribers/orderChanges.subscribe.ts +27 -0
  177. package/templates/apps/api-durable/template.json +6 -0
  178. package/templates/apps/api-durable/tests/orders.place.test.ts +91 -0
  179. package/templates/apps/api-durable/triggers/order.placed.trigger.tsx +21 -0
  180. package/templates/apps/api-durable/tsconfig.json +5 -0
  181. package/templates/apps/api-durable/workflows/order.fulfill.workflow.server.tsx +103 -0
  182. package/templates/apps/api-durable/workflows/order.fulfill.workflow.tsx +25 -0
  183. package/templates/apps/api-feature-flags/README.md +63 -0
  184. package/templates/apps/api-feature-flags/actions/notes.export.action.server.ts +11 -0
  185. package/templates/apps/api-feature-flags/actions/notes.export.action.ts +18 -0
  186. package/templates/apps/api-feature-flags/app.config.ts +41 -0
  187. package/templates/apps/api-feature-flags/database/schema.ts +37 -0
  188. package/templates/apps/api-feature-flags/mutations/notes.create.mutation.server.ts +29 -0
  189. package/templates/apps/api-feature-flags/mutations/notes.create.mutation.ts +28 -0
  190. package/templates/apps/api-feature-flags/package.json +29 -0
  191. package/templates/apps/api-feature-flags/template.json +6 -0
  192. package/templates/apps/api-feature-flags/tests/notes.create.test.ts +67 -0
  193. package/templates/apps/api-feature-flags/tsconfig.json +5 -0
  194. package/templates/apps/api-governance/.env +4 -0
  195. package/templates/apps/api-governance/README.md +61 -0
  196. package/templates/apps/api-governance/actions/profiles.get.action.server.ts +17 -0
  197. package/templates/apps/api-governance/actions/profiles.get.action.ts +17 -0
  198. package/templates/apps/api-governance/app.config.ts +35 -0
  199. package/templates/apps/api-governance/database/schema.ts +41 -0
  200. package/templates/apps/api-governance/mutations/profiles.create.mutation.server.ts +17 -0
  201. package/templates/apps/api-governance/mutations/profiles.create.mutation.ts +21 -0
  202. package/templates/apps/api-governance/package.json +29 -0
  203. package/templates/apps/api-governance/template.json +6 -0
  204. package/templates/apps/api-governance/tests/profiles.create.test.ts +59 -0
  205. package/templates/apps/api-governance/tsconfig.json +5 -0
  206. package/templates/apps/api-kv/README.md +100 -0
  207. package/templates/apps/api-kv/actions/sync.pull.action.server.ts +75 -0
  208. package/templates/apps/api-kv/actions/sync.pull.action.ts +25 -0
  209. package/templates/apps/api-kv/actions/sync.reset.action.server.ts +25 -0
  210. package/templates/apps/api-kv/actions/sync.reset.action.ts +22 -0
  211. package/templates/apps/api-kv/actions/sync.status.action.server.ts +28 -0
  212. package/templates/apps/api-kv/actions/sync.status.action.ts +17 -0
  213. package/templates/apps/api-kv/app.config.ts +48 -0
  214. package/templates/apps/api-kv/database/schema.ts +62 -0
  215. package/templates/apps/api-kv/package.json +28 -0
  216. package/templates/apps/api-kv/queries/events.list.query.server.ts +14 -0
  217. package/templates/apps/api-kv/queries/events.list.query.ts +23 -0
  218. package/templates/apps/api-kv/template.json +6 -0
  219. package/templates/apps/api-kv/tests/sync.test.ts +103 -0
  220. package/templates/apps/api-kv/tsconfig.json +5 -0
  221. package/templates/apps/api-moderation/README.md +46 -0
  222. package/templates/apps/api-moderation/app.config.ts +33 -0
  223. package/templates/apps/api-moderation/database/schema.ts +45 -0
  224. package/templates/apps/api-moderation/mutations/comments.create.mutation.server.ts +8 -0
  225. package/templates/apps/api-moderation/mutations/comments.create.mutation.ts +20 -0
  226. package/templates/apps/api-moderation/mutations/posts.create.mutation.server.ts +9 -0
  227. package/templates/apps/api-moderation/mutations/posts.create.mutation.ts +25 -0
  228. package/templates/apps/api-moderation/package.json +29 -0
  229. package/templates/apps/api-moderation/template.json +6 -0
  230. package/templates/apps/api-moderation/tests/posts.create.test.ts +79 -0
  231. package/templates/apps/api-moderation/tsconfig.json +5 -0
  232. package/templates/apps/api-observability/README.md +106 -0
  233. package/templates/apps/api-observability/app.config.ts +32 -0
  234. package/templates/apps/api-observability/database/schema.ts +38 -0
  235. package/templates/apps/api-observability/mutations/notes.create.mutation.server.ts +33 -0
  236. package/templates/apps/api-observability/mutations/notes.create.mutation.ts +15 -0
  237. package/templates/apps/api-observability/package.json +29 -0
  238. package/templates/apps/api-observability/queries/notes.list.query.server.ts +7 -0
  239. package/templates/apps/api-observability/queries/notes.list.query.ts +14 -0
  240. package/templates/apps/api-observability/template.json +6 -0
  241. package/templates/apps/api-observability/tests/notes.create.test.ts +36 -0
  242. package/templates/apps/api-observability/tsconfig.json +5 -0
  243. package/templates/apps/api-ratelimit/README.md +49 -0
  244. package/templates/apps/api-ratelimit/app.config.ts +42 -0
  245. package/templates/apps/api-ratelimit/database/schema.ts +37 -0
  246. package/templates/apps/api-ratelimit/mutations/notes.create.mutation.server.ts +16 -0
  247. package/templates/apps/api-ratelimit/mutations/notes.create.mutation.ts +34 -0
  248. package/templates/apps/api-ratelimit/package.json +29 -0
  249. package/templates/apps/api-ratelimit/template.json +6 -0
  250. package/templates/apps/api-ratelimit/tests/notes.create.test.ts +69 -0
  251. package/templates/apps/api-ratelimit/tsconfig.json +5 -0
  252. package/templates/apps/api-rbac/README.md +59 -0
  253. package/templates/apps/api-rbac/app.config.ts +48 -0
  254. package/templates/apps/api-rbac/database/schema.ts +37 -0
  255. package/templates/apps/api-rbac/mutations/notes.create.mutation.server.ts +22 -0
  256. package/templates/apps/api-rbac/mutations/notes.create.mutation.ts +26 -0
  257. package/templates/apps/api-rbac/package.json +29 -0
  258. package/templates/apps/api-rbac/template.json +6 -0
  259. package/templates/apps/api-rbac/tests/notes.create.test.ts +80 -0
  260. package/templates/apps/api-rbac/tsconfig.json +5 -0
  261. package/templates/apps/api-rest/README.md +85 -0
  262. package/templates/apps/api-rest/app.config.ts +70 -0
  263. package/templates/apps/api-rest/database/schema.ts +52 -0
  264. package/templates/apps/api-rest/lib/product.ts +30 -0
  265. package/templates/apps/api-rest/package.json +27 -0
  266. package/templates/apps/api-rest/routes/v1/products.create.route.tsx +45 -0
  267. package/templates/apps/api-rest/routes/v1/products.delete.route.tsx +25 -0
  268. package/templates/apps/api-rest/routes/v1/products.get.route.tsx +29 -0
  269. package/templates/apps/api-rest/routes/v1/products.list.route.tsx +43 -0
  270. package/templates/apps/api-rest/template.json +6 -0
  271. package/templates/apps/api-rest/tests/products.create.test.ts +53 -0
  272. package/templates/apps/api-rest/tsconfig.json +5 -0
  273. package/templates/apps/api-saas/README.md +106 -0
  274. package/templates/apps/api-saas/app.config.ts +51 -0
  275. package/templates/apps/api-saas/database/schema.ts +50 -0
  276. package/templates/apps/api-saas/mutations/projects.create.mutation.server.ts +52 -0
  277. package/templates/apps/api-saas/mutations/projects.create.mutation.ts +18 -0
  278. package/templates/apps/api-saas/package.json +31 -0
  279. package/templates/apps/api-saas/queries/projects.list.query.server.ts +7 -0
  280. package/templates/apps/api-saas/queries/projects.list.query.ts +18 -0
  281. package/templates/apps/api-saas/template.json +6 -0
  282. package/templates/apps/api-saas/tests/projects.create.test.ts +47 -0
  283. package/templates/apps/api-saas/tsconfig.json +5 -0
  284. package/templates/apps/api-search/README.md +68 -0
  285. package/templates/apps/api-search/app.config.ts +31 -0
  286. package/templates/apps/api-search/database/schema.ts +47 -0
  287. package/templates/apps/api-search/lib/search.ts +27 -0
  288. package/templates/apps/api-search/mutations/articles.create.mutation.server.ts +19 -0
  289. package/templates/apps/api-search/mutations/articles.create.mutation.ts +35 -0
  290. package/templates/apps/api-search/package.json +29 -0
  291. package/templates/apps/api-search/queries/articles.list.query.server.ts +14 -0
  292. package/templates/apps/api-search/queries/articles.list.query.ts +19 -0
  293. package/templates/apps/api-search/seeds/articles.seed.ts +41 -0
  294. package/templates/apps/api-search/startup/searchBackfill.startup.tsx +24 -0
  295. package/templates/apps/api-search/template.json +6 -0
  296. package/templates/apps/api-search/tests/articles.create.test.ts +69 -0
  297. package/templates/apps/api-search/tsconfig.json +5 -0
  298. package/templates/apps/api-versioning/README.md +51 -0
  299. package/templates/apps/api-versioning/actions/documents.asOf.action.server.ts +13 -0
  300. package/templates/apps/api-versioning/actions/documents.asOf.action.ts +14 -0
  301. package/templates/apps/api-versioning/actions/documents.history.action.server.ts +15 -0
  302. package/templates/apps/api-versioning/actions/documents.history.action.ts +17 -0
  303. package/templates/apps/api-versioning/app.config.ts +24 -0
  304. package/templates/apps/api-versioning/database/schema.ts +38 -0
  305. package/templates/apps/api-versioning/mutations/documents.create.mutation.server.ts +8 -0
  306. package/templates/apps/api-versioning/mutations/documents.create.mutation.ts +21 -0
  307. package/templates/apps/api-versioning/mutations/documents.update.mutation.server.ts +9 -0
  308. package/templates/apps/api-versioning/mutations/documents.update.mutation.ts +21 -0
  309. package/templates/apps/api-versioning/package.json +29 -0
  310. package/templates/apps/api-versioning/template.json +6 -0
  311. package/templates/apps/api-versioning/tests/documents.create.test.ts +37 -0
  312. package/templates/apps/api-versioning/tsconfig.json +5 -0
  313. package/templates/apps/api-webhooks/.env +6 -0
  314. package/templates/apps/api-webhooks/README.md +106 -0
  315. package/templates/apps/api-webhooks/app.config.ts +16 -0
  316. package/templates/apps/api-webhooks/database/schema.ts +49 -0
  317. package/templates/apps/api-webhooks/events/order.completed.webhook.tsx +22 -0
  318. package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.server.ts +37 -0
  319. package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.ts +15 -0
  320. package/templates/apps/api-webhooks/package.json +28 -0
  321. package/templates/apps/api-webhooks/queries/orders.list.query.server.ts +7 -0
  322. package/templates/apps/api-webhooks/queries/orders.list.query.ts +15 -0
  323. package/templates/apps/api-webhooks/template.json +6 -0
  324. package/templates/apps/api-webhooks/tests/orders.fulfill.test.ts +51 -0
  325. package/templates/apps/api-webhooks/tsconfig.json +5 -0
  326. package/templates/apps/api-webhooks/webhooks/orders.webhook.tsx +35 -0
  327. package/templates/apps/changelog/README.md +77 -0
  328. package/templates/apps/changelog/app.config.ts +27 -0
  329. package/templates/apps/changelog/content/releases/0.1.0.mdx +19 -0
  330. package/templates/apps/changelog/content/releases/0.2.0.mdx +28 -0
  331. package/templates/apps/changelog/package.json +30 -0
  332. package/templates/apps/changelog/scripts/generate-rss.mjs +38 -0
  333. package/templates/apps/changelog/src/globals.css +66 -0
  334. package/templates/apps/changelog/src/globals.d.ts +16 -0
  335. package/templates/apps/changelog/src/lib/locale.test.ts +72 -0
  336. package/templates/apps/changelog/src/lib/locale.ts +55 -0
  337. package/templates/apps/changelog/src/lib/releases.ts +21 -0
  338. package/templates/apps/changelog/src/locales/de.ts +22 -0
  339. package/templates/apps/changelog/src/locales/en.ts +30 -0
  340. package/templates/apps/changelog/src/pages/[locale]/[slug].tsx +24 -0
  341. package/templates/apps/changelog/src/pages/[locale]/index.tsx +13 -0
  342. package/templates/apps/changelog/src/pages/[locale]/mirrors.test.tsx +95 -0
  343. package/templates/apps/changelog/src/pages/[slug].test.tsx +127 -0
  344. package/templates/apps/changelog/src/pages/[slug].tsx +52 -0
  345. package/templates/apps/changelog/src/pages/index.test.tsx +112 -0
  346. package/templates/apps/changelog/src/pages/index.tsx +55 -0
  347. package/templates/apps/changelog/src/pages/layout.tsx +84 -0
  348. package/templates/apps/changelog/template.json +6 -0
  349. package/templates/apps/changelog/tsconfig.json +11 -0
  350. package/templates/apps/edge-functions/README.md +55 -0
  351. package/templates/apps/edge-functions/functions/aiComplete.serverless.ts +58 -0
  352. package/templates/apps/edge-functions/functions/currencyConvert.serverless.ts +47 -0
  353. package/templates/apps/edge-functions/functions/geoGreeting.serverless.ts +44 -0
  354. package/templates/apps/edge-functions/functions/health.serverless.ts +29 -0
  355. package/templates/apps/edge-functions/functions/resolveLink.serverless.ts +32 -0
  356. package/templates/apps/edge-functions/functions/shareLink.serverless.ts +30 -0
  357. package/templates/apps/edge-functions/functions/slackNotify.serverless.ts +40 -0
  358. package/templates/apps/edge-functions/functions/verifySignature.serverless.ts +52 -0
  359. package/templates/apps/edge-functions/package.json +21 -0
  360. package/templates/apps/edge-functions/template.json +6 -0
  361. package/templates/apps/edge-functions/tsconfig.json +10 -0
  362. package/templates/apps/frontend-admin/README.md +40 -0
  363. package/templates/apps/frontend-admin/app.config.ts +37 -0
  364. package/templates/apps/frontend-admin/package.json +30 -0
  365. package/templates/apps/frontend-admin/src/config.ts +8 -0
  366. package/templates/apps/frontend-admin/src/globals.css +76 -0
  367. package/templates/apps/frontend-admin/src/globals.d.ts +6 -0
  368. package/templates/apps/frontend-admin/src/lib/admin.ts +16 -0
  369. package/templates/apps/frontend-admin/src/lib/auth.ts +24 -0
  370. package/templates/apps/frontend-admin/src/locales/de.ts +67 -0
  371. package/templates/apps/frontend-admin/src/locales/en.ts +79 -0
  372. package/templates/apps/frontend-admin/src/locales/index.ts +15 -0
  373. package/templates/apps/frontend-admin/src/pages/(marketing)/index.test.tsx +55 -0
  374. package/templates/apps/frontend-admin/src/pages/(marketing)/index.tsx +32 -0
  375. package/templates/apps/frontend-admin/src/pages/(marketing)/layout.tsx +29 -0
  376. package/templates/apps/frontend-admin/src/pages/(marketing)/login.test.tsx +73 -0
  377. package/templates/apps/frontend-admin/src/pages/(marketing)/login.tsx +35 -0
  378. package/templates/apps/frontend-admin/src/pages/admin/[entity].tsx +121 -0
  379. package/templates/apps/frontend-admin/src/pages/admin/entity.test.tsx +119 -0
  380. package/templates/apps/frontend-admin/src/pages/admin/error.tsx +20 -0
  381. package/templates/apps/frontend-admin/src/pages/admin/fallbacks.test.tsx +68 -0
  382. package/templates/apps/frontend-admin/src/pages/admin/index.test.tsx +88 -0
  383. package/templates/apps/frontend-admin/src/pages/admin/index.tsx +65 -0
  384. package/templates/apps/frontend-admin/src/pages/admin/layout.test.tsx +114 -0
  385. package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +97 -0
  386. package/templates/apps/frontend-admin/src/pages/admin/loading.tsx +15 -0
  387. package/templates/apps/frontend-admin/src/pages/admin/not-found.tsx +15 -0
  388. package/templates/apps/frontend-admin/src/pages/layout.tsx +12 -0
  389. package/templates/apps/frontend-admin/src/pages/layouts.test.tsx +54 -0
  390. package/templates/apps/frontend-admin/template.json +6 -0
  391. package/templates/apps/frontend-admin/tsconfig.json +11 -0
  392. package/templates/apps/frontend-app/README.md +98 -0
  393. package/templates/apps/frontend-app/app.config.ts +43 -0
  394. package/templates/apps/frontend-app/package.json +30 -0
  395. package/templates/apps/frontend-app/src/locales/de.ts +36 -0
  396. package/templates/apps/frontend-app/src/locales/en.ts +43 -0
  397. package/templates/apps/frontend-app/src/locales/index.ts +15 -0
  398. package/templates/apps/frontend-app/src/pages/index.test.tsx +167 -0
  399. package/templates/apps/frontend-app/src/pages/index.tsx +136 -0
  400. package/templates/apps/frontend-app/src/pages/layout.tsx +41 -0
  401. package/templates/apps/frontend-app/src/pages/schema-ui.test.tsx +99 -0
  402. package/templates/apps/frontend-app/src/pages/schema-ui.tsx +74 -0
  403. package/templates/apps/frontend-app/template.json +6 -0
  404. package/templates/apps/frontend-app/tsconfig.json +11 -0
  405. package/templates/apps/frontend-blank/README.md +18 -0
  406. package/templates/apps/frontend-blank/app.config.ts +29 -0
  407. package/templates/apps/frontend-blank/package.json +29 -0
  408. package/templates/apps/frontend-blank/src/locales/de.ts +15 -0
  409. package/templates/apps/frontend-blank/src/locales/en.ts +22 -0
  410. package/templates/apps/frontend-blank/src/locales/index.ts +15 -0
  411. package/templates/apps/frontend-blank/src/pages/index.test.tsx +55 -0
  412. package/templates/apps/frontend-blank/src/pages/index.tsx +27 -0
  413. package/templates/apps/frontend-blank/src/pages/layout.test.tsx +54 -0
  414. package/templates/apps/frontend-blank/src/pages/layout.tsx +35 -0
  415. package/templates/apps/frontend-blank/template.json +6 -0
  416. package/templates/apps/frontend-blank/tsconfig.json +11 -0
  417. package/templates/apps/frontend-contact/README.md +65 -0
  418. package/templates/apps/frontend-contact/app.config.ts +25 -0
  419. package/templates/apps/frontend-contact/functions/sendMessage.serverless.ts +69 -0
  420. package/templates/apps/frontend-contact/package.json +33 -0
  421. package/templates/apps/frontend-contact/src/components/ContactForm.island.test.tsx +142 -0
  422. package/templates/apps/frontend-contact/src/components/ContactForm.island.tsx +104 -0
  423. package/templates/apps/frontend-contact/src/config.ts +12 -0
  424. package/templates/apps/frontend-contact/src/globals.css +84 -0
  425. package/templates/apps/frontend-contact/src/lib/locale.ts +55 -0
  426. package/templates/apps/frontend-contact/src/locales/de.ts +26 -0
  427. package/templates/apps/frontend-contact/src/locales/en.ts +29 -0
  428. package/templates/apps/frontend-contact/src/pages/[locale]/index.tsx +14 -0
  429. package/templates/apps/frontend-contact/src/pages/index.test.tsx +70 -0
  430. package/templates/apps/frontend-contact/src/pages/index.tsx +63 -0
  431. package/templates/apps/frontend-contact/src/pages/layout.tsx +65 -0
  432. package/templates/apps/frontend-contact/template.json +6 -0
  433. package/templates/apps/frontend-contact/tsconfig.json +11 -0
  434. package/templates/apps/frontend-dashboard/README.md +54 -0
  435. package/templates/apps/frontend-dashboard/app.config.ts +39 -0
  436. package/templates/apps/frontend-dashboard/package.json +29 -0
  437. package/templates/apps/frontend-dashboard/src/config.ts +8 -0
  438. package/templates/apps/frontend-dashboard/src/globals.css +72 -0
  439. package/templates/apps/frontend-dashboard/src/globals.d.ts +6 -0
  440. package/templates/apps/frontend-dashboard/src/lib/auth.ts +27 -0
  441. package/templates/apps/frontend-dashboard/src/locales/de.ts +49 -0
  442. package/templates/apps/frontend-dashboard/src/locales/en.ts +60 -0
  443. package/templates/apps/frontend-dashboard/src/locales/index.ts +15 -0
  444. package/templates/apps/frontend-dashboard/src/pages/(marketing)/index.test.tsx +55 -0
  445. package/templates/apps/frontend-dashboard/src/pages/(marketing)/index.tsx +34 -0
  446. package/templates/apps/frontend-dashboard/src/pages/(marketing)/layout.tsx +32 -0
  447. package/templates/apps/frontend-dashboard/src/pages/(marketing)/login.test.tsx +74 -0
  448. package/templates/apps/frontend-dashboard/src/pages/(marketing)/login.tsx +40 -0
  449. package/templates/apps/frontend-dashboard/src/pages/dashboard/error.tsx +21 -0
  450. package/templates/apps/frontend-dashboard/src/pages/dashboard/fallbacks.test.tsx +68 -0
  451. package/templates/apps/frontend-dashboard/src/pages/dashboard/index.test.tsx +55 -0
  452. package/templates/apps/frontend-dashboard/src/pages/dashboard/index.tsx +38 -0
  453. package/templates/apps/frontend-dashboard/src/pages/dashboard/layout.test.tsx +88 -0
  454. package/templates/apps/frontend-dashboard/src/pages/dashboard/layout.tsx +69 -0
  455. package/templates/apps/frontend-dashboard/src/pages/dashboard/loading.tsx +21 -0
  456. package/templates/apps/frontend-dashboard/src/pages/dashboard/not-found.tsx +19 -0
  457. package/templates/apps/frontend-dashboard/src/pages/dashboard/settings.test.tsx +69 -0
  458. package/templates/apps/frontend-dashboard/src/pages/dashboard/settings.tsx +35 -0
  459. package/templates/apps/frontend-dashboard/src/pages/layout.tsx +12 -0
  460. package/templates/apps/frontend-dashboard/src/pages/layouts.test.tsx +54 -0
  461. package/templates/apps/frontend-dashboard/template.json +6 -0
  462. package/templates/apps/frontend-dashboard/tsconfig.json +11 -0
  463. package/templates/apps/frontend-docs/README.md +19 -0
  464. package/templates/apps/frontend-docs/app.config.ts +25 -0
  465. package/templates/apps/frontend-docs/package.json +29 -0
  466. package/templates/apps/frontend-docs/src/globals.css +32 -0
  467. package/templates/apps/frontend-docs/src/lib/locale.test.ts +72 -0
  468. package/templates/apps/frontend-docs/src/lib/locale.ts +56 -0
  469. package/templates/apps/frontend-docs/src/locales/de.ts +24 -0
  470. package/templates/apps/frontend-docs/src/locales/en.ts +28 -0
  471. package/templates/apps/frontend-docs/src/pages/[locale]/docs/[...slug].tsx +18 -0
  472. package/templates/apps/frontend-docs/src/pages/[locale]/index.tsx +13 -0
  473. package/templates/apps/frontend-docs/src/pages/[locale]/mirrors.test.tsx +67 -0
  474. package/templates/apps/frontend-docs/src/pages/docs/[...slug].test.tsx +115 -0
  475. package/templates/apps/frontend-docs/src/pages/docs/[...slug].tsx +82 -0
  476. package/templates/apps/frontend-docs/src/pages/index.test.tsx +90 -0
  477. package/templates/apps/frontend-docs/src/pages/index.tsx +45 -0
  478. package/templates/apps/frontend-docs/src/pages/layout.test.tsx +84 -0
  479. package/templates/apps/frontend-docs/src/pages/layout.tsx +66 -0
  480. package/templates/apps/frontend-docs/template.json +6 -0
  481. package/templates/apps/frontend-docs/tsconfig.json +11 -0
  482. package/templates/apps/frontend-i18n/README.md +61 -0
  483. package/templates/apps/frontend-i18n/app.config.ts +33 -0
  484. package/templates/apps/frontend-i18n/package.json +28 -0
  485. package/templates/apps/frontend-i18n/src/globals.css +46 -0
  486. package/templates/apps/frontend-i18n/src/globals.d.ts +6 -0
  487. package/templates/apps/frontend-i18n/src/lib/locale.test.ts +72 -0
  488. package/templates/apps/frontend-i18n/src/lib/locale.ts +55 -0
  489. package/templates/apps/frontend-i18n/src/locales/de.ts +24 -0
  490. package/templates/apps/frontend-i18n/src/locales/en.ts +25 -0
  491. package/templates/apps/frontend-i18n/src/pages/[locale]/about.tsx +11 -0
  492. package/templates/apps/frontend-i18n/src/pages/[locale]/index.tsx +13 -0
  493. package/templates/apps/frontend-i18n/src/pages/[locale]/mirrors.test.tsx +50 -0
  494. package/templates/apps/frontend-i18n/src/pages/about.test.tsx +75 -0
  495. package/templates/apps/frontend-i18n/src/pages/about.tsx +31 -0
  496. package/templates/apps/frontend-i18n/src/pages/index.test.tsx +102 -0
  497. package/templates/apps/frontend-i18n/src/pages/index.tsx +43 -0
  498. package/templates/apps/frontend-i18n/src/pages/layout.test.tsx +86 -0
  499. package/templates/apps/frontend-i18n/src/pages/layout.tsx +70 -0
  500. package/templates/apps/frontend-i18n/template.json +6 -0
  501. package/templates/apps/frontend-i18n/tsconfig.json +11 -0
  502. package/templates/apps/frontend-landing/README.md +17 -0
  503. package/templates/apps/frontend-landing/app.config.ts +25 -0
  504. package/templates/apps/frontend-landing/package.json +29 -0
  505. package/templates/apps/frontend-landing/src/globals.css +23 -0
  506. package/templates/apps/frontend-landing/src/lib/locale.test.ts +72 -0
  507. package/templates/apps/frontend-landing/src/lib/locale.ts +55 -0
  508. package/templates/apps/frontend-landing/src/locales/de.ts +24 -0
  509. package/templates/apps/frontend-landing/src/locales/en.ts +26 -0
  510. package/templates/apps/frontend-landing/src/pages/[locale]/index.tsx +13 -0
  511. package/templates/apps/frontend-landing/src/pages/[locale]/mirrors.test.tsx +37 -0
  512. package/templates/apps/frontend-landing/src/pages/index.test.tsx +110 -0
  513. package/templates/apps/frontend-landing/src/pages/index.tsx +75 -0
  514. package/templates/apps/frontend-landing/src/pages/layout.test.tsx +84 -0
  515. package/templates/apps/frontend-landing/src/pages/layout.tsx +66 -0
  516. package/templates/apps/frontend-landing/template.json +6 -0
  517. package/templates/apps/frontend-landing/tsconfig.json +11 -0
  518. package/templates/apps/frontend-spa/README.md +45 -0
  519. package/templates/apps/frontend-spa/app.config.ts +27 -0
  520. package/templates/apps/frontend-spa/package.json +29 -0
  521. package/templates/apps/frontend-spa/src/globals.css +84 -0
  522. package/templates/apps/frontend-spa/src/locales/de.ts +22 -0
  523. package/templates/apps/frontend-spa/src/locales/en.ts +29 -0
  524. package/templates/apps/frontend-spa/src/locales/index.ts +15 -0
  525. package/templates/apps/frontend-spa/src/pages/index.test.tsx +137 -0
  526. package/templates/apps/frontend-spa/src/pages/index.tsx +123 -0
  527. package/templates/apps/frontend-spa/src/pages/layout.tsx +27 -0
  528. package/templates/apps/frontend-spa/template.json +6 -0
  529. package/templates/apps/frontend-spa/tsconfig.json +11 -0
  530. package/templates/apps/frontend-ssr/README.md +68 -0
  531. package/templates/apps/frontend-ssr/app.config.ts +32 -0
  532. package/templates/apps/frontend-ssr/package.json +29 -0
  533. package/templates/apps/frontend-ssr/src/globals.css +67 -0
  534. package/templates/apps/frontend-ssr/src/locales/de.ts +41 -0
  535. package/templates/apps/frontend-ssr/src/locales/en.ts +54 -0
  536. package/templates/apps/frontend-ssr/src/locales/index.ts +16 -0
  537. package/templates/apps/frontend-ssr/src/pages/feed-swr.test.tsx +69 -0
  538. package/templates/apps/frontend-ssr/src/pages/feed-swr.tsx +54 -0
  539. package/templates/apps/frontend-ssr/src/pages/feed.test.tsx +73 -0
  540. package/templates/apps/frontend-ssr/src/pages/feed.tsx +64 -0
  541. package/templates/apps/frontend-ssr/src/pages/index.test.tsx +89 -0
  542. package/templates/apps/frontend-ssr/src/pages/index.tsx +72 -0
  543. package/templates/apps/frontend-ssr/src/pages/layout.tsx +37 -0
  544. package/templates/apps/frontend-ssr/template.json +6 -0
  545. package/templates/apps/frontend-ssr/tsconfig.json +11 -0
  546. package/templates/apps/frontend-ssr-api/README.md +50 -0
  547. package/templates/apps/frontend-ssr-api/app.config.ts +43 -0
  548. package/templates/apps/frontend-ssr-api/package.json +30 -0
  549. package/templates/apps/frontend-ssr-api/src/globals.css +38 -0
  550. package/templates/apps/frontend-ssr-api/src/globals.d.ts +6 -0
  551. package/templates/apps/frontend-ssr-api/src/locales/de.ts +20 -0
  552. package/templates/apps/frontend-ssr-api/src/locales/en.ts +31 -0
  553. package/templates/apps/frontend-ssr-api/src/locales/index.ts +16 -0
  554. package/templates/apps/frontend-ssr-api/src/pages/index.test.tsx +105 -0
  555. package/templates/apps/frontend-ssr-api/src/pages/index.tsx +83 -0
  556. package/templates/apps/frontend-ssr-api/src/pages/layout.tsx +28 -0
  557. package/templates/apps/frontend-ssr-api/template.json +6 -0
  558. package/templates/apps/frontend-ssr-api/tsconfig.json +11 -0
  559. package/templates/apps/frontend-static-blog/README.md +49 -0
  560. package/templates/apps/frontend-static-blog/app.config.ts +34 -0
  561. package/templates/apps/frontend-static-blog/package.json +28 -0
  562. package/templates/apps/frontend-static-blog/src/components/ReadingProgress.island.test.tsx +65 -0
  563. package/templates/apps/frontend-static-blog/src/components/ReadingProgress.island.tsx +35 -0
  564. package/templates/apps/frontend-static-blog/src/content/posts.ts +64 -0
  565. package/templates/apps/frontend-static-blog/src/globals.css +75 -0
  566. package/templates/apps/frontend-static-blog/src/lib/locale.test.ts +72 -0
  567. package/templates/apps/frontend-static-blog/src/lib/locale.ts +55 -0
  568. package/templates/apps/frontend-static-blog/src/locales/de.ts +19 -0
  569. package/templates/apps/frontend-static-blog/src/locales/en.ts +26 -0
  570. package/templates/apps/frontend-static-blog/src/pages/[locale]/blog/[slug].tsx +20 -0
  571. package/templates/apps/frontend-static-blog/src/pages/[locale]/index.tsx +13 -0
  572. package/templates/apps/frontend-static-blog/src/pages/[locale]/mirrors.test.tsx +62 -0
  573. package/templates/apps/frontend-static-blog/src/pages/blog/[slug].test.tsx +116 -0
  574. package/templates/apps/frontend-static-blog/src/pages/blog/[slug].tsx +69 -0
  575. package/templates/apps/frontend-static-blog/src/pages/index.test.tsx +100 -0
  576. package/templates/apps/frontend-static-blog/src/pages/index.tsx +58 -0
  577. package/templates/apps/frontend-static-blog/src/pages/layout.tsx +63 -0
  578. package/templates/apps/frontend-static-blog/template.json +6 -0
  579. package/templates/apps/frontend-static-blog/tsconfig.json +11 -0
  580. package/templates/baselines/bare/.env.example +37 -0
  581. package/templates/baselines/bare/README.md +47 -0
  582. package/templates/baselines/bare/baseline.json +31 -0
  583. package/templates/baselines/bare/deploy/README.md +43 -0
  584. package/templates/baselines/bare/deploy/voltro.service.example +36 -0
  585. package/templates/baselines/compose/.env.example +46 -0
  586. package/templates/baselines/compose/README.md +69 -0
  587. package/templates/baselines/compose/baseline.json +51 -0
  588. package/templates/baselines/compose/docker/.dockerignore +38 -0
  589. package/templates/baselines/compose/docker/api.Dockerfile +57 -0
  590. package/templates/baselines/compose/docker/dev.Dockerfile +35 -0
  591. package/templates/baselines/compose/docker/web.Dockerfile +59 -0
  592. package/templates/baselines/compose/docker-compose.dev.yml +89 -0
  593. package/templates/baselines/compose/docker-compose.prod.yml +87 -0
  594. package/templates/baselines/compose/docker-compose.yml +41 -0
  595. package/templates/baselines/compose-mariadb/.env.example +57 -0
  596. package/templates/baselines/compose-mariadb/README.md +78 -0
  597. package/templates/baselines/compose-mariadb/baseline.json +51 -0
  598. package/templates/baselines/compose-mariadb/docker/.dockerignore +38 -0
  599. package/templates/baselines/compose-mariadb/docker/api.Dockerfile +57 -0
  600. package/templates/baselines/compose-mariadb/docker/dev.Dockerfile +35 -0
  601. package/templates/baselines/compose-mariadb/docker/mariadb-init.sql +6 -0
  602. package/templates/baselines/compose-mariadb/docker/web.Dockerfile +59 -0
  603. package/templates/baselines/compose-mariadb/docker-compose.dev.yml +117 -0
  604. package/templates/baselines/compose-mariadb/docker-compose.prod.yml +114 -0
  605. package/templates/baselines/compose-mariadb/docker-compose.yml +79 -0
  606. package/templates/baselines/helm/.env.example +39 -0
  607. package/templates/baselines/helm/README.md +98 -0
  608. package/templates/baselines/helm/baseline.json +53 -0
  609. package/templates/baselines/helm/charts/voltro-app/.helmignore +10 -0
  610. package/templates/baselines/helm/charts/voltro-app/Chart.yaml +10 -0
  611. package/templates/baselines/helm/charts/voltro-app/templates/_helpers.tpl +36 -0
  612. package/templates/baselines/helm/charts/voltro-app/templates/configmap.yaml +13 -0
  613. package/templates/baselines/helm/charts/voltro-app/templates/deployment-api.yaml +120 -0
  614. package/templates/baselines/helm/charts/voltro-app/templates/deployment-web.yaml +45 -0
  615. package/templates/baselines/helm/charts/voltro-app/templates/ingress.yaml +37 -0
  616. package/templates/baselines/helm/charts/voltro-app/templates/postgres-service.yaml +19 -0
  617. package/templates/baselines/helm/charts/voltro-app/templates/postgres-statefulset.yaml +73 -0
  618. package/templates/baselines/helm/charts/voltro-app/templates/secret.yaml +33 -0
  619. package/templates/baselines/helm/charts/voltro-app/templates/service-api.yaml +19 -0
  620. package/templates/baselines/helm/charts/voltro-app/templates/service-web.yaml +19 -0
  621. package/templates/baselines/helm/charts/voltro-app/values-dev.yaml +21 -0
  622. package/templates/baselines/helm/charts/voltro-app/values-prod.yaml +58 -0
  623. package/templates/baselines/helm/charts/voltro-app/values-staging.yaml +25 -0
  624. package/templates/baselines/helm/charts/voltro-app/values.yaml +109 -0
  625. package/templates/baselines/helm/deploy/README.md +94 -0
  626. package/templates/patches/@effect__cluster@0.59.0.patch +262 -0
@@ -0,0 +1,105 @@
1
+ # {{projectName}} / {{appName}}
2
+
3
+ Voltro AI backend scaffold (template: **api-ai**) — a **RAG support
4
+ agent** over a docs knowledge base. It exercises the framework's AI
5
+ surface end-to-end: auto-embedded docs, a retrieval tool, a real agent
6
+ model loop, and a structured-output action.
7
+
8
+ ## Boot
9
+
10
+ ```bash
11
+ pnpm install # at the repo root
12
+ pnpm --filter @{{projectName}}/{{appName}} dev
13
+ # → http://localhost:4000
14
+ # → ws://localhost:4000/ws
15
+ ```
16
+
17
+ The app **boots and discovers every primitive with zero infra and no AI
18
+ key** (`store: 'memory'`). You only need a provider key to actually RUN
19
+ the agent / the summarize action — see below.
20
+
21
+ ## What it demonstrates
22
+
23
+ | File | Primitive | What it shows |
24
+ |---|---|---|
25
+ | `app.config.ts` | app + env | `store: 'memory'` zero-infra boot; AI env declared in the manifest. |
26
+ | `database/schema.ts` | schema + `vectorEmbedding()` | A `docs` table that auto-embeds `body` on every write (adds the `embedding` vector column + HNSW index). |
27
+ | `tools/searchDocs.tool.tsx` | `defineTool` | A retrieval tool the agent calls: `nearestNeighbours(query, k)` over `docs`, errors → `[]`. |
28
+ | `agents/support.agent.tsx` | `defineAgent` (descriptor) | Browser-safe wire contract (`name`, `input`). |
29
+ | `agents/support.agent.server.tsx` | `defineAgentExecutor` (executor) | System prompt + `tools: { searchDocs }` + `maxSteps`; model inherited from env. |
30
+ | `actions/summarize.action.ts` / `.server.tsx` | `defineAction` + `generateObject` | Structured output — a typed `{ title, summary, keyPoints, sentiment }` object. |
31
+ | `seeds/docs.seed.ts` | `defineSeed` | Idempotent boot seed of sample docs (auto-embedded on insert). |
32
+
33
+ The framework SYNTHESIZES two routes from the agent descriptor — you
34
+ write neither:
35
+
36
+ - **`support.send`** — an action that appends the user turn and streams
37
+ the assistant turn (delta-persisted to `agent_messages`).
38
+ - **`support.messages`** — a reactive query over `agent_messages` that
39
+ streams the turns (including the live streaming row) to the client.
40
+
41
+ The thread tables (`agent_threads`, `agent_messages`) are auto-provided
42
+ and auto-migrated because this app ships an `*.agent.tsx` — no schema
43
+ file needed.
44
+
45
+ ## AI provider — env
46
+
47
+ `@voltro/ai` reads the provider/model/key from env. All are OPTIONAL for
48
+ booting; they're only needed to RUN the model. Put them in `.env`:
49
+
50
+ ```bash
51
+ AI_PROVIDER=openai # e.g. 'openai' | 'anthropic'
52
+ AI_MODEL=gpt-4o-mini # any chat model the provider exposes
53
+ AI_API_KEY=sk-... # provider key
54
+ # @voltro/ai also accepts the provider-standard var:
55
+ # OPENAI_API_KEY=... / ANTHROPIC_API_KEY=...
56
+ ```
57
+
58
+ Editing `.env` hard-restarts `voltro dev` automatically. Run `voltro env`
59
+ to see the resolved manifest.
60
+
61
+ ### Embedding model + dimensions
62
+
63
+ `vectorEmbedding({ from: 'body', model: 'text-embedding-3-small',
64
+ dimensions: 1536 })` in `database/schema.ts` embeds with OpenAI's
65
+ `text-embedding-3-small` (1536-wide). If you switch to a different
66
+ embedding model, change `dimensions` to match its output width (e.g.
67
+ 768 / 3072) — the vector column size must line up or inserts/queries
68
+ won't align.
69
+
70
+ > `store: 'memory'` keeps the vector column but ANN falls back to a
71
+ > sequential scan (correct, just unindexed). Switch to `store:
72
+ > 'postgres'` for a real pgvector HNSW index.
73
+
74
+ ## Backfilling embeddings
75
+
76
+ The seed runs on first boot. If it ran BEFORE you set an AI key, the doc
77
+ rows exist but their `embedding` column is empty (the auto-embed had no
78
+ provider). Set a key, then fill the gaps:
79
+
80
+ ```bash
81
+ voltro embeddings backfill docs --text body --vector embedding
82
+ # add --model <m> if you changed the embedding model from the default
83
+ ```
84
+
85
+ This (re-)embeds existing rows the `vectorEmbedding()` mixin missed —
86
+ the same command to use after a model change.
87
+
88
+ ## Trying it
89
+
90
+ Once a key is set, drive the synthesized routes from a web client (or
91
+ the dashboard's invoke surface):
92
+
93
+ ```ts
94
+ // mint a thread id, subscribe to the live feed, then send a turn
95
+ const threadId = `thread_${crypto.randomUUID().replace(/-/g, '')}`
96
+ const { data: messages } = useSubscription('app', ['support.messages', { threadId }], { threadId })
97
+ const send = useAction('app', 'support.send')
98
+ await send.run({ threadId, order: messages?.length ?? 0, prompt: 'How do I reset my password?' })
99
+ ```
100
+
101
+ The agent calls `searchDocs`, retrieves the relevant doc, and answers
102
+ from it — the assistant bubble streams in as `support.messages` re-fires.
103
+
104
+ Drop more `*.agent.tsx`, `*.tool.tsx`, `*.action.ts`, `*.seed.ts`, or
105
+ schema files anywhere in this tree — discovery is by file convention.
@@ -0,0 +1,32 @@
1
+ // `support.summarize` — EXECUTOR (server-only).
2
+ //
3
+ // Calls `@voltro/ai`'s `generateObject`, which constrains the model
4
+ // output to the `SummaryResult` Effect Schema (converted to JSON Schema
5
+ // for the provider, then decoded back so brands/refinements hold). A
6
+ // provider failure or malformed output surfaces as a typed `AiError`
7
+ // (`reason: 'generation' | 'decode'`) on the Effect failure channel —
8
+ // declare it on the descriptor's `error:` to surface it typed to the
9
+ // client, or `Effect.catchTag('AiError', …)` to handle it here.
10
+ //
11
+ // The provider is read from env (AI_PROVIDER / AI_MODEL + the key var)
12
+ // because we don't pass `provider`. No key → the call fails with an
13
+ // `AiError`; the app still BOOTS and discovers this action regardless.
14
+
15
+ import { Effect } from 'effect'
16
+ import { generateObject } from '@voltro/ai'
17
+ import { SummaryResult } from './summarize.action'
18
+
19
+ const execute = (input: { text: string }) =>
20
+ Effect.gen(function* () {
21
+ const { object } = yield* generateObject({
22
+ schema: SummaryResult,
23
+ system:
24
+ 'Summarise the given support text. Produce a short title, a 1-2 sentence ' +
25
+ 'summary, the key points as a list, and the overall sentiment.',
26
+ prompt: input.text,
27
+ maxTokens: 500,
28
+ })
29
+ return object
30
+ })
31
+
32
+ export default execute
@@ -0,0 +1,33 @@
1
+ // `support.summarize` — DESCRIPTOR (browser-safe).
2
+ //
3
+ // A `generateObject` example: take a free-text support thread / document
4
+ // and produce STRUCTURED output (a typed summary object) instead of prose.
5
+ // AI inference is external I/O → an action, not a mutation.
6
+ //
7
+ // The `output` Schema is exported separately so the server executor can
8
+ // reuse the SAME schema to constrain `generateObject` — one source of
9
+ // truth for the shape the model must satisfy AND the wire output. Schema
10
+ // values are browser-safe, so re-importing it server-side is fine.
11
+
12
+ import { defineAction } from '@voltro/protocol'
13
+ import { Schema } from 'effect'
14
+
15
+ // The structured shape the model must emit. Top-level `Schema.Struct`
16
+ // (generateObject requires a JSON `object` at the root — an array/scalar
17
+ // must be wrapped in a field, as `keyPoints` is here).
18
+ export const SummaryResult = Schema.Struct({
19
+ title: Schema.String,
20
+ summary: Schema.String,
21
+ keyPoints: Schema.Array(Schema.String),
22
+ sentiment: Schema.Literal('positive', 'neutral', 'negative'),
23
+ })
24
+ export type SummaryResult = Schema.Schema.Type<typeof SummaryResult>
25
+
26
+ export const summarize = defineAction({
27
+ name: 'support.summarize',
28
+ input: Schema.Struct({
29
+ // The raw text to summarise (a support thread, a doc, a transcript).
30
+ text: Schema.String,
31
+ }),
32
+ output: SummaryResult,
33
+ })
@@ -0,0 +1,31 @@
1
+ // `support` agent — EXECUTOR (server-only).
2
+ //
3
+ // `defineAgentExecutor` binds the behaviour to the descriptor: the system
4
+ // prompt, the tools the model may call, the per-agent model, and the
5
+ // max LLM↔tool round-trips. Default-exported; the framework pairs it with
6
+ // `support.agent.tsx` by basename at boot.
7
+ //
8
+ // MODEL + KEY: we DON'T hardcode a model or key here. Omitting `model`
9
+ // makes the agent inherit the provider from env — `AI_PROVIDER` /
10
+ // `AI_MODEL` and the provider's standard key var (OPENAI_API_KEY /
11
+ // ANTHROPIC_API_KEY / AI_API_KEY). That keeps the secret server-side and
12
+ // lets the same template run against any provider via `.env`. See README.
13
+
14
+ import { defineAgentExecutor } from '@voltro/ai'
15
+ import { support } from './support.agent'
16
+ import { searchDocs } from '../tools/searchDocs.tool'
17
+
18
+ export default defineAgentExecutor(support, {
19
+ system: (input) =>
20
+ [
21
+ 'You are a friendly, precise support agent for this product.',
22
+ 'Answer ONLY from the knowledge base. ALWAYS call the `searchDocs`',
23
+ 'tool first to retrieve relevant docs, then answer using their',
24
+ 'content. If the docs do not cover the question, say so plainly',
25
+ 'instead of guessing.',
26
+ `Reply in this locale: ${input.locale ?? 'en'}.`,
27
+ ].join(' '),
28
+ tools: { searchDocs },
29
+ // No `model` → inherit AI_PROVIDER / AI_MODEL + the key var from env.
30
+ maxSteps: 6,
31
+ })
@@ -0,0 +1,27 @@
1
+ // `support` agent — DESCRIPTOR (browser-safe).
2
+ //
3
+ // `defineAgent` from `@voltro/ai/agent` declares ONLY the wire contract:
4
+ // the agent's `name` and `input` schema. This file is value-imported into
5
+ // `rpcGroup.generated.ts`, so it must stay browser-safe — it imports
6
+ // nothing server-only (no `@voltro/ai` main entry, no database, no tools).
7
+ //
8
+ // The framework SYNTHESIZES two routes from this descriptor:
9
+ // - `support.send` — an action: appends the user turn + streams the
10
+ // assistant turn (delta-persisted to agent_messages).
11
+ // - `support.messages` — a reactive query over agent_messages: streams the
12
+ // turns (incl. the live streaming row) to the client.
13
+ //
14
+ // Behaviour (system prompt, tools, model + key, maxSteps) lives in the
15
+ // paired server executor: `support.agent.server.tsx`.
16
+
17
+ import { defineAgent } from '@voltro/ai/agent'
18
+ import { Schema } from 'effect'
19
+
20
+ export const support = defineAgent({
21
+ name: 'support',
22
+ input: Schema.Struct({
23
+ prompt: Schema.String,
24
+ // Optional locale to steer the system prompt's reply language.
25
+ locale: Schema.optional(Schema.String),
26
+ }),
27
+ })
@@ -0,0 +1,57 @@
1
+ // Backend app for the {{projectName}} project. Read by `voltro dev`.
2
+ //
3
+ // This is the AI template: a RAG support agent over a docs knowledge
4
+ // base. It demonstrates the framework's AI surface end-to-end —
5
+ // `vectorEmbedding()` auto-embedding on the `docs` table, a `defineTool`
6
+ // the agent calls to retrieve docs, a real `defineAgent` /
7
+ // `defineAgentExecutor` model loop, and a `generateObject` action for
8
+ // structured output.
9
+ //
10
+ // `store: 'memory'` is the dev-friendly default — fast startup, no
11
+ // docker. The app BOOTS and DISCOVERS every primitive with zero infra
12
+ // and zero AI key. To actually RUN the agent / the summarize action you
13
+ // need a provider key (see README): AI_PROVIDER / AI_MODEL + the
14
+ // provider's key var (OPENAI_API_KEY / ANTHROPIC_API_KEY / …).
15
+ //
16
+ // NOTE on memory store: the `vector` column is stored but ANN falls back
17
+ // to a sequential scan (correct, just unindexed). Switch to `'postgres'`
18
+ // for a real pgvector HNSW index.
19
+ import { defineEnv, envVar } from '@voltro/env'
20
+
21
+ // Typed environment — declare your env once; it's validated at boot (fail-fast)
22
+ // and read on the server via `serverEnv` / `getSecret` from '@voltro/env/server'.
23
+ // `access` is required: 'public' (browser-safe) or 'secret' (server-only, never
24
+ // bundled). Run `voltro env` to see the manifest. See the Environment docs.
25
+ //
26
+ // The AI provider is read by `@voltro/ai` from the standard env vars
27
+ // below. They're declared here purely so they show up in `voltro env`
28
+ // and `.env.example`; `@voltro/ai` reads its own values at call time.
29
+ // All optional — the app boots without them; only RUNNING the model needs them.
30
+ export const env = defineEnv({
31
+ LOG_LEVEL: envVar.enum(['debug', 'info', 'warn', 'error'], { access: 'public', default: 'info' }),
32
+ AI_PROVIDER: envVar.string({
33
+ access: 'public',
34
+ optional: true,
35
+ description: "AI provider id, e.g. 'openai' | 'anthropic'. Falls back to the @voltro/ai default.",
36
+ example: 'openai',
37
+ }),
38
+ AI_MODEL: envVar.string({
39
+ access: 'public',
40
+ optional: true,
41
+ description: "Model id, e.g. 'gpt-4o-mini' | 'claude-3-5-haiku-latest'.",
42
+ example: 'gpt-4o-mini',
43
+ }),
44
+ AI_API_KEY: envVar.string({
45
+ access: 'secret',
46
+ optional: true,
47
+ description:
48
+ "Provider API key. @voltro/ai also accepts the provider-standard var (OPENAI_API_KEY / ANTHROPIC_API_KEY).",
49
+ }),
50
+ })
51
+
52
+ export default {
53
+ type: 'api' as const,
54
+ name: '{{capProjectName}}{{capAppName}}',
55
+ store: 'memory' as const,
56
+ env,
57
+ }
@@ -0,0 +1,67 @@
1
+ // Schema for the {{projectName}} AI backend.
2
+ //
3
+ // Tables are auto-discovered: every exported `table(...)` in this file
4
+ // (or any `*.entity.ts` / `*.schema.ts` file) is registered by
5
+ // `voltro dev` — no manual barrel. `actors` + `tenants` are the
6
+ // framework's core tables: the built-in `audit()` / `tenant()` /
7
+ // `softDelete()` mixins reference them, so they must be declared (the
8
+ // CLI wires them into the mixin registry once it finds them).
9
+ //
10
+ // The agent thread tables (`agent_threads`, `agent_messages`) are
11
+ // auto-provided + auto-migrated by the framework because this app ships
12
+ // an `*.agent.tsx` — you do NOT declare them here.
13
+
14
+ import {
15
+ databaseHandle,
16
+ id,
17
+ table,
18
+ text,
19
+ vectorEmbedding,
20
+ type InferRow,
21
+ } from '@voltro/database'
22
+
23
+ // ---------- Core tables (required by the audit / tenant mixins) ----------
24
+
25
+ export const actors = table('actors', {
26
+ id: id(),
27
+ kind: text().oneOf(['user', 'serviceAccount', 'apiKey', 'system']),
28
+ displayName: text().nullable(),
29
+ })
30
+
31
+ export const tenants = table('tenants', {
32
+ id: id(),
33
+ name: text(),
34
+ })
35
+
36
+ // ---------- Knowledge base ----------
37
+ //
38
+ // `vectorEmbedding({ from: 'body', ... })` adds an `embedding` vector
39
+ // column + an HNSW index over it, and registers a re-embed hook that
40
+ // calls `@voltro/ai`'s `embed` on every insert/update of `body` — so a
41
+ // plain `ctx.store.insert('docs', { title, body })` auto-embeds, no app
42
+ // code. Query it with `database.docs.nearestNeighbours(queryString, k)`
43
+ // (the string overload is valid because this table carries the mixin —
44
+ // the runtime embeds the query string before searching).
45
+ //
46
+ // `dimensions` MUST match the model's output width. 1536 =
47
+ // text-embedding-3-small (OpenAI). If you point AI_MODEL at a different
48
+ // embedding model, change this to match (e.g. 768 / 3072) or the vector
49
+ // width won't line up.
50
+ export const docs = table('docs', {
51
+ id: id({ prefix: 'doc' }),
52
+ title: text(),
53
+ body: text(),
54
+ })
55
+ .with(
56
+ vectorEmbedding({
57
+ from: 'body',
58
+ model: 'text-embedding-3-small',
59
+ dimensions: 1536,
60
+ }),
61
+ )
62
+ // Opt into the matcher engine so subscriptions over `docs` re-fire on write.
63
+ .reactive()
64
+
65
+ export type Doc = InferRow<typeof docs>
66
+
67
+ export const database = databaseHandle({ actors, tenants, docs })
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@{{projectName}}/{{appName}}",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "voltro dev .",
8
+ "test": "voltro test",
9
+ "typecheck": "tsc --noEmit"
10
+ },
11
+ "dependencies": {
12
+ "@effect/platform": "^0.96.1",
13
+ "@effect/rpc": "^0.75.1",
14
+ "@voltro/ai": "0.1.0",
15
+ "@voltro/cli": "0.1.0",
16
+ "@voltro/database": "0.1.0",
17
+ "@voltro/env": "0.1.0",
18
+ "@voltro/protocol": "0.1.0",
19
+ "@voltro/runtime": "0.1.0",
20
+ "effect": "^3.21.2"
21
+ },
22
+ "devDependencies": {
23
+ "@voltro/testing": "0.1.0",
24
+ "typescript": "^5.7.0",
25
+ "vitest": "^3.0.0"
26
+ }
27
+ }
@@ -0,0 +1,67 @@
1
+ // Seed a few sample knowledge-base docs so the RAG agent has something
2
+ // to retrieve on first boot.
3
+ //
4
+ // `lifecycle: 'boot'` runs this once per `voltro dev` boot, re-running
5
+ // only when the seed file's content fingerprint changes. `upsertByUnique`
6
+ // keys on `title`, so re-runs UPDATE rather than duplicate — idempotent.
7
+ //
8
+ // The `docs` table carries `vectorEmbedding({ from: 'body' })`, so each
9
+ // insert/update AUTO-EMBEDS the body via `@voltro/ai`'s `embed` — no
10
+ // embedding code here. NOTE: that embed needs a provider key
11
+ // (AI_PROVIDER / AI_MODEL + the key var). Without one the rows still seed
12
+ // (title + body persist) but the `embedding` column stays empty; run
13
+ // `voltro embeddings backfill docs --text body --vector embedding`
14
+ // after setting a key to fill them in. See the README.
15
+
16
+ import { defineSeed } from '@voltro/database'
17
+
18
+ const SAMPLE_DOCS: ReadonlyArray<{ title: string; body: string }> = [
19
+ {
20
+ title: 'Resetting your password',
21
+ body:
22
+ 'To reset your password, open Settings → Security and click "Reset password". ' +
23
+ 'You will receive an email with a one-time link valid for 30 minutes. If the ' +
24
+ 'link expires, request a new one from the same screen. Passwords must be at ' +
25
+ 'least 12 characters and include a number and a symbol.',
26
+ },
27
+ {
28
+ title: 'Inviting teammates',
29
+ body:
30
+ 'Admins can invite teammates from the Members page. Enter the teammate\'s email ' +
31
+ 'and pick a role (Viewer, Member, or Admin). Invites expire after 7 days. A ' +
32
+ 'pending invite can be revoked or resent from the same list. Billing is per ' +
33
+ 'active seat — a revoked invite is never charged.',
34
+ },
35
+ {
36
+ title: 'Exporting your data',
37
+ body:
38
+ 'You can export all of your workspace data from Settings → Data → Export. ' +
39
+ 'We generate a downloadable ZIP of newline-delimited JSON, one file per table. ' +
40
+ 'Large workspaces are processed in the background; you get an email with the ' +
41
+ 'download link when it is ready. Export links expire after 24 hours.',
42
+ },
43
+ {
44
+ title: 'API rate limits',
45
+ body:
46
+ 'The API allows 100 requests per minute per API key by default. Exceeding the ' +
47
+ 'limit returns HTTP 429 with a Retry-After header. Enterprise plans can request ' +
48
+ 'a higher limit. Use exponential backoff on 429 responses; do not retry 4xx ' +
49
+ 'errors other than 429.',
50
+ },
51
+ ]
52
+
53
+ export default defineSeed({
54
+ id: 'docs',
55
+ name: 'Sample knowledge-base docs',
56
+ lifecycle: 'boot',
57
+ steps: ({ step }) => [
58
+ step('seed-docs', async ({ upsertByUnique }) => {
59
+ let rowsTouched = 0
60
+ for (const doc of SAMPLE_DOCS) {
61
+ await upsertByUnique('docs', { title: doc.title }, { title: doc.title, body: doc.body })
62
+ rowsTouched += 1
63
+ }
64
+ return { rowsTouched }
65
+ }),
66
+ ],
67
+ })
@@ -0,0 +1,6 @@
1
+ {
2
+ "id": "api-ai",
3
+ "kind": "api",
4
+ "summary": "RAG support agent over a docs knowledge base: vectorEmbedding() docs + a search tool + a real defineAgent/defineAgentExecutor model loop + a generateObject action. Boots zero-infra (store: memory); needs an AI key only to RUN the agent.",
5
+ "tags": ["api", "ai", "rag", "agent", "embeddings", "tools"]
6
+ }
@@ -0,0 +1,50 @@
1
+ // Unit test with `@voltro/testing`. `support.summarize` is descriptor-pinned:
2
+ // its executor calls `generateObject` (a real model inference), which a unit
3
+ // harness can't provide — so we do NOT run the executor. Instead we assert the
4
+ // wire CONTRACT that both the client and the model are bound to: the action's
5
+ // name, and that `SummaryResult` (the shared schema constraining the model's
6
+ // output AND the RPC output) decodes a valid object and rejects a bad one.
7
+ //
8
+ // This is the meaningful hermetic test for an AI action — the schema is the
9
+ // single source of truth the model must satisfy; pinning it catches an
10
+ // accidental shape change without a model in the loop. Run with `voltro test`.
11
+
12
+ import { describe, it, expect } from 'vitest'
13
+ import { Schema } from 'effect'
14
+ import { summarize, SummaryResult } from '../actions/summarize.action'
15
+
16
+ describe('support.summarize (action descriptor)', () => {
17
+ it('declares the expected wire name', () => {
18
+ expect(summarize.name).toBe('support.summarize')
19
+ })
20
+
21
+ it('accepts a valid { text } input and rejects a malformed one', () => {
22
+ const decode = Schema.decodeUnknownSync(summarize.input)
23
+ expect(decode({ text: 'a support thread' })).toEqual({ text: 'a support thread' })
24
+ expect(() => decode({})).toThrow() // missing text
25
+ })
26
+
27
+ it('decodes a valid SummaryResult', () => {
28
+ const decode = Schema.decodeUnknownSync(SummaryResult)
29
+ const ok = decode({
30
+ title: 'Refund request',
31
+ summary: 'The customer wants a refund for a late order.',
32
+ keyPoints: ['order was late', 'requests refund'],
33
+ sentiment: 'negative',
34
+ })
35
+ expect(ok.sentiment).toBe('negative')
36
+ expect(ok.keyPoints).toEqual(['order was late', 'requests refund'])
37
+ })
38
+
39
+ it('rejects a SummaryResult whose sentiment is outside the literal union', () => {
40
+ const decode = Schema.decodeUnknownSync(SummaryResult)
41
+ expect(() =>
42
+ decode({
43
+ title: 'x',
44
+ summary: 'y',
45
+ keyPoints: [],
46
+ sentiment: 'furious', // not 'positive' | 'neutral' | 'negative'
47
+ }),
48
+ ).toThrow()
49
+ })
50
+ })
@@ -0,0 +1,60 @@
1
+ // `searchDocs` — the retrieval tool the support agent calls.
2
+ //
3
+ // Tool shape (the `*.tool.tsx` convention): a named `defineTool(...)`
4
+ // DESCRIPTOR with the Schema-typed `input` / `output` and NO body, plus
5
+ // a default-exported `(input, ctx) => …` handler. The framework wires
6
+ // the default export onto the descriptor at discovery time, and the
7
+ // agent's `tools: { searchDocs }` imports the SAME module instance.
8
+ //
9
+ // This file is SERVER-ONLY — it's referenced from the agent EXECUTOR
10
+ // (`support.agent.server.tsx`), never from a browser-loaded descriptor,
11
+ // so importing the `database` handle here is safe.
12
+ //
13
+ // The handler does vector retrieval: `database.docs.nearestNeighbours(
14
+ // query, k)` returns the k nearest docs (each row gets a synthetic
15
+ // `distance`). Because `docs` carries `vectorEmbedding()`, the STRING
16
+ // overload is valid — the runtime embeds `query` before searching. Any
17
+ // failure (no AI key, embed error) is caught → empty array, so a tool
18
+ // hiccup surfaces to the model as "no results" instead of aborting the
19
+ // whole agent turn.
20
+
21
+ import { defineTool } from '@voltro/ai'
22
+ import type { AppContext } from '@voltro/runtime'
23
+ import { Schema } from 'effect'
24
+ import { database } from '../database/schema'
25
+
26
+ const MAX_RESULTS = 5
27
+ const SNIPPET_LEN = 280
28
+
29
+ export const searchDocs = defineTool({
30
+ name: 'searchDocs',
31
+ description:
32
+ 'Search the support knowledge base for documents relevant to a question. ' +
33
+ 'Returns up to 5 results, each with a title and a short snippet of the body.',
34
+ input: Schema.Struct({ query: Schema.String }),
35
+ output: Schema.Array(
36
+ Schema.Struct({ title: Schema.String, snippet: Schema.String }),
37
+ ),
38
+ })
39
+
40
+ export default async (
41
+ { query }: { query: string },
42
+ ctx: AppContext,
43
+ ): Promise<ReadonlyArray<{ title: string; snippet: string }>> => {
44
+ try {
45
+ const rows = await ctx.store.query(
46
+ database.docs.nearestNeighbours(query, MAX_RESULTS).descriptor,
47
+ )
48
+ return rows.map((row) => {
49
+ const body = String((row as { body?: unknown }).body ?? '')
50
+ return {
51
+ title: String((row as { title?: unknown }).title ?? ''),
52
+ snippet: body.length > SNIPPET_LEN ? `${body.slice(0, SNIPPET_LEN)}…` : body,
53
+ }
54
+ })
55
+ } catch {
56
+ // No AI key / embed failure / cold table → degrade to "no results"
57
+ // rather than aborting the agent's tool loop.
58
+ return []
59
+ }
60
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": "../../../tsconfig.base.json",
3
+ "include": ["**/*.ts", "**/*.tsx"],
4
+ "exclude": ["node_modules", "dist"]
5
+ }
@@ -0,0 +1,17 @@
1
+ # DEV-ONLY environment for the {{projectName}} api.
2
+ #
3
+ # `voltro dev` loads this file into the process environment at boot, BEFORE the
4
+ # env-validation gate and BEFORE plugins activate.
5
+ #
6
+ # VOLTRO_SESSION_SECRET is the HMAC key that signs + verifies the session
7
+ # cookie. authRoutesPlugin signs sessions with it; voltroPasswordStrategy
8
+ # verifies them — they MUST share the same secret (app.config.ts reads this
9
+ # one value and passes it to both).
10
+ #
11
+ # ⚠️ PUBLIC, DEV-ONLY placeholder shipped with the template. NEVER use it in
12
+ # production — generate a real one and set it in your deployment's secrets:
13
+ #
14
+ # openssl rand -hex 32
15
+ #
16
+ # Rotating it invalidates every existing session (users must sign in again).
17
+ VOLTRO_SESSION_SECRET=devonly0011223344556677889900aabbccddeeff00112233445566778899aabb