@engenty/wizards-runtime 0.7.11 → 0.9.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 (257) hide show
  1. package/README.md +5 -1
  2. package/apps/runtime/dist/agents/architect.js +2 -2
  3. package/apps/runtime/dist/agents/studio-assistant.js +1 -1
  4. package/apps/runtime/dist/agents/website.js +1 -1
  5. package/apps/runtime/dist/app.js +1 -1
  6. package/apps/runtime/dist/assistant/browser.js +1 -1
  7. package/apps/runtime/dist/authoring/guide.js +16 -4
  8. package/apps/runtime/dist/authoring/ops.js +1 -1
  9. package/apps/runtime/dist/cli/exec.js +4 -1
  10. package/apps/runtime/dist/cli/features.js +1 -1
  11. package/apps/runtime/dist/cli/validate.js +2 -2
  12. package/apps/runtime/dist/connectors/builtin.js +4 -2
  13. package/apps/runtime/dist/connectors/external.js +1 -1
  14. package/apps/runtime/dist/connectors/index.js +37 -6
  15. package/apps/runtime/dist/connectors/smtp.js +221 -0
  16. package/apps/runtime/dist/connectors/via-account.js +1 -1
  17. package/apps/runtime/dist/credits/estimate.js +1 -1
  18. package/apps/runtime/dist/db/migrations/tenant/0018_share_job.sql +18 -0
  19. package/apps/runtime/dist/db/migrations/tenant/meta/0018_snapshot.json +3460 -0
  20. package/apps/runtime/dist/db/migrations/tenant/meta/_journal.json +7 -0
  21. package/apps/runtime/dist/db/schema.js +19 -0
  22. package/apps/runtime/dist/docs/dev/index.md +25 -13
  23. package/apps/runtime/dist/docs/dev/integration/index.md +1 -1
  24. package/apps/runtime/dist/docs/dev/integration/openui.md +1 -1
  25. package/apps/runtime/dist/docs/dev/integration/own-ui.md +2 -2
  26. package/apps/runtime/dist/docs/dev/meta.json +8 -2
  27. package/apps/runtime/dist/docs/dev/plugins/examples.md +2 -3
  28. package/apps/runtime/dist/docs/dev/plugins/studio.md +5 -6
  29. package/apps/runtime/dist/docs/dev/plugins/styling.md +10 -7
  30. package/apps/runtime/dist/docs/dev/wizard-format/agent-steps.md +112 -0
  31. package/apps/runtime/dist/docs/dev/wizard-format/branches.md +63 -0
  32. package/apps/runtime/dist/docs/dev/wizard-format/film-steps.md +47 -0
  33. package/apps/runtime/dist/docs/dev/wizard-format/generate-steps.md +57 -0
  34. package/apps/runtime/dist/docs/dev/wizard-format/index.md +188 -0
  35. package/apps/runtime/dist/docs/dev/wizard-format/lists-and-connections.md +65 -0
  36. package/apps/runtime/dist/docs/dev/wizard-format/meta.json +19 -0
  37. package/apps/runtime/dist/docs/dev/wizard-format/pages-and-fields.md +102 -0
  38. package/apps/runtime/dist/docs/dev/wizard-format/review-and-result.md +64 -0
  39. package/apps/runtime/dist/docs/dev/wizard-format/templates.md +57 -0
  40. package/apps/runtime/dist/docs/dev/wizard-format/validate.md +63 -0
  41. package/apps/runtime/dist/docs/dev/wizard-format/views-and-widgets.md +103 -0
  42. package/apps/runtime/dist/docs/dev/wizard-format/wizard-file.md +147 -0
  43. package/apps/runtime/dist/docs/user/build-a-wizard.md +2 -2
  44. package/apps/runtime/dist/docs/user/run.md +21 -4
  45. package/apps/runtime/dist/docs/user/space.md +14 -10
  46. package/apps/runtime/dist/docs/user/steps.md +26 -1
  47. package/apps/runtime/dist/docs/user/test-and-share.md +3 -2
  48. package/apps/runtime/dist/documents/parse.js +1 -1
  49. package/apps/runtime/dist/engine/decide.js +1 -1
  50. package/apps/runtime/dist/engine/events.js +1 -1
  51. package/apps/runtime/dist/engine/input.js +3 -3
  52. package/apps/runtime/dist/engine/prepare.js +1 -1
  53. package/apps/runtime/dist/engine/requirements.js +25 -10
  54. package/apps/runtime/dist/engine/runner.js +23 -14
  55. package/apps/runtime/dist/engine/steps.js +6 -6
  56. package/apps/runtime/dist/engine/surface.js +3 -3
  57. package/apps/runtime/dist/engine/template.js +4 -4
  58. package/apps/runtime/dist/env.js +5 -0
  59. package/apps/runtime/dist/features.js +1 -1
  60. package/apps/runtime/dist/film/project.js +2 -2
  61. package/apps/runtime/dist/film/step.js +2 -2
  62. package/apps/runtime/dist/harness/antigravity.js +2 -10
  63. package/apps/runtime/dist/harness/apple.js +1 -1
  64. package/apps/runtime/dist/harness/claude.js +3 -11
  65. package/apps/runtime/dist/harness/codex.js +6 -12
  66. package/apps/runtime/dist/harness/cursor.js +2 -10
  67. package/apps/runtime/dist/harness/env.js +23 -0
  68. package/apps/runtime/dist/harness/index.js +6 -3
  69. package/apps/runtime/dist/harness/model.js +1 -1
  70. package/apps/runtime/dist/harness/terminal.js +1 -1
  71. package/apps/runtime/dist/mcp/flow-app.js +1 -1
  72. package/apps/runtime/dist/media/conversation.js +1 -1
  73. package/apps/runtime/dist/media/transcribe.js +1 -1
  74. package/apps/runtime/dist/model-errors.js +1 -1
  75. package/apps/runtime/dist/models.js +3 -3
  76. package/apps/runtime/dist/plugin.js +1 -1
  77. package/apps/runtime/dist/plugins/discovery.js +1 -1
  78. package/apps/runtime/dist/plugins/loader.js +2 -2
  79. package/apps/runtime/dist/plugins/runs.js +2 -2
  80. package/apps/runtime/dist/render/downloads.js +2 -2
  81. package/apps/runtime/dist/render/shaped.js +1 -1
  82. package/apps/runtime/dist/routes/api.js +2 -2
  83. package/apps/runtime/dist/routes/lang.js +1 -1
  84. package/apps/runtime/dist/routes/marketplace.js +1 -1
  85. package/apps/runtime/dist/routes/runs.js +110 -10
  86. package/apps/runtime/dist/routes/studio.js +20 -8
  87. package/apps/runtime/dist/services/access.js +1 -1
  88. package/apps/runtime/dist/services/api.js +4 -4
  89. package/apps/runtime/dist/services/assistant-chats.js +2 -2
  90. package/apps/runtime/dist/services/brand.js +2 -2
  91. package/apps/runtime/dist/services/cloud.js +1 -1
  92. package/apps/runtime/dist/services/errors.js +1 -1
  93. package/apps/runtime/dist/services/files.js +1 -1
  94. package/apps/runtime/dist/services/knowledge-model.js +3 -3
  95. package/apps/runtime/dist/services/knowledge.js +2 -2
  96. package/apps/runtime/dist/services/marketplace.js +5 -5
  97. package/apps/runtime/dist/services/package-file.js +3 -3
  98. package/apps/runtime/dist/services/package.js +2 -2
  99. package/apps/runtime/dist/services/profile.js +1 -1
  100. package/apps/runtime/dist/services/project-files.js +2 -2
  101. package/apps/runtime/dist/services/project-index.js +1 -1
  102. package/apps/runtime/dist/services/projects.js +2 -2
  103. package/apps/runtime/dist/services/runners.js +3 -3
  104. package/apps/runtime/dist/services/runs.js +2 -2
  105. package/apps/runtime/dist/services/shares.js +1 -1
  106. package/apps/runtime/dist/services/site.js +2 -2
  107. package/apps/runtime/dist/services/space-categories.js +3 -3
  108. package/apps/runtime/dist/services/space-data.js +4 -4
  109. package/apps/runtime/dist/services/spaces.js +6 -6
  110. package/apps/runtime/dist/services/translations.js +5 -5
  111. package/apps/runtime/dist/services/widgets.js +1 -1
  112. package/apps/runtime/dist/services/wizards.js +3 -3
  113. package/apps/runtime/dist/sharing/agent.js +65 -0
  114. package/apps/runtime/dist/sharing/files.js +121 -0
  115. package/apps/runtime/dist/sharing/index.js +298 -0
  116. package/apps/runtime/dist/sharing/jobs.js +186 -0
  117. package/apps/runtime/dist/sharing/state.js +116 -0
  118. package/apps/runtime/dist/sharing/targets/browser.js +131 -0
  119. package/apps/runtime/dist/sharing/targets/connector.js +63 -0
  120. package/apps/runtime/dist/sharing/targets/email.js +98 -0
  121. package/apps/runtime/dist/sharing/targets/slack.js +54 -0
  122. package/apps/runtime/dist/sharing/targets/storage.js +164 -0
  123. package/apps/runtime/dist/sharing/types.js +13 -0
  124. package/apps/runtime/dist/store/index.js +3 -3
  125. package/apps/runtime/dist/store/shared-lists.js +1 -1
  126. package/apps/runtime/dist/texts.js +109 -1
  127. package/apps/runtime/dist/tools/browser.js +48 -0
  128. package/apps/runtime/dist/tools/connector.js +3 -2
  129. package/apps/runtime/dist/tools/index.js +1 -1
  130. package/apps/runtime/dist/tools/plugin.js +2 -2
  131. package/apps/runtime/dist/tools/project.js +1 -1
  132. package/apps/runtime/dist/tools/store.js +20 -3
  133. package/apps/runtime/dist/widgets/bundle.js +1 -1
  134. package/apps/runtime/dist/widgets/step.js +3 -3
  135. package/apps/web/dist/assets/AboutDialog-CB0EwGxP.js +1 -0
  136. package/apps/web/dist/assets/{ChangelogDialog-CZrd-MgC.js → ChangelogDialog-BQRBkiVD.js} +1 -1
  137. package/apps/web/dist/assets/ChatView-BLZkLlHi.js +10 -0
  138. package/apps/web/dist/assets/EditorPage-YawfYRAL.js +4 -0
  139. package/apps/web/dist/assets/{FlowPreview-oX_Emm7u.js → FlowPreview-B0xF8e3r.js} +1 -1
  140. package/apps/web/dist/assets/{Harness-DiB8CBdY.js → Harness-snRbALGd.js} +2 -2
  141. package/apps/web/dist/assets/NewWizardChannels-BGzp9z0m.js +1 -0
  142. package/apps/web/dist/assets/{NewWizardPage-C2Oh2sMM.js → NewWizardPage-cOHfwcnA.js} +2 -2
  143. package/apps/web/dist/assets/OnboardingPage-jB3ChKi3.js +1 -0
  144. package/apps/web/dist/assets/ProjectPage-hRCBquNb.js +1 -0
  145. package/apps/web/dist/assets/PublicRunner-D_ZkOyRV.js +1 -0
  146. package/apps/web/dist/assets/{ReadOnly-CD5YWvrW.js → ReadOnly-Db_odT6Y.js} +1 -1
  147. package/apps/web/dist/assets/RunDrawer-B6AQw90D.js +4 -0
  148. package/apps/web/dist/assets/RunnerView-DHUkvi_G.js +1 -0
  149. package/apps/web/dist/assets/SettingsPage-DleMaLz8.js +2 -0
  150. package/apps/web/dist/assets/SetupPage-DTvVJR1U.js +1 -0
  151. package/apps/web/dist/assets/{SharePage-B6u9kS12.js → SharePage-Bl-rfCji.js} +1 -1
  152. package/apps/web/dist/assets/changelog-BcW79fHm.js +1 -0
  153. package/apps/web/dist/assets/esm-Bji0ThaK.js +7 -0
  154. package/apps/web/dist/assets/index-CQKA-z2z.js +14 -0
  155. package/apps/web/dist/assets/index-Cnziz-H-.css +1 -0
  156. package/apps/web/dist/assets/oss-credits-BjwxLtU4.js +1 -0
  157. package/apps/web/dist/assets/{phone-BjmhIKuT.js → phone-DwAf8S3l.js} +1 -1
  158. package/apps/web/dist/assets/settings-menu-B1ND1GF3.js +1 -0
  159. package/apps/web/dist/assets/ui-Cdv3QUOd.js +137 -0
  160. package/apps/web/dist/assets/{upload-JX9BcMTq.js → upload-DCMZI6pp.js} +1 -1
  161. package/apps/web/dist/assets/{wrench-BSxnPs2_.js → wrench-BRYtnxti.js} +1 -1
  162. package/apps/web/dist/index.html +3 -3
  163. package/apps/web/dist/mcp/flow.html +53 -53
  164. package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/definition.d.ts +22 -0
  165. package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/definition.js +26 -0
  166. package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/run.d.ts +6 -0
  167. package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/run.js +2 -0
  168. package/node_modules/@engenty/wizards-shared/dist/sharing.d.ts +135 -0
  169. package/node_modules/@engenty/wizards-shared/dist/sharing.js +11 -0
  170. package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/store.d.ts +8 -0
  171. package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/package.json +1 -1
  172. package/package.json +4 -3
  173. package/plugin/.claude-plugin/plugin.json +1 -1
  174. package/apps/runtime/dist/docs/dev/wizard-format.md +0 -125
  175. package/apps/web/dist/assets/AboutDialog-CPRAlD2H.js +0 -1
  176. package/apps/web/dist/assets/ChatView-DVeERQdi.js +0 -10
  177. package/apps/web/dist/assets/EditorPage-DhUoKcss.js +0 -4
  178. package/apps/web/dist/assets/NewWizardChannels-Ba3XGpro.js +0 -1
  179. package/apps/web/dist/assets/OnboardingPage-D_4ShWrL.js +0 -1
  180. package/apps/web/dist/assets/ProjectPage-C58rq50b.js +0 -1
  181. package/apps/web/dist/assets/PublicRunner-CE0ohzyd.js +0 -1
  182. package/apps/web/dist/assets/RunDrawer-Cd8-qHV7.js +0 -4
  183. package/apps/web/dist/assets/RunnerView-BW1h4x63.js +0 -1
  184. package/apps/web/dist/assets/SettingsPage-ChYLv-MG.js +0 -1
  185. package/apps/web/dist/assets/SetupPage-hX7deF0g.js +0 -1
  186. package/apps/web/dist/assets/changelog-Dn9LT4MS.js +0 -1
  187. package/apps/web/dist/assets/esm-C-ZWeuhU.js +0 -7
  188. package/apps/web/dist/assets/index-4jH2mkp7.js +0 -14
  189. package/apps/web/dist/assets/index-BwW652E-.css +0 -1
  190. package/apps/web/dist/assets/oss-credits-Bc05Qv5H.js +0 -1
  191. package/apps/web/dist/assets/settings-menu-Dpkp3f56.js +0 -1
  192. package/apps/web/dist/assets/ui-DMmT-cSO.js +0 -137
  193. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/assistant.d.ts +0 -0
  194. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/assistant.js +0 -0
  195. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/changes.d.ts +0 -0
  196. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/changes.js +0 -0
  197. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/claude-plugin.d.ts +0 -0
  198. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/claude-plugin.js +0 -0
  199. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/connectors.d.ts +0 -0
  200. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/connectors.js +0 -0
  201. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/decision.d.ts +0 -0
  202. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/decision.js +0 -0
  203. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/columns-format.d.ts +0 -0
  204. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/columns-format.js +0 -0
  205. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/columns-value.d.ts +0 -0
  206. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/columns-value.js +0 -0
  207. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/columns.d.ts +0 -0
  208. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/columns.js +0 -0
  209. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/index.d.ts +0 -0
  210. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/index.js +0 -0
  211. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/search-index/catalog-lexical.d.ts +0 -0
  212. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/search-index/catalog-lexical.js +0 -0
  213. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/search-index/catalog-rank.d.ts +0 -0
  214. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/search-index/catalog-rank.js +0 -0
  215. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/feature-flags.d.ts +0 -0
  216. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/feature-flags.js +0 -0
  217. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/features.d.ts +0 -0
  218. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/features.js +0 -0
  219. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/fit.d.ts +0 -0
  220. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/fit.js +0 -0
  221. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/json-schema.d.ts +0 -0
  222. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/json-schema.js +0 -0
  223. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/knowledge.d.ts +0 -0
  224. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/knowledge.js +0 -0
  225. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/marketplace-entry.d.ts +0 -0
  226. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/marketplace-entry.js +0 -0
  227. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/marketplace-search.d.ts +0 -0
  228. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/marketplace-search.js +0 -0
  229. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/marketplace.d.ts +0 -0
  230. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/marketplace.js +0 -0
  231. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/merge.d.ts +0 -0
  232. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/merge.js +0 -0
  233. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/numbers.d.ts +0 -0
  234. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/numbers.js +0 -0
  235. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/projects.d.ts +0 -0
  236. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/projects.js +0 -0
  237. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/providers.d.ts +0 -0
  238. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/providers.js +0 -0
  239. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/runner-texts.d.ts +0 -0
  240. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/runner-texts.js +0 -0
  241. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/runners.d.ts +0 -0
  242. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/runners.js +0 -0
  243. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/shape.d.ts +0 -0
  244. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/shape.js +0 -0
  245. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/space-data.d.ts +0 -0
  246. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/space-data.js +0 -0
  247. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/store.js +0 -0
  248. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/surface.d.ts +0 -0
  249. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/surface.js +0 -0
  250. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/texts.d.ts +0 -0
  251. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/texts.js +0 -0
  252. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/translation.d.ts +0 -0
  253. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/translation.js +0 -0
  254. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/wizard-package.d.ts +0 -0
  255. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/wizard-package.js +0 -0
  256. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/workspace.d.ts +0 -0
  257. /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/workspace.js +0 -0
@@ -0,0 +1,147 @@
1
+ ---
2
+ title: The .wizard file
3
+ description: The zip a wizard travels in, its folders and manifest, how to make one by hand, and what the import does with it.
4
+ version: 0.7.10
5
+ ---
6
+
7
+ A `.wizard` file is a zip with the wizard’s definition and its workspace. The studio exports
8
+ one, imports one back, and `wizards validate` checks one. Its media type is
9
+ `application/vnd.engenty.wizard+zip`. The file is named after the wizard’s title, such as
10
+ `create-an-invoice.wizard`.
11
+
12
+ ## What is in the zip
13
+
14
+ ```text
15
+ create-an-invoice.wizard
16
+ ├── wizard.json the manifest, with the definition in it
17
+ └── files/ the wizard's workspace
18
+ ├── invoice/
19
+ │ ├── index.html a widget step's entry
20
+ │ ├── app.js
21
+ │ └── sample.json its example data
22
+ ├── lib/
23
+ │ └── chart.min.js libraries the widgets load
24
+ ├── prices.csv reference data AI steps read
25
+ ├── kits/explainer.zip a film step's style kit
26
+ ├── skills/brand/SKILL.md a skill package a film step reads
27
+ └── knowledge/ only in a website package
28
+ └── services/pricing.md
29
+ ```
30
+
31
+ | Path | What it holds |
32
+ |---|---|
33
+ | `wizard.json` | The manifest. See [The manifest](#the-manifest) |
34
+ | `files/` | The workspace: every file the wizard’s steps name by path |
35
+ | `files/knowledge/` | The space’s Knowledge pages, only when the export was asked for them. See [Knowledge](#knowledge) |
36
+
37
+ Only `wizard.json` is required. A wizard without widgets, kits or files has an empty `files/`
38
+ or none.
39
+
40
+ ## The workspace
41
+
42
+ The paths under `files/` are the paths the definition uses. A widget step with
43
+ `"entry": "invoice/index.html"` reads `files/invoice/index.html`, and a film step with
44
+ `"kit": "kits/explainer.zip"` reads `files/kits/explainer.zip`. Apart from `knowledge/`, no
45
+ folder has a fixed meaning. The ones above are what the studio and its assistant write.
46
+
47
+ | Limit | Value |
48
+ |---|---|
49
+ | Files | 200 |
50
+ | One file | 5 MB |
51
+ | All files | 25 MB |
52
+ | The whole zip | 30 MB, with room for the manifest |
53
+ | A path | 200 characters: letters, digits, `_`, `-` and `.`, with `/` between folders |
54
+
55
+ A path starts with a letter, a digit, `_` or `-`. So hidden files such as `.env` and paths with
56
+ `..` are not allowed. The import refuses a file that breaks a limit, and names it.
57
+
58
+ ## The manifest
59
+
60
+ ```json
61
+ {
62
+ "$schema": "https://engenty.ai/schema/v1/wizard-package.json",
63
+ "format": "engenty-wizard",
64
+ "version": 1,
65
+ "exportedAt": "2026-10-18T09:12:00.000Z",
66
+ "definition": { "version": 1, "title": "Create an invoice", "steps": [ … ] },
67
+ "connectors": [
68
+ { "id": "billomat", "name": "Billomat", "domain": "billomat.com", "sourceKind": "openapi" }
69
+ ],
70
+ "mcpServers": [{ "id": "notion", "name": "Notion" }],
71
+ "knowledge": { "pages": 12, "truncated": false }
72
+ }
73
+ ```
74
+
75
+ | Key | What it holds |
76
+ |---|---|
77
+ | `$schema` | The JSON Schema for editors. The app does not read it |
78
+ | `format` | Always `engenty-wizard`. It tells a manifest from a bare definition |
79
+ | `version` | The manifest’s version, `1` |
80
+ | `exportedAt` | When the file was made |
81
+ | `definition` | The wizard. See [The wizard format](./index.md) |
82
+ | `connectors` | Imported connectors the wizard’s connections name: `id`, `name`, `domain` and `sourceKind` (`openapi` or `mcp`), at most 50 |
83
+ | `mcpServers` | The space’s connected systems its agent steps name: `id` and `name`, at most 10 |
84
+ | `knowledge` | Only with Knowledge: how many pages, and whether the cap left some out |
85
+
86
+ `connectors` and `mcpServers` hold names, never addresses, headers or credentials. They let the
87
+ import tell you what the space you import into still needs.
88
+
89
+ ## Knowledge
90
+
91
+ A website runs a wizard without its space. For that, the share dialog’s website package has
92
+ “Take the knowledge along”. The space’s Knowledge pages then come along as Markdown, one file per
93
+ page, at their path under `files/knowledge/`:
94
+
95
+ ```markdown
96
+ ---
97
+ title: "Pricing"
98
+ path: pages/services/pricing
99
+ ---
100
+
101
+ Our hourly rate is …
102
+ ```
103
+
104
+ A page is cut after 60,000 characters. The pages stop at about 2 MB in all, and `truncated` in the
105
+ manifest then says so.
106
+
107
+ ## What stays out
108
+
109
+ A `.wizard` file holds the wizard, not what it collected or what the space owns:
110
+
111
+ - runs, results and uploads
112
+ - the rows of its lists and the accounts people connected
113
+ - the space’s brand, facts and Knowledge, unless Knowledge was asked for
114
+ - the addresses and credentials of connectors and connected systems
115
+ - translations and the wizard’s published versions
116
+
117
+ The studio’s export holds the draft. The website package and the export over the API hold the
118
+ published version.
119
+
120
+ ## Making one by hand
121
+
122
+ Zip a folder that holds `wizard.json` and `files/`:
123
+
124
+ ```bash
125
+ cd create-an-invoice && zip -r ../create-an-invoice.wizard wizard.json files
126
+ ```
127
+
128
+ The zip may also hold that folder itself, as a zip made in the Finder does. The import takes the
129
+ `wizard.json` closest to the top, and the `files/` beside it. It leaves out folders, `__MACOSX/`
130
+ and `.DS_Store`.
131
+
132
+ `wizards validate` reads the unpacked folder as it is, without zipping it. See
133
+ [JSON Schema and validation](./validate.md).
134
+
135
+ ## What the import does
136
+
137
+ The import takes a `.wizard` file, a `wizard.json` on its own, or a definition on its own. A JSON
138
+ file without `"format": "engenty-wizard"` is read as a definition.
139
+
140
+ 1. It checks the zip against the limits before it unpacks anything.
141
+ 2. It checks the definition and that every path it names is in the workspace.
142
+ 3. It makes a new wizard in the space: a draft, not published, with the workspace’s files.
143
+ 4. It tells you which connectors and connected systems the space still lacks.
144
+
145
+ What belongs to the space is checked only here, because only the space has it: its connectors
146
+ and their actions, its connected systems and its plugins’ tools. A manifest of a newer version
147
+ is refused, with a note that the file comes from a newer version of engenty wizards.
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  title: Build a wizard
3
3
  description: Describe what the wizard should do, or start from a template. Then change it in the chat or step by step.
4
- version: 0.5.0
4
+ version: 0.8.0
5
5
  ---
6
6
 
7
7
  ## Start one
8
8
 
9
- “New wizard” on the list of your wizards, or in the sidebar, opens the page “What should your
9
+ “New wizard” on the list of your wizards, or in the space’s menu, opens the page “What should your
10
10
  wizard do?”. It gives you three ways in:
11
11
 
12
12
  | Way | How |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Run a wizard
3
3
  description: What you see when you open a wizard's link, on a computer or a phone.
4
- version: 0.5.0
4
+ version: 0.7.11
5
5
  ---
6
6
 
7
7
  ## From the link to the result
@@ -90,9 +90,26 @@ everything” deletes it. Anything nobody used for 400 days is deleted by itself
90
90
 
91
91
  ## Share a result
92
92
 
93
- “Share” on the result page makes a link to the result. You can copy it, send it by email or hand
94
- it to another app. When you ran the wizard over its link, the result and its link are kept for 7
95
- days. “Withdraw link” ends the link earlier.
93
+ “Share” on the result page opens the ways to pass the result on. “Link” makes a link to the
94
+ result: copy it, send it by email or hand it to another app. When you ran the wizard over its
95
+ link, the result and its link are kept for 7 days. “Withdraw link” ends the link earlier.
96
+
97
+ The other tiles send or publish the result itself. Each one walks you through its steps: the
98
+ account it sends with (“Account”), what goes along and where it goes (“What & where”), then
99
+ “Send”. What happens shows in the same window, and “Recent” lists what was sent before. An
100
+ account you connect is kept for your next run, encrypted. “What this wizard remembers” lists it.
101
+
102
+ | Tile | Does | Needs |
103
+ |---|---|---|
104
+ | “Email” | Sends the files you pick as attachments to one or more addresses | Your mailbox: Gmail, Outlook or any mailbox over SMTP. Where the server sends from an address of its own, no account |
105
+ | Google Drive, OneDrive, S3 | Saves the files into a folder, which is created if it doesn’t exist yet | The account |
106
+ | “Slack” | Posts your message with the link to the result in a channel | Your Slack account |
107
+ | A connected service | An AI agent does what you describe in the service, with its actions, and asks before every change | The account, and a few minutes |
108
+ | “Website” | The wizard opens the site in its browser, and an AI agent posts there what you describe. You sign in yourself, and it asks for your leave before anything goes public | A few minutes. LinkedIn, X, Facebook, Instagram and Meta Ads are ready as presets |
109
+
110
+ Which tiles a result offers is the wizard’s choice, see [The result](./steps.md#the-result).
111
+ Without one, every tile that needs no AI agent is there for everyone with the link. The agent
112
+ tiles are there for the wizard’s owner in the studio, as they spend the wizard’s credits.
96
113
 
97
114
  Media made by a model carries an “AI-generated” label. Whoever publishes it has to label it as
98
115
  AI-generated. The file already carries the marking.
@@ -1,29 +1,33 @@
1
1
  ---
2
2
  title: Space
3
3
  description: What your wizards share and produce – who you are, what they look things up in, and the results of their runs.
4
- version: 0.5.0
4
+ version: 0.8.0
5
5
  ---
6
6
 
7
7
  Your space holds what all your wizards share, and what they produce. Every AI step knows it, so a
8
8
  wizard never has to ask for your company’s name or address.
9
9
 
10
- You open it in two ways:
10
+ The app bar holds its places, below the space’s tile in its corner:
11
11
 
12
- - The house in the app bar, after the space’s tile, opens the space’s page.
13
- - The button left of the space’s name in the top bar (“Space menu”) opens the sidebar. It lists “Wizards”,
14
- “New wizard” and, under “Space”, the space’s four parts. On a narrow window the sidebar stays
15
- closed.
12
+ - The house opens the space’s wizards: the list and “New wizard”.
13
+ - The layers below it open the space’s page.
14
+ - The tray below them opens the space’s results.
16
15
 
17
- The menu on the left shows the space’s four parts. A part opens its own sections, and the arrow
18
- at the top leads back. While the sidebar is open, the menu stands in it. On a phone, the parts,
19
- a part’s sections and the page take turns.
16
+ On a phone the bar floats along the bottom with the house, the layers and “More” (⋯), which
17
+ holds the results, the settings and the rest. The space’s tile and name sit at the top left, your
18
+ picture at the top right.
19
+
20
+ On the space’s page, the menu on the left shows its three parts. A part opens its own sections,
21
+ and the arrow at the top leads back. On a phone, the parts, a part’s sections and the page take
22
+ turns.
23
+
24
+ Results have no menu: the list above them picks one wizard or all of them.
20
25
 
21
26
  | Part | Sections | Used for |
22
27
  |---|---|---|
23
28
  | Info & brand | Basics, Facts, Logos, Colours, Brand assets | Who you are and how you look |
24
29
  | Knowledge | All, then each category, then the sections plugins add | What every AI step looks things up in |
25
30
  | Data | All data, General, then each wizard | Tables and pages the wizards keep |
26
- | Results | All results, then each wizard | The runs that reached their result |
27
31
 
28
32
  ## Info & brand
29
33
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Steps
3
3
  description: What a wizard is made of – pages, AI steps, generated media, widgets, reviews and the result.
4
- version: 0.5.0
4
+ version: 0.7.11
5
5
  ---
6
6
 
7
7
  A wizard runs its steps from top to bottom. The last step is always the result.
@@ -179,6 +179,31 @@ Each entry of the result page names a step and the formats the person can downlo
179
179
  | AI step, collected files | ZIP |
180
180
  | List | Excel, CSV, JSON, Markdown; ZIP with the files its rows name |
181
181
 
182
+ Under “Send & publish” the step says where a person can send or publish the result with one
183
+ button, besides the link and the downloads (see [Share a result](./run.md#share-a-result)). Each
184
+ target is a row with a switch and its state: “Ready”, “AI agent · only you”, or “Not set up”.
185
+ A sentence above the rows says what visitors get and what only you get.
186
+
187
+ | Label | Means |
188
+ |---|---|
189
+ | “Default” | Every target that is set up and needs no AI agent. Targets with an agent only you get |
190
+ | “Own list” | You switched a target off, prefilled one or added one: only the targets switched on, in this order. An agent target then runs for everyone with the link, on your credits |
191
+ | “Off” | Every target switched off: the result has only the link and the downloads |
192
+
193
+ “Reset” brings the default back. Targets that are not set up on this server are listed under
194
+ “not set up”, with “Set up” to the connectors.
195
+
196
+ The arrow on a row opens its form: the name on the result page and what each field starts with.
197
+ “Insert” puts a placeholder where the cursor is: an answer, a written result or the brand name.
198
+ In the wizard file they read `{{email}}`, `{{steps.offer}}` and `{{brand.name}}`.
199
+
200
+ While the result step is chosen, the studio shows its result page beside the flow, filled from
201
+ the last test run. “Visitor” and “You” switch between what each of them gets. A target opens to
202
+ its form as the visitor sees it, with the test run’s answers in it; nothing is sent from there.
203
+ On a tablet or a phone, “Result page” switches the view, and “See the result page” opens it from
204
+ the step. The result node on the flow shows the targets too: filled for visitors, a ring for
205
+ you only.
206
+
182
207
  ## Branches
183
208
 
184
209
  A step can send the run somewhere else when a condition holds: a field is or is not a value, is
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Test and share
3
3
  description: Try the wizard, publish it, and hand out its link or put it on a website.
4
- version: 0.5.0
4
+ version: 0.7.11
5
5
  ---
6
6
 
7
7
  ## Test
@@ -216,7 +216,8 @@ On WordPress the plugin writes this code for you, and its results show the page:
216
216
 
217
217
  On the result page, a person can share what they got as a link. The result of a run over the
218
218
  wizard’s link, and the link to it, are deleted after 7 days. The person can withdraw the link
219
- earlier.
219
+ earlier. “Share” also sends the result on – by email, into a cloud folder, to Slack or onto a
220
+ website: see [Share a result](./run.md#share-a-result).
220
221
 
221
222
  ## Move a wizard
222
223
 
@@ -2,7 +2,7 @@ import { createHash } from "node:crypto";
2
2
  import { existsSync, mkdirSync } from "node:fs";
3
3
  import { readFile, writeFile } from "node:fs/promises";
4
4
  import { join } from "node:path";
5
- import { note } from "@engenty-wizards/shared/run";
5
+ import { note } from "@engenty/wizards-shared/run";
6
6
  import { generateText, Output } from "ai";
7
7
  import PostalMime from "postal-mime";
8
8
  import { z } from "zod";
@@ -1,4 +1,4 @@
1
- import { decisionSchema, readObject, readSystemOne, } from "@engenty-wizards/shared/decision";
1
+ import { decisionSchema, readObject, readSystemOne, } from "@engenty/wizards-shared/decision";
2
2
  import { generateText, Output } from "ai";
3
3
  import { costOf, systemOneAccess, textModel } from "../models.js";
4
4
  export class DecisionError extends Error {
@@ -1,6 +1,6 @@
1
1
  import { AsyncResource } from "node:async_hooks";
2
2
  import { EventEmitter } from "node:events";
3
- import { noteText } from "@engenty-wizards/shared/run";
3
+ import { noteText } from "@engenty/wizards-shared/run";
4
4
  import { and, desc, eq, gt, sql } from "drizzle-orm";
5
5
  import { db, schema } from "../db/client.js";
6
6
  const bus = new EventEmitter();
@@ -1,6 +1,6 @@
1
- import { isDecidedField, isLang, isLocationValue, MAX_FILES, offeredSlot, shownFields, } from "@engenty-wizards/shared/definition";
2
- import { readNumber } from "@engenty-wizards/shared/numbers";
3
- import { note, saidText } from "@engenty-wizards/shared/run";
1
+ import { isDecidedField, isLang, isLocationValue, MAX_FILES, offeredSlot, shownFields, } from "@engenty/wizards-shared/definition";
2
+ import { readNumber } from "@engenty/wizards-shared/numbers";
3
+ import { note, saidText } from "@engenty/wizards-shared/run";
4
4
  /** The field errors in a language, for whoever reads them. */
5
5
  export function fieldErrorsIn(errors, lang) {
6
6
  return errors.map((e) => ({ field: e.field, message: saidText(e.message, lang) }));
@@ -1,4 +1,4 @@
1
- import { allFields, isAudioValue } from "@engenty-wizards/shared/definition";
1
+ import { allFields, isAudioValue } from "@engenty/wizards-shared/definition";
2
2
  import { extFor, loadAsset } from "../files/storage.js";
3
3
  import { listenPieces, transcribeAudio } from "../media/transcribe.js";
4
4
  /**
@@ -1,6 +1,6 @@
1
- import { conditionMatches, conditionsOf, isDecidedField, isDecisionStep, isOtherwise, MODEL_CLASSES, } from "@engenty-wizards/shared/definition";
2
- import { closedChoicesFor, openValue, otherwiseIndex, unavoidableFrom, unavoidableSteps, } from "@engenty-wizards/shared/fit";
3
- import { note, saidText } from "@engenty-wizards/shared/run";
1
+ import { conditionMatches, conditionsOf, isDecidedField, isDecisionStep, isOtherwise, MODEL_CLASSES, } from "@engenty/wizards-shared/definition";
2
+ import { closedChoicesFor, openValue, otherwiseIndex, unavoidableFrom, unavoidableSteps, } from "@engenty/wizards-shared/fit";
3
+ import { note, saidText } from "@engenty/wizards-shared/run";
4
4
  import { classProblem, filmClient } from "../models.js";
5
5
  // The steps every run passes through, and the choices that lead around a missing model, are
6
6
  // pure and shared (packages/shared/src/fit.ts): the standalone check uses the same.
@@ -267,16 +267,31 @@ export async function missingModelsSaid(def) {
267
267
  }
268
268
  return missing;
269
269
  }
270
- /** The message a run that cannot start gives, naming the steps and why. */
270
+ /**
271
+ * The message a run that cannot start gives, naming the steps and why. Classes with the same
272
+ * problem (a step that thinks and writes on one client that is not installed) say it once, and
273
+ * name each of their steps once.
274
+ */
271
275
  export function blockingMessage(missing) {
272
- const blocking = missing.filter((m) => m.blocking);
273
- if (!blocking.length) {
276
+ const byProblem = new Map();
277
+ for (const m of missing) {
278
+ if (!m.blocking) {
279
+ continue;
280
+ }
281
+ const key = JSON.stringify(m.problem);
282
+ const entry = byProblem.get(key) ?? { problem: m.problem, steps: new Map() };
283
+ for (const s of m.steps) {
284
+ entry.steps.set(s.id, s.title);
285
+ }
286
+ byProblem.set(key, entry);
287
+ }
288
+ if (!byProblem.size) {
274
289
  return null;
275
290
  }
276
- return blocking
277
- .map((m) => note("blockedSteps", {
278
- steps: m.steps.map((s) => note("quoted", { text: s.title })),
279
- problem: m.problem,
291
+ return [...byProblem.values()]
292
+ .map(({ problem, steps }) => note("blockedSteps", {
293
+ steps: [...steps.values()].map((text) => note("quoted", { text })),
294
+ problem,
280
295
  }))
281
296
  .reduce((first, second) => note("joined", { first, second }));
282
297
  }
@@ -1,9 +1,9 @@
1
- import { marginOf, } from "@engenty-wizards/shared/decision";
2
- import { branchValues, cardsFromData, conditionsOf, dataRef, followRules, formatsFor, isDecidedField, LIST_FORMATS, listRef, loopKey, MAX_SHOWN_FIELDS, optionsFromData, otherwiseOf, pageNeeds, textLang, whenHolds, wizardLang, } from "@engenty-wizards/shared/definition";
3
- import { note, saidText, } from "@engenty-wizards/shared/run";
4
- import { CONVERSATION_RUNNERS, DEFAULT_RUNNER_SETTINGS } from "@engenty-wizards/shared/runners";
5
- import { fitData } from "@engenty-wizards/shared/shape";
6
- import { machineTranslated, translateDefinition } from "@engenty-wizards/shared/translation";
1
+ import { marginOf, } from "@engenty/wizards-shared/decision";
2
+ import { branchValues, cardsFromData, conditionsOf, dataRef, followRules, formatsFor, isDecidedField, LIST_FORMATS, listRef, loopKey, MAX_SHOWN_FIELDS, optionsFromData, otherwiseOf, pageNeeds, textLang, whenHolds, wizardLang, } from "@engenty/wizards-shared/definition";
3
+ import { note, saidText, } from "@engenty/wizards-shared/run";
4
+ import { CONVERSATION_RUNNERS, DEFAULT_RUNNER_SETTINGS } from "@engenty/wizards-shared/runners";
5
+ import { fitData } from "@engenty/wizards-shared/shape";
6
+ import { machineTranslated, translateDefinition } from "@engenty/wizards-shared/translation";
7
7
  import { eq } from "drizzle-orm";
8
8
  import { nanoid } from "nanoid";
9
9
  import { connectionViews } from "../connectors/index.js";
@@ -20,7 +20,8 @@ import { runEnded } from "../plugins/events.js";
20
20
  import { projectFiles } from "../services/project-files.js";
21
21
  import { projectProfile } from "../services/projects.js";
22
22
  import { storedTranslation } from "../services/translations.js";
23
- import { listRows, scopeOf } from "../store/index.js";
23
+ import { latestShareJob } from "../sharing/state.js";
24
+ import { listRows, listSecrets, scopeOf } from "../store/index.js";
24
25
  import { claimRun, disownRuns, heartbeatRuns, indexRun, restRun, waitingRuns, wakeRun, } from "../tenants/control.js";
25
26
  import { currentTenant } from "../tenants/tenant.js";
26
27
  import { askPerson, clearStaleAsk } from "./asks.js";
@@ -77,7 +78,7 @@ export async function projectIdOf(run) {
77
78
  const w = await db.query.wizard.findFirst({ where: eq(schema.wizard.id, run.wizardId) });
78
79
  return w?.projectId ?? "";
79
80
  }
80
- async function loadProject(run) {
81
+ export async function loadProject(run) {
81
82
  const w = await db.query.wizard.findFirst({ where: eq(schema.wizard.id, run.wizardId) });
82
83
  const p = w && (await db.query.project.findFirst({ where: eq(schema.project.id, w.projectId) }));
83
84
  if (!p) {
@@ -340,11 +341,15 @@ async function storedLists(run) {
340
341
  }
341
342
  return out;
342
343
  }
343
- async function makeContext(run, project, state, signal) {
344
+ /**
345
+ * What a step works with. A share job works with the same — the run's browser, store and
346
+ * answers — under a step id, progress lines and questions of its own.
347
+ */
348
+ export async function makeContext(run, project, state, signal, own = {}) {
344
349
  const store = scopeOf(run);
345
350
  const resources = resourcesFor(run.id);
346
351
  resources.bind(store);
347
- const stepId = run.cursor ?? "";
352
+ const stepId = own.stepId ?? run.cursor ?? "";
348
353
  return {
349
354
  runId: run.id,
350
355
  tenantId: run.tenantId,
@@ -365,14 +370,15 @@ async function makeContext(run, project, state, signal) {
365
370
  projectFiles: (await projectFiles(project.id)).filter((f) => f.status === "ready"),
366
371
  signal,
367
372
  resources,
368
- ask: (ask) => run.unattended ? Promise.resolve(null) : askPerson(run.id, { ...ask, stepId }, signal),
369
- emit: (type, message, asset) => emitEvent(run.id, run.cursor, type, message, asset),
373
+ ask: own.ask ??
374
+ ((ask) => run.unattended ? Promise.resolve(null) : askPerson(run.id, { ...ask, stepId }, signal)),
375
+ emit: own.emit ?? ((type, message, asset) => emitEvent(run.id, run.cursor, type, message, asset)),
370
376
  call: { runId: run.id, stepId },
371
377
  chargeUsd: (usd) => addLocalCost(run.id, stepId, usd),
372
378
  saveAsset: (input) => saveAsset({
373
379
  ...input,
374
380
  runId: run.id,
375
- stepId: input.stepId ?? run.cursor,
381
+ stepId: input.stepId ?? own.stepId ?? run.cursor,
376
382
  }),
377
383
  };
378
384
  }
@@ -964,8 +970,11 @@ export async function runView(run, brand) {
964
970
  connections: step?.type === "page" && step.fields.some((f) => f.kind === "connection")
965
971
  ? await connectionViews(def.connections ?? [], scopeOf(run), await projectIdOf(run), textLang(wizardLang(def)))
966
972
  : [],
967
- keeps: Boolean(def.lists?.length || def.connections?.length),
973
+ keeps: Boolean(def.lists?.length || def.connections?.length) ||
974
+ // An account connected for sharing is kept too, and can be deleted the same way.
975
+ (run.status === "done" && (await listSecrets(scopeOf(run))).length > 0),
968
976
  shareUrl: run.shareToken ? `${env.publicUrl}/s/${run.shareToken}` : null,
969
977
  expiresAt: run.expiresAt?.toISOString() ?? null,
978
+ shareJob: run.status === "done" ? await latestShareJob(run.id) : null,
970
979
  };
971
980
  }
@@ -1,9 +1,9 @@
1
- import { pOf } from "@engenty-wizards/shared/decision";
2
- import { allFields, dataRef, isDecisionStep, langNameEn, localeOf, stepShape, templateRefs, wizardLang, } from "@engenty-wizards/shared/definition";
3
- import { mainLogo, ruleLines, runTheme } from "@engenty-wizards/shared/projects";
4
- import { note as runNote } from "@engenty-wizards/shared/run";
5
- import { fitData, labelOf, recordsOf, shapeJsonSchema, shapeLines, shapeZod, titleKey, } from "@engenty-wizards/shared/shape";
6
- import { SURFACE_GUIDE, validateSurface, } from "@engenty-wizards/shared/surface";
1
+ import { pOf } from "@engenty/wizards-shared/decision";
2
+ import { allFields, dataRef, isDecisionStep, langNameEn, localeOf, stepShape, templateRefs, wizardLang, } from "@engenty/wizards-shared/definition";
3
+ import { mainLogo, ruleLines, runTheme } from "@engenty/wizards-shared/projects";
4
+ import { note as runNote } from "@engenty/wizards-shared/run";
5
+ import { fitData, labelOf, recordsOf, shapeJsonSchema, shapeLines, shapeZod, titleKey, } from "@engenty/wizards-shared/shape";
6
+ import { SURFACE_GUIDE, validateSurface, } from "@engenty/wizards-shared/surface";
7
7
  import { Agent } from "@mastra/core/agent";
8
8
  import { generateText, jsonSchema, Output, parsePartialJson } from "ai";
9
9
  import { extFor, loadAsset, loadAssetText } from "../files/storage.js";
@@ -1,6 +1,6 @@
1
- import { assembleSurface, dataRef, listRef, } from "@engenty-wizards/shared/definition";
2
- import { note } from "@engenty-wizards/shared/run";
3
- import { validateSurface } from "@engenty-wizards/shared/surface";
1
+ import { assembleSurface, dataRef, listRef, } from "@engenty/wizards-shared/definition";
2
+ import { note } from "@engenty/wizards-shared/run";
3
+ import { validateSurface } from "@engenty/wizards-shared/surface";
4
4
  import { decide } from "./decide.js";
5
5
  import { answersAsText, resolveRef } from "./template.js";
6
6
  import { StepError } from "./types.js";
@@ -1,7 +1,7 @@
1
- import { allFields, isAudioValue, isLocationValue, itemsTotals, localeOf, locationText, wizardLang, } from "@engenty-wizards/shared/definition";
2
- import { formatMoney } from "@engenty-wizards/shared/numbers";
3
- import { fontLicenseWords, gradientCss, textStyleLine, } from "@engenty-wizards/shared/projects";
4
- import { listAsMarkdown } from "@engenty-wizards/shared/store";
1
+ import { allFields, isAudioValue, isLocationValue, itemsTotals, localeOf, locationText, wizardLang, } from "@engenty/wizards-shared/definition";
2
+ import { formatMoney } from "@engenty/wizards-shared/numbers";
3
+ import { fontLicenseWords, gradientCss, textStyleLine, } from "@engenty/wizards-shared/projects";
4
+ import { listAsMarkdown } from "@engenty/wizards-shared/store";
5
5
  const TEMPLATE_RE = /\{\{\s*([^}]+?)\s*\}\}/g;
6
6
  /** Line items as a Markdown table with their totals — what a model needs to write a document. */
7
7
  export function itemsAsMarkdown(field, value, values, lang = "en") {
@@ -212,6 +212,11 @@ export const env = {
212
212
  accessKeyId: str("S3_ACCESS_KEY_ID"),
213
213
  secretAccessKey: str("S3_SECRET_ACCESS_KEY"),
214
214
  },
215
+ /**
216
+ * An address of the server's own to send results from: with it, sharing by e-mail needs no
217
+ * mailbox of the person. `smtps://user:password@host:465`; empty = people send as themselves.
218
+ */
219
+ mail: { smtpUrl: str("SMTP_URL"), from: str("MAIL_FROM") },
215
220
  turnstile: { siteKey: str("TURNSTILE_SITE_KEY"), secret: str("TURNSTILE_SECRET_KEY") },
216
221
  /**
217
222
  * The mobile app (the apps repo engenty-wizards-apps, mobile/): a phone opens this runtime's `/w/` and `/s/` links in it.
@@ -1,6 +1,6 @@
1
1
  import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
2
2
  import { dirname, join } from "node:path";
3
- import { declaredByPlugin, defaultFeatures, FEATURES, featureOn, parseFeatures, resolveFeatures, } from "@engenty-wizards/shared/features";
3
+ import { declaredByPlugin, defaultFeatures, FEATURES, featureOn, parseFeatures, resolveFeatures, } from "@engenty/wizards-shared/features";
4
4
  import { accountOverview } from "./auth/account.js";
5
5
  import { isCheckout, layout, packageRoot } from "./cli/home.js";
6
6
  import { env } from "./env.js";
@@ -2,8 +2,8 @@ import { createHash } from "node:crypto";
2
2
  import { existsSync } from "node:fs";
3
3
  import { cp, mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
4
4
  import { dirname, join, normalize } from "node:path";
5
- import { dataRef, FILM_SIZES } from "@engenty-wizards/shared/definition";
6
- import { gradientCss, ruleLines, textStyleLine } from "@engenty-wizards/shared/projects";
5
+ import { dataRef, FILM_SIZES } from "@engenty/wizards-shared/definition";
6
+ import { gradientCss, ruleLines, textStyleLine } from "@engenty/wizards-shared/projects";
7
7
  import { unzipSync } from "fflate";
8
8
  import { logoSectionLine, renderTemplate, resolveRef } from "../engine/template.js";
9
9
  import { env } from "../env.js";
@@ -2,8 +2,8 @@ import { spawn } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
3
  import { readFile, rm, stat } from "node:fs/promises";
4
4
  import { isAbsolute, join, normalize } from "node:path";
5
- import { FILM_SIZES } from "@engenty-wizards/shared/definition";
6
- import { note as runNote } from "@engenty-wizards/shared/run";
5
+ import { FILM_SIZES } from "@engenty/wizards-shared/definition";
6
+ import { note as runNote } from "@engenty/wizards-shared/run";
7
7
  import { StepError } from "../engine/types.js";
8
8
  import { CLAUDE_BIN, claudeEnv } from "../harness/claude.js";
9
9
  import { failureOf } from "../harness/model.js";
@@ -1,6 +1,6 @@
1
1
  import { writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { resolveEnv, run } from "./env.js";
3
+ import { probeVersion, resolveEnv, run } from "./env.js";
4
4
  import { failureOf, HarnessModel, runClient, } from "./model.js";
5
5
  /**
6
6
  * Antigravity CLI: `agy` answers on the Google sign-in it cached — the Google AI subscription,
@@ -114,15 +114,7 @@ export const antigravity = {
114
114
  name: "Antigravity",
115
115
  bin: AGY_BIN,
116
116
  classes: CLASSES,
117
- async version(env) {
118
- try {
119
- const { stdout } = await run(AGY_BIN, ["--version"], { timeout: 10_000, env });
120
- return stdout.trim().split("\n").pop()?.trim() || null;
121
- }
122
- catch {
123
- return null;
124
- }
125
- },
117
+ version: (env) => probeVersion(AGY_BIN, env, (stdout) => stdout.trim().split("\n").pop()?.trim() || null),
126
118
  // No login command: the client asks for the Google sign-in when it starts without one.
127
119
  login: { args: [], interactive: true },
128
120
  model: (alias, effort) => new AntigravityModel(antigravity, alias || CLASSES.standard, effort),
@@ -2,7 +2,7 @@ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
2
2
  import { release } from "node:os";
3
3
  import { dirname, join, resolve } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
- import { langOf, SPEECH_LOCALES } from "@engenty-wizards/shared/definition";
5
+ import { langOf, SPEECH_LOCALES } from "@engenty/wizards-shared/definition";
6
6
  import { nanoid } from "nanoid";
7
7
  import { env } from "../env.js";
8
8
  import { ffmpeg, hasFfmpeg } from "../media/ffmpeg.js";