@engenty/wizards-runtime 0.0.0-stage → 0.7.6

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 (523) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +214 -2
  3. package/apps/runtime/dist/agents/architect.js +444 -0
  4. package/apps/runtime/dist/agents/studio-assistant.js +883 -0
  5. package/apps/runtime/dist/agents/subscription.js +207 -0
  6. package/apps/runtime/dist/agents/thought.js +21 -0
  7. package/apps/runtime/dist/agents/website.js +480 -0
  8. package/apps/runtime/dist/app.js +359 -0
  9. package/apps/runtime/dist/apple/wizards-apple +0 -0
  10. package/apps/runtime/dist/assistant/browser.js +26 -0
  11. package/apps/runtime/dist/assistant/docs.js +158 -0
  12. package/apps/runtime/dist/assistant/knows.js +353 -0
  13. package/apps/runtime/dist/assistant/primer.js +26 -0
  14. package/apps/runtime/dist/assistant/runs.js +24 -0
  15. package/apps/runtime/dist/auth/account.js +175 -0
  16. package/apps/runtime/dist/auth/device.js +112 -0
  17. package/apps/runtime/dist/auth/index.js +358 -0
  18. package/apps/runtime/dist/auth/keys.js +55 -0
  19. package/apps/runtime/dist/auth/local-ticket.js +26 -0
  20. package/apps/runtime/dist/authoring/example.js +74 -0
  21. package/apps/runtime/dist/authoring/guide.js +433 -0
  22. package/apps/runtime/dist/authoring/ops.js +117 -0
  23. package/apps/runtime/dist/browser/fast/action-space.js +160 -0
  24. package/apps/runtime/dist/browser/fast/classifier.js +91 -0
  25. package/apps/runtime/dist/browser/fast/decide.js +171 -0
  26. package/apps/runtime/dist/browser/fast/driver.js +141 -0
  27. package/apps/runtime/dist/browser/fast/instructions.js +33 -0
  28. package/apps/runtime/dist/browser/fast/run.js +249 -0
  29. package/apps/runtime/dist/browser/fast/span-picker.js +153 -0
  30. package/apps/runtime/dist/browser/fast/text-helper.js +178 -0
  31. package/apps/runtime/dist/browser/snapshot.js +335 -0
  32. package/apps/runtime/dist/cli/account.js +385 -0
  33. package/apps/runtime/dist/cli/autostart.js +182 -0
  34. package/apps/runtime/dist/cli/autoupdate.js +221 -0
  35. package/apps/runtime/dist/cli/clients.js +44 -0
  36. package/apps/runtime/dist/cli/connect.js +540 -0
  37. package/apps/runtime/dist/cli/environment.js +95 -0
  38. package/apps/runtime/dist/cli/exec.js +45 -0
  39. package/apps/runtime/dist/cli/features.js +50 -0
  40. package/apps/runtime/dist/cli/home.js +88 -0
  41. package/apps/runtime/dist/cli/install-env.js +33 -0
  42. package/apps/runtime/dist/cli/machine.js +107 -0
  43. package/apps/runtime/dist/cli/main.js +231 -0
  44. package/apps/runtime/dist/cli/mcp.js +136 -0
  45. package/apps/runtime/dist/cli/menu.js +202 -0
  46. package/apps/runtime/dist/cli/processes.js +72 -0
  47. package/apps/runtime/dist/cli/report.js +66 -0
  48. package/apps/runtime/dist/cli/sandbox.js +77 -0
  49. package/apps/runtime/dist/cli/setup.js +335 -0
  50. package/apps/runtime/dist/cli/start.js +276 -0
  51. package/apps/runtime/dist/cli/status.js +212 -0
  52. package/apps/runtime/dist/cli/ui.js +59 -0
  53. package/apps/runtime/dist/cli/uninstall-main.js +20 -0
  54. package/apps/runtime/dist/cli/uninstall.js +231 -0
  55. package/apps/runtime/dist/cli/update.js +86 -0
  56. package/apps/runtime/dist/cli/validate.js +75 -0
  57. package/apps/runtime/dist/cli/versions.js +123 -0
  58. package/apps/runtime/dist/connectors/builtin.js +86 -0
  59. package/apps/runtime/dist/connectors/external.js +409 -0
  60. package/apps/runtime/dist/connectors/gmail.js +107 -0
  61. package/apps/runtime/dist/connectors/imap.js +261 -0
  62. package/apps/runtime/dist/connectors/index.js +325 -0
  63. package/apps/runtime/dist/connectors/mail.js +72 -0
  64. package/apps/runtime/dist/connectors/outlook.js +90 -0
  65. package/apps/runtime/dist/connectors/plugin-connections.js +343 -0
  66. package/apps/runtime/dist/connectors/via-account.js +65 -0
  67. package/apps/runtime/dist/credits/credits.js +100 -0
  68. package/apps/runtime/dist/credits/estimate.js +152 -0
  69. package/apps/runtime/dist/db/adopt.js +149 -0
  70. package/apps/runtime/dist/db/client.js +173 -0
  71. package/apps/runtime/dist/db/control-schema.js +133 -0
  72. package/apps/runtime/dist/db/migrations/control/0000_last_absorbing_man.sql +47 -0
  73. package/apps/runtime/dist/db/migrations/control/0001_gorgeous_nicolaos.sql +41 -0
  74. package/apps/runtime/dist/db/migrations/control/0002_secret_penance.sql +1 -0
  75. package/apps/runtime/dist/db/migrations/control/0003_nasty_mordo.sql +3 -0
  76. package/apps/runtime/dist/db/migrations/control/0004_breezy_eddie_brock.sql +6 -0
  77. package/apps/runtime/dist/db/migrations/control/0005_chilly_oracle.sql +1 -0
  78. package/apps/runtime/dist/db/migrations/control/0006_sleepy_mojo.sql +1 -0
  79. package/apps/runtime/dist/db/migrations/control/0007_common_the_hand.sql +15 -0
  80. package/apps/runtime/dist/db/migrations/control/0008_runner.sql +8 -0
  81. package/apps/runtime/dist/db/migrations/control/0009_plugin_claim.sql +9 -0
  82. package/apps/runtime/dist/db/migrations/control/0010_tan_snowbird.sql +6 -0
  83. package/apps/runtime/dist/db/migrations/control/meta/0000_snapshot.json +311 -0
  84. package/apps/runtime/dist/db/migrations/control/meta/0001_snapshot.json +599 -0
  85. package/apps/runtime/dist/db/migrations/control/meta/0002_snapshot.json +607 -0
  86. package/apps/runtime/dist/db/migrations/control/meta/0003_snapshot.json +311 -0
  87. package/apps/runtime/dist/db/migrations/control/meta/0004_snapshot.json +350 -0
  88. package/apps/runtime/dist/db/migrations/control/meta/0005_snapshot.json +358 -0
  89. package/apps/runtime/dist/db/migrations/control/meta/0006_snapshot.json +365 -0
  90. package/apps/runtime/dist/db/migrations/control/meta/0007_snapshot.json +460 -0
  91. package/apps/runtime/dist/db/migrations/control/meta/0008_snapshot.json +505 -0
  92. package/apps/runtime/dist/db/migrations/control/meta/0009_snapshot.json +561 -0
  93. package/apps/runtime/dist/db/migrations/control/meta/0010_snapshot.json +600 -0
  94. package/apps/runtime/dist/db/migrations/control/meta/_journal.json +83 -0
  95. package/apps/runtime/dist/db/migrations/tenant/0000_eminent_freak.sql +188 -0
  96. package/apps/runtime/dist/db/migrations/tenant/0001_salty_master_chief.sql +1 -0
  97. package/apps/runtime/dist/db/migrations/tenant/0002_cloudy_firebird.sql +1 -0
  98. package/apps/runtime/dist/db/migrations/tenant/0003_brown_warbound.sql +52 -0
  99. package/apps/runtime/dist/db/migrations/tenant/0004_romantic_nocturne.sql +6 -0
  100. package/apps/runtime/dist/db/migrations/tenant/0005_reflective_forgotten_one.sql +2 -0
  101. package/apps/runtime/dist/db/migrations/tenant/0006_hard_war_machine.sql +30 -0
  102. package/apps/runtime/dist/db/migrations/tenant/0007_space_data.sql +43 -0
  103. package/apps/runtime/dist/db/migrations/tenant/0008_run_event_note.sql +1 -0
  104. package/apps/runtime/dist/db/migrations/tenant/0009_knowledge.sql +104 -0
  105. package/apps/runtime/dist/db/migrations/tenant/0010_plugin_connection.sql +15 -0
  106. package/apps/runtime/dist/db/migrations/tenant/0011_runners.sql +2 -0
  107. package/apps/runtime/dist/db/migrations/tenant/0012_assistant_chat.sql +40 -0
  108. package/apps/runtime/dist/db/migrations/tenant/0013_run_origin.sql +1 -0
  109. package/apps/runtime/dist/db/migrations/tenant/0014_run_answer.sql +2 -0
  110. package/apps/runtime/dist/db/migrations/tenant/0015_device_calls.sql +13 -0
  111. package/apps/runtime/dist/db/migrations/tenant/0016_even_trish_tilby.sql +12 -0
  112. package/apps/runtime/dist/db/migrations/tenant/meta/0000_snapshot.json +1323 -0
  113. package/apps/runtime/dist/db/migrations/tenant/meta/0001_snapshot.json +1330 -0
  114. package/apps/runtime/dist/db/migrations/tenant/meta/0002_snapshot.json +1337 -0
  115. package/apps/runtime/dist/db/migrations/tenant/meta/0003_snapshot.json +1605 -0
  116. package/apps/runtime/dist/db/migrations/tenant/meta/0004_snapshot.json +1645 -0
  117. package/apps/runtime/dist/db/migrations/tenant/meta/0005_snapshot.json +1659 -0
  118. package/apps/runtime/dist/db/migrations/tenant/meta/0006_snapshot.json +1696 -0
  119. package/apps/runtime/dist/db/migrations/tenant/meta/0007_snapshot.json +2012 -0
  120. package/apps/runtime/dist/db/migrations/tenant/meta/0008_snapshot.json +2019 -0
  121. package/apps/runtime/dist/db/migrations/tenant/meta/0009_snapshot.json +2837 -0
  122. package/apps/runtime/dist/db/migrations/tenant/meta/0010_snapshot.json +2942 -0
  123. package/apps/runtime/dist/db/migrations/tenant/meta/0011_snapshot.json +2956 -0
  124. package/apps/runtime/dist/db/migrations/tenant/meta/0012_snapshot.json +3132 -0
  125. package/apps/runtime/dist/db/migrations/tenant/meta/0013_snapshot.json +3139 -0
  126. package/apps/runtime/dist/db/migrations/tenant/meta/0014_snapshot.json +3154 -0
  127. package/apps/runtime/dist/db/migrations/tenant/meta/0015_snapshot.json +3243 -0
  128. package/apps/runtime/dist/db/migrations/tenant/meta/0016_snapshot.json +3326 -0
  129. package/apps/runtime/dist/db/migrations/tenant/meta/_journal.json +125 -0
  130. package/apps/runtime/dist/db/schema.js +602 -0
  131. package/apps/runtime/dist/debug.js +197 -0
  132. package/apps/runtime/dist/docs/dev/index.md +41 -0
  133. package/apps/runtime/dist/docs/dev/meta.json +7 -0
  134. package/apps/runtime/dist/docs/dev/plugins/connections.md +74 -0
  135. package/apps/runtime/dist/docs/dev/plugins/events.md +89 -0
  136. package/apps/runtime/dist/docs/dev/plugins/examples.md +101 -0
  137. package/apps/runtime/dist/docs/dev/plugins/index.md +78 -0
  138. package/apps/runtime/dist/docs/dev/plugins/layout.md +90 -0
  139. package/apps/runtime/dist/docs/dev/plugins/meta.json +28 -0
  140. package/apps/runtime/dist/docs/dev/plugins/quick-start.md +94 -0
  141. package/apps/runtime/dist/docs/dev/plugins/reference.md +348 -0
  142. package/apps/runtime/dist/docs/dev/plugins/reloading.md +76 -0
  143. package/apps/runtime/dist/docs/dev/plugins/routes.md +185 -0
  144. package/apps/runtime/dist/docs/dev/plugins/runners.md +230 -0
  145. package/apps/runtime/dist/docs/dev/plugins/server.md +281 -0
  146. package/apps/runtime/dist/docs/dev/plugins/shipping.md +79 -0
  147. package/apps/runtime/dist/docs/dev/plugins/space.md +297 -0
  148. package/apps/runtime/dist/docs/dev/plugins/starters.md +70 -0
  149. package/apps/runtime/dist/docs/dev/plugins/studio.md +363 -0
  150. package/apps/runtime/dist/docs/dev/plugins/styling.md +129 -0
  151. package/apps/runtime/dist/docs/dev/plugins/tables.md +104 -0
  152. package/apps/runtime/dist/docs/dev/plugins/tools.md +139 -0
  153. package/apps/runtime/dist/docs/dev/wizard-format.md +125 -0
  154. package/apps/runtime/dist/docs/meta.json +3 -0
  155. package/apps/runtime/dist/docs/user/ai-apps.md +112 -0
  156. package/apps/runtime/dist/docs/user/assistant.md +77 -0
  157. package/apps/runtime/dist/docs/user/build-a-wizard.md +116 -0
  158. package/apps/runtime/dist/docs/user/command-line.md +86 -0
  159. package/apps/runtime/dist/docs/user/connectors.md +90 -0
  160. package/apps/runtime/dist/docs/user/create-account.md +52 -0
  161. package/apps/runtime/dist/docs/user/data.md +66 -0
  162. package/apps/runtime/dist/docs/user/first-start.md +60 -0
  163. package/apps/runtime/dist/docs/user/index.md +49 -0
  164. package/apps/runtime/dist/docs/user/install.md +123 -0
  165. package/apps/runtime/dist/docs/user/local-only.md +42 -0
  166. package/apps/runtime/dist/docs/user/meta.json +32 -0
  167. package/apps/runtime/dist/docs/user/models.md +156 -0
  168. package/apps/runtime/dist/docs/user/plugins.md +71 -0
  169. package/apps/runtime/dist/docs/user/run.md +98 -0
  170. package/apps/runtime/dist/docs/user/server.md +52 -0
  171. package/apps/runtime/dist/docs/user/space.md +126 -0
  172. package/apps/runtime/dist/docs/user/steps.md +220 -0
  173. package/apps/runtime/dist/docs/user/test-and-share.md +224 -0
  174. package/apps/runtime/dist/docs/user/troubleshooting.md +67 -0
  175. package/apps/runtime/dist/docs/user/wordpress.md +121 -0
  176. package/apps/runtime/dist/documents/parse.js +246 -0
  177. package/apps/runtime/dist/engenty/connections-external/build-connector.js +193 -0
  178. package/apps/runtime/dist/engenty/connections-external/errors.js +11 -0
  179. package/apps/runtime/dist/engenty/connections-external/import-service.js +270 -0
  180. package/apps/runtime/dist/engenty/connections-external/importer/classify.js +34 -0
  181. package/apps/runtime/dist/engenty/connections-external/importer/map-auth.js +185 -0
  182. package/apps/runtime/dist/engenty/connections-external/importer/normalize-mcp.js +63 -0
  183. package/apps/runtime/dist/engenty/connections-external/importer/normalize-openapi.js +130 -0
  184. package/apps/runtime/dist/engenty/connections-external/invoke/http-invoker.js +143 -0
  185. package/apps/runtime/dist/engenty/connections-external/invoke/mcp-client.js +143 -0
  186. package/apps/runtime/dist/engenty/connections-external/net/guarded-fetch.js +119 -0
  187. package/apps/runtime/dist/engenty/connections-external/oauth-dcr.js +88 -0
  188. package/apps/runtime/dist/engenty/connections-external/registry-client.js +336 -0
  189. package/apps/runtime/dist/engenty/connections-external/registry-source.js +82 -0
  190. package/apps/runtime/dist/engenty/connections-external/types.js +7 -0
  191. package/apps/runtime/dist/engenty/connections-github/connector.js +209 -0
  192. package/apps/runtime/dist/engenty/connections-google/connectors/calendar.js +381 -0
  193. package/apps/runtime/dist/engenty/connections-google/connectors/contacts.js +94 -0
  194. package/apps/runtime/dist/engenty/connections-google/connectors/drive.js +290 -0
  195. package/apps/runtime/dist/engenty/connections-google/connectors/gmail.js +567 -0
  196. package/apps/runtime/dist/engenty/connections-google/definitions.js +11 -0
  197. package/apps/runtime/dist/engenty/connections-google/shared.js +73 -0
  198. package/apps/runtime/dist/engenty/connections-hubspot/connector.js +140 -0
  199. package/apps/runtime/dist/engenty/connections-microsoft/action.js +17 -0
  200. package/apps/runtime/dist/engenty/connections-microsoft/graph.js +114 -0
  201. package/apps/runtime/dist/engenty/connections-microsoft/onedrive.js +286 -0
  202. package/apps/runtime/dist/engenty/connections-microsoft/outlook.js +492 -0
  203. package/apps/runtime/dist/engenty/connections-s3/s3.js +328 -0
  204. package/apps/runtime/dist/engenty/connections-sdk/files-capability.js +86 -0
  205. package/apps/runtime/dist/engenty/connections-sdk/oauth2.js +150 -0
  206. package/apps/runtime/dist/engenty/connections-sdk/registry.js +89 -0
  207. package/apps/runtime/dist/engenty/connections-sdk/storage-capability.js +84 -0
  208. package/apps/runtime/dist/engenty/connections-sdk/types.js +30 -0
  209. package/apps/runtime/dist/engenty/connections-slack/connector.js +360 -0
  210. package/apps/runtime/dist/engenty/csv-import/csv-matrix.js +178 -0
  211. package/apps/runtime/dist/engenty/csv-import/import-sources.js +87 -0
  212. package/apps/runtime/dist/engenty/csv-import/parse-csv.js +129 -0
  213. package/apps/runtime/dist/engenty/csv-import/serialize-csv.js +20 -0
  214. package/apps/runtime/dist/engenty/csv-import/types.js +1 -0
  215. package/apps/runtime/dist/engenty/csv-import/xlsx-workbook.js +159 -0
  216. package/apps/runtime/dist/engenty/doc-converter/interface.js +9 -0
  217. package/apps/runtime/dist/engenty/doc-converter/page-break.js +92 -0
  218. package/apps/runtime/dist/engenty/doc-converter/providers/local/index.js +72 -0
  219. package/apps/runtime/dist/engenty/document-scanner/schemas/classifier.js +30 -0
  220. package/apps/runtime/dist/engenty/document-scanner/schemas/index.js +4 -0
  221. package/apps/runtime/dist/engenty/document-scanner/schemas/invoice.js +73 -0
  222. package/apps/runtime/dist/engenty/document-scanner/schemas/receipt.js +63 -0
  223. package/apps/runtime/dist/engenty/document-scanner/schemas/shared.js +40 -0
  224. package/apps/runtime/dist/engenty/search-index/chunks.js +164 -0
  225. package/apps/runtime/dist/engenty/search-index/contracts.js +9 -0
  226. package/apps/runtime/dist/engenty/shims/connections-sdk.js +39 -0
  227. package/apps/runtime/dist/engenty/shims/plugin-sdk.js +1 -0
  228. package/apps/runtime/dist/engenty/shims/web-ingest.js +19 -0
  229. package/apps/runtime/dist/engenty/web-ingest/ssrf.js +277 -0
  230. package/apps/runtime/dist/engine/asks.js +82 -0
  231. package/apps/runtime/dist/engine/decide.js +82 -0
  232. package/apps/runtime/dist/engine/device.js +194 -0
  233. package/apps/runtime/dist/engine/events.js +128 -0
  234. package/apps/runtime/dist/engine/input.js +208 -0
  235. package/apps/runtime/dist/engine/owner.js +32 -0
  236. package/apps/runtime/dist/engine/prepare.js +90 -0
  237. package/apps/runtime/dist/engine/push.js +58 -0
  238. package/apps/runtime/dist/engine/requirements.js +355 -0
  239. package/apps/runtime/dist/engine/resources.js +198 -0
  240. package/apps/runtime/dist/engine/runner.js +970 -0
  241. package/apps/runtime/dist/engine/steps.js +1000 -0
  242. package/apps/runtime/dist/engine/surface.js +91 -0
  243. package/apps/runtime/dist/engine/template.js +240 -0
  244. package/apps/runtime/dist/engine/types.js +4 -0
  245. package/apps/runtime/dist/env.js +279 -0
  246. package/apps/runtime/dist/features.js +123 -0
  247. package/apps/runtime/dist/files/blobs.js +22 -0
  248. package/apps/runtime/dist/files/objects.js +86 -0
  249. package/apps/runtime/dist/files/storage.js +120 -0
  250. package/apps/runtime/dist/files/web-images.js +101 -0
  251. package/apps/runtime/dist/film/project.js +257 -0
  252. package/apps/runtime/dist/film/skills.js +91 -0
  253. package/apps/runtime/dist/film/sounds.js +122 -0
  254. package/apps/runtime/dist/film/step.js +289 -0
  255. package/apps/runtime/dist/film/tools.js +99 -0
  256. package/apps/runtime/dist/geocode.js +58 -0
  257. package/apps/runtime/dist/harness/antigravity.js +129 -0
  258. package/apps/runtime/dist/harness/apple.js +270 -0
  259. package/apps/runtime/dist/harness/claude.js +147 -0
  260. package/apps/runtime/dist/harness/codex.js +229 -0
  261. package/apps/runtime/dist/harness/cursor.js +93 -0
  262. package/apps/runtime/dist/harness/env.js +124 -0
  263. package/apps/runtime/dist/harness/index.js +95 -0
  264. package/apps/runtime/dist/harness/model.js +279 -0
  265. package/apps/runtime/dist/harness/prompt.js +121 -0
  266. package/apps/runtime/dist/harness/terminal.js +194 -0
  267. package/apps/runtime/dist/harness/types.js +7 -0
  268. package/apps/runtime/dist/index.js +113 -0
  269. package/apps/runtime/dist/limits.js +81 -0
  270. package/apps/runtime/dist/link-preview.js +60 -0
  271. package/apps/runtime/dist/log.js +106 -0
  272. package/apps/runtime/dist/manage.js +249 -0
  273. package/apps/runtime/dist/mcp/auth.js +161 -0
  274. package/apps/runtime/dist/mcp/bridge.js +59 -0
  275. package/apps/runtime/dist/mcp/flow-app.js +97 -0
  276. package/apps/runtime/dist/mcp/handler.js +54 -0
  277. package/apps/runtime/dist/mcp/scopes.js +14 -0
  278. package/apps/runtime/dist/mcp/seen.js +65 -0
  279. package/apps/runtime/dist/mcp/tools.js +572 -0
  280. package/apps/runtime/dist/media/conversation.js +167 -0
  281. package/apps/runtime/dist/media/ffmpeg.js +121 -0
  282. package/apps/runtime/dist/media/generate.js +120 -0
  283. package/apps/runtime/dist/media/marking.js +121 -0
  284. package/apps/runtime/dist/media/transcribe.js +198 -0
  285. package/apps/runtime/dist/model-errors.js +42 -0
  286. package/apps/runtime/dist/models.js +1164 -0
  287. package/apps/runtime/dist/plugin.js +61 -0
  288. package/apps/runtime/dist/plugins/channels.js +78 -0
  289. package/apps/runtime/dist/plugins/claims.js +56 -0
  290. package/apps/runtime/dist/plugins/discovery.js +155 -0
  291. package/apps/runtime/dist/plugins/events.js +63 -0
  292. package/apps/runtime/dist/plugins/jobs.js +64 -0
  293. package/apps/runtime/dist/plugins/loader.js +508 -0
  294. package/apps/runtime/dist/plugins/migrations.js +69 -0
  295. package/apps/runtime/dist/plugins/pro-keys.js +34 -0
  296. package/apps/runtime/dist/plugins/pro-state.js +83 -0
  297. package/apps/runtime/dist/plugins/pro.js +310 -0
  298. package/apps/runtime/dist/plugins/public.js +44 -0
  299. package/apps/runtime/dist/plugins/registry.js +122 -0
  300. package/apps/runtime/dist/plugins/runs.js +210 -0
  301. package/apps/runtime/dist/render/browser-path.js +54 -0
  302. package/apps/runtime/dist/render/chromium.js +98 -0
  303. package/apps/runtime/dist/render/convert.js +158 -0
  304. package/apps/runtime/dist/render/downloads.js +299 -0
  305. package/apps/runtime/dist/render/guard.js +25 -0
  306. package/apps/runtime/dist/render/shaped.js +137 -0
  307. package/apps/runtime/dist/routes/api.js +440 -0
  308. package/apps/runtime/dist/routes/debug.js +42 -0
  309. package/apps/runtime/dist/routes/delivery.js +90 -0
  310. package/apps/runtime/dist/routes/internal.js +81 -0
  311. package/apps/runtime/dist/routes/lang.js +25 -0
  312. package/apps/runtime/dist/routes/marketplace.js +43 -0
  313. package/apps/runtime/dist/routes/plugin-public.js +113 -0
  314. package/apps/runtime/dist/routes/plugins.js +212 -0
  315. package/apps/runtime/dist/routes/runs.js +1422 -0
  316. package/apps/runtime/dist/routes/studio.js +1629 -0
  317. package/apps/runtime/dist/routes/wizard-stream.js +30 -0
  318. package/apps/runtime/dist/running.js +39 -0
  319. package/apps/runtime/dist/sandbox/agentos-package.js +73 -0
  320. package/apps/runtime/dist/sandbox/agentos.js +162 -0
  321. package/apps/runtime/dist/sandbox/docker.js +45 -0
  322. package/apps/runtime/dist/sandbox/index.js +52 -0
  323. package/apps/runtime/dist/sandbox/install.js +122 -0
  324. package/apps/runtime/dist/sandbox/mastra.js +71 -0
  325. package/apps/runtime/dist/sandbox/types.js +1 -0
  326. package/apps/runtime/dist/secrets/crypto.js +28 -0
  327. package/apps/runtime/dist/secrets/signing.js +52 -0
  328. package/apps/runtime/dist/secrets/vault.js +59 -0
  329. package/apps/runtime/dist/services/access.js +88 -0
  330. package/apps/runtime/dist/services/api.js +248 -0
  331. package/apps/runtime/dist/services/architect.js +95 -0
  332. package/apps/runtime/dist/services/assistant-chats.js +311 -0
  333. package/apps/runtime/dist/services/brand.js +85 -0
  334. package/apps/runtime/dist/services/cloud.js +456 -0
  335. package/apps/runtime/dist/services/draft-events.js +27 -0
  336. package/apps/runtime/dist/services/engenty-shapes.js +71 -0
  337. package/apps/runtime/dist/services/errors.js +29 -0
  338. package/apps/runtime/dist/services/files.js +178 -0
  339. package/apps/runtime/dist/services/knowledge-model.js +559 -0
  340. package/apps/runtime/dist/services/knowledge.js +721 -0
  341. package/apps/runtime/dist/services/links.js +16 -0
  342. package/apps/runtime/dist/services/marketplace.js +492 -0
  343. package/apps/runtime/dist/services/onboarding.js +152 -0
  344. package/apps/runtime/dist/services/package-file.js +82 -0
  345. package/apps/runtime/dist/services/package.js +170 -0
  346. package/apps/runtime/dist/services/profile.js +51 -0
  347. package/apps/runtime/dist/services/project-files.js +439 -0
  348. package/apps/runtime/dist/services/project-index.js +707 -0
  349. package/apps/runtime/dist/services/projects.js +387 -0
  350. package/apps/runtime/dist/services/relevance.js +58 -0
  351. package/apps/runtime/dist/services/runners.js +178 -0
  352. package/apps/runtime/dist/services/runs.js +524 -0
  353. package/apps/runtime/dist/services/shares.js +130 -0
  354. package/apps/runtime/dist/services/site.js +270 -0
  355. package/apps/runtime/dist/services/space-categories.js +861 -0
  356. package/apps/runtime/dist/services/space-data.js +792 -0
  357. package/apps/runtime/dist/services/space-origin.js +207 -0
  358. package/apps/runtime/dist/services/spaces.js +657 -0
  359. package/apps/runtime/dist/services/translations.js +306 -0
  360. package/apps/runtime/dist/services/widgets.js +34 -0
  361. package/apps/runtime/dist/services/wizard-icon.js +157 -0
  362. package/apps/runtime/dist/services/wizards.js +420 -0
  363. package/apps/runtime/dist/settings.js +16 -0
  364. package/apps/runtime/dist/store/errors.js +4 -0
  365. package/apps/runtime/dist/store/index.js +299 -0
  366. package/apps/runtime/dist/store/shared-lists.js +123 -0
  367. package/apps/runtime/dist/tenants/control.js +238 -0
  368. package/apps/runtime/dist/tenants/tenant.js +26 -0
  369. package/apps/runtime/dist/texts.js +207 -0
  370. package/apps/runtime/dist/tools/browser.js +703 -0
  371. package/apps/runtime/dist/tools/connector.js +204 -0
  372. package/apps/runtime/dist/tools/index.js +291 -0
  373. package/apps/runtime/dist/tools/mail.js +104 -0
  374. package/apps/runtime/dist/tools/net-guard.js +170 -0
  375. package/apps/runtime/dist/tools/pages.js +81 -0
  376. package/apps/runtime/dist/tools/plugin.js +180 -0
  377. package/apps/runtime/dist/tools/project.js +154 -0
  378. package/apps/runtime/dist/tools/shared.js +69 -0
  379. package/apps/runtime/dist/tools/store.js +238 -0
  380. package/apps/runtime/dist/update.js +113 -0
  381. package/apps/runtime/dist/widgets/bundle.js +99 -0
  382. package/apps/runtime/dist/widgets/render.js +329 -0
  383. package/apps/runtime/dist/widgets/runtime.js +108 -0
  384. package/apps/runtime/dist/widgets/script.js +30 -0
  385. package/apps/runtime/dist/widgets/step.js +223 -0
  386. package/apps/web/dist/ai-labels/ai-black.svg +20 -0
  387. package/apps/web/dist/ai-labels/ai-generated-black.svg +31 -0
  388. package/apps/web/dist/ai-labels/ai-generated-white.svg +32 -0
  389. package/apps/web/dist/ai-labels/ai-modified-black.svg +30 -0
  390. package/apps/web/dist/ai-labels/ai-modified-white.svg +31 -0
  391. package/apps/web/dist/ai-labels/ai-white.svg +21 -0
  392. package/apps/web/dist/assets/AboutDialog-DYgXPagX.js +1 -0
  393. package/apps/web/dist/assets/ChangelogDialog-BXqBW8j3.js +1 -0
  394. package/apps/web/dist/assets/ChatView-CK2--tsE.js +10 -0
  395. package/apps/web/dist/assets/EditorPage-jvcwyXbU.js +3 -0
  396. package/apps/web/dist/assets/FlowPreview-CusP7ci9.js +1 -0
  397. package/apps/web/dist/assets/Harness-BrP-ENHg.css +1 -0
  398. package/apps/web/dist/assets/Harness-CV9uYzbv.js +16 -0
  399. package/apps/web/dist/assets/NewWizardChannels-BakW5q6s.js +1 -0
  400. package/apps/web/dist/assets/NewWizardPage-BoA-LJuW.js +7 -0
  401. package/apps/web/dist/assets/OnboardingPage-DaD1XnOe.js +1 -0
  402. package/apps/web/dist/assets/ProjectPage-BFgk1DEv.js +1 -0
  403. package/apps/web/dist/assets/PublicRunner-C9MwEvxy.js +1 -0
  404. package/apps/web/dist/assets/ReadOnly-DC2Kp7l8.js +1 -0
  405. package/apps/web/dist/assets/RunDrawer-CY6NZSrI.js +4 -0
  406. package/apps/web/dist/assets/RunnerView-BT26XgcY.js +1 -0
  407. package/apps/web/dist/assets/SettingsPage-AFt9IDLt.js +1 -0
  408. package/apps/web/dist/assets/SetupPage-DtFYAbwJ.js +1 -0
  409. package/apps/web/dist/assets/SharePage-t2xwNS61.js +1 -0
  410. package/apps/web/dist/assets/changelog-CATQFxCQ.js +1 -0
  411. package/apps/web/dist/assets/engenty-eXZ-EAwd.js +1 -0
  412. package/apps/web/dist/assets/esm-DXeMu8Lb.js +7 -0
  413. package/apps/web/dist/assets/fluffy-engenty-ClRou7yu.js +456 -0
  414. package/apps/web/dist/assets/index-AfUa8xKD.css +1 -0
  415. package/apps/web/dist/assets/index-Drw7FMTQ.js +14 -0
  416. package/apps/web/dist/assets/jsx-runtime-BNakU3Ej.js +1 -0
  417. package/apps/web/dist/assets/lock-R_CfU0Xo.js +1 -0
  418. package/apps/web/dist/assets/oss-credits-cZ9NUaLZ.js +1 -0
  419. package/apps/web/dist/assets/pdfmake-Cx9scTbD.js +228 -0
  420. package/apps/web/dist/assets/phone-CgrIS4_-.js +1 -0
  421. package/apps/web/dist/assets/preload-helper-CNEI7N0N.js +1 -0
  422. package/apps/web/dist/assets/qr-scanner-worker.min-CJaXo3yu.js +98 -0
  423. package/apps/web/dist/assets/qr-scanner.min-C_UI0gH-.js +1 -0
  424. package/apps/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
  425. package/apps/web/dist/assets/settings-menu-2IMOOlLl.js +1 -0
  426. package/apps/web/dist/assets/ui-dzGvc3xk.js +137 -0
  427. package/apps/web/dist/assets/upload-BSuTilFF.js +1 -0
  428. package/apps/web/dist/assets/vfs_fonts-DllDSYt1.js +1 -0
  429. package/apps/web/dist/embed.js +266 -0
  430. package/apps/web/dist/favicon.svg +1 -0
  431. package/apps/web/dist/icons/apple-touch-icon.png +0 -0
  432. package/apps/web/dist/icons/icon-192.png +0 -0
  433. package/apps/web/dist/icons/icon-512.png +0 -0
  434. package/apps/web/dist/icons/icon-maskable-512.png +0 -0
  435. package/apps/web/dist/index.html +48 -0
  436. package/apps/web/dist/install.sh +577 -0
  437. package/apps/web/dist/manifest.webmanifest +21 -0
  438. package/apps/web/dist/mcp/flow.html +980 -0
  439. package/apps/web/dist/sw.js +15 -0
  440. package/bin/wizards.mjs +288 -0
  441. package/modules/README.md +15 -0
  442. package/node_modules/@engenty/wizards/dist/plugin/index.d.ts +1150 -0
  443. package/node_modules/@engenty/wizards/dist/plugin/index.js +4 -0
  444. package/node_modules/@engenty/wizards/dist/plugin/studio.d.ts +322 -0
  445. package/node_modules/@engenty/wizards/dist/plugin/studio.js +4 -0
  446. package/node_modules/@engenty/wizards/dist/plugin/thread.d.ts +174 -0
  447. package/node_modules/@engenty/wizards/dist/plugin/thread.js +821 -0
  448. package/node_modules/@engenty/wizards/package.json +11 -0
  449. package/node_modules/@engenty-wizards/shared/dist/assistant.d.ts +174 -0
  450. package/node_modules/@engenty-wizards/shared/dist/assistant.js +65 -0
  451. package/node_modules/@engenty-wizards/shared/dist/changes.d.ts +22 -0
  452. package/node_modules/@engenty-wizards/shared/dist/changes.js +61 -0
  453. package/node_modules/@engenty-wizards/shared/dist/connectors.d.ts +77 -0
  454. package/node_modules/@engenty-wizards/shared/dist/connectors.js +2 -0
  455. package/node_modules/@engenty-wizards/shared/dist/decision.d.ts +76 -0
  456. package/node_modules/@engenty-wizards/shared/dist/decision.js +147 -0
  457. package/node_modules/@engenty-wizards/shared/dist/definition.d.ts +2922 -0
  458. package/node_modules/@engenty-wizards/shared/dist/definition.js +1920 -0
  459. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.d.ts +5 -0
  460. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.js +132 -0
  461. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.d.ts +11 -0
  462. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.js +209 -0
  463. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.d.ts +532 -0
  464. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.js +217 -0
  465. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.d.ts +3 -0
  466. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.js +3 -0
  467. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.d.ts +14 -0
  468. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.js +166 -0
  469. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.d.ts +33 -0
  470. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.js +99 -0
  471. package/node_modules/@engenty-wizards/shared/dist/feature-flags.d.ts +78 -0
  472. package/node_modules/@engenty-wizards/shared/dist/feature-flags.js +70 -0
  473. package/node_modules/@engenty-wizards/shared/dist/features.d.ts +41 -0
  474. package/node_modules/@engenty-wizards/shared/dist/features.js +89 -0
  475. package/node_modules/@engenty-wizards/shared/dist/fit.d.ts +71 -0
  476. package/node_modules/@engenty-wizards/shared/dist/fit.js +382 -0
  477. package/node_modules/@engenty-wizards/shared/dist/json-schema.d.ts +14 -0
  478. package/node_modules/@engenty-wizards/shared/dist/json-schema.js +66 -0
  479. package/node_modules/@engenty-wizards/shared/dist/knowledge.d.ts +199 -0
  480. package/node_modules/@engenty-wizards/shared/dist/knowledge.js +68 -0
  481. package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.d.ts +35 -0
  482. package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.js +107 -0
  483. package/node_modules/@engenty-wizards/shared/dist/marketplace-search.d.ts +20 -0
  484. package/node_modules/@engenty-wizards/shared/dist/marketplace-search.js +136 -0
  485. package/node_modules/@engenty-wizards/shared/dist/marketplace.d.ts +227 -0
  486. package/node_modules/@engenty-wizards/shared/dist/marketplace.js +354 -0
  487. package/node_modules/@engenty-wizards/shared/dist/merge.d.ts +7 -0
  488. package/node_modules/@engenty-wizards/shared/dist/merge.js +40 -0
  489. package/node_modules/@engenty-wizards/shared/dist/numbers.d.ts +24 -0
  490. package/node_modules/@engenty-wizards/shared/dist/numbers.js +54 -0
  491. package/node_modules/@engenty-wizards/shared/dist/projects.d.ts +224 -0
  492. package/node_modules/@engenty-wizards/shared/dist/projects.js +319 -0
  493. package/node_modules/@engenty-wizards/shared/dist/providers.d.ts +101 -0
  494. package/node_modules/@engenty-wizards/shared/dist/providers.js +390 -0
  495. package/node_modules/@engenty-wizards/shared/dist/run.d.ts +680 -0
  496. package/node_modules/@engenty-wizards/shared/dist/run.js +620 -0
  497. package/node_modules/@engenty-wizards/shared/dist/runner-texts.d.ts +546 -0
  498. package/node_modules/@engenty-wizards/shared/dist/runner-texts.js +523 -0
  499. package/node_modules/@engenty-wizards/shared/dist/runners.d.ts +93 -0
  500. package/node_modules/@engenty-wizards/shared/dist/runners.js +146 -0
  501. package/node_modules/@engenty-wizards/shared/dist/shape.d.ts +102 -0
  502. package/node_modules/@engenty-wizards/shared/dist/shape.js +318 -0
  503. package/node_modules/@engenty-wizards/shared/dist/space-data.d.ts +89 -0
  504. package/node_modules/@engenty-wizards/shared/dist/space-data.js +47 -0
  505. package/node_modules/@engenty-wizards/shared/dist/store.d.ts +117 -0
  506. package/node_modules/@engenty-wizards/shared/dist/store.js +81 -0
  507. package/node_modules/@engenty-wizards/shared/dist/surface.d.ts +115 -0
  508. package/node_modules/@engenty-wizards/shared/dist/surface.js +442 -0
  509. package/node_modules/@engenty-wizards/shared/dist/texts.d.ts +45 -0
  510. package/node_modules/@engenty-wizards/shared/dist/texts.js +54 -0
  511. package/node_modules/@engenty-wizards/shared/dist/translation.d.ts +23 -0
  512. package/node_modules/@engenty-wizards/shared/dist/translation.js +154 -0
  513. package/node_modules/@engenty-wizards/shared/dist/wizard-package.d.ts +48 -0
  514. package/node_modules/@engenty-wizards/shared/dist/wizard-package.js +49 -0
  515. package/node_modules/@engenty-wizards/shared/dist/workspace.d.ts +16 -0
  516. package/node_modules/@engenty-wizards/shared/dist/workspace.js +51 -0
  517. package/node_modules/@engenty-wizards/shared/package.json +10 -0
  518. package/package.json +77 -4
  519. package/plugin/.claude-plugin/plugin.json +9 -0
  520. package/plugin/.mcp.json +8 -0
  521. package/plugin/commands/wizard.md +8 -0
  522. package/plugin/skills/build-wizard/SKILL.md +27 -0
  523. package/plugin/skills/use-wizard/SKILL.md +18 -0
@@ -0,0 +1,602 @@
1
+ import { sql } from "drizzle-orm";
2
+ import { blob, index, integer, primaryKey, real, sqliteTable, text, uniqueIndex, } from "drizzle-orm/sqlite-core";
3
+ const now = sql `(unixepoch() * 1000)`;
4
+ const createdAt = () => integer("created_at", { mode: "timestamp_ms" }).notNull().default(now);
5
+ const updatedAt = () => integer("updated_at", { mode: "timestamp_ms" }).notNull().default(now);
6
+ export const project = sqliteTable("project", {
7
+ id: text("id").primaryKey(),
8
+ tenantId: text("tenant_id").notNull(),
9
+ name: text("name").notNull(),
10
+ brand: text("brand", { mode: "json" }).$type().notNull().default({}),
11
+ facts: text("facts", { mode: "json" }).$type().notNull().default([]),
12
+ mcpServers: text("mcp_servers", { mode: "json" })
13
+ .$type()
14
+ .notNull()
15
+ .default([]),
16
+ /**
17
+ * `local`: the project of a local install, synced here when that install publishes. It keeps
18
+ * the ids it has there and is changed only by the next sync. Null: made on this runtime.
19
+ */
20
+ origin: text("origin", { enum: ["local"] }),
21
+ syncedAt: integer("synced_at", { mode: "timestamp_ms" }),
22
+ createdAt: createdAt(),
23
+ updatedAt: updatedAt(),
24
+ }, (t) => [index("project_tenant").on(t.tenantId)]);
25
+ export const wizard = sqliteTable("wizard", {
26
+ id: text("id").primaryKey(),
27
+ projectId: text("project_id")
28
+ .notNull()
29
+ .references(() => project.id, { onDelete: "cascade" }),
30
+ tenantId: text("tenant_id").notNull(),
31
+ title: text("title").notNull(),
32
+ draft: text("draft", { mode: "json" }).$type().notNull(),
33
+ publishedVersion: integer("published_version"),
34
+ shareToken: text("share_token").notNull(),
35
+ shareEnabled: integer("share_enabled", { mode: "boolean" }).notNull().default(true),
36
+ dailyRunLimit: integer("daily_run_limit").notNull().default(50),
37
+ starter: text("starter"),
38
+ /** The revision of the marketplace entry the wizard was made from. */
39
+ starterRevision: integer("starter_revision"),
40
+ /** Bumped on every draft write; a write carrying an older one is refused. */
41
+ revision: integer("revision").notNull().default(0),
42
+ /** How the wizard is offered: the runner its link opens, the ones switched on. Null: steps and chat. */
43
+ runners: text("runners", { mode: "json" }).$type(),
44
+ /** The wizard's page offers it in the viewer's language, translated on request. */
45
+ translate: integer("translate", { mode: "boolean" }).notNull().default(true),
46
+ createdAt: createdAt(),
47
+ updatedAt: updatedAt(),
48
+ }, (t) => [
49
+ uniqueIndex("wizard_share_token").on(t.shareToken),
50
+ index("wizard_project").on(t.projectId),
51
+ ]);
52
+ export const wizardVersion = sqliteTable("wizard_version", {
53
+ id: text("id").primaryKey(),
54
+ wizardId: text("wizard_id")
55
+ .notNull()
56
+ .references(() => wizard.id, { onDelete: "cascade" }),
57
+ version: integer("version").notNull(),
58
+ definition: text("definition", { mode: "json" }).$type().notNull(),
59
+ /** The workspace as it was at publish time. */
60
+ files: text("files", { mode: "json" }).$type().notNull().default([]),
61
+ createdAt: createdAt(),
62
+ }, (t) => [uniqueIndex("wizard_version_n").on(t.wizardId, t.version)]);
63
+ /**
64
+ * A wizard in one viewer's language: each original text the person reads with its translation,
65
+ * written by a model or by the author. Shared by every version; a new version's changed texts
66
+ * are added when the next viewer asks for the language.
67
+ */
68
+ export const wizardTranslation = sqliteTable("wizard_translation", {
69
+ wizardId: text("wizard_id")
70
+ .notNull()
71
+ .references(() => wizard.id, { onDelete: "cascade" }),
72
+ /** Any language, by its code ("fr"). */
73
+ lang: text("lang").notNull(),
74
+ texts: text("texts", { mode: "json" }).$type().notNull(),
75
+ /** The published version whose texts it last completed. */
76
+ version: integer("version"),
77
+ updatedAt: updatedAt(),
78
+ }, (t) => [primaryKey({ columns: [t.wizardId, t.lang] })]);
79
+ /** The draft's workspace: widget code, libraries, reference data. Content lives in the blob store. */
80
+ export const wizardFile = sqliteTable("wizard_file", {
81
+ wizardId: text("wizard_id")
82
+ .notNull()
83
+ .references(() => wizard.id, { onDelete: "cascade" }),
84
+ path: text("path").notNull(),
85
+ hash: text("hash").notNull(),
86
+ mime: text("mime").notNull(),
87
+ size: integer("size").notNull(),
88
+ updatedAt: updatedAt(),
89
+ }, (t) => [primaryKey({ columns: [t.wizardId, t.path] })]);
90
+ export const wizardMessage = sqliteTable("wizard_message", {
91
+ id: text("id").primaryKey(),
92
+ wizardId: text("wizard_id")
93
+ .notNull()
94
+ .references(() => wizard.id, { onDelete: "cascade" }),
95
+ role: text("role", { enum: ["user", "assistant"] }).notNull(),
96
+ content: text("content").notNull(),
97
+ /** Set on assistant turns that changed the wizard. */
98
+ changed: integer("changed", { mode: "boolean" }).notNull().default(false),
99
+ /** "mcp": written by an admin's own client (Claude Code, Cursor …) named in `client`. */
100
+ source: text("source", { enum: ["studio", "mcp"] })
101
+ .notNull()
102
+ .default("studio"),
103
+ client: text("client"),
104
+ createdAt: createdAt(),
105
+ }, (t) => [index("wizard_message_wizard").on(t.wizardId, t.createdAt)]);
106
+ export const run = sqliteTable("run", {
107
+ id: text("id").primaryKey(),
108
+ wizardId: text("wizard_id")
109
+ .notNull()
110
+ .references(() => wizard.id, { onDelete: "cascade" }),
111
+ tenantId: text("tenant_id").notNull(),
112
+ /** The definition the run started on — edits never reach a running wizard. */
113
+ definition: text("definition", { mode: "json" }).$type().notNull(),
114
+ /** The workspace the run started with. */
115
+ files: text("files", { mode: "json" }).$type().notNull().default([]),
116
+ version: integer("version"),
117
+ mode: text("mode", { enum: ["test", "live"] }).notNull(),
118
+ /** The door the run came through: steps, chat, or a plugin's runner. Null: the page. */
119
+ runner: text("runner"),
120
+ /** The language the viewer reads the wizard in, translated on request; null: its own. */
121
+ lang: text("lang"),
122
+ visitorId: text("visitor_id"),
123
+ userId: text("user_id"),
124
+ ipHash: text("ip_hash"),
125
+ /**
126
+ * Where a visitor started the run: the address of the website page that embeds the wizard
127
+ * (`data-page` of the embed tag, else the page's own address); null on the wizard's link.
128
+ */
129
+ origin: text("origin"),
130
+ status: text("status", {
131
+ enum: ["waiting_input", "running", "done", "failed", "cancelled"],
132
+ }).notNull(),
133
+ cursor: text("cursor"),
134
+ state: text("state", { mode: "json" }).$type().notNull(),
135
+ error: text("error"),
136
+ /** What a running step is asking the person right now (a login, a code); null = nothing. */
137
+ ask: text("ask", { mode: "json" }).$type(),
138
+ /** The person's answer to `ask`, written by the web for the runner that waits on it. */
139
+ answer: text("answer", { mode: "json" }).$type(),
140
+ /** An autopilot drives this test run (an MCP client fills its pages): it asks nobody. */
141
+ unattended: integer("unattended", { mode: "boolean" }).notNull().default(false),
142
+ /**
143
+ * What the device the run is watched from offers as a model (the app's Apple Intelligence),
144
+ * with when it last said so; written by the web, read by the runner (engine/device.ts).
145
+ */
146
+ deviceOffer: text("device_offer", { mode: "json" }).$type(),
147
+ costMicros: integer("cost_micros").notNull().default(0),
148
+ /** Set once the result is shared: `/s/<token>` shows it read-only. */
149
+ shareToken: text("share_token"),
150
+ sharedAt: integer("shared_at", { mode: "timestamp_ms" }),
151
+ /** Runs without an account are deleted after this; null keeps the run. */
152
+ expiresAt: integer("expires_at", { mode: "timestamp_ms" }),
153
+ createdAt: createdAt(),
154
+ updatedAt: updatedAt(),
155
+ }, (t) => [
156
+ uniqueIndex("run_share_token").on(t.shareToken),
157
+ index("run_expires").on(t.expiresAt),
158
+ index("run_wizard").on(t.wizardId, t.createdAt),
159
+ index("run_visitor").on(t.visitorId, t.createdAt),
160
+ index("run_status").on(t.status),
161
+ ]);
162
+ export const runEvent = sqliteTable("run_event", {
163
+ id: integer("id").primaryKey({ autoIncrement: true }),
164
+ runId: text("run_id")
165
+ .notNull()
166
+ .references(() => run.id, { onDelete: "cascade" }),
167
+ stepId: text("step_id"),
168
+ type: text("type", { enum: ["step_started", "step_done", "tool", "info", "error"] }).notNull(),
169
+ message: text("message").notNull(),
170
+ /** The message as a note of `RUN_NOTES`, for a runner in another language. */
171
+ note: text("note", { mode: "json" }).$type(),
172
+ /** A picture of the run the event is about; shown while the step works. */
173
+ assetId: text("asset_id"),
174
+ createdAt: createdAt(),
175
+ }, (t) => [index("run_event_run").on(t.runId, t.id)]);
176
+ /**
177
+ * A call the runner put to the run's device, open until the device answers or the runner stops
178
+ * waiting: the stream (any web process) carries it to the phone, and the answer comes back here.
179
+ */
180
+ export const deviceCall = sqliteTable("device_call", {
181
+ id: integer("id").primaryKey({ autoIncrement: true }),
182
+ runId: text("run_id")
183
+ .notNull()
184
+ .references(() => run.id, { onDelete: "cascade" }),
185
+ reqId: text("req_id").notNull(),
186
+ request: text("request", { mode: "json" }).$type().notNull(),
187
+ answer: text("answer", { mode: "json" }).$type(),
188
+ createdAt: createdAt(),
189
+ }, (t) => [uniqueIndex("device_call_req").on(t.reqId), index("device_call_run").on(t.runId)]);
190
+ /** What each step of a run cost, in credit micros: the measurements estimates are made from. */
191
+ export const runCost = sqliteTable("run_cost", {
192
+ runId: text("run_id")
193
+ .notNull()
194
+ .references(() => run.id, { onDelete: "cascade" }),
195
+ stepId: text("step_id").notNull(),
196
+ micros: integer("micros").notNull().default(0),
197
+ }, (t) => [primaryKey({ columns: [t.runId, t.stepId] })]);
198
+ export const asset = sqliteTable("asset", {
199
+ id: text("id").primaryKey(),
200
+ tenantId: text("tenant_id").notNull(),
201
+ runId: text("run_id"),
202
+ stepId: text("step_id"),
203
+ kind: text("kind").notNull(),
204
+ mime: text("mime").notNull(),
205
+ name: text("name").notNull(),
206
+ path: text("path").notNull(),
207
+ size: integer("size").notNull(),
208
+ createdAt: createdAt(),
209
+ }, (t) => [index("asset_run").on(t.runId)]);
210
+ /**
211
+ * A service imported as a connector, from the integrations registry or a pasted OpenAPI spec /
212
+ * MCP endpoint. The record is engenty's: actions, auth and source, normalised at import time.
213
+ */
214
+ export const projectConnector = sqliteTable("project_connector", {
215
+ projectId: text("project_id")
216
+ .notNull()
217
+ .references(() => project.id, { onDelete: "cascade" }),
218
+ id: text("id").notNull(),
219
+ record: text("record", { mode: "json" }).$type().notNull(),
220
+ createdAt: createdAt(),
221
+ updatedAt: updatedAt(),
222
+ }, (t) => [primaryKey({ columns: [t.projectId, t.id] })]);
223
+ /**
224
+ * What a project holds for all its wizards: logos, assets (images, graphics, videos) and
225
+ * documents. `id` is the asset the content lives in. The first logo is the one end users see.
226
+ */
227
+ export const projectFile = sqliteTable("project_file", {
228
+ id: text("id").primaryKey(),
229
+ projectId: text("project_id")
230
+ .notNull()
231
+ .references(() => project.id, { onDelete: "cascade" }),
232
+ kind: text("kind", { enum: ["logo", "asset", "document", "pattern"] }).notNull(),
233
+ name: text("name").notNull(),
234
+ mime: text("mime").notNull(),
235
+ size: integer("size").notNull(),
236
+ description: text("description").notNull().default(""),
237
+ /** A web address the file was fetched from, when it was not uploaded. */
238
+ source: text("source"),
239
+ position: integer("position").notNull().default(0),
240
+ /** `pending` while it is read, described and indexed. */
241
+ status: text("status", { enum: ["pending", "ready", "failed"] })
242
+ .notNull()
243
+ .default("ready"),
244
+ error: text("error"),
245
+ /** A document's text as Markdown, in the blob store. */
246
+ textHash: text("text_hash"),
247
+ pages: integer("pages"),
248
+ chars: integer("chars"),
249
+ /** What the index holds of a document; `embeddings` includes the keywords. */
250
+ indexed: text("indexed", { enum: ["embeddings", "keywords"] }),
251
+ /** A plugin's file (`server.spaceData.putFile`): the plugin, its key and what it calls it. */
252
+ origin: text("origin"),
253
+ originKey: text("origin_key"),
254
+ originLabel: text("origin_label"),
255
+ createdAt: createdAt(),
256
+ updatedAt: updatedAt(),
257
+ }, (t) => [
258
+ index("project_file_project").on(t.projectId, t.kind, t.position),
259
+ uniqueIndex("project_file_origin").on(t.projectId, t.origin, t.originKey),
260
+ ]);
261
+ /**
262
+ * The index of Knowledge: one unit per section of a page, row of a table, file, summary of a
263
+ * category's value, passage of a document read before pages, and passage of a plugin's text
264
+ * (`server.index`). Each unit's text starts with where it stands and its categories. Keywords
265
+ * live in two FTS5 tables, words (`project_chunk_fts`) and trigrams (`project_chunk_tri`), which
266
+ * triggers keep in step (see the migrations); `embedding` is the unit's vector as float32
267
+ * bytes, compared with libSQL's `vector_distance_cos`.
268
+ */
269
+ export const projectChunk = sqliteTable("project_chunk", {
270
+ id: integer("id").primaryKey({ autoIncrement: true }),
271
+ projectId: text("project_id")
272
+ .notNull()
273
+ .references(() => project.id, { onDelete: "cascade" }),
274
+ /** The document the passage is of; null for a plugin's text. */
275
+ fileId: text("file_id").references(() => projectFile.id, { onDelete: "cascade" }),
276
+ /** What the unit is of: a page, a row (with its table), a table (FAQ format: a row), a value. */
277
+ pageId: text("page_id").references(() => spacePage.id, {
278
+ onDelete: "cascade",
279
+ }),
280
+ rowId: text("row_id").references(() => spaceTableRow.id, {
281
+ onDelete: "cascade",
282
+ }),
283
+ tableId: text("table_id").references(() => spaceTable.id, {
284
+ onDelete: "cascade",
285
+ }),
286
+ valueId: text("value_id").references(() => spaceCategoryValue.id, {
287
+ onDelete: "cascade",
288
+ }),
289
+ /** A section's headings, outermost first, joined by " › ". */
290
+ heading: text("heading"),
291
+ /** The page of the original a section starts on (`<!-- S. 3 -->`). */
292
+ sheet: integer("sheet"),
293
+ /** A plugin's text: the plugin, its key for the text, its title and where the studio shows it. */
294
+ plugin: text("plugin"),
295
+ ref: text("ref"),
296
+ title: text("title"),
297
+ link: text("link"),
298
+ idx: integer("idx").notNull(),
299
+ text: text("text").notNull(),
300
+ embedding: blob("embedding", { mode: "buffer" }),
301
+ /** The model the vector was made with; only vectors of one model are compared. */
302
+ model: text("model"),
303
+ }, (t) => [
304
+ index("project_chunk_project").on(t.projectId, t.model),
305
+ index("project_chunk_file").on(t.fileId),
306
+ index("project_chunk_ref").on(t.projectId, t.plugin, t.ref),
307
+ index("project_chunk_page").on(t.pageId),
308
+ index("project_chunk_row").on(t.rowId),
309
+ index("project_chunk_table").on(t.tableId),
310
+ index("project_chunk_value").on(t.valueId),
311
+ ]);
312
+ // --- The space's data -------------------------------------------------------
313
+ // Tables and pages a space keeps, its own or one of its wizards'. Shared by everyone who works
314
+ // in the space, unlike the wizard's store below, which belongs to one person.
315
+ /** A table: its columns are engenty data-table columns, its rows in `space_table_row`. */
316
+ export const spaceTable = sqliteTable("space_table", {
317
+ id: text("id").primaryKey(),
318
+ tenantId: text("tenant_id").notNull(),
319
+ projectId: text("project_id")
320
+ .notNull()
321
+ .references(() => project.id, { onDelete: "cascade" }),
322
+ /** The wizard it belongs to; null: the space's own. */
323
+ wizardId: text("wizard_id").references(() => wizard.id, { onDelete: "cascade" }),
324
+ /**
325
+ * The wizard's shared list it keeps: its title, columns and key come from the wizard's
326
+ * definition, its rows from every run. Null: a table made in the studio.
327
+ */
328
+ list: text("list"),
329
+ /** The column a row is matched on, as the list says. */
330
+ keyColumn: text("key_column"),
331
+ title: text("title").notNull(),
332
+ /** Its name in a path (`tables/<slug>`), unique among the space's tables. */
333
+ slug: text("slug"),
334
+ /** `faq`: a question and its answer per row. */
335
+ format: text("format", { enum: ["faq"] }),
336
+ columns: text("columns", { mode: "json" }).$type().notNull(),
337
+ /**
338
+ * Written by a plugin (`server.spaceData`): the plugin, its key for the item and what it
339
+ * calls where it came from ("Tagesberichte"). Null: made in the studio or uploaded.
340
+ */
341
+ origin: text("origin"),
342
+ originKey: text("origin_key"),
343
+ originLabel: text("origin_label"),
344
+ /** A person changed what its origin wrote: the origin no longer writes it. */
345
+ kept: integer("kept", { mode: "boolean" }).notNull().default(false),
346
+ /** Why a person should look at it ("hardly readable"); null when nothing is in doubt. */
347
+ review: text("review"),
348
+ /** The file it was read from, kept as the evidence. */
349
+ fileId: text("file_id").references(() => projectFile.id, { onDelete: "set null" }),
350
+ createdAt: createdAt(),
351
+ updatedAt: updatedAt(),
352
+ }, (t) => [
353
+ index("space_table_project").on(t.projectId, t.wizardId),
354
+ uniqueIndex("space_table_list").on(t.wizardId, t.list),
355
+ uniqueIndex("space_table_origin").on(t.projectId, t.origin, t.originKey),
356
+ ]);
357
+ /** A row of a table: cells by column id. Rows stand in the order they were added. */
358
+ export const spaceTableRow = sqliteTable("space_table_row", {
359
+ id: text("id").primaryKey(),
360
+ tableId: text("table_id")
361
+ .notNull()
362
+ .references(() => spaceTable.id, { onDelete: "cascade" }),
363
+ /** The key column's value, normalised: saving a row with a known key updates that row. */
364
+ key: text("key"),
365
+ cells: text("cells", { mode: "json" }).$type().notNull(),
366
+ createdAt: createdAt(),
367
+ updatedAt: updatedAt(),
368
+ }, (t) => [
369
+ index("space_table_row_table").on(t.tableId, t.createdAt),
370
+ index("space_table_row_key").on(t.tableId, t.key),
371
+ ]);
372
+ /**
373
+ * A page: a title and markdown, what the editor shows and an agent reads and writes. A page of
374
+ * the space's own may have sub-pages: a long document split along its own headings.
375
+ */
376
+ export const spacePage = sqliteTable("space_page", {
377
+ id: text("id").primaryKey(),
378
+ tenantId: text("tenant_id").notNull(),
379
+ projectId: text("project_id")
380
+ .notNull()
381
+ .references(() => project.id, { onDelete: "cascade" }),
382
+ wizardId: text("wizard_id").references(() => wizard.id, { onDelete: "cascade" }),
383
+ parentId: text("parent_id").references(() => spacePage.id, {
384
+ onDelete: "cascade",
385
+ }),
386
+ /** Its place among its parent's sub-pages. */
387
+ position: integer("position").notNull().default(0),
388
+ title: text("title").notNull(),
389
+ /** Its name in a path (`pages/<parent>/<slug>`), unique among its siblings. */
390
+ slug: text("slug"),
391
+ markdown: text("markdown").notNull().default(""),
392
+ /**
393
+ * Written by a plugin (`server.spaceData`): the plugin, its key for the item and what it
394
+ * calls where it came from ("Tagesberichte"). Null: made in the studio or uploaded.
395
+ */
396
+ origin: text("origin"),
397
+ originKey: text("origin_key"),
398
+ originLabel: text("origin_label"),
399
+ /** A person changed what its origin wrote: the origin no longer writes it. */
400
+ kept: integer("kept", { mode: "boolean" }).notNull().default(false),
401
+ /** Why a person should look at it ("hardly readable"); null when nothing is in doubt. */
402
+ review: text("review"),
403
+ /** The file it was read from, kept as the evidence. */
404
+ fileId: text("file_id").references(() => projectFile.id, { onDelete: "set null" }),
405
+ createdAt: createdAt(),
406
+ updatedAt: updatedAt(),
407
+ }, (t) => [
408
+ index("space_page_project").on(t.projectId, t.wizardId),
409
+ index("space_page_parent").on(t.parentId, t.position),
410
+ uniqueIndex("space_page_origin").on(t.projectId, t.origin, t.originKey),
411
+ ]);
412
+ // --- Categories -----------------------------------------------------------------
413
+ // Typed properties that run across Knowledge: set on pages, rows, tables and files, any number of
414
+ // each, so a step filters before it searches.
415
+ /** A category of the space: a name, a type and, for a choice, the values it has met. */
416
+ export const spaceCategory = sqliteTable("space_category", {
417
+ id: text("id").primaryKey(),
418
+ tenantId: text("tenant_id").notNull(),
419
+ projectId: text("project_id")
420
+ .notNull()
421
+ .references(() => project.id, { onDelete: "cascade" }),
422
+ name: text("name").notNull(),
423
+ type: text("type", { enum: ["choice", "date", "number", "text", "boolean"] }).notNull(),
424
+ /** A number's unit: `h`, `€`, `kg`. */
425
+ unit: text("unit"),
426
+ /** A choice: several values per item. */
427
+ multiple: integer("multiple", { mode: "boolean" }).notNull().default(false),
428
+ /** A choice whose values are ranked (niedrig, mittel, hoch): their position is the rank. */
429
+ ordered: integer("ordered", { mode: "boolean" }).notNull().default(false),
430
+ /** Where its values come from, said in a few words ("Kopfzeile", "Spalte WLL"). */
431
+ hint: text("hint"),
432
+ /** The plugin that brought it; null: made in the studio. */
433
+ origin: text("origin"),
434
+ /** Proposed, not yet taken: shown to be confirmed, never filled. */
435
+ proposed: integer("proposed", { mode: "boolean" }).notNull().default(false),
436
+ /** A column of a table whose cells are its values for the table's rows. */
437
+ tableId: text("table_id").references(() => spaceTable.id, { onDelete: "set null" }),
438
+ columnId: text("column_id"),
439
+ position: integer("position").notNull().default(0),
440
+ createdAt: createdAt(),
441
+ updatedAt: updatedAt(),
442
+ }, (t) => [uniqueIndex("space_category_name").on(t.projectId, t.name)]);
443
+ /** A value of a choice: grows as items arrive; its summary is the summary of its items. */
444
+ export const spaceCategoryValue = sqliteTable("space_category_value", {
445
+ id: text("id").primaryKey(),
446
+ categoryId: text("category_id")
447
+ .notNull()
448
+ .references(() => spaceCategory.id, { onDelete: "cascade" }),
449
+ value: text("value").notNull(),
450
+ position: integer("position").notNull().default(0),
451
+ /** The summary: Markdown a model wrote of the value's items, when it last did. */
452
+ summary: text("summary"),
453
+ summaryAt: integer("summary_at", { mode: "timestamp_ms" }),
454
+ createdAt: createdAt(),
455
+ }, (t) => [uniqueIndex("space_category_value_value").on(t.categoryId, t.value)]);
456
+ /**
457
+ * A category set on an item: exactly one of page, row, table and file. A choice points to its
458
+ * value; the other types keep theirs typed: a date as milliseconds, a number, a short text, yes
459
+ * or no. A choice with several values has a row per value.
460
+ */
461
+ export const spaceItemCategory = sqliteTable("space_item_category", {
462
+ id: integer("id").primaryKey({ autoIncrement: true }),
463
+ projectId: text("project_id")
464
+ .notNull()
465
+ .references(() => project.id, { onDelete: "cascade" }),
466
+ categoryId: text("category_id")
467
+ .notNull()
468
+ .references(() => spaceCategory.id, { onDelete: "cascade" }),
469
+ pageId: text("page_id").references(() => spacePage.id, { onDelete: "cascade" }),
470
+ rowId: text("row_id").references(() => spaceTableRow.id, { onDelete: "cascade" }),
471
+ tableId: text("table_id").references(() => spaceTable.id, { onDelete: "cascade" }),
472
+ fileId: text("file_id").references(() => projectFile.id, { onDelete: "cascade" }),
473
+ valueId: text("value_id").references(() => spaceCategoryValue.id, { onDelete: "cascade" }),
474
+ text: text("text"),
475
+ num: real("num"),
476
+ at: integer("at"),
477
+ bool: integer("bool", { mode: "boolean" }),
478
+ /** Who set it: a person, the item's origin (a source's structure), or a model reading it. */
479
+ by: text("by", { enum: ["person", "origin", "model"] })
480
+ .notNull()
481
+ .default("person"),
482
+ }, (t) => [
483
+ index("space_item_category_category").on(t.categoryId, t.valueId),
484
+ index("space_item_category_page").on(t.pageId),
485
+ index("space_item_category_row").on(t.rowId),
486
+ index("space_item_category_table").on(t.tableId),
487
+ index("space_item_category_file").on(t.fileId),
488
+ ]);
489
+ export const assistantChat = sqliteTable("assistant_chat", {
490
+ id: text("id").primaryKey(),
491
+ tenantId: text("tenant_id").notNull(),
492
+ userId: text("user_id").notNull(),
493
+ /** Set when the chat is closed; null for the open one. */
494
+ title: text("title"),
495
+ /**
496
+ * Open: what the messages folded away said (`folded` of them, oldest first). Closed: the dense
497
+ * summary of the whole chat — what was asked, what changed, what is still open.
498
+ */
499
+ summary: text("summary"),
500
+ folded: integer("folded").notNull().default(0),
501
+ createdAt: createdAt(),
502
+ closedAt: integer("closed_at", { mode: "timestamp_ms" }),
503
+ }, (t) => [index("assistant_chat_user").on(t.tenantId, t.userId, t.closedAt)]);
504
+ export const assistantMessage = sqliteTable("assistant_message", {
505
+ id: text("id").primaryKey(),
506
+ chatId: text("chat_id")
507
+ .notNull()
508
+ .references(() => assistantChat.id, { onDelete: "cascade" }),
509
+ role: text("role", { enum: ["user", "assistant"] }).notNull(),
510
+ content: text("content").notNull(),
511
+ /** Cards of plugins' tools, with their data, so an earlier chat shows them again. */
512
+ cards: text("cards", { mode: "json" }).$type(),
513
+ toolCalls: text("tool_calls", { mode: "json" }).$type(),
514
+ /** The page the person wrote from: route and title (the snapshot of that turn, cut short). */
515
+ page: text("page", { mode: "json" }).$type(),
516
+ changed: integer("changed", { mode: "boolean" }).notNull().default(false),
517
+ createdAt: createdAt(),
518
+ }, (t) => [index("assistant_message_chat").on(t.chatId, t.createdAt)]);
519
+ // --- The wizard's store ------------------------------------------------------
520
+ // What a wizard keeps between runs for one person. `holder` is that person: "u:<userId>" for a
521
+ // signed-in admin, "v:<visitorId>" for an end user on a shared link.
522
+ /** One (wizard, person) pair that has stored something; `usedAt` drives the clean-up. */
523
+ export const storeHolder = sqliteTable("store_holder", {
524
+ wizardId: text("wizard_id")
525
+ .notNull()
526
+ .references(() => wizard.id, { onDelete: "cascade" }),
527
+ holder: text("holder").notNull(),
528
+ usedAt: integer("used_at", { mode: "timestamp_ms" }).notNull().default(now),
529
+ }, (t) => [primaryKey({ columns: [t.wizardId, t.holder] }), index("store_holder_used").on(t.usedAt)]);
530
+ /** A row of one of the wizard's lists. Columns are defined in the wizard, values live here. */
531
+ export const storeRow = sqliteTable("store_row", {
532
+ id: text("id").primaryKey(),
533
+ wizardId: text("wizard_id")
534
+ .notNull()
535
+ .references(() => wizard.id, { onDelete: "cascade" }),
536
+ holder: text("holder").notNull(),
537
+ list: text("list").notNull(),
538
+ /** The key column's value, normalised; saving a row with a known key updates that row. */
539
+ key: text("key"),
540
+ cells: text("cells", { mode: "json" }).$type().notNull(),
541
+ createdAt: createdAt(),
542
+ updatedAt: updatedAt(),
543
+ }, (t) => [
544
+ uniqueIndex("store_row_key").on(t.wizardId, t.holder, t.list, t.key),
545
+ index("store_row_list").on(t.wizardId, t.holder, t.list, t.createdAt),
546
+ ]);
547
+ /** A file the wizard keeps (a downloaded invoice, a scan). Content lives in the blob store. */
548
+ export const storeFile = sqliteTable("store_file", {
549
+ wizardId: text("wizard_id")
550
+ .notNull()
551
+ .references(() => wizard.id, { onDelete: "cascade" }),
552
+ holder: text("holder").notNull(),
553
+ path: text("path").notNull(),
554
+ hash: text("hash").notNull(),
555
+ mime: text("mime").notNull(),
556
+ size: integer("size").notNull(),
557
+ source: text("source"),
558
+ updatedAt: updatedAt(),
559
+ }, (t) => [primaryKey({ columns: [t.wizardId, t.holder, t.path] })]);
560
+ /** A connected account or a kept browser session. `data` is encrypted. */
561
+ export const storeSecret = sqliteTable("store_secret", {
562
+ id: text("id").primaryKey(),
563
+ wizardId: text("wizard_id")
564
+ .notNull()
565
+ .references(() => wizard.id, { onDelete: "cascade" }),
566
+ holder: text("holder").notNull(),
567
+ /** "connection:<id>" or "browser:<host>". */
568
+ slot: text("slot").notNull(),
569
+ provider: text("provider").notNull(),
570
+ /** Shown to the person: the account's address or the site's name. */
571
+ label: text("label").notNull(),
572
+ data: text("data").notNull(),
573
+ createdAt: createdAt(),
574
+ updatedAt: updatedAt(),
575
+ }, (t) => [uniqueIndex("store_secret_slot").on(t.wizardId, t.holder, t.slot)]);
576
+ /** Marketplace entries starred here: the runtime keeps them for offline use. */
577
+ export const marketplaceStar = sqliteTable("marketplace_star", {
578
+ tenantId: text("tenant_id").notNull(),
579
+ entryId: text("entry_id").notNull(),
580
+ createdAt: createdAt(),
581
+ }, (t) => [primaryKey({ columns: [t.tenantId, t.entryId] })]);
582
+ /**
583
+ * An account a plugin connected for a space (`server.connections`): a calendar, a mailbox. Not
584
+ * a wizard's: it outlives runs and people. `data` is encrypted.
585
+ */
586
+ export const pluginConnection = sqliteTable("plugin_connection", {
587
+ id: text("id").primaryKey(),
588
+ plugin: text("plugin").notNull(),
589
+ projectId: text("project_id")
590
+ .notNull()
591
+ .references(() => project.id, { onDelete: "cascade" }),
592
+ /** The built-in connector: `google-calendar`, `microsoft-outlook`. */
593
+ connector: text("connector").notNull(),
594
+ /** Shown to the person: the account's address. */
595
+ label: text("label").notNull(),
596
+ /** The connector's actions it was connected for. */
597
+ actions: text("actions", { mode: "json" }).$type().notNull(),
598
+ data: text("data").notNull(),
599
+ createdBy: text("created_by"),
600
+ createdAt: createdAt(),
601
+ updatedAt: updatedAt(),
602
+ }, (t) => [index("plugin_connection_space").on(t.plugin, t.projectId)]);