@engenty/wizards-runtime 0.0.0-stage → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +214 -2
  3. package/apps/runtime/dist/agents/architect.js +444 -0
  4. package/apps/runtime/dist/agents/studio-assistant.js +883 -0
  5. package/apps/runtime/dist/agents/subscription.js +207 -0
  6. package/apps/runtime/dist/agents/thought.js +21 -0
  7. package/apps/runtime/dist/agents/website.js +480 -0
  8. package/apps/runtime/dist/app.js +359 -0
  9. package/apps/runtime/dist/apple/wizards-apple +0 -0
  10. package/apps/runtime/dist/assistant/browser.js +26 -0
  11. package/apps/runtime/dist/assistant/docs.js +158 -0
  12. package/apps/runtime/dist/assistant/knows.js +353 -0
  13. package/apps/runtime/dist/assistant/primer.js +26 -0
  14. package/apps/runtime/dist/assistant/runs.js +24 -0
  15. package/apps/runtime/dist/auth/account.js +175 -0
  16. package/apps/runtime/dist/auth/device.js +112 -0
  17. package/apps/runtime/dist/auth/index.js +358 -0
  18. package/apps/runtime/dist/auth/keys.js +55 -0
  19. package/apps/runtime/dist/auth/local-ticket.js +26 -0
  20. package/apps/runtime/dist/authoring/example.js +74 -0
  21. package/apps/runtime/dist/authoring/guide.js +433 -0
  22. package/apps/runtime/dist/authoring/ops.js +117 -0
  23. package/apps/runtime/dist/browser/fast/action-space.js +160 -0
  24. package/apps/runtime/dist/browser/fast/classifier.js +91 -0
  25. package/apps/runtime/dist/browser/fast/decide.js +171 -0
  26. package/apps/runtime/dist/browser/fast/driver.js +141 -0
  27. package/apps/runtime/dist/browser/fast/instructions.js +33 -0
  28. package/apps/runtime/dist/browser/fast/run.js +249 -0
  29. package/apps/runtime/dist/browser/fast/span-picker.js +153 -0
  30. package/apps/runtime/dist/browser/fast/text-helper.js +178 -0
  31. package/apps/runtime/dist/browser/snapshot.js +335 -0
  32. package/apps/runtime/dist/cli/account.js +385 -0
  33. package/apps/runtime/dist/cli/autostart.js +182 -0
  34. package/apps/runtime/dist/cli/autoupdate.js +221 -0
  35. package/apps/runtime/dist/cli/clients.js +44 -0
  36. package/apps/runtime/dist/cli/connect.js +540 -0
  37. package/apps/runtime/dist/cli/environment.js +93 -0
  38. package/apps/runtime/dist/cli/exec.js +45 -0
  39. package/apps/runtime/dist/cli/features.js +50 -0
  40. package/apps/runtime/dist/cli/home.js +88 -0
  41. package/apps/runtime/dist/cli/install-env.js +33 -0
  42. package/apps/runtime/dist/cli/machine.js +107 -0
  43. package/apps/runtime/dist/cli/main.js +222 -0
  44. package/apps/runtime/dist/cli/mcp.js +136 -0
  45. package/apps/runtime/dist/cli/menu.js +202 -0
  46. package/apps/runtime/dist/cli/processes.js +72 -0
  47. package/apps/runtime/dist/cli/report.js +66 -0
  48. package/apps/runtime/dist/cli/setup.js +335 -0
  49. package/apps/runtime/dist/cli/start.js +276 -0
  50. package/apps/runtime/dist/cli/status.js +203 -0
  51. package/apps/runtime/dist/cli/ui.js +59 -0
  52. package/apps/runtime/dist/cli/uninstall-main.js +20 -0
  53. package/apps/runtime/dist/cli/uninstall.js +231 -0
  54. package/apps/runtime/dist/cli/update.js +86 -0
  55. package/apps/runtime/dist/cli/validate.js +75 -0
  56. package/apps/runtime/dist/cli/versions.js +123 -0
  57. package/apps/runtime/dist/connectors/builtin.js +86 -0
  58. package/apps/runtime/dist/connectors/external.js +409 -0
  59. package/apps/runtime/dist/connectors/gmail.js +107 -0
  60. package/apps/runtime/dist/connectors/imap.js +261 -0
  61. package/apps/runtime/dist/connectors/index.js +325 -0
  62. package/apps/runtime/dist/connectors/mail.js +72 -0
  63. package/apps/runtime/dist/connectors/outlook.js +90 -0
  64. package/apps/runtime/dist/connectors/plugin-connections.js +343 -0
  65. package/apps/runtime/dist/connectors/via-account.js +65 -0
  66. package/apps/runtime/dist/credits/credits.js +100 -0
  67. package/apps/runtime/dist/credits/estimate.js +152 -0
  68. package/apps/runtime/dist/db/adopt.js +149 -0
  69. package/apps/runtime/dist/db/client.js +173 -0
  70. package/apps/runtime/dist/db/control-schema.js +133 -0
  71. package/apps/runtime/dist/db/migrations/control/0000_last_absorbing_man.sql +47 -0
  72. package/apps/runtime/dist/db/migrations/control/0001_gorgeous_nicolaos.sql +41 -0
  73. package/apps/runtime/dist/db/migrations/control/0002_secret_penance.sql +1 -0
  74. package/apps/runtime/dist/db/migrations/control/0003_nasty_mordo.sql +3 -0
  75. package/apps/runtime/dist/db/migrations/control/0004_breezy_eddie_brock.sql +6 -0
  76. package/apps/runtime/dist/db/migrations/control/0005_chilly_oracle.sql +1 -0
  77. package/apps/runtime/dist/db/migrations/control/0006_sleepy_mojo.sql +1 -0
  78. package/apps/runtime/dist/db/migrations/control/0007_common_the_hand.sql +15 -0
  79. package/apps/runtime/dist/db/migrations/control/0008_runner.sql +8 -0
  80. package/apps/runtime/dist/db/migrations/control/0009_plugin_claim.sql +9 -0
  81. package/apps/runtime/dist/db/migrations/control/0010_tan_snowbird.sql +6 -0
  82. package/apps/runtime/dist/db/migrations/control/meta/0000_snapshot.json +311 -0
  83. package/apps/runtime/dist/db/migrations/control/meta/0001_snapshot.json +599 -0
  84. package/apps/runtime/dist/db/migrations/control/meta/0002_snapshot.json +607 -0
  85. package/apps/runtime/dist/db/migrations/control/meta/0003_snapshot.json +311 -0
  86. package/apps/runtime/dist/db/migrations/control/meta/0004_snapshot.json +350 -0
  87. package/apps/runtime/dist/db/migrations/control/meta/0005_snapshot.json +358 -0
  88. package/apps/runtime/dist/db/migrations/control/meta/0006_snapshot.json +365 -0
  89. package/apps/runtime/dist/db/migrations/control/meta/0007_snapshot.json +460 -0
  90. package/apps/runtime/dist/db/migrations/control/meta/0008_snapshot.json +505 -0
  91. package/apps/runtime/dist/db/migrations/control/meta/0009_snapshot.json +561 -0
  92. package/apps/runtime/dist/db/migrations/control/meta/0010_snapshot.json +600 -0
  93. package/apps/runtime/dist/db/migrations/control/meta/_journal.json +83 -0
  94. package/apps/runtime/dist/db/migrations/tenant/0000_eminent_freak.sql +188 -0
  95. package/apps/runtime/dist/db/migrations/tenant/0001_salty_master_chief.sql +1 -0
  96. package/apps/runtime/dist/db/migrations/tenant/0002_cloudy_firebird.sql +1 -0
  97. package/apps/runtime/dist/db/migrations/tenant/0003_brown_warbound.sql +52 -0
  98. package/apps/runtime/dist/db/migrations/tenant/0004_romantic_nocturne.sql +6 -0
  99. package/apps/runtime/dist/db/migrations/tenant/0005_reflective_forgotten_one.sql +2 -0
  100. package/apps/runtime/dist/db/migrations/tenant/0006_hard_war_machine.sql +30 -0
  101. package/apps/runtime/dist/db/migrations/tenant/0007_space_data.sql +43 -0
  102. package/apps/runtime/dist/db/migrations/tenant/0008_run_event_note.sql +1 -0
  103. package/apps/runtime/dist/db/migrations/tenant/0009_knowledge.sql +104 -0
  104. package/apps/runtime/dist/db/migrations/tenant/0010_plugin_connection.sql +15 -0
  105. package/apps/runtime/dist/db/migrations/tenant/0011_runners.sql +2 -0
  106. package/apps/runtime/dist/db/migrations/tenant/0012_assistant_chat.sql +40 -0
  107. package/apps/runtime/dist/db/migrations/tenant/0013_run_origin.sql +1 -0
  108. package/apps/runtime/dist/db/migrations/tenant/0014_run_answer.sql +2 -0
  109. package/apps/runtime/dist/db/migrations/tenant/0015_device_calls.sql +13 -0
  110. package/apps/runtime/dist/db/migrations/tenant/0016_even_trish_tilby.sql +12 -0
  111. package/apps/runtime/dist/db/migrations/tenant/meta/0000_snapshot.json +1323 -0
  112. package/apps/runtime/dist/db/migrations/tenant/meta/0001_snapshot.json +1330 -0
  113. package/apps/runtime/dist/db/migrations/tenant/meta/0002_snapshot.json +1337 -0
  114. package/apps/runtime/dist/db/migrations/tenant/meta/0003_snapshot.json +1605 -0
  115. package/apps/runtime/dist/db/migrations/tenant/meta/0004_snapshot.json +1645 -0
  116. package/apps/runtime/dist/db/migrations/tenant/meta/0005_snapshot.json +1659 -0
  117. package/apps/runtime/dist/db/migrations/tenant/meta/0006_snapshot.json +1696 -0
  118. package/apps/runtime/dist/db/migrations/tenant/meta/0007_snapshot.json +2012 -0
  119. package/apps/runtime/dist/db/migrations/tenant/meta/0008_snapshot.json +2019 -0
  120. package/apps/runtime/dist/db/migrations/tenant/meta/0009_snapshot.json +2837 -0
  121. package/apps/runtime/dist/db/migrations/tenant/meta/0010_snapshot.json +2942 -0
  122. package/apps/runtime/dist/db/migrations/tenant/meta/0011_snapshot.json +2956 -0
  123. package/apps/runtime/dist/db/migrations/tenant/meta/0012_snapshot.json +3132 -0
  124. package/apps/runtime/dist/db/migrations/tenant/meta/0013_snapshot.json +3139 -0
  125. package/apps/runtime/dist/db/migrations/tenant/meta/0014_snapshot.json +3154 -0
  126. package/apps/runtime/dist/db/migrations/tenant/meta/0015_snapshot.json +3243 -0
  127. package/apps/runtime/dist/db/migrations/tenant/meta/0016_snapshot.json +3326 -0
  128. package/apps/runtime/dist/db/migrations/tenant/meta/_journal.json +125 -0
  129. package/apps/runtime/dist/db/schema.js +602 -0
  130. package/apps/runtime/dist/debug.js +196 -0
  131. package/apps/runtime/dist/docs/dev/index.md +41 -0
  132. package/apps/runtime/dist/docs/dev/meta.json +7 -0
  133. package/apps/runtime/dist/docs/dev/plugins/connections.md +74 -0
  134. package/apps/runtime/dist/docs/dev/plugins/events.md +89 -0
  135. package/apps/runtime/dist/docs/dev/plugins/examples.md +101 -0
  136. package/apps/runtime/dist/docs/dev/plugins/index.md +78 -0
  137. package/apps/runtime/dist/docs/dev/plugins/layout.md +90 -0
  138. package/apps/runtime/dist/docs/dev/plugins/meta.json +28 -0
  139. package/apps/runtime/dist/docs/dev/plugins/quick-start.md +94 -0
  140. package/apps/runtime/dist/docs/dev/plugins/reference.md +348 -0
  141. package/apps/runtime/dist/docs/dev/plugins/reloading.md +76 -0
  142. package/apps/runtime/dist/docs/dev/plugins/routes.md +185 -0
  143. package/apps/runtime/dist/docs/dev/plugins/runners.md +230 -0
  144. package/apps/runtime/dist/docs/dev/plugins/server.md +281 -0
  145. package/apps/runtime/dist/docs/dev/plugins/shipping.md +79 -0
  146. package/apps/runtime/dist/docs/dev/plugins/space.md +297 -0
  147. package/apps/runtime/dist/docs/dev/plugins/starters.md +70 -0
  148. package/apps/runtime/dist/docs/dev/plugins/studio.md +363 -0
  149. package/apps/runtime/dist/docs/dev/plugins/styling.md +129 -0
  150. package/apps/runtime/dist/docs/dev/plugins/tables.md +104 -0
  151. package/apps/runtime/dist/docs/dev/plugins/tools.md +139 -0
  152. package/apps/runtime/dist/docs/dev/wizard-format.md +125 -0
  153. package/apps/runtime/dist/docs/meta.json +3 -0
  154. package/apps/runtime/dist/docs/user/ai-apps.md +112 -0
  155. package/apps/runtime/dist/docs/user/assistant.md +77 -0
  156. package/apps/runtime/dist/docs/user/build-a-wizard.md +116 -0
  157. package/apps/runtime/dist/docs/user/command-line.md +83 -0
  158. package/apps/runtime/dist/docs/user/connectors.md +90 -0
  159. package/apps/runtime/dist/docs/user/create-account.md +52 -0
  160. package/apps/runtime/dist/docs/user/data.md +66 -0
  161. package/apps/runtime/dist/docs/user/first-start.md +60 -0
  162. package/apps/runtime/dist/docs/user/index.md +49 -0
  163. package/apps/runtime/dist/docs/user/install.md +123 -0
  164. package/apps/runtime/dist/docs/user/local-only.md +42 -0
  165. package/apps/runtime/dist/docs/user/meta.json +32 -0
  166. package/apps/runtime/dist/docs/user/models.md +156 -0
  167. package/apps/runtime/dist/docs/user/plugins.md +71 -0
  168. package/apps/runtime/dist/docs/user/run.md +98 -0
  169. package/apps/runtime/dist/docs/user/server.md +52 -0
  170. package/apps/runtime/dist/docs/user/space.md +126 -0
  171. package/apps/runtime/dist/docs/user/steps.md +220 -0
  172. package/apps/runtime/dist/docs/user/test-and-share.md +224 -0
  173. package/apps/runtime/dist/docs/user/troubleshooting.md +67 -0
  174. package/apps/runtime/dist/docs/user/wordpress.md +121 -0
  175. package/apps/runtime/dist/documents/parse.js +246 -0
  176. package/apps/runtime/dist/engenty/connections-external/build-connector.js +193 -0
  177. package/apps/runtime/dist/engenty/connections-external/errors.js +11 -0
  178. package/apps/runtime/dist/engenty/connections-external/import-service.js +270 -0
  179. package/apps/runtime/dist/engenty/connections-external/importer/classify.js +34 -0
  180. package/apps/runtime/dist/engenty/connections-external/importer/map-auth.js +185 -0
  181. package/apps/runtime/dist/engenty/connections-external/importer/normalize-mcp.js +63 -0
  182. package/apps/runtime/dist/engenty/connections-external/importer/normalize-openapi.js +130 -0
  183. package/apps/runtime/dist/engenty/connections-external/invoke/http-invoker.js +143 -0
  184. package/apps/runtime/dist/engenty/connections-external/invoke/mcp-client.js +143 -0
  185. package/apps/runtime/dist/engenty/connections-external/net/guarded-fetch.js +119 -0
  186. package/apps/runtime/dist/engenty/connections-external/oauth-dcr.js +88 -0
  187. package/apps/runtime/dist/engenty/connections-external/registry-client.js +336 -0
  188. package/apps/runtime/dist/engenty/connections-external/registry-source.js +82 -0
  189. package/apps/runtime/dist/engenty/connections-external/types.js +7 -0
  190. package/apps/runtime/dist/engenty/connections-github/connector.js +209 -0
  191. package/apps/runtime/dist/engenty/connections-google/connectors/calendar.js +381 -0
  192. package/apps/runtime/dist/engenty/connections-google/connectors/contacts.js +94 -0
  193. package/apps/runtime/dist/engenty/connections-google/connectors/drive.js +290 -0
  194. package/apps/runtime/dist/engenty/connections-google/connectors/gmail.js +567 -0
  195. package/apps/runtime/dist/engenty/connections-google/definitions.js +11 -0
  196. package/apps/runtime/dist/engenty/connections-google/shared.js +73 -0
  197. package/apps/runtime/dist/engenty/connections-hubspot/connector.js +140 -0
  198. package/apps/runtime/dist/engenty/connections-microsoft/action.js +17 -0
  199. package/apps/runtime/dist/engenty/connections-microsoft/graph.js +114 -0
  200. package/apps/runtime/dist/engenty/connections-microsoft/onedrive.js +286 -0
  201. package/apps/runtime/dist/engenty/connections-microsoft/outlook.js +492 -0
  202. package/apps/runtime/dist/engenty/connections-s3/s3.js +328 -0
  203. package/apps/runtime/dist/engenty/connections-sdk/files-capability.js +86 -0
  204. package/apps/runtime/dist/engenty/connections-sdk/oauth2.js +150 -0
  205. package/apps/runtime/dist/engenty/connections-sdk/registry.js +89 -0
  206. package/apps/runtime/dist/engenty/connections-sdk/storage-capability.js +84 -0
  207. package/apps/runtime/dist/engenty/connections-sdk/types.js +30 -0
  208. package/apps/runtime/dist/engenty/connections-slack/connector.js +360 -0
  209. package/apps/runtime/dist/engenty/csv-import/csv-matrix.js +178 -0
  210. package/apps/runtime/dist/engenty/csv-import/import-sources.js +87 -0
  211. package/apps/runtime/dist/engenty/csv-import/parse-csv.js +129 -0
  212. package/apps/runtime/dist/engenty/csv-import/serialize-csv.js +20 -0
  213. package/apps/runtime/dist/engenty/csv-import/types.js +1 -0
  214. package/apps/runtime/dist/engenty/csv-import/xlsx-workbook.js +159 -0
  215. package/apps/runtime/dist/engenty/doc-converter/interface.js +9 -0
  216. package/apps/runtime/dist/engenty/doc-converter/page-break.js +92 -0
  217. package/apps/runtime/dist/engenty/doc-converter/providers/local/index.js +72 -0
  218. package/apps/runtime/dist/engenty/document-scanner/schemas/classifier.js +30 -0
  219. package/apps/runtime/dist/engenty/document-scanner/schemas/index.js +4 -0
  220. package/apps/runtime/dist/engenty/document-scanner/schemas/invoice.js +73 -0
  221. package/apps/runtime/dist/engenty/document-scanner/schemas/receipt.js +63 -0
  222. package/apps/runtime/dist/engenty/document-scanner/schemas/shared.js +40 -0
  223. package/apps/runtime/dist/engenty/search-index/chunks.js +164 -0
  224. package/apps/runtime/dist/engenty/search-index/contracts.js +9 -0
  225. package/apps/runtime/dist/engenty/shims/connections-sdk.js +39 -0
  226. package/apps/runtime/dist/engenty/shims/plugin-sdk.js +1 -0
  227. package/apps/runtime/dist/engenty/shims/web-ingest.js +19 -0
  228. package/apps/runtime/dist/engenty/web-ingest/ssrf.js +277 -0
  229. package/apps/runtime/dist/engine/asks.js +82 -0
  230. package/apps/runtime/dist/engine/decide.js +82 -0
  231. package/apps/runtime/dist/engine/device.js +194 -0
  232. package/apps/runtime/dist/engine/events.js +128 -0
  233. package/apps/runtime/dist/engine/input.js +208 -0
  234. package/apps/runtime/dist/engine/owner.js +32 -0
  235. package/apps/runtime/dist/engine/prepare.js +90 -0
  236. package/apps/runtime/dist/engine/push.js +58 -0
  237. package/apps/runtime/dist/engine/requirements.js +355 -0
  238. package/apps/runtime/dist/engine/resources.js +198 -0
  239. package/apps/runtime/dist/engine/runner.js +970 -0
  240. package/apps/runtime/dist/engine/steps.js +1000 -0
  241. package/apps/runtime/dist/engine/surface.js +91 -0
  242. package/apps/runtime/dist/engine/template.js +240 -0
  243. package/apps/runtime/dist/engine/types.js +4 -0
  244. package/apps/runtime/dist/env.js +295 -0
  245. package/apps/runtime/dist/features.js +123 -0
  246. package/apps/runtime/dist/files/blobs.js +22 -0
  247. package/apps/runtime/dist/files/objects.js +86 -0
  248. package/apps/runtime/dist/files/storage.js +120 -0
  249. package/apps/runtime/dist/files/web-images.js +101 -0
  250. package/apps/runtime/dist/film/project.js +257 -0
  251. package/apps/runtime/dist/film/skills.js +91 -0
  252. package/apps/runtime/dist/film/sounds.js +122 -0
  253. package/apps/runtime/dist/film/step.js +289 -0
  254. package/apps/runtime/dist/film/tools.js +99 -0
  255. package/apps/runtime/dist/geocode.js +58 -0
  256. package/apps/runtime/dist/harness/antigravity.js +129 -0
  257. package/apps/runtime/dist/harness/apple.js +270 -0
  258. package/apps/runtime/dist/harness/claude.js +147 -0
  259. package/apps/runtime/dist/harness/codex.js +229 -0
  260. package/apps/runtime/dist/harness/cursor.js +93 -0
  261. package/apps/runtime/dist/harness/env.js +124 -0
  262. package/apps/runtime/dist/harness/index.js +95 -0
  263. package/apps/runtime/dist/harness/model.js +279 -0
  264. package/apps/runtime/dist/harness/prompt.js +121 -0
  265. package/apps/runtime/dist/harness/terminal.js +194 -0
  266. package/apps/runtime/dist/harness/types.js +7 -0
  267. package/apps/runtime/dist/index.js +113 -0
  268. package/apps/runtime/dist/limits.js +81 -0
  269. package/apps/runtime/dist/link-preview.js +60 -0
  270. package/apps/runtime/dist/log.js +106 -0
  271. package/apps/runtime/dist/manage.js +249 -0
  272. package/apps/runtime/dist/mcp/auth.js +161 -0
  273. package/apps/runtime/dist/mcp/bridge.js +59 -0
  274. package/apps/runtime/dist/mcp/flow-app.js +97 -0
  275. package/apps/runtime/dist/mcp/handler.js +54 -0
  276. package/apps/runtime/dist/mcp/scopes.js +14 -0
  277. package/apps/runtime/dist/mcp/seen.js +65 -0
  278. package/apps/runtime/dist/mcp/tools.js +572 -0
  279. package/apps/runtime/dist/media/conversation.js +167 -0
  280. package/apps/runtime/dist/media/ffmpeg.js +121 -0
  281. package/apps/runtime/dist/media/generate.js +120 -0
  282. package/apps/runtime/dist/media/marking.js +121 -0
  283. package/apps/runtime/dist/media/transcribe.js +198 -0
  284. package/apps/runtime/dist/model-errors.js +42 -0
  285. package/apps/runtime/dist/models.js +1164 -0
  286. package/apps/runtime/dist/plugin.js +61 -0
  287. package/apps/runtime/dist/plugins/channels.js +78 -0
  288. package/apps/runtime/dist/plugins/claims.js +56 -0
  289. package/apps/runtime/dist/plugins/discovery.js +155 -0
  290. package/apps/runtime/dist/plugins/events.js +63 -0
  291. package/apps/runtime/dist/plugins/jobs.js +64 -0
  292. package/apps/runtime/dist/plugins/loader.js +508 -0
  293. package/apps/runtime/dist/plugins/migrations.js +69 -0
  294. package/apps/runtime/dist/plugins/pro-keys.js +34 -0
  295. package/apps/runtime/dist/plugins/pro-state.js +83 -0
  296. package/apps/runtime/dist/plugins/pro.js +310 -0
  297. package/apps/runtime/dist/plugins/public.js +44 -0
  298. package/apps/runtime/dist/plugins/registry.js +122 -0
  299. package/apps/runtime/dist/plugins/runs.js +210 -0
  300. package/apps/runtime/dist/render/browser-path.js +54 -0
  301. package/apps/runtime/dist/render/chromium.js +98 -0
  302. package/apps/runtime/dist/render/convert.js +158 -0
  303. package/apps/runtime/dist/render/downloads.js +299 -0
  304. package/apps/runtime/dist/render/guard.js +25 -0
  305. package/apps/runtime/dist/render/shaped.js +137 -0
  306. package/apps/runtime/dist/routes/api.js +440 -0
  307. package/apps/runtime/dist/routes/debug.js +42 -0
  308. package/apps/runtime/dist/routes/delivery.js +90 -0
  309. package/apps/runtime/dist/routes/internal.js +81 -0
  310. package/apps/runtime/dist/routes/lang.js +25 -0
  311. package/apps/runtime/dist/routes/marketplace.js +43 -0
  312. package/apps/runtime/dist/routes/plugin-public.js +113 -0
  313. package/apps/runtime/dist/routes/plugins.js +212 -0
  314. package/apps/runtime/dist/routes/runs.js +1422 -0
  315. package/apps/runtime/dist/routes/studio.js +1629 -0
  316. package/apps/runtime/dist/routes/wizard-stream.js +30 -0
  317. package/apps/runtime/dist/running.js +39 -0
  318. package/apps/runtime/dist/sandbox/docker.js +75 -0
  319. package/apps/runtime/dist/sandbox/index.js +23 -0
  320. package/apps/runtime/dist/sandbox/types.js +1 -0
  321. package/apps/runtime/dist/secrets/crypto.js +28 -0
  322. package/apps/runtime/dist/secrets/signing.js +52 -0
  323. package/apps/runtime/dist/secrets/vault.js +59 -0
  324. package/apps/runtime/dist/services/access.js +88 -0
  325. package/apps/runtime/dist/services/api.js +248 -0
  326. package/apps/runtime/dist/services/architect.js +95 -0
  327. package/apps/runtime/dist/services/assistant-chats.js +311 -0
  328. package/apps/runtime/dist/services/brand.js +85 -0
  329. package/apps/runtime/dist/services/cloud.js +456 -0
  330. package/apps/runtime/dist/services/draft-events.js +27 -0
  331. package/apps/runtime/dist/services/engenty-shapes.js +71 -0
  332. package/apps/runtime/dist/services/errors.js +29 -0
  333. package/apps/runtime/dist/services/files.js +178 -0
  334. package/apps/runtime/dist/services/knowledge-model.js +559 -0
  335. package/apps/runtime/dist/services/knowledge.js +721 -0
  336. package/apps/runtime/dist/services/links.js +16 -0
  337. package/apps/runtime/dist/services/marketplace.js +492 -0
  338. package/apps/runtime/dist/services/onboarding.js +152 -0
  339. package/apps/runtime/dist/services/package-file.js +82 -0
  340. package/apps/runtime/dist/services/package.js +170 -0
  341. package/apps/runtime/dist/services/profile.js +51 -0
  342. package/apps/runtime/dist/services/project-files.js +439 -0
  343. package/apps/runtime/dist/services/project-index.js +707 -0
  344. package/apps/runtime/dist/services/projects.js +387 -0
  345. package/apps/runtime/dist/services/relevance.js +58 -0
  346. package/apps/runtime/dist/services/runners.js +178 -0
  347. package/apps/runtime/dist/services/runs.js +524 -0
  348. package/apps/runtime/dist/services/shares.js +130 -0
  349. package/apps/runtime/dist/services/site.js +270 -0
  350. package/apps/runtime/dist/services/space-categories.js +861 -0
  351. package/apps/runtime/dist/services/space-data.js +792 -0
  352. package/apps/runtime/dist/services/space-origin.js +207 -0
  353. package/apps/runtime/dist/services/spaces.js +656 -0
  354. package/apps/runtime/dist/services/translations.js +306 -0
  355. package/apps/runtime/dist/services/widgets.js +34 -0
  356. package/apps/runtime/dist/services/wizard-icon.js +157 -0
  357. package/apps/runtime/dist/services/wizards.js +420 -0
  358. package/apps/runtime/dist/settings.js +16 -0
  359. package/apps/runtime/dist/store/errors.js +4 -0
  360. package/apps/runtime/dist/store/index.js +299 -0
  361. package/apps/runtime/dist/store/shared-lists.js +123 -0
  362. package/apps/runtime/dist/tenants/control.js +238 -0
  363. package/apps/runtime/dist/tenants/tenant.js +26 -0
  364. package/apps/runtime/dist/texts.js +207 -0
  365. package/apps/runtime/dist/tools/browser.js +703 -0
  366. package/apps/runtime/dist/tools/connector.js +204 -0
  367. package/apps/runtime/dist/tools/index.js +291 -0
  368. package/apps/runtime/dist/tools/mail.js +104 -0
  369. package/apps/runtime/dist/tools/net-guard.js +170 -0
  370. package/apps/runtime/dist/tools/pages.js +81 -0
  371. package/apps/runtime/dist/tools/plugin.js +180 -0
  372. package/apps/runtime/dist/tools/project.js +154 -0
  373. package/apps/runtime/dist/tools/shared.js +69 -0
  374. package/apps/runtime/dist/tools/store.js +238 -0
  375. package/apps/runtime/dist/update.js +113 -0
  376. package/apps/runtime/dist/widgets/bundle.js +99 -0
  377. package/apps/runtime/dist/widgets/render.js +329 -0
  378. package/apps/runtime/dist/widgets/runtime.js +108 -0
  379. package/apps/runtime/dist/widgets/script.js +30 -0
  380. package/apps/runtime/dist/widgets/step.js +223 -0
  381. package/apps/web/dist/ai-labels/ai-black.svg +20 -0
  382. package/apps/web/dist/ai-labels/ai-generated-black.svg +31 -0
  383. package/apps/web/dist/ai-labels/ai-generated-white.svg +32 -0
  384. package/apps/web/dist/ai-labels/ai-modified-black.svg +30 -0
  385. package/apps/web/dist/ai-labels/ai-modified-white.svg +31 -0
  386. package/apps/web/dist/ai-labels/ai-white.svg +21 -0
  387. package/apps/web/dist/assets/AboutDialog-D4mvc-zu.js +1 -0
  388. package/apps/web/dist/assets/ChangelogDialog-DLqpJsF6.js +1 -0
  389. package/apps/web/dist/assets/ChatView-3laypRcE.js +10 -0
  390. package/apps/web/dist/assets/EditorPage-BalA5U2Y.js +3 -0
  391. package/apps/web/dist/assets/FlowPreview-CusP7ci9.js +1 -0
  392. package/apps/web/dist/assets/Harness-BrP-ENHg.css +1 -0
  393. package/apps/web/dist/assets/Harness-iYLtOLaK.js +16 -0
  394. package/apps/web/dist/assets/NewWizardChannels-CbwJ9A56.js +1 -0
  395. package/apps/web/dist/assets/NewWizardPage-BOBYiB9i.js +7 -0
  396. package/apps/web/dist/assets/OnboardingPage-CUwCiVIr.js +1 -0
  397. package/apps/web/dist/assets/ProjectPage-Bb16MdYG.js +1 -0
  398. package/apps/web/dist/assets/PublicRunner-BCt7Q6C-.js +1 -0
  399. package/apps/web/dist/assets/ReadOnly-kIHX2TEy.js +1 -0
  400. package/apps/web/dist/assets/RunDrawer-hZ9oeSXu.js +4 -0
  401. package/apps/web/dist/assets/RunnerView-DUS9fPmx.js +1 -0
  402. package/apps/web/dist/assets/SettingsPage-BzwR50fi.js +1 -0
  403. package/apps/web/dist/assets/SetupPage-gAp7rPxp.js +1 -0
  404. package/apps/web/dist/assets/SharePage-DqZWHva_.js +1 -0
  405. package/apps/web/dist/assets/changelog-DugmCNSf.js +1 -0
  406. package/apps/web/dist/assets/engenty-eXZ-EAwd.js +1 -0
  407. package/apps/web/dist/assets/esm-DXeMu8Lb.js +7 -0
  408. package/apps/web/dist/assets/fluffy-engenty-ClRou7yu.js +456 -0
  409. package/apps/web/dist/assets/index-AfUa8xKD.css +1 -0
  410. package/apps/web/dist/assets/index-C5Sm7tTR.js +14 -0
  411. package/apps/web/dist/assets/jsx-runtime-BNakU3Ej.js +1 -0
  412. package/apps/web/dist/assets/lock-R_CfU0Xo.js +1 -0
  413. package/apps/web/dist/assets/oss-credits-cZ9NUaLZ.js +1 -0
  414. package/apps/web/dist/assets/pdfmake-Cx9scTbD.js +228 -0
  415. package/apps/web/dist/assets/phone-CgrIS4_-.js +1 -0
  416. package/apps/web/dist/assets/preload-helper-CNEI7N0N.js +1 -0
  417. package/apps/web/dist/assets/qr-scanner-worker.min-CJaXo3yu.js +98 -0
  418. package/apps/web/dist/assets/qr-scanner.min-C_UI0gH-.js +1 -0
  419. package/apps/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
  420. package/apps/web/dist/assets/settings-menu-2IMOOlLl.js +1 -0
  421. package/apps/web/dist/assets/ui-dzGvc3xk.js +137 -0
  422. package/apps/web/dist/assets/upload-BSuTilFF.js +1 -0
  423. package/apps/web/dist/assets/vfs_fonts-DllDSYt1.js +1 -0
  424. package/apps/web/dist/embed.js +266 -0
  425. package/apps/web/dist/favicon.svg +1 -0
  426. package/apps/web/dist/icons/apple-touch-icon.png +0 -0
  427. package/apps/web/dist/icons/icon-192.png +0 -0
  428. package/apps/web/dist/icons/icon-512.png +0 -0
  429. package/apps/web/dist/icons/icon-maskable-512.png +0 -0
  430. package/apps/web/dist/index.html +48 -0
  431. package/apps/web/dist/install.sh +577 -0
  432. package/apps/web/dist/manifest.webmanifest +21 -0
  433. package/apps/web/dist/mcp/flow.html +980 -0
  434. package/apps/web/dist/sw.js +15 -0
  435. package/bin/wizards.mjs +288 -0
  436. package/modules/README.md +15 -0
  437. package/node_modules/@engenty/wizards/dist/plugin/index.d.ts +1150 -0
  438. package/node_modules/@engenty/wizards/dist/plugin/index.js +4 -0
  439. package/node_modules/@engenty/wizards/dist/plugin/studio.d.ts +322 -0
  440. package/node_modules/@engenty/wizards/dist/plugin/studio.js +4 -0
  441. package/node_modules/@engenty/wizards/dist/plugin/thread.d.ts +174 -0
  442. package/node_modules/@engenty/wizards/dist/plugin/thread.js +821 -0
  443. package/node_modules/@engenty/wizards/package.json +11 -0
  444. package/node_modules/@engenty-wizards/shared/dist/assistant.d.ts +174 -0
  445. package/node_modules/@engenty-wizards/shared/dist/assistant.js +65 -0
  446. package/node_modules/@engenty-wizards/shared/dist/changes.d.ts +22 -0
  447. package/node_modules/@engenty-wizards/shared/dist/changes.js +61 -0
  448. package/node_modules/@engenty-wizards/shared/dist/connectors.d.ts +77 -0
  449. package/node_modules/@engenty-wizards/shared/dist/connectors.js +2 -0
  450. package/node_modules/@engenty-wizards/shared/dist/decision.d.ts +76 -0
  451. package/node_modules/@engenty-wizards/shared/dist/decision.js +147 -0
  452. package/node_modules/@engenty-wizards/shared/dist/definition.d.ts +2922 -0
  453. package/node_modules/@engenty-wizards/shared/dist/definition.js +1920 -0
  454. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.d.ts +5 -0
  455. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.js +132 -0
  456. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.d.ts +11 -0
  457. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.js +209 -0
  458. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.d.ts +532 -0
  459. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.js +217 -0
  460. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.d.ts +3 -0
  461. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.js +3 -0
  462. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.d.ts +14 -0
  463. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.js +166 -0
  464. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.d.ts +33 -0
  465. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.js +99 -0
  466. package/node_modules/@engenty-wizards/shared/dist/feature-flags.d.ts +78 -0
  467. package/node_modules/@engenty-wizards/shared/dist/feature-flags.js +70 -0
  468. package/node_modules/@engenty-wizards/shared/dist/features.d.ts +41 -0
  469. package/node_modules/@engenty-wizards/shared/dist/features.js +89 -0
  470. package/node_modules/@engenty-wizards/shared/dist/fit.d.ts +71 -0
  471. package/node_modules/@engenty-wizards/shared/dist/fit.js +382 -0
  472. package/node_modules/@engenty-wizards/shared/dist/json-schema.d.ts +14 -0
  473. package/node_modules/@engenty-wizards/shared/dist/json-schema.js +66 -0
  474. package/node_modules/@engenty-wizards/shared/dist/knowledge.d.ts +199 -0
  475. package/node_modules/@engenty-wizards/shared/dist/knowledge.js +68 -0
  476. package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.d.ts +35 -0
  477. package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.js +107 -0
  478. package/node_modules/@engenty-wizards/shared/dist/marketplace-search.d.ts +20 -0
  479. package/node_modules/@engenty-wizards/shared/dist/marketplace-search.js +136 -0
  480. package/node_modules/@engenty-wizards/shared/dist/marketplace.d.ts +227 -0
  481. package/node_modules/@engenty-wizards/shared/dist/marketplace.js +354 -0
  482. package/node_modules/@engenty-wizards/shared/dist/merge.d.ts +7 -0
  483. package/node_modules/@engenty-wizards/shared/dist/merge.js +40 -0
  484. package/node_modules/@engenty-wizards/shared/dist/numbers.d.ts +24 -0
  485. package/node_modules/@engenty-wizards/shared/dist/numbers.js +54 -0
  486. package/node_modules/@engenty-wizards/shared/dist/projects.d.ts +224 -0
  487. package/node_modules/@engenty-wizards/shared/dist/projects.js +319 -0
  488. package/node_modules/@engenty-wizards/shared/dist/providers.d.ts +101 -0
  489. package/node_modules/@engenty-wizards/shared/dist/providers.js +390 -0
  490. package/node_modules/@engenty-wizards/shared/dist/run.d.ts +680 -0
  491. package/node_modules/@engenty-wizards/shared/dist/run.js +620 -0
  492. package/node_modules/@engenty-wizards/shared/dist/runner-texts.d.ts +546 -0
  493. package/node_modules/@engenty-wizards/shared/dist/runner-texts.js +523 -0
  494. package/node_modules/@engenty-wizards/shared/dist/runners.d.ts +93 -0
  495. package/node_modules/@engenty-wizards/shared/dist/runners.js +146 -0
  496. package/node_modules/@engenty-wizards/shared/dist/shape.d.ts +102 -0
  497. package/node_modules/@engenty-wizards/shared/dist/shape.js +318 -0
  498. package/node_modules/@engenty-wizards/shared/dist/space-data.d.ts +89 -0
  499. package/node_modules/@engenty-wizards/shared/dist/space-data.js +47 -0
  500. package/node_modules/@engenty-wizards/shared/dist/store.d.ts +117 -0
  501. package/node_modules/@engenty-wizards/shared/dist/store.js +81 -0
  502. package/node_modules/@engenty-wizards/shared/dist/surface.d.ts +115 -0
  503. package/node_modules/@engenty-wizards/shared/dist/surface.js +442 -0
  504. package/node_modules/@engenty-wizards/shared/dist/texts.d.ts +45 -0
  505. package/node_modules/@engenty-wizards/shared/dist/texts.js +54 -0
  506. package/node_modules/@engenty-wizards/shared/dist/translation.d.ts +23 -0
  507. package/node_modules/@engenty-wizards/shared/dist/translation.js +154 -0
  508. package/node_modules/@engenty-wizards/shared/dist/wizard-package.d.ts +48 -0
  509. package/node_modules/@engenty-wizards/shared/dist/wizard-package.js +49 -0
  510. package/node_modules/@engenty-wizards/shared/dist/workspace.d.ts +16 -0
  511. package/node_modules/@engenty-wizards/shared/dist/workspace.js +51 -0
  512. package/node_modules/@engenty-wizards/shared/package.json +10 -0
  513. package/package.json +77 -4
  514. package/plugin/.claude-plugin/plugin.json +9 -0
  515. package/plugin/.mcp.json +8 -0
  516. package/plugin/commands/wizard.md +8 -0
  517. package/plugin/skills/build-wizard/SKILL.md +27 -0
  518. package/plugin/skills/use-wizard/SKILL.md +18 -0
@@ -0,0 +1,121 @@
1
+ import { writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ /** The extension a saved attachment gets, so the client reads it as what it is. */
4
+ export function extensionOf(mediaType, filename) {
5
+ const own = filename?.match(/\.([a-z0-9]{1,5})$/i)?.[1];
6
+ if (own) {
7
+ return own.toLowerCase();
8
+ }
9
+ const sub = mediaType.split("/")[1] ?? "bin";
10
+ return { jpeg: "jpg", "svg+xml": "svg", plain: "txt", markdown: "md" }[sub] ?? sub;
11
+ }
12
+ /**
13
+ * The conversation as a client takes it: one system prompt and one prompt on stdin. A single
14
+ * user message goes as it is; a longer thread is written out with its speakers, and the client
15
+ * is asked to answer its last message. Attachments are saved to `dir` and named in the prompt.
16
+ */
17
+ export function renderPrompt(messages, dir) {
18
+ const warnings = [];
19
+ const files = [];
20
+ const system = [];
21
+ const turns = [];
22
+ const saveFile = (input) => {
23
+ // A file's content comes tagged: { type: "data", data } | { type: "url", url } | { type: "text", text }.
24
+ const tagged = input.data;
25
+ const data = tagged && typeof tagged === "object" && typeof tagged.type === "string"
26
+ ? tagged.type === "url"
27
+ ? tagged.url
28
+ : tagged.type === "text"
29
+ ? Buffer.from(tagged.text ?? "", "utf8")
30
+ : tagged.data
31
+ : input.data;
32
+ const part = { ...input, data };
33
+ if (part.data instanceof URL) {
34
+ return `[Attachment at ${part.data.href} (${part.mediaType})]`;
35
+ }
36
+ if (typeof part.data !== "string" && !(part.data instanceof Uint8Array)) {
37
+ warnings.push({ type: "unsupported", feature: "file parts" });
38
+ return `[Attachment: ${part.filename ?? part.mediaType}]`;
39
+ }
40
+ if (!dir) {
41
+ warnings.push({ type: "unsupported", feature: "file parts" });
42
+ return `[Attachment: ${part.filename ?? part.mediaType}]`;
43
+ }
44
+ const path = join(dir, `${files.length + 1}.${extensionOf(part.mediaType, part.filename)}`);
45
+ const bytes = typeof part.data === "string" ? Buffer.from(part.data, "base64") : part.data;
46
+ writeFileSync(path, bytes);
47
+ files.push(path);
48
+ return `[Attached file — open it to read it: ${path}]`;
49
+ };
50
+ for (const m of messages) {
51
+ if (m.role === "system") {
52
+ system.push(m.content);
53
+ continue;
54
+ }
55
+ const text = m.content
56
+ .map((part) => {
57
+ switch (part.type) {
58
+ case "text":
59
+ return part.text;
60
+ case "file":
61
+ return saveFile(part);
62
+ case "reasoning":
63
+ return "";
64
+ case "tool-call":
65
+ return `[Called ${part.toolName} with ${JSON.stringify(part.input)}]`;
66
+ case "tool-result": {
67
+ const out = part.output;
68
+ const value = out.type === "text" || out.type === "error-text"
69
+ ? String(out.value)
70
+ : out.type === "json" || out.type === "error-json"
71
+ ? JSON.stringify(out.value)
72
+ : out.type === "execution-denied"
73
+ ? `denied${out.reason ? `: ${out.reason}` : ""}`
74
+ : JSON.stringify(out.value ?? out);
75
+ return `[Result of ${part.toolName}: ${value}]`;
76
+ }
77
+ default:
78
+ return "";
79
+ }
80
+ })
81
+ .filter(Boolean)
82
+ .join("\n");
83
+ turns.push({ role: m.role, text });
84
+ }
85
+ const prompt = turns.length === 1 && turns[0].role === "user"
86
+ ? turns[0].text
87
+ : turns
88
+ .map((t) => `${t.role === "user" ? "User" : t.role === "tool" ? "Tool" : "Assistant"}:\n${t.text}`)
89
+ .join("\n\n");
90
+ if (turns.length > 1) {
91
+ system.push("The prompt holds the conversation so far, each message headed by its speaker. Answer the last message as the assistant — the answer only, no speaker label.");
92
+ }
93
+ return { system: system.join("\n\n"), prompt, files, warnings };
94
+ }
95
+ /** What a client without a schema option is told so its answer parses. */
96
+ export function jsonInstruction(schema) {
97
+ return [
98
+ "Answer with one JSON value only — no prose, no code fence — that matches this JSON Schema:",
99
+ JSON.stringify(schema ?? { type: "object" }),
100
+ ].join("\n");
101
+ }
102
+ /** A client's answer as JSON: the fences and prose some wrap around it are taken off. */
103
+ export function parseJsonAnswer(text) {
104
+ const trimmed = text.trim();
105
+ const unfenced = trimmed
106
+ .replace(/^\s*```(?:json)?\s*/i, "")
107
+ .replace(/\s*```\s*$/, "")
108
+ .trim();
109
+ try {
110
+ return JSON.parse(unfenced);
111
+ }
112
+ catch {
113
+ // Prose around the value: take the outermost object or array.
114
+ const start = unfenced.search(/[{[]/);
115
+ const end = Math.max(unfenced.lastIndexOf("}"), unfenced.lastIndexOf("]"));
116
+ if (start >= 0 && end > start) {
117
+ return JSON.parse(unfenced.slice(start, end + 1));
118
+ }
119
+ throw new Error("The answer is not JSON.");
120
+ }
121
+ }
@@ -0,0 +1,194 @@
1
+ import { accessSync, chmodSync, constants } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, join } from "node:path";
4
+ import { note } from "@engenty-wizards/shared/run";
5
+ import { nanoid } from "nanoid";
6
+ import { ServiceError } from "../services/errors.js";
7
+ const BUFFER = 200_000;
8
+ /** A session nobody looks at is ended after this long. */
9
+ const IDLE_MS = 20 * 60_000;
10
+ /** An ended session is kept this long for a page to read its last lines. */
11
+ const LINGER_MS = 5 * 60_000;
12
+ const sessions = new Map();
13
+ /** The prebuilt helper node-pty forks must be executable; an install that skips scripts leaves it without the bit. */
14
+ function ensureHelper() {
15
+ try {
16
+ const entry = createRequire(import.meta.url).resolve("node-pty");
17
+ const helper = join(dirname(entry), "..", "prebuilds", `${process.platform}-${process.arch}`, "spawn-helper");
18
+ try {
19
+ accessSync(helper, constants.X_OK);
20
+ }
21
+ catch {
22
+ chmodSync(helper, 0o755);
23
+ }
24
+ }
25
+ catch {
26
+ // Not on this platform, or not ours to change: spawning tells.
27
+ }
28
+ }
29
+ async function ptyModule() {
30
+ try {
31
+ ensureHelper();
32
+ const mod = (await import("node-pty"));
33
+ const spawn = mod.spawn ?? mod.default?.spawn;
34
+ if (!spawn) {
35
+ throw new Error("node-pty has no spawn");
36
+ }
37
+ return { spawn };
38
+ }
39
+ catch {
40
+ throw new ServiceError("refused", note("builtTerminalNotAvailable"));
41
+ }
42
+ }
43
+ function emit(session, event) {
44
+ for (const listener of session.listeners) {
45
+ listener(event);
46
+ }
47
+ }
48
+ function forget(session) {
49
+ if (session.poll) {
50
+ clearInterval(session.poll);
51
+ }
52
+ if (session.reaper) {
53
+ clearTimeout(session.reaper);
54
+ }
55
+ sessions.delete(session.id);
56
+ }
57
+ function rearm(session) {
58
+ if (session.reaper) {
59
+ clearTimeout(session.reaper);
60
+ }
61
+ session.reaper = setTimeout(() => {
62
+ if (session.listeners.size) {
63
+ rearm(session);
64
+ return;
65
+ }
66
+ if (!session.exit) {
67
+ session.pty.kill();
68
+ }
69
+ forget(session);
70
+ }, session.exit ? LINGER_MS : IDLE_MS);
71
+ session.reaper.unref();
72
+ }
73
+ /** Starts a command in a new terminal; the id names it to the page. */
74
+ export async function openTerminal(opts) {
75
+ const { spawn } = await ptyModule();
76
+ const id = nanoid(16);
77
+ let pty;
78
+ try {
79
+ pty = spawn(opts.bin, opts.args, {
80
+ name: "xterm-256color",
81
+ cols: opts.cols ?? 100,
82
+ rows: opts.rows ?? 28,
83
+ cwd: opts.cwd,
84
+ env: opts.env,
85
+ });
86
+ }
87
+ catch (err) {
88
+ throw new ServiceError("refused", note("commandNotStarted", { detail: err.message }));
89
+ }
90
+ const session = {
91
+ id,
92
+ pty,
93
+ buffer: "",
94
+ listeners: new Set(),
95
+ exit: null,
96
+ done: false,
97
+ poll: null,
98
+ reaper: null,
99
+ };
100
+ sessions.set(id, session);
101
+ pty.onData((data) => {
102
+ session.buffer = (session.buffer + data).slice(-BUFFER);
103
+ emit(session, { type: "data", data });
104
+ });
105
+ pty.onExit(({ exitCode }) => {
106
+ session.exit = { code: exitCode };
107
+ if (session.poll) {
108
+ clearInterval(session.poll);
109
+ session.poll = null;
110
+ }
111
+ emit(session, { type: "exit", code: exitCode });
112
+ rearm(session);
113
+ });
114
+ if (opts.until) {
115
+ const until = opts.until;
116
+ let asking = false;
117
+ session.poll = setInterval(() => {
118
+ if (asking || session.done) {
119
+ return;
120
+ }
121
+ asking = true;
122
+ void until()
123
+ .then((ok) => {
124
+ if (ok && !session.done) {
125
+ session.done = true;
126
+ emit(session, { type: "done" });
127
+ opts.onDone?.();
128
+ if (!session.exit) {
129
+ // The command did its job; an app that stays open is ended for the person.
130
+ setTimeout(() => {
131
+ if (!session.exit) {
132
+ session.pty.kill();
133
+ }
134
+ }, 1500).unref();
135
+ }
136
+ }
137
+ })
138
+ .catch(() => undefined)
139
+ .finally(() => {
140
+ asking = false;
141
+ });
142
+ }, 3000);
143
+ }
144
+ rearm(session);
145
+ return id;
146
+ }
147
+ function sessionOf(id) {
148
+ const session = sessions.get(id);
149
+ if (!session) {
150
+ throw new ServiceError("not_found", note("terminalNoLongerExists"));
151
+ }
152
+ return session;
153
+ }
154
+ /** Follows a terminal: what it printed so far, then everything new, then its end. */
155
+ export function subscribeTerminal(id, listener) {
156
+ const session = sessionOf(id);
157
+ if (session.buffer) {
158
+ listener({ type: "data", data: session.buffer });
159
+ }
160
+ if (session.done) {
161
+ listener({ type: "done" });
162
+ }
163
+ if (session.exit) {
164
+ listener({ type: "exit", code: session.exit.code });
165
+ }
166
+ session.listeners.add(listener);
167
+ rearm(session);
168
+ return () => {
169
+ session.listeners.delete(listener);
170
+ rearm(session);
171
+ };
172
+ }
173
+ export function writeTerminal(id, data) {
174
+ const session = sessionOf(id);
175
+ if (!session.exit) {
176
+ session.pty.write(data);
177
+ }
178
+ }
179
+ export function resizeTerminal(id, cols, rows) {
180
+ const session = sessionOf(id);
181
+ if (!session.exit && cols > 0 && rows > 0) {
182
+ session.pty.resize(Math.min(cols, 500), Math.min(rows, 200));
183
+ }
184
+ }
185
+ export function closeTerminal(id) {
186
+ const session = sessions.get(id);
187
+ if (!session) {
188
+ return;
189
+ }
190
+ if (!session.exit) {
191
+ session.pty.kill();
192
+ }
193
+ forget(session);
194
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * A harness is an AI client installed on this machine — Claude Code, Codex, Antigravity, Cursor
3
+ * Agent — that answers on the person's own subscription or sign-in. The runtime runs it headless
4
+ * as a model (./model.ts) and signs it in through the inline terminal (./terminal.ts). Nothing of
5
+ * this process reaches it: no key of ours, no session of a parent client.
6
+ */
7
+ export const HARNESS_IDS = ["claude", "codex", "antigravity", "cursor"];
@@ -0,0 +1,113 @@
1
+ import { serve } from "@hono/node-server";
2
+ import { localEntryUrl, purgeSessions } from "./auth/index.js";
3
+ import { adoptLegacyData } from "./db/adopt.js";
4
+ import { knownTenants, migrateAllTenants, migrateControlDb, openTenantDb, withTenant, } from "./db/client.js";
5
+ import { startRunner, stopRunner } from "./engine/runner.js";
6
+ import { basePath, env } from "./env.js";
7
+ import { hookConsole } from "./log.js";
8
+ import { managed } from "./manage.js";
9
+ import { checkModelsAtStart, loadCatalog, loadLocalModels } from "./models.js";
10
+ import { startJobs } from "./plugins/jobs.js";
11
+ import { loadPlugins } from "./plugins/loader.js";
12
+ import { loadEntitlement, startProChecks } from "./plugins/pro.js";
13
+ import { closeBrowser } from "./render/chromium.js";
14
+ import { clearRunning, writeRunning } from "./running.js";
15
+ import { syncMarketplace } from "./services/marketplace.js";
16
+ import { purgeExpiredRuns } from "./services/shares.js";
17
+ import { purgeUnusedStores } from "./store/index.js";
18
+ import { forgetRunner, registerRunner } from "./tenants/control.js";
19
+ import { LOCAL_TENANT } from "./tenants/tenant.js";
20
+ import { onRestart, RESTART_EXIT, startUpdateChecks } from "./update.js";
21
+ // Before anything prints: the last lines stay in memory for a look from afar (debug.ts).
22
+ hookConsole();
23
+ await migrateControlDb();
24
+ // What the linked account's plan confirmed last: the Pro modules it includes load with the rest.
25
+ await loadEntitlement();
26
+ // Before any tenant database opens: each gets the plugins' own tables as it does.
27
+ await loadPlugins();
28
+ startJobs();
29
+ if (managed) {
30
+ // Every tenant database is brought to this release's schema; a new one migrates when first opened.
31
+ void migrateAllTenants().then(({ migrated, failed }) => {
32
+ console.log(`tenant databases: ${migrated} current${failed.length ? `, failed: ${failed}` : ""}`);
33
+ });
34
+ }
35
+ else {
36
+ await adoptLegacyData();
37
+ await openTenantDb(LOCAL_TENANT);
38
+ await loadLocalModels();
39
+ void loadCatalog();
40
+ void checkModelsAtStart().catch(() => undefined);
41
+ startProChecks();
42
+ // A newer release is downloaded beside this one and used from the next start.
43
+ startUpdateChecks();
44
+ }
45
+ // The marketplace's starters and the starred entries, kept for offline use; checked hourly.
46
+ void syncMarketplace();
47
+ setInterval(() => void syncMarketplace(), 3600_000).unref();
48
+ const { default: app } = await import("./app.js");
49
+ /** Behind a path (APP_URL ends in /w) the proxy may leave the prefix on; the routes know none. */
50
+ function withoutBasePath(request) {
51
+ const url = new URL(request.url);
52
+ if (basePath && (url.pathname === basePath || url.pathname.startsWith(`${basePath}/`))) {
53
+ url.pathname = url.pathname.slice(basePath.length) || "/";
54
+ return app.fetch(new Request(url, request));
55
+ }
56
+ return app.fetch(request);
57
+ }
58
+ const server = serve({ fetch: withoutBasePath, port: env.port, hostname: env.host }, (info) => {
59
+ console.log(`engenty wizards on :${info.port} — ${env.appUrl}`);
60
+ const entry = localEntryUrl();
61
+ if (entry && !env.local.accessKey && env.serves.studio) {
62
+ console.log(`Open the studio: ${entry}`);
63
+ }
64
+ if (!managed) {
65
+ writeRunning(env.dataDir, {
66
+ pid: process.pid,
67
+ port: info.port,
68
+ url: env.appUrl,
69
+ startedAt: new Date().toISOString(),
70
+ restarts: process.env.ENGENTY_WIZARDS_RESTARTS === "1",
71
+ });
72
+ }
73
+ });
74
+ // A runner takes the runs in line, those a stopped process left behind first (RUNTIME_ROLE).
75
+ if (env.serves.runner) {
76
+ await registerRunner();
77
+ setInterval(() => void registerRunner().catch(() => undefined), 10_000).unref();
78
+ startRunner();
79
+ }
80
+ // End-user results are kept RESULT_TTL_DAYS; expired runs and their files go once an hour.
81
+ // What a wizard keeps for a person goes once nobody used it for STORE_TTL_DAYS.
82
+ async function purge() {
83
+ await purgeSessions();
84
+ for (const id of await knownTenants()) {
85
+ await withTenant(id, () => Promise.all([purgeExpiredRuns(), purgeUnusedStores()])).catch((err) => console.error(`[retention ${id}]`, err));
86
+ }
87
+ }
88
+ void purge().catch((err) => console.error("[retention]", err));
89
+ setInterval(() => void purge().catch((err) => console.error("[retention]", err)), 3600_000).unref();
90
+ // A runtime that runs alone sends again what did not arrive in its account's cloud.
91
+ if (!managed) {
92
+ const { retryFailedSends } = await import("./services/cloud.js");
93
+ const retry = () => withTenant(LOCAL_TENANT, () => retryFailedSends("local")).catch((err) => console.error("[cloud] retry failed:", err));
94
+ setInterval(() => void retry(), 60_000).unref();
95
+ }
96
+ async function shutdown(code = 0) {
97
+ clearRunning(env.dataDir);
98
+ server.close();
99
+ if (env.serves.runner) {
100
+ // The runs go back in line for another runner; their steps start afresh there.
101
+ await stopRunner();
102
+ await forgetRunner().catch(() => undefined);
103
+ }
104
+ await closeBrowser();
105
+ process.exit(code);
106
+ }
107
+ process.on("SIGINT", () => shutdown());
108
+ process.on("SIGTERM", () => shutdown());
109
+ onRestart((code) => void shutdown(code));
110
+ // `wizards restart`: the command that started it starts it again, where it ran.
111
+ if (process.env.ENGENTY_WIZARDS_RESTARTS === "1" && process.platform !== "win32") {
112
+ process.on("SIGUSR2", () => shutdown(RESTART_EXIT));
113
+ }
@@ -0,0 +1,81 @@
1
+ import { createHash } from "node:crypto";
2
+ import { and, count, eq, gte } from "drizzle-orm";
3
+ import { canSpend } from "./credits/credits.js";
4
+ import { db, schema } from "./db/client.js";
5
+ import { env } from "./env.js";
6
+ export function hashIp(ip) {
7
+ if (!ip) {
8
+ return null;
9
+ }
10
+ return createHash("sha256").update(`${env.authSecret}:${ip}`).digest("hex").slice(0, 32);
11
+ }
12
+ function startOfDay() {
13
+ const d = new Date();
14
+ d.setUTCHours(0, 0, 0, 0);
15
+ return d;
16
+ }
17
+ /**
18
+ * Why a shared wizard cannot start a run right now, or null when it can: a note, to answer in the
19
+ * wizard's language (`noteText(reason, wizardLang(def))`).
20
+ */
21
+ export async function wizardUnavailable(w) {
22
+ if (!w.shareEnabled || w.publishedVersion === null) {
23
+ return { code: "wizardUnavailable" };
24
+ }
25
+ const [{ n }] = await db
26
+ .select({ n: count() })
27
+ .from(schema.run)
28
+ .where(and(eq(schema.run.wizardId, w.id), eq(schema.run.mode, "live"), gte(schema.run.createdAt, startOfDay())));
29
+ if (n >= w.dailyRunLimit) {
30
+ return { code: "wizardLimit" };
31
+ }
32
+ if (!(await canSpend())) {
33
+ return { code: "wizardUnavailable" };
34
+ }
35
+ return null;
36
+ }
37
+ export async function verifyTurnstile(token, ip) {
38
+ if (!env.turnstile.secret) {
39
+ return true;
40
+ }
41
+ if (!token) {
42
+ return false;
43
+ }
44
+ const body = new URLSearchParams({ secret: env.turnstile.secret, response: token });
45
+ if (ip) {
46
+ body.set("remoteip", ip);
47
+ }
48
+ try {
49
+ const res = await fetch("https://challenges.cloudflare.com/turnstile/v0/siteverify", {
50
+ method: "POST",
51
+ body,
52
+ signal: AbortSignal.timeout(8000),
53
+ });
54
+ const data = (await res.json());
55
+ return Boolean(data.success);
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }
61
+ /** Times per key, kept in this process; old ones drop out as the key is asked. */
62
+ const seen = new Map();
63
+ /** Counts one more try for `key`; false once `max` tries fell within the last `windowMs`. */
64
+ export function allowed(key, max, windowMs) {
65
+ const now = Date.now();
66
+ const recent = (seen.get(key) ?? []).filter((t) => now - t < windowMs);
67
+ if (recent.length >= max) {
68
+ seen.set(key, recent);
69
+ return false;
70
+ }
71
+ recent.push(now);
72
+ seen.set(key, recent);
73
+ if (seen.size > 50_000) {
74
+ for (const [k, times] of seen) {
75
+ if (!times.some((t) => now - t < windowMs)) {
76
+ seen.delete(k);
77
+ }
78
+ }
79
+ }
80
+ return true;
81
+ }
@@ -0,0 +1,60 @@
1
+ import { and, eq } from "drizzle-orm";
2
+ import { db, schema } from "./db/client.js";
3
+ import { env } from "./env.js";
4
+ import { escapeHtml } from "./render/convert.js";
5
+ import { sharedRun, shareView } from "./services/shares.js";
6
+ function tags(p) {
7
+ const t = [
8
+ `<meta property="og:title" content="${escapeHtml(p.title)}">`,
9
+ `<meta property="og:description" content="${escapeHtml(p.description)}">`,
10
+ `<meta property="og:url" content="${escapeHtml(p.url)}">`,
11
+ `<meta property="og:type" content="website">`,
12
+ `<meta name="twitter:card" content="${p.image ? "summary_large_image" : "summary"}">`,
13
+ `<meta name="twitter:title" content="${escapeHtml(p.title)}">`,
14
+ `<meta name="twitter:description" content="${escapeHtml(p.description)}">`,
15
+ ];
16
+ if (p.image) {
17
+ t.push(`<meta property="og:image" content="${escapeHtml(p.image)}">`);
18
+ t.push(`<meta name="twitter:image" content="${escapeHtml(p.image)}">`);
19
+ }
20
+ return `<title>${escapeHtml(p.title)}</title>\n${t.join("\n")}`;
21
+ }
22
+ /**
23
+ * Open Graph tags for shared links, so X, LinkedIn, WhatsApp and Slack show a card: a shared
24
+ * result (`/s/<token>`) with its picture, a public wizard (`/w/<token>`, as a chat
25
+ * `/w/<token>/chat`) with its title.
26
+ */
27
+ export async function linkPreview(path) {
28
+ const share = path.match(/^\/s\/([A-Za-z0-9_-]+)\/?$/);
29
+ if (share) {
30
+ const run = await sharedRun(share[1]);
31
+ if (!run) {
32
+ return null;
33
+ }
34
+ const view = await shareView(run);
35
+ return tags({
36
+ title: view.title === view.wizard.title ? view.title : `${view.title} · ${view.wizard.title}`,
37
+ description: view.message ?? view.wizard.description,
38
+ url: `${env.publicUrl}/s/${share[1]}`,
39
+ image: `${env.publicUrl}/api/shares/${share[1]}/image`,
40
+ });
41
+ }
42
+ const wizard = path.match(/^\/w\/([A-Za-z0-9_-]+)(\/chat)?\/?$/);
43
+ if (wizard) {
44
+ const w = await db.query.wizard.findFirst({ where: eq(schema.wizard.shareToken, wizard[1]) });
45
+ if (!w || w.publishedVersion === null || !w.shareEnabled) {
46
+ return null;
47
+ }
48
+ const v = await db.query.wizardVersion.findFirst({
49
+ where: and(eq(schema.wizardVersion.wizardId, w.id), eq(schema.wizardVersion.version, w.publishedVersion)),
50
+ });
51
+ return v
52
+ ? tags({
53
+ title: v.definition.title,
54
+ description: v.definition.description,
55
+ url: `${env.publicUrl}/w/${wizard[1]}${wizard[2] ?? ""}`,
56
+ })
57
+ : null;
58
+ }
59
+ return null;
60
+ }
@@ -0,0 +1,106 @@
1
+ import { format } from "node:util";
2
+ const RANK = { debug: 0, info: 1, warn: 2, error: 3 };
3
+ const KEEP = Number(process.env.LOG_KEEP) || 3000;
4
+ const LINE_MAX = 4000;
5
+ /** When this process started. */
6
+ export const startedAt = Date.now();
7
+ const lines = [];
8
+ let next = 1;
9
+ /** What never leaves a process in a log line: keys, tokens, one-time links, passwords. */
10
+ const SECRETS = [
11
+ [/(Bearer\s+)[A-Za-z0-9._~+/=-]{8,}/gi, "$1[redacted]"],
12
+ [/\bwz_[A-Za-z0-9_-]{6,}/g, "wz_[redacted]"],
13
+ [/\b(sk|rk|pk)-[A-Za-z0-9_-]{8,}/g, "$1-[redacted]"],
14
+ [/\bAIza[0-9A-Za-z_-]{20,}/g, "AIza[redacted]"],
15
+ [/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g, "[jwt]"],
16
+ [/([?&](?:k|t|rt|token|key|secret|code|password|api_?key)=)[^&\s"'<>]+/gi, "$1[redacted]"],
17
+ [
18
+ /((?:secret|password|passwd|token|api[_-]?key|authorization|refresh_token|access_token)["']?\s*[:=]\s*["']?)[^\s,"'}]{6,}/gi,
19
+ "$1[redacted]",
20
+ ],
21
+ ];
22
+ export function redact(text) {
23
+ let out = text;
24
+ for (const [pattern, replacement] of SECRETS) {
25
+ out = out.replace(pattern, replacement);
26
+ }
27
+ return out;
28
+ }
29
+ function push(level, args) {
30
+ const text = redact(format(...args)).slice(0, LINE_MAX);
31
+ lines.push({ id: next++, at: Date.now(), level, text });
32
+ if (lines.length > KEEP) {
33
+ lines.splice(0, lines.length - KEEP);
34
+ }
35
+ }
36
+ /** Keeps a line without printing it. */
37
+ export function note(level, text) {
38
+ push(level, [text]);
39
+ }
40
+ export function tail(query = {}) {
41
+ const limit = Math.min(Math.max(1, query.limit ?? 200), 2000);
42
+ const rank = RANK[query.level ?? "debug"] ?? 0;
43
+ const needle = query.q?.trim().toLowerCase();
44
+ const out = [];
45
+ for (let i = lines.length - 1; i >= 0 && out.length < limit; i--) {
46
+ const line = lines[i];
47
+ if (query.since !== undefined && line.id <= query.since) {
48
+ break;
49
+ }
50
+ if (query.after !== undefined && line.at < query.after) {
51
+ break;
52
+ }
53
+ if (RANK[line.level] < rank) {
54
+ continue;
55
+ }
56
+ if (needle && !line.text.toLowerCase().includes(needle)) {
57
+ continue;
58
+ }
59
+ out.push(line);
60
+ }
61
+ return out.reverse();
62
+ }
63
+ /** How many lines the ring holds and the id of the newest. */
64
+ export function logState() {
65
+ return { lines: lines.length, newest: next - 1, keeps: KEEP };
66
+ }
67
+ /** Reads a query string's values as a tail query. */
68
+ export function tailQuery(get) {
69
+ const int = (key) => {
70
+ const v = Number(get(key));
71
+ return Number.isSafeInteger(v) && v >= 0 ? v : undefined;
72
+ };
73
+ const level = get("level");
74
+ return {
75
+ since: int("since"),
76
+ after: int("after"),
77
+ limit: int("limit"),
78
+ level: level && level in RANK ? level : undefined,
79
+ q: get("q")?.slice(0, 200) || undefined,
80
+ };
81
+ }
82
+ let hooked = false;
83
+ /** Hooks the console once: each method still prints, and keeps a copy here. */
84
+ export function hookConsole() {
85
+ if (hooked) {
86
+ return;
87
+ }
88
+ hooked = true;
89
+ const methods = [
90
+ ["debug", "debug"],
91
+ ["log", "info"],
92
+ ["info", "info"],
93
+ ["warn", "warn"],
94
+ ["error", "error"],
95
+ ];
96
+ for (const [method, level] of methods) {
97
+ const original = console[method].bind(console);
98
+ console[method] = (...args) => {
99
+ push(level, args);
100
+ original(...args);
101
+ };
102
+ }
103
+ process.on("warning", (warning) => {
104
+ push("warn", [`${warning.name}: ${warning.message}`]);
105
+ });
106
+ }