@engenty/wizards-runtime 0.0.0-stage → 0.7.5

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 (518) 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 +93 -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 +222 -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/setup.js +335 -0
  49. package/apps/runtime/dist/cli/start.js +276 -0
  50. package/apps/runtime/dist/cli/status.js +203 -0
  51. package/apps/runtime/dist/cli/ui.js +59 -0
  52. package/apps/runtime/dist/cli/uninstall-main.js +20 -0
  53. package/apps/runtime/dist/cli/uninstall.js +231 -0
  54. package/apps/runtime/dist/cli/update.js +86 -0
  55. package/apps/runtime/dist/cli/validate.js +75 -0
  56. package/apps/runtime/dist/cli/versions.js +123 -0
  57. package/apps/runtime/dist/connectors/builtin.js +86 -0
  58. package/apps/runtime/dist/connectors/external.js +409 -0
  59. package/apps/runtime/dist/connectors/gmail.js +107 -0
  60. package/apps/runtime/dist/connectors/imap.js +261 -0
  61. package/apps/runtime/dist/connectors/index.js +325 -0
  62. package/apps/runtime/dist/connectors/mail.js +72 -0
  63. package/apps/runtime/dist/connectors/outlook.js +90 -0
  64. package/apps/runtime/dist/connectors/plugin-connections.js +343 -0
  65. package/apps/runtime/dist/connectors/via-account.js +65 -0
  66. package/apps/runtime/dist/credits/credits.js +100 -0
  67. package/apps/runtime/dist/credits/estimate.js +152 -0
  68. package/apps/runtime/dist/db/adopt.js +149 -0
  69. package/apps/runtime/dist/db/client.js +173 -0
  70. package/apps/runtime/dist/db/control-schema.js +133 -0
  71. package/apps/runtime/dist/db/migrations/control/0000_last_absorbing_man.sql +47 -0
  72. package/apps/runtime/dist/db/migrations/control/0001_gorgeous_nicolaos.sql +41 -0
  73. package/apps/runtime/dist/db/migrations/control/0002_secret_penance.sql +1 -0
  74. package/apps/runtime/dist/db/migrations/control/0003_nasty_mordo.sql +3 -0
  75. package/apps/runtime/dist/db/migrations/control/0004_breezy_eddie_brock.sql +6 -0
  76. package/apps/runtime/dist/db/migrations/control/0005_chilly_oracle.sql +1 -0
  77. package/apps/runtime/dist/db/migrations/control/0006_sleepy_mojo.sql +1 -0
  78. package/apps/runtime/dist/db/migrations/control/0007_common_the_hand.sql +15 -0
  79. package/apps/runtime/dist/db/migrations/control/0008_runner.sql +8 -0
  80. package/apps/runtime/dist/db/migrations/control/0009_plugin_claim.sql +9 -0
  81. package/apps/runtime/dist/db/migrations/control/0010_tan_snowbird.sql +6 -0
  82. package/apps/runtime/dist/db/migrations/control/meta/0000_snapshot.json +311 -0
  83. package/apps/runtime/dist/db/migrations/control/meta/0001_snapshot.json +599 -0
  84. package/apps/runtime/dist/db/migrations/control/meta/0002_snapshot.json +607 -0
  85. package/apps/runtime/dist/db/migrations/control/meta/0003_snapshot.json +311 -0
  86. package/apps/runtime/dist/db/migrations/control/meta/0004_snapshot.json +350 -0
  87. package/apps/runtime/dist/db/migrations/control/meta/0005_snapshot.json +358 -0
  88. package/apps/runtime/dist/db/migrations/control/meta/0006_snapshot.json +365 -0
  89. package/apps/runtime/dist/db/migrations/control/meta/0007_snapshot.json +460 -0
  90. package/apps/runtime/dist/db/migrations/control/meta/0008_snapshot.json +505 -0
  91. package/apps/runtime/dist/db/migrations/control/meta/0009_snapshot.json +561 -0
  92. package/apps/runtime/dist/db/migrations/control/meta/0010_snapshot.json +600 -0
  93. package/apps/runtime/dist/db/migrations/control/meta/_journal.json +83 -0
  94. package/apps/runtime/dist/db/migrations/tenant/0000_eminent_freak.sql +188 -0
  95. package/apps/runtime/dist/db/migrations/tenant/0001_salty_master_chief.sql +1 -0
  96. package/apps/runtime/dist/db/migrations/tenant/0002_cloudy_firebird.sql +1 -0
  97. package/apps/runtime/dist/db/migrations/tenant/0003_brown_warbound.sql +52 -0
  98. package/apps/runtime/dist/db/migrations/tenant/0004_romantic_nocturne.sql +6 -0
  99. package/apps/runtime/dist/db/migrations/tenant/0005_reflective_forgotten_one.sql +2 -0
  100. package/apps/runtime/dist/db/migrations/tenant/0006_hard_war_machine.sql +30 -0
  101. package/apps/runtime/dist/db/migrations/tenant/0007_space_data.sql +43 -0
  102. package/apps/runtime/dist/db/migrations/tenant/0008_run_event_note.sql +1 -0
  103. package/apps/runtime/dist/db/migrations/tenant/0009_knowledge.sql +104 -0
  104. package/apps/runtime/dist/db/migrations/tenant/0010_plugin_connection.sql +15 -0
  105. package/apps/runtime/dist/db/migrations/tenant/0011_runners.sql +2 -0
  106. package/apps/runtime/dist/db/migrations/tenant/0012_assistant_chat.sql +40 -0
  107. package/apps/runtime/dist/db/migrations/tenant/0013_run_origin.sql +1 -0
  108. package/apps/runtime/dist/db/migrations/tenant/0014_run_answer.sql +2 -0
  109. package/apps/runtime/dist/db/migrations/tenant/0015_device_calls.sql +13 -0
  110. package/apps/runtime/dist/db/migrations/tenant/0016_even_trish_tilby.sql +12 -0
  111. package/apps/runtime/dist/db/migrations/tenant/meta/0000_snapshot.json +1323 -0
  112. package/apps/runtime/dist/db/migrations/tenant/meta/0001_snapshot.json +1330 -0
  113. package/apps/runtime/dist/db/migrations/tenant/meta/0002_snapshot.json +1337 -0
  114. package/apps/runtime/dist/db/migrations/tenant/meta/0003_snapshot.json +1605 -0
  115. package/apps/runtime/dist/db/migrations/tenant/meta/0004_snapshot.json +1645 -0
  116. package/apps/runtime/dist/db/migrations/tenant/meta/0005_snapshot.json +1659 -0
  117. package/apps/runtime/dist/db/migrations/tenant/meta/0006_snapshot.json +1696 -0
  118. package/apps/runtime/dist/db/migrations/tenant/meta/0007_snapshot.json +2012 -0
  119. package/apps/runtime/dist/db/migrations/tenant/meta/0008_snapshot.json +2019 -0
  120. package/apps/runtime/dist/db/migrations/tenant/meta/0009_snapshot.json +2837 -0
  121. package/apps/runtime/dist/db/migrations/tenant/meta/0010_snapshot.json +2942 -0
  122. package/apps/runtime/dist/db/migrations/tenant/meta/0011_snapshot.json +2956 -0
  123. package/apps/runtime/dist/db/migrations/tenant/meta/0012_snapshot.json +3132 -0
  124. package/apps/runtime/dist/db/migrations/tenant/meta/0013_snapshot.json +3139 -0
  125. package/apps/runtime/dist/db/migrations/tenant/meta/0014_snapshot.json +3154 -0
  126. package/apps/runtime/dist/db/migrations/tenant/meta/0015_snapshot.json +3243 -0
  127. package/apps/runtime/dist/db/migrations/tenant/meta/0016_snapshot.json +3326 -0
  128. package/apps/runtime/dist/db/migrations/tenant/meta/_journal.json +125 -0
  129. package/apps/runtime/dist/db/schema.js +602 -0
  130. package/apps/runtime/dist/debug.js +196 -0
  131. package/apps/runtime/dist/docs/dev/index.md +41 -0
  132. package/apps/runtime/dist/docs/dev/meta.json +7 -0
  133. package/apps/runtime/dist/docs/dev/plugins/connections.md +74 -0
  134. package/apps/runtime/dist/docs/dev/plugins/events.md +89 -0
  135. package/apps/runtime/dist/docs/dev/plugins/examples.md +101 -0
  136. package/apps/runtime/dist/docs/dev/plugins/index.md +78 -0
  137. package/apps/runtime/dist/docs/dev/plugins/layout.md +90 -0
  138. package/apps/runtime/dist/docs/dev/plugins/meta.json +28 -0
  139. package/apps/runtime/dist/docs/dev/plugins/quick-start.md +94 -0
  140. package/apps/runtime/dist/docs/dev/plugins/reference.md +348 -0
  141. package/apps/runtime/dist/docs/dev/plugins/reloading.md +76 -0
  142. package/apps/runtime/dist/docs/dev/plugins/routes.md +185 -0
  143. package/apps/runtime/dist/docs/dev/plugins/runners.md +230 -0
  144. package/apps/runtime/dist/docs/dev/plugins/server.md +281 -0
  145. package/apps/runtime/dist/docs/dev/plugins/shipping.md +79 -0
  146. package/apps/runtime/dist/docs/dev/plugins/space.md +297 -0
  147. package/apps/runtime/dist/docs/dev/plugins/starters.md +70 -0
  148. package/apps/runtime/dist/docs/dev/plugins/studio.md +363 -0
  149. package/apps/runtime/dist/docs/dev/plugins/styling.md +129 -0
  150. package/apps/runtime/dist/docs/dev/plugins/tables.md +104 -0
  151. package/apps/runtime/dist/docs/dev/plugins/tools.md +139 -0
  152. package/apps/runtime/dist/docs/dev/wizard-format.md +125 -0
  153. package/apps/runtime/dist/docs/meta.json +3 -0
  154. package/apps/runtime/dist/docs/user/ai-apps.md +112 -0
  155. package/apps/runtime/dist/docs/user/assistant.md +77 -0
  156. package/apps/runtime/dist/docs/user/build-a-wizard.md +116 -0
  157. package/apps/runtime/dist/docs/user/command-line.md +83 -0
  158. package/apps/runtime/dist/docs/user/connectors.md +90 -0
  159. package/apps/runtime/dist/docs/user/create-account.md +52 -0
  160. package/apps/runtime/dist/docs/user/data.md +66 -0
  161. package/apps/runtime/dist/docs/user/first-start.md +60 -0
  162. package/apps/runtime/dist/docs/user/index.md +49 -0
  163. package/apps/runtime/dist/docs/user/install.md +123 -0
  164. package/apps/runtime/dist/docs/user/local-only.md +42 -0
  165. package/apps/runtime/dist/docs/user/meta.json +32 -0
  166. package/apps/runtime/dist/docs/user/models.md +156 -0
  167. package/apps/runtime/dist/docs/user/plugins.md +71 -0
  168. package/apps/runtime/dist/docs/user/run.md +98 -0
  169. package/apps/runtime/dist/docs/user/server.md +52 -0
  170. package/apps/runtime/dist/docs/user/space.md +126 -0
  171. package/apps/runtime/dist/docs/user/steps.md +220 -0
  172. package/apps/runtime/dist/docs/user/test-and-share.md +224 -0
  173. package/apps/runtime/dist/docs/user/troubleshooting.md +67 -0
  174. package/apps/runtime/dist/docs/user/wordpress.md +121 -0
  175. package/apps/runtime/dist/documents/parse.js +246 -0
  176. package/apps/runtime/dist/engenty/connections-external/build-connector.js +193 -0
  177. package/apps/runtime/dist/engenty/connections-external/errors.js +11 -0
  178. package/apps/runtime/dist/engenty/connections-external/import-service.js +270 -0
  179. package/apps/runtime/dist/engenty/connections-external/importer/classify.js +34 -0
  180. package/apps/runtime/dist/engenty/connections-external/importer/map-auth.js +185 -0
  181. package/apps/runtime/dist/engenty/connections-external/importer/normalize-mcp.js +63 -0
  182. package/apps/runtime/dist/engenty/connections-external/importer/normalize-openapi.js +130 -0
  183. package/apps/runtime/dist/engenty/connections-external/invoke/http-invoker.js +143 -0
  184. package/apps/runtime/dist/engenty/connections-external/invoke/mcp-client.js +143 -0
  185. package/apps/runtime/dist/engenty/connections-external/net/guarded-fetch.js +119 -0
  186. package/apps/runtime/dist/engenty/connections-external/oauth-dcr.js +88 -0
  187. package/apps/runtime/dist/engenty/connections-external/registry-client.js +336 -0
  188. package/apps/runtime/dist/engenty/connections-external/registry-source.js +82 -0
  189. package/apps/runtime/dist/engenty/connections-external/types.js +7 -0
  190. package/apps/runtime/dist/engenty/connections-github/connector.js +209 -0
  191. package/apps/runtime/dist/engenty/connections-google/connectors/calendar.js +381 -0
  192. package/apps/runtime/dist/engenty/connections-google/connectors/contacts.js +94 -0
  193. package/apps/runtime/dist/engenty/connections-google/connectors/drive.js +290 -0
  194. package/apps/runtime/dist/engenty/connections-google/connectors/gmail.js +567 -0
  195. package/apps/runtime/dist/engenty/connections-google/definitions.js +11 -0
  196. package/apps/runtime/dist/engenty/connections-google/shared.js +73 -0
  197. package/apps/runtime/dist/engenty/connections-hubspot/connector.js +140 -0
  198. package/apps/runtime/dist/engenty/connections-microsoft/action.js +17 -0
  199. package/apps/runtime/dist/engenty/connections-microsoft/graph.js +114 -0
  200. package/apps/runtime/dist/engenty/connections-microsoft/onedrive.js +286 -0
  201. package/apps/runtime/dist/engenty/connections-microsoft/outlook.js +492 -0
  202. package/apps/runtime/dist/engenty/connections-s3/s3.js +328 -0
  203. package/apps/runtime/dist/engenty/connections-sdk/files-capability.js +86 -0
  204. package/apps/runtime/dist/engenty/connections-sdk/oauth2.js +150 -0
  205. package/apps/runtime/dist/engenty/connections-sdk/registry.js +89 -0
  206. package/apps/runtime/dist/engenty/connections-sdk/storage-capability.js +84 -0
  207. package/apps/runtime/dist/engenty/connections-sdk/types.js +30 -0
  208. package/apps/runtime/dist/engenty/connections-slack/connector.js +360 -0
  209. package/apps/runtime/dist/engenty/csv-import/csv-matrix.js +178 -0
  210. package/apps/runtime/dist/engenty/csv-import/import-sources.js +87 -0
  211. package/apps/runtime/dist/engenty/csv-import/parse-csv.js +129 -0
  212. package/apps/runtime/dist/engenty/csv-import/serialize-csv.js +20 -0
  213. package/apps/runtime/dist/engenty/csv-import/types.js +1 -0
  214. package/apps/runtime/dist/engenty/csv-import/xlsx-workbook.js +159 -0
  215. package/apps/runtime/dist/engenty/doc-converter/interface.js +9 -0
  216. package/apps/runtime/dist/engenty/doc-converter/page-break.js +92 -0
  217. package/apps/runtime/dist/engenty/doc-converter/providers/local/index.js +72 -0
  218. package/apps/runtime/dist/engenty/document-scanner/schemas/classifier.js +30 -0
  219. package/apps/runtime/dist/engenty/document-scanner/schemas/index.js +4 -0
  220. package/apps/runtime/dist/engenty/document-scanner/schemas/invoice.js +73 -0
  221. package/apps/runtime/dist/engenty/document-scanner/schemas/receipt.js +63 -0
  222. package/apps/runtime/dist/engenty/document-scanner/schemas/shared.js +40 -0
  223. package/apps/runtime/dist/engenty/search-index/chunks.js +164 -0
  224. package/apps/runtime/dist/engenty/search-index/contracts.js +9 -0
  225. package/apps/runtime/dist/engenty/shims/connections-sdk.js +39 -0
  226. package/apps/runtime/dist/engenty/shims/plugin-sdk.js +1 -0
  227. package/apps/runtime/dist/engenty/shims/web-ingest.js +19 -0
  228. package/apps/runtime/dist/engenty/web-ingest/ssrf.js +277 -0
  229. package/apps/runtime/dist/engine/asks.js +82 -0
  230. package/apps/runtime/dist/engine/decide.js +82 -0
  231. package/apps/runtime/dist/engine/device.js +194 -0
  232. package/apps/runtime/dist/engine/events.js +128 -0
  233. package/apps/runtime/dist/engine/input.js +208 -0
  234. package/apps/runtime/dist/engine/owner.js +32 -0
  235. package/apps/runtime/dist/engine/prepare.js +90 -0
  236. package/apps/runtime/dist/engine/push.js +58 -0
  237. package/apps/runtime/dist/engine/requirements.js +355 -0
  238. package/apps/runtime/dist/engine/resources.js +198 -0
  239. package/apps/runtime/dist/engine/runner.js +970 -0
  240. package/apps/runtime/dist/engine/steps.js +1000 -0
  241. package/apps/runtime/dist/engine/surface.js +91 -0
  242. package/apps/runtime/dist/engine/template.js +240 -0
  243. package/apps/runtime/dist/engine/types.js +4 -0
  244. package/apps/runtime/dist/env.js +295 -0
  245. package/apps/runtime/dist/features.js +123 -0
  246. package/apps/runtime/dist/files/blobs.js +22 -0
  247. package/apps/runtime/dist/files/objects.js +86 -0
  248. package/apps/runtime/dist/files/storage.js +120 -0
  249. package/apps/runtime/dist/files/web-images.js +101 -0
  250. package/apps/runtime/dist/film/project.js +257 -0
  251. package/apps/runtime/dist/film/skills.js +91 -0
  252. package/apps/runtime/dist/film/sounds.js +122 -0
  253. package/apps/runtime/dist/film/step.js +289 -0
  254. package/apps/runtime/dist/film/tools.js +99 -0
  255. package/apps/runtime/dist/geocode.js +58 -0
  256. package/apps/runtime/dist/harness/antigravity.js +129 -0
  257. package/apps/runtime/dist/harness/apple.js +270 -0
  258. package/apps/runtime/dist/harness/claude.js +147 -0
  259. package/apps/runtime/dist/harness/codex.js +229 -0
  260. package/apps/runtime/dist/harness/cursor.js +93 -0
  261. package/apps/runtime/dist/harness/env.js +124 -0
  262. package/apps/runtime/dist/harness/index.js +95 -0
  263. package/apps/runtime/dist/harness/model.js +279 -0
  264. package/apps/runtime/dist/harness/prompt.js +121 -0
  265. package/apps/runtime/dist/harness/terminal.js +194 -0
  266. package/apps/runtime/dist/harness/types.js +7 -0
  267. package/apps/runtime/dist/index.js +113 -0
  268. package/apps/runtime/dist/limits.js +81 -0
  269. package/apps/runtime/dist/link-preview.js +60 -0
  270. package/apps/runtime/dist/log.js +106 -0
  271. package/apps/runtime/dist/manage.js +249 -0
  272. package/apps/runtime/dist/mcp/auth.js +161 -0
  273. package/apps/runtime/dist/mcp/bridge.js +59 -0
  274. package/apps/runtime/dist/mcp/flow-app.js +97 -0
  275. package/apps/runtime/dist/mcp/handler.js +54 -0
  276. package/apps/runtime/dist/mcp/scopes.js +14 -0
  277. package/apps/runtime/dist/mcp/seen.js +65 -0
  278. package/apps/runtime/dist/mcp/tools.js +572 -0
  279. package/apps/runtime/dist/media/conversation.js +167 -0
  280. package/apps/runtime/dist/media/ffmpeg.js +121 -0
  281. package/apps/runtime/dist/media/generate.js +120 -0
  282. package/apps/runtime/dist/media/marking.js +121 -0
  283. package/apps/runtime/dist/media/transcribe.js +198 -0
  284. package/apps/runtime/dist/model-errors.js +42 -0
  285. package/apps/runtime/dist/models.js +1164 -0
  286. package/apps/runtime/dist/plugin.js +61 -0
  287. package/apps/runtime/dist/plugins/channels.js +78 -0
  288. package/apps/runtime/dist/plugins/claims.js +56 -0
  289. package/apps/runtime/dist/plugins/discovery.js +155 -0
  290. package/apps/runtime/dist/plugins/events.js +63 -0
  291. package/apps/runtime/dist/plugins/jobs.js +64 -0
  292. package/apps/runtime/dist/plugins/loader.js +508 -0
  293. package/apps/runtime/dist/plugins/migrations.js +69 -0
  294. package/apps/runtime/dist/plugins/pro-keys.js +34 -0
  295. package/apps/runtime/dist/plugins/pro-state.js +83 -0
  296. package/apps/runtime/dist/plugins/pro.js +310 -0
  297. package/apps/runtime/dist/plugins/public.js +44 -0
  298. package/apps/runtime/dist/plugins/registry.js +122 -0
  299. package/apps/runtime/dist/plugins/runs.js +210 -0
  300. package/apps/runtime/dist/render/browser-path.js +54 -0
  301. package/apps/runtime/dist/render/chromium.js +98 -0
  302. package/apps/runtime/dist/render/convert.js +158 -0
  303. package/apps/runtime/dist/render/downloads.js +299 -0
  304. package/apps/runtime/dist/render/guard.js +25 -0
  305. package/apps/runtime/dist/render/shaped.js +137 -0
  306. package/apps/runtime/dist/routes/api.js +440 -0
  307. package/apps/runtime/dist/routes/debug.js +42 -0
  308. package/apps/runtime/dist/routes/delivery.js +90 -0
  309. package/apps/runtime/dist/routes/internal.js +81 -0
  310. package/apps/runtime/dist/routes/lang.js +25 -0
  311. package/apps/runtime/dist/routes/marketplace.js +43 -0
  312. package/apps/runtime/dist/routes/plugin-public.js +113 -0
  313. package/apps/runtime/dist/routes/plugins.js +212 -0
  314. package/apps/runtime/dist/routes/runs.js +1422 -0
  315. package/apps/runtime/dist/routes/studio.js +1629 -0
  316. package/apps/runtime/dist/routes/wizard-stream.js +30 -0
  317. package/apps/runtime/dist/running.js +39 -0
  318. package/apps/runtime/dist/sandbox/docker.js +75 -0
  319. package/apps/runtime/dist/sandbox/index.js +23 -0
  320. package/apps/runtime/dist/sandbox/types.js +1 -0
  321. package/apps/runtime/dist/secrets/crypto.js +28 -0
  322. package/apps/runtime/dist/secrets/signing.js +52 -0
  323. package/apps/runtime/dist/secrets/vault.js +59 -0
  324. package/apps/runtime/dist/services/access.js +88 -0
  325. package/apps/runtime/dist/services/api.js +248 -0
  326. package/apps/runtime/dist/services/architect.js +95 -0
  327. package/apps/runtime/dist/services/assistant-chats.js +311 -0
  328. package/apps/runtime/dist/services/brand.js +85 -0
  329. package/apps/runtime/dist/services/cloud.js +456 -0
  330. package/apps/runtime/dist/services/draft-events.js +27 -0
  331. package/apps/runtime/dist/services/engenty-shapes.js +71 -0
  332. package/apps/runtime/dist/services/errors.js +29 -0
  333. package/apps/runtime/dist/services/files.js +178 -0
  334. package/apps/runtime/dist/services/knowledge-model.js +559 -0
  335. package/apps/runtime/dist/services/knowledge.js +721 -0
  336. package/apps/runtime/dist/services/links.js +16 -0
  337. package/apps/runtime/dist/services/marketplace.js +492 -0
  338. package/apps/runtime/dist/services/onboarding.js +152 -0
  339. package/apps/runtime/dist/services/package-file.js +82 -0
  340. package/apps/runtime/dist/services/package.js +170 -0
  341. package/apps/runtime/dist/services/profile.js +51 -0
  342. package/apps/runtime/dist/services/project-files.js +439 -0
  343. package/apps/runtime/dist/services/project-index.js +707 -0
  344. package/apps/runtime/dist/services/projects.js +387 -0
  345. package/apps/runtime/dist/services/relevance.js +58 -0
  346. package/apps/runtime/dist/services/runners.js +178 -0
  347. package/apps/runtime/dist/services/runs.js +524 -0
  348. package/apps/runtime/dist/services/shares.js +130 -0
  349. package/apps/runtime/dist/services/site.js +270 -0
  350. package/apps/runtime/dist/services/space-categories.js +861 -0
  351. package/apps/runtime/dist/services/space-data.js +792 -0
  352. package/apps/runtime/dist/services/space-origin.js +207 -0
  353. package/apps/runtime/dist/services/spaces.js +656 -0
  354. package/apps/runtime/dist/services/translations.js +306 -0
  355. package/apps/runtime/dist/services/widgets.js +34 -0
  356. package/apps/runtime/dist/services/wizard-icon.js +157 -0
  357. package/apps/runtime/dist/services/wizards.js +420 -0
  358. package/apps/runtime/dist/settings.js +16 -0
  359. package/apps/runtime/dist/store/errors.js +4 -0
  360. package/apps/runtime/dist/store/index.js +299 -0
  361. package/apps/runtime/dist/store/shared-lists.js +123 -0
  362. package/apps/runtime/dist/tenants/control.js +238 -0
  363. package/apps/runtime/dist/tenants/tenant.js +26 -0
  364. package/apps/runtime/dist/texts.js +207 -0
  365. package/apps/runtime/dist/tools/browser.js +703 -0
  366. package/apps/runtime/dist/tools/connector.js +204 -0
  367. package/apps/runtime/dist/tools/index.js +291 -0
  368. package/apps/runtime/dist/tools/mail.js +104 -0
  369. package/apps/runtime/dist/tools/net-guard.js +170 -0
  370. package/apps/runtime/dist/tools/pages.js +81 -0
  371. package/apps/runtime/dist/tools/plugin.js +180 -0
  372. package/apps/runtime/dist/tools/project.js +154 -0
  373. package/apps/runtime/dist/tools/shared.js +69 -0
  374. package/apps/runtime/dist/tools/store.js +238 -0
  375. package/apps/runtime/dist/update.js +113 -0
  376. package/apps/runtime/dist/widgets/bundle.js +99 -0
  377. package/apps/runtime/dist/widgets/render.js +329 -0
  378. package/apps/runtime/dist/widgets/runtime.js +108 -0
  379. package/apps/runtime/dist/widgets/script.js +30 -0
  380. package/apps/runtime/dist/widgets/step.js +223 -0
  381. package/apps/web/dist/ai-labels/ai-black.svg +20 -0
  382. package/apps/web/dist/ai-labels/ai-generated-black.svg +31 -0
  383. package/apps/web/dist/ai-labels/ai-generated-white.svg +32 -0
  384. package/apps/web/dist/ai-labels/ai-modified-black.svg +30 -0
  385. package/apps/web/dist/ai-labels/ai-modified-white.svg +31 -0
  386. package/apps/web/dist/ai-labels/ai-white.svg +21 -0
  387. package/apps/web/dist/assets/AboutDialog-D4mvc-zu.js +1 -0
  388. package/apps/web/dist/assets/ChangelogDialog-DLqpJsF6.js +1 -0
  389. package/apps/web/dist/assets/ChatView-3laypRcE.js +10 -0
  390. package/apps/web/dist/assets/EditorPage-BalA5U2Y.js +3 -0
  391. package/apps/web/dist/assets/FlowPreview-CusP7ci9.js +1 -0
  392. package/apps/web/dist/assets/Harness-BrP-ENHg.css +1 -0
  393. package/apps/web/dist/assets/Harness-iYLtOLaK.js +16 -0
  394. package/apps/web/dist/assets/NewWizardChannels-CbwJ9A56.js +1 -0
  395. package/apps/web/dist/assets/NewWizardPage-BOBYiB9i.js +7 -0
  396. package/apps/web/dist/assets/OnboardingPage-CUwCiVIr.js +1 -0
  397. package/apps/web/dist/assets/ProjectPage-Bb16MdYG.js +1 -0
  398. package/apps/web/dist/assets/PublicRunner-BCt7Q6C-.js +1 -0
  399. package/apps/web/dist/assets/ReadOnly-kIHX2TEy.js +1 -0
  400. package/apps/web/dist/assets/RunDrawer-hZ9oeSXu.js +4 -0
  401. package/apps/web/dist/assets/RunnerView-DUS9fPmx.js +1 -0
  402. package/apps/web/dist/assets/SettingsPage-BzwR50fi.js +1 -0
  403. package/apps/web/dist/assets/SetupPage-gAp7rPxp.js +1 -0
  404. package/apps/web/dist/assets/SharePage-DqZWHva_.js +1 -0
  405. package/apps/web/dist/assets/changelog-DugmCNSf.js +1 -0
  406. package/apps/web/dist/assets/engenty-eXZ-EAwd.js +1 -0
  407. package/apps/web/dist/assets/esm-DXeMu8Lb.js +7 -0
  408. package/apps/web/dist/assets/fluffy-engenty-ClRou7yu.js +456 -0
  409. package/apps/web/dist/assets/index-AfUa8xKD.css +1 -0
  410. package/apps/web/dist/assets/index-C5Sm7tTR.js +14 -0
  411. package/apps/web/dist/assets/jsx-runtime-BNakU3Ej.js +1 -0
  412. package/apps/web/dist/assets/lock-R_CfU0Xo.js +1 -0
  413. package/apps/web/dist/assets/oss-credits-cZ9NUaLZ.js +1 -0
  414. package/apps/web/dist/assets/pdfmake-Cx9scTbD.js +228 -0
  415. package/apps/web/dist/assets/phone-CgrIS4_-.js +1 -0
  416. package/apps/web/dist/assets/preload-helper-CNEI7N0N.js +1 -0
  417. package/apps/web/dist/assets/qr-scanner-worker.min-CJaXo3yu.js +98 -0
  418. package/apps/web/dist/assets/qr-scanner.min-C_UI0gH-.js +1 -0
  419. package/apps/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
  420. package/apps/web/dist/assets/settings-menu-2IMOOlLl.js +1 -0
  421. package/apps/web/dist/assets/ui-dzGvc3xk.js +137 -0
  422. package/apps/web/dist/assets/upload-BSuTilFF.js +1 -0
  423. package/apps/web/dist/assets/vfs_fonts-DllDSYt1.js +1 -0
  424. package/apps/web/dist/embed.js +266 -0
  425. package/apps/web/dist/favicon.svg +1 -0
  426. package/apps/web/dist/icons/apple-touch-icon.png +0 -0
  427. package/apps/web/dist/icons/icon-192.png +0 -0
  428. package/apps/web/dist/icons/icon-512.png +0 -0
  429. package/apps/web/dist/icons/icon-maskable-512.png +0 -0
  430. package/apps/web/dist/index.html +48 -0
  431. package/apps/web/dist/install.sh +577 -0
  432. package/apps/web/dist/manifest.webmanifest +21 -0
  433. package/apps/web/dist/mcp/flow.html +980 -0
  434. package/apps/web/dist/sw.js +15 -0
  435. package/bin/wizards.mjs +288 -0
  436. package/modules/README.md +15 -0
  437. package/node_modules/@engenty/wizards/dist/plugin/index.d.ts +1150 -0
  438. package/node_modules/@engenty/wizards/dist/plugin/index.js +4 -0
  439. package/node_modules/@engenty/wizards/dist/plugin/studio.d.ts +322 -0
  440. package/node_modules/@engenty/wizards/dist/plugin/studio.js +4 -0
  441. package/node_modules/@engenty/wizards/dist/plugin/thread.d.ts +174 -0
  442. package/node_modules/@engenty/wizards/dist/plugin/thread.js +821 -0
  443. package/node_modules/@engenty/wizards/package.json +11 -0
  444. package/node_modules/@engenty-wizards/shared/dist/assistant.d.ts +174 -0
  445. package/node_modules/@engenty-wizards/shared/dist/assistant.js +65 -0
  446. package/node_modules/@engenty-wizards/shared/dist/changes.d.ts +22 -0
  447. package/node_modules/@engenty-wizards/shared/dist/changes.js +61 -0
  448. package/node_modules/@engenty-wizards/shared/dist/connectors.d.ts +77 -0
  449. package/node_modules/@engenty-wizards/shared/dist/connectors.js +2 -0
  450. package/node_modules/@engenty-wizards/shared/dist/decision.d.ts +76 -0
  451. package/node_modules/@engenty-wizards/shared/dist/decision.js +147 -0
  452. package/node_modules/@engenty-wizards/shared/dist/definition.d.ts +2922 -0
  453. package/node_modules/@engenty-wizards/shared/dist/definition.js +1920 -0
  454. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.d.ts +5 -0
  455. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.js +132 -0
  456. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.d.ts +11 -0
  457. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.js +209 -0
  458. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.d.ts +532 -0
  459. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.js +217 -0
  460. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.d.ts +3 -0
  461. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.js +3 -0
  462. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.d.ts +14 -0
  463. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.js +166 -0
  464. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.d.ts +33 -0
  465. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.js +99 -0
  466. package/node_modules/@engenty-wizards/shared/dist/feature-flags.d.ts +78 -0
  467. package/node_modules/@engenty-wizards/shared/dist/feature-flags.js +70 -0
  468. package/node_modules/@engenty-wizards/shared/dist/features.d.ts +41 -0
  469. package/node_modules/@engenty-wizards/shared/dist/features.js +89 -0
  470. package/node_modules/@engenty-wizards/shared/dist/fit.d.ts +71 -0
  471. package/node_modules/@engenty-wizards/shared/dist/fit.js +382 -0
  472. package/node_modules/@engenty-wizards/shared/dist/json-schema.d.ts +14 -0
  473. package/node_modules/@engenty-wizards/shared/dist/json-schema.js +66 -0
  474. package/node_modules/@engenty-wizards/shared/dist/knowledge.d.ts +199 -0
  475. package/node_modules/@engenty-wizards/shared/dist/knowledge.js +68 -0
  476. package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.d.ts +35 -0
  477. package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.js +107 -0
  478. package/node_modules/@engenty-wizards/shared/dist/marketplace-search.d.ts +20 -0
  479. package/node_modules/@engenty-wizards/shared/dist/marketplace-search.js +136 -0
  480. package/node_modules/@engenty-wizards/shared/dist/marketplace.d.ts +227 -0
  481. package/node_modules/@engenty-wizards/shared/dist/marketplace.js +354 -0
  482. package/node_modules/@engenty-wizards/shared/dist/merge.d.ts +7 -0
  483. package/node_modules/@engenty-wizards/shared/dist/merge.js +40 -0
  484. package/node_modules/@engenty-wizards/shared/dist/numbers.d.ts +24 -0
  485. package/node_modules/@engenty-wizards/shared/dist/numbers.js +54 -0
  486. package/node_modules/@engenty-wizards/shared/dist/projects.d.ts +224 -0
  487. package/node_modules/@engenty-wizards/shared/dist/projects.js +319 -0
  488. package/node_modules/@engenty-wizards/shared/dist/providers.d.ts +101 -0
  489. package/node_modules/@engenty-wizards/shared/dist/providers.js +390 -0
  490. package/node_modules/@engenty-wizards/shared/dist/run.d.ts +680 -0
  491. package/node_modules/@engenty-wizards/shared/dist/run.js +620 -0
  492. package/node_modules/@engenty-wizards/shared/dist/runner-texts.d.ts +546 -0
  493. package/node_modules/@engenty-wizards/shared/dist/runner-texts.js +523 -0
  494. package/node_modules/@engenty-wizards/shared/dist/runners.d.ts +93 -0
  495. package/node_modules/@engenty-wizards/shared/dist/runners.js +146 -0
  496. package/node_modules/@engenty-wizards/shared/dist/shape.d.ts +102 -0
  497. package/node_modules/@engenty-wizards/shared/dist/shape.js +318 -0
  498. package/node_modules/@engenty-wizards/shared/dist/space-data.d.ts +89 -0
  499. package/node_modules/@engenty-wizards/shared/dist/space-data.js +47 -0
  500. package/node_modules/@engenty-wizards/shared/dist/store.d.ts +117 -0
  501. package/node_modules/@engenty-wizards/shared/dist/store.js +81 -0
  502. package/node_modules/@engenty-wizards/shared/dist/surface.d.ts +115 -0
  503. package/node_modules/@engenty-wizards/shared/dist/surface.js +442 -0
  504. package/node_modules/@engenty-wizards/shared/dist/texts.d.ts +45 -0
  505. package/node_modules/@engenty-wizards/shared/dist/texts.js +54 -0
  506. package/node_modules/@engenty-wizards/shared/dist/translation.d.ts +23 -0
  507. package/node_modules/@engenty-wizards/shared/dist/translation.js +154 -0
  508. package/node_modules/@engenty-wizards/shared/dist/wizard-package.d.ts +48 -0
  509. package/node_modules/@engenty-wizards/shared/dist/wizard-package.js +49 -0
  510. package/node_modules/@engenty-wizards/shared/dist/workspace.d.ts +16 -0
  511. package/node_modules/@engenty-wizards/shared/dist/workspace.js +51 -0
  512. package/node_modules/@engenty-wizards/shared/package.json +10 -0
  513. package/package.json +77 -4
  514. package/plugin/.claude-plugin/plugin.json +9 -0
  515. package/plugin/.mcp.json +8 -0
  516. package/plugin/commands/wizard.md +8 -0
  517. package/plugin/skills/build-wizard/SKILL.md +27 -0
  518. package/plugin/skills/use-wizard/SKILL.md +18 -0
@@ -0,0 +1,257 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import { cp, mkdir, readFile, rm, writeFile } from "node:fs/promises";
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";
7
+ import { unzipSync } from "fflate";
8
+ import { logoSectionLine, renderTemplate, resolveRef } from "../engine/template.js";
9
+ import { env } from "../env.js";
10
+ import { getBlob } from "../files/blobs.js";
11
+ import { extFor, loadAsset } from "../files/storage.js";
12
+ import { projectFileContent } from "../services/project-files.js";
13
+ import { placeSkills } from "./skills.js";
14
+ import { soundCatalog } from "./sounds.js";
15
+ import { runHyperframes } from "./tools.js";
16
+ /**
17
+ * The folder a film is made in: one per run and step, kept after the run so a later change edits
18
+ * the code instead of starting over. Laid out for the client:
19
+ *
20
+ * BRIEF.md what to make (the step's brief, the format, the length)
21
+ * CLAUDE.md, AGENTS.md the rules of the folder
22
+ * .claude/skills/ the skill packages
23
+ * showcase/ the wizard's style kit, the bar to reach
24
+ * brand/ the space's brand: brand.json, logos
25
+ * input/ what this run made before: voice lines, pictures, texts, uploads
26
+ * audio-catalog/ the only sounds the film may use
27
+ * film/ the HyperFrames project; renders/film.mp4 is the result
28
+ */
29
+ export function filmRoot(runId, stepId) {
30
+ return join(env.dataDir, "films", runId, stepId);
31
+ }
32
+ const SESSION = join(".engenty", "session");
33
+ export async function savedSession(root) {
34
+ try {
35
+ return (await readFile(join(root, SESSION), "utf8")).trim() || null;
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ export async function saveSession(root, id) {
42
+ await mkdir(join(root, ".engenty"), { recursive: true });
43
+ await writeFile(join(root, SESSION), id);
44
+ }
45
+ /** Writes bytes to a path inside `root`; a name that would leave it is refused. */
46
+ async function put(root, rel, data) {
47
+ const path = normalize(join(root, rel));
48
+ if (!path.startsWith(`${root}/`)) {
49
+ return;
50
+ }
51
+ await mkdir(dirname(path), { recursive: true });
52
+ await writeFile(path, data);
53
+ }
54
+ const safeName = (name) => name.replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "file";
55
+ function rules(step, skills) {
56
+ const size = FILM_SIZES[step.format];
57
+ return `# The film folder
58
+
59
+ You make one film here, autonomously, to the end. Nobody answers questions: where a skill asks the
60
+ person, decide yourself and note it in PROGRESS.md.
61
+
62
+ - **What to make:** BRIEF.md. **The bar:** showcase/ (read showcase/SHOWCASE.md and showcase/frame.md
63
+ first when it exists, look at its stills, reuse its helpers from showcase/assets/). **The brand:**
64
+ brand/brand.json and brand/logos/ — colours, logo and fonts come from there only.
65
+ - **Material:** input/ (see input/README.md). Use nothing from the web; you have no network.
66
+ - **Skills:** ${skills.join(", ")} in .claude/skills/<name>/SKILL.md. Start with \`hyperframes\` and
67
+ read the skill files directly; do not update or install skills.
68
+ - **The HyperFrames project is film/** (${size.width}×${size.height}, already set up). Keep every file
69
+ of the film inside film/.
70
+ - **Running HyperFrames:** only through the \`hyperframes\` tool (MCP server \`film\`), e.g.
71
+ \`["lint","film"]\`, \`["check","film"]\`, \`["snapshot","film","--at","1,4,8"]\`,
72
+ \`["render","film","-q","draft"]\`, \`["transcribe","input/voice/l01.wav","--json","-d","input/voice"]\`.
73
+ \`npx\`, \`npm\` and network do not work in the shell.
74
+ - **Look at your work:** snapshot the frames and read the PNGs, fix what is wrong. Before you finish,
75
+ render a draft and look at a frame every second of the whole film: empty areas, cut-off text,
76
+ overlaps, jumps.
77
+ - **Finish** only when \`["check","film"]\` passes and \`["render","film","-q","draft"]\` succeeds, with \`film/index.html\` complete. The runtime renders the final MP4 itself.
78
+ End with a short summary: what the film shows, what you decided.
79
+
80
+ ## Sound (hard rules)
81
+
82
+ - Sounds come only from audio-catalog/ (catalog.json lists each file with tags, keywords, licence).
83
+ Copy the picked files into film/assets/ and list them in film/AUDIO.md (file, source, licence, use).
84
+ - Never generate, synthesize or download audio: no ffmpeg tone or noise, no TTS, no music models. Voice
85
+ lines come only from input/. Mixing is HyperFrames' job (\`<audio>\` with start, duration, volume).
86
+ - Install nothing (no pip, brew, npm).
87
+ `;
88
+ }
89
+ /** Sets up the folder for a first attempt; a later attempt finds it as it was left. */
90
+ export async function prepareFilmFolder(step, ctx) {
91
+ const root = filmRoot(ctx.runId, step.id);
92
+ const brief = renderTemplate(step.brief, ctx.scope).trim();
93
+ // The same brief and material as last time: the film is there to go on with or to change.
94
+ const stamp = createHash("sha256")
95
+ .update(JSON.stringify([
96
+ brief,
97
+ Object.values(step.inputs).map((raw) => {
98
+ const ref = dataRef(raw);
99
+ const [head, id] = ref.split(".");
100
+ return head === "steps" ? ctx.state.outputs[id]?.at : ctx.state.values[ref];
101
+ }),
102
+ ]))
103
+ .digest("hex");
104
+ const stampFile = join(root, ".engenty", "inputs");
105
+ const same = existsSync(stampFile) && (await readFile(stampFile, "utf8")) === stamp;
106
+ if (same && existsSync(join(root, "film", "index.html")) && (await savedSession(root))) {
107
+ return { root, brief };
108
+ }
109
+ await rm(root, { recursive: true, force: true });
110
+ await mkdir(root, { recursive: true });
111
+ const skills = await placeSkills(step.skills, ctx.files, join(root, ".claude", "skills"));
112
+ const size = FILM_SIZES[step.format];
113
+ await put(root, "BRIEF.md", `# Brief\n\nFormat ${step.format}, ${size.width}×${size.height}${step.seconds ? `, about ${step.seconds} s` : ""}. Language of all text on screen: the brief's language.\n\n${brief}\n`);
114
+ const text = rules(step, skills);
115
+ await put(root, "CLAUDE.md", text);
116
+ await put(root, "AGENTS.md", text);
117
+ // The style kit.
118
+ if (step.kit) {
119
+ const file = ctx.files.find((f) => f.path === step.kit);
120
+ if (file) {
121
+ const entries = unzipSync(new Uint8Array(await getBlob(file.hash)));
122
+ for (const [name, data] of Object.entries(entries)) {
123
+ if (!name.endsWith("/")) {
124
+ await put(join(root, "showcase"), name.replace(/^showcase\//, ""), data);
125
+ }
126
+ }
127
+ }
128
+ }
129
+ // The space's brand.
130
+ const b = ctx.scope.brand;
131
+ const logos = [];
132
+ const patterns = [];
133
+ for (const p of b.patterns ?? []) {
134
+ const f = ctx.projectFiles.find((x) => x.id === p.file);
135
+ try {
136
+ if (f) {
137
+ const { data } = await projectFileContent(f.projectId, f.id);
138
+ const name = `patterns/${safeName(f.name.replace(/\.[^.]+$/, ""))}.${extFor(f.mime) === "bin" ? (f.name.split(".").pop() ?? "bin") : extFor(f.mime)}`;
139
+ await put(join(root, "brand"), name, data);
140
+ patterns.push({
141
+ file: name,
142
+ name: p.name,
143
+ ...(p.description ? { description: p.description } : {}),
144
+ tile: Boolean(p.tile),
145
+ });
146
+ }
147
+ }
148
+ catch {
149
+ // a pattern less
150
+ }
151
+ }
152
+ for (const f of ctx.projectFiles.filter((p) => p.kind === "logo")) {
153
+ try {
154
+ const { data } = await projectFileContent(f.projectId, f.id);
155
+ const name = `logos/${safeName(f.name.replace(/\.[^.]+$/, ""))}.${extFor(f.mime) === "bin" ? (f.name.split(".").pop() ?? "bin") : extFor(f.mime)}`;
156
+ await put(join(root, "brand"), name, data);
157
+ const section = logoSectionLine(b.logoSections, f.id);
158
+ logos.push({
159
+ file: name,
160
+ ...(section ? { section } : {}),
161
+ ...(f.description ? { description: f.description } : {}),
162
+ });
163
+ }
164
+ catch {
165
+ // a logo less
166
+ }
167
+ }
168
+ await put(join(root, "brand"), "brand.json", JSON.stringify({
169
+ note: "The space's brand. Colours are named by what they are for; the first is the accent. A logo's section, a gradient's or a pattern's description says when to use it; colorRules, logoRules and typeRules, where there are any, say how colours, logos and type may be used; text is set in the fonts — a font with `uses` that leave out video is not used in a film: its text gets a system font.",
170
+ name: b.name ?? "",
171
+ about: b.about ?? "",
172
+ colors: (b.colors ?? []).map((c) => {
173
+ const s = b.colorSections?.find((x) => x.id === c.section);
174
+ return { name: c.name, value: c.value, ...(s ? { section: s.title } : {}) };
175
+ }),
176
+ ...(b.gradients?.length
177
+ ? {
178
+ gradients: b.gradients.map((g) => ({
179
+ name: g.name,
180
+ ...(g.description ? { description: g.description } : {}),
181
+ section: b.colorSections?.find((x) => x.id === g.section)?.title,
182
+ css: gradientCss(g),
183
+ })),
184
+ }
185
+ : {}),
186
+ ...(patterns.length ? { patterns } : {}),
187
+ logos,
188
+ ...(b.colorRules?.length ? { colorRules: ruleLines(b.colorRules).split("\n") } : {}),
189
+ ...(b.fonts?.length
190
+ ? {
191
+ fonts: b.fonts.map(({ family, role, weights, license, uses }) => ({
192
+ family,
193
+ role,
194
+ weights,
195
+ ...(license ? { license } : {}),
196
+ ...(uses?.length ? { uses } : {}),
197
+ })),
198
+ }
199
+ : {}),
200
+ ...(b.textStyles?.length
201
+ ? {
202
+ textStyles: b.textStyles.map((s) => ({
203
+ name: s.name,
204
+ style: textStyleLine(s, b.fonts ?? []),
205
+ })),
206
+ }
207
+ : {}),
208
+ ...(b.typeRules?.length ? { typeRules: ruleLines(b.typeRules).split("\n") } : {}),
209
+ ...(b.logoRules?.length ? { logoRules: ruleLines(b.logoRules).split("\n") } : {}),
210
+ facts: (b.facts ?? []).map((f) => `${f.label}: ${f.value}`),
211
+ }, null, 1));
212
+ // What the run made before.
213
+ const listed = [];
214
+ for (const [name, raw] of Object.entries(step.inputs)) {
215
+ const ref = dataRef(raw);
216
+ const [head, id] = ref.split(".");
217
+ const output = head === "steps" ? ctx.state.outputs[id] : undefined;
218
+ const assetIds = head === "steps"
219
+ ? (output?.assets ?? []).map((a) => a.id)
220
+ : [ctx.state.values[ref]].flat().filter((v) => typeof v === "string");
221
+ let n = 0;
222
+ for (const assetId of assetIds) {
223
+ const found = await loadAsset(assetId);
224
+ if (found && found.row.runId === ctx.runId) {
225
+ const file = `${name}/${safeName(found.row.name)}`;
226
+ await put(join(root, "input"), file, found.data);
227
+ listed.push(`- \`input/${file}\` (${found.row.mime})`);
228
+ n++;
229
+ }
230
+ }
231
+ if (head === "steps" && output?.json !== undefined) {
232
+ await put(join(root, "input"), `${name}.json`, JSON.stringify(output.json, null, 1));
233
+ listed.push(`- \`input/${name}.json\``);
234
+ }
235
+ else if (head === "steps" && output?.text) {
236
+ await put(join(root, "input"), `${name}.md`, output.text);
237
+ listed.push(`- \`input/${name}.md\``);
238
+ }
239
+ else if (!n) {
240
+ const value = resolveRef(ref, ctx.scope);
241
+ if (value !== undefined && value !== null && value !== "") {
242
+ await put(join(root, "input"), `${name}.md`, typeof value === "string" ? value : JSON.stringify(value, null, 1));
243
+ listed.push(`- \`input/${name}.md\``);
244
+ }
245
+ }
246
+ }
247
+ await put(join(root, "input"), "README.md", `# Material for this film\n\n${listed.join("\n") || "(none)"}\n\nVoice lines play one after another in their order; their lengths decide the timing.\n`);
248
+ await cp(await soundCatalog(), join(root, "audio-catalog"), { recursive: true });
249
+ // The HyperFrames project, set up for the format.
250
+ const preset = { "16:9": "landscape", "9:16": "portrait", "1:1": "square" }[step.format];
251
+ const init = await runHyperframes(["init", "film", "--non-interactive", "--skip-transcribe", `--resolution=${preset}`], { cwd: root, signal: ctx.signal, timeoutMs: 5 * 60_000 });
252
+ if (init.code !== 0 || !existsSync(join(root, "film"))) {
253
+ throw new Error(`The film project could not be set up: ${init.out.slice(-300)}`);
254
+ }
255
+ await put(root, ".engenty/inputs", stamp);
256
+ return { root, brief };
257
+ }
@@ -0,0 +1,91 @@
1
+ import { execFile } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { cp, mkdir, readdir, rename, rm, writeFile } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { env } from "../env.js";
7
+ import { getBlob } from "../files/blobs.js";
8
+ const exec = promisify(execFile);
9
+ export const PLATFORM_SKILLS = {
10
+ hyperframes: {
11
+ name: "hyperframes",
12
+ source: "https://github.com/heygen-com/hyperframes",
13
+ version: "6308727b85726433e6a1e148b608d8cb11085114",
14
+ licence: "Apache-2.0",
15
+ tarball: "https://codeload.github.com/heygen-com/hyperframes/tar.gz/6308727b85726433e6a1e148b608d8cb11085114",
16
+ folder: "skills",
17
+ },
18
+ };
19
+ const fetching = new Map();
20
+ /** The folder holding a platform package's skills; fetched on first use. */
21
+ export function platformSkills(name) {
22
+ const pkg = PLATFORM_SKILLS[name];
23
+ if (!pkg) {
24
+ return Promise.reject(new Error(`There is no skill package “${name}”.`));
25
+ }
26
+ const dir = join(env.dataDir, "skills", `${pkg.name}@${pkg.version.slice(0, 12)}`);
27
+ if (existsSync(join(dir, ".complete"))) {
28
+ return Promise.resolve(dir);
29
+ }
30
+ let pending = fetching.get(name);
31
+ if (!pending) {
32
+ pending = fetchPackage(pkg, dir).finally(() => fetching.delete(name));
33
+ fetching.set(name, pending);
34
+ }
35
+ return pending;
36
+ }
37
+ async function fetchPackage(pkg, dir) {
38
+ const res = await fetch(pkg.tarball);
39
+ if (!res.ok) {
40
+ throw new Error(`The skill package “${pkg.name}” could not be loaded (${res.status}).`);
41
+ }
42
+ const tmp = `${dir}.part`;
43
+ await rm(tmp, { recursive: true, force: true });
44
+ await mkdir(tmp, { recursive: true });
45
+ const archive = join(tmp, "package.tar.gz");
46
+ await writeFile(archive, Buffer.from(await res.arrayBuffer()));
47
+ // GitHub's tarball has one top folder (<repo>-<sha>); only its skills folder is kept.
48
+ await exec("tar", ["-xzf", archive, "-C", tmp, "--strip-components=1", `*/${pkg.folder}/*`]);
49
+ const skills = join(tmp, pkg.folder);
50
+ for (const entry of await readdir(skills, { withFileTypes: true })) {
51
+ if (!entry.isDirectory() || !existsSync(join(skills, entry.name, "SKILL.md"))) {
52
+ await rm(join(skills, entry.name), { recursive: true, force: true });
53
+ }
54
+ }
55
+ await writeFile(join(skills, "PACKAGE.json"), JSON.stringify({ name: pkg.name, source: pkg.source, version: pkg.version, licence: pkg.licence }, null, 1));
56
+ await writeFile(join(skills, ".complete"), new Date().toISOString());
57
+ await rm(dir, { recursive: true, force: true });
58
+ await rename(skills, dir);
59
+ await rm(tmp, { recursive: true, force: true });
60
+ return dir;
61
+ }
62
+ /**
63
+ * Puts the step's skill packages into `target` (one folder per skill): platform packages by
64
+ * name, workspace packages (`skills/<name>`) from the wizard's files. Returns the skill names.
65
+ */
66
+ export async function placeSkills(names, files, target) {
67
+ await mkdir(target, { recursive: true });
68
+ const placed = [];
69
+ for (const name of names) {
70
+ if (name.startsWith("skills/")) {
71
+ const prefix = `${name.replace(/\/+$/, "")}/`;
72
+ const own = files.filter((f) => f.path.startsWith(prefix));
73
+ const skill = prefix.split("/")[1];
74
+ for (const f of own) {
75
+ const dest = join(target, skill, f.path.slice(prefix.length));
76
+ await mkdir(join(dest, ".."), { recursive: true });
77
+ await writeFile(dest, await getBlob(f.hash));
78
+ }
79
+ placed.push(skill);
80
+ continue;
81
+ }
82
+ const dir = await platformSkills(name);
83
+ for (const entry of await readdir(dir, { withFileTypes: true })) {
84
+ if (entry.isDirectory()) {
85
+ await cp(join(dir, entry.name), join(target, entry.name), { recursive: true });
86
+ placed.push(entry.name);
87
+ }
88
+ }
89
+ }
90
+ return placed;
91
+ }
@@ -0,0 +1,122 @@
1
+ import { existsSync } from "node:fs";
2
+ import { cp, mkdir, readdir, readFile, rename, rm, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { env } from "../env.js";
5
+ import { platformSkills } from "./skills.js";
6
+ /**
7
+ * The sounds a film may use: nothing is generated, synthesized or downloaded by the client.
8
+ * soundcn (soundcn.xyz, MIT; the sounds by Kenney, CC0) for clicks, pops, impacts, jingles,
9
+ * switches, pages and paper; the effects HyperFrames ships with (whooshes, typing, risers).
10
+ * Fetched once into the data folder; `catalog.json` lists every file with tags and licence.
11
+ */
12
+ const REGISTRY = "https://soundcn.xyz/r";
13
+ /** soundcn categories that suit motion design; game noises (warcraft, laser, combat …) stay out. */
14
+ const KEEP = new Set([
15
+ "ui",
16
+ "click",
17
+ "switch",
18
+ "select",
19
+ "maximize",
20
+ "minimize",
21
+ "book",
22
+ "card",
23
+ "cloth",
24
+ "scratch",
25
+ "scroll",
26
+ "drop",
27
+ "glass",
28
+ "jingles",
29
+ "pep",
30
+ "power",
31
+ "impact",
32
+ "chips",
33
+ "dice",
34
+ "error",
35
+ "round",
36
+ "zap",
37
+ "phase",
38
+ "low",
39
+ "metal",
40
+ "crafting",
41
+ ]);
42
+ const CATALOG_VERSION = 1;
43
+ const dir = join(env.dataDir, "catalogs", `sounds-v${CATALOG_VERSION}`);
44
+ let building = null;
45
+ /** The catalog folder (catalog.json + sfx/); built on first use. */
46
+ export function soundCatalog() {
47
+ if (existsSync(join(dir, "catalog.json"))) {
48
+ return Promise.resolve(dir);
49
+ }
50
+ building ??= build().finally(() => {
51
+ building = null;
52
+ });
53
+ return building;
54
+ }
55
+ async function build() {
56
+ const tmp = `${dir}.part`;
57
+ await rm(tmp, { recursive: true, force: true });
58
+ await mkdir(join(tmp, "sfx"), { recursive: true });
59
+ const sounds = [];
60
+ const index = (await (await fetch(`${REGISTRY}/registry.json`)).json());
61
+ const picked = index.items.filter((i) => i.categories?.some((c) => KEEP.has(c)));
62
+ let next = 0;
63
+ const worker = async () => {
64
+ while (next < picked.length) {
65
+ const item = picked[next++];
66
+ try {
67
+ const res = await fetch(`${REGISTRY}/${item.name}.json`);
68
+ const json = (await res.json());
69
+ const m = json.files?.[0]?.content?.match(/data:audio\/(\w+);base64,([A-Za-z0-9+/=]+)/);
70
+ if (!m) {
71
+ continue;
72
+ }
73
+ const ext = m[1] === "mpeg" ? "mp3" : m[1];
74
+ await writeFile(join(tmp, "sfx", `${item.name}.${ext}`), Buffer.from(m[2], "base64"));
75
+ sounds.push({
76
+ file: `sfx/${item.name}.${ext}`,
77
+ source: "soundcn",
78
+ author: json.author ?? "Kenney",
79
+ licence: item.meta?.license ?? "CC0",
80
+ duration: item.meta?.duration,
81
+ description: json.description,
82
+ tags: item.categories?.concat(item.meta?.tags ?? []),
83
+ keywords: item.meta?.keywords,
84
+ });
85
+ }
86
+ catch {
87
+ // one sound less
88
+ }
89
+ }
90
+ };
91
+ await Promise.all(Array.from({ length: 8 }, worker));
92
+ // The effects HyperFrames ships with its media skill.
93
+ const hf = join(await platformSkills("hyperframes"), "media-use", "audio", "assets", "sfx");
94
+ if (existsSync(hf)) {
95
+ for (const f of await readdir(hf)) {
96
+ if (f.endsWith(".mp3")) {
97
+ await cp(join(hf, f), join(tmp, "sfx", `hf-${f}`));
98
+ sounds.push({
99
+ file: `sfx/hf-${f}`,
100
+ source: "hyperframes",
101
+ licence: "see CREDITS-hyperframes.md",
102
+ description: f.replace(/\.mp3$/, "").replace(/-/g, " "),
103
+ });
104
+ }
105
+ }
106
+ if (existsSync(join(hf, "CREDITS.md"))) {
107
+ await writeFile(join(tmp, "CREDITS-hyperframes.md"), await readFile(join(hf, "CREDITS.md")));
108
+ }
109
+ }
110
+ if (!sounds.length) {
111
+ throw new Error("The sounds for films could not be loaded.");
112
+ }
113
+ sounds.sort((a, b) => a.file.localeCompare(b.file));
114
+ await writeFile(join(tmp, "catalog.json"), JSON.stringify({
115
+ note: "The only sounds this film may use. Never generate, synthesize or download audio.",
116
+ music: [],
117
+ sounds,
118
+ }, null, 1));
119
+ await rm(dir, { recursive: true, force: true });
120
+ await rename(tmp, dir);
121
+ return dir;
122
+ }