@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,91 @@
|
|
|
1
|
+
import { assembleSurface, dataRef, listRef, } from "@engenty-wizards/shared/definition";
|
|
2
|
+
import { note } from "@engenty-wizards/shared/run";
|
|
3
|
+
import { validateSurface } from "@engenty-wizards/shared/surface";
|
|
4
|
+
import { decide } from "./decide.js";
|
|
5
|
+
import { answersAsText, resolveRef } from "./template.js";
|
|
6
|
+
import { StepError } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* A surface step: its data read from the run (answers, outputs, stored lists; the pictures a
|
|
9
|
+
* step made as asset ids), its components written once — or, for a decided surface, the pieces
|
|
10
|
+
* one decision keeps. Checked against the catalog before it is shown.
|
|
11
|
+
*/
|
|
12
|
+
export async function runSurfaceStep(step, ctx) {
|
|
13
|
+
const data = surfaceData(step.data, ctx);
|
|
14
|
+
const components = step.components ?? (await decidedComponents(step, ctx));
|
|
15
|
+
const issues = validateSurface(components, Object.keys(data));
|
|
16
|
+
if (issues.length) {
|
|
17
|
+
throw new StepError(note("viewErrors", { detail: issues.map((i) => i.message).join(" ") }));
|
|
18
|
+
}
|
|
19
|
+
return { surface: { components, data }, at: new Date().toISOString() };
|
|
20
|
+
}
|
|
21
|
+
/** What a surface reads: key → a field, a step's output or one of its fields, a stored list. */
|
|
22
|
+
export function surfaceData(refs, ctx) {
|
|
23
|
+
const out = {};
|
|
24
|
+
for (const [key, raw] of Object.entries(refs)) {
|
|
25
|
+
const ref = dataRef(raw);
|
|
26
|
+
const list = listRef(ref);
|
|
27
|
+
if (list) {
|
|
28
|
+
out[key] = (ctx.scope.lists?.[list]?.rows ?? []).map((r) => r.cells);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const source = ctx.def.steps.find((s) => `steps.${s.id}` === ref);
|
|
32
|
+
if (source && (source.type === "generate" || source.type === "widget")) {
|
|
33
|
+
// Pictures and clips by asset id: the runner shows them from the run's files.
|
|
34
|
+
const ids = (ctx.state.outputs[source.id]?.assets ?? []).map((a) => a.id);
|
|
35
|
+
out[key] = source.type === "generate" && source.each ? ids : (ids[0] ?? null);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const output = source ? ctx.state.outputs[source.id] : undefined;
|
|
39
|
+
out[key] = output ? (output.json ?? output.text ?? null) : (resolveRef(ref, ctx.scope) ?? null);
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
/** The pieces of a decided surface one decision keeps: required ones always. */
|
|
44
|
+
async function decidedComponents(step, ctx) {
|
|
45
|
+
const candidates = step.candidates ?? [];
|
|
46
|
+
const questions = {};
|
|
47
|
+
for (const c of candidates) {
|
|
48
|
+
if (!c.required && !c.group) {
|
|
49
|
+
questions[`p_${c.id}`] = {
|
|
50
|
+
type: "noul",
|
|
51
|
+
instructions: `Should the view show this: ${c.description}`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
for (const g of step.groups ?? []) {
|
|
56
|
+
const members = candidates.filter((c) => c.group === g.id && !c.required);
|
|
57
|
+
if (members.length) {
|
|
58
|
+
questions[`g_${g.id}`] = {
|
|
59
|
+
type: "choice",
|
|
60
|
+
instructions: g.instructions,
|
|
61
|
+
criteria: {
|
|
62
|
+
...Object.fromEntries(members.map((c) => [c.id, c.description])),
|
|
63
|
+
...(g.optional ? { none: "None of these." } : {}),
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const kept = new Set(candidates.filter((c) => c.required).map((c) => c.id));
|
|
69
|
+
if (Object.keys(questions).length) {
|
|
70
|
+
const results = Object.fromEntries(ctx.def.steps
|
|
71
|
+
.map((s) => [s.title, ctx.state.outputs[s.id]?.text ?? ""])
|
|
72
|
+
.filter(([, text]) => text)
|
|
73
|
+
.map(([title, text]) => [title, text.slice(0, 6000)]));
|
|
74
|
+
const decision = await decide({
|
|
75
|
+
state: { answers: answersAsText(ctx.scope), results },
|
|
76
|
+
questions,
|
|
77
|
+
call: ctx.call,
|
|
78
|
+
signal: ctx.signal,
|
|
79
|
+
charge: ctx.chargeUsd,
|
|
80
|
+
});
|
|
81
|
+
for (const [name, answer] of Object.entries(decision.answers)) {
|
|
82
|
+
if (answer.type === "noul" && answer.noul >= 0.5) {
|
|
83
|
+
kept.add(name.slice(2));
|
|
84
|
+
}
|
|
85
|
+
else if (answer.type === "choice" && answer.choice !== "none") {
|
|
86
|
+
kept.add(answer.choice);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return assembleSurface(candidates, kept);
|
|
91
|
+
}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { allFields, isAudioValue, isLocationValue, itemsTotals, localeOf, locationText, wizardLang, } from "@engenty-wizards/shared/definition";
|
|
2
|
+
import { formatMoney } from "@engenty-wizards/shared/numbers";
|
|
3
|
+
import { fontLicenseWords, gradientCss, textStyleLine, } from "@engenty-wizards/shared/projects";
|
|
4
|
+
import { listAsMarkdown } from "@engenty-wizards/shared/store";
|
|
5
|
+
const TEMPLATE_RE = /\{\{\s*([^}]+?)\s*\}\}/g;
|
|
6
|
+
/** Line items as a Markdown table with their totals — what a model needs to write a document. */
|
|
7
|
+
export function itemsAsMarkdown(field, value, values, lang = "en") {
|
|
8
|
+
const locale = localeOf(lang);
|
|
9
|
+
const totals = itemsTotals(field, value, values);
|
|
10
|
+
const cols = field.columns ?? [];
|
|
11
|
+
if (!totals.rows.length) {
|
|
12
|
+
return "(no line items)";
|
|
13
|
+
}
|
|
14
|
+
const head = `| ${cols.map((c) => c.label).join(" | ")} | Amount |\n|${cols.map(() => " --- ").join("|")}| ---: |`;
|
|
15
|
+
const body = totals.rows.map((r) => `| ${cols
|
|
16
|
+
.map((c) => c.kind === "money"
|
|
17
|
+
? formatMoney(Number(r[c.id]) || 0, totals.currency, locale)
|
|
18
|
+
: String(r[c.id] ?? ""))
|
|
19
|
+
.join(" | ")} | ${formatMoney(r.amount, totals.currency, locale)} |`);
|
|
20
|
+
const sums = [
|
|
21
|
+
`Net: ${formatMoney(totals.net, totals.currency, locale)}`,
|
|
22
|
+
totals.vatRate
|
|
23
|
+
? `VAT ${totals.vatRate}%: ${formatMoney(totals.vat, totals.currency, locale)}`
|
|
24
|
+
: null,
|
|
25
|
+
`Total: ${formatMoney(totals.gross, totals.currency, locale)}`,
|
|
26
|
+
].filter(Boolean);
|
|
27
|
+
return [head, ...body, "", ...sums].join("\n");
|
|
28
|
+
}
|
|
29
|
+
/** Facts as lines a model reads: "Label: value". */
|
|
30
|
+
export function factLines(facts) {
|
|
31
|
+
return facts.map((f) => `${f.label}: ${f.value}`).join("\n");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The colours as a model reads them; a section's after the standard ones. A gradients section
|
|
35
|
+
* names its gradients as CSS, each with what it is for.
|
|
36
|
+
*/
|
|
37
|
+
export function colorLine(colors, sections = [], gradients = []) {
|
|
38
|
+
const line = (list) => list.map((c) => (c.name ? `${c.name} ${c.value}` : c.value)).join(", ");
|
|
39
|
+
const known = (c) => sections.some((s) => s.id === c.section);
|
|
40
|
+
return [
|
|
41
|
+
line(colors.filter((c) => !known(c))),
|
|
42
|
+
...sections.map((s) => {
|
|
43
|
+
if (s.kind === "gradients") {
|
|
44
|
+
const own = gradients.filter((g) => g.section === s.id);
|
|
45
|
+
const one = (g) => `${g.name || "gradient"}${g.description ? ` (${g.description})` : ""} ${gradientCss(g)}`;
|
|
46
|
+
return own.length ? `${s.title}: ${own.map(one).join("; ")}` : "";
|
|
47
|
+
}
|
|
48
|
+
const own = colors.filter((c) => c.section === s.id);
|
|
49
|
+
return own.length ? `${s.title}: ${line(own)}` : "";
|
|
50
|
+
}),
|
|
51
|
+
]
|
|
52
|
+
.filter(Boolean)
|
|
53
|
+
.join(" · ");
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The brand's type as a model reads it: its fonts with their licences, then its text styles. A
|
|
57
|
+
* licence that names its uses is binding.
|
|
58
|
+
*/
|
|
59
|
+
export function typeLines(fonts = [], styles = []) {
|
|
60
|
+
const families = fonts.map((f) => {
|
|
61
|
+
const weights = f.weights.length ? `, weights ${f.weights.join("/")}` : "";
|
|
62
|
+
return `- ${f.family}${f.role ? ` (${f.role})` : ""}${weights}${fontLicenseWords(f)}`;
|
|
63
|
+
});
|
|
64
|
+
const scale = styles.map((s) => `- ${s.name}: ${textStyleLine(s, fonts)}`);
|
|
65
|
+
return [
|
|
66
|
+
families.length ? `Fonts:\n${families.join("\n")}` : "",
|
|
67
|
+
fonts.some((f) => f.uses?.length)
|
|
68
|
+
? "A font's licence is binding: use a font only for what it may be used for, and set anything else in a system font."
|
|
69
|
+
: "",
|
|
70
|
+
scale.length ? `Text styles:\n${scale.join("\n")}` : "",
|
|
71
|
+
]
|
|
72
|
+
.filter(Boolean)
|
|
73
|
+
.join("\n");
|
|
74
|
+
}
|
|
75
|
+
const sectionWords = (s) => !s ? "" : s.description ? `${s.title} (${s.description})` : s.title;
|
|
76
|
+
/** The logo's section in words — "Logomark (small spaces, app icons)" — or "" where it has none. */
|
|
77
|
+
export function logoSectionLine(sections, fileId) {
|
|
78
|
+
return sectionWords(sections?.find((x) => x.logos.includes(fileId)));
|
|
79
|
+
}
|
|
80
|
+
/** The title of the asset's section — "Icons" — or "" where it has none. */
|
|
81
|
+
export function assetSectionLine(sections, fileId) {
|
|
82
|
+
return sections?.find((x) => x.assets.includes(fileId))?.title ?? "";
|
|
83
|
+
}
|
|
84
|
+
function brandRef(brand, key) {
|
|
85
|
+
switch (key) {
|
|
86
|
+
case "name":
|
|
87
|
+
return brand.name ?? "";
|
|
88
|
+
case "about":
|
|
89
|
+
return brand.about ?? "";
|
|
90
|
+
// What the free "details" text once held is now the description and the facts.
|
|
91
|
+
case "details":
|
|
92
|
+
return [brand.about, factLines(brand.facts ?? [])].filter(Boolean).join("\n");
|
|
93
|
+
case "accent":
|
|
94
|
+
return brand.colors?.[0]?.value ?? "";
|
|
95
|
+
case "colors":
|
|
96
|
+
return colorLine(brand.colors ?? [], brand.colorSections, brand.gradients);
|
|
97
|
+
case "fonts":
|
|
98
|
+
return typeLines(brand.fonts, brand.textStyles);
|
|
99
|
+
default:
|
|
100
|
+
return "";
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function stringify(v) {
|
|
104
|
+
if (v === undefined || v === null) {
|
|
105
|
+
return "";
|
|
106
|
+
}
|
|
107
|
+
if (typeof v === "string") {
|
|
108
|
+
return v;
|
|
109
|
+
}
|
|
110
|
+
if (typeof v === "number" || typeof v === "boolean") {
|
|
111
|
+
return String(v);
|
|
112
|
+
}
|
|
113
|
+
if (Array.isArray(v) && v.every((x) => typeof x !== "object")) {
|
|
114
|
+
return v.join(", ");
|
|
115
|
+
}
|
|
116
|
+
return JSON.stringify(v, null, 2);
|
|
117
|
+
}
|
|
118
|
+
export function resolveRef(ref, scope) {
|
|
119
|
+
const { def, state, brand } = scope;
|
|
120
|
+
const [head, ...rest] = ref.split(".");
|
|
121
|
+
if (head === "lists") {
|
|
122
|
+
const list = scope.lists?.[rest[0] ?? ""];
|
|
123
|
+
return list ? listAsMarkdown(list.def, list.rows) : "";
|
|
124
|
+
}
|
|
125
|
+
if (head === "today") {
|
|
126
|
+
return new Date().toISOString().slice(0, 10);
|
|
127
|
+
}
|
|
128
|
+
if (head === "item" || head === "index" || head === "count") {
|
|
129
|
+
const entry = scope.entry;
|
|
130
|
+
if (!entry) {
|
|
131
|
+
return "";
|
|
132
|
+
}
|
|
133
|
+
if (head === "index") {
|
|
134
|
+
return entry.index + 1;
|
|
135
|
+
}
|
|
136
|
+
if (head === "count") {
|
|
137
|
+
return entry.count;
|
|
138
|
+
}
|
|
139
|
+
let cur = entry.item;
|
|
140
|
+
for (const key of rest) {
|
|
141
|
+
cur = cur && typeof cur === "object" ? cur[key] : undefined;
|
|
142
|
+
}
|
|
143
|
+
return cur;
|
|
144
|
+
}
|
|
145
|
+
if (head === "brand") {
|
|
146
|
+
return brandRef(brand, rest[0] ?? "name");
|
|
147
|
+
}
|
|
148
|
+
if (head === "facts") {
|
|
149
|
+
const facts = brand.facts ?? [];
|
|
150
|
+
return rest[0] ? (facts.find((f) => f.key === rest[0])?.value ?? "") : factLines(facts);
|
|
151
|
+
}
|
|
152
|
+
if (head === "steps") {
|
|
153
|
+
const out = state.outputs[rest[0] ?? ""];
|
|
154
|
+
if (!out) {
|
|
155
|
+
return "";
|
|
156
|
+
}
|
|
157
|
+
if (rest.length === 1) {
|
|
158
|
+
return out.json !== undefined ? out.json : (out.text ?? "");
|
|
159
|
+
}
|
|
160
|
+
let cur = out.json;
|
|
161
|
+
for (const key of rest.slice(1)) {
|
|
162
|
+
cur = cur && typeof cur === "object" ? cur[key] : undefined;
|
|
163
|
+
}
|
|
164
|
+
return cur;
|
|
165
|
+
}
|
|
166
|
+
const field = allFields(def).find((f) => f.id === head);
|
|
167
|
+
const value = state.values[head];
|
|
168
|
+
if (field?.kind === "items") {
|
|
169
|
+
if (!rest.length) {
|
|
170
|
+
return itemsAsMarkdown(field, value, state.values, wizardLang(def));
|
|
171
|
+
}
|
|
172
|
+
const totals = itemsTotals(field, value, state.values);
|
|
173
|
+
return totals[rest[0]];
|
|
174
|
+
}
|
|
175
|
+
if (field?.kind === "file" && rest[0] === "speech") {
|
|
176
|
+
const pieces = state.heard?.[head];
|
|
177
|
+
// The lines an agent reads and cuts by: "[12.40–15.10] what is said".
|
|
178
|
+
return pieces
|
|
179
|
+
? pieces.map((p) => `[${p.start.toFixed(2)}–${p.end.toFixed(2)}] ${p.text}`).join("\n") ||
|
|
180
|
+
"(no intelligible speech)"
|
|
181
|
+
: "";
|
|
182
|
+
}
|
|
183
|
+
if (field?.kind === "image" || field?.kind === "file") {
|
|
184
|
+
// The files themselves are read with read_document / scan_documents by these names.
|
|
185
|
+
const ids = (Array.isArray(value) ? value : [value]).filter((v) => typeof v === "string" && v.length > 0);
|
|
186
|
+
return ids.map((id) => `upload:${id}`).join(", ");
|
|
187
|
+
}
|
|
188
|
+
if (field?.kind === "location") {
|
|
189
|
+
if (!isLocationValue(value)) {
|
|
190
|
+
return "";
|
|
191
|
+
}
|
|
192
|
+
switch (rest[0]) {
|
|
193
|
+
case undefined:
|
|
194
|
+
return locationText(value);
|
|
195
|
+
case "map":
|
|
196
|
+
return value.lat === undefined
|
|
197
|
+
? ""
|
|
198
|
+
: `https://www.openstreetmap.org/?mlat=${value.lat}&mlon=${value.lng}#map=17/${value.lat}/${value.lng}`;
|
|
199
|
+
default:
|
|
200
|
+
return value[rest[0]];
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (field?.kind === "audio") {
|
|
204
|
+
if (!isAudioValue(value)) {
|
|
205
|
+
return "";
|
|
206
|
+
}
|
|
207
|
+
if (rest[0] === "seconds") {
|
|
208
|
+
return value.seconds;
|
|
209
|
+
}
|
|
210
|
+
// A recording reads as what is said in it.
|
|
211
|
+
return value.transcript?.trim() || "(voice note without intelligible speech)";
|
|
212
|
+
}
|
|
213
|
+
if (field?.kind === "signature") {
|
|
214
|
+
// Documents place it as an image: <img src="asset://ID">.
|
|
215
|
+
return typeof value === "string" && value ? `asset://${value}` : "";
|
|
216
|
+
}
|
|
217
|
+
if (field?.kind === "list") {
|
|
218
|
+
const list = scope.lists?.[field.list ?? ""];
|
|
219
|
+
return list ? listAsMarkdown(list.def, list.rows) : "";
|
|
220
|
+
}
|
|
221
|
+
if (field?.kind === "toggle") {
|
|
222
|
+
return value ? "yes" : "no";
|
|
223
|
+
}
|
|
224
|
+
return value;
|
|
225
|
+
}
|
|
226
|
+
export function renderTemplate(template, scope) {
|
|
227
|
+
return template.replace(TEMPLATE_RE, (_m, ref) => stringify(resolveRef(ref.trim(), scope)));
|
|
228
|
+
}
|
|
229
|
+
/** Everything the person entered so far, readable — handed to agents as data. */
|
|
230
|
+
export function answersAsText(scope) {
|
|
231
|
+
const lines = [];
|
|
232
|
+
for (const field of allFields(scope.def)) {
|
|
233
|
+
const value = scope.state.values[field.id];
|
|
234
|
+
if (value === undefined || value === "" || (Array.isArray(value) && !value.length)) {
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
lines.push(`### ${field.label}\n${stringify(resolveRef(field.id, scope))}`);
|
|
238
|
+
}
|
|
239
|
+
return lines.join("\n\n");
|
|
240
|
+
}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { hostname } from "node:os";
|
|
5
|
+
import { join, resolve } from "node:path";
|
|
6
|
+
import { findChrome } from "./render/browser-path.js";
|
|
7
|
+
/** Load `.env.local` then `.env` without overriding the real environment. */
|
|
8
|
+
function loadEnvFiles() {
|
|
9
|
+
for (const name of [".env.local", ".env"]) {
|
|
10
|
+
const path = resolve(process.cwd(), name);
|
|
11
|
+
if (!existsSync(path)) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
for (const line of readFileSync(path, "utf8").split("\n")) {
|
|
15
|
+
const match = line.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*)\s*$/);
|
|
16
|
+
if (!match || process.env[match[1]] !== undefined) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
process.env[match[1]] = match[2].replace(/^(['"])(.*)\1$/, "$2");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
loadEnvFiles();
|
|
24
|
+
const str = (key, fallback = "") => process.env[key]?.trim() || fallback;
|
|
25
|
+
/**
|
|
26
|
+
* Without `SANDBOX`: Docker when the sandbox image is on this machine, else none.
|
|
27
|
+
* The image is not published, so a fresh install would otherwise offer a tool that cannot start.
|
|
28
|
+
*/
|
|
29
|
+
function sandboxEngine(image) {
|
|
30
|
+
const engine = str("SANDBOX");
|
|
31
|
+
if (str("SANDBOX_ENABLED", "1") !== "1" || engine === "off") {
|
|
32
|
+
return "off";
|
|
33
|
+
}
|
|
34
|
+
if (engine) {
|
|
35
|
+
return "docker";
|
|
36
|
+
}
|
|
37
|
+
return dockerHasImage(image) ? "docker" : "off";
|
|
38
|
+
}
|
|
39
|
+
function dockerHasImage(image) {
|
|
40
|
+
try {
|
|
41
|
+
execFileSync("docker", ["image", "inspect", image], { stdio: "ignore", timeout: 5000 });
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** A comma-separated list. */
|
|
49
|
+
const list = (key) => str(key)
|
|
50
|
+
.split(",")
|
|
51
|
+
.map((item) => item.trim())
|
|
52
|
+
.filter(Boolean);
|
|
53
|
+
const num = (key, fallback) => {
|
|
54
|
+
const v = Number(process.env[key]);
|
|
55
|
+
return Number.isFinite(v) && v > 0 ? v : fallback;
|
|
56
|
+
};
|
|
57
|
+
const dataDir = resolve(str("DATA_DIR", "data"));
|
|
58
|
+
/**
|
|
59
|
+
* Signs cookies and links and derives the store's encryption key. A runtime that runs alone
|
|
60
|
+
* makes its own once and keeps it in the data folder.
|
|
61
|
+
*/
|
|
62
|
+
function appSecret() {
|
|
63
|
+
const given = str("APP_SECRET");
|
|
64
|
+
if (given) {
|
|
65
|
+
return given;
|
|
66
|
+
}
|
|
67
|
+
mkdirSync(dataDir, { recursive: true });
|
|
68
|
+
const file = join(dataDir, "secret");
|
|
69
|
+
if (!existsSync(file)) {
|
|
70
|
+
writeFileSync(file, randomBytes(32).toString("hex"), { mode: 0o600 });
|
|
71
|
+
}
|
|
72
|
+
return readFileSync(file, "utf8").trim();
|
|
73
|
+
}
|
|
74
|
+
const manageUrl = str("MANAGE_URL").replace(/\/$/, "");
|
|
75
|
+
const port = num("API_PORT", 24368);
|
|
76
|
+
/** From source the Vite dev server on :5181 serves the pages; built, this server does. */
|
|
77
|
+
const fromSource = import.meta.url.endsWith(".ts");
|
|
78
|
+
const sandboxImage = str("SANDBOX_IMAGE", "engenty-sandbox:latest");
|
|
79
|
+
const ROLES = ["studio", "doors", "web", "runner", "all"];
|
|
80
|
+
function role() {
|
|
81
|
+
const given = str("RUNTIME_ROLE", "all");
|
|
82
|
+
if (!ROLES.includes(given)) {
|
|
83
|
+
throw new Error(`RUNTIME_ROLE must be one of ${ROLES.join(", ")}, not "${given}"`);
|
|
84
|
+
}
|
|
85
|
+
return given;
|
|
86
|
+
}
|
|
87
|
+
/** The origin people open, e.g. https://wizards.localhost — auth callbacks and links use it. */
|
|
88
|
+
const appUrl = str("APP_URL", fromSource ? "http://localhost:5181" : `http://localhost:${port}`).replace(/\/$/, "");
|
|
89
|
+
export const env = {
|
|
90
|
+
production: process.env.NODE_ENV === "production",
|
|
91
|
+
/** Running from source: Vite serves the pages, this server only `/api`. */
|
|
92
|
+
fromSource,
|
|
93
|
+
port,
|
|
94
|
+
/** Listen address; a runtime that runs alone stays on the loopback interface. */
|
|
95
|
+
host: str("API_HOST", manageUrl ? "0.0.0.0" : "127.0.0.1"),
|
|
96
|
+
/**
|
|
97
|
+
* What this process does. `studio`: the makers' half (authoring, publishing, sign-in, MCP, the
|
|
98
|
+
* studio's pages). `doors`: the customers' half (wizard pages, their API, shared results, the
|
|
99
|
+
* plugins' public routes). `web`: both halves. `runner`: takes the runs that wait and drives
|
|
100
|
+
* them (it serves the routes too, for what the web hands it). `all`: everything in one process
|
|
101
|
+
* (a runtime that runs alone). docs/plans/runner-process.md.
|
|
102
|
+
*/
|
|
103
|
+
role: role(),
|
|
104
|
+
/** Which parts this process serves, from its role. */
|
|
105
|
+
serves: {
|
|
106
|
+
studio: ["studio", "web", "runner", "all"].includes(role()),
|
|
107
|
+
doors: ["doors", "web", "runner", "all"].includes(role()),
|
|
108
|
+
runner: ["runner", "all"].includes(role()),
|
|
109
|
+
},
|
|
110
|
+
runner: {
|
|
111
|
+
/** This runner's name in the control database; a new one each start. */
|
|
112
|
+
id: `${hostname()}-${randomBytes(3).toString("hex")}`,
|
|
113
|
+
/** Where the web reaches this runner (the browser's screen of a run it holds). */
|
|
114
|
+
url: str("RUNNER_URL").replace(/\/$/, ""),
|
|
115
|
+
},
|
|
116
|
+
appUrl,
|
|
117
|
+
/**
|
|
118
|
+
* Where the wizards' pages live (`/w/<token>`, `/s/<token>`, the embed script): the doors'
|
|
119
|
+
* origin, when they are served apart from the studio. Links to a wizard, a result or a public
|
|
120
|
+
* file carry it. Default: APP_URL, the same origin.
|
|
121
|
+
*/
|
|
122
|
+
publicUrl: str("PUBLIC_URL", appUrl).replace(/\/$/, ""),
|
|
123
|
+
/** More host names this server answers under, besides APP_URL's and the loopback names. */
|
|
124
|
+
allowedHosts: list("ALLOWED_HOSTS"),
|
|
125
|
+
dataDir,
|
|
126
|
+
/** The control database; empty = a libSQL file in the data folder. */
|
|
127
|
+
databaseUrl: str("DATABASE_URL", ""),
|
|
128
|
+
databaseAuthToken: str("DATABASE_AUTH_TOKEN"),
|
|
129
|
+
/** Tenant databases on a libSQL server: `{tenant}` is replaced by the tenant id. Empty = files. */
|
|
130
|
+
tenantDbUrlTemplate: str("TENANT_DB_URL_TEMPLATE"),
|
|
131
|
+
tenantDbAuthToken: str("TENANT_DB_AUTH_TOKEN", str("DATABASE_AUTH_TOKEN")),
|
|
132
|
+
authSecret: appSecret(),
|
|
133
|
+
/** Where OAuth providers send people back after connecting an account; default <APP_URL>/api/connect/callback. */
|
|
134
|
+
connectRedirectUrl: str("CONNECT_REDIRECT_URL"),
|
|
135
|
+
/** Encrypts connected accounts and kept browser sessions; falls back to the app secret. */
|
|
136
|
+
storeKey: str("STORE_ENC_KEY"),
|
|
137
|
+
devLogin: process.env.NODE_ENV !== "production" && str("DEV_LOGIN") === "1",
|
|
138
|
+
/**
|
|
139
|
+
* `1`: the studio assistant's developer mode may be switched on here (steps, tools, prompt,
|
|
140
|
+
* the turns' events). A managed runtime offers it to the platform's admins instead.
|
|
141
|
+
*/
|
|
142
|
+
assistantDev: str("ASSISTANT_DEV") === "1",
|
|
143
|
+
/**
|
|
144
|
+
* The Manage-App this runtime belongs to. Set = people sign in there, tenants come from its
|
|
145
|
+
* tokens and model calls go through its gateway. Empty = the runtime runs alone with one tenant.
|
|
146
|
+
*/
|
|
147
|
+
manage: {
|
|
148
|
+
url: manageUrl,
|
|
149
|
+
gatewayUrl: str("GATEWAY_URL").replace(/\/$/, ""),
|
|
150
|
+
clientId: str("MANAGE_CLIENT_ID"),
|
|
151
|
+
clientSecret: str("MANAGE_CLIENT_SECRET"),
|
|
152
|
+
/** Authenticates this runtime at the Manage-App and the gateway, and the Manage-App here. */
|
|
153
|
+
serviceKey: str("MANAGE_SERVICE_KEY"),
|
|
154
|
+
},
|
|
155
|
+
/**
|
|
156
|
+
* A runtime that runs alone answers the studio only with a cookie, set by opening
|
|
157
|
+
* `/api/local/enter?k=<key>` once. The desktop app passes the key; else one is printed at start.
|
|
158
|
+
*/
|
|
159
|
+
local: {
|
|
160
|
+
accessKey: str("LOCAL_ACCESS_KEY"),
|
|
161
|
+
/** The Manage-App a local runtime links an account to (credits, publishing). */
|
|
162
|
+
accountUrl: str("ACCOUNT_URL", "https://account.engenty.ai").replace(/\/$/, ""),
|
|
163
|
+
gatewayUrl: str("ACCOUNT_GATEWAY_URL", "https://gateway.engenty.ai").replace(/\/$/, ""),
|
|
164
|
+
/** The cloud runtime "publish to the cloud" sends wizards to. */
|
|
165
|
+
cloudUrl: str("CLOUD_URL", "https://engenty.ai").replace(/\/$/, ""),
|
|
166
|
+
},
|
|
167
|
+
/**
|
|
168
|
+
* The marketplace (docs/marketplace-contract.md): searched live, its starters and what people
|
|
169
|
+
* starred kept for offline use. `off` = none.
|
|
170
|
+
*/
|
|
171
|
+
marketplace: {
|
|
172
|
+
url: str("MARKETPLACE_URL", "https://engenty.ai/wizards")
|
|
173
|
+
.replace(/^off$/, "")
|
|
174
|
+
.replace(/\/+$/, ""),
|
|
175
|
+
},
|
|
176
|
+
aiGatewayKey: str("AI_GATEWAY_API_KEY"),
|
|
177
|
+
openaiKey: str("OPENAI_API_KEY"),
|
|
178
|
+
/** The realtime speech model of live conversations; empty: the runtime's default. */
|
|
179
|
+
conversationModel: str("CONVERSATION_MODEL"),
|
|
180
|
+
anthropicKey: str("ANTHROPIC_API_KEY"),
|
|
181
|
+
googleKey: str("GOOGLE_GENERATIVE_AI_API_KEY"),
|
|
182
|
+
falKey: str("FAL_KEY"),
|
|
183
|
+
elevenlabsKey: str("ELEVENLABS_API_KEY"),
|
|
184
|
+
replicateKey: str("REPLICATE_API_TOKEN"),
|
|
185
|
+
/** TypeSafe's own API, for the classifier that checks what a search found (Jev). */
|
|
186
|
+
typesafeKey: str("TYPESAFE_API_KEY"),
|
|
187
|
+
/**
|
|
188
|
+
* `off`: agent steps get no `browser_run_fast`, where a decision model would pick each click
|
|
189
|
+
* on a page. Otherwise they get it wherever a decision model can be reached.
|
|
190
|
+
*/
|
|
191
|
+
browserFastLoop: str("BROWSER_FAST_LOOP") !== "off",
|
|
192
|
+
ollamaUrl: str("OLLAMA_URL", "http://127.0.0.1:11434/v1"),
|
|
193
|
+
/** What each model class runs on when this runtime resolves classes itself (own keys, Ollama). */
|
|
194
|
+
models: {
|
|
195
|
+
classifier: str("MODEL_CLASSIFIER", "anthropic/claude-haiku-4.5"),
|
|
196
|
+
standard: str("MODEL_STANDARD", "anthropic/claude-haiku-4.5"),
|
|
197
|
+
high: str("MODEL_HIGH", "anthropic/claude-sonnet-5.5"),
|
|
198
|
+
highest: str("MODEL_HIGHEST", "anthropic/claude-sonnet-5.5"),
|
|
199
|
+
image: str("MODEL_IMAGE", "google/gemini-3.1-flash-image"),
|
|
200
|
+
video: str("MODEL_VIDEO", "google/veo-3.1-fast-generate-001"),
|
|
201
|
+
audio: str("MODEL_AUDIO", "google/gemini-3.5-flash-lite"),
|
|
202
|
+
speech: str("MODEL_SPEECH", "google/gemini-3.8-flash-tts"),
|
|
203
|
+
/** Vectors for a project's document index; not a class a step names. */
|
|
204
|
+
embedding: str("MODEL_EMBEDDING", "openai/text-embedding-3-small"),
|
|
205
|
+
},
|
|
206
|
+
/**
|
|
207
|
+
* Reverse geocoder for location fields (Nominatim's `/reverse`); unset = coordinates only,
|
|
208
|
+
* nothing about where a person stands leaves this server.
|
|
209
|
+
*/
|
|
210
|
+
geocoderUrl: str("GEOCODER_URL"),
|
|
211
|
+
/** CDP endpoint of a Chromium (the engenty-browser image); else a local Chrome is launched. */
|
|
212
|
+
browserCdpUrl: str("BROWSER_CDP_URL"),
|
|
213
|
+
/** The browser the setup and `wizards doctor` found (render/browser-path.ts). */
|
|
214
|
+
chromePath: str("CHROME_PATH", findChrome({ PATH: process.env.PATH }) ??
|
|
215
|
+
(process.platform === "darwin"
|
|
216
|
+
? "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
|
|
217
|
+
: "/usr/bin/chromium")),
|
|
218
|
+
/** Encodes widget animations to MP4; without it widgets offer no video. */
|
|
219
|
+
ffmpegPath: str("FFMPEG_PATH", "ffmpeg"),
|
|
220
|
+
/** What runs an agent's shell and code: a Docker container or nothing. */
|
|
221
|
+
sandbox: sandboxEngine(sandboxImage),
|
|
222
|
+
sandboxImage,
|
|
223
|
+
/** Assets and workspace files in an S3-compatible bucket (R2); empty = the data folder. */
|
|
224
|
+
s3: {
|
|
225
|
+
endpoint: str("S3_ENDPOINT").replace(/\/$/, ""),
|
|
226
|
+
bucket: str("S3_BUCKET"),
|
|
227
|
+
region: str("S3_REGION", "auto"),
|
|
228
|
+
accessKeyId: str("S3_ACCESS_KEY_ID"),
|
|
229
|
+
secretAccessKey: str("S3_SECRET_ACCESS_KEY"),
|
|
230
|
+
},
|
|
231
|
+
turnstile: { siteKey: str("TURNSTILE_SITE_KEY"), secret: str("TURNSTILE_SECRET_KEY") },
|
|
232
|
+
/**
|
|
233
|
+
* The mobile app (the apps repo engenty-wizards-apps, mobile/): a phone opens this runtime's `/w/` and `/s/` links in it.
|
|
234
|
+
* Served as /.well-known/apple-app-site-association and /.well-known/assetlinks.json.
|
|
235
|
+
*/
|
|
236
|
+
mobile: {
|
|
237
|
+
/** `<team id>.<bundle id>` of the iOS apps; empty = no file. */
|
|
238
|
+
iosAppIds: list("MOBILE_IOS_APP_IDS"),
|
|
239
|
+
androidPackage: str("MOBILE_ANDROID_PACKAGE", "ai.engenty.wizards"),
|
|
240
|
+
/** SHA-256 fingerprints of the Android app's signing certificates; empty = no file. */
|
|
241
|
+
androidCertSha256: list("MOBILE_ANDROID_CERT_SHA256"),
|
|
242
|
+
},
|
|
243
|
+
/** Plugins (docs/content/dev/plugins). Code in these folders runs with the runtime's own rights. */
|
|
244
|
+
plugins: {
|
|
245
|
+
/** Folders to look in, besides the `modules/` this runtime ships with. */
|
|
246
|
+
dirs: list("PLUGINS_DIR").map((dir) => resolve(dir)),
|
|
247
|
+
/** Managed: plugins every tenant has. The Manage-App switches further ones on per tenant. */
|
|
248
|
+
defaults: list("PLUGINS_DEFAULT"),
|
|
249
|
+
/**
|
|
250
|
+
* A plugin loads again when one of its files changes. Default: on where the runtime runs
|
|
251
|
+
* alone. A runtime of a Manage-App never reloads: it would hit every tenant.
|
|
252
|
+
*/
|
|
253
|
+
watch: !manageUrl && str("PLUGINS_WATCH", "1") === "1",
|
|
254
|
+
/** Plugins' jobs (`server.every`) run. Off (`PLUGIN_JOBS=0`) where another process runs them. */
|
|
255
|
+
jobs: str("PLUGIN_JOBS", "1") === "1",
|
|
256
|
+
/**
|
|
257
|
+
* Public keys (Ed25519, SPKI DER in base64) whose signature a Pro module may carry, besides
|
|
258
|
+
* the one this runtime ships with (plugins/pro-keys.ts). For testing packages signed elsewhere.
|
|
259
|
+
*/
|
|
260
|
+
proKeys: list("PRO_MODULES_KEYS"),
|
|
261
|
+
},
|
|
262
|
+
limits: {
|
|
263
|
+
visitorRunsPerHour: num("LIMIT_VISITOR_RUNS_PER_HOUR", 6),
|
|
264
|
+
defaultDailyRuns: num("LIMIT_DEFAULT_DAILY_RUNS", 50),
|
|
265
|
+
/** Runs of one tenant that work at the same time; the Manage-App can set another number per tenant. */
|
|
266
|
+
concurrentRuns: num("LIMIT_CONCURRENT_RUNS", 4),
|
|
267
|
+
/**
|
|
268
|
+
* Projects a tenant works with. One: the studio shows no project switcher. The Manage-App
|
|
269
|
+
* can set another number per tenant; the database holds any number either way.
|
|
270
|
+
*/
|
|
271
|
+
projects: num("LIMIT_PROJECTS", 1),
|
|
272
|
+
/** Wizards a local install may keep on this runtime in its synced project. */
|
|
273
|
+
syncedWizards: num("LIMIT_SYNCED_WIZARDS", 50),
|
|
274
|
+
/** End-user runs (no account) and their shared links are deleted after this many days. */
|
|
275
|
+
resultTtlDays: num("RESULT_TTL_DAYS", 7),
|
|
276
|
+
/** What a wizard keeps for a person (lists, files, accounts) goes when unused this long. */
|
|
277
|
+
storeTtlDays: num("STORE_TTL_DAYS", 400),
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
/**
|
|
281
|
+
* The path APP_URL ends in: `/wizards` for https://example.com/wizards, empty for an origin alone. The proxy
|
|
282
|
+
* may strip it or not, so the server takes both; what it writes into a cookie or a redirect
|
|
283
|
+
* carries it.
|
|
284
|
+
*/
|
|
285
|
+
export const basePath = new URL(env.appUrl).pathname.replace(/\/+$/, "");
|
|
286
|
+
if (env.production) {
|
|
287
|
+
const required = [
|
|
288
|
+
"APP_URL",
|
|
289
|
+
...(manageUrl ? ["APP_SECRET", "MANAGE_SERVICE_KEY", "MANAGE_CLIENT_ID"] : []),
|
|
290
|
+
];
|
|
291
|
+
const missing = required.filter((k) => !process.env[k]?.trim());
|
|
292
|
+
if (missing.length) {
|
|
293
|
+
throw new Error(`Missing required environment in production: ${missing.join(", ")}`);
|
|
294
|
+
}
|
|
295
|
+
}
|