@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,540 @@
1
+ import { execFile, execFileSync } from "node:child_process";
2
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { delimiter, dirname, join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { installedByScript, packageRoot } from "./home.js";
7
+ import { findOnPath, macAppPresent } from "./machine.js";
8
+ import { bad, cmd, dim, ok, tilde } from "./ui.js";
9
+ const run = promisify(execFile);
10
+ /**
11
+ * The wizards in the person's own AI apps: `wizards connect` writes this install's MCP
12
+ * server into each app's config, as the command `wizards mcp` (stdio). Every app starts
13
+ * servers that way; the command finds the running runtime itself and signs in with the data
14
+ * folder's secret, so a config holds neither a port nor a key.
15
+ */
16
+ /** The name the server has in every app's config. */
17
+ export const SERVER_NAME = "engenty-wizards";
18
+ /**
19
+ * How an app starts this install's MCP server. An install made by install.sh has a command that
20
+ * stays where it is across updates; any other copy is started by its Node and its script. The
21
+ * studio connects apps too: from the runtime, which is not the command.
22
+ */
23
+ export function serverCommand(paths, script = join(packageRoot, "bin", "wizards.mjs")) {
24
+ const moved = dirname(paths.home) !== join(homedir(), ".engenty");
25
+ const env = moved ? { env: { ENGENTY_HOME: dirname(paths.home) } } : {};
26
+ if (installedByScript(paths)) {
27
+ return { command: join(paths.bin, "wizards"), args: ["mcp"], ...env };
28
+ }
29
+ return { command: process.execPath, args: [script, "mcp"], ...env };
30
+ }
31
+ /** A JSON config with the server set under `at` (e.g. ["mcpServers"]); null when it is no JSON. */
32
+ export function withJsonServer(text, at, entry, name = SERVER_NAME) {
33
+ let root;
34
+ try {
35
+ root = text?.trim() ? JSON.parse(text) : {};
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ if (!root || typeof root !== "object" || Array.isArray(root)) {
41
+ return null;
42
+ }
43
+ let node = root;
44
+ for (const key of at) {
45
+ const next = node[key];
46
+ if (!next || typeof next !== "object" || Array.isArray(next)) {
47
+ node[key] = {};
48
+ }
49
+ node = node[key];
50
+ }
51
+ node[name] = entry;
52
+ return `${JSON.stringify(root, null, 2)}\n`;
53
+ }
54
+ /** The same config without the server; null when it is no JSON. */
55
+ export function withoutJsonServer(text, at, name = SERVER_NAME) {
56
+ let root;
57
+ try {
58
+ root = JSON.parse(text);
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ let node = root;
64
+ for (const key of at) {
65
+ node = node?.[key];
66
+ }
67
+ if (node && typeof node === "object") {
68
+ delete node[name];
69
+ }
70
+ return `${JSON.stringify(root, null, 2)}\n`;
71
+ }
72
+ export function jsonHasServer(text, at, name = SERVER_NAME) {
73
+ try {
74
+ let node = JSON.parse(text);
75
+ for (const key of at) {
76
+ node = node?.[key];
77
+ }
78
+ return Boolean(node && typeof node === "object" && name in node);
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ }
84
+ const tomlString = (value) => JSON.stringify(value);
85
+ /** A TOML config (Codex) without the server's tables `[mcp_servers.<name>]` and below. */
86
+ export function withoutTomlServer(text, name = SERVER_NAME) {
87
+ const lines = text.split("\n");
88
+ const out = [];
89
+ let skipping = false;
90
+ for (const line of lines) {
91
+ const table = line.match(/^\s*\[\[?\s*([^\]]+?)\s*\]\]?\s*(#.*)?$/)?.[1];
92
+ if (table !== undefined) {
93
+ const key = table.replaceAll('"', "");
94
+ skipping = key === `mcp_servers.${name}` || key.startsWith(`mcp_servers.${name}.`);
95
+ }
96
+ if (!skipping) {
97
+ out.push(line);
98
+ }
99
+ }
100
+ return out.join("\n").replace(/\n{3,}$/, "\n\n");
101
+ }
102
+ export function withTomlServer(text, server, name = SERVER_NAME) {
103
+ const rest = withoutTomlServer(text ?? "", name).trimEnd();
104
+ const table = [
105
+ `[mcp_servers.${name}]`,
106
+ `command = ${tomlString(server.command)}`,
107
+ `args = [${server.args.map(tomlString).join(", ")}]`,
108
+ // A run waits up to 45 s for a step; the default of 60 s leaves room for it.
109
+ "tool_timeout_sec = 120",
110
+ ...(server.env
111
+ ? [
112
+ `env = { ${Object.entries(server.env)
113
+ .map(([key, value]) => `${key} = ${tomlString(value)}`)
114
+ .join(", ")} }`,
115
+ ]
116
+ : []),
117
+ ].join("\n");
118
+ return `${rest ? `${rest}\n\n` : ""}${table}\n`;
119
+ }
120
+ export function tomlHasServer(text, name = SERVER_NAME) {
121
+ return text.split("\n").some((line) => line.trim() === `[mcp_servers.${name}]`);
122
+ }
123
+ /** Goose's YAML: the server's block below `extensions:`, at two spaces. */
124
+ export function withoutYamlExtension(text, name = SERVER_NAME) {
125
+ const lines = text.split("\n");
126
+ const out = [];
127
+ let skipping = false;
128
+ for (const line of lines) {
129
+ if (line === ` ${name}:`) {
130
+ skipping = true;
131
+ continue;
132
+ }
133
+ if (skipping && line.trim() && !line.startsWith(" ")) {
134
+ skipping = false;
135
+ }
136
+ if (!skipping) {
137
+ out.push(line);
138
+ }
139
+ }
140
+ return out.join("\n");
141
+ }
142
+ export function withYamlExtension(text, server, name = SERVER_NAME) {
143
+ const quote = (value) => JSON.stringify(value);
144
+ const block = [
145
+ ` ${name}:`,
146
+ ` name: ${name}`,
147
+ " type: stdio",
148
+ ` cmd: ${quote(server.command)}`,
149
+ ` args: [${server.args.map(quote).join(", ")}]`,
150
+ " enabled: true",
151
+ " timeout: 300",
152
+ ...(server.env
153
+ ? [
154
+ " envs:",
155
+ ...Object.entries(server.env).map(([key, value]) => ` ${key}: ${quote(value)}`),
156
+ ]
157
+ : []),
158
+ ];
159
+ const lines = withoutYamlExtension(text ?? "", name).split("\n");
160
+ const at = lines.findIndex((line) => /^extensions:\s*(\{\s*\})?\s*$/.test(line));
161
+ if (at === -1) {
162
+ const rest = lines.join("\n").trimEnd();
163
+ return `${rest ? `${rest}\n` : ""}extensions:\n${block.join("\n")}\n`;
164
+ }
165
+ lines[at] = "extensions:";
166
+ lines.splice(at + 1, 0, ...block);
167
+ return lines.join("\n");
168
+ }
169
+ export function yamlHasExtension(text, name = SERVER_NAME) {
170
+ return text.split("\n").includes(` ${name}:`);
171
+ }
172
+ const home = homedir();
173
+ const appData = process.env.APPDATA || join(home, "AppData", "Roaming");
174
+ /** A folder below the per-user application data: Library/Application Support, %APPDATA%, ~/.config. */
175
+ function appSupport(...parts) {
176
+ if (process.platform === "darwin") {
177
+ return join(home, "Library", "Application Support", ...parts);
178
+ }
179
+ if (process.platform === "win32") {
180
+ return join(appData, ...parts);
181
+ }
182
+ return join(process.env.XDG_CONFIG_HOME || join(home, ".config"), ...parts);
183
+ }
184
+ /** Claude Desktop's main process, as `ps` (macOS) or `tasklist` (Windows) names it. */
185
+ const CLAUDE_DESKTOP_PROCESS = {
186
+ darwin: /\/Claude\.app\/Contents\/MacOS\/Claude$/m,
187
+ win32: /^"?Claude\.exe"?,/im,
188
+ };
189
+ /** Whether an app's process runs; false where it cannot be told (Linux, no `ps`). */
190
+ export function processRunning(names, platform = process.platform, list = () => platform === "win32"
191
+ ? execFileSync("tasklist", ["/FO", "CSV", "/NH"], { encoding: "utf8" })
192
+ : execFileSync("ps", ["-axo", "comm"], { encoding: "utf8" })) {
193
+ const pattern = names[platform];
194
+ if (!pattern) {
195
+ return false;
196
+ }
197
+ try {
198
+ return pattern.test(list());
199
+ }
200
+ catch {
201
+ return false;
202
+ }
203
+ }
204
+ const read = (file) => (existsSync(file) ? readFileSync(file, "utf8") : null);
205
+ /** Writes a config, keeping the version before it once next to it. */
206
+ function save(file, text) {
207
+ mkdirSync(dirname(file), { recursive: true });
208
+ if (existsSync(file)) {
209
+ copyFileSync(file, `${file}.before-engenty`);
210
+ }
211
+ writeFileSync(file, text);
212
+ }
213
+ function jsonApp(def) {
214
+ const running = () => def.ownsFileWhileRunning?.()
215
+ ? {
216
+ ok: false,
217
+ message: `${def.name} is running and would overwrite its settings. Quit it completely, then try again.`,
218
+ }
219
+ : null;
220
+ const snippet = (server) => JSON.stringify(def.at.reduceRight((inner, key) => ({ [key]: inner }), {
221
+ [SERVER_NAME]: def.entry(server),
222
+ }), null, 2);
223
+ return {
224
+ id: def.id,
225
+ name: def.name,
226
+ widgets: def.widgets,
227
+ where: def.file,
228
+ installed: () => existsSync(def.marker) &&
229
+ (process.platform !== "darwin" || !def.macApp || macAppPresent(def.macApp)),
230
+ connected: async () => jsonHasServer(read(def.file) ?? "", def.at),
231
+ async connect(server) {
232
+ const busy = running();
233
+ if (busy) {
234
+ return busy;
235
+ }
236
+ const next = withJsonServer(read(def.file), def.at, def.entry(server));
237
+ if (next === null) {
238
+ return {
239
+ ok: false,
240
+ message: `${tilde(def.file)} isn’t plain JSON (comments?). Add this to it yourself:`,
241
+ snippet: snippet(server),
242
+ };
243
+ }
244
+ save(def.file, next);
245
+ return { ok: true, message: `added to ${tilde(def.file)}` };
246
+ },
247
+ async disconnect() {
248
+ const text = read(def.file);
249
+ if (!text || !jsonHasServer(text, def.at)) {
250
+ return { ok: true, message: "wasn’t connected" };
251
+ }
252
+ const busy = running();
253
+ if (busy) {
254
+ return busy;
255
+ }
256
+ const next = withoutJsonServer(text, def.at);
257
+ if (next === null) {
258
+ return {
259
+ ok: false,
260
+ message: `${tilde(def.file)} isn’t plain JSON. Remove “${SERVER_NAME}” from it yourself.`,
261
+ };
262
+ }
263
+ save(def.file, next);
264
+ return { ok: true, message: `removed from ${tilde(def.file)}` };
265
+ },
266
+ };
267
+ }
268
+ const stdioEntry = (server) => ({
269
+ command: server.command,
270
+ args: server.args,
271
+ ...(server.env ? { env: server.env } : {}),
272
+ });
273
+ /** A command of an app: on the PATH, or among the clients this install brought. */
274
+ function appCommand(paths, name) {
275
+ return findOnPath(name, [join(paths.clients, "bin"), process.env.PATH ?? ""].join(delimiter));
276
+ }
277
+ function claudeCode(paths) {
278
+ const file = join(home, ".claude.json");
279
+ return {
280
+ id: "claude-code",
281
+ name: "Claude Code",
282
+ widgets: false,
283
+ where: "claude mcp (user scope)",
284
+ installed: () => Boolean(appCommand(paths, "claude")),
285
+ connected: async () => jsonHasServer(read(file) ?? "", ["mcpServers"]),
286
+ async connect(server) {
287
+ const claude = appCommand(paths, "claude");
288
+ if (!claude) {
289
+ return { ok: false, message: "The claude command wasn’t found." };
290
+ }
291
+ // Claude Code keeps rewriting its own file: its command changes it, not we.
292
+ await run(claude, ["mcp", "remove", "--scope", "user", SERVER_NAME]).catch(() => undefined);
293
+ try {
294
+ await run(claude, [
295
+ "mcp",
296
+ "add",
297
+ "--scope",
298
+ "user",
299
+ // The name before `-e`: claude's `-e` takes every value up to the next option, so a
300
+ // name after it is read as one more variable.
301
+ SERVER_NAME,
302
+ ...Object.entries(server.env ?? {}).flatMap(([key, value]) => ["-e", `${key}=${value}`]),
303
+ "--",
304
+ server.command,
305
+ ...server.args,
306
+ ]);
307
+ return { ok: true, message: "added with claude mcp add --scope user" };
308
+ }
309
+ catch (error) {
310
+ // claude's own words say what was wrong; "Command failed: …" only repeats the command.
311
+ const said = String(error.stderr ?? "").trim();
312
+ return { ok: false, message: (said || error.message).split("\n")[0] };
313
+ }
314
+ },
315
+ async disconnect() {
316
+ const claude = appCommand(paths, "claude");
317
+ if (!claude) {
318
+ return { ok: true, message: "wasn’t connected" };
319
+ }
320
+ await run(claude, ["mcp", "remove", "--scope", "user", SERVER_NAME]).catch(() => undefined);
321
+ return { ok: true, message: "removed with claude mcp remove" };
322
+ },
323
+ };
324
+ }
325
+ function codex() {
326
+ const dir = process.env.CODEX_HOME || join(home, ".codex");
327
+ const file = join(dir, "config.toml");
328
+ return {
329
+ id: "codex",
330
+ name: "Codex · ChatGPT app",
331
+ widgets: false,
332
+ where: file,
333
+ installed: () => existsSync(dir),
334
+ connected: async () => tomlHasServer(read(file) ?? ""),
335
+ async connect(server) {
336
+ save(file, withTomlServer(read(file), server));
337
+ return { ok: true, message: `added to ${tilde(file)}` };
338
+ },
339
+ async disconnect() {
340
+ const text = read(file);
341
+ if (!text || !tomlHasServer(text)) {
342
+ return { ok: true, message: "wasn’t connected" };
343
+ }
344
+ save(file, withoutTomlServer(text));
345
+ return { ok: true, message: `removed from ${tilde(file)}` };
346
+ },
347
+ };
348
+ }
349
+ function goose() {
350
+ const dir = process.platform === "win32"
351
+ ? join(appData, "Block", "goose", "config")
352
+ : join(process.env.XDG_CONFIG_HOME || join(home, ".config"), "goose");
353
+ const file = join(dir, "config.yaml");
354
+ return {
355
+ id: "goose",
356
+ name: "Goose",
357
+ widgets: true,
358
+ where: file,
359
+ installed: () => existsSync(dir),
360
+ connected: async () => yamlHasExtension(read(file) ?? ""),
361
+ async connect(server) {
362
+ save(file, withYamlExtension(read(file), server));
363
+ return { ok: true, message: `added to ${tilde(file)}` };
364
+ },
365
+ async disconnect() {
366
+ const text = read(file);
367
+ if (!text || !yamlHasExtension(text)) {
368
+ return { ok: true, message: "wasn’t connected" };
369
+ }
370
+ save(file, withoutYamlExtension(text));
371
+ return { ok: true, message: `removed from ${tilde(file)}` };
372
+ },
373
+ };
374
+ }
375
+ function openClaw(paths) {
376
+ const dir = join(home, ".openclaw");
377
+ const file = join(dir, "openclaw.json");
378
+ const json = jsonApp({
379
+ id: "openclaw",
380
+ name: "OpenClaw",
381
+ widgets: false,
382
+ file,
383
+ marker: dir,
384
+ at: ["mcp", "servers"],
385
+ entry: stdioEntry,
386
+ });
387
+ return {
388
+ ...json,
389
+ // Its config is JSON5: its own command writes it when it is there.
390
+ async connect(server) {
391
+ const openclaw = appCommand(paths, "openclaw");
392
+ if (!openclaw) {
393
+ return json.connect(server);
394
+ }
395
+ try {
396
+ await run(openclaw, [
397
+ "mcp",
398
+ "set",
399
+ SERVER_NAME,
400
+ "--command",
401
+ server.command,
402
+ "--args",
403
+ ...server.args,
404
+ ]);
405
+ return { ok: true, message: "added with openclaw mcp set" };
406
+ }
407
+ catch (error) {
408
+ return { ok: false, message: error.message.split("\n")[0] };
409
+ }
410
+ },
411
+ async disconnect() {
412
+ const openclaw = appCommand(paths, "openclaw");
413
+ if (!openclaw) {
414
+ return json.disconnect();
415
+ }
416
+ await run(openclaw, ["mcp", "unset", SERVER_NAME]).catch(() => undefined);
417
+ return { ok: true, message: "removed with openclaw mcp unset" };
418
+ },
419
+ };
420
+ }
421
+ /** The AI apps this install can connect to, in the order they are offered. */
422
+ export function apps(paths) {
423
+ const vscodeUser = appSupport("Code", "User");
424
+ return [
425
+ jsonApp({
426
+ id: "claude-desktop",
427
+ name: "Claude Desktop",
428
+ widgets: true,
429
+ file: join(appSupport("Claude"), "claude_desktop_config.json"),
430
+ marker: appSupport("Claude"),
431
+ macApp: "Claude",
432
+ at: ["mcpServers"],
433
+ entry: stdioEntry,
434
+ ownsFileWhileRunning: () => processRunning(CLAUDE_DESKTOP_PROCESS),
435
+ }),
436
+ claudeCode(paths),
437
+ codex(),
438
+ jsonApp({
439
+ id: "cursor",
440
+ name: "Cursor",
441
+ widgets: true,
442
+ file: join(home, ".cursor", "mcp.json"),
443
+ marker: join(home, ".cursor"),
444
+ at: ["mcpServers"],
445
+ entry: stdioEntry,
446
+ }),
447
+ jsonApp({
448
+ id: "vscode",
449
+ name: "VS Code (Copilot)",
450
+ widgets: true,
451
+ file: join(vscodeUser, "mcp.json"),
452
+ marker: vscodeUser,
453
+ macApp: "Visual Studio Code",
454
+ at: ["servers"],
455
+ entry: (server) => ({ type: "stdio", ...stdioEntry(server) }),
456
+ }),
457
+ jsonApp({
458
+ id: "windsurf",
459
+ name: "Windsurf",
460
+ widgets: false,
461
+ file: join(home, ".codeium", "windsurf", "mcp_config.json"),
462
+ marker: join(home, ".codeium", "windsurf"),
463
+ macApp: "Windsurf",
464
+ at: ["mcpServers"],
465
+ entry: stdioEntry,
466
+ }),
467
+ jsonApp({
468
+ id: "antigravity",
469
+ name: "Antigravity",
470
+ widgets: false,
471
+ // The app and its CLI (agy) read the same file.
472
+ file: join(home, ".gemini", "config", "mcp_config.json"),
473
+ marker: join(home, ".gemini", "config"),
474
+ at: ["mcpServers"],
475
+ entry: stdioEntry,
476
+ }),
477
+ goose(),
478
+ openClaw(paths),
479
+ jsonApp({
480
+ id: "lm-studio",
481
+ name: "LM Studio",
482
+ widgets: false,
483
+ file: join(home, ".lmstudio", "mcp.json"),
484
+ marker: join(home, ".lmstudio"),
485
+ at: ["mcpServers"],
486
+ entry: stdioEntry,
487
+ }),
488
+ ];
489
+ }
490
+ export async function appStates(paths) {
491
+ return Promise.all(apps(paths).map(async (app) => ({
492
+ id: app.id,
493
+ name: app.name,
494
+ widgets: app.widgets,
495
+ where: app.where,
496
+ installed: app.installed(),
497
+ connected: await app.connected(),
498
+ })));
499
+ }
500
+ /** `wizards connect [app …]` and `disconnect`: what was done, app by app. */
501
+ export async function connectCommand(paths, ids, remove) {
502
+ const unknown = ids.filter((id) => !apps(paths).some((app) => app.id === id));
503
+ if (unknown.length) {
504
+ console.error(`Unknown app ${unknown.map((id) => `“${id}”`).join(", ")}. Choose from: ${apps(paths)
505
+ .map((app) => app.id)
506
+ .join(", ")}.`);
507
+ return 2;
508
+ }
509
+ const results = await connectApps(paths, ids, remove);
510
+ if (!results.length) {
511
+ console.log(`No AI app found on this computer. Name one: ${cmd("connect cursor")}`);
512
+ return 0;
513
+ }
514
+ for (const { app, outcome } of results) {
515
+ console.log(`${outcome.ok ? ok : bad} ${app.name.padEnd(22)} ${dim(outcome.message)}`);
516
+ if (!outcome.ok && outcome.snippet) {
517
+ console.log(outcome.snippet);
518
+ }
519
+ }
520
+ if (!remove && results.some((r) => r.outcome.ok)) {
521
+ console.log("");
522
+ console.log(dim("Restart the app (or reload its MCP servers) to see the wizards in it."));
523
+ console.log(dim("Claude Desktop, Cursor, VS Code and Goose show a run as a widget, the others as text."));
524
+ }
525
+ return results.every((r) => r.outcome.ok) ? 0 : 1;
526
+ }
527
+ /** Connects (or disconnects) the named apps; without names every app found on this machine. */
528
+ export async function connectApps(paths, ids, remove = false) {
529
+ const all = apps(paths);
530
+ const picked = ids.length
531
+ ? all.filter((app) => ids.includes(app.id))
532
+ : all.filter((app) => app.installed());
533
+ const server = serverCommand(paths);
534
+ const out = [];
535
+ for (const app of picked) {
536
+ const outcome = await (remove ? app.disconnect() : app.connect(server)).catch((error) => ({ ok: false, message: error.message }));
537
+ out.push({ app, outcome });
538
+ }
539
+ return out;
540
+ }
@@ -0,0 +1,95 @@
1
+ import { basename, delimiter, dirname, join } from "node:path";
2
+ import { isCI } from "./autoupdate.js";
3
+ /**
4
+ * Variables of the terminal the runtime inherits. Everything else it gets comes from the
5
+ * install's `.env` or is set by the command line. A key or a database address that the shell
6
+ * happens to export for another project never reaches it; in particular it never sees
7
+ * `MANAGE_URL`, which would make it a cloud runtime.
8
+ */
9
+ const INHERITED = new Set([
10
+ "HOME",
11
+ "USER",
12
+ "LOGNAME",
13
+ "SHELL",
14
+ "TMPDIR",
15
+ "LANG",
16
+ "LC_ALL",
17
+ "LC_CTYPE",
18
+ "TERM",
19
+ "COLORTERM",
20
+ "HTTP_PROXY",
21
+ "HTTPS_PROXY",
22
+ "NO_PROXY",
23
+ "http_proxy",
24
+ "https_proxy",
25
+ "no_proxy",
26
+ "SSL_CERT_FILE",
27
+ "NODE_EXTRA_CA_CERTS",
28
+ // Settings of this install somebody may give for one start: `API_PORT=8900 wizards`.
29
+ "API_HOST",
30
+ "APP_URL",
31
+ "ALLOWED_HOSTS",
32
+ "SECRETS",
33
+ "CHROME_PATH",
34
+ "FFMPEG_PATH",
35
+ "OLLAMA_URL",
36
+ "SANDBOX",
37
+ "SANDBOX_ENABLED",
38
+ "SANDBOX_IMAGE",
39
+ "SANDBOX_ALLOW_HOSTS",
40
+ "SANDBOX_ENGINES_DIR",
41
+ "PLUGINS_DIR",
42
+ "PLUGINS_WATCH",
43
+ "ACCOUNT_URL",
44
+ "ACCOUNT_GATEWAY_URL",
45
+ "CLOUD_URL",
46
+ // Off for this start (autoupdate.ts).
47
+ "WIZARDS_DISABLE_AUTOUPDATE",
48
+ ]);
49
+ export function inherited(env) {
50
+ const out = {};
51
+ for (const [key, value] of Object.entries(env)) {
52
+ if (value !== undefined && (INHERITED.has(key) || key.startsWith("MODEL_"))) {
53
+ out[key] = value;
54
+ }
55
+ }
56
+ return out;
57
+ }
58
+ /**
59
+ * The PATH of the runtime: AI clients the setup installed and the Node that runs this command
60
+ * come first — a client installed with npm is a script that asks for `node`.
61
+ */
62
+ export function runtimePath(paths, env, node = process.execPath) {
63
+ const entries = [
64
+ join(paths.clients, "bin"),
65
+ dirname(node),
66
+ ...(env.PATH ?? "").split(delimiter),
67
+ join(env.HOME ?? "", ".local", "bin"),
68
+ ];
69
+ return [...new Set(entries.filter(Boolean))].join(delimiter);
70
+ }
71
+ /**
72
+ * The environment the command line starts the runtime with. `fileEnv` is the install's `.env`:
73
+ * the runtime reads it itself, it is only looked at here so that a default does not override it.
74
+ */
75
+ export function runtimeEnv(paths, start, env = process.env, fileEnv = {}, platform = process.platform) {
76
+ const secretsGiven = env.SECRETS !== undefined || fileEnv.SECRETS !== undefined;
77
+ const pluginsGiven = env.PLUGINS_DIR !== undefined || fileEnv.PLUGINS_DIR !== undefined;
78
+ return {
79
+ // Plugins live beside the data, in the install's own folder.
80
+ ...(pluginsGiven ? {} : { PLUGINS_DIR: paths.plugins }),
81
+ ...inherited(env),
82
+ PATH: runtimePath(paths, env),
83
+ NODE_ENV: "production",
84
+ API_PORT: String(start.port),
85
+ APP_URL: start.url,
86
+ DATA_DIR: start.dataDir,
87
+ LOCAL_ACCESS_KEY: start.accessKey,
88
+ // The install the runtime belongs to: the studio connects AI apps to its command.
89
+ ...(basename(paths.home) === "wizards" ? { ENGENTY_HOME: dirname(paths.home) } : {}),
90
+ // The runtime sees no CI variables; it is told so, and checks for no updates (autoupdate.ts).
91
+ ...(isCI(env) ? { ENGENTY_WIZARDS_CI: "1" } : {}),
92
+ // Keys entered in the settings live in the Keychain, as with the desktop app.
93
+ ...(platform === "darwin" && !secretsGiven ? { SECRETS: "keychain" } : {}),
94
+ };
95
+ }
@@ -0,0 +1,45 @@
1
+ import { spawn } from "node:child_process";
2
+ import { appendFileSync, mkdirSync } from "node:fs";
3
+ import { dirname } from "node:path";
4
+ /**
5
+ * Runs a command; what it prints goes line by line to `onLine` and into the log file.
6
+ * Never rejects for a command that fails: the caller reads `code`.
7
+ */
8
+ export function runLogged(command, args, options = {}) {
9
+ const { logFile, onLine } = options;
10
+ if (logFile) {
11
+ mkdirSync(dirname(logFile), { recursive: true });
12
+ appendFileSync(logFile, `\n$ ${command} ${args.join(" ")}\n`);
13
+ }
14
+ return new Promise((resolve) => {
15
+ let tail = "";
16
+ let pending = "";
17
+ const take = (chunk) => {
18
+ const text = chunk.toString("utf8");
19
+ tail = (tail + text).slice(-4000);
20
+ if (logFile) {
21
+ appendFileSync(logFile, text);
22
+ }
23
+ pending += text;
24
+ const lines = pending.split(/\r?\n|\r/);
25
+ pending = lines.pop() ?? "";
26
+ for (const line of lines) {
27
+ if (line.trim()) {
28
+ onLine?.(line);
29
+ }
30
+ }
31
+ };
32
+ const child = spawn(command, args, {
33
+ env: options.env,
34
+ cwd: options.cwd,
35
+ stdio: ["ignore", "pipe", "pipe"],
36
+ });
37
+ child.stdout.on("data", take);
38
+ child.stderr.on("data", take);
39
+ child.on("error", (error) => {
40
+ tail = `${tail}\n${error.message}`.trim();
41
+ resolve({ code: 127, tail });
42
+ });
43
+ child.on("close", (code) => resolve({ code: code ?? 1, tail: tail.trim() }));
44
+ });
45
+ }