@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,30 @@
1
+ import { Hono } from "hono";
2
+ import { streamSSE } from "hono/streaming";
3
+ import { subscribeDraft } from "../services/draft-events.js";
4
+ import { ownedWizard } from "../services/wizards.js";
5
+ /**
6
+ * Live changes to a wizard the editor has open — from an MCP client, the architect or another
7
+ * tab. The editor refetches on `change`; `hello` carries the revision to catch up after a gap.
8
+ */
9
+ export const wizardStream = new Hono().get("/:id/stream", async (c) => {
10
+ const w = await ownedWizard(c.get("user").id, c.req.param("id"));
11
+ return streamSSE(c, async (stream) => {
12
+ let closed = false;
13
+ const unsubscribe = subscribeDraft(w.id, (change) => {
14
+ if (!closed) {
15
+ void stream.writeSSE({ event: "change", data: JSON.stringify(change) });
16
+ }
17
+ });
18
+ stream.onAbort(() => {
19
+ closed = true;
20
+ unsubscribe();
21
+ });
22
+ await stream.writeSSE({ event: "hello", data: JSON.stringify({ revision: w.revision }) });
23
+ while (!closed) {
24
+ await stream.sleep(20_000);
25
+ if (!closed) {
26
+ await stream.writeSSE({ event: "ping", data: "" });
27
+ }
28
+ }
29
+ });
30
+ });
@@ -0,0 +1,39 @@
1
+ import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const FILE = "running.json";
4
+ export function writeRunning(dataDir, running) {
5
+ mkdirSync(dataDir, { recursive: true });
6
+ writeFileSync(join(dataDir, FILE), `${JSON.stringify(running, null, 2)}\n`, { mode: 0o600 });
7
+ }
8
+ function alive(pid) {
9
+ try {
10
+ process.kill(pid, 0);
11
+ return true;
12
+ }
13
+ catch (error) {
14
+ // EPERM: the process exists and belongs to somebody else.
15
+ return error.code === "EPERM";
16
+ }
17
+ }
18
+ /** The runtime that holds this data folder, if its process still exists. */
19
+ export function readRunning(dataDir) {
20
+ try {
21
+ const running = JSON.parse(readFileSync(join(dataDir, FILE), "utf8"));
22
+ return Number.isInteger(running.pid) && alive(running.pid) ? running : null;
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ /** Takes the note away, unless another runtime wrote it meanwhile. */
29
+ export function clearRunning(dataDir, pid = process.pid) {
30
+ try {
31
+ const running = JSON.parse(readFileSync(join(dataDir, FILE), "utf8"));
32
+ if (running.pid === pid) {
33
+ rmSync(join(dataDir, FILE), { force: true });
34
+ }
35
+ }
36
+ catch {
37
+ // nothing there
38
+ }
39
+ }
@@ -0,0 +1,73 @@
1
+ import { chmodSync, copyFileSync, existsSync, mkdirSync, readdirSync, rmSync, writeFileSync, } from "node:fs";
2
+ import { join } from "node:path";
3
+ /**
4
+ * What `wizards sandbox add agentos` installs (install.ts): agentOS's core, about 340 MB, which
5
+ * only the computers and servers that run the sandbox with it need.
6
+ */
7
+ export const AGENTOS_VERSION = "0.4.1";
8
+ export const AGENTOS_CORE = "@rivet-dev/agentos-core";
9
+ /** The helper agentOS ships for each platform, beside the core: `<package>/agentos-native-sidecar`. */
10
+ const SIDECAR_PACKAGE = "@rivet-dev/agentos-runtime-sidecar-";
11
+ /** Where the core keeps its programs, compiled to WebAssembly. */
12
+ const COMMANDS = join("node_modules", "@rivet-dev", "agentos-runtime-core", "commands");
13
+ /**
14
+ * Programs agentOS ships but leaves off the PATH; the install packs them so every VM has them.
15
+ * The ones from the `@agentos-software` registry are in a format 0.4 no longer reads.
16
+ */
17
+ export const AGENTOS_EXTRA_COMMANDS = ["curl", "git", "jq", "sqlite3", "unzip", "zip"];
18
+ /** Dependencies of the core that its code never imports: Google and AWS clients, about 140 MB. */
19
+ const UNUSED = ["googleapis", "googleapis-common", "@aws-sdk", "@smithy", "better-sqlite3"];
20
+ /** agentOS ships its helper for macOS and glibc Linux, on arm64 and x64. */
21
+ export function agentOsSupported(platform = process.platform, arch = process.arch) {
22
+ return ["darwin", "linux"].includes(platform) && ["arm64", "x64"].includes(arch);
23
+ }
24
+ /** The package of extra programs every VM gets (AGENTOS_EXTRA_COMMANDS). */
25
+ export const agentOsExtras = (dir) => join(dir, "extras");
26
+ /** The helper with its routine lines filtered out, or null where there is no bash. */
27
+ export const agentOsSidecar = (dir) => join(dir, "sidecar.sh");
28
+ /** An agentOS package is a folder with a manifest and its programs in `bin/`. */
29
+ function packExtras(dir) {
30
+ const bin = join(agentOsExtras(dir), "bin");
31
+ mkdirSync(bin, { recursive: true });
32
+ for (const command of AGENTOS_EXTRA_COMMANDS) {
33
+ const target = join(bin, command);
34
+ copyFileSync(join(dir, COMMANDS, command), target);
35
+ // Without the mode, the VM finds the program and refuses to run it.
36
+ chmodSync(target, 0o755);
37
+ }
38
+ writeFileSync(join(agentOsExtras(dir), "agentos-package.json"), `${JSON.stringify({ name: "engenty-wizards-extras", version: AGENTOS_VERSION })}\n`);
39
+ }
40
+ /**
41
+ * The helper prints a line on stderr for every engine it keeps warm, a few per command, and
42
+ * agentOS passes its stderr on to the server's. The wrapper leaves those lines out.
43
+ */
44
+ function writeSidecarWrapper(dir) {
45
+ const bash = ["/bin/bash", "/usr/bin/bash"].find((path) => existsSync(path));
46
+ const modules = join(dir, "node_modules", "@rivet-dev");
47
+ const platform = readdirSync(modules).find((name) => `@rivet-dev/${name}`.startsWith(SIDECAR_PACKAGE));
48
+ const helper = platform && join(modules, platform, "agentos-native-sidecar");
49
+ if (!bash || !helper || !existsSync(helper)) {
50
+ return;
51
+ }
52
+ const quoted = `'${helper.replaceAll("'", `'\\''`)}'`;
53
+ writeFileSync(agentOsSidecar(dir), `#!${bash}\n` +
54
+ "# agentOS's helper without the lines it prints for every engine it keeps warm.\n" +
55
+ `exec ${quoted} "$@" 2> >(grep --line-buffered -v -e '^agentos-v8-runtime: ' -e 'vfs::posix::tar_fs' >&2)\n`);
56
+ chmodSync(agentOsSidecar(dir), 0o755);
57
+ }
58
+ export const AGENTOS_PACKAGE = {
59
+ label: "agentOS",
60
+ version: AGENTOS_VERSION,
61
+ packages: [`${AGENTOS_CORE}@${AGENTOS_VERSION}`],
62
+ size: "about 340 MB",
63
+ unsupported: () => agentOsSupported()
64
+ ? null
65
+ : `agentOS runs on macOS and Linux (arm64, x64), not on ${process.platform} ${process.arch}.`,
66
+ prepare(dir) {
67
+ for (const name of UNUSED) {
68
+ rmSync(join(dir, "node_modules", name), { recursive: true, force: true });
69
+ }
70
+ packExtras(dir);
71
+ writeSidecarWrapper(dir);
72
+ },
73
+ };
@@ -0,0 +1,162 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join, posix } from "node:path";
3
+ import { env } from "../env.js";
4
+ import { AGENTOS_CORE, AGENTOS_EXTRA_COMMANDS, agentOsExtras, agentOsSidecar, } from "./agentos-package.js";
5
+ import { importFromEngine, installedVersion } from "./install.js";
6
+ const WORKDIR = "/workspace";
7
+ const EXEC_TIMEOUT_MS = 120_000;
8
+ /**
9
+ * Python starts in $HOME, whatever directory the shell is in. Before each command, `python3`
10
+ * becomes a function that hands it the shell's directory as HOME.
11
+ */
12
+ const PYTHON_FOLLOWS_CD = 'python3() { HOME="$PWD" command python3 "$@"; }; python() { python3 "$@"; }\n';
13
+ /** Where npm and Python packages come from: every VM reaches them. */
14
+ const REGISTRIES = ["registry.npmjs.org", "pypi.org", "files.pythonhosted.org"];
15
+ /**
16
+ * What an agentOS VM runs: a Linux userland compiled to WebAssembly (bash, coreutils and the
17
+ * extra programs the install packs), Node in a V8 isolate and Python 3.13 as Pyodide. No native
18
+ * programs: no ffmpeg, ImageMagick or LibreOffice.
19
+ */
20
+ export function agentOsCapabilities(hosts = []) {
21
+ return {
22
+ commands: [
23
+ "bash",
24
+ "ls",
25
+ "cat",
26
+ "head",
27
+ "sort",
28
+ "grep",
29
+ "sed",
30
+ "awk",
31
+ "find",
32
+ "diff",
33
+ "tar",
34
+ "gzip",
35
+ ...AGENTOS_EXTRA_COMMANDS,
36
+ "node",
37
+ "npm",
38
+ "python3",
39
+ ],
40
+ network: hosts.length
41
+ ? `only the npm and PyPI registries and ${hosts.join(", ")}`
42
+ : "none, except the npm and PyPI registries",
43
+ notes: "python3 is Pyodide: numpy and pandas load offline; install other pure-Python packages with " +
44
+ `python3 -c "import micropip; await micropip.install('openpyxl')" (no pip command, no ` +
45
+ "pillow, matplotlib or scipy). node runs JavaScript, not TypeScript.",
46
+ uses: "calculations, tables or file conversion",
47
+ workdir: WORKDIR,
48
+ };
49
+ }
50
+ let runtime = null;
51
+ /** One native helper process hosts the VMs of every run; the first sandbox starts it. */
52
+ function agentOsRuntime(dir) {
53
+ runtime ??= (async () => {
54
+ // agentOS reads the helper's path from the environment when it starts the helper.
55
+ if (!process.env.AGENTOS_SIDECAR_BIN && existsSync(agentOsSidecar(dir))) {
56
+ process.env.AGENTOS_SIDECAR_BIN = agentOsSidecar(dir);
57
+ }
58
+ const mod = (await importFromEngine("agentos", dir, AGENTOS_CORE));
59
+ return { agentOs: mod.AgentOs, sidecar: await mod.AgentOs.createSidecar() };
60
+ })().catch((err) => {
61
+ runtime = null;
62
+ throw err;
63
+ });
64
+ return runtime;
65
+ }
66
+ /** Stops the helper process. The next sandbox starts a new one. */
67
+ export async function stopAgentOs() {
68
+ const current = runtime;
69
+ runtime = null;
70
+ await (await current?.catch(() => null))?.sidecar.dispose();
71
+ }
72
+ function toResult(result) {
73
+ const stdout = result.stdout ?? "";
74
+ let stderr = result.stderr ?? "";
75
+ if (result.outcome === "timed_out") {
76
+ stderr = `${stderr}\ntimed out`.trim();
77
+ }
78
+ else if (result.outcome !== "succeeded" && !stdout && !stderr) {
79
+ stderr = result.error?.message ?? result.outcome;
80
+ }
81
+ return { exitCode: result.exitCode ?? (result.outcome === "succeeded" ? 0 : 1), stdout, stderr };
82
+ }
83
+ /** Where `wizards sandbox add agentos` put it. */
84
+ export const agentOsDir = () => join(env.sandboxEngines, "agentos");
85
+ /** Ready once `wizards sandbox add agentos` installed it. */
86
+ export const agentOsEngine = {
87
+ name: "agentos",
88
+ ready: () => installedVersion(agentOsDir()) !== null,
89
+ capabilities: () => agentOsCapabilities(env.sandboxHosts),
90
+ create: () => new AgentOsSandbox(),
91
+ };
92
+ /** One agentOS VM per run, in the server's helper process: no Docker, no container. */
93
+ export class AgentOsSandbox {
94
+ dir;
95
+ hosts;
96
+ capabilities;
97
+ machine = null;
98
+ constructor(dir = agentOsDir(), hosts = env.sandboxHosts) {
99
+ this.dir = dir;
100
+ this.hosts = hosts;
101
+ this.capabilities = agentOsCapabilities(hosts);
102
+ }
103
+ vm() {
104
+ this.machine ??= (async () => {
105
+ const { agentOs, sidecar } = await agentOsRuntime(this.dir);
106
+ const vm = await agentOs.create({
107
+ sidecar: { kind: "explicit", handle: sidecar },
108
+ software: [{ packagePath: agentOsExtras(this.dir) }],
109
+ // Anything not listed is refused, the host's own loopback and private networks included.
110
+ permissions: {
111
+ fs: "allow",
112
+ childProcess: "allow",
113
+ process: "allow",
114
+ env: "allow",
115
+ network: {
116
+ default: "deny",
117
+ rules: [
118
+ {
119
+ mode: "allow",
120
+ operations: ["*"],
121
+ patterns: [...REGISTRIES, ...this.hosts].flatMap((host) => [
122
+ `dns://${host}`,
123
+ `tcp://${host}:443`,
124
+ ]),
125
+ },
126
+ ],
127
+ },
128
+ },
129
+ });
130
+ await vm.filesystem.mkdir(WORKDIR, { recursive: true });
131
+ return vm;
132
+ })();
133
+ this.machine.catch(() => {
134
+ this.machine = null;
135
+ });
136
+ return this.machine;
137
+ }
138
+ async exec(command, options = {}) {
139
+ const vm = await this.vm();
140
+ return toResult(await vm.process.exec(PYTHON_FOLLOWS_CD + command, {
141
+ cwd: options.cwd ?? WORKDIR,
142
+ env: { HOME: WORKDIR, ...options.env },
143
+ timeoutMs: options.timeoutMs ?? EXEC_TIMEOUT_MS,
144
+ output: { capture: "all" },
145
+ }));
146
+ }
147
+ async writeFile(path, data) {
148
+ const vm = await this.vm();
149
+ const target = posix.resolve(WORKDIR, path);
150
+ await vm.filesystem.mkdir(posix.dirname(target), { recursive: true });
151
+ await vm.filesystem.writeFile(target, data);
152
+ }
153
+ async readFile(path) {
154
+ const vm = await this.vm();
155
+ return vm.filesystem.readFile(posix.resolve(WORKDIR, path));
156
+ }
157
+ async destroy() {
158
+ const machine = this.machine;
159
+ this.machine = null;
160
+ await (await machine?.catch(() => null))?.dispose();
161
+ }
162
+ }
@@ -0,0 +1,45 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { DockerSandbox } from "@mastra/docker";
3
+ import { env } from "../env.js";
4
+ import { MastraRunSandbox } from "./mastra.js";
5
+ /** The image's own working directory, the one its unprivileged user may write to. */
6
+ const WORKDIR = "/sandbox";
7
+ /** What the engenty-sandbox image carries. The container sits on Docker's default bridge. */
8
+ export const DOCKER_CAPABILITIES = {
9
+ commands: ["bash", "python3", "pip", "uv", "node", "npm", "bun", "jq", "curl", "git", "unzip"],
10
+ network: "open internet",
11
+ uses: "calculations, charts or file conversion",
12
+ workdir: WORKDIR,
13
+ };
14
+ /** One container per run through the host's Docker, with Mastra's Docker sandbox. */
15
+ export function dockerSandbox(runId, image) {
16
+ return new MastraRunSandbox(DOCKER_CAPABILITIES, () => new DockerSandbox({
17
+ id: `wizards-${runId.toLowerCase()}`,
18
+ image,
19
+ memory: 1024 * 1024 * 1024,
20
+ pidsLimit: 256,
21
+ capDrop: ["ALL"],
22
+ securityOpt: ["no-new-privileges"],
23
+ workingDir: WORKDIR,
24
+ labels: { "engenty-wizards.run": runId },
25
+ }));
26
+ }
27
+ export function dockerHasImage(image) {
28
+ try {
29
+ execFileSync("docker", ["image", "inspect", image], { stdio: "ignore", timeout: 5000 });
30
+ return true;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ /**
37
+ * Ready where Docker has the sandbox image (`SANDBOX_IMAGE`). The image is not published, so
38
+ * without the check a fresh install would offer a tool that cannot start.
39
+ */
40
+ export const dockerEngine = {
41
+ name: "docker",
42
+ ready: () => dockerHasImage(env.sandboxImage),
43
+ capabilities: () => DOCKER_CAPABILITIES,
44
+ create: (runId) => dockerSandbox(runId, env.sandboxImage),
45
+ };
@@ -0,0 +1,52 @@
1
+ import { env } from "../env.js";
2
+ import { agentOsEngine } from "./agentos.js";
3
+ import { DOCKER_CAPABILITIES, dockerEngine } from "./docker.js";
4
+ /**
5
+ * The engines, in the order one is picked when `SANDBOX` names none. Another engine joins
6
+ * here: one of Mastra's sandboxes through MastraRunSandbox (mastra.ts), its package installed
7
+ * with `wizards sandbox add <name>` when it isn't a dependency of the runtime (install.ts).
8
+ */
9
+ export const ENGINES = [dockerEngine, agentOsEngine];
10
+ /**
11
+ * `off`: none. An engine's name: that one, ready or not; it says what is missing when a run
12
+ * uses it. Empty: the first engine that is ready here.
13
+ */
14
+ export function pickEngine(engines, requested) {
15
+ if (requested === "off") {
16
+ return null;
17
+ }
18
+ if (requested) {
19
+ const engine = engines.find((e) => e.name === requested);
20
+ if (!engine) {
21
+ console.warn(`SANDBOX=${requested} is no engine (${engines.map((e) => e.name).join(", ")} or off): the sandbox is off.`);
22
+ }
23
+ return engine ?? null;
24
+ }
25
+ return engines.find((e) => e.ready()) ?? null;
26
+ }
27
+ let picked = null;
28
+ /** The engine of this server, picked once at the first question. */
29
+ export function sandboxEngine() {
30
+ picked ??= { engine: pickEngine(ENGINES, env.sandbox) };
31
+ return picked.engine;
32
+ }
33
+ /** What this server's sandbox runs, or null when it is switched off. */
34
+ export function sandboxCapabilities() {
35
+ return sandboxEngine()?.capabilities() ?? null;
36
+ }
37
+ export function createSandbox(runId) {
38
+ const engine = sandboxEngine();
39
+ if (!engine) {
40
+ throw new Error("The sandbox is switched off on this server.");
41
+ }
42
+ return engine.create(runId);
43
+ }
44
+ export function shellToolDescription(caps) {
45
+ const notes = caps.notes ? ` ${caps.notes}` : "";
46
+ return `Run a shell command in a private Linux sandbox (${caps.commands.join(", ")}). Working directory ${caps.workdir}. Network: ${caps.network}.${notes}`;
47
+ }
48
+ /** The authoring guide's line about the sandbox tool. */
49
+ export function sandboxGuideLine() {
50
+ const uses = (sandboxCapabilities() ?? DOCKER_CAPABILITIES).uses;
51
+ return `- The sandbox runs code (python/node) for ${uses}; export_file hands files to the person.`;
52
+ }
@@ -0,0 +1,122 @@
1
+ import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { wizardsHome } from "../cli/home.js";
5
+ import { AGENTOS_PACKAGE } from "./agentos-package.js";
6
+ export const ENGINE_PACKAGES = {
7
+ agentos: AGENTOS_PACKAGE,
8
+ };
9
+ /** Written last: a folder without it is an install that did not finish. */
10
+ const MARKER = "engine.json";
11
+ /** Where the engines go: `SANDBOX_ENGINES_DIR`, else `~/.engenty/wizards/engines`. */
12
+ export function enginesDir(env = process.env) {
13
+ return resolve(env.SANDBOX_ENGINES_DIR?.trim() || join(wizardsHome(env), "engines"));
14
+ }
15
+ export const engineDir = (name, env = process.env) => join(enginesDir(env), name);
16
+ /** The version installed in `dir`, or null when nothing usable is there. */
17
+ export function installedVersion(dir) {
18
+ try {
19
+ const { version } = JSON.parse(readFileSync(join(dir, MARKER), "utf8"));
20
+ return typeof version === "string" ? version : null;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ /** The file an export map's entry names for `import`: conditions may nest (`import.default`). */
27
+ function importTarget(target) {
28
+ if (typeof target === "string") {
29
+ return target;
30
+ }
31
+ if (Array.isArray(target)) {
32
+ return target.map(importTarget).find(Boolean);
33
+ }
34
+ if (target && typeof target === "object") {
35
+ for (const condition of ["import", "node", "default"]) {
36
+ const found = importTarget(target[condition]);
37
+ if (found) {
38
+ return found;
39
+ }
40
+ }
41
+ }
42
+ return undefined;
43
+ }
44
+ /** A package of an engine's folder, for `import()`: its export map's `.`, else its main. */
45
+ export function packageEntry(dir, name) {
46
+ const root = join(dir, "node_modules", name);
47
+ const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
48
+ const { exports } = pkg;
49
+ const dot = exports && typeof exports === "object" && "." in exports ? exports["."] : exports;
50
+ return join(root, importTarget(dot) ?? pkg.main ?? "index.js");
51
+ }
52
+ /** Loads a package an engine installed; says how to install it when it isn't there. */
53
+ export async function importFromEngine(engine, dir, name) {
54
+ if (!installedVersion(dir)) {
55
+ throw new Error(`${engine} isn’t installed in ${dir}: wizards sandbox add ${engine}`);
56
+ }
57
+ return import(pathToFileURL(packageEntry(dir, name)).href);
58
+ }
59
+ /**
60
+ * Installs an engine into `dir` with the given npm, replacing what was there. Install scripts do
61
+ * not run; an engine that needs one does its work in `prepare`.
62
+ */
63
+ export async function installEngine(name, dir, npm) {
64
+ const engine = ENGINE_PACKAGES[name];
65
+ if (!engine) {
66
+ throw new Error(`There is no engine “${name}” to install. ${engineList()}`);
67
+ }
68
+ const unsupported = engine.unsupported?.();
69
+ if (unsupported) {
70
+ throw new Error(unsupported);
71
+ }
72
+ rmSync(dir, { recursive: true, force: true });
73
+ mkdirSync(dir, { recursive: true });
74
+ writeFileSync(join(dir, "package.json"), '{ "private": true }\n');
75
+ const result = await npm([
76
+ "install",
77
+ "--prefix",
78
+ dir,
79
+ "--no-audit",
80
+ "--no-fund",
81
+ "--ignore-scripts",
82
+ "--loglevel=error",
83
+ ...engine.packages,
84
+ ]);
85
+ if (result.code !== 0) {
86
+ throw new Error(`npm couldn’t install ${name}: ${result.tail.trim().split("\n").at(-1)}`);
87
+ }
88
+ engine.prepare?.(dir);
89
+ writeFileSync(join(dir, MARKER), `${JSON.stringify({ name, version: engine.version }, null, 2)}\n`);
90
+ return engine.version;
91
+ }
92
+ export function removeEngine(dir) {
93
+ rmSync(dir, { recursive: true, force: true });
94
+ }
95
+ export const engineList = () => `The engines to install: ${Object.keys(ENGINE_PACKAGES).join(", ")}.`;
96
+ /** `node apps/runtime/dist/sandbox/install.js agentos …`: an image or a checkout installs so. */
97
+ if (import.meta.main) {
98
+ const { spawn } = await import("node:child_process");
99
+ const npm = (args) => new Promise((resolve) => {
100
+ const child = spawn("npm", args, { stdio: ["ignore", "inherit", "inherit"] });
101
+ child.on("error", (err) => resolve({ code: 127, tail: err.message }));
102
+ child.on("close", (code) => resolve({ code: code ?? 1, tail: "" }));
103
+ });
104
+ const names = process.argv
105
+ .slice(2)
106
+ .flatMap((arg) => arg.split(","))
107
+ .filter(Boolean);
108
+ if (!names.length) {
109
+ console.error(`Name the engines to install. ${engineList()}`);
110
+ process.exitCode = 2;
111
+ }
112
+ for (const name of names) {
113
+ try {
114
+ const version = await installEngine(name, engineDir(name), npm);
115
+ console.log(`${name} ${version} is installed in ${engineDir(name)}.`);
116
+ }
117
+ catch (err) {
118
+ console.error(err.message);
119
+ process.exitCode = 1;
120
+ }
121
+ }
122
+ }
@@ -0,0 +1,71 @@
1
+ import { posix } from "node:path";
2
+ /** Bytes per append when a file is written through the shell; stays far below ARG_MAX. */
3
+ const WRITE_CHUNK = 48 * 1024;
4
+ const quote = (value) => `'${value.replaceAll("'", `'\\''`)}'`;
5
+ /**
6
+ * Makes one of Mastra's sandboxes (`WorkspaceSandbox`: @mastra/docker, @mastra/e2b,
7
+ * @mastra/daytona, …) the sandbox of a run. The provider is made on the first call and started
8
+ * once; an engine installed apart from the runtime passes a factory that loads it first.
9
+ *
10
+ * Files go through the shell (`base64`), which every provider runs, so they land as the user the
11
+ * commands run as.
12
+ */
13
+ export class MastraRunSandbox {
14
+ capabilities;
15
+ make;
16
+ provider = null;
17
+ constructor(capabilities, make) {
18
+ this.capabilities = capabilities;
19
+ this.make = make;
20
+ }
21
+ start() {
22
+ this.provider ??= (async () => {
23
+ const sandbox = await this.make();
24
+ if (!sandbox.executeCommand) {
25
+ throw new Error(`${sandbox.name} runs no commands.`);
26
+ }
27
+ await sandbox.start?.();
28
+ return sandbox;
29
+ })();
30
+ this.provider.catch(() => {
31
+ this.provider = null;
32
+ });
33
+ return this.provider;
34
+ }
35
+ async exec(command, options = {}) {
36
+ const sandbox = await this.start();
37
+ const result = await sandbox.executeCommand(command, [], {
38
+ timeout: options.timeoutMs,
39
+ cwd: options.cwd,
40
+ env: options.env,
41
+ });
42
+ const stderr = result.timedOut ? `${result.stderr}\ntimed out`.trim() : result.stderr;
43
+ return { exitCode: result.exitCode, stdout: result.stdout, stderr };
44
+ }
45
+ async writeFile(path, data) {
46
+ const target = quote(posix.resolve(this.capabilities.workdir, path));
47
+ const bytes = typeof data === "string" ? Buffer.from(data, "utf8") : Buffer.from(data);
48
+ await this.must(`mkdir -p "$(dirname ${target})" && : > ${target}`);
49
+ for (let at = 0; at < bytes.length; at += WRITE_CHUNK) {
50
+ const chunk = bytes.subarray(at, at + WRITE_CHUNK).toString("base64");
51
+ await this.must(`printf %s ${chunk} | base64 -d >> ${target}`);
52
+ }
53
+ }
54
+ async readFile(path) {
55
+ // No `-w0` and no file argument: macOS's base64 takes neither. Node skips the line breaks.
56
+ const result = await this.must(`base64 < ${quote(posix.resolve(this.capabilities.workdir, path))}`);
57
+ return Buffer.from(result.stdout, "base64");
58
+ }
59
+ async must(command) {
60
+ const result = await this.exec(command);
61
+ if (result.exitCode !== 0) {
62
+ throw new Error(result.stderr.trim() || `exit code ${result.exitCode}`);
63
+ }
64
+ return result;
65
+ }
66
+ async destroy() {
67
+ const provider = this.provider;
68
+ this.provider = null;
69
+ await (await provider?.catch(() => null))?.destroy?.();
70
+ }
71
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ import { createCipheriv, createDecipheriv, hkdfSync, randomBytes } from "node:crypto";
2
+ import { env } from "../env.js";
3
+ /** AES-256-GCM for what the store keeps secret (account tokens, passwords, browser sessions). */
4
+ const key = Buffer.from(hkdfSync("sha256", env.storeKey || env.authSecret, "engenty-wizards", "store-secrets", 32));
5
+ export function seal(value) {
6
+ const iv = randomBytes(12);
7
+ const cipher = createCipheriv("aes-256-gcm", key, iv);
8
+ const body = Buffer.concat([cipher.update(JSON.stringify(value), "utf8"), cipher.final()]);
9
+ return `v1.${iv.toString("base64url")}.${cipher.getAuthTag().toString("base64url")}.${body.toString("base64url")}`;
10
+ }
11
+ export function unseal(sealed) {
12
+ const [version, iv, tag, body] = sealed.split(".");
13
+ if (version !== "v1" || !iv || !tag || !body) {
14
+ return null;
15
+ }
16
+ try {
17
+ const decipher = createDecipheriv("aes-256-gcm", key, Buffer.from(iv, "base64url"));
18
+ decipher.setAuthTag(Buffer.from(tag, "base64url"));
19
+ const plain = Buffer.concat([
20
+ decipher.update(Buffer.from(body, "base64url")),
21
+ decipher.final(),
22
+ ]);
23
+ return JSON.parse(plain.toString("utf8"));
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }