@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.
- package/LICENSE +110 -0
- package/README.md +214 -2
- package/apps/runtime/dist/agents/architect.js +444 -0
- package/apps/runtime/dist/agents/studio-assistant.js +883 -0
- package/apps/runtime/dist/agents/subscription.js +207 -0
- package/apps/runtime/dist/agents/thought.js +21 -0
- package/apps/runtime/dist/agents/website.js +480 -0
- package/apps/runtime/dist/app.js +359 -0
- package/apps/runtime/dist/apple/wizards-apple +0 -0
- package/apps/runtime/dist/assistant/browser.js +26 -0
- package/apps/runtime/dist/assistant/docs.js +158 -0
- package/apps/runtime/dist/assistant/knows.js +353 -0
- package/apps/runtime/dist/assistant/primer.js +26 -0
- package/apps/runtime/dist/assistant/runs.js +24 -0
- package/apps/runtime/dist/auth/account.js +175 -0
- package/apps/runtime/dist/auth/device.js +112 -0
- package/apps/runtime/dist/auth/index.js +358 -0
- package/apps/runtime/dist/auth/keys.js +55 -0
- package/apps/runtime/dist/auth/local-ticket.js +26 -0
- package/apps/runtime/dist/authoring/example.js +74 -0
- package/apps/runtime/dist/authoring/guide.js +433 -0
- package/apps/runtime/dist/authoring/ops.js +117 -0
- package/apps/runtime/dist/browser/fast/action-space.js +160 -0
- package/apps/runtime/dist/browser/fast/classifier.js +91 -0
- package/apps/runtime/dist/browser/fast/decide.js +171 -0
- package/apps/runtime/dist/browser/fast/driver.js +141 -0
- package/apps/runtime/dist/browser/fast/instructions.js +33 -0
- package/apps/runtime/dist/browser/fast/run.js +249 -0
- package/apps/runtime/dist/browser/fast/span-picker.js +153 -0
- package/apps/runtime/dist/browser/fast/text-helper.js +178 -0
- package/apps/runtime/dist/browser/snapshot.js +335 -0
- package/apps/runtime/dist/cli/account.js +385 -0
- package/apps/runtime/dist/cli/autostart.js +182 -0
- package/apps/runtime/dist/cli/autoupdate.js +221 -0
- package/apps/runtime/dist/cli/clients.js +44 -0
- package/apps/runtime/dist/cli/connect.js +540 -0
- package/apps/runtime/dist/cli/environment.js +93 -0
- package/apps/runtime/dist/cli/exec.js +45 -0
- package/apps/runtime/dist/cli/features.js +50 -0
- package/apps/runtime/dist/cli/home.js +88 -0
- package/apps/runtime/dist/cli/install-env.js +33 -0
- package/apps/runtime/dist/cli/machine.js +107 -0
- package/apps/runtime/dist/cli/main.js +222 -0
- package/apps/runtime/dist/cli/mcp.js +136 -0
- package/apps/runtime/dist/cli/menu.js +202 -0
- package/apps/runtime/dist/cli/processes.js +72 -0
- package/apps/runtime/dist/cli/report.js +66 -0
- package/apps/runtime/dist/cli/setup.js +335 -0
- package/apps/runtime/dist/cli/start.js +276 -0
- package/apps/runtime/dist/cli/status.js +203 -0
- package/apps/runtime/dist/cli/ui.js +59 -0
- package/apps/runtime/dist/cli/uninstall-main.js +20 -0
- package/apps/runtime/dist/cli/uninstall.js +231 -0
- package/apps/runtime/dist/cli/update.js +86 -0
- package/apps/runtime/dist/cli/validate.js +75 -0
- package/apps/runtime/dist/cli/versions.js +123 -0
- package/apps/runtime/dist/connectors/builtin.js +86 -0
- package/apps/runtime/dist/connectors/external.js +409 -0
- package/apps/runtime/dist/connectors/gmail.js +107 -0
- package/apps/runtime/dist/connectors/imap.js +261 -0
- package/apps/runtime/dist/connectors/index.js +325 -0
- package/apps/runtime/dist/connectors/mail.js +72 -0
- package/apps/runtime/dist/connectors/outlook.js +90 -0
- package/apps/runtime/dist/connectors/plugin-connections.js +343 -0
- package/apps/runtime/dist/connectors/via-account.js +65 -0
- package/apps/runtime/dist/credits/credits.js +100 -0
- package/apps/runtime/dist/credits/estimate.js +152 -0
- package/apps/runtime/dist/db/adopt.js +149 -0
- package/apps/runtime/dist/db/client.js +173 -0
- package/apps/runtime/dist/db/control-schema.js +133 -0
- package/apps/runtime/dist/db/migrations/control/0000_last_absorbing_man.sql +47 -0
- package/apps/runtime/dist/db/migrations/control/0001_gorgeous_nicolaos.sql +41 -0
- package/apps/runtime/dist/db/migrations/control/0002_secret_penance.sql +1 -0
- package/apps/runtime/dist/db/migrations/control/0003_nasty_mordo.sql +3 -0
- package/apps/runtime/dist/db/migrations/control/0004_breezy_eddie_brock.sql +6 -0
- package/apps/runtime/dist/db/migrations/control/0005_chilly_oracle.sql +1 -0
- package/apps/runtime/dist/db/migrations/control/0006_sleepy_mojo.sql +1 -0
- package/apps/runtime/dist/db/migrations/control/0007_common_the_hand.sql +15 -0
- package/apps/runtime/dist/db/migrations/control/0008_runner.sql +8 -0
- package/apps/runtime/dist/db/migrations/control/0009_plugin_claim.sql +9 -0
- package/apps/runtime/dist/db/migrations/control/0010_tan_snowbird.sql +6 -0
- package/apps/runtime/dist/db/migrations/control/meta/0000_snapshot.json +311 -0
- package/apps/runtime/dist/db/migrations/control/meta/0001_snapshot.json +599 -0
- package/apps/runtime/dist/db/migrations/control/meta/0002_snapshot.json +607 -0
- package/apps/runtime/dist/db/migrations/control/meta/0003_snapshot.json +311 -0
- package/apps/runtime/dist/db/migrations/control/meta/0004_snapshot.json +350 -0
- package/apps/runtime/dist/db/migrations/control/meta/0005_snapshot.json +358 -0
- package/apps/runtime/dist/db/migrations/control/meta/0006_snapshot.json +365 -0
- package/apps/runtime/dist/db/migrations/control/meta/0007_snapshot.json +460 -0
- package/apps/runtime/dist/db/migrations/control/meta/0008_snapshot.json +505 -0
- package/apps/runtime/dist/db/migrations/control/meta/0009_snapshot.json +561 -0
- package/apps/runtime/dist/db/migrations/control/meta/0010_snapshot.json +600 -0
- package/apps/runtime/dist/db/migrations/control/meta/_journal.json +83 -0
- package/apps/runtime/dist/db/migrations/tenant/0000_eminent_freak.sql +188 -0
- package/apps/runtime/dist/db/migrations/tenant/0001_salty_master_chief.sql +1 -0
- package/apps/runtime/dist/db/migrations/tenant/0002_cloudy_firebird.sql +1 -0
- package/apps/runtime/dist/db/migrations/tenant/0003_brown_warbound.sql +52 -0
- package/apps/runtime/dist/db/migrations/tenant/0004_romantic_nocturne.sql +6 -0
- package/apps/runtime/dist/db/migrations/tenant/0005_reflective_forgotten_one.sql +2 -0
- package/apps/runtime/dist/db/migrations/tenant/0006_hard_war_machine.sql +30 -0
- package/apps/runtime/dist/db/migrations/tenant/0007_space_data.sql +43 -0
- package/apps/runtime/dist/db/migrations/tenant/0008_run_event_note.sql +1 -0
- package/apps/runtime/dist/db/migrations/tenant/0009_knowledge.sql +104 -0
- package/apps/runtime/dist/db/migrations/tenant/0010_plugin_connection.sql +15 -0
- package/apps/runtime/dist/db/migrations/tenant/0011_runners.sql +2 -0
- package/apps/runtime/dist/db/migrations/tenant/0012_assistant_chat.sql +40 -0
- package/apps/runtime/dist/db/migrations/tenant/0013_run_origin.sql +1 -0
- package/apps/runtime/dist/db/migrations/tenant/0014_run_answer.sql +2 -0
- package/apps/runtime/dist/db/migrations/tenant/0015_device_calls.sql +13 -0
- package/apps/runtime/dist/db/migrations/tenant/0016_even_trish_tilby.sql +12 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0000_snapshot.json +1323 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0001_snapshot.json +1330 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0002_snapshot.json +1337 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0003_snapshot.json +1605 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0004_snapshot.json +1645 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0005_snapshot.json +1659 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0006_snapshot.json +1696 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0007_snapshot.json +2012 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0008_snapshot.json +2019 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0009_snapshot.json +2837 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0010_snapshot.json +2942 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0011_snapshot.json +2956 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0012_snapshot.json +3132 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0013_snapshot.json +3139 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0014_snapshot.json +3154 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0015_snapshot.json +3243 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0016_snapshot.json +3326 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/_journal.json +125 -0
- package/apps/runtime/dist/db/schema.js +602 -0
- package/apps/runtime/dist/debug.js +196 -0
- package/apps/runtime/dist/docs/dev/index.md +41 -0
- package/apps/runtime/dist/docs/dev/meta.json +7 -0
- package/apps/runtime/dist/docs/dev/plugins/connections.md +74 -0
- package/apps/runtime/dist/docs/dev/plugins/events.md +89 -0
- package/apps/runtime/dist/docs/dev/plugins/examples.md +101 -0
- package/apps/runtime/dist/docs/dev/plugins/index.md +78 -0
- package/apps/runtime/dist/docs/dev/plugins/layout.md +90 -0
- package/apps/runtime/dist/docs/dev/plugins/meta.json +28 -0
- package/apps/runtime/dist/docs/dev/plugins/quick-start.md +94 -0
- package/apps/runtime/dist/docs/dev/plugins/reference.md +348 -0
- package/apps/runtime/dist/docs/dev/plugins/reloading.md +76 -0
- package/apps/runtime/dist/docs/dev/plugins/routes.md +185 -0
- package/apps/runtime/dist/docs/dev/plugins/runners.md +230 -0
- package/apps/runtime/dist/docs/dev/plugins/server.md +281 -0
- package/apps/runtime/dist/docs/dev/plugins/shipping.md +79 -0
- package/apps/runtime/dist/docs/dev/plugins/space.md +297 -0
- package/apps/runtime/dist/docs/dev/plugins/starters.md +70 -0
- package/apps/runtime/dist/docs/dev/plugins/studio.md +363 -0
- package/apps/runtime/dist/docs/dev/plugins/styling.md +129 -0
- package/apps/runtime/dist/docs/dev/plugins/tables.md +104 -0
- package/apps/runtime/dist/docs/dev/plugins/tools.md +139 -0
- package/apps/runtime/dist/docs/dev/wizard-format.md +125 -0
- package/apps/runtime/dist/docs/meta.json +3 -0
- package/apps/runtime/dist/docs/user/ai-apps.md +112 -0
- package/apps/runtime/dist/docs/user/assistant.md +77 -0
- package/apps/runtime/dist/docs/user/build-a-wizard.md +116 -0
- package/apps/runtime/dist/docs/user/command-line.md +83 -0
- package/apps/runtime/dist/docs/user/connectors.md +90 -0
- package/apps/runtime/dist/docs/user/create-account.md +52 -0
- package/apps/runtime/dist/docs/user/data.md +66 -0
- package/apps/runtime/dist/docs/user/first-start.md +60 -0
- package/apps/runtime/dist/docs/user/index.md +49 -0
- package/apps/runtime/dist/docs/user/install.md +123 -0
- package/apps/runtime/dist/docs/user/local-only.md +42 -0
- package/apps/runtime/dist/docs/user/meta.json +32 -0
- package/apps/runtime/dist/docs/user/models.md +156 -0
- package/apps/runtime/dist/docs/user/plugins.md +71 -0
- package/apps/runtime/dist/docs/user/run.md +98 -0
- package/apps/runtime/dist/docs/user/server.md +52 -0
- package/apps/runtime/dist/docs/user/space.md +126 -0
- package/apps/runtime/dist/docs/user/steps.md +220 -0
- package/apps/runtime/dist/docs/user/test-and-share.md +224 -0
- package/apps/runtime/dist/docs/user/troubleshooting.md +67 -0
- package/apps/runtime/dist/docs/user/wordpress.md +121 -0
- package/apps/runtime/dist/documents/parse.js +246 -0
- package/apps/runtime/dist/engenty/connections-external/build-connector.js +193 -0
- package/apps/runtime/dist/engenty/connections-external/errors.js +11 -0
- package/apps/runtime/dist/engenty/connections-external/import-service.js +270 -0
- package/apps/runtime/dist/engenty/connections-external/importer/classify.js +34 -0
- package/apps/runtime/dist/engenty/connections-external/importer/map-auth.js +185 -0
- package/apps/runtime/dist/engenty/connections-external/importer/normalize-mcp.js +63 -0
- package/apps/runtime/dist/engenty/connections-external/importer/normalize-openapi.js +130 -0
- package/apps/runtime/dist/engenty/connections-external/invoke/http-invoker.js +143 -0
- package/apps/runtime/dist/engenty/connections-external/invoke/mcp-client.js +143 -0
- package/apps/runtime/dist/engenty/connections-external/net/guarded-fetch.js +119 -0
- package/apps/runtime/dist/engenty/connections-external/oauth-dcr.js +88 -0
- package/apps/runtime/dist/engenty/connections-external/registry-client.js +336 -0
- package/apps/runtime/dist/engenty/connections-external/registry-source.js +82 -0
- package/apps/runtime/dist/engenty/connections-external/types.js +7 -0
- package/apps/runtime/dist/engenty/connections-github/connector.js +209 -0
- package/apps/runtime/dist/engenty/connections-google/connectors/calendar.js +381 -0
- package/apps/runtime/dist/engenty/connections-google/connectors/contacts.js +94 -0
- package/apps/runtime/dist/engenty/connections-google/connectors/drive.js +290 -0
- package/apps/runtime/dist/engenty/connections-google/connectors/gmail.js +567 -0
- package/apps/runtime/dist/engenty/connections-google/definitions.js +11 -0
- package/apps/runtime/dist/engenty/connections-google/shared.js +73 -0
- package/apps/runtime/dist/engenty/connections-hubspot/connector.js +140 -0
- package/apps/runtime/dist/engenty/connections-microsoft/action.js +17 -0
- package/apps/runtime/dist/engenty/connections-microsoft/graph.js +114 -0
- package/apps/runtime/dist/engenty/connections-microsoft/onedrive.js +286 -0
- package/apps/runtime/dist/engenty/connections-microsoft/outlook.js +492 -0
- package/apps/runtime/dist/engenty/connections-s3/s3.js +328 -0
- package/apps/runtime/dist/engenty/connections-sdk/files-capability.js +86 -0
- package/apps/runtime/dist/engenty/connections-sdk/oauth2.js +150 -0
- package/apps/runtime/dist/engenty/connections-sdk/registry.js +89 -0
- package/apps/runtime/dist/engenty/connections-sdk/storage-capability.js +84 -0
- package/apps/runtime/dist/engenty/connections-sdk/types.js +30 -0
- package/apps/runtime/dist/engenty/connections-slack/connector.js +360 -0
- package/apps/runtime/dist/engenty/csv-import/csv-matrix.js +178 -0
- package/apps/runtime/dist/engenty/csv-import/import-sources.js +87 -0
- package/apps/runtime/dist/engenty/csv-import/parse-csv.js +129 -0
- package/apps/runtime/dist/engenty/csv-import/serialize-csv.js +20 -0
- package/apps/runtime/dist/engenty/csv-import/types.js +1 -0
- package/apps/runtime/dist/engenty/csv-import/xlsx-workbook.js +159 -0
- package/apps/runtime/dist/engenty/doc-converter/interface.js +9 -0
- package/apps/runtime/dist/engenty/doc-converter/page-break.js +92 -0
- package/apps/runtime/dist/engenty/doc-converter/providers/local/index.js +72 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/classifier.js +30 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/index.js +4 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/invoice.js +73 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/receipt.js +63 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/shared.js +40 -0
- package/apps/runtime/dist/engenty/search-index/chunks.js +164 -0
- package/apps/runtime/dist/engenty/search-index/contracts.js +9 -0
- package/apps/runtime/dist/engenty/shims/connections-sdk.js +39 -0
- package/apps/runtime/dist/engenty/shims/plugin-sdk.js +1 -0
- package/apps/runtime/dist/engenty/shims/web-ingest.js +19 -0
- package/apps/runtime/dist/engenty/web-ingest/ssrf.js +277 -0
- package/apps/runtime/dist/engine/asks.js +82 -0
- package/apps/runtime/dist/engine/decide.js +82 -0
- package/apps/runtime/dist/engine/device.js +194 -0
- package/apps/runtime/dist/engine/events.js +128 -0
- package/apps/runtime/dist/engine/input.js +208 -0
- package/apps/runtime/dist/engine/owner.js +32 -0
- package/apps/runtime/dist/engine/prepare.js +90 -0
- package/apps/runtime/dist/engine/push.js +58 -0
- package/apps/runtime/dist/engine/requirements.js +355 -0
- package/apps/runtime/dist/engine/resources.js +198 -0
- package/apps/runtime/dist/engine/runner.js +970 -0
- package/apps/runtime/dist/engine/steps.js +1000 -0
- package/apps/runtime/dist/engine/surface.js +91 -0
- package/apps/runtime/dist/engine/template.js +240 -0
- package/apps/runtime/dist/engine/types.js +4 -0
- package/apps/runtime/dist/env.js +295 -0
- package/apps/runtime/dist/features.js +123 -0
- package/apps/runtime/dist/files/blobs.js +22 -0
- package/apps/runtime/dist/files/objects.js +86 -0
- package/apps/runtime/dist/files/storage.js +120 -0
- package/apps/runtime/dist/files/web-images.js +101 -0
- package/apps/runtime/dist/film/project.js +257 -0
- package/apps/runtime/dist/film/skills.js +91 -0
- package/apps/runtime/dist/film/sounds.js +122 -0
- package/apps/runtime/dist/film/step.js +289 -0
- package/apps/runtime/dist/film/tools.js +99 -0
- package/apps/runtime/dist/geocode.js +58 -0
- package/apps/runtime/dist/harness/antigravity.js +129 -0
- package/apps/runtime/dist/harness/apple.js +270 -0
- package/apps/runtime/dist/harness/claude.js +147 -0
- package/apps/runtime/dist/harness/codex.js +229 -0
- package/apps/runtime/dist/harness/cursor.js +93 -0
- package/apps/runtime/dist/harness/env.js +124 -0
- package/apps/runtime/dist/harness/index.js +95 -0
- package/apps/runtime/dist/harness/model.js +279 -0
- package/apps/runtime/dist/harness/prompt.js +121 -0
- package/apps/runtime/dist/harness/terminal.js +194 -0
- package/apps/runtime/dist/harness/types.js +7 -0
- package/apps/runtime/dist/index.js +113 -0
- package/apps/runtime/dist/limits.js +81 -0
- package/apps/runtime/dist/link-preview.js +60 -0
- package/apps/runtime/dist/log.js +106 -0
- package/apps/runtime/dist/manage.js +249 -0
- package/apps/runtime/dist/mcp/auth.js +161 -0
- package/apps/runtime/dist/mcp/bridge.js +59 -0
- package/apps/runtime/dist/mcp/flow-app.js +97 -0
- package/apps/runtime/dist/mcp/handler.js +54 -0
- package/apps/runtime/dist/mcp/scopes.js +14 -0
- package/apps/runtime/dist/mcp/seen.js +65 -0
- package/apps/runtime/dist/mcp/tools.js +572 -0
- package/apps/runtime/dist/media/conversation.js +167 -0
- package/apps/runtime/dist/media/ffmpeg.js +121 -0
- package/apps/runtime/dist/media/generate.js +120 -0
- package/apps/runtime/dist/media/marking.js +121 -0
- package/apps/runtime/dist/media/transcribe.js +198 -0
- package/apps/runtime/dist/model-errors.js +42 -0
- package/apps/runtime/dist/models.js +1164 -0
- package/apps/runtime/dist/plugin.js +61 -0
- package/apps/runtime/dist/plugins/channels.js +78 -0
- package/apps/runtime/dist/plugins/claims.js +56 -0
- package/apps/runtime/dist/plugins/discovery.js +155 -0
- package/apps/runtime/dist/plugins/events.js +63 -0
- package/apps/runtime/dist/plugins/jobs.js +64 -0
- package/apps/runtime/dist/plugins/loader.js +508 -0
- package/apps/runtime/dist/plugins/migrations.js +69 -0
- package/apps/runtime/dist/plugins/pro-keys.js +34 -0
- package/apps/runtime/dist/plugins/pro-state.js +83 -0
- package/apps/runtime/dist/plugins/pro.js +310 -0
- package/apps/runtime/dist/plugins/public.js +44 -0
- package/apps/runtime/dist/plugins/registry.js +122 -0
- package/apps/runtime/dist/plugins/runs.js +210 -0
- package/apps/runtime/dist/render/browser-path.js +54 -0
- package/apps/runtime/dist/render/chromium.js +98 -0
- package/apps/runtime/dist/render/convert.js +158 -0
- package/apps/runtime/dist/render/downloads.js +299 -0
- package/apps/runtime/dist/render/guard.js +25 -0
- package/apps/runtime/dist/render/shaped.js +137 -0
- package/apps/runtime/dist/routes/api.js +440 -0
- package/apps/runtime/dist/routes/debug.js +42 -0
- package/apps/runtime/dist/routes/delivery.js +90 -0
- package/apps/runtime/dist/routes/internal.js +81 -0
- package/apps/runtime/dist/routes/lang.js +25 -0
- package/apps/runtime/dist/routes/marketplace.js +43 -0
- package/apps/runtime/dist/routes/plugin-public.js +113 -0
- package/apps/runtime/dist/routes/plugins.js +212 -0
- package/apps/runtime/dist/routes/runs.js +1422 -0
- package/apps/runtime/dist/routes/studio.js +1629 -0
- package/apps/runtime/dist/routes/wizard-stream.js +30 -0
- package/apps/runtime/dist/running.js +39 -0
- package/apps/runtime/dist/sandbox/docker.js +75 -0
- package/apps/runtime/dist/sandbox/index.js +23 -0
- package/apps/runtime/dist/sandbox/types.js +1 -0
- package/apps/runtime/dist/secrets/crypto.js +28 -0
- package/apps/runtime/dist/secrets/signing.js +52 -0
- package/apps/runtime/dist/secrets/vault.js +59 -0
- package/apps/runtime/dist/services/access.js +88 -0
- package/apps/runtime/dist/services/api.js +248 -0
- package/apps/runtime/dist/services/architect.js +95 -0
- package/apps/runtime/dist/services/assistant-chats.js +311 -0
- package/apps/runtime/dist/services/brand.js +85 -0
- package/apps/runtime/dist/services/cloud.js +456 -0
- package/apps/runtime/dist/services/draft-events.js +27 -0
- package/apps/runtime/dist/services/engenty-shapes.js +71 -0
- package/apps/runtime/dist/services/errors.js +29 -0
- package/apps/runtime/dist/services/files.js +178 -0
- package/apps/runtime/dist/services/knowledge-model.js +559 -0
- package/apps/runtime/dist/services/knowledge.js +721 -0
- package/apps/runtime/dist/services/links.js +16 -0
- package/apps/runtime/dist/services/marketplace.js +492 -0
- package/apps/runtime/dist/services/onboarding.js +152 -0
- package/apps/runtime/dist/services/package-file.js +82 -0
- package/apps/runtime/dist/services/package.js +170 -0
- package/apps/runtime/dist/services/profile.js +51 -0
- package/apps/runtime/dist/services/project-files.js +439 -0
- package/apps/runtime/dist/services/project-index.js +707 -0
- package/apps/runtime/dist/services/projects.js +387 -0
- package/apps/runtime/dist/services/relevance.js +58 -0
- package/apps/runtime/dist/services/runners.js +178 -0
- package/apps/runtime/dist/services/runs.js +524 -0
- package/apps/runtime/dist/services/shares.js +130 -0
- package/apps/runtime/dist/services/site.js +270 -0
- package/apps/runtime/dist/services/space-categories.js +861 -0
- package/apps/runtime/dist/services/space-data.js +792 -0
- package/apps/runtime/dist/services/space-origin.js +207 -0
- package/apps/runtime/dist/services/spaces.js +656 -0
- package/apps/runtime/dist/services/translations.js +306 -0
- package/apps/runtime/dist/services/widgets.js +34 -0
- package/apps/runtime/dist/services/wizard-icon.js +157 -0
- package/apps/runtime/dist/services/wizards.js +420 -0
- package/apps/runtime/dist/settings.js +16 -0
- package/apps/runtime/dist/store/errors.js +4 -0
- package/apps/runtime/dist/store/index.js +299 -0
- package/apps/runtime/dist/store/shared-lists.js +123 -0
- package/apps/runtime/dist/tenants/control.js +238 -0
- package/apps/runtime/dist/tenants/tenant.js +26 -0
- package/apps/runtime/dist/texts.js +207 -0
- package/apps/runtime/dist/tools/browser.js +703 -0
- package/apps/runtime/dist/tools/connector.js +204 -0
- package/apps/runtime/dist/tools/index.js +291 -0
- package/apps/runtime/dist/tools/mail.js +104 -0
- package/apps/runtime/dist/tools/net-guard.js +170 -0
- package/apps/runtime/dist/tools/pages.js +81 -0
- package/apps/runtime/dist/tools/plugin.js +180 -0
- package/apps/runtime/dist/tools/project.js +154 -0
- package/apps/runtime/dist/tools/shared.js +69 -0
- package/apps/runtime/dist/tools/store.js +238 -0
- package/apps/runtime/dist/update.js +113 -0
- package/apps/runtime/dist/widgets/bundle.js +99 -0
- package/apps/runtime/dist/widgets/render.js +329 -0
- package/apps/runtime/dist/widgets/runtime.js +108 -0
- package/apps/runtime/dist/widgets/script.js +30 -0
- package/apps/runtime/dist/widgets/step.js +223 -0
- package/apps/web/dist/ai-labels/ai-black.svg +20 -0
- package/apps/web/dist/ai-labels/ai-generated-black.svg +31 -0
- package/apps/web/dist/ai-labels/ai-generated-white.svg +32 -0
- package/apps/web/dist/ai-labels/ai-modified-black.svg +30 -0
- package/apps/web/dist/ai-labels/ai-modified-white.svg +31 -0
- package/apps/web/dist/ai-labels/ai-white.svg +21 -0
- package/apps/web/dist/assets/AboutDialog-D4mvc-zu.js +1 -0
- package/apps/web/dist/assets/ChangelogDialog-DLqpJsF6.js +1 -0
- package/apps/web/dist/assets/ChatView-3laypRcE.js +10 -0
- package/apps/web/dist/assets/EditorPage-BalA5U2Y.js +3 -0
- package/apps/web/dist/assets/FlowPreview-CusP7ci9.js +1 -0
- package/apps/web/dist/assets/Harness-BrP-ENHg.css +1 -0
- package/apps/web/dist/assets/Harness-iYLtOLaK.js +16 -0
- package/apps/web/dist/assets/NewWizardChannels-CbwJ9A56.js +1 -0
- package/apps/web/dist/assets/NewWizardPage-BOBYiB9i.js +7 -0
- package/apps/web/dist/assets/OnboardingPage-CUwCiVIr.js +1 -0
- package/apps/web/dist/assets/ProjectPage-Bb16MdYG.js +1 -0
- package/apps/web/dist/assets/PublicRunner-BCt7Q6C-.js +1 -0
- package/apps/web/dist/assets/ReadOnly-kIHX2TEy.js +1 -0
- package/apps/web/dist/assets/RunDrawer-hZ9oeSXu.js +4 -0
- package/apps/web/dist/assets/RunnerView-DUS9fPmx.js +1 -0
- package/apps/web/dist/assets/SettingsPage-BzwR50fi.js +1 -0
- package/apps/web/dist/assets/SetupPage-gAp7rPxp.js +1 -0
- package/apps/web/dist/assets/SharePage-DqZWHva_.js +1 -0
- package/apps/web/dist/assets/changelog-DugmCNSf.js +1 -0
- package/apps/web/dist/assets/engenty-eXZ-EAwd.js +1 -0
- package/apps/web/dist/assets/esm-DXeMu8Lb.js +7 -0
- package/apps/web/dist/assets/fluffy-engenty-ClRou7yu.js +456 -0
- package/apps/web/dist/assets/index-AfUa8xKD.css +1 -0
- package/apps/web/dist/assets/index-C5Sm7tTR.js +14 -0
- package/apps/web/dist/assets/jsx-runtime-BNakU3Ej.js +1 -0
- package/apps/web/dist/assets/lock-R_CfU0Xo.js +1 -0
- package/apps/web/dist/assets/oss-credits-cZ9NUaLZ.js +1 -0
- package/apps/web/dist/assets/pdfmake-Cx9scTbD.js +228 -0
- package/apps/web/dist/assets/phone-CgrIS4_-.js +1 -0
- package/apps/web/dist/assets/preload-helper-CNEI7N0N.js +1 -0
- package/apps/web/dist/assets/qr-scanner-worker.min-CJaXo3yu.js +98 -0
- package/apps/web/dist/assets/qr-scanner.min-C_UI0gH-.js +1 -0
- package/apps/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/apps/web/dist/assets/settings-menu-2IMOOlLl.js +1 -0
- package/apps/web/dist/assets/ui-dzGvc3xk.js +137 -0
- package/apps/web/dist/assets/upload-BSuTilFF.js +1 -0
- package/apps/web/dist/assets/vfs_fonts-DllDSYt1.js +1 -0
- package/apps/web/dist/embed.js +266 -0
- package/apps/web/dist/favicon.svg +1 -0
- package/apps/web/dist/icons/apple-touch-icon.png +0 -0
- package/apps/web/dist/icons/icon-192.png +0 -0
- package/apps/web/dist/icons/icon-512.png +0 -0
- package/apps/web/dist/icons/icon-maskable-512.png +0 -0
- package/apps/web/dist/index.html +48 -0
- package/apps/web/dist/install.sh +577 -0
- package/apps/web/dist/manifest.webmanifest +21 -0
- package/apps/web/dist/mcp/flow.html +980 -0
- package/apps/web/dist/sw.js +15 -0
- package/bin/wizards.mjs +288 -0
- package/modules/README.md +15 -0
- package/node_modules/@engenty/wizards/dist/plugin/index.d.ts +1150 -0
- package/node_modules/@engenty/wizards/dist/plugin/index.js +4 -0
- package/node_modules/@engenty/wizards/dist/plugin/studio.d.ts +322 -0
- package/node_modules/@engenty/wizards/dist/plugin/studio.js +4 -0
- package/node_modules/@engenty/wizards/dist/plugin/thread.d.ts +174 -0
- package/node_modules/@engenty/wizards/dist/plugin/thread.js +821 -0
- package/node_modules/@engenty/wizards/package.json +11 -0
- package/node_modules/@engenty-wizards/shared/dist/assistant.d.ts +174 -0
- package/node_modules/@engenty-wizards/shared/dist/assistant.js +65 -0
- package/node_modules/@engenty-wizards/shared/dist/changes.d.ts +22 -0
- package/node_modules/@engenty-wizards/shared/dist/changes.js +61 -0
- package/node_modules/@engenty-wizards/shared/dist/connectors.d.ts +77 -0
- package/node_modules/@engenty-wizards/shared/dist/connectors.js +2 -0
- package/node_modules/@engenty-wizards/shared/dist/decision.d.ts +76 -0
- package/node_modules/@engenty-wizards/shared/dist/decision.js +147 -0
- package/node_modules/@engenty-wizards/shared/dist/definition.d.ts +2922 -0
- package/node_modules/@engenty-wizards/shared/dist/definition.js +1920 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.d.ts +5 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.js +132 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.d.ts +11 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.js +209 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.d.ts +532 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.js +217 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.d.ts +3 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.js +3 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.d.ts +14 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.js +166 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.d.ts +33 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.js +99 -0
- package/node_modules/@engenty-wizards/shared/dist/feature-flags.d.ts +78 -0
- package/node_modules/@engenty-wizards/shared/dist/feature-flags.js +70 -0
- package/node_modules/@engenty-wizards/shared/dist/features.d.ts +41 -0
- package/node_modules/@engenty-wizards/shared/dist/features.js +89 -0
- package/node_modules/@engenty-wizards/shared/dist/fit.d.ts +71 -0
- package/node_modules/@engenty-wizards/shared/dist/fit.js +382 -0
- package/node_modules/@engenty-wizards/shared/dist/json-schema.d.ts +14 -0
- package/node_modules/@engenty-wizards/shared/dist/json-schema.js +66 -0
- package/node_modules/@engenty-wizards/shared/dist/knowledge.d.ts +199 -0
- package/node_modules/@engenty-wizards/shared/dist/knowledge.js +68 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.d.ts +35 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.js +107 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace-search.d.ts +20 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace-search.js +136 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace.d.ts +227 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace.js +354 -0
- package/node_modules/@engenty-wizards/shared/dist/merge.d.ts +7 -0
- package/node_modules/@engenty-wizards/shared/dist/merge.js +40 -0
- package/node_modules/@engenty-wizards/shared/dist/numbers.d.ts +24 -0
- package/node_modules/@engenty-wizards/shared/dist/numbers.js +54 -0
- package/node_modules/@engenty-wizards/shared/dist/projects.d.ts +224 -0
- package/node_modules/@engenty-wizards/shared/dist/projects.js +319 -0
- package/node_modules/@engenty-wizards/shared/dist/providers.d.ts +101 -0
- package/node_modules/@engenty-wizards/shared/dist/providers.js +390 -0
- package/node_modules/@engenty-wizards/shared/dist/run.d.ts +680 -0
- package/node_modules/@engenty-wizards/shared/dist/run.js +620 -0
- package/node_modules/@engenty-wizards/shared/dist/runner-texts.d.ts +546 -0
- package/node_modules/@engenty-wizards/shared/dist/runner-texts.js +523 -0
- package/node_modules/@engenty-wizards/shared/dist/runners.d.ts +93 -0
- package/node_modules/@engenty-wizards/shared/dist/runners.js +146 -0
- package/node_modules/@engenty-wizards/shared/dist/shape.d.ts +102 -0
- package/node_modules/@engenty-wizards/shared/dist/shape.js +318 -0
- package/node_modules/@engenty-wizards/shared/dist/space-data.d.ts +89 -0
- package/node_modules/@engenty-wizards/shared/dist/space-data.js +47 -0
- package/node_modules/@engenty-wizards/shared/dist/store.d.ts +117 -0
- package/node_modules/@engenty-wizards/shared/dist/store.js +81 -0
- package/node_modules/@engenty-wizards/shared/dist/surface.d.ts +115 -0
- package/node_modules/@engenty-wizards/shared/dist/surface.js +442 -0
- package/node_modules/@engenty-wizards/shared/dist/texts.d.ts +45 -0
- package/node_modules/@engenty-wizards/shared/dist/texts.js +54 -0
- package/node_modules/@engenty-wizards/shared/dist/translation.d.ts +23 -0
- package/node_modules/@engenty-wizards/shared/dist/translation.js +154 -0
- package/node_modules/@engenty-wizards/shared/dist/wizard-package.d.ts +48 -0
- package/node_modules/@engenty-wizards/shared/dist/wizard-package.js +49 -0
- package/node_modules/@engenty-wizards/shared/dist/workspace.d.ts +16 -0
- package/node_modules/@engenty-wizards/shared/dist/workspace.js +51 -0
- package/node_modules/@engenty-wizards/shared/package.json +10 -0
- package/package.json +77 -4
- package/plugin/.claude-plugin/plugin.json +9 -0
- package/plugin/.mcp.json +8 -0
- package/plugin/commands/wizard.md +8 -0
- package/plugin/skills/build-wizard/SKILL.md +27 -0
- package/plugin/skills/use-wizard/SKILL.md +18 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { LANGS, textLang, wizardLang } from "@engenty-wizards/shared/definition";
|
|
3
|
+
import { noteText } from "@engenty-wizards/shared/run";
|
|
4
|
+
import { and, asc, eq, inArray, isNotNull } from "drizzle-orm";
|
|
5
|
+
import { db, schema, withTenant } from "../db/client.js";
|
|
6
|
+
import { answerAsk } from "../engine/asks.js";
|
|
7
|
+
import { watchRun } from "../engine/events.js";
|
|
8
|
+
import { fieldErrorsIn } from "../engine/input.js";
|
|
9
|
+
import { cancel, createRun, goBack, NoCreditsError, RunInputError, retry, reviewStep, submitPage, } from "../engine/runner.js";
|
|
10
|
+
import { saveAsset } from "../files/storage.js";
|
|
11
|
+
import { wizardUnavailable } from "../limits.js";
|
|
12
|
+
import { transcribeAudio } from "../media/transcribe.js";
|
|
13
|
+
import { errorText, ModelUnavailableError } from "../model-errors.js";
|
|
14
|
+
import { uploadMime } from "../routes/delivery.js";
|
|
15
|
+
import { runTicket } from "../secrets/signing.js";
|
|
16
|
+
import { notFound, ServiceError } from "../services/errors.js";
|
|
17
|
+
import { runnerSettingsOf, runnersOf } from "../services/runners.js";
|
|
18
|
+
import { pluginRun, refusedInput, runReportOf, waitRun } from "../services/runs.js";
|
|
19
|
+
import { shareUrl } from "../services/wizards.js";
|
|
20
|
+
import { visitorOverLimit } from "../tenants/control.js";
|
|
21
|
+
import { currentTenant } from "../tenants/tenant.js";
|
|
22
|
+
/**
|
|
23
|
+
* `wizards.server.runs`: the functions behind the MCP tools, for a plugin's door. A run started
|
|
24
|
+
* here is a live run of the published wizard for a person of that door; the plugin keeps who
|
|
25
|
+
* the person is, the runtime keeps a hash of it as the run's visitor, so what the wizard
|
|
26
|
+
* remembers is theirs on the run page too.
|
|
27
|
+
*/
|
|
28
|
+
/** A person of a door as the run's visitor: a hash, never the number or the account itself. */
|
|
29
|
+
function visitorOf(person) {
|
|
30
|
+
return `p:${createHash("sha256").update(`${person.channel}:${person.id}`).digest("hex").slice(0, 32)}`;
|
|
31
|
+
}
|
|
32
|
+
export function runsApiFor(pluginId) {
|
|
33
|
+
return {
|
|
34
|
+
async start(input) {
|
|
35
|
+
const w = await db.query.wizard.findFirst({
|
|
36
|
+
where: and(eq(schema.wizard.tenantId, currentTenant()), "token" in input
|
|
37
|
+
? eq(schema.wizard.shareToken, input.token)
|
|
38
|
+
: eq(schema.wizard.id, input.wizardId)),
|
|
39
|
+
});
|
|
40
|
+
if (!w || w.publishedVersion === null) {
|
|
41
|
+
throw notFound();
|
|
42
|
+
}
|
|
43
|
+
const version = await db.query.wizardVersion.findFirst({
|
|
44
|
+
where: and(eq(schema.wizardVersion.wizardId, w.id), eq(schema.wizardVersion.version, w.publishedVersion)),
|
|
45
|
+
});
|
|
46
|
+
if (!version) {
|
|
47
|
+
throw notFound();
|
|
48
|
+
}
|
|
49
|
+
const reason = await wizardUnavailable(w);
|
|
50
|
+
if (reason) {
|
|
51
|
+
throw new ServiceError("refused", noteText(reason, wizardLang(version.definition)));
|
|
52
|
+
}
|
|
53
|
+
const visitorId = visitorOf(input.person);
|
|
54
|
+
if (await visitorOverLimit(visitorId, null)) {
|
|
55
|
+
throw new ServiceError("refused", noteText({ code: "tooManyRuns" }, wizardLang(version.definition)));
|
|
56
|
+
}
|
|
57
|
+
const runId = await createRun({
|
|
58
|
+
wizardId: w.id,
|
|
59
|
+
definition: version.definition,
|
|
60
|
+
files: version.files,
|
|
61
|
+
version: w.publishedVersion,
|
|
62
|
+
mode: "live",
|
|
63
|
+
visitorId,
|
|
64
|
+
runner: input.runner ?? pluginId,
|
|
65
|
+
}).catch((err) => {
|
|
66
|
+
if (err instanceof ModelUnavailableError) {
|
|
67
|
+
throw new ServiceError("refused", errorText(err, textLang(wizardLang(version.definition))));
|
|
68
|
+
}
|
|
69
|
+
if (err instanceof NoCreditsError) {
|
|
70
|
+
throw new ServiceError("no_credits", noteText({ code: "wizardRunOutCredits" }, wizardLang(version.definition)));
|
|
71
|
+
}
|
|
72
|
+
throw err;
|
|
73
|
+
});
|
|
74
|
+
const first = version.definition.steps[0];
|
|
75
|
+
let refused = null;
|
|
76
|
+
if (first?.type === "page" && input.answers && Object.keys(input.answers).length) {
|
|
77
|
+
const answers = input.answers;
|
|
78
|
+
const values = Object.fromEntries(first.fields.filter((f) => f.id in answers).map((f) => [f.id, answers[f.id]]));
|
|
79
|
+
try {
|
|
80
|
+
await submitPage(runId, first.id, values);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
if (!(err instanceof RunInputError)) {
|
|
84
|
+
throw err;
|
|
85
|
+
}
|
|
86
|
+
refused = fieldErrorsIn(err.errors, "en");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { runId, ticket: runTicket(runId), refused };
|
|
90
|
+
},
|
|
91
|
+
async report(runId, options) {
|
|
92
|
+
const run = await waitRun(() => pluginRun(runId), options?.waitSeconds ?? 0);
|
|
93
|
+
return (await runReportOf(run, options?.draft));
|
|
94
|
+
},
|
|
95
|
+
async wizards(runner) {
|
|
96
|
+
const rows = await db.query.wizard.findMany({
|
|
97
|
+
where: and(eq(schema.wizard.tenantId, currentTenant()), isNotNull(schema.wizard.publishedVersion)),
|
|
98
|
+
orderBy: asc(schema.wizard.createdAt),
|
|
99
|
+
});
|
|
100
|
+
const available = await runnersOf();
|
|
101
|
+
const offered = rows.filter((w) => runnerSettingsOf(w, available).enabled.includes(runner));
|
|
102
|
+
const versions = offered.length
|
|
103
|
+
? await db.query.wizardVersion.findMany({
|
|
104
|
+
where: inArray(schema.wizardVersion.wizardId, offered.map((w) => w.id)),
|
|
105
|
+
})
|
|
106
|
+
: [];
|
|
107
|
+
return offered.flatMap((w) => {
|
|
108
|
+
const version = versions.find((v) => v.wizardId === w.id && v.version === w.publishedVersion);
|
|
109
|
+
return version
|
|
110
|
+
? [
|
|
111
|
+
{
|
|
112
|
+
wizardId: w.id,
|
|
113
|
+
token: w.shareToken,
|
|
114
|
+
title: version.definition.title,
|
|
115
|
+
lang: textLang(wizardLang(version.definition)),
|
|
116
|
+
},
|
|
117
|
+
]
|
|
118
|
+
: [];
|
|
119
|
+
});
|
|
120
|
+
},
|
|
121
|
+
async answerPage(runId, stepId, values) {
|
|
122
|
+
await pluginRun(runId);
|
|
123
|
+
await submitPage(runId, stepId, values).catch(refusedInput);
|
|
124
|
+
},
|
|
125
|
+
async review(runId, stepId, action) {
|
|
126
|
+
await pluginRun(runId);
|
|
127
|
+
await reviewStep(runId, stepId, action).catch(refusedInput);
|
|
128
|
+
},
|
|
129
|
+
async answerAsk(runId, askId, answer) {
|
|
130
|
+
const run = await pluginRun(runId);
|
|
131
|
+
if (!(await answerAsk(runId, askId, answer === "allow" ? { type: "done" } : { type: "skip" }))) {
|
|
132
|
+
throw new ServiceError("refused", noteText({ code: "askClosed" }, wizardLang(run.definition)));
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
async control(runId, action) {
|
|
136
|
+
await pluginRun(runId);
|
|
137
|
+
const command = { back: goBack, retry, cancel }[action];
|
|
138
|
+
await command(runId).catch(refusedInput);
|
|
139
|
+
},
|
|
140
|
+
subscribe(runId, listener) {
|
|
141
|
+
// The listener runs inside the tenant the subscription was made in, as the events do.
|
|
142
|
+
const tenantId = currentTenant();
|
|
143
|
+
// Changes the runner makes in another process reach the plugin too, each event once.
|
|
144
|
+
return watchRun(runId, (signal) => {
|
|
145
|
+
const event = signal.event;
|
|
146
|
+
const shaped = {
|
|
147
|
+
runId,
|
|
148
|
+
event: event
|
|
149
|
+
? {
|
|
150
|
+
id: event.id,
|
|
151
|
+
at: event.at,
|
|
152
|
+
stepId: event.stepId,
|
|
153
|
+
type: event.type,
|
|
154
|
+
message: event.message,
|
|
155
|
+
note: event.note
|
|
156
|
+
? {
|
|
157
|
+
code: event.note.code,
|
|
158
|
+
text: Object.fromEntries(LANGS.map((lang) => [lang, noteText(event.note, lang)])),
|
|
159
|
+
}
|
|
160
|
+
: null,
|
|
161
|
+
}
|
|
162
|
+
: null,
|
|
163
|
+
};
|
|
164
|
+
void withTenant(tenantId, () => listener(shaped));
|
|
165
|
+
});
|
|
166
|
+
},
|
|
167
|
+
async handoffUrl(runId) {
|
|
168
|
+
const run = await pluginRun(runId);
|
|
169
|
+
const w = await db.query.wizard.findFirst({ where: eq(schema.wizard.id, run.wizardId) });
|
|
170
|
+
if (!w) {
|
|
171
|
+
throw notFound();
|
|
172
|
+
}
|
|
173
|
+
return `${shareUrl(w.shareToken)}/${run.id}?rt=${encodeURIComponent(runTicket(run.id))}`;
|
|
174
|
+
},
|
|
175
|
+
async upload(runId, file) {
|
|
176
|
+
await pluginRun(runId);
|
|
177
|
+
// The type comes from the channel's sender: kept only when it is one a wizard takes.
|
|
178
|
+
const mime = uploadMime(file.mime);
|
|
179
|
+
const asset = await saveAsset({
|
|
180
|
+
runId,
|
|
181
|
+
kind: mime.startsWith("image/") ? "image" : "file",
|
|
182
|
+
mime,
|
|
183
|
+
name: file.name,
|
|
184
|
+
data: file.data instanceof Uint8Array ? file.data : new Uint8Array(file.data),
|
|
185
|
+
});
|
|
186
|
+
return { assetId: asset.id };
|
|
187
|
+
},
|
|
188
|
+
async transcribe(runId, file) {
|
|
189
|
+
const run = await pluginRun(runId);
|
|
190
|
+
if (run.status === "done" || run.status === "cancelled" || run.status === "failed") {
|
|
191
|
+
throw new ServiceError("refused", noteText({ code: "runOver" }, wizardLang(run.definition)));
|
|
192
|
+
}
|
|
193
|
+
const bytes = file.data instanceof Uint8Array ? file.data : new Uint8Array(file.data);
|
|
194
|
+
if (!bytes.length || bytes.length > 10_000_000) {
|
|
195
|
+
throw new ServiceError("invalid", noteText({ code: "recordingTooLarge" }, wizardLang(run.definition)));
|
|
196
|
+
}
|
|
197
|
+
const { text } = await transcribeAudio({
|
|
198
|
+
bytes,
|
|
199
|
+
mediaType: file.mime.split(";")[0].trim() || "audio/ogg",
|
|
200
|
+
call: { runId: run.id },
|
|
201
|
+
}).catch((err) => {
|
|
202
|
+
if (err instanceof ModelUnavailableError) {
|
|
203
|
+
throw new ServiceError("refused", errorText(err, textLang(wizardLang(run.definition))));
|
|
204
|
+
}
|
|
205
|
+
throw err;
|
|
206
|
+
});
|
|
207
|
+
return { text };
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { accessSync, constants, existsSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { delimiter, join } from "node:path";
|
|
4
|
+
/** The first executable called `name` in the folders of `path` (a PATH value). */
|
|
5
|
+
export function findOnPath(name, path) {
|
|
6
|
+
for (const dir of path.split(delimiter)) {
|
|
7
|
+
if (!dir) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
const file = join(dir, name);
|
|
11
|
+
try {
|
|
12
|
+
accessSync(file, constants.X_OK);
|
|
13
|
+
return file;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// not here
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The browser the runtime renders PDF and PNG with and drives for websites: `CHROME_PATH`, else
|
|
23
|
+
* the first Chromium-based browser installed (Chrome, Edge, Chromium, Brave). The setup and
|
|
24
|
+
* `wizards doctor` report this one, and env.ts starts it, so a browser they show is the one used.
|
|
25
|
+
*/
|
|
26
|
+
export function findChrome(env = process.env) {
|
|
27
|
+
if (env.CHROME_PATH) {
|
|
28
|
+
return existsSync(env.CHROME_PATH) ? env.CHROME_PATH : null;
|
|
29
|
+
}
|
|
30
|
+
if (process.platform === "darwin") {
|
|
31
|
+
const apps = [
|
|
32
|
+
"Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
33
|
+
"Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
|
|
34
|
+
"Chromium.app/Contents/MacOS/Chromium",
|
|
35
|
+
"Brave Browser.app/Contents/MacOS/Brave Browser",
|
|
36
|
+
];
|
|
37
|
+
const roots = ["/Applications", join(homedir(), "Applications")];
|
|
38
|
+
for (const app of apps) {
|
|
39
|
+
for (const root of roots) {
|
|
40
|
+
if (existsSync(join(root, app))) {
|
|
41
|
+
return join(root, app);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
for (const name of ["google-chrome", "chromium", "chromium-browser", "microsoft-edge"]) {
|
|
48
|
+
const file = findOnPath(name, env.PATH ?? "");
|
|
49
|
+
if (file) {
|
|
50
|
+
return file;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { chromium } from "playwright-core";
|
|
2
|
+
import { env } from "../env.js";
|
|
3
|
+
import { assertPublicUrl } from "../tools/net-guard.js";
|
|
4
|
+
/**
|
|
5
|
+
* One Chromium for the whole server: the engenty-browser container over CDP when
|
|
6
|
+
* `BROWSER_CDP_URL` is set, else a local headless Chrome. Every user of it opens
|
|
7
|
+
* its own context, so runs never share cookies or storage. Service workers are blocked: their
|
|
8
|
+
* requests would not pass a context's route guard.
|
|
9
|
+
*/
|
|
10
|
+
let browserPromise = null;
|
|
11
|
+
async function connect() {
|
|
12
|
+
const browser = env.browserCdpUrl
|
|
13
|
+
? await chromium.connectOverCDP(env.browserCdpUrl)
|
|
14
|
+
: await chromium.launch({
|
|
15
|
+
executablePath: env.chromePath,
|
|
16
|
+
headless: true,
|
|
17
|
+
args: ["--no-sandbox", "--disable-dev-shm-usage", "--font-render-hinting=none"],
|
|
18
|
+
});
|
|
19
|
+
browser.on("disconnected", () => {
|
|
20
|
+
browserPromise = null;
|
|
21
|
+
});
|
|
22
|
+
return browser;
|
|
23
|
+
}
|
|
24
|
+
export function getBrowser() {
|
|
25
|
+
if (!browserPromise) {
|
|
26
|
+
browserPromise = connect().catch((err) => {
|
|
27
|
+
browserPromise = null;
|
|
28
|
+
throw err;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return browserPromise;
|
|
32
|
+
}
|
|
33
|
+
export async function newContext(options = {}) {
|
|
34
|
+
const browser = await getBrowser();
|
|
35
|
+
return browser.newContext({
|
|
36
|
+
viewport: { width: 1280, height: 900 },
|
|
37
|
+
serviceWorkers: "block",
|
|
38
|
+
...options,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Verdicts are kept only briefly: a name's addresses can change, and a page that rebinds its own
|
|
43
|
+
* name to a private address must not ride on an old "public".
|
|
44
|
+
*/
|
|
45
|
+
const HOST_CHECK_TTL_MS = 30_000;
|
|
46
|
+
const hostChecks = new Map();
|
|
47
|
+
function publicHost(url) {
|
|
48
|
+
let host;
|
|
49
|
+
try {
|
|
50
|
+
host = new URL(url).host;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return Promise.resolve(false);
|
|
54
|
+
}
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
const cached = hostChecks.get(host);
|
|
57
|
+
if (cached && now - cached.at < HOST_CHECK_TTL_MS) {
|
|
58
|
+
return cached.check;
|
|
59
|
+
}
|
|
60
|
+
const check = assertPublicUrl(url).then(() => true, () => false);
|
|
61
|
+
hostChecks.set(host, { at: now, check });
|
|
62
|
+
if (hostChecks.size > 2000) {
|
|
63
|
+
hostChecks.clear();
|
|
64
|
+
}
|
|
65
|
+
return check;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A context for browsing the web on a person's behalf: every request, whoever started it (the
|
|
69
|
+
* agent, a redirect, the person clicking), may only reach public hosts over http(s). Pages may
|
|
70
|
+
* still use their own data: and blob: URLs; every other scheme (file:, ftp:, ...) is refused.
|
|
71
|
+
*/
|
|
72
|
+
export async function webContext(options = {}) {
|
|
73
|
+
const context = await newContext({ acceptDownloads: true, ...options });
|
|
74
|
+
await context.route("**/*", async (route) => {
|
|
75
|
+
const url = route.request().url();
|
|
76
|
+
if (/^(data|blob):/i.test(url) || (/^https?:/i.test(url) && (await publicHost(url)))) {
|
|
77
|
+
await route.continue();
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
await route.abort("blockedbyclient");
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
return context;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* A context for rendering generated HTML: every network request is refused. The HTML is
|
|
87
|
+
* self-contained by design, and nothing it runs may reach the server's network.
|
|
88
|
+
*/
|
|
89
|
+
export async function offlineContext(options = {}) {
|
|
90
|
+
const context = await newContext({ javaScriptEnabled: true, ...options });
|
|
91
|
+
await context.route("**/*", (route) => route.abort("blockedbyclient"));
|
|
92
|
+
return context;
|
|
93
|
+
}
|
|
94
|
+
export async function closeBrowser() {
|
|
95
|
+
const b = await browserPromise?.catch(() => null);
|
|
96
|
+
browserPromise = null;
|
|
97
|
+
await b?.close().catch(() => undefined);
|
|
98
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import HTMLtoDOCX from "@turbodocx/html-to-docx";
|
|
2
|
+
import ExcelJS from "exceljs";
|
|
3
|
+
import { marked } from "marked";
|
|
4
|
+
import TurndownService from "turndown";
|
|
5
|
+
import { offlineContext } from "./chromium.js";
|
|
6
|
+
const turndown = new TurndownService({ headingStyle: "atx", codeBlockStyle: "fenced" });
|
|
7
|
+
export const MIME = {
|
|
8
|
+
png: "image/png",
|
|
9
|
+
mp4: "video/mp4",
|
|
10
|
+
mp3: "audio/mpeg",
|
|
11
|
+
pdf: "application/pdf",
|
|
12
|
+
docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
13
|
+
html: "text/html",
|
|
14
|
+
md: "text/markdown",
|
|
15
|
+
txt: "text/plain",
|
|
16
|
+
csv: "text/csv",
|
|
17
|
+
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
18
|
+
json: "application/json",
|
|
19
|
+
zip: "application/zip",
|
|
20
|
+
};
|
|
21
|
+
/** A calm print stylesheet for documents written as Markdown. */
|
|
22
|
+
export function markdownToHtml(markdown, title = "Document") {
|
|
23
|
+
const body = marked.parse(markdown, { async: false });
|
|
24
|
+
return `<!doctype html><html><head><meta charset="utf-8"><title>${escapeHtml(title)}</title>
|
|
25
|
+
<style>
|
|
26
|
+
@page { size: A4; margin: 22mm 20mm; }
|
|
27
|
+
body { font-family: "Inter", "Helvetica Neue", Arial, sans-serif; color: #1d1a17; line-height: 1.55; font-size: 11pt; max-width: 760px; margin: 40px auto; padding: 0 24px; }
|
|
28
|
+
h1 { font-size: 22pt; line-height: 1.2; margin: 0 0 12pt; }
|
|
29
|
+
h2 { font-size: 14pt; margin: 22pt 0 6pt; }
|
|
30
|
+
h3 { font-size: 12pt; margin: 16pt 0 4pt; }
|
|
31
|
+
table { border-collapse: collapse; width: 100%; margin: 10pt 0; font-size: 10pt; }
|
|
32
|
+
th, td { border-bottom: 1px solid #e6e1da; padding: 6pt 8pt; text-align: left; vertical-align: top; }
|
|
33
|
+
th { font-weight: 600; background: #f7f4ef; }
|
|
34
|
+
a { color: #b4532a; }
|
|
35
|
+
blockquote { border-left: 3px solid #e6e1da; margin: 0; padding-left: 12pt; color: #5d564e; }
|
|
36
|
+
code { background: #f4f1ec; padding: 1px 4px; border-radius: 3px; }
|
|
37
|
+
@media print { body { margin: 0; padding: 0; max-width: none; } }
|
|
38
|
+
</style></head><body>${body}</body></html>`;
|
|
39
|
+
}
|
|
40
|
+
export function escapeHtml(s) {
|
|
41
|
+
return s.replace(/[&<>"']/g, (c) => `&#${c.charCodeAt(0)};`);
|
|
42
|
+
}
|
|
43
|
+
export function htmlToMarkdown(html) {
|
|
44
|
+
const body = html.match(/<body[^>]*>([\s\S]*)<\/body>/i)?.[1] ?? html;
|
|
45
|
+
return turndown.turndown(body.replace(/<style[\s\S]*?<\/style>/gi, "").replace(/<script[\s\S]*?<\/script>/gi, ""));
|
|
46
|
+
}
|
|
47
|
+
export async function htmlToPdf(html) {
|
|
48
|
+
const context = await offlineContext();
|
|
49
|
+
try {
|
|
50
|
+
const page = await context.newPage();
|
|
51
|
+
await page.setContent(html, { waitUntil: "networkidle", timeout: 30_000 });
|
|
52
|
+
return await page.pdf({ format: "A4", printBackground: true, preferCSSPageSize: true });
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await context.close();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export async function htmlToPng(html, width = 1200, opts = {}) {
|
|
59
|
+
const context = await offlineContext({
|
|
60
|
+
viewport: { width, height: opts.height ?? 900 },
|
|
61
|
+
deviceScaleFactor: opts.scale ?? 2,
|
|
62
|
+
});
|
|
63
|
+
try {
|
|
64
|
+
const page = await context.newPage();
|
|
65
|
+
await page.setContent(html, { waitUntil: "networkidle", timeout: 30_000 });
|
|
66
|
+
return await page.screenshot({ fullPage: opts.fullPage ?? true, type: "png" });
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
await context.close();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function htmlToDocx(html) {
|
|
73
|
+
const cleaned = html.replace(/<script[\s\S]*?<\/script>/gi, "");
|
|
74
|
+
const out = await HTMLtoDOCX(cleaned, null, {
|
|
75
|
+
table: { row: { cantSplit: true } },
|
|
76
|
+
font: "Arial",
|
|
77
|
+
});
|
|
78
|
+
if (out instanceof ArrayBuffer) {
|
|
79
|
+
return new Uint8Array(out);
|
|
80
|
+
}
|
|
81
|
+
if (typeof Blob !== "undefined" && out instanceof Blob) {
|
|
82
|
+
return new Uint8Array(await out.arrayBuffer());
|
|
83
|
+
}
|
|
84
|
+
return new Uint8Array(out);
|
|
85
|
+
}
|
|
86
|
+
/** The first array of objects inside a JSON value — the table a step produced. */
|
|
87
|
+
export function firstTable(value) {
|
|
88
|
+
if (Array.isArray(value) && value.every((r) => r && typeof r === "object" && !Array.isArray(r))) {
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
if (value && typeof value === "object") {
|
|
92
|
+
for (const v of Object.values(value)) {
|
|
93
|
+
const t = firstTable(v);
|
|
94
|
+
if (t) {
|
|
95
|
+
return t;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
function tableColumns(rows) {
|
|
102
|
+
return [...new Set(rows.flatMap((r) => Object.keys(r)))];
|
|
103
|
+
}
|
|
104
|
+
function cell(v) {
|
|
105
|
+
return v === null || v === undefined ? "" : typeof v === "object" ? JSON.stringify(v) : String(v);
|
|
106
|
+
}
|
|
107
|
+
export function tableToCsv(rows) {
|
|
108
|
+
const cols = tableColumns(rows);
|
|
109
|
+
const esc = (s) => (/[",\n;]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s);
|
|
110
|
+
return [
|
|
111
|
+
cols.map(esc).join(","),
|
|
112
|
+
...rows.map((r) => cols.map((c) => esc(cell(r[c]))).join(",")),
|
|
113
|
+
].join("\n");
|
|
114
|
+
}
|
|
115
|
+
/** Every table of a step's JSON result, by its key; a bare array is the one table "Data". */
|
|
116
|
+
export function allTables(value) {
|
|
117
|
+
const isTable = (v) => Array.isArray(v) &&
|
|
118
|
+
v.length > 0 &&
|
|
119
|
+
v.every((r) => r && typeof r === "object" && !Array.isArray(r));
|
|
120
|
+
if (isTable(value)) {
|
|
121
|
+
return [{ name: "Data", rows: value }];
|
|
122
|
+
}
|
|
123
|
+
if (!value || typeof value !== "object") {
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
return Object.entries(value).flatMap(([name, v]) => isTable(v)
|
|
127
|
+
? [{ name, rows: v }]
|
|
128
|
+
: Array.isArray(v) && v.length && v.every((x) => typeof x !== "object")
|
|
129
|
+
? [{ name, rows: v.map((x) => ({ [name]: x })) }]
|
|
130
|
+
: []);
|
|
131
|
+
}
|
|
132
|
+
/** A workbook with one sheet per table. `headers` renames columns (column id → label). */
|
|
133
|
+
export async function tablesToXlsx(tables) {
|
|
134
|
+
const wb = new ExcelJS.Workbook();
|
|
135
|
+
for (const [index, table] of tables.entries()) {
|
|
136
|
+
const ws = wb.addWorksheet(table.name.replace(/[\\/*?:[\]]/g, " ").slice(0, 31) || `Sheet${index + 1}`);
|
|
137
|
+
const cols = table.headers ? Object.keys(table.headers) : tableColumns(table.rows);
|
|
138
|
+
ws.columns = cols.map((c) => {
|
|
139
|
+
const header = table.headers?.[c] ?? c;
|
|
140
|
+
return { header, key: c, width: Math.min(40, Math.max(12, header.length + 4)) };
|
|
141
|
+
});
|
|
142
|
+
for (const r of table.rows) {
|
|
143
|
+
ws.addRow(Object.fromEntries(cols.map((c) => [c, typeof r[c] === "number" ? r[c] : cell(r[c])])));
|
|
144
|
+
}
|
|
145
|
+
ws.getRow(1).font = { bold: true };
|
|
146
|
+
}
|
|
147
|
+
return new Uint8Array(await wb.xlsx.writeBuffer());
|
|
148
|
+
}
|
|
149
|
+
export function jsonToMarkdown(value) {
|
|
150
|
+
const rows = firstTable(value);
|
|
151
|
+
if (rows?.length) {
|
|
152
|
+
const cols = tableColumns(rows);
|
|
153
|
+
const head = `| ${cols.join(" | ")} |\n| ${cols.map(() => "---").join(" | ")} |`;
|
|
154
|
+
const body = rows.map((r) => `| ${cols.map((c) => cell(r[c]).replace(/\|/g, "\\|")).join(" | ")} |`);
|
|
155
|
+
return [head, ...body].join("\n");
|
|
156
|
+
}
|
|
157
|
+
return `\`\`\`json\n${JSON.stringify(value, null, 2)}\n\`\`\``;
|
|
158
|
+
}
|