@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,123 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { declaredByPlugin, defaultFeatures, FEATURES, featureOn, parseFeatures, resolveFeatures, } from "@engenty-wizards/shared/features";
|
|
4
|
+
import { accountOverview } from "./auth/account.js";
|
|
5
|
+
import { isCheckout, layout, packageRoot } from "./cli/home.js";
|
|
6
|
+
import { env } from "./env.js";
|
|
7
|
+
import { managed, tenantInfo } from "./manage.js";
|
|
8
|
+
import { loadedPlugins } from "./plugins/registry.js";
|
|
9
|
+
import { currentTenantOrNull } from "./tenants/tenant.js";
|
|
10
|
+
/**
|
|
11
|
+
* Which feature switches are on for this runtime (packages/shared/src/features.ts), laid over
|
|
12
|
+
* each other, the last winning:
|
|
13
|
+
*
|
|
14
|
+
* 1. the defaults the code declares: the core's (packages/shared/src/feature-flags.ts) and the
|
|
15
|
+
* loaded plugins' (their manifests' `features`, under the plugin's id)
|
|
16
|
+
* 2. the `FEATURES` environment variable (`teamPlans=on,site=off`): the cloud image, compose, dev
|
|
17
|
+
* 3. what the Manage-App says — for the team of a cloud runtime, for the linked account of a
|
|
18
|
+
* local one; a plan's switches and what an admin set for the team or for everyone
|
|
19
|
+
* 4. the `.features` file of this install (`~/.engenty/wizards/.features`; a checkout reads
|
|
20
|
+
* the repo root's, a cloud runtime its data folder's) — this machine's word is the last
|
|
21
|
+
*
|
|
22
|
+
* The file is read on every call, so a change counts at once. Nothing here is documented
|
|
23
|
+
* outside the code.
|
|
24
|
+
*/
|
|
25
|
+
/** The `.features` file this runtime reads: the install's, the checkout's root, or the data folder's. */
|
|
26
|
+
export function featuresFile() {
|
|
27
|
+
if (managed) {
|
|
28
|
+
return join(env.dataDir, ".features");
|
|
29
|
+
}
|
|
30
|
+
return isCheckout() ? join(packageRoot, ".features") : join(layout().home, ".features");
|
|
31
|
+
}
|
|
32
|
+
let fileCache = null;
|
|
33
|
+
/** What the `.features` file says, read again when it changed. */
|
|
34
|
+
export function fileFeatures(file = featuresFile()) {
|
|
35
|
+
let mtime = -1;
|
|
36
|
+
try {
|
|
37
|
+
mtime = statSync(file).mtimeMs;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
fileCache = null;
|
|
41
|
+
return {};
|
|
42
|
+
}
|
|
43
|
+
if (fileCache && fileCache.file === file && fileCache.mtime === mtime) {
|
|
44
|
+
return fileCache.value;
|
|
45
|
+
}
|
|
46
|
+
const value = parseFeatures(readFileSync(file, "utf8"));
|
|
47
|
+
fileCache = { file, mtime, value };
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
const envFeatures = () => parseFeatures(process.env.FEATURES ?? "");
|
|
51
|
+
/** Every switch something declared: the core's, then each plugin's under its id. */
|
|
52
|
+
export function declaredFeatures(sources = loadedPlugins().map((p) => p.source)) {
|
|
53
|
+
const out = { ...FEATURES };
|
|
54
|
+
for (const source of sources) {
|
|
55
|
+
Object.assign(out, declaredByPlugin(source.id, source.manifest.features));
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
/** The switches, with what the Manage-App said for the team or account laid in. */
|
|
60
|
+
export function features(remote) {
|
|
61
|
+
return resolveFeatures(defaultFeatures(declaredFeatures()), envFeatures(), remote, fileFeatures());
|
|
62
|
+
}
|
|
63
|
+
export function feature(name, remote) {
|
|
64
|
+
return featureOn(features(remote), name);
|
|
65
|
+
}
|
|
66
|
+
let accountCache = null;
|
|
67
|
+
/**
|
|
68
|
+
* What the Manage-App says for the tenant at hand: the team's switches on a cloud runtime
|
|
69
|
+
* (cached a minute by `tenantInfo`), the linked account's on a local one (cached a minute
|
|
70
|
+
* here). Null when nothing is linked or the Manage-App does not answer.
|
|
71
|
+
*/
|
|
72
|
+
export async function remoteFeatures() {
|
|
73
|
+
if (managed) {
|
|
74
|
+
const id = currentTenantOrNull();
|
|
75
|
+
if (!id) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return tenantInfo(id)
|
|
79
|
+
.then((info) => info.features ?? null)
|
|
80
|
+
.catch(() => null);
|
|
81
|
+
}
|
|
82
|
+
if (accountCache && Date.now() - accountCache.at < 60_000) {
|
|
83
|
+
return accountCache.value;
|
|
84
|
+
}
|
|
85
|
+
const overview = await accountOverview().catch(() => null);
|
|
86
|
+
accountCache = { at: Date.now(), value: overview?.tenant.features ?? null };
|
|
87
|
+
return accountCache.value;
|
|
88
|
+
}
|
|
89
|
+
/** The switches for the tenant at hand, with what the Manage-App says fetched. */
|
|
90
|
+
export async function currentFeatures() {
|
|
91
|
+
return features(await remoteFeatures());
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Writes one switch into the `.features` file as `name=on` or `name=off`, on the line that
|
|
95
|
+
* names it when there is one (commented out or not), else at the end; `null` turns the line
|
|
96
|
+
* back into the template's `# name=on|off`. Other lines and comments stay as they are. For the
|
|
97
|
+
* `wizards features` command.
|
|
98
|
+
*/
|
|
99
|
+
export function writeFeature(name, on, file = featuresFile()) {
|
|
100
|
+
let lines = [];
|
|
101
|
+
try {
|
|
102
|
+
lines = readFileSync(file, "utf8").replace(/\n+$/, "").split("\n");
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
lines = [];
|
|
106
|
+
}
|
|
107
|
+
const names = (line) => {
|
|
108
|
+
const m = /^\s*#?\s*([A-Za-z0-9.]+)\s*=\s*\S+\s*(?:#.*)?$/.exec(line);
|
|
109
|
+
return m?.[1] === name;
|
|
110
|
+
};
|
|
111
|
+
const written = on === null ? `# ${name}=on|off` : `${name}=${on ? "on" : "off"}`;
|
|
112
|
+
const at = lines.findIndex(names);
|
|
113
|
+
if (at === -1) {
|
|
114
|
+
lines.push(written);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
lines[at] = written;
|
|
118
|
+
}
|
|
119
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
120
|
+
writeFileSync(file, `${lines.join("\n")}\n`);
|
|
121
|
+
fileCache = null;
|
|
122
|
+
return fileFeatures(file);
|
|
123
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { objects } from "./objects.js";
|
|
3
|
+
/** Content-addressed file store for workspaces: a blob never changes, so snapshots are just lists of hashes. */
|
|
4
|
+
const blobKey = (hash) => `blobs/${hash.slice(0, 2)}/${hash}`;
|
|
5
|
+
export async function putBlob(data) {
|
|
6
|
+
const hash = createHash("sha256").update(data).digest("hex");
|
|
7
|
+
const key = blobKey(hash);
|
|
8
|
+
if (!(await objects.has(key))) {
|
|
9
|
+
await objects.put(key, data);
|
|
10
|
+
}
|
|
11
|
+
return hash;
|
|
12
|
+
}
|
|
13
|
+
export async function getBlob(hash) {
|
|
14
|
+
if (!/^[a-f0-9]{64}$/.test(hash)) {
|
|
15
|
+
throw new Error("bad blob hash");
|
|
16
|
+
}
|
|
17
|
+
const data = await objects.get(blobKey(hash));
|
|
18
|
+
if (!data) {
|
|
19
|
+
throw new Error("blob missing");
|
|
20
|
+
}
|
|
21
|
+
return data;
|
|
22
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { AwsClient } from "aws4fetch";
|
|
6
|
+
import { env } from "../env.js";
|
|
7
|
+
import { currentTenant } from "../tenants/tenant.js";
|
|
8
|
+
function fileStore(root) {
|
|
9
|
+
const at = (key) => join(root, key);
|
|
10
|
+
return {
|
|
11
|
+
async put(key, data) {
|
|
12
|
+
const path = at(key);
|
|
13
|
+
await mkdir(dirname(path), { recursive: true });
|
|
14
|
+
// Two writers of the same key (the same blob, at the same moment) each need their own.
|
|
15
|
+
const tmp = `${path}.${process.pid}.${randomBytes(6).toString("hex")}.tmp`;
|
|
16
|
+
await writeFile(tmp, data);
|
|
17
|
+
await rename(tmp, path);
|
|
18
|
+
},
|
|
19
|
+
get: (key) => readFile(at(key)).catch(() => null),
|
|
20
|
+
has: async (key) => existsSync(at(key)),
|
|
21
|
+
remove: (key) => rm(at(key), { force: true }),
|
|
22
|
+
removePrefix: (prefix) => rm(at(prefix), { recursive: true, force: true }),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function s3Store() {
|
|
26
|
+
const aws = new AwsClient({
|
|
27
|
+
accessKeyId: env.s3.accessKeyId,
|
|
28
|
+
secretAccessKey: env.s3.secretAccessKey,
|
|
29
|
+
region: env.s3.region,
|
|
30
|
+
service: "s3",
|
|
31
|
+
});
|
|
32
|
+
const base = `${env.s3.endpoint}/${env.s3.bucket}`;
|
|
33
|
+
const url = (key) => `${base}/${key.split("/").map(encodeURIComponent).join("/")}`;
|
|
34
|
+
const check = (res, what) => {
|
|
35
|
+
if (!res.ok) {
|
|
36
|
+
throw new Error(`Object store ${what} failed: ${res.status}`);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
async put(key, data) {
|
|
41
|
+
check(await aws.fetch(url(key), { method: "PUT", body: data }), "put");
|
|
42
|
+
},
|
|
43
|
+
async get(key) {
|
|
44
|
+
const res = await aws.fetch(url(key));
|
|
45
|
+
if (res.status === 404) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
check(res, "get");
|
|
49
|
+
return Buffer.from(await res.arrayBuffer());
|
|
50
|
+
},
|
|
51
|
+
async has(key) {
|
|
52
|
+
return (await aws.fetch(url(key), { method: "HEAD" })).ok;
|
|
53
|
+
},
|
|
54
|
+
async remove(key) {
|
|
55
|
+
check(await aws.fetch(url(key), { method: "DELETE" }), "delete");
|
|
56
|
+
},
|
|
57
|
+
async removePrefix(prefix) {
|
|
58
|
+
for (let token = ""; token !== null;) {
|
|
59
|
+
const list = new URL(base);
|
|
60
|
+
list.searchParams.set("list-type", "2");
|
|
61
|
+
list.searchParams.set("prefix", prefix);
|
|
62
|
+
if (token) {
|
|
63
|
+
list.searchParams.set("continuation-token", token);
|
|
64
|
+
}
|
|
65
|
+
const res = await aws.fetch(list.toString());
|
|
66
|
+
check(res, "list");
|
|
67
|
+
const xml = await res.text();
|
|
68
|
+
const keys = [...xml.matchAll(/<Key>([^<]+)<\/Key>/g)].map((m) => m[1]);
|
|
69
|
+
await Promise.all(keys.map((key) => aws.fetch(url(key), { method: "DELETE" })));
|
|
70
|
+
token = xml.match(/<NextContinuationToken>([^<]+)</)?.[1] ?? null;
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const store = env.s3.endpoint && env.s3.bucket ? s3Store() : fileStore(join(env.dataDir, "objects"));
|
|
76
|
+
const tenantKey = (key) => `t/${currentTenant()}/${key}`;
|
|
77
|
+
export const objects = {
|
|
78
|
+
put: (key, data) => store.put(tenantKey(key), data),
|
|
79
|
+
get: (key) => store.get(tenantKey(key)),
|
|
80
|
+
has: (key) => store.has(tenantKey(key)),
|
|
81
|
+
remove: (key) => store.remove(tenantKey(key)),
|
|
82
|
+
};
|
|
83
|
+
/** Deletes every file of a tenant. */
|
|
84
|
+
export function removeTenantObjects(tenantId) {
|
|
85
|
+
return store.removePrefix(`t/${tenantId}/`);
|
|
86
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { rm } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { eq } from "drizzle-orm";
|
|
4
|
+
import { nanoid } from "nanoid";
|
|
5
|
+
import { db, schema } from "../db/client.js";
|
|
6
|
+
import { env } from "../env.js";
|
|
7
|
+
import { currentTenant } from "../tenants/tenant.js";
|
|
8
|
+
import { objects } from "./objects.js";
|
|
9
|
+
const assetKey = (file) => `assets/${file}`;
|
|
10
|
+
const EXT = {
|
|
11
|
+
"image/png": "png",
|
|
12
|
+
"image/jpeg": "jpg",
|
|
13
|
+
"image/webp": "webp",
|
|
14
|
+
"image/gif": "gif",
|
|
15
|
+
"image/avif": "avif",
|
|
16
|
+
"image/svg+xml": "svg",
|
|
17
|
+
"video/mp4": "mp4",
|
|
18
|
+
"video/webm": "webm",
|
|
19
|
+
"video/quicktime": "mov",
|
|
20
|
+
"audio/webm": "weba",
|
|
21
|
+
"audio/mp4": "m4a",
|
|
22
|
+
"audio/mpeg": "mp3",
|
|
23
|
+
"audio/ogg": "ogg",
|
|
24
|
+
"audio/wav": "wav",
|
|
25
|
+
"text/html": "html",
|
|
26
|
+
"text/markdown": "md",
|
|
27
|
+
"text/plain": "txt",
|
|
28
|
+
"application/json": "json",
|
|
29
|
+
"application/pdf": "pdf",
|
|
30
|
+
};
|
|
31
|
+
export function extFor(mime) {
|
|
32
|
+
return EXT[mime] ?? "bin";
|
|
33
|
+
}
|
|
34
|
+
export async function saveAsset(input) {
|
|
35
|
+
const id = nanoid(16);
|
|
36
|
+
const bytes = typeof input.data === "string" ? Buffer.from(input.data, "utf8") : Buffer.from(input.data);
|
|
37
|
+
const file = `${id}.${extFor(input.mime)}`;
|
|
38
|
+
await objects.put(assetKey(file), bytes);
|
|
39
|
+
await db.insert(schema.asset).values({
|
|
40
|
+
id,
|
|
41
|
+
tenantId: currentTenant(),
|
|
42
|
+
runId: input.runId ?? null,
|
|
43
|
+
stepId: input.stepId ?? null,
|
|
44
|
+
kind: input.kind,
|
|
45
|
+
mime: input.mime,
|
|
46
|
+
name: input.name,
|
|
47
|
+
path: file,
|
|
48
|
+
size: bytes.byteLength,
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
id,
|
|
52
|
+
kind: input.kind,
|
|
53
|
+
mime: input.mime,
|
|
54
|
+
name: input.name,
|
|
55
|
+
...(input.ai ? { ai: input.ai } : {}),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export async function loadAsset(id) {
|
|
59
|
+
const row = await db.query.asset.findFirst({ where: eq(schema.asset.id, id) });
|
|
60
|
+
if (!row) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const data = await objects.get(assetKey(row.path));
|
|
64
|
+
return data ? { row, data } : null;
|
|
65
|
+
}
|
|
66
|
+
export async function loadAssetText(id) {
|
|
67
|
+
const found = await loadAsset(id);
|
|
68
|
+
return found ? found.data.toString("utf8") : "";
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Generated HTML points at images as `asset://ID`; previews and downloads get them
|
|
72
|
+
* inlined as data URIs, so every file stands on its own. Only the tenant's assets resolve.
|
|
73
|
+
*/
|
|
74
|
+
export async function inlineAssetRefs(html) {
|
|
75
|
+
const ids = [...new Set([...html.matchAll(/asset:\/\/([A-Za-z0-9_-]{6,40})/g)].map((m) => m[1]))];
|
|
76
|
+
let out = html;
|
|
77
|
+
for (const id of ids) {
|
|
78
|
+
const found = await loadAsset(id);
|
|
79
|
+
const uri = found?.row.mime.startsWith("image/")
|
|
80
|
+
? `data:${found.row.mime};base64,${found.data.toString("base64")}`
|
|
81
|
+
: "";
|
|
82
|
+
out = out.split(`asset://${id}`).join(uri);
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
/** Gives an asset new content under the id it has: what points to it keeps pointing to it. */
|
|
87
|
+
export async function replaceAsset(id, input) {
|
|
88
|
+
const row = await db.query.asset.findFirst({ where: eq(schema.asset.id, id) });
|
|
89
|
+
if (!row) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const bytes = Buffer.from(input.data);
|
|
93
|
+
const file = `${id}-${nanoid(6)}.${extFor(input.mime)}`;
|
|
94
|
+
await objects.put(assetKey(file), bytes);
|
|
95
|
+
await db
|
|
96
|
+
.update(schema.asset)
|
|
97
|
+
.set({ mime: input.mime, name: input.name, path: file, size: bytes.byteLength })
|
|
98
|
+
.where(eq(schema.asset.id, id));
|
|
99
|
+
await objects.remove(assetKey(row.path));
|
|
100
|
+
}
|
|
101
|
+
/** Deletes one asset: its file and its row. */
|
|
102
|
+
export async function removeAsset(id) {
|
|
103
|
+
const row = await db.query.asset.findFirst({ where: eq(schema.asset.id, id) });
|
|
104
|
+
if (row) {
|
|
105
|
+
await objects.remove(assetKey(row.path));
|
|
106
|
+
await db.delete(schema.asset).where(eq(schema.asset.id, id));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** Deletes every file a run made (uploads, results, renders, film folders) and their rows. */
|
|
110
|
+
export async function removeAssetFiles(runId) {
|
|
111
|
+
const rows = await db.query.asset.findMany({ where: eq(schema.asset.runId, runId) });
|
|
112
|
+
for (const row of rows) {
|
|
113
|
+
await objects.remove(assetKey(row.path));
|
|
114
|
+
}
|
|
115
|
+
await db.delete(schema.asset).where(eq(schema.asset.runId, runId));
|
|
116
|
+
// The folders its films were made in (../film/project.ts).
|
|
117
|
+
if (/^[A-Za-z0-9_-]+$/.test(runId)) {
|
|
118
|
+
await rm(join(env.dataDir, "films", runId), { recursive: true, force: true });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { safeFetch } from "../tools/net-guard.js";
|
|
2
|
+
/** Pictures one step may take from the web, and how large one may be. */
|
|
3
|
+
const MAX_IMAGES = 40;
|
|
4
|
+
const MAX_BYTES = 8_000_000;
|
|
5
|
+
const TIMEOUT_MS = 10_000;
|
|
6
|
+
const PARALLEL = 4;
|
|
7
|
+
const IMAGE_EXT = /\.(?:jpe?g|png|webp|gif|avif|svg)(?:[?#]|$)/i;
|
|
8
|
+
/** A key whose value is likely a picture: the extension of its URL may be hidden behind a token. */
|
|
9
|
+
const IMAGE_KEY = /image|photo|picture|thumb|cover|logo|avatar|img|poster|banner/i;
|
|
10
|
+
/** Fetches one picture; null when it is no image, too large, unreachable or private. */
|
|
11
|
+
export async function fetchWebImage(url, signal) {
|
|
12
|
+
const timeout = AbortSignal.timeout(TIMEOUT_MS);
|
|
13
|
+
try {
|
|
14
|
+
const res = await safeFetch(url, {
|
|
15
|
+
signal: signal ? AbortSignal.any([signal, timeout]) : timeout,
|
|
16
|
+
headers: { accept: "image/*" },
|
|
17
|
+
});
|
|
18
|
+
const mime = (res.headers.get("content-type") ?? "").split(";")[0].trim().toLowerCase();
|
|
19
|
+
const length = Number(res.headers.get("content-length") ?? 0);
|
|
20
|
+
if (!res.ok || !mime.startsWith("image/") || length > MAX_BYTES) {
|
|
21
|
+
await res.body?.cancel();
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const data = Buffer.from(await res.arrayBuffer());
|
|
25
|
+
return data.byteLength && data.byteLength <= MAX_BYTES ? { mime, data } : null;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Takes the pictures behind `urls` into the run, a few at a time. */
|
|
32
|
+
async function snapshot(urls, save, stepId, signal) {
|
|
33
|
+
const refs = new Map();
|
|
34
|
+
const list = [...new Set(urls)].slice(0, MAX_IMAGES);
|
|
35
|
+
let next = 0;
|
|
36
|
+
await Promise.all(Array.from({ length: Math.min(PARALLEL, list.length) }, async () => {
|
|
37
|
+
while (next < list.length && !signal?.aborted) {
|
|
38
|
+
const url = list[next++];
|
|
39
|
+
const image = await fetchWebImage(url, signal);
|
|
40
|
+
if (!image) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const ref = await save({
|
|
44
|
+
stepId,
|
|
45
|
+
kind: "web-image",
|
|
46
|
+
mime: image.mime,
|
|
47
|
+
name: new URL(url).pathname.split("/").pop()?.slice(0, 120) || "image",
|
|
48
|
+
data: image.data,
|
|
49
|
+
});
|
|
50
|
+
refs.set(url, `asset://${ref.id}`);
|
|
51
|
+
}
|
|
52
|
+
}));
|
|
53
|
+
return { refs };
|
|
54
|
+
}
|
|
55
|
+
const IMG_SRC = /(<img\b[^>]*?\ssrc\s*=\s*)(["'])(https?:\/\/[^"']+)\2/gi;
|
|
56
|
+
/** The pictures a generated page loads from the web, kept as assets; its <img> tags then point at them. */
|
|
57
|
+
export async function snapshotHtmlImages(html, save, stepId, signal) {
|
|
58
|
+
const urls = [...html.matchAll(IMG_SRC)].map((m) => m[3]);
|
|
59
|
+
if (!urls.length) {
|
|
60
|
+
return html;
|
|
61
|
+
}
|
|
62
|
+
const { refs } = await snapshot(urls, save, stepId, signal);
|
|
63
|
+
return html.replace(IMG_SRC, (m, head, q, url) => {
|
|
64
|
+
const ref = refs.get(url);
|
|
65
|
+
return ref ? `${head}${q}${ref}${q}` : m;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function isImageUrl(value, key) {
|
|
69
|
+
if (!/^https?:\/\/\S+$/.test(value) || value.length > 2000) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return IMAGE_EXT.test(new URL(value).pathname + new URL(value).search) || IMAGE_KEY.test(key);
|
|
73
|
+
}
|
|
74
|
+
function walk(value, key, visit) {
|
|
75
|
+
if (typeof value === "string") {
|
|
76
|
+
return isImageUrl(value, key) ? visit(value, key) : value;
|
|
77
|
+
}
|
|
78
|
+
if (Array.isArray(value)) {
|
|
79
|
+
return value.map((v) => walk(v, key, visit));
|
|
80
|
+
}
|
|
81
|
+
if (value && typeof value === "object") {
|
|
82
|
+
return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, walk(v, k, visit)]));
|
|
83
|
+
}
|
|
84
|
+
return value;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The pictures a widget's data points to on the web (a listing's photos, a product's cover),
|
|
88
|
+
* kept as assets; the data then carries asset://ID where the page expects the URL.
|
|
89
|
+
*/
|
|
90
|
+
export async function snapshotDataImages(data, save, stepId, signal) {
|
|
91
|
+
const urls = [];
|
|
92
|
+
walk(data, "", (url) => {
|
|
93
|
+
urls.push(url);
|
|
94
|
+
return url;
|
|
95
|
+
});
|
|
96
|
+
if (!urls.length) {
|
|
97
|
+
return data;
|
|
98
|
+
}
|
|
99
|
+
const { refs } = await snapshot(urls, save, stepId, signal);
|
|
100
|
+
return walk(data, "", (url) => refs.get(url) ?? url);
|
|
101
|
+
}
|