@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,83 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { packageVersion } from "../cli/home.js";
4
+ import { env } from "../env.js";
5
+ import { managed } from "../manage.js";
6
+ /**
7
+ * Which Pro modules may load (docs/pro-modules.md). A Pro module is a closed
8
+ * plugin the linked account's plan includes, installed by pro.ts into a folder of its own. It
9
+ * loads while the entitlement the account's Manage-App signed lists it and has not ended, and
10
+ * only in the release it was built for. Kept apart from pro.ts, so the loader needs no network.
11
+ */
12
+ /** Where Pro modules are installed: apart from the person's own plugins, not watched. */
13
+ export const proModulesDir = () => join(env.dataDir, "pro-modules");
14
+ /** Written beside an installed module: what was installed, for which release. */
15
+ export const INSTALLED_FILE = ".engenty-module.json";
16
+ export const ENTITLEMENT_SETTING = "pro.entitlement";
17
+ let entitlement = null;
18
+ export function currentEntitlement() {
19
+ return entitlement;
20
+ }
21
+ export function setEntitlement(value) {
22
+ entitlement = value;
23
+ }
24
+ /** `0.2.26` → `v0.2.26`: the release this runtime is. */
25
+ export const runtimeTag = () => `v${packageVersion()}`;
26
+ export function installedModule(root) {
27
+ try {
28
+ return JSON.parse(readFileSync(join(root, INSTALLED_FILE), "utf8"));
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ export function heldBack(source) {
35
+ if (managed) {
36
+ return "managed";
37
+ }
38
+ const installed = installedModule(source.root);
39
+ if (!installed || installed.id !== source.id) {
40
+ return "not_installed";
41
+ }
42
+ if (installed.runtime !== runtimeTag()) {
43
+ return "release";
44
+ }
45
+ if (!(entitlement && entitlement.expiresAt > Date.now())) {
46
+ return "unconfirmed";
47
+ }
48
+ if (!entitlement.modules.includes(source.id)) {
49
+ return "plan";
50
+ }
51
+ return null;
52
+ }
53
+ let held = new Map();
54
+ /** The Pro modules that were found and did not load, with the reason, as of the last look. */
55
+ export function heldBackModules() {
56
+ return held;
57
+ }
58
+ /**
59
+ * The Pro modules of a look at the folders that may load, marked as such. A Pro module never
60
+ * takes the id of a plugin found elsewhere.
61
+ */
62
+ export function proSources(found, taken) {
63
+ const load = [];
64
+ const problems = [];
65
+ held = new Map();
66
+ for (const source of found) {
67
+ if (taken.has(source.id)) {
68
+ problems.push({
69
+ path: source.root,
70
+ message: `Plugin "${source.id}" is already loaded from another folder.`,
71
+ });
72
+ continue;
73
+ }
74
+ const reason = heldBack(source);
75
+ if (reason) {
76
+ held.set(source.id, reason);
77
+ }
78
+ else {
79
+ load.push({ ...source, pro: true });
80
+ }
81
+ }
82
+ return { load, problems };
83
+ }
@@ -0,0 +1,310 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import { mkdir, readdir, rename, rm, writeFile } from "node:fs/promises";
4
+ import { dirname, join } from "node:path";
5
+ import { unzipSync } from "fflate";
6
+ import { accountToken, linkedAccount } from "../auth/account.js";
7
+ import { env } from "../env.js";
8
+ import { managed, verifySigned } from "../manage.js";
9
+ import { deleteSetting, readSetting, writeSetting } from "../settings.js";
10
+ import { MANIFEST_FILE } from "./discovery.js";
11
+ import { findNewPlugins, reloadPlugin } from "./loader.js";
12
+ import { signedByUs } from "./pro-keys.js";
13
+ import { currentEntitlement, ENTITLEMENT_SETTING, heldBackModules, INSTALLED_FILE, installedModule, proModulesDir, runtimeTag, setEntitlement, } from "./pro-state.js";
14
+ import { loadedPlugin } from "./registry.js";
15
+ /*
16
+ * Pro modules on a runtime that runs alone (docs/pro-modules.md): the closed
17
+ * plugins the linked account's plan includes, fetched from its Manage-App.
18
+ *
19
+ * GET /v1/modules?runtime=<release> what is built for this release, the plan's
20
+ * part of it, and the signed entitlement
21
+ * GET /v1/modules/:id/package?runtime=<release> one module's zip
22
+ *
23
+ * A package is taken only when its SHA-256 and the signature over id, version, release and that
24
+ * hash check out against a key this runtime carries (pro-keys.ts): neither the Manage-App nor
25
+ * the way there can hand over code of their own.
26
+ */
27
+ /** The audience of an entitlement, as the Manage-App signs it. */
28
+ const AUDIENCE = "urn:engenty:wizards:modules";
29
+ /** Larger packages are refused before they are read. */
30
+ const MAX_PACKAGE = 30 * 1024 * 1024;
31
+ /** What a package may hold, besides its manifest. */
32
+ const PARTS = ["dist/", "migrations/"];
33
+ const base = () => `${env.local.accountUrl}/v1/modules`;
34
+ /** Something the person can mend or retry; the message is for them. */
35
+ export class ProModuleError extends Error {
36
+ status;
37
+ code;
38
+ constructor(message, status = 400, code = "pro_module") {
39
+ super(message);
40
+ this.status = status;
41
+ this.code = code;
42
+ }
43
+ }
44
+ let listing = null;
45
+ let lastError = null;
46
+ // --- the entitlement -------------------------------------------------------------------
47
+ /**
48
+ * At start, before the plugins load: what the last check said, while it lasts and belongs to the
49
+ * account that is linked now.
50
+ */
51
+ export async function loadEntitlement() {
52
+ if (managed) {
53
+ return;
54
+ }
55
+ const [stored, account] = await Promise.all([
56
+ readSetting(ENTITLEMENT_SETTING),
57
+ linkedAccount(),
58
+ ]);
59
+ setEntitlement(stored && account && stored.tenantId === account.tenantId ? stored : null);
60
+ }
61
+ async function keep(value) {
62
+ setEntitlement(value);
63
+ if (value) {
64
+ await writeSetting(ENTITLEMENT_SETTING, value);
65
+ }
66
+ else {
67
+ await deleteSetting(ENTITLEMENT_SETTING);
68
+ }
69
+ }
70
+ /** Loads and unloads Pro modules after the entitlement changed. */
71
+ async function apply(before) {
72
+ const after = currentEntitlement();
73
+ const same = before?.modules.join() === after?.modules.join() &&
74
+ (before?.expiresAt ?? 0) > Date.now() === (after?.expiresAt ?? 0) > Date.now();
75
+ if (!same) {
76
+ await findNewPlugins();
77
+ }
78
+ }
79
+ async function call(path, token) {
80
+ const url = new URL(`${base()}${path}`);
81
+ url.searchParams.set("runtime", runtimeTag());
82
+ const res = await fetch(url, {
83
+ headers: { authorization: `Bearer ${token}` },
84
+ signal: AbortSignal.timeout(60_000),
85
+ }).catch(() => null);
86
+ if (!res) {
87
+ throw new ProModuleError("Your engenty account is not reachable right now.", 502, "offline");
88
+ }
89
+ return res;
90
+ }
91
+ /**
92
+ * Asks the account what its plan includes now, keeps the signed answer and fetches what an
93
+ * installed module needs (a new release, a new build). Unreachable: what was confirmed lasts
94
+ * until it ends.
95
+ */
96
+ export async function refreshPro() {
97
+ if (managed) {
98
+ return;
99
+ }
100
+ const before = currentEntitlement();
101
+ const account = await linkedAccount();
102
+ if (!account) {
103
+ listing = null;
104
+ lastError = null;
105
+ await keep(null);
106
+ await apply(before);
107
+ return;
108
+ }
109
+ try {
110
+ const token = await accountToken();
111
+ if (!token) {
112
+ throw new ProModuleError("Your engenty account is not reachable right now.", 502, "offline");
113
+ }
114
+ const res = await call("", token);
115
+ if (res.status === 401) {
116
+ throw new ProModuleError("The engenty account no longer accepts this sign-in.", 403);
117
+ }
118
+ if (!res.ok) {
119
+ throw new ProModuleError(`The account did not answer as expected (${res.status}).`, 502);
120
+ }
121
+ const answer = (await res.json());
122
+ const claims = await verifySigned(answer.entitlement?.token ?? "", [AUDIENCE], env.local.accountUrl);
123
+ if (!claims || claims.sub !== account.tenantId || !Array.isArray(claims.modules)) {
124
+ throw new ProModuleError("The package's confirmation could not be checked.", 502);
125
+ }
126
+ listing = answer;
127
+ lastError = null;
128
+ await keep({
129
+ tenantId: account.tenantId,
130
+ modules: claims.modules.map(String),
131
+ plan: answer.plan ?? null,
132
+ expiresAt: (claims.exp ?? 0) * 1000,
133
+ checkedAt: Date.now(),
134
+ });
135
+ await apply(before);
136
+ await updateInstalled();
137
+ }
138
+ catch (err) {
139
+ lastError = err.message;
140
+ console.error("[pro modules]", lastError);
141
+ }
142
+ }
143
+ let timer = null;
144
+ /** Checks at start, then once a day while the runtime runs; a check that failed, within the hour. */
145
+ export function startProChecks() {
146
+ if (managed || timer) {
147
+ return;
148
+ }
149
+ void refreshPro();
150
+ timer = setInterval(() => {
151
+ const checkedAt = currentEntitlement()?.checkedAt ?? 0;
152
+ if (lastError || Date.now() - checkedAt > 23 * 3600_000) {
153
+ void refreshPro();
154
+ }
155
+ }, 3600_000);
156
+ timer.unref();
157
+ }
158
+ // --- installing ------------------------------------------------------------------------
159
+ async function installedIds() {
160
+ const entries = await readdir(proModulesDir(), { withFileTypes: true }).catch(() => []);
161
+ return entries.filter((e) => e.isDirectory() && !e.name.startsWith(".")).map((e) => e.name);
162
+ }
163
+ /** Installed modules built for another release or from another build are fetched anew. */
164
+ async function updateInstalled() {
165
+ for (const id of await installedIds()) {
166
+ const entry = listing?.modules.find((m) => m.id === id);
167
+ const installed = installedModule(join(proModulesDir(), id));
168
+ if (entry?.included && installed?.sha256 !== entry.sha256) {
169
+ await installPro(id).catch((err) => console.error(`[pro modules] ${id}: update failed:`, err.message));
170
+ }
171
+ }
172
+ }
173
+ /** The files of a zip, refusing any that would land outside the module's folder. */
174
+ function filesOf(zip) {
175
+ let files;
176
+ try {
177
+ files = unzipSync(zip);
178
+ }
179
+ catch {
180
+ throw new ProModuleError("The package is damaged.", 502);
181
+ }
182
+ const out = {};
183
+ for (const [name, data] of Object.entries(files)) {
184
+ if (name.endsWith("/")) {
185
+ continue;
186
+ }
187
+ const parts = name.split("/");
188
+ const safe = parts.every((p) => p && p !== "." && p !== ".." && !p.includes("\\"));
189
+ const allowed = name === MANIFEST_FILE || PARTS.some((part) => name.startsWith(part));
190
+ if (!(safe && allowed)) {
191
+ throw new ProModuleError(`The package holds a file it may not: ${name}`, 502);
192
+ }
193
+ out[name] = data;
194
+ }
195
+ return out;
196
+ }
197
+ /** Fetches one module of the plan, checks it and puts it in place; then it loads. */
198
+ export async function installPro(id) {
199
+ if (managed) {
200
+ throw new ProModuleError("Not available here.", 404, "not_found");
201
+ }
202
+ const token = await accountToken();
203
+ if (!token) {
204
+ throw new ProModuleError("Sign in to your engenty account first (Settings → Account).", 409);
205
+ }
206
+ if (!listing) {
207
+ await refreshPro();
208
+ }
209
+ const entry = listing?.modules.find((m) => m.id === id);
210
+ if (!entry) {
211
+ throw new ProModuleError(`There is no build of this module for ${runtimeTag()}.`, 404, "not_found");
212
+ }
213
+ if (!entry.included) {
214
+ throw new ProModuleError("This module is not part of your plan.", 403, "plan");
215
+ }
216
+ const res = await call(`/${encodeURIComponent(id)}/package`, token);
217
+ if (!res.ok) {
218
+ throw new ProModuleError(`The module could not be fetched (${res.status}).`, 502);
219
+ }
220
+ if (Number(res.headers.get("content-length") ?? 0) > MAX_PACKAGE) {
221
+ throw new ProModuleError("The package is too large.", 502);
222
+ }
223
+ const zip = new Uint8Array(await res.arrayBuffer());
224
+ const sha256 = createHash("sha256").update(zip).digest("hex");
225
+ const genuine = sha256 === entry.sha256 &&
226
+ signedByUs({
227
+ id,
228
+ version: entry.version,
229
+ runtime: runtimeTag(),
230
+ sha256,
231
+ signature: entry.signature,
232
+ });
233
+ if (zip.length > MAX_PACKAGE || !genuine) {
234
+ throw new ProModuleError("The package is not signed by engenty and was discarded.", 502);
235
+ }
236
+ const files = filesOf(zip);
237
+ const manifest = JSON.parse(new TextDecoder().decode(files[MANIFEST_FILE] ?? new Uint8Array()));
238
+ if (manifest?.id !== id) {
239
+ throw new ProModuleError("The package does not belong to this module.", 502);
240
+ }
241
+ const dir = proModulesDir();
242
+ const target = join(dir, id);
243
+ const fresh = join(dir, `.new-${id}-${randomBytes(4).toString("hex")}`);
244
+ const old = join(dir, `.old-${id}-${randomBytes(4).toString("hex")}`);
245
+ await mkdir(fresh, { recursive: true });
246
+ try {
247
+ for (const [path, data] of Object.entries(files)) {
248
+ await mkdir(dirname(join(fresh, path)), { recursive: true });
249
+ await writeFile(join(fresh, path), data);
250
+ }
251
+ const installed = {
252
+ id,
253
+ version: entry.version,
254
+ runtime: runtimeTag(),
255
+ sha256,
256
+ installedAt: new Date().toISOString(),
257
+ };
258
+ await writeFile(join(fresh, INSTALLED_FILE), `${JSON.stringify(installed, null, 2)}\n`);
259
+ if (existsSync(target)) {
260
+ await rename(target, old);
261
+ }
262
+ await rename(fresh, target);
263
+ }
264
+ finally {
265
+ await rm(fresh, { recursive: true, force: true });
266
+ await rm(old, { recursive: true, force: true });
267
+ }
268
+ await reloadPlugin(id);
269
+ }
270
+ /** Removes an installed module; its tables and what is in them stay. */
271
+ export async function removePro(id) {
272
+ if (managed || !(await installedIds()).includes(id)) {
273
+ throw new ProModuleError("This module is not installed.", 404, "not_found");
274
+ }
275
+ await rm(join(proModulesDir(), id), { recursive: true, force: true });
276
+ await findNewPlugins();
277
+ }
278
+ export async function proState() {
279
+ const entitlement = currentEntitlement();
280
+ const account = await linkedAccount();
281
+ const ids = new Set([...(listing?.modules.map((m) => m.id) ?? []), ...(await installedIds())]);
282
+ const modules = [...ids].sort().map((id) => {
283
+ const entry = listing?.modules.find((m) => m.id === id);
284
+ const installed = installedModule(join(proModulesDir(), id));
285
+ const plugin = loadedPlugin(id);
286
+ return {
287
+ id,
288
+ name: entry?.name ?? plugin?.source.manifest.name ?? id,
289
+ version: entry?.version ?? installed?.version ?? "",
290
+ description: entry?.description ?? plugin?.source.manifest.description ?? "",
291
+ size: entry?.size ?? null,
292
+ included: entitlement?.modules.includes(id) ?? false,
293
+ installed: installed ? { version: installed.version, runtime: installed.runtime } : null,
294
+ loaded: Boolean(plugin?.source.pro),
295
+ heldBack: heldBackModules().get(id) ?? null,
296
+ update: Boolean(entry?.included && installed && installed.sha256 !== entry.sha256),
297
+ };
298
+ });
299
+ return {
300
+ linked: Boolean(account),
301
+ /** Where the plans are: `<accountUrl>/billing`. */
302
+ accountUrl: env.local.accountUrl,
303
+ runtime: runtimeTag(),
304
+ plan: entitlement?.plan ?? listing?.plan ?? null,
305
+ expiresAt: entitlement ? new Date(entitlement.expiresAt).toISOString() : null,
306
+ checkedAt: entitlement ? new Date(entitlement.checkedAt).toISOString() : null,
307
+ error: lastError,
308
+ modules,
309
+ };
310
+ }
@@ -0,0 +1,44 @@
1
+ import { and, eq } from "drizzle-orm";
2
+ import { nanoid } from "nanoid";
3
+ import { control, controlDb } from "../db/client.js";
4
+ import { env } from "../env.js";
5
+ import { currentTenant } from "../tenants/tenant.js";
6
+ /**
7
+ * Public addresses of plugins (`server.publicUrl`): `/api/public/plugins/<plugin>/<ref>/…`. The
8
+ * ref names the tenant without giving its id away; one per tenant and plugin, kept for good.
9
+ * A shared route (`server.sharedUrl`) is `/api/public/plugins/<plugin>/shared/…` for every
10
+ * tenant: a ref is 24 characters, so it is never `shared`.
11
+ */
12
+ export const SHARED = "shared";
13
+ const rest = (path) => {
14
+ const p = path.startsWith("/") ? path : `/${path}`;
15
+ return p === "/" ? "" : p;
16
+ };
17
+ /** The full address of a plugin's public route for the current tenant. */
18
+ export async function publicUrlOf(plugin, path) {
19
+ return `${env.publicUrl}/api/public/plugins/${plugin}/${await publicRefOf(plugin)}${rest(path)}`;
20
+ }
21
+ /** The full address of a plugin's shared route. */
22
+ export function sharedUrlOf(plugin, path) {
23
+ return `${env.publicUrl}/api/public/plugins/${plugin}/${SHARED}${rest(path)}`;
24
+ }
25
+ /** The ref of a tenant's public address for a plugin (the current tenant's by default), made the first time. */
26
+ export async function publicRefOf(plugin, tenantId = currentTenant()) {
27
+ const where = and(eq(control.pluginAddress.tenantId, tenantId), eq(control.pluginAddress.plugin, plugin));
28
+ let row = await controlDb.query.pluginAddress.findFirst({ where });
29
+ if (!row) {
30
+ await controlDb
31
+ .insert(control.pluginAddress)
32
+ .values({ ref: nanoid(24), tenantId, plugin })
33
+ .onConflictDoNothing();
34
+ row = (await controlDb.query.pluginAddress.findFirst({ where }));
35
+ }
36
+ return row.ref;
37
+ }
38
+ /** The tenant a plugin's public address belongs to. */
39
+ export async function tenantOfAddress(plugin, ref) {
40
+ const row = await controlDb.query.pluginAddress.findFirst({
41
+ where: eq(control.pluginAddress.ref, ref),
42
+ });
43
+ return row?.plugin === plugin ? row.tenantId : null;
44
+ }
@@ -0,0 +1,122 @@
1
+ import { createHash } from "node:crypto";
2
+ import { EventEmitter } from "node:events";
3
+ import { readFileSync } from "node:fs";
4
+ import { env } from "../env.js";
5
+ import { managed, tenantInfo } from "../manage.js";
6
+ const plugins = new Map();
7
+ let generations = 0;
8
+ export function nextGeneration() {
9
+ return ++generations;
10
+ }
11
+ export function emptyRecord(source) {
12
+ return {
13
+ source,
14
+ generation: nextGeneration(),
15
+ error: null,
16
+ routes: [],
17
+ tools: new Map(),
18
+ contexts: [],
19
+ assistantTools: new Map(),
20
+ assistantPages: [],
21
+ publicRoutes: [],
22
+ sharedRoutes: [],
23
+ runners: new Map(),
24
+ jobs: new Map(),
25
+ starters: new Map(),
26
+ listeners: {},
27
+ migrations: [],
28
+ disposers: [],
29
+ stopped: new AbortController(),
30
+ };
31
+ }
32
+ export function setPlugin(record) {
33
+ plugins.set(record.source.id, record);
34
+ }
35
+ export function dropPlugin(id) {
36
+ const record = plugins.get(id);
37
+ plugins.delete(id);
38
+ return record;
39
+ }
40
+ export function loadedPlugin(id) {
41
+ return plugins.get(id);
42
+ }
43
+ export function loadedPlugins() {
44
+ return [...plugins.values()];
45
+ }
46
+ /** `/items/:id` as a pattern for the address below the plugin's own. */
47
+ export function compileRoute(route) {
48
+ const params = [];
49
+ const path = route.path.startsWith("/") ? route.path : `/${route.path}`;
50
+ const source = path
51
+ .replace(/\/+$/, "")
52
+ .split("/")
53
+ .map((part) => {
54
+ if (part.startsWith(":")) {
55
+ params.push(part.slice(1));
56
+ return "([^/]+)";
57
+ }
58
+ return part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
59
+ })
60
+ .join("/");
61
+ return { route, pattern: new RegExp(`^${source}/?$`), params };
62
+ }
63
+ // --- which tenant has which plugin -----------------------------------------------------
64
+ /**
65
+ * The ids of the plugins a tenant has. A runtime that runs alone has every plugin it loaded.
66
+ * Managed, a tenant has the ones in `PLUGINS_DEFAULT` and the ones the Manage-App lists for it
67
+ * (`modules` of `GET /v1/tenants/:id`).
68
+ */
69
+ export async function pluginIdsOf(tenantId) {
70
+ if (!managed) {
71
+ return new Set(plugins.keys());
72
+ }
73
+ const listed = await tenantInfo(tenantId)
74
+ .then((info) => info.modules ?? [])
75
+ .catch(() => []);
76
+ return new Set([...env.plugins.defaults, ...listed].filter((id) => plugins.has(id)));
77
+ }
78
+ export async function pluginsOf(tenantId) {
79
+ const ids = await pluginIdsOf(tenantId);
80
+ return loadedPlugins().filter((p) => ids.has(p.source.id));
81
+ }
82
+ /** The tools the tenant's plugins add, by the id a step lists them under. */
83
+ export async function pluginToolsOf(tenantId) {
84
+ return (await pluginsOf(tenantId)).flatMap((plugin) => [...plugin.tools.values()].map((tool) => ({
85
+ id: `${plugin.source.id}.${tool.name}`,
86
+ title: tool.title ?? tool.name,
87
+ description: tool.description,
88
+ })));
89
+ }
90
+ /** The starters the tenant's plugins bring, in the order the plugins registered them. */
91
+ export async function pluginStartersOf(tenantId) {
92
+ return (await pluginsOf(tenantId)).flatMap((plugin) => [...plugin.starters.values()].map((starter) => ({
93
+ id: `${plugin.source.id}.${starter.id}`,
94
+ plugin,
95
+ starter,
96
+ })));
97
+ }
98
+ /** The built studio half as it is on disk now; null when the plugin has none. */
99
+ export function pluginAsset(record, kind) {
100
+ const file = record.source[kind];
101
+ if (!file) {
102
+ return null;
103
+ }
104
+ try {
105
+ return {
106
+ file,
107
+ rev: createHash("sha256").update(readFileSync(file)).digest("hex").slice(0, 12),
108
+ };
109
+ }
110
+ catch {
111
+ return null;
112
+ }
113
+ }
114
+ const changes = new EventEmitter();
115
+ changes.setMaxListeners(0);
116
+ export function announceChange(change) {
117
+ changes.emit("change", change);
118
+ }
119
+ export function onPluginChange(listener) {
120
+ changes.on("change", listener);
121
+ return () => changes.off("change", listener);
122
+ }