@engenty/wizards-runtime 0.0.0-stage → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +214 -2
  3. package/apps/runtime/dist/agents/architect.js +444 -0
  4. package/apps/runtime/dist/agents/studio-assistant.js +883 -0
  5. package/apps/runtime/dist/agents/subscription.js +207 -0
  6. package/apps/runtime/dist/agents/thought.js +21 -0
  7. package/apps/runtime/dist/agents/website.js +480 -0
  8. package/apps/runtime/dist/app.js +359 -0
  9. package/apps/runtime/dist/apple/wizards-apple +0 -0
  10. package/apps/runtime/dist/assistant/browser.js +26 -0
  11. package/apps/runtime/dist/assistant/docs.js +158 -0
  12. package/apps/runtime/dist/assistant/knows.js +353 -0
  13. package/apps/runtime/dist/assistant/primer.js +26 -0
  14. package/apps/runtime/dist/assistant/runs.js +24 -0
  15. package/apps/runtime/dist/auth/account.js +175 -0
  16. package/apps/runtime/dist/auth/device.js +112 -0
  17. package/apps/runtime/dist/auth/index.js +358 -0
  18. package/apps/runtime/dist/auth/keys.js +55 -0
  19. package/apps/runtime/dist/auth/local-ticket.js +26 -0
  20. package/apps/runtime/dist/authoring/example.js +74 -0
  21. package/apps/runtime/dist/authoring/guide.js +433 -0
  22. package/apps/runtime/dist/authoring/ops.js +117 -0
  23. package/apps/runtime/dist/browser/fast/action-space.js +160 -0
  24. package/apps/runtime/dist/browser/fast/classifier.js +91 -0
  25. package/apps/runtime/dist/browser/fast/decide.js +171 -0
  26. package/apps/runtime/dist/browser/fast/driver.js +141 -0
  27. package/apps/runtime/dist/browser/fast/instructions.js +33 -0
  28. package/apps/runtime/dist/browser/fast/run.js +249 -0
  29. package/apps/runtime/dist/browser/fast/span-picker.js +153 -0
  30. package/apps/runtime/dist/browser/fast/text-helper.js +178 -0
  31. package/apps/runtime/dist/browser/snapshot.js +335 -0
  32. package/apps/runtime/dist/cli/account.js +385 -0
  33. package/apps/runtime/dist/cli/autostart.js +182 -0
  34. package/apps/runtime/dist/cli/autoupdate.js +221 -0
  35. package/apps/runtime/dist/cli/clients.js +44 -0
  36. package/apps/runtime/dist/cli/connect.js +540 -0
  37. package/apps/runtime/dist/cli/environment.js +95 -0
  38. package/apps/runtime/dist/cli/exec.js +45 -0
  39. package/apps/runtime/dist/cli/features.js +50 -0
  40. package/apps/runtime/dist/cli/home.js +88 -0
  41. package/apps/runtime/dist/cli/install-env.js +33 -0
  42. package/apps/runtime/dist/cli/machine.js +107 -0
  43. package/apps/runtime/dist/cli/main.js +231 -0
  44. package/apps/runtime/dist/cli/mcp.js +136 -0
  45. package/apps/runtime/dist/cli/menu.js +202 -0
  46. package/apps/runtime/dist/cli/processes.js +72 -0
  47. package/apps/runtime/dist/cli/report.js +66 -0
  48. package/apps/runtime/dist/cli/sandbox.js +77 -0
  49. package/apps/runtime/dist/cli/setup.js +335 -0
  50. package/apps/runtime/dist/cli/start.js +276 -0
  51. package/apps/runtime/dist/cli/status.js +212 -0
  52. package/apps/runtime/dist/cli/ui.js +59 -0
  53. package/apps/runtime/dist/cli/uninstall-main.js +20 -0
  54. package/apps/runtime/dist/cli/uninstall.js +231 -0
  55. package/apps/runtime/dist/cli/update.js +86 -0
  56. package/apps/runtime/dist/cli/validate.js +75 -0
  57. package/apps/runtime/dist/cli/versions.js +123 -0
  58. package/apps/runtime/dist/connectors/builtin.js +86 -0
  59. package/apps/runtime/dist/connectors/external.js +409 -0
  60. package/apps/runtime/dist/connectors/gmail.js +107 -0
  61. package/apps/runtime/dist/connectors/imap.js +261 -0
  62. package/apps/runtime/dist/connectors/index.js +325 -0
  63. package/apps/runtime/dist/connectors/mail.js +72 -0
  64. package/apps/runtime/dist/connectors/outlook.js +90 -0
  65. package/apps/runtime/dist/connectors/plugin-connections.js +343 -0
  66. package/apps/runtime/dist/connectors/via-account.js +65 -0
  67. package/apps/runtime/dist/credits/credits.js +100 -0
  68. package/apps/runtime/dist/credits/estimate.js +152 -0
  69. package/apps/runtime/dist/db/adopt.js +149 -0
  70. package/apps/runtime/dist/db/client.js +173 -0
  71. package/apps/runtime/dist/db/control-schema.js +133 -0
  72. package/apps/runtime/dist/db/migrations/control/0000_last_absorbing_man.sql +47 -0
  73. package/apps/runtime/dist/db/migrations/control/0001_gorgeous_nicolaos.sql +41 -0
  74. package/apps/runtime/dist/db/migrations/control/0002_secret_penance.sql +1 -0
  75. package/apps/runtime/dist/db/migrations/control/0003_nasty_mordo.sql +3 -0
  76. package/apps/runtime/dist/db/migrations/control/0004_breezy_eddie_brock.sql +6 -0
  77. package/apps/runtime/dist/db/migrations/control/0005_chilly_oracle.sql +1 -0
  78. package/apps/runtime/dist/db/migrations/control/0006_sleepy_mojo.sql +1 -0
  79. package/apps/runtime/dist/db/migrations/control/0007_common_the_hand.sql +15 -0
  80. package/apps/runtime/dist/db/migrations/control/0008_runner.sql +8 -0
  81. package/apps/runtime/dist/db/migrations/control/0009_plugin_claim.sql +9 -0
  82. package/apps/runtime/dist/db/migrations/control/0010_tan_snowbird.sql +6 -0
  83. package/apps/runtime/dist/db/migrations/control/meta/0000_snapshot.json +311 -0
  84. package/apps/runtime/dist/db/migrations/control/meta/0001_snapshot.json +599 -0
  85. package/apps/runtime/dist/db/migrations/control/meta/0002_snapshot.json +607 -0
  86. package/apps/runtime/dist/db/migrations/control/meta/0003_snapshot.json +311 -0
  87. package/apps/runtime/dist/db/migrations/control/meta/0004_snapshot.json +350 -0
  88. package/apps/runtime/dist/db/migrations/control/meta/0005_snapshot.json +358 -0
  89. package/apps/runtime/dist/db/migrations/control/meta/0006_snapshot.json +365 -0
  90. package/apps/runtime/dist/db/migrations/control/meta/0007_snapshot.json +460 -0
  91. package/apps/runtime/dist/db/migrations/control/meta/0008_snapshot.json +505 -0
  92. package/apps/runtime/dist/db/migrations/control/meta/0009_snapshot.json +561 -0
  93. package/apps/runtime/dist/db/migrations/control/meta/0010_snapshot.json +600 -0
  94. package/apps/runtime/dist/db/migrations/control/meta/_journal.json +83 -0
  95. package/apps/runtime/dist/db/migrations/tenant/0000_eminent_freak.sql +188 -0
  96. package/apps/runtime/dist/db/migrations/tenant/0001_salty_master_chief.sql +1 -0
  97. package/apps/runtime/dist/db/migrations/tenant/0002_cloudy_firebird.sql +1 -0
  98. package/apps/runtime/dist/db/migrations/tenant/0003_brown_warbound.sql +52 -0
  99. package/apps/runtime/dist/db/migrations/tenant/0004_romantic_nocturne.sql +6 -0
  100. package/apps/runtime/dist/db/migrations/tenant/0005_reflective_forgotten_one.sql +2 -0
  101. package/apps/runtime/dist/db/migrations/tenant/0006_hard_war_machine.sql +30 -0
  102. package/apps/runtime/dist/db/migrations/tenant/0007_space_data.sql +43 -0
  103. package/apps/runtime/dist/db/migrations/tenant/0008_run_event_note.sql +1 -0
  104. package/apps/runtime/dist/db/migrations/tenant/0009_knowledge.sql +104 -0
  105. package/apps/runtime/dist/db/migrations/tenant/0010_plugin_connection.sql +15 -0
  106. package/apps/runtime/dist/db/migrations/tenant/0011_runners.sql +2 -0
  107. package/apps/runtime/dist/db/migrations/tenant/0012_assistant_chat.sql +40 -0
  108. package/apps/runtime/dist/db/migrations/tenant/0013_run_origin.sql +1 -0
  109. package/apps/runtime/dist/db/migrations/tenant/0014_run_answer.sql +2 -0
  110. package/apps/runtime/dist/db/migrations/tenant/0015_device_calls.sql +13 -0
  111. package/apps/runtime/dist/db/migrations/tenant/0016_even_trish_tilby.sql +12 -0
  112. package/apps/runtime/dist/db/migrations/tenant/meta/0000_snapshot.json +1323 -0
  113. package/apps/runtime/dist/db/migrations/tenant/meta/0001_snapshot.json +1330 -0
  114. package/apps/runtime/dist/db/migrations/tenant/meta/0002_snapshot.json +1337 -0
  115. package/apps/runtime/dist/db/migrations/tenant/meta/0003_snapshot.json +1605 -0
  116. package/apps/runtime/dist/db/migrations/tenant/meta/0004_snapshot.json +1645 -0
  117. package/apps/runtime/dist/db/migrations/tenant/meta/0005_snapshot.json +1659 -0
  118. package/apps/runtime/dist/db/migrations/tenant/meta/0006_snapshot.json +1696 -0
  119. package/apps/runtime/dist/db/migrations/tenant/meta/0007_snapshot.json +2012 -0
  120. package/apps/runtime/dist/db/migrations/tenant/meta/0008_snapshot.json +2019 -0
  121. package/apps/runtime/dist/db/migrations/tenant/meta/0009_snapshot.json +2837 -0
  122. package/apps/runtime/dist/db/migrations/tenant/meta/0010_snapshot.json +2942 -0
  123. package/apps/runtime/dist/db/migrations/tenant/meta/0011_snapshot.json +2956 -0
  124. package/apps/runtime/dist/db/migrations/tenant/meta/0012_snapshot.json +3132 -0
  125. package/apps/runtime/dist/db/migrations/tenant/meta/0013_snapshot.json +3139 -0
  126. package/apps/runtime/dist/db/migrations/tenant/meta/0014_snapshot.json +3154 -0
  127. package/apps/runtime/dist/db/migrations/tenant/meta/0015_snapshot.json +3243 -0
  128. package/apps/runtime/dist/db/migrations/tenant/meta/0016_snapshot.json +3326 -0
  129. package/apps/runtime/dist/db/migrations/tenant/meta/_journal.json +125 -0
  130. package/apps/runtime/dist/db/schema.js +602 -0
  131. package/apps/runtime/dist/debug.js +197 -0
  132. package/apps/runtime/dist/docs/dev/index.md +41 -0
  133. package/apps/runtime/dist/docs/dev/meta.json +7 -0
  134. package/apps/runtime/dist/docs/dev/plugins/connections.md +74 -0
  135. package/apps/runtime/dist/docs/dev/plugins/events.md +89 -0
  136. package/apps/runtime/dist/docs/dev/plugins/examples.md +101 -0
  137. package/apps/runtime/dist/docs/dev/plugins/index.md +78 -0
  138. package/apps/runtime/dist/docs/dev/plugins/layout.md +90 -0
  139. package/apps/runtime/dist/docs/dev/plugins/meta.json +28 -0
  140. package/apps/runtime/dist/docs/dev/plugins/quick-start.md +94 -0
  141. package/apps/runtime/dist/docs/dev/plugins/reference.md +348 -0
  142. package/apps/runtime/dist/docs/dev/plugins/reloading.md +76 -0
  143. package/apps/runtime/dist/docs/dev/plugins/routes.md +185 -0
  144. package/apps/runtime/dist/docs/dev/plugins/runners.md +230 -0
  145. package/apps/runtime/dist/docs/dev/plugins/server.md +281 -0
  146. package/apps/runtime/dist/docs/dev/plugins/shipping.md +79 -0
  147. package/apps/runtime/dist/docs/dev/plugins/space.md +297 -0
  148. package/apps/runtime/dist/docs/dev/plugins/starters.md +70 -0
  149. package/apps/runtime/dist/docs/dev/plugins/studio.md +363 -0
  150. package/apps/runtime/dist/docs/dev/plugins/styling.md +129 -0
  151. package/apps/runtime/dist/docs/dev/plugins/tables.md +104 -0
  152. package/apps/runtime/dist/docs/dev/plugins/tools.md +139 -0
  153. package/apps/runtime/dist/docs/dev/wizard-format.md +125 -0
  154. package/apps/runtime/dist/docs/meta.json +3 -0
  155. package/apps/runtime/dist/docs/user/ai-apps.md +112 -0
  156. package/apps/runtime/dist/docs/user/assistant.md +77 -0
  157. package/apps/runtime/dist/docs/user/build-a-wizard.md +116 -0
  158. package/apps/runtime/dist/docs/user/command-line.md +86 -0
  159. package/apps/runtime/dist/docs/user/connectors.md +90 -0
  160. package/apps/runtime/dist/docs/user/create-account.md +52 -0
  161. package/apps/runtime/dist/docs/user/data.md +66 -0
  162. package/apps/runtime/dist/docs/user/first-start.md +60 -0
  163. package/apps/runtime/dist/docs/user/index.md +49 -0
  164. package/apps/runtime/dist/docs/user/install.md +123 -0
  165. package/apps/runtime/dist/docs/user/local-only.md +42 -0
  166. package/apps/runtime/dist/docs/user/meta.json +32 -0
  167. package/apps/runtime/dist/docs/user/models.md +156 -0
  168. package/apps/runtime/dist/docs/user/plugins.md +71 -0
  169. package/apps/runtime/dist/docs/user/run.md +98 -0
  170. package/apps/runtime/dist/docs/user/server.md +52 -0
  171. package/apps/runtime/dist/docs/user/space.md +126 -0
  172. package/apps/runtime/dist/docs/user/steps.md +220 -0
  173. package/apps/runtime/dist/docs/user/test-and-share.md +224 -0
  174. package/apps/runtime/dist/docs/user/troubleshooting.md +67 -0
  175. package/apps/runtime/dist/docs/user/wordpress.md +121 -0
  176. package/apps/runtime/dist/documents/parse.js +246 -0
  177. package/apps/runtime/dist/engenty/connections-external/build-connector.js +193 -0
  178. package/apps/runtime/dist/engenty/connections-external/errors.js +11 -0
  179. package/apps/runtime/dist/engenty/connections-external/import-service.js +270 -0
  180. package/apps/runtime/dist/engenty/connections-external/importer/classify.js +34 -0
  181. package/apps/runtime/dist/engenty/connections-external/importer/map-auth.js +185 -0
  182. package/apps/runtime/dist/engenty/connections-external/importer/normalize-mcp.js +63 -0
  183. package/apps/runtime/dist/engenty/connections-external/importer/normalize-openapi.js +130 -0
  184. package/apps/runtime/dist/engenty/connections-external/invoke/http-invoker.js +143 -0
  185. package/apps/runtime/dist/engenty/connections-external/invoke/mcp-client.js +143 -0
  186. package/apps/runtime/dist/engenty/connections-external/net/guarded-fetch.js +119 -0
  187. package/apps/runtime/dist/engenty/connections-external/oauth-dcr.js +88 -0
  188. package/apps/runtime/dist/engenty/connections-external/registry-client.js +336 -0
  189. package/apps/runtime/dist/engenty/connections-external/registry-source.js +82 -0
  190. package/apps/runtime/dist/engenty/connections-external/types.js +7 -0
  191. package/apps/runtime/dist/engenty/connections-github/connector.js +209 -0
  192. package/apps/runtime/dist/engenty/connections-google/connectors/calendar.js +381 -0
  193. package/apps/runtime/dist/engenty/connections-google/connectors/contacts.js +94 -0
  194. package/apps/runtime/dist/engenty/connections-google/connectors/drive.js +290 -0
  195. package/apps/runtime/dist/engenty/connections-google/connectors/gmail.js +567 -0
  196. package/apps/runtime/dist/engenty/connections-google/definitions.js +11 -0
  197. package/apps/runtime/dist/engenty/connections-google/shared.js +73 -0
  198. package/apps/runtime/dist/engenty/connections-hubspot/connector.js +140 -0
  199. package/apps/runtime/dist/engenty/connections-microsoft/action.js +17 -0
  200. package/apps/runtime/dist/engenty/connections-microsoft/graph.js +114 -0
  201. package/apps/runtime/dist/engenty/connections-microsoft/onedrive.js +286 -0
  202. package/apps/runtime/dist/engenty/connections-microsoft/outlook.js +492 -0
  203. package/apps/runtime/dist/engenty/connections-s3/s3.js +328 -0
  204. package/apps/runtime/dist/engenty/connections-sdk/files-capability.js +86 -0
  205. package/apps/runtime/dist/engenty/connections-sdk/oauth2.js +150 -0
  206. package/apps/runtime/dist/engenty/connections-sdk/registry.js +89 -0
  207. package/apps/runtime/dist/engenty/connections-sdk/storage-capability.js +84 -0
  208. package/apps/runtime/dist/engenty/connections-sdk/types.js +30 -0
  209. package/apps/runtime/dist/engenty/connections-slack/connector.js +360 -0
  210. package/apps/runtime/dist/engenty/csv-import/csv-matrix.js +178 -0
  211. package/apps/runtime/dist/engenty/csv-import/import-sources.js +87 -0
  212. package/apps/runtime/dist/engenty/csv-import/parse-csv.js +129 -0
  213. package/apps/runtime/dist/engenty/csv-import/serialize-csv.js +20 -0
  214. package/apps/runtime/dist/engenty/csv-import/types.js +1 -0
  215. package/apps/runtime/dist/engenty/csv-import/xlsx-workbook.js +159 -0
  216. package/apps/runtime/dist/engenty/doc-converter/interface.js +9 -0
  217. package/apps/runtime/dist/engenty/doc-converter/page-break.js +92 -0
  218. package/apps/runtime/dist/engenty/doc-converter/providers/local/index.js +72 -0
  219. package/apps/runtime/dist/engenty/document-scanner/schemas/classifier.js +30 -0
  220. package/apps/runtime/dist/engenty/document-scanner/schemas/index.js +4 -0
  221. package/apps/runtime/dist/engenty/document-scanner/schemas/invoice.js +73 -0
  222. package/apps/runtime/dist/engenty/document-scanner/schemas/receipt.js +63 -0
  223. package/apps/runtime/dist/engenty/document-scanner/schemas/shared.js +40 -0
  224. package/apps/runtime/dist/engenty/search-index/chunks.js +164 -0
  225. package/apps/runtime/dist/engenty/search-index/contracts.js +9 -0
  226. package/apps/runtime/dist/engenty/shims/connections-sdk.js +39 -0
  227. package/apps/runtime/dist/engenty/shims/plugin-sdk.js +1 -0
  228. package/apps/runtime/dist/engenty/shims/web-ingest.js +19 -0
  229. package/apps/runtime/dist/engenty/web-ingest/ssrf.js +277 -0
  230. package/apps/runtime/dist/engine/asks.js +82 -0
  231. package/apps/runtime/dist/engine/decide.js +82 -0
  232. package/apps/runtime/dist/engine/device.js +194 -0
  233. package/apps/runtime/dist/engine/events.js +128 -0
  234. package/apps/runtime/dist/engine/input.js +208 -0
  235. package/apps/runtime/dist/engine/owner.js +32 -0
  236. package/apps/runtime/dist/engine/prepare.js +90 -0
  237. package/apps/runtime/dist/engine/push.js +58 -0
  238. package/apps/runtime/dist/engine/requirements.js +355 -0
  239. package/apps/runtime/dist/engine/resources.js +198 -0
  240. package/apps/runtime/dist/engine/runner.js +970 -0
  241. package/apps/runtime/dist/engine/steps.js +1000 -0
  242. package/apps/runtime/dist/engine/surface.js +91 -0
  243. package/apps/runtime/dist/engine/template.js +240 -0
  244. package/apps/runtime/dist/engine/types.js +4 -0
  245. package/apps/runtime/dist/env.js +279 -0
  246. package/apps/runtime/dist/features.js +123 -0
  247. package/apps/runtime/dist/files/blobs.js +22 -0
  248. package/apps/runtime/dist/files/objects.js +86 -0
  249. package/apps/runtime/dist/files/storage.js +120 -0
  250. package/apps/runtime/dist/files/web-images.js +101 -0
  251. package/apps/runtime/dist/film/project.js +257 -0
  252. package/apps/runtime/dist/film/skills.js +91 -0
  253. package/apps/runtime/dist/film/sounds.js +122 -0
  254. package/apps/runtime/dist/film/step.js +289 -0
  255. package/apps/runtime/dist/film/tools.js +99 -0
  256. package/apps/runtime/dist/geocode.js +58 -0
  257. package/apps/runtime/dist/harness/antigravity.js +129 -0
  258. package/apps/runtime/dist/harness/apple.js +270 -0
  259. package/apps/runtime/dist/harness/claude.js +147 -0
  260. package/apps/runtime/dist/harness/codex.js +229 -0
  261. package/apps/runtime/dist/harness/cursor.js +93 -0
  262. package/apps/runtime/dist/harness/env.js +124 -0
  263. package/apps/runtime/dist/harness/index.js +95 -0
  264. package/apps/runtime/dist/harness/model.js +279 -0
  265. package/apps/runtime/dist/harness/prompt.js +121 -0
  266. package/apps/runtime/dist/harness/terminal.js +194 -0
  267. package/apps/runtime/dist/harness/types.js +7 -0
  268. package/apps/runtime/dist/index.js +113 -0
  269. package/apps/runtime/dist/limits.js +81 -0
  270. package/apps/runtime/dist/link-preview.js +60 -0
  271. package/apps/runtime/dist/log.js +106 -0
  272. package/apps/runtime/dist/manage.js +249 -0
  273. package/apps/runtime/dist/mcp/auth.js +161 -0
  274. package/apps/runtime/dist/mcp/bridge.js +59 -0
  275. package/apps/runtime/dist/mcp/flow-app.js +97 -0
  276. package/apps/runtime/dist/mcp/handler.js +54 -0
  277. package/apps/runtime/dist/mcp/scopes.js +14 -0
  278. package/apps/runtime/dist/mcp/seen.js +65 -0
  279. package/apps/runtime/dist/mcp/tools.js +572 -0
  280. package/apps/runtime/dist/media/conversation.js +167 -0
  281. package/apps/runtime/dist/media/ffmpeg.js +121 -0
  282. package/apps/runtime/dist/media/generate.js +120 -0
  283. package/apps/runtime/dist/media/marking.js +121 -0
  284. package/apps/runtime/dist/media/transcribe.js +198 -0
  285. package/apps/runtime/dist/model-errors.js +42 -0
  286. package/apps/runtime/dist/models.js +1164 -0
  287. package/apps/runtime/dist/plugin.js +61 -0
  288. package/apps/runtime/dist/plugins/channels.js +78 -0
  289. package/apps/runtime/dist/plugins/claims.js +56 -0
  290. package/apps/runtime/dist/plugins/discovery.js +155 -0
  291. package/apps/runtime/dist/plugins/events.js +63 -0
  292. package/apps/runtime/dist/plugins/jobs.js +64 -0
  293. package/apps/runtime/dist/plugins/loader.js +508 -0
  294. package/apps/runtime/dist/plugins/migrations.js +69 -0
  295. package/apps/runtime/dist/plugins/pro-keys.js +34 -0
  296. package/apps/runtime/dist/plugins/pro-state.js +83 -0
  297. package/apps/runtime/dist/plugins/pro.js +310 -0
  298. package/apps/runtime/dist/plugins/public.js +44 -0
  299. package/apps/runtime/dist/plugins/registry.js +122 -0
  300. package/apps/runtime/dist/plugins/runs.js +210 -0
  301. package/apps/runtime/dist/render/browser-path.js +54 -0
  302. package/apps/runtime/dist/render/chromium.js +98 -0
  303. package/apps/runtime/dist/render/convert.js +158 -0
  304. package/apps/runtime/dist/render/downloads.js +299 -0
  305. package/apps/runtime/dist/render/guard.js +25 -0
  306. package/apps/runtime/dist/render/shaped.js +137 -0
  307. package/apps/runtime/dist/routes/api.js +440 -0
  308. package/apps/runtime/dist/routes/debug.js +42 -0
  309. package/apps/runtime/dist/routes/delivery.js +90 -0
  310. package/apps/runtime/dist/routes/internal.js +81 -0
  311. package/apps/runtime/dist/routes/lang.js +25 -0
  312. package/apps/runtime/dist/routes/marketplace.js +43 -0
  313. package/apps/runtime/dist/routes/plugin-public.js +113 -0
  314. package/apps/runtime/dist/routes/plugins.js +212 -0
  315. package/apps/runtime/dist/routes/runs.js +1422 -0
  316. package/apps/runtime/dist/routes/studio.js +1629 -0
  317. package/apps/runtime/dist/routes/wizard-stream.js +30 -0
  318. package/apps/runtime/dist/running.js +39 -0
  319. package/apps/runtime/dist/sandbox/agentos-package.js +73 -0
  320. package/apps/runtime/dist/sandbox/agentos.js +162 -0
  321. package/apps/runtime/dist/sandbox/docker.js +45 -0
  322. package/apps/runtime/dist/sandbox/index.js +52 -0
  323. package/apps/runtime/dist/sandbox/install.js +122 -0
  324. package/apps/runtime/dist/sandbox/mastra.js +71 -0
  325. package/apps/runtime/dist/sandbox/types.js +1 -0
  326. package/apps/runtime/dist/secrets/crypto.js +28 -0
  327. package/apps/runtime/dist/secrets/signing.js +52 -0
  328. package/apps/runtime/dist/secrets/vault.js +59 -0
  329. package/apps/runtime/dist/services/access.js +88 -0
  330. package/apps/runtime/dist/services/api.js +248 -0
  331. package/apps/runtime/dist/services/architect.js +95 -0
  332. package/apps/runtime/dist/services/assistant-chats.js +311 -0
  333. package/apps/runtime/dist/services/brand.js +85 -0
  334. package/apps/runtime/dist/services/cloud.js +456 -0
  335. package/apps/runtime/dist/services/draft-events.js +27 -0
  336. package/apps/runtime/dist/services/engenty-shapes.js +71 -0
  337. package/apps/runtime/dist/services/errors.js +29 -0
  338. package/apps/runtime/dist/services/files.js +178 -0
  339. package/apps/runtime/dist/services/knowledge-model.js +559 -0
  340. package/apps/runtime/dist/services/knowledge.js +721 -0
  341. package/apps/runtime/dist/services/links.js +16 -0
  342. package/apps/runtime/dist/services/marketplace.js +492 -0
  343. package/apps/runtime/dist/services/onboarding.js +152 -0
  344. package/apps/runtime/dist/services/package-file.js +82 -0
  345. package/apps/runtime/dist/services/package.js +170 -0
  346. package/apps/runtime/dist/services/profile.js +51 -0
  347. package/apps/runtime/dist/services/project-files.js +439 -0
  348. package/apps/runtime/dist/services/project-index.js +707 -0
  349. package/apps/runtime/dist/services/projects.js +387 -0
  350. package/apps/runtime/dist/services/relevance.js +58 -0
  351. package/apps/runtime/dist/services/runners.js +178 -0
  352. package/apps/runtime/dist/services/runs.js +524 -0
  353. package/apps/runtime/dist/services/shares.js +130 -0
  354. package/apps/runtime/dist/services/site.js +270 -0
  355. package/apps/runtime/dist/services/space-categories.js +861 -0
  356. package/apps/runtime/dist/services/space-data.js +792 -0
  357. package/apps/runtime/dist/services/space-origin.js +207 -0
  358. package/apps/runtime/dist/services/spaces.js +657 -0
  359. package/apps/runtime/dist/services/translations.js +306 -0
  360. package/apps/runtime/dist/services/widgets.js +34 -0
  361. package/apps/runtime/dist/services/wizard-icon.js +157 -0
  362. package/apps/runtime/dist/services/wizards.js +420 -0
  363. package/apps/runtime/dist/settings.js +16 -0
  364. package/apps/runtime/dist/store/errors.js +4 -0
  365. package/apps/runtime/dist/store/index.js +299 -0
  366. package/apps/runtime/dist/store/shared-lists.js +123 -0
  367. package/apps/runtime/dist/tenants/control.js +238 -0
  368. package/apps/runtime/dist/tenants/tenant.js +26 -0
  369. package/apps/runtime/dist/texts.js +207 -0
  370. package/apps/runtime/dist/tools/browser.js +703 -0
  371. package/apps/runtime/dist/tools/connector.js +204 -0
  372. package/apps/runtime/dist/tools/index.js +291 -0
  373. package/apps/runtime/dist/tools/mail.js +104 -0
  374. package/apps/runtime/dist/tools/net-guard.js +170 -0
  375. package/apps/runtime/dist/tools/pages.js +81 -0
  376. package/apps/runtime/dist/tools/plugin.js +180 -0
  377. package/apps/runtime/dist/tools/project.js +154 -0
  378. package/apps/runtime/dist/tools/shared.js +69 -0
  379. package/apps/runtime/dist/tools/store.js +238 -0
  380. package/apps/runtime/dist/update.js +113 -0
  381. package/apps/runtime/dist/widgets/bundle.js +99 -0
  382. package/apps/runtime/dist/widgets/render.js +329 -0
  383. package/apps/runtime/dist/widgets/runtime.js +108 -0
  384. package/apps/runtime/dist/widgets/script.js +30 -0
  385. package/apps/runtime/dist/widgets/step.js +223 -0
  386. package/apps/web/dist/ai-labels/ai-black.svg +20 -0
  387. package/apps/web/dist/ai-labels/ai-generated-black.svg +31 -0
  388. package/apps/web/dist/ai-labels/ai-generated-white.svg +32 -0
  389. package/apps/web/dist/ai-labels/ai-modified-black.svg +30 -0
  390. package/apps/web/dist/ai-labels/ai-modified-white.svg +31 -0
  391. package/apps/web/dist/ai-labels/ai-white.svg +21 -0
  392. package/apps/web/dist/assets/AboutDialog-DYgXPagX.js +1 -0
  393. package/apps/web/dist/assets/ChangelogDialog-BXqBW8j3.js +1 -0
  394. package/apps/web/dist/assets/ChatView-CK2--tsE.js +10 -0
  395. package/apps/web/dist/assets/EditorPage-jvcwyXbU.js +3 -0
  396. package/apps/web/dist/assets/FlowPreview-CusP7ci9.js +1 -0
  397. package/apps/web/dist/assets/Harness-BrP-ENHg.css +1 -0
  398. package/apps/web/dist/assets/Harness-CV9uYzbv.js +16 -0
  399. package/apps/web/dist/assets/NewWizardChannels-BakW5q6s.js +1 -0
  400. package/apps/web/dist/assets/NewWizardPage-BoA-LJuW.js +7 -0
  401. package/apps/web/dist/assets/OnboardingPage-DaD1XnOe.js +1 -0
  402. package/apps/web/dist/assets/ProjectPage-BFgk1DEv.js +1 -0
  403. package/apps/web/dist/assets/PublicRunner-C9MwEvxy.js +1 -0
  404. package/apps/web/dist/assets/ReadOnly-DC2Kp7l8.js +1 -0
  405. package/apps/web/dist/assets/RunDrawer-CY6NZSrI.js +4 -0
  406. package/apps/web/dist/assets/RunnerView-BT26XgcY.js +1 -0
  407. package/apps/web/dist/assets/SettingsPage-AFt9IDLt.js +1 -0
  408. package/apps/web/dist/assets/SetupPage-DtFYAbwJ.js +1 -0
  409. package/apps/web/dist/assets/SharePage-t2xwNS61.js +1 -0
  410. package/apps/web/dist/assets/changelog-CATQFxCQ.js +1 -0
  411. package/apps/web/dist/assets/engenty-eXZ-EAwd.js +1 -0
  412. package/apps/web/dist/assets/esm-DXeMu8Lb.js +7 -0
  413. package/apps/web/dist/assets/fluffy-engenty-ClRou7yu.js +456 -0
  414. package/apps/web/dist/assets/index-AfUa8xKD.css +1 -0
  415. package/apps/web/dist/assets/index-Drw7FMTQ.js +14 -0
  416. package/apps/web/dist/assets/jsx-runtime-BNakU3Ej.js +1 -0
  417. package/apps/web/dist/assets/lock-R_CfU0Xo.js +1 -0
  418. package/apps/web/dist/assets/oss-credits-cZ9NUaLZ.js +1 -0
  419. package/apps/web/dist/assets/pdfmake-Cx9scTbD.js +228 -0
  420. package/apps/web/dist/assets/phone-CgrIS4_-.js +1 -0
  421. package/apps/web/dist/assets/preload-helper-CNEI7N0N.js +1 -0
  422. package/apps/web/dist/assets/qr-scanner-worker.min-CJaXo3yu.js +98 -0
  423. package/apps/web/dist/assets/qr-scanner.min-C_UI0gH-.js +1 -0
  424. package/apps/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
  425. package/apps/web/dist/assets/settings-menu-2IMOOlLl.js +1 -0
  426. package/apps/web/dist/assets/ui-dzGvc3xk.js +137 -0
  427. package/apps/web/dist/assets/upload-BSuTilFF.js +1 -0
  428. package/apps/web/dist/assets/vfs_fonts-DllDSYt1.js +1 -0
  429. package/apps/web/dist/embed.js +266 -0
  430. package/apps/web/dist/favicon.svg +1 -0
  431. package/apps/web/dist/icons/apple-touch-icon.png +0 -0
  432. package/apps/web/dist/icons/icon-192.png +0 -0
  433. package/apps/web/dist/icons/icon-512.png +0 -0
  434. package/apps/web/dist/icons/icon-maskable-512.png +0 -0
  435. package/apps/web/dist/index.html +48 -0
  436. package/apps/web/dist/install.sh +577 -0
  437. package/apps/web/dist/manifest.webmanifest +21 -0
  438. package/apps/web/dist/mcp/flow.html +980 -0
  439. package/apps/web/dist/sw.js +15 -0
  440. package/bin/wizards.mjs +288 -0
  441. package/modules/README.md +15 -0
  442. package/node_modules/@engenty/wizards/dist/plugin/index.d.ts +1150 -0
  443. package/node_modules/@engenty/wizards/dist/plugin/index.js +4 -0
  444. package/node_modules/@engenty/wizards/dist/plugin/studio.d.ts +322 -0
  445. package/node_modules/@engenty/wizards/dist/plugin/studio.js +4 -0
  446. package/node_modules/@engenty/wizards/dist/plugin/thread.d.ts +174 -0
  447. package/node_modules/@engenty/wizards/dist/plugin/thread.js +821 -0
  448. package/node_modules/@engenty/wizards/package.json +11 -0
  449. package/node_modules/@engenty-wizards/shared/dist/assistant.d.ts +174 -0
  450. package/node_modules/@engenty-wizards/shared/dist/assistant.js +65 -0
  451. package/node_modules/@engenty-wizards/shared/dist/changes.d.ts +22 -0
  452. package/node_modules/@engenty-wizards/shared/dist/changes.js +61 -0
  453. package/node_modules/@engenty-wizards/shared/dist/connectors.d.ts +77 -0
  454. package/node_modules/@engenty-wizards/shared/dist/connectors.js +2 -0
  455. package/node_modules/@engenty-wizards/shared/dist/decision.d.ts +76 -0
  456. package/node_modules/@engenty-wizards/shared/dist/decision.js +147 -0
  457. package/node_modules/@engenty-wizards/shared/dist/definition.d.ts +2922 -0
  458. package/node_modules/@engenty-wizards/shared/dist/definition.js +1920 -0
  459. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.d.ts +5 -0
  460. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.js +132 -0
  461. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.d.ts +11 -0
  462. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.js +209 -0
  463. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.d.ts +532 -0
  464. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.js +217 -0
  465. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.d.ts +3 -0
  466. package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.js +3 -0
  467. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.d.ts +14 -0
  468. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.js +166 -0
  469. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.d.ts +33 -0
  470. package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.js +99 -0
  471. package/node_modules/@engenty-wizards/shared/dist/feature-flags.d.ts +78 -0
  472. package/node_modules/@engenty-wizards/shared/dist/feature-flags.js +70 -0
  473. package/node_modules/@engenty-wizards/shared/dist/features.d.ts +41 -0
  474. package/node_modules/@engenty-wizards/shared/dist/features.js +89 -0
  475. package/node_modules/@engenty-wizards/shared/dist/fit.d.ts +71 -0
  476. package/node_modules/@engenty-wizards/shared/dist/fit.js +382 -0
  477. package/node_modules/@engenty-wizards/shared/dist/json-schema.d.ts +14 -0
  478. package/node_modules/@engenty-wizards/shared/dist/json-schema.js +66 -0
  479. package/node_modules/@engenty-wizards/shared/dist/knowledge.d.ts +199 -0
  480. package/node_modules/@engenty-wizards/shared/dist/knowledge.js +68 -0
  481. package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.d.ts +35 -0
  482. package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.js +107 -0
  483. package/node_modules/@engenty-wizards/shared/dist/marketplace-search.d.ts +20 -0
  484. package/node_modules/@engenty-wizards/shared/dist/marketplace-search.js +136 -0
  485. package/node_modules/@engenty-wizards/shared/dist/marketplace.d.ts +227 -0
  486. package/node_modules/@engenty-wizards/shared/dist/marketplace.js +354 -0
  487. package/node_modules/@engenty-wizards/shared/dist/merge.d.ts +7 -0
  488. package/node_modules/@engenty-wizards/shared/dist/merge.js +40 -0
  489. package/node_modules/@engenty-wizards/shared/dist/numbers.d.ts +24 -0
  490. package/node_modules/@engenty-wizards/shared/dist/numbers.js +54 -0
  491. package/node_modules/@engenty-wizards/shared/dist/projects.d.ts +224 -0
  492. package/node_modules/@engenty-wizards/shared/dist/projects.js +319 -0
  493. package/node_modules/@engenty-wizards/shared/dist/providers.d.ts +101 -0
  494. package/node_modules/@engenty-wizards/shared/dist/providers.js +390 -0
  495. package/node_modules/@engenty-wizards/shared/dist/run.d.ts +680 -0
  496. package/node_modules/@engenty-wizards/shared/dist/run.js +620 -0
  497. package/node_modules/@engenty-wizards/shared/dist/runner-texts.d.ts +546 -0
  498. package/node_modules/@engenty-wizards/shared/dist/runner-texts.js +523 -0
  499. package/node_modules/@engenty-wizards/shared/dist/runners.d.ts +93 -0
  500. package/node_modules/@engenty-wizards/shared/dist/runners.js +146 -0
  501. package/node_modules/@engenty-wizards/shared/dist/shape.d.ts +102 -0
  502. package/node_modules/@engenty-wizards/shared/dist/shape.js +318 -0
  503. package/node_modules/@engenty-wizards/shared/dist/space-data.d.ts +89 -0
  504. package/node_modules/@engenty-wizards/shared/dist/space-data.js +47 -0
  505. package/node_modules/@engenty-wizards/shared/dist/store.d.ts +117 -0
  506. package/node_modules/@engenty-wizards/shared/dist/store.js +81 -0
  507. package/node_modules/@engenty-wizards/shared/dist/surface.d.ts +115 -0
  508. package/node_modules/@engenty-wizards/shared/dist/surface.js +442 -0
  509. package/node_modules/@engenty-wizards/shared/dist/texts.d.ts +45 -0
  510. package/node_modules/@engenty-wizards/shared/dist/texts.js +54 -0
  511. package/node_modules/@engenty-wizards/shared/dist/translation.d.ts +23 -0
  512. package/node_modules/@engenty-wizards/shared/dist/translation.js +154 -0
  513. package/node_modules/@engenty-wizards/shared/dist/wizard-package.d.ts +48 -0
  514. package/node_modules/@engenty-wizards/shared/dist/wizard-package.js +49 -0
  515. package/node_modules/@engenty-wizards/shared/dist/workspace.d.ts +16 -0
  516. package/node_modules/@engenty-wizards/shared/dist/workspace.js +51 -0
  517. package/node_modules/@engenty-wizards/shared/package.json +10 -0
  518. package/package.json +77 -4
  519. package/plugin/.claude-plugin/plugin.json +9 -0
  520. package/plugin/.mcp.json +8 -0
  521. package/plugin/commands/wizard.md +8 -0
  522. package/plugin/skills/build-wizard/SKILL.md +27 -0
  523. package/plugin/skills/use-wizard/SKILL.md +18 -0
@@ -0,0 +1,123 @@
1
+ import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, readlinkSync, renameSync, rmSync, symlinkSync, } from "node:fs";
2
+ import { join } from "node:path";
3
+ /**
4
+ * The runtimes of an install made by install.sh, one folder per version, side by side:
5
+ *
6
+ * runtime/<version>/ an npm prefix: node_modules/@engenty/wizards-runtime (up to 0.7.4
7
+ * node_modules/wizards), package.json, package-lock.json
8
+ * runtime/current → <version>, the one `bin/wizards` starts
9
+ * runtime/node_modules → current/node_modules, for commands written before the versions
10
+ *
11
+ * Up to 0.6.2 `runtime/` itself was the prefix; `switchTo` moves such an install into its
12
+ * version folder first. A process keeps the files of the version it started with.
13
+ */
14
+ const VERSION = /^\d+\.\d+\.\d+$/;
15
+ /** The npm package of the runtime. Up to 0.7.4 it was `wizards`, now the launcher `npx` runs. */
16
+ export const RUNTIME_PACKAGE = "@engenty/wizards-runtime";
17
+ /** The runtime's name up to 0.7.4, and where a command or an update of then looks for it. */
18
+ const LEGACY_PACKAGE = "wizards";
19
+ export const runtimeDir = (paths, version) => join(paths.runtime, version);
20
+ const currentLink = (paths) => join(paths.runtime, "current");
21
+ const modules = (paths) => join(paths.runtime, "node_modules");
22
+ function versionOf(dir) {
23
+ try {
24
+ const { version } = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
25
+ return typeof version === "string" ? version : null;
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ /**
32
+ * The version of the runtime in an npm prefix; null when there is none. A `wizards` without the
33
+ * runtime in it is the launcher, which an update of 0.7.4 or older fetches as the new version.
34
+ */
35
+ export function versionIn(prefix) {
36
+ const legacy = join(prefix, "node_modules", LEGACY_PACKAGE);
37
+ return (versionOf(join(prefix, "node_modules", RUNTIME_PACKAGE)) ??
38
+ (existsSync(join(legacy, "apps", "runtime")) ? versionOf(legacy) : null));
39
+ }
40
+ const isLink = (path) => {
41
+ try {
42
+ return lstatSync(path).isSymbolicLink();
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ };
48
+ /** The version `bin/wizards` starts; null without a runtime. */
49
+ export function currentVersion(paths) {
50
+ if (isLink(currentLink(paths))) {
51
+ return versionIn(join(paths.runtime, readlinkSync(currentLink(paths))));
52
+ }
53
+ return versionIn(paths.runtime);
54
+ }
55
+ /** The version folders there are, each with a complete package in it. */
56
+ export function installedVersions(paths) {
57
+ try {
58
+ return readdirSync(paths.runtime)
59
+ .filter((name) => VERSION.test(name) && versionIn(join(paths.runtime, name)) === name)
60
+ .sort();
61
+ }
62
+ catch {
63
+ return [];
64
+ }
65
+ }
66
+ /** Points `link` at `target` in one step: a new link renamed over the old one. */
67
+ function link(target, path) {
68
+ const tmp = `${path}.${process.pid}.tmp`;
69
+ rmSync(tmp, { force: true });
70
+ symlinkSync(target, tmp);
71
+ renameSync(tmp, path);
72
+ }
73
+ /** Moves a runtime from before the version folders into `runtime/<version>/`. */
74
+ function adoptLegacy(paths) {
75
+ const version = versionIn(paths.runtime);
76
+ if (isLink(modules(paths)) || !version) {
77
+ return;
78
+ }
79
+ const into = runtimeDir(paths, version);
80
+ rmSync(into, { recursive: true, force: true });
81
+ mkdirSync(into, { recursive: true });
82
+ for (const name of ["node_modules", "package.json", "package-lock.json"]) {
83
+ if (existsSync(join(paths.runtime, name))) {
84
+ renameSync(join(paths.runtime, name), join(into, name));
85
+ }
86
+ }
87
+ link(version, currentLink(paths));
88
+ }
89
+ /** Makes `version` the one `bin/wizards` starts from now on. */
90
+ export function switchTo(paths, version) {
91
+ if (versionIn(runtimeDir(paths, version)) !== version) {
92
+ throw new Error(`${runtimeDir(paths, version)} holds no complete runtime ${version}.`);
93
+ }
94
+ adoptLegacy(paths);
95
+ link(version, currentLink(paths));
96
+ link(join("current", "node_modules"), modules(paths));
97
+ }
98
+ /** Deletes the version folders other than `keep` and the current one; returns what went. */
99
+ export function prune(paths, keep) {
100
+ const current = currentVersion(paths);
101
+ const stale = installedVersions(paths).filter((v) => v !== current && !keep.includes(v));
102
+ for (const version of stale) {
103
+ rmSync(runtimeDir(paths, version), { recursive: true, force: true });
104
+ }
105
+ return stale;
106
+ }
107
+ /** Puts an npm prefix installed elsewhere into its version folder (never the current one). */
108
+ export function promote(paths, staged, version) {
109
+ if (versionIn(staged) !== version) {
110
+ throw new Error(`The download holds version ${versionIn(staged) ?? "none"}, not ${version}.`);
111
+ }
112
+ if (currentVersion(paths) === version) {
113
+ rmSync(staged, { recursive: true, force: true });
114
+ return;
115
+ }
116
+ // As install.sh leaves it: a command of 0.7.4 or older finds the runtime under its old name.
117
+ const legacy = join(staged, "node_modules", LEGACY_PACKAGE);
118
+ if (!existsSync(legacy)) {
119
+ symlinkSync(RUNTIME_PACKAGE, legacy);
120
+ }
121
+ rmSync(runtimeDir(paths, version), { recursive: true, force: true });
122
+ renameSync(staged, runtimeDir(paths, version));
123
+ }
@@ -0,0 +1,86 @@
1
+ import { createGuardedFetch } from "../engenty/connections-external/net/guarded-fetch.js";
2
+ import { githubConnector } from "../engenty/connections-github/connector.js";
3
+ import { googleConnectors } from "../engenty/connections-google/definitions.js";
4
+ import { GOOGLE_OAUTH2 } from "../engenty/connections-google/shared.js";
5
+ import { hubspotConnector } from "../engenty/connections-hubspot/connector.js";
6
+ import { microsoftOneDriveConnector } from "../engenty/connections-microsoft/onedrive.js";
7
+ import { microsoftOutlookConnector } from "../engenty/connections-microsoft/outlook.js";
8
+ import { s3Connector } from "../engenty/connections-s3/s3.js";
9
+ import { hasOAuth2ClientCredentials, } from "../engenty/connections-sdk/oauth2.js";
10
+ import { registerConnectorDefinition } from "../engenty/connections-sdk/registry.js";
11
+ import { slackConnector } from "../engenty/connections-slack/connector.js";
12
+ import { managed } from "../manage.js";
13
+ import { gmailConnector as mailGmail } from "./gmail.js";
14
+ import { imapConnector } from "./imap.js";
15
+ import { outlookConnector as mailOutlook } from "./outlook.js";
16
+ import { googleThroughAccount } from "./via-account.js";
17
+ /**
18
+ * engenty's own connectors, as engenty ships them: Gmail, Drive, Calendar, Contacts, Outlook,
19
+ * OneDrive, Slack, GitHub, HubSpot, S3. Every project has them; an OAuth one can be connected
20
+ * once its client is configured.
21
+ */
22
+ export const BUILTIN_CONNECTORS = [
23
+ ...googleConnectors,
24
+ microsoftOutlookConnector,
25
+ microsoftOneDriveConnector,
26
+ slackConnector,
27
+ githubConnector,
28
+ hubspotConnector,
29
+ s3Connector,
30
+ ];
31
+ /** The connectors behind a connection of kind "mail": one read-only shape for any mailbox. */
32
+ export const MAIL_CONNECTORS = [mailGmail, mailOutlook, imapConnector];
33
+ // One registry for all of them, so an imported connector can never take a built-in's id.
34
+ for (const connector of [...BUILTIN_CONNECTORS, ...MAIL_CONNECTORS]) {
35
+ registerConnectorDefinition(connector);
36
+ }
37
+ export function builtinConnector(id) {
38
+ return BUILTIN_CONNECTORS.find((c) => c.id === id);
39
+ }
40
+ /**
41
+ * engenty names OAuth clients `<VENDOR>_OAUTH_CLIENT_ID`. Google and Microsoft allow one client
42
+ * several redirect addresses, so the client this product signs people in with (`<VENDOR>_CLIENT_ID`)
43
+ * serves connections too. GitHub and Slack tie a client to one address: they need their own.
44
+ */
45
+ export const resolveEnv = async (key) => {
46
+ const own = process.env[key]?.trim();
47
+ if (own || !/^(GOOGLE|MICROSOFT)_OAUTH_/.test(key)) {
48
+ return own || undefined;
49
+ }
50
+ return process.env[key.replace("_OAUTH_", "_")]?.trim() || undefined;
51
+ };
52
+ /** Whether a person can connect an account with this connector right now. */
53
+ export async function usable(connector) {
54
+ if (connector.auth.kind !== "oauth2") {
55
+ return connector.auth.kind === "api_key";
56
+ }
57
+ // A connector that registers its own OAuth client needs none configured.
58
+ return (connector.auth.oauth2.dynamicClientRegistration === true ||
59
+ (await hasOAuth2ClientCredentials(connector.auth.oauth2, resolveEnv)) ||
60
+ viaAccount(connector));
61
+ }
62
+ /**
63
+ * A Google connector on a local install without a Google client of its own: it connects through
64
+ * the Manage-App of the linked account, when that one offers it. Offered before an account is
65
+ * linked too; connecting then asks to link it first.
66
+ */
67
+ export async function viaAccount(connector) {
68
+ return (!managed &&
69
+ connector.auth.kind === "oauth2" &&
70
+ connector.auth.oauth2 === GOOGLE_OAUTH2 &&
71
+ !(await hasOAuth2ClientCredentials(connector.auth.oauth2, resolveEnv)) &&
72
+ (await googleThroughAccount()));
73
+ }
74
+ /** What the server's owner has to set for an OAuth connector that is not usable yet. */
75
+ export function missingSetup(connector) {
76
+ if (connector.auth.kind !== "oauth2") {
77
+ return null;
78
+ }
79
+ const { clientIdEnv, clientSecretEnv } = connector.auth.oauth2;
80
+ return clientIdEnv && clientSecretEnv ? `${clientIdEnv}, ${clientSecretEnv}` : null;
81
+ }
82
+ /**
83
+ * Connector actions reach addresses that come from a person or a spec (an S3 endpoint, an API's
84
+ * base URL): every request is checked to stay on the public internet.
85
+ */
86
+ export const connectorFetch = createGuardedFetch();
@@ -0,0 +1,409 @@
1
+ import { note } from "@engenty-wizards/shared/run";
2
+ import { and, asc, eq } from "drizzle-orm";
3
+ import { z } from "zod";
4
+ import { db, schema } from "../db/client.js";
5
+ import { buildImportedConnector, mcpHeaders, } from "../engenty/connections-external/build-connector.js";
6
+ import { ImportValidationError } from "../engenty/connections-external/errors.js";
7
+ import { assembleRecord, connectorIdFromSlug, prepareSource, resolveRequiredHeaders, surfaceRequiresAuth, toolPrefixFromSlug, } from "../engenty/connections-external/import-service.js";
8
+ import { createGuardedFetch } from "../engenty/connections-external/net/guarded-fetch.js";
9
+ import { discoverImportableSources, discoverOAuthFacts, registryDiscover, registrySearch, resolveMcpTransport, } from "../engenty/connections-external/registry-client.js";
10
+ import { resolveRegistrySource } from "../engenty/connections-external/registry-source.js";
11
+ import { encryptToken } from "../engenty/shims/connections-sdk.js";
12
+ import { env } from "../env.js";
13
+ import { requireAdmin, requireWritableProject } from "../services/access.js";
14
+ import { ServiceError } from "../services/errors.js";
15
+ import { BUILTIN_CONNECTORS, builtinConnector, missingSetup, usable } from "./builtin.js";
16
+ /**
17
+ * Imported connectors: any service becomes a connector from its OpenAPI spec or MCP server,
18
+ * found through the integrations registry or pasted as a URL. Searching, normalising, auth
19
+ * mapping and invoking are engenty's (`apps/runtime/src/engenty/connections-external`); kept here is what
20
+ * engenty leaves to its host — where the records live and who may import.
21
+ */
22
+ // engenty's dynamic client registration reads the redirect from this variable.
23
+ process.env.CONNECTIONS_REDIRECT_URI ??=
24
+ env.connectRedirectUrl || `${env.appUrl}/api/connect/callback`;
25
+ const where = (projectId, id) => and(eq(schema.projectConnector.projectId, projectId), eq(schema.projectConnector.id, id));
26
+ async function load(projectId, id) {
27
+ const row = await db.query.projectConnector.findFirst({ where: where(projectId, id) });
28
+ return row?.record ?? null;
29
+ }
30
+ async function save(projectId, record) {
31
+ await db
32
+ .insert(schema.projectConnector)
33
+ .values({ projectId, id: record.id, record })
34
+ .onConflictDoUpdate({
35
+ target: [schema.projectConnector.projectId, schema.projectConnector.id],
36
+ set: { record, updatedAt: new Date() },
37
+ });
38
+ }
39
+ const actionView = (a) => ({
40
+ id: a.id,
41
+ summary: (a.summary || a.description).slice(0, 160),
42
+ group: a.classification,
43
+ });
44
+ function view(record) {
45
+ const auth = record.auth_config;
46
+ const needsOAuthClient = auth.kind === "oauth2" && !record.client_id_enc && !(auth.dcr && auth.registration_endpoint);
47
+ return {
48
+ usable: !needsOAuthClient,
49
+ missingSetup: null,
50
+ id: record.id,
51
+ name: record.name,
52
+ domain: record.domain,
53
+ sourceKind: record.source_kind,
54
+ sourceUrl: record.source_url,
55
+ toolPrefix: record.tool_prefix,
56
+ auth: auth.kind,
57
+ needsOAuthClient,
58
+ toolsPending: record.source_kind === "mcp" && record.actions.length === 0,
59
+ actions: record.actions.map(actionView),
60
+ importedAt: record.imported_at,
61
+ refreshedAt: record.refreshed_at,
62
+ };
63
+ }
64
+ /** What the admin can fix is told as it is; anything else is the registry or the source failing. */
65
+ function importFailure(err) {
66
+ const message = err instanceof Error ? err.message : String(err);
67
+ return new ServiceError(err instanceof ImportValidationError ? "invalid" : "refused", message);
68
+ }
69
+ /** What the studio, the architect and MCP clients send to import a connector. */
70
+ export const connectorImportSchema = z.object({
71
+ domain: z.string().min(1).max(253),
72
+ sourceKind: z.enum(["openapi", "mcp"]),
73
+ sourceUrl: z.string().url(),
74
+ id: z.string().min(2).max(60),
75
+ toolPrefix: z.string().min(2).max(31),
76
+ name: z.string().min(1).max(120).optional(),
77
+ actions: z.array(z.string()).max(500).optional(),
78
+ oauthClientId: z.string().max(500).optional(),
79
+ oauthClientSecret: z.string().max(500).optional(),
80
+ });
81
+ // --- the registry ----------------------------------------------------------------
82
+ export async function searchRegistry(query) {
83
+ const results = await registrySearch({ query, limit: 12 });
84
+ return results.map((r) => ({
85
+ domain: r.domain,
86
+ name: r.name,
87
+ description: r.description,
88
+ kinds: r.kinds.filter((k) => k === "openapi" || k === "mcp"),
89
+ }));
90
+ }
91
+ export async function registryService(domain) {
92
+ const { parsed } = await registryDiscover(domain).catch((err) => {
93
+ throw importFailure(err);
94
+ });
95
+ return {
96
+ domain: parsed.domain,
97
+ summary: parsed.summary ?? parsed.description ?? null,
98
+ sources: discoverImportableSources(parsed).map((s) => ({
99
+ sourceKind: s.source_kind,
100
+ sourceUrl: s.source_url,
101
+ name: s.surface.name,
102
+ blocked: s.blocked_reason,
103
+ auth: s.surface.auth.status,
104
+ suggestedId: connectorIdFromSlug(s.surface.slug),
105
+ suggestedToolPrefix: toolPrefixFromSlug(s.surface.slug),
106
+ })),
107
+ credentials: Object.values(parsed.credentials).map((c) => ({
108
+ label: c.label ?? c.type,
109
+ setup: c.setup ?? null,
110
+ url: c.generateUrl ?? null,
111
+ })),
112
+ };
113
+ }
114
+ /**
115
+ * OAuth facts straight from an MCP server. The registry says "OAuth, see the server's well-known
116
+ * document" for most MCP servers but probes only the service's main domain, so its own document
117
+ * carries no endpoints for them. The server publishes them itself (RFC 9728, RFC 8414).
118
+ */
119
+ async function probeOAuth(sourceUrl) {
120
+ const guarded = createGuardedFetch();
121
+ const json = async (url) => {
122
+ const res = await guarded(url, {
123
+ headers: { accept: "application/json" },
124
+ signal: AbortSignal.timeout(10_000),
125
+ }).catch(() => null);
126
+ return res?.ok
127
+ ? (await res.json().catch(() => null))
128
+ : null;
129
+ };
130
+ const origin = new URL(sourceUrl).origin;
131
+ const resource = await json(`${origin}/.well-known/oauth-protected-resource`);
132
+ const issuer = resource?.authorization_servers?.[0] ?? origin;
133
+ const server = (await json(`${issuer.replace(/\/+$/, "")}/.well-known/oauth-authorization-server`)) ??
134
+ (await json(`${origin}/.well-known/oauth-authorization-server`));
135
+ const text = (v) => (typeof v === "string" && v ? v : undefined);
136
+ const list = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === "string") : []);
137
+ const authorizationEndpoint = text(server?.authorization_endpoint);
138
+ const tokenEndpoint = text(server?.token_endpoint);
139
+ if (!(authorizationEndpoint && tokenEndpoint)) {
140
+ return null;
141
+ }
142
+ const registrationEndpoint = text(server?.registration_endpoint);
143
+ const scopes = list(server?.scopes_supported);
144
+ return {
145
+ authorizationEndpoint,
146
+ tokenEndpoint,
147
+ grantTypes: list(server?.grant_types_supported),
148
+ // A long list is a catalogue, not what one client should ask for.
149
+ scopes: scopes.length <= 8 ? scopes : [],
150
+ ...(registrationEndpoint ? { registrationEndpoint, dcr: true } : {}),
151
+ };
152
+ }
153
+ /** Fetch and normalise a source with the facts the registry holds about it. */
154
+ async function prepare(input) {
155
+ const resolved = input.domain
156
+ ? await resolveRegistrySource({ domain: input.domain, sourceUrl: input.sourceUrl })
157
+ : { discover: null, surface: null };
158
+ const { surface } = resolved;
159
+ if (input.sourceKind === "mcp" &&
160
+ resolved.discover &&
161
+ surfaceRequiresAuth(surface) &&
162
+ !discoverOAuthFacts(resolved.discover.parsed)) {
163
+ const oauth = await probeOAuth(input.sourceUrl);
164
+ if (oauth) {
165
+ const parsed = resolved.discover.parsed;
166
+ resolved.discover.parsed = {
167
+ ...parsed,
168
+ detect: { ...parsed.detect, auth: { ...parsed.detect?.auth, oauth } },
169
+ };
170
+ }
171
+ }
172
+ const blockers = [];
173
+ if (surface) {
174
+ try {
175
+ resolveRequiredHeaders(surface);
176
+ }
177
+ catch (err) {
178
+ blockers.push(err.message);
179
+ }
180
+ if (surface.variables.length) {
181
+ blockers.push(`this source needs ${surface.variables.map((v) => v.name).join(", ")} in its address — paste the resolved URL instead`);
182
+ }
183
+ if (input.sourceKind === "mcp" && !resolveMcpTransport(surface)) {
184
+ blockers.push(`unsupported MCP transport (${surface.transports.join(", ")})`);
185
+ }
186
+ }
187
+ const prepared = await prepareSource({
188
+ deferMcpTools: input.sourceKind === "mcp" && surfaceRequiresAuth(surface),
189
+ requiredHeaders: !blockers.length && surface ? resolveRequiredHeaders(surface) : [],
190
+ sourceKind: input.sourceKind,
191
+ sourceUrl: input.sourceUrl,
192
+ specOverrides: surface?.spec_overrides ?? [],
193
+ transport: surface ? resolveMcpTransport(surface) : null,
194
+ });
195
+ return { ...resolved, prepared, blockers };
196
+ }
197
+ export async function previewSource(input) {
198
+ const { prepared, blockers } = await prepare(input).catch((err) => {
199
+ throw importFailure(err);
200
+ });
201
+ return {
202
+ title: prepared.normalized.title,
203
+ actions: prepared.normalized.actions.map(actionView),
204
+ blockers,
205
+ dropped: prepared.normalized.dropped_count,
206
+ toolsPending: prepared.deferred_mcp_tools === true,
207
+ };
208
+ }
209
+ // --- a project's connectors --------------------------------------------------------
210
+ async function builtinView(connector) {
211
+ const ready = await usable(connector);
212
+ return {
213
+ id: connector.id,
214
+ name: connector.name,
215
+ domain: "",
216
+ sourceKind: "builtin",
217
+ sourceUrl: "",
218
+ toolPrefix: connector.toolPrefix,
219
+ auth: connector.auth.kind === "oauth2" ? "oauth2" : "api_key",
220
+ usable: ready,
221
+ missingSetup: ready ? null : missingSetup(connector),
222
+ needsOAuthClient: false,
223
+ toolsPending: false,
224
+ actions: connector.actions.map((a) => ({
225
+ id: a.id,
226
+ summary: a.summary.slice(0, 160),
227
+ group: a.group,
228
+ })),
229
+ importedAt: "",
230
+ refreshedAt: null,
231
+ };
232
+ }
233
+ /** Every connector a wizard of the project can name: the built-in ones, then its imports. */
234
+ export async function listConnectors(projectId) {
235
+ const rows = await db.query.projectConnector.findMany({
236
+ where: eq(schema.projectConnector.projectId, projectId),
237
+ orderBy: [asc(schema.projectConnector.createdAt)],
238
+ });
239
+ return [
240
+ ...(await Promise.all(BUILTIN_CONNECTORS.map(builtinView))),
241
+ ...rows.map((r) => view(r.record)),
242
+ ];
243
+ }
244
+ /**
245
+ * A connector by id, ready to run, with the JSON schema of each action's input: a built-in one,
246
+ * or one the project imported.
247
+ */
248
+ export async function resolveConnector(projectId, id) {
249
+ const builtin = builtinConnector(id);
250
+ if (builtin) {
251
+ return {
252
+ connector: builtin,
253
+ imported: false,
254
+ inputSchema: (actionId) => {
255
+ const action = builtin.actions.find((a) => a.id === actionId);
256
+ try {
257
+ return action ? z.toJSONSchema(action.inputSchema) : {};
258
+ }
259
+ catch {
260
+ return {};
261
+ }
262
+ },
263
+ };
264
+ }
265
+ const found = await importedConnector(projectId, id);
266
+ return found
267
+ ? {
268
+ connector: found.connector,
269
+ imported: true,
270
+ inputSchema: (actionId) => found.record.actions.find((a) => a.id === actionId)?.input_json_schema ?? {},
271
+ }
272
+ : null;
273
+ }
274
+ export async function importConnector(userId, projectId, input) {
275
+ await requireWritableProject(projectId);
276
+ await requireAdmin();
277
+ if (await load(projectId, input.id)) {
278
+ throw new ServiceError("invalid", note("connectorAlreadyExistsSpace", { id: input.id }));
279
+ }
280
+ try {
281
+ const { discover, surface, prepared } = await prepare(input);
282
+ const { record, warnings } = assembleRecord({
283
+ actionFilter: input.actions ?? null,
284
+ discover: discover?.parsed ?? null,
285
+ domain: input.domain,
286
+ id: input.id,
287
+ importedBy: userId,
288
+ name: input.name ?? null,
289
+ oauthClient: input.oauthClientId && input.oauthClientSecret
290
+ ? { clientId: input.oauthClientId, clientSecret: input.oauthClientSecret }
291
+ : null,
292
+ prepared,
293
+ // The registry's own document is not kept: the record holds what was made of it.
294
+ rawDiscover: null,
295
+ sourceKind: input.sourceKind,
296
+ sourceUrl: input.sourceUrl,
297
+ surface,
298
+ tenantId: projectId,
299
+ toolPrefix: input.toolPrefix,
300
+ });
301
+ const { skippedActions } = buildImportedConnector(record);
302
+ if (skippedActions.length) {
303
+ warnings.push(`${skippedActions.length} action(s) have an input the tools cannot express`);
304
+ }
305
+ await save(projectId, record);
306
+ return { connector: view(record), warnings };
307
+ }
308
+ catch (err) {
309
+ throw err instanceof ServiceError ? err : importFailure(err);
310
+ }
311
+ }
312
+ /**
313
+ * Imports a registry service by its domain, for callers that do not pick a source by hand (the
314
+ * architect, MCP clients): the first importable source of the wanted kind, MCP before OpenAPI —
315
+ * an MCP server is the service's own, curated set of actions.
316
+ */
317
+ export async function importFromRegistry(userId, projectId, input) {
318
+ await requireWritableProject(projectId);
319
+ await requireAdmin();
320
+ const service = await registryService(input.domain);
321
+ const order = input.kind ? [input.kind] : ["mcp", "openapi"];
322
+ const source = order
323
+ .flatMap((kind) => service.sources.filter((s) => s.sourceKind === kind))
324
+ .find((s) => !s.blocked);
325
+ if (!source) {
326
+ const why = service.sources.map((s) => `${s.sourceKind}: ${s.blocked}`).join("; ");
327
+ throw new ServiceError("invalid", `${input.domain} has nothing that can be imported${why ? ` (${why})` : ""}.`);
328
+ }
329
+ const taken = (await listConnectors(projectId)).find((c) => c.id === source.suggestedId);
330
+ if (taken) {
331
+ return { connector: taken, warnings: ["already imported"] };
332
+ }
333
+ return importConnector(userId, projectId, {
334
+ domain: service.domain,
335
+ sourceKind: source.sourceKind,
336
+ sourceUrl: source.sourceUrl,
337
+ id: source.suggestedId,
338
+ toolPrefix: source.suggestedToolPrefix,
339
+ ...(source.name ? { name: source.name } : {}),
340
+ });
341
+ }
342
+ export async function removeConnector(projectId, id) {
343
+ await requireWritableProject(projectId);
344
+ await requireAdmin();
345
+ await db.delete(schema.projectConnector).where(where(projectId, id));
346
+ }
347
+ /**
348
+ * Re-reads the source and replaces the connector's actions. An MCP server that only lists its
349
+ * tools to a signed-in account needs that account's token.
350
+ */
351
+ export async function refreshConnector(projectId, id, accessToken) {
352
+ await requireWritableProject(projectId);
353
+ const record = await load(projectId, id);
354
+ if (!record) {
355
+ throw new ServiceError("not_found", note("connectorNotExist"));
356
+ }
357
+ try {
358
+ const { surface } = record.registry_surface_slug
359
+ ? await resolveRegistrySource({ domain: record.domain, sourceUrl: record.source_url })
360
+ : { surface: null };
361
+ const requiredHeaders = surface ? resolveRequiredHeaders(surface) : record.required_headers;
362
+ const transport = record.source_kind === "mcp"
363
+ ? ((surface ? resolveMcpTransport(surface) : null) ??
364
+ record.mcp_transport ??
365
+ "streamable-http")
366
+ : null;
367
+ const prepared = await prepareSource({
368
+ deferOnUnauthorized: false,
369
+ mcpHeaders: accessToken ? mcpHeaders(record, accessToken) : undefined,
370
+ requiredHeaders,
371
+ sourceKind: record.source_kind,
372
+ sourceUrl: record.source_url,
373
+ specOverrides: surface?.spec_overrides ?? [],
374
+ transport,
375
+ });
376
+ const updated = {
377
+ ...record,
378
+ actions: prepared.normalized.actions,
379
+ base_url: record.base_url ?? prepared.normalized.base_url,
380
+ mcp_transport: transport,
381
+ refreshed_at: new Date().toISOString(),
382
+ required_headers: requiredHeaders,
383
+ spec_hash: prepared.spec_hash,
384
+ };
385
+ await save(projectId, updated);
386
+ return view(updated);
387
+ }
388
+ catch (err) {
389
+ throw importFailure(err);
390
+ }
391
+ }
392
+ /** The connector as engenty's framework runs it: actions with handlers, auth with its flows. */
393
+ export async function importedConnector(projectId, id) {
394
+ const record = await load(projectId, id);
395
+ if (!record) {
396
+ return null;
397
+ }
398
+ // The record is read at call time, so a client registered a moment ago is the one used.
399
+ let current = record;
400
+ const { connector } = buildImportedConnector(record, () => current, async (client) => {
401
+ current = {
402
+ ...current,
403
+ client_id_enc: encryptToken(client.clientId),
404
+ client_secret_enc: client.clientSecret ? encryptToken(client.clientSecret) : null,
405
+ };
406
+ await save(projectId, current);
407
+ });
408
+ return { connector, record };
409
+ }