@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,32 @@
1
+ import { ownerUrl } from "../tenants/control.js";
2
+ /**
3
+ * Hands a request on to the runner holding the run — what only the process with the run's
4
+ * browser can answer. The runner serves the same routes and checks the same cookie; the caller's
5
+ * headers go along. Null: nobody holds the run, or the runner named no address (RUNNER_URL).
6
+ */
7
+ export async function fromOwner(c, runId) {
8
+ const base = await ownerUrl(runId);
9
+ if (!base) {
10
+ return null;
11
+ }
12
+ const here = new URL(c.req.url);
13
+ const headers = new Headers(c.req.raw.headers);
14
+ headers.delete("host");
15
+ headers.delete("content-length");
16
+ const method = c.req.method;
17
+ const body = method === "GET" || method === "HEAD" ? undefined : await c.req.raw.arrayBuffer();
18
+ try {
19
+ const res = await fetch(`${base}${here.pathname}${here.search}`, {
20
+ method,
21
+ headers,
22
+ body,
23
+ redirect: "manual",
24
+ signal: AbortSignal.timeout(15_000),
25
+ });
26
+ return new Response(res.body, { status: res.status, headers: res.headers });
27
+ }
28
+ catch (err) {
29
+ console.error(`[run ${runId}] the runner did not answer:`, err);
30
+ return null;
31
+ }
32
+ }
@@ -0,0 +1,90 @@
1
+ import { allFields, isAudioValue } from "@engenty-wizards/shared/definition";
2
+ import { extFor, loadAsset } from "../files/storage.js";
3
+ import { listenPieces, transcribeAudio } from "../media/transcribe.js";
4
+ /**
5
+ * Gets the person's answers ready for a step that works on its own: a voice note is listened to
6
+ * once and kept as text with the answer, and a recording or signature that is not this run's own
7
+ * upload is dropped. Runs before every automatic step; what is already done costs nothing.
8
+ */
9
+ export async function prepareInputs(ctx) {
10
+ const values = ctx.state.values;
11
+ for (const field of allFields(ctx.def)) {
12
+ const value = values[field.id];
13
+ if (field.kind === "signature" && typeof value === "string") {
14
+ const drawn = await loadAsset(value);
15
+ if (drawn?.row.runId !== ctx.runId || !drawn.row.mime.startsWith("image/")) {
16
+ delete values[field.id];
17
+ }
18
+ continue;
19
+ }
20
+ if (field.kind === "file" && field.listen) {
21
+ await listenTo(ctx, field.id, field.label, value);
22
+ continue;
23
+ }
24
+ if (field.kind !== "audio" || !isAudioValue(value)) {
25
+ continue;
26
+ }
27
+ if (value.transcript !== undefined) {
28
+ continue;
29
+ }
30
+ const found = await loadAsset(value.asset);
31
+ if (!found || found.row.runId !== ctx.runId || !/^(audio|video)\//.test(found.row.mime)) {
32
+ delete values[field.id];
33
+ continue;
34
+ }
35
+ await ctx.emit("info", { code: "listen", params: { label: field.label } });
36
+ try {
37
+ const transcript = await transcribeAudio({
38
+ bytes: new Uint8Array(found.data),
39
+ mediaType: found.row.mime,
40
+ abortSignal: ctx.signal,
41
+ call: ctx.call,
42
+ language: value.lang,
43
+ });
44
+ await ctx.chargeUsd(transcript.costUsd);
45
+ values[field.id] = { ...value, transcript: transcript.text };
46
+ }
47
+ catch (err) {
48
+ if (ctx.signal.aborted) {
49
+ throw err;
50
+ }
51
+ // The step goes on without the words; the next one tries again.
52
+ console.error(`[run ${ctx.runId}] transcribe ${field.id}`, err);
53
+ await ctx.emit("info", {
54
+ code: "listenFailed",
55
+ params: { label: field.label },
56
+ });
57
+ }
58
+ }
59
+ }
60
+ /** A recording in a file field with `listen`: written down once, piece by piece with its times. */
61
+ async function listenTo(ctx, id, label, value) {
62
+ if (ctx.state.heard?.[id]) {
63
+ return;
64
+ }
65
+ // Several recordings: the first is the one that is cut.
66
+ const first = Array.isArray(value) ? value[0] : value;
67
+ const found = typeof first === "string" && first ? await loadAsset(first) : null;
68
+ if (!found || found.row.runId !== ctx.runId || !/^(audio|video)\//.test(found.row.mime)) {
69
+ return;
70
+ }
71
+ await ctx.emit("info", { code: "listen", params: { label } });
72
+ try {
73
+ const { pieces, costUsd } = await listenPieces({
74
+ bytes: new Uint8Array(found.data),
75
+ ext: extFor(found.row.mime),
76
+ abortSignal: ctx.signal,
77
+ call: ctx.call,
78
+ });
79
+ await ctx.chargeUsd(costUsd);
80
+ ctx.state.heard = { ...ctx.state.heard, [id]: pieces };
81
+ }
82
+ catch (err) {
83
+ if (ctx.signal.aborted) {
84
+ throw err;
85
+ }
86
+ // The step goes on without the words; the next one tries again.
87
+ console.error(`[run ${ctx.runId}] listen ${id}`, err);
88
+ await ctx.emit("info", { code: "listenFailed", params: { label } });
89
+ }
90
+ }
@@ -0,0 +1,58 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { control, controlDb, db, schema } from "../db/client.js";
3
+ import { managed, pushToDevice } from "../manage.js";
4
+ import { currentTenant } from "../tenants/tenant.js";
5
+ const TEXT = {
6
+ en: {
7
+ done: "Your result is ready.",
8
+ failed: "The run stopped with an error.",
9
+ waiting: "The wizard is waiting for you.",
10
+ asks: "The wizard has a question for you.",
11
+ },
12
+ de: {
13
+ done: "Dein Ergebnis ist bereit.",
14
+ failed: "Der Lauf ist mit einem Fehler stehen geblieben.",
15
+ waiting: "Der Wizard wartet auf dich.",
16
+ asks: "Der Wizard hat eine Frage an dich.",
17
+ },
18
+ };
19
+ export const pushAvailable = () => managed;
20
+ export async function setPushDevice(runId, device) {
21
+ await controlDb
22
+ .update(control.runIndex)
23
+ .set({ push: device })
24
+ .where(eq(control.runIndex.runId, runId));
25
+ }
26
+ /** Tells the run's device, if the app gave one; never fails the run. */
27
+ export async function pushRun(runId, kind) {
28
+ if (!managed) {
29
+ return;
30
+ }
31
+ try {
32
+ const row = await controlDb.query.runIndex.findFirst({
33
+ where: eq(control.runIndex.runId, runId),
34
+ });
35
+ const device = row?.push;
36
+ if (!device) {
37
+ return;
38
+ }
39
+ const run = await db.query.run.findFirst({ where: eq(schema.run.id, runId) });
40
+ if (!run) {
41
+ return;
42
+ }
43
+ await pushToDevice({
44
+ tenantId: currentTenant(),
45
+ device: { token: device.token, platform: device.platform },
46
+ title: run.definition.title,
47
+ body: TEXT[device.lang][kind],
48
+ data: { runId, kind },
49
+ });
50
+ // An ended run has nothing more to say.
51
+ if (kind === "done" || kind === "failed") {
52
+ await setPushDevice(runId, null);
53
+ }
54
+ }
55
+ catch (err) {
56
+ console.error("[push]", err.message);
57
+ }
58
+ }
@@ -0,0 +1,355 @@
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
+ import { classProblem, filmClient } from "../models.js";
5
+ // The steps every run passes through, and the choices that lead around a missing model, are
6
+ // pure and shared (packages/shared/src/fit.ts): the standalone check uses the same.
7
+ export { openValue, unavoidableFrom, unavoidableSteps };
8
+ /**
9
+ * What a wizard needs of the models before a run starts: each class its steps call, and whether
10
+ * this runtime can serve it. A step every run passes through blocks the start when its class is
11
+ * missing; a step behind a branch only warns, since the person may choose around it.
12
+ */
13
+ /**
14
+ * The classes a step calls, as ../engine/steps.ts and ../media/generate.ts call them — and the
15
+ * classifier where a decision picks its next step or a page's fields.
16
+ */
17
+ export function stepClasses(step) {
18
+ const own = ownClasses(step);
19
+ const decides = step.next?.some((r) => r.ask) || (step.type === "page" && step.fields.some(isDecidedField));
20
+ return decides && !own.includes("classifier") ? [...own, "classifier"] : own;
21
+ }
22
+ function ownClasses(step) {
23
+ switch (step.type) {
24
+ case "agent": {
25
+ // A call runs one tool and no model.
26
+ if (step.call) {
27
+ return [];
28
+ }
29
+ if (isDecisionStep(step)) {
30
+ return ["classifier"];
31
+ }
32
+ const classes = [step.model ?? "high"];
33
+ if (step.tools.includes("image")) {
34
+ classes.push("image");
35
+ }
36
+ if (step.output.format === "json") {
37
+ classes.push("classifier");
38
+ }
39
+ if (step.output.surface === true && !classes.includes("standard")) {
40
+ classes.push("standard");
41
+ }
42
+ return classes;
43
+ }
44
+ case "generate":
45
+ switch (step.asset) {
46
+ case "image":
47
+ return ["standard", "image"];
48
+ case "video":
49
+ return ["standard", "video"];
50
+ case "voice":
51
+ return ["speech"];
52
+ default:
53
+ return [step.model ?? "high"];
54
+ }
55
+ case "film":
56
+ return [step.model ?? "standard"];
57
+ case "page":
58
+ // A voice note the page asks for is listened to before the next step reads it.
59
+ return step.fields.some((f) => f.kind === "audio" && f.required) ? ["audio"] : [];
60
+ default:
61
+ // Reviews (they redo a generate step counted already), widgets, results.
62
+ return [];
63
+ }
64
+ }
65
+ /** The classes a step can do without: a voice note the person may leave out. */
66
+ export function optionalStepClasses(step) {
67
+ return step.type === "page" &&
68
+ step.fields.some((f) => f.kind === "audio" && !f.required) &&
69
+ !stepClasses(step).includes("audio")
70
+ ? ["audio"]
71
+ : [];
72
+ }
73
+ /** Whether a rule matches given what is known: true, false, or null = it may go either way. */
74
+ function ruleHolds(rule, facts) {
75
+ // A decision may go either way.
76
+ if (rule.ask) {
77
+ return null;
78
+ }
79
+ let all = true;
80
+ for (const c of conditionsOf(rule.when)) {
81
+ const holds = conditionHolds(c, facts);
82
+ if (holds === false) {
83
+ return false;
84
+ }
85
+ if (holds === null) {
86
+ all = null;
87
+ }
88
+ }
89
+ return all;
90
+ }
91
+ function conditionHolds(c, facts) {
92
+ const k = facts[c.field];
93
+ const value = c.value;
94
+ switch (c.op) {
95
+ case "empty":
96
+ return k?.filled === undefined ? (k?.is !== undefined ? false : null) : !k.filled;
97
+ case "notEmpty":
98
+ return k?.filled === undefined ? (k?.is !== undefined ? true : null) : k.filled;
99
+ case "equals":
100
+ return k?.is !== undefined
101
+ ? k.is === String(value)
102
+ : k?.not.includes(String(value))
103
+ ? false
104
+ : null;
105
+ case "notEquals":
106
+ return k?.is !== undefined
107
+ ? k.is !== String(value)
108
+ : k?.not.includes(String(value))
109
+ ? true
110
+ : null;
111
+ case "in": {
112
+ const list = Array.isArray(value) ? value.map(String) : [];
113
+ if (k?.is !== undefined) {
114
+ return list.includes(k.is);
115
+ }
116
+ return list.every((v) => k?.not.includes(v)) ? false : null;
117
+ }
118
+ case "gt":
119
+ case "lt":
120
+ case "contains":
121
+ if (k?.is !== undefined) {
122
+ return conditionMatches(c, { [c.field]: k.is });
123
+ }
124
+ return k?.filled === false ? false : null;
125
+ }
126
+ }
127
+ /**
128
+ * What is known once a rule did (`held`) or did not match. A rule of several conditions that
129
+ * did not match says nothing about any one of them.
130
+ */
131
+ function learn(rule, held, facts) {
132
+ if (rule.ask) {
133
+ return facts;
134
+ }
135
+ const conditions = conditionsOf(rule.when);
136
+ if (held) {
137
+ return conditions.reduce((known, c) => learnCondition(c, true, known), facts);
138
+ }
139
+ return conditions.length === 1 ? learnCondition(conditions[0], false, facts) : facts;
140
+ }
141
+ function learnCondition(c, held, facts) {
142
+ const field = c.field;
143
+ const k = { ...(facts[field] ?? { not: [] }) };
144
+ k.not = [...k.not];
145
+ const value = String(c.value);
146
+ const op = c.op;
147
+ if ((op === "equals" && held) || (op === "notEquals" && !held)) {
148
+ k.is = value;
149
+ k.filled = true;
150
+ }
151
+ else if ((op === "equals" && !held) || (op === "notEquals" && held)) {
152
+ k.not.push(value);
153
+ }
154
+ else if (op === "in" && !held && Array.isArray(c.value)) {
155
+ k.not.push(...c.value.map(String));
156
+ }
157
+ else if (op === "empty" || op === "notEmpty") {
158
+ k.filled = (op === "notEmpty") === held;
159
+ }
160
+ else if ((op === "gt" || op === "lt" || op === "contains") && held) {
161
+ k.filled = true;
162
+ }
163
+ return { ...facts, [field]: k };
164
+ }
165
+ /**
166
+ * The most a run can add up to along one way through the wizard. A branch remembers what it
167
+ * implies of the answers, so ways that contradict themselves (the 720p clips and the 480p
168
+ * ones) are not added up. Steps in `closed` are not passed (no model for them here); where that
169
+ * leaves no way to the end, they count again. A branch back to an earlier step is not followed
170
+ * twice.
171
+ */
172
+ export function mostAlongOnePath(def, cost, closed = new Set()) {
173
+ const index = new Map(def.steps.map((s, i) => [s.id, i]));
174
+ const end = def.steps.length;
175
+ const walk = (avoid) => {
176
+ const best = (i, facts, seen) => {
177
+ if (i >= end) {
178
+ return 0;
179
+ }
180
+ const step = def.steps[i];
181
+ if (i < 0 || avoid.has(step.id) || seen.has(i)) {
182
+ return null;
183
+ }
184
+ const passed = new Set(seen).add(i);
185
+ let most = null;
186
+ const consider = (j, known) => {
187
+ const rest = best(j, known, passed);
188
+ if (rest !== null && (most === null || rest > most)) {
189
+ most = rest;
190
+ }
191
+ };
192
+ // The rules are tried in order; the first that matches decides.
193
+ let known = facts;
194
+ let decided = false;
195
+ for (const rule of step.next ?? []) {
196
+ if (isOtherwise(rule)) {
197
+ continue;
198
+ }
199
+ const holds = ruleHolds(rule, known);
200
+ if (holds === false) {
201
+ continue;
202
+ }
203
+ consider(rule.goto === "end" ? end : (index.get(rule.goto) ?? -1), learn(rule, true, known));
204
+ if (holds === true) {
205
+ decided = true;
206
+ break;
207
+ }
208
+ known = learn(rule, false, known);
209
+ }
210
+ if (!decided) {
211
+ consider(otherwiseIndex(def, i, index), known);
212
+ }
213
+ return most === null ? null : most + cost(step);
214
+ };
215
+ return best(0, {}, new Set());
216
+ };
217
+ return walk(closed) ?? walk(new Set()) ?? def.steps.reduce((sum, s) => sum + cost(s), 0);
218
+ }
219
+ /** The steps that call a class this runtime cannot serve. */
220
+ export async function stepsWithoutModel(def) {
221
+ const missing = await missingClasses();
222
+ return new Set(def.steps.filter((s) => stepClasses(s).some((cls) => missing.has(cls))).map((s) => s.id));
223
+ }
224
+ /** The classes this wizard needs that this runtime cannot serve, in a language; empty = every step can run. */
225
+ export async function missingModels(def, lang = "en") {
226
+ return (await missingModelsSaid(def)).map((m) => ({ ...m, problem: saidText(m.problem, lang) }));
227
+ }
228
+ /** The classes this wizard needs that this runtime cannot serve; empty = every step can run. */
229
+ export async function missingModelsSaid(def) {
230
+ const unavoidable = unavoidableSteps(def);
231
+ const needs = new Map();
232
+ for (const step of def.steps) {
233
+ for (const cls of new Set(stepClasses(step))) {
234
+ needs.set(cls, [...(needs.get(cls) ?? []), { step, required: true }]);
235
+ }
236
+ for (const cls of optionalStepClasses(step)) {
237
+ needs.set(cls, [...(needs.get(cls) ?? []), { step, required: false }]);
238
+ }
239
+ }
240
+ const missing = [];
241
+ // A film runs on an installed client only, whatever serves its class otherwise.
242
+ for (const step of def.steps) {
243
+ if (step.type !== "film") {
244
+ continue;
245
+ }
246
+ const cls = step.model ?? "standard";
247
+ const found = await filmClient(cls);
248
+ if ("problem" in found) {
249
+ missing.push({
250
+ cls,
251
+ problem: found.problem,
252
+ steps: [{ id: step.id, title: step.title }],
253
+ blocking: unavoidable.has(step.id),
254
+ });
255
+ }
256
+ }
257
+ for (const [cls, uses] of needs) {
258
+ const problem = await classProblem(cls);
259
+ if (problem) {
260
+ missing.push({
261
+ cls,
262
+ problem,
263
+ steps: uses.map(({ step }) => ({ id: step.id, title: step.title })),
264
+ blocking: uses.some(({ step, required }) => required && unavoidable.has(step.id)),
265
+ });
266
+ }
267
+ }
268
+ return missing;
269
+ }
270
+ /** The message a run that cannot start gives, naming the steps and why. */
271
+ export function blockingMessage(missing) {
272
+ const blocking = missing.filter((m) => m.blocking);
273
+ if (!blocking.length) {
274
+ return null;
275
+ }
276
+ return blocking
277
+ .map((m) => note("blockedSteps", {
278
+ steps: m.steps.map((s) => note("quoted", { text: s.title })),
279
+ problem: m.problem,
280
+ }))
281
+ .reduce((first, second) => note("joined", { first, second }));
282
+ }
283
+ /** The class a marketplace capability stands for; the rest need no model of their own. */
284
+ const CAPABILITY_CLASS = {
285
+ text: "standard",
286
+ documents: "standard",
287
+ image: "image",
288
+ video: "video",
289
+ speech: "speech",
290
+ listening: "audio",
291
+ };
292
+ /** The capabilities this runtime has no model for. */
293
+ export async function missingCapabilities() {
294
+ const missing = new Set();
295
+ for (const [capability, cls] of Object.entries(CAPABILITY_CLASS)) {
296
+ if (await classProblem(cls)) {
297
+ missing.add(capability);
298
+ }
299
+ }
300
+ if ("problem" in (await filmClient("standard"))) {
301
+ missing.add("film");
302
+ }
303
+ return missing;
304
+ }
305
+ /** The classes this runtime cannot serve. */
306
+ export async function missingClasses() {
307
+ const missing = new Set();
308
+ for (const cls of MODEL_CLASSES) {
309
+ if (await classProblem(cls)) {
310
+ missing.add(cls);
311
+ }
312
+ }
313
+ return missing;
314
+ }
315
+ /**
316
+ * The capabilities of a wizard that only some of its paths need: without them it still starts,
317
+ * on the other paths (animated stills instead of video clips, no voice-over).
318
+ */
319
+ export function optionalCapabilities(def) {
320
+ const unavoidable = unavoidableSteps(def);
321
+ const required = new Set();
322
+ const any = new Set();
323
+ for (const step of def.steps) {
324
+ for (const cls of stepClasses(step)) {
325
+ any.add(cls);
326
+ if (unavoidable.has(step.id)) {
327
+ required.add(cls);
328
+ }
329
+ }
330
+ for (const cls of optionalStepClasses(step)) {
331
+ any.add(cls);
332
+ }
333
+ }
334
+ const optional = new Set();
335
+ for (const [capability, cls] of Object.entries(CAPABILITY_CLASS)) {
336
+ if (any.has(cls) && !required.has(cls)) {
337
+ optional.add(capability);
338
+ }
339
+ }
340
+ return optional;
341
+ }
342
+ /**
343
+ * The answers on a page that lead to a step this runtime has no model for: with them the run
344
+ * would stop there, after what came before was paid for. The answers given already count; the
345
+ * page's other fields may still go either way. A choice whose every value leads there is left
346
+ * open: the run cannot go around it, and the start already warned. A voice note nothing here
347
+ * can listen to is closed as a whole (no values).
348
+ */
349
+ export async function closedChoices(def, step, values) {
350
+ const missing = await missingClasses();
351
+ if (!missing.size) {
352
+ return {};
353
+ }
354
+ return closedChoicesFor(def, step, values, (s) => stepClasses(s).filter((cls) => missing.has(cls)), (field) => (missing.has("audio") && field.kind === "audio" ? ["audio"] : null));
355
+ }