@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,442 @@
|
|
|
1
|
+
// SPDX-License-Identifier: FSL-1.1-MIT OR MIT
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { shapeAt } from "./shape.js";
|
|
4
|
+
/**
|
|
5
|
+
* Surfaces: views composed from a small catalog of native components, bound to a run's data and
|
|
6
|
+
* rendered by the runner itself — themed, on phones, no iframe and nothing to pay per run. A
|
|
7
|
+
* surface is data, not code: only catalog components render, so it needs no sandbox. Between the
|
|
8
|
+
* plain table a review shows and a widget, which is free HTML. As engenty-pro's A2UI catalog
|
|
9
|
+
* (`engenty:core/v1`), kept to what a wizard's result needs.
|
|
10
|
+
*
|
|
11
|
+
* A surface is a flat list of components with ids; the one with id "root" is drawn, containers
|
|
12
|
+
* name their children by id. A prop may be a literal or `{ "path": "/json/pointer" }` into the
|
|
13
|
+
* surface's data. A `List`, `Table` or `Group` repeats over an array: inside a repeated row, a
|
|
14
|
+
* path without a leading slash reads the row ("name"), one with a slash the whole data. A path
|
|
15
|
+
* may turn what it reads into words: `map` looks the value up (`{ "true": "im Kühlschrank" }`),
|
|
16
|
+
* `format` sets it into a text ("{} Min").
|
|
17
|
+
*/
|
|
18
|
+
export const SURFACE_COMPONENTS = [
|
|
19
|
+
"Column",
|
|
20
|
+
"Text",
|
|
21
|
+
"List",
|
|
22
|
+
"Row",
|
|
23
|
+
"DetailGrid",
|
|
24
|
+
"Badge",
|
|
25
|
+
"Grid",
|
|
26
|
+
"Metric",
|
|
27
|
+
"Table",
|
|
28
|
+
"Image",
|
|
29
|
+
"BarChart",
|
|
30
|
+
"LineChart",
|
|
31
|
+
"DonutChart",
|
|
32
|
+
"Actions",
|
|
33
|
+
"Button",
|
|
34
|
+
"Tabs",
|
|
35
|
+
"Card",
|
|
36
|
+
"Fold",
|
|
37
|
+
"Group",
|
|
38
|
+
"Chips",
|
|
39
|
+
"Checklist",
|
|
40
|
+
"Steps",
|
|
41
|
+
"Link",
|
|
42
|
+
"Callout",
|
|
43
|
+
];
|
|
44
|
+
/** Components that hold others by id. */
|
|
45
|
+
const CONTAINERS = new Set([
|
|
46
|
+
"Column",
|
|
47
|
+
"List",
|
|
48
|
+
"Grid",
|
|
49
|
+
"Actions",
|
|
50
|
+
"Card",
|
|
51
|
+
"Fold",
|
|
52
|
+
"Group",
|
|
53
|
+
]);
|
|
54
|
+
/** The props each component needs. */
|
|
55
|
+
const REQUIRED = {
|
|
56
|
+
Text: ["text"],
|
|
57
|
+
Row: ["title"],
|
|
58
|
+
DetailGrid: ["rows"],
|
|
59
|
+
Badge: ["label"],
|
|
60
|
+
Metric: ["label", "value"],
|
|
61
|
+
Table: ["rows"],
|
|
62
|
+
Image: ["src"],
|
|
63
|
+
BarChart: ["points"],
|
|
64
|
+
LineChart: ["points"],
|
|
65
|
+
DonutChart: ["slices"],
|
|
66
|
+
Button: ["label", "action"],
|
|
67
|
+
Tabs: ["tabs"],
|
|
68
|
+
Card: ["title"],
|
|
69
|
+
Fold: ["title", "children"],
|
|
70
|
+
Group: ["children", "by"],
|
|
71
|
+
Chips: ["items"],
|
|
72
|
+
Checklist: ["items"],
|
|
73
|
+
Steps: ["items"],
|
|
74
|
+
Link: ["title", "items", "value", "view"],
|
|
75
|
+
Callout: ["text"],
|
|
76
|
+
};
|
|
77
|
+
export const SURFACE_ACTIONS = ["regenerate", "open"];
|
|
78
|
+
const id = z.string().regex(/^[a-zA-Z][a-zA-Z0-9_-]{0,40}$/, "ids are letters, digits, _ and -");
|
|
79
|
+
/** One component: its id, its kind, its children (ids, or a template repeated over an array). */
|
|
80
|
+
export const surfaceComponentSchema = z.looseObject({
|
|
81
|
+
id,
|
|
82
|
+
component: z.enum(SURFACE_COMPONENTS),
|
|
83
|
+
children: z
|
|
84
|
+
.union([z.array(z.string()), z.object({ path: z.string(), componentId: z.string() })])
|
|
85
|
+
.optional(),
|
|
86
|
+
});
|
|
87
|
+
export const surfaceComponentsSchema = z.array(surfaceComponentSchema).min(1).max(200);
|
|
88
|
+
const isPath = (v) => Boolean(v && typeof v === "object" && !Array.isArray(v) && typeof v.path === "string");
|
|
89
|
+
/**
|
|
90
|
+
* The ids a component draws: its children, the views of its tabs. A Link's view is drawn only
|
|
91
|
+
* when it is opened, so it is no part of the tree.
|
|
92
|
+
*/
|
|
93
|
+
function childIds(c) {
|
|
94
|
+
const kids = c.children;
|
|
95
|
+
const ids = Array.isArray(kids) ? [...kids] : kids ? [kids.componentId] : [];
|
|
96
|
+
const tabs = c.tabs;
|
|
97
|
+
if (Array.isArray(tabs)) {
|
|
98
|
+
for (const tab of tabs) {
|
|
99
|
+
const child = tab?.child;
|
|
100
|
+
if (typeof child === "string") {
|
|
101
|
+
ids.push(child);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return ids;
|
|
106
|
+
}
|
|
107
|
+
/** Every `{ path }` in a component's props, with whether it reads a repeated row. */
|
|
108
|
+
function pathsOf(c) {
|
|
109
|
+
const out = [];
|
|
110
|
+
const walk = (v) => {
|
|
111
|
+
if (isPath(v)) {
|
|
112
|
+
out.push(v.path);
|
|
113
|
+
}
|
|
114
|
+
else if (Array.isArray(v)) {
|
|
115
|
+
v.forEach(walk);
|
|
116
|
+
}
|
|
117
|
+
else if (v && typeof v === "object") {
|
|
118
|
+
Object.values(v).forEach(walk);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
for (const [key, value] of Object.entries(c)) {
|
|
122
|
+
if (key !== "id" && key !== "component") {
|
|
123
|
+
walk(key === "children" && !Array.isArray(value) && isPath(value) ? { path: value.path } : value);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
/** Props naming a key of the entries a component's `items` (or chart's points) holds. */
|
|
129
|
+
const ENTRY_KEYS = [
|
|
130
|
+
"labelKey",
|
|
131
|
+
"valueKey",
|
|
132
|
+
"flagKey",
|
|
133
|
+
"detailKey",
|
|
134
|
+
"noteKey",
|
|
135
|
+
"groupKey",
|
|
136
|
+
"textKey",
|
|
137
|
+
"minutesKey",
|
|
138
|
+
];
|
|
139
|
+
/** A path as parts: "/days/0/label" from the data, "meals.slot" from the entry. */
|
|
140
|
+
const partsOf = (path) => (path.startsWith("/") ? path.slice(1) : path)
|
|
141
|
+
.split(/[./]/)
|
|
142
|
+
.filter(Boolean)
|
|
143
|
+
.map((p) => p.replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
144
|
+
/**
|
|
145
|
+
* The paths a surface reads, followed through the step's schema from "root": a repeated child
|
|
146
|
+
* reads an entry of the list its path names, a Link's view the entry it opens. Every path has to
|
|
147
|
+
* be in the schema, every key a component names in its entries.
|
|
148
|
+
*/
|
|
149
|
+
function shapeIssues(byId, root) {
|
|
150
|
+
const issues = [];
|
|
151
|
+
const seen = new Map();
|
|
152
|
+
/** The shape a path reads where `entry` is drawn; "any": unchecked. */
|
|
153
|
+
const resolve = (path, entry) => {
|
|
154
|
+
if (path.startsWith("/")) {
|
|
155
|
+
return shapeAt(root, partsOf(path));
|
|
156
|
+
}
|
|
157
|
+
if (entry === "any") {
|
|
158
|
+
return "any";
|
|
159
|
+
}
|
|
160
|
+
return entry ? shapeAt(entry, partsOf(path)) : undefined;
|
|
161
|
+
};
|
|
162
|
+
const say = (c, path, entry) => issues.push({
|
|
163
|
+
message: !path.startsWith("/") && !entry
|
|
164
|
+
? `"${c.id}" reads "${path}" outside a repeated entry; from the data it is "/${path.replace(/\./g, "/")}".`
|
|
165
|
+
: `"${c.id}" reads "${path}", which no data provides.`,
|
|
166
|
+
});
|
|
167
|
+
/** The entries of a list a prop binds, or undefined (and an issue) where it is no list. */
|
|
168
|
+
const entriesOf = (c, value, entry) => {
|
|
169
|
+
if (!isPath(value)) {
|
|
170
|
+
return "any";
|
|
171
|
+
}
|
|
172
|
+
const at = resolve(value.path, entry);
|
|
173
|
+
if (at === "any") {
|
|
174
|
+
return "any";
|
|
175
|
+
}
|
|
176
|
+
if (at?.kind === "list") {
|
|
177
|
+
return at.of;
|
|
178
|
+
}
|
|
179
|
+
if (at?.kind === "table") {
|
|
180
|
+
return at.columns?.length
|
|
181
|
+
? {
|
|
182
|
+
kind: "object",
|
|
183
|
+
fields: Object.fromEntries(at.columns.map((k) => [k, { kind: "text" }])),
|
|
184
|
+
}
|
|
185
|
+
: "any";
|
|
186
|
+
}
|
|
187
|
+
if (at) {
|
|
188
|
+
issues.push({ message: `"${c.id}" reads "${value.path}" as a list; it is ${at.kind}.` });
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
say(c, value.path, entry);
|
|
192
|
+
}
|
|
193
|
+
return undefined;
|
|
194
|
+
};
|
|
195
|
+
const hasKey = (shape, k) => shape === "any" || shape === undefined || shape.kind !== "object" || k in shape.fields;
|
|
196
|
+
const visit = (cid, entry) => {
|
|
197
|
+
const c = byId.get(cid);
|
|
198
|
+
const done = seen.get(cid) ?? new Set();
|
|
199
|
+
if (!c || done.has(entry)) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
done.add(entry);
|
|
203
|
+
seen.set(cid, done);
|
|
204
|
+
const props = c;
|
|
205
|
+
// What the component's items, rows or points hold, for the keys it names in them.
|
|
206
|
+
const listProp = ["items", "rows", "points", "slices"].find((k) => isPath(props[k]));
|
|
207
|
+
const items = listProp ? entriesOf(c, props[listProp], entry) : undefined;
|
|
208
|
+
for (const k of ENTRY_KEYS) {
|
|
209
|
+
const named = props[k];
|
|
210
|
+
if (typeof named === "string" && items && !hasKey(items, named)) {
|
|
211
|
+
issues.push({
|
|
212
|
+
message: `"${c.id}": "${k}" names "${named}", which its entries do not have.`,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (c.component === "Table" && Array.isArray(props.columns) && items) {
|
|
217
|
+
for (const col of props.columns) {
|
|
218
|
+
if (typeof col?.key === "string" && !hasKey(items, col.key)) {
|
|
219
|
+
issues.push({ message: `"${c.id}": no column "${col.key}" in its rows.` });
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// A Link: title, subtitle and meta read the entry it opens, the rest the entry it sits in.
|
|
224
|
+
const opened = c.component === "Link" ? items : undefined;
|
|
225
|
+
if (c.component === "Link" && typeof props.key === "string" && !hasKey(opened, props.key)) {
|
|
226
|
+
issues.push({ message: `"${c.id}": its items have no "${props.key}".` });
|
|
227
|
+
}
|
|
228
|
+
for (const [k, value] of Object.entries(props)) {
|
|
229
|
+
if (k === "id" || k === "component" || k === "children" || k === listProp) {
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
const reads = c.component === "Link" && (k === "title" || k === "subtitle" || k === "meta");
|
|
233
|
+
const scope = reads ? opened : entry;
|
|
234
|
+
const paths = [];
|
|
235
|
+
const walk = (v) => {
|
|
236
|
+
if (isPath(v)) {
|
|
237
|
+
paths.push(v.path);
|
|
238
|
+
}
|
|
239
|
+
else if (Array.isArray(v)) {
|
|
240
|
+
v.forEach(walk);
|
|
241
|
+
}
|
|
242
|
+
else if (v && typeof v === "object") {
|
|
243
|
+
Object.values(v).forEach(walk);
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
walk(value);
|
|
247
|
+
for (const path of paths) {
|
|
248
|
+
if (resolve(path, scope) === undefined) {
|
|
249
|
+
say(c, path, scope);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
const kids = c.children;
|
|
254
|
+
if (Array.isArray(kids)) {
|
|
255
|
+
for (const k of kids) {
|
|
256
|
+
visit(k, entry);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else if (kids) {
|
|
260
|
+
const of = entriesOf(c, { path: kids.path }, entry);
|
|
261
|
+
if (of !== undefined) {
|
|
262
|
+
if (c.component === "Group" && typeof props.by === "string" && !hasKey(of, props.by)) {
|
|
263
|
+
issues.push({
|
|
264
|
+
message: `"${c.id}": "by" names "${props.by}", which its entries do not have.`,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
visit(kids.componentId, of);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const tabs = props.tabs;
|
|
271
|
+
if (Array.isArray(tabs)) {
|
|
272
|
+
for (const tab of tabs) {
|
|
273
|
+
const child = tab?.child;
|
|
274
|
+
if (typeof child === "string") {
|
|
275
|
+
visit(child, entry);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (c.component === "Link" && typeof props.view === "string" && opened !== undefined) {
|
|
280
|
+
visit(props.view, opened);
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
if (byId.has("root")) {
|
|
284
|
+
visit("root", undefined);
|
|
285
|
+
}
|
|
286
|
+
return issues;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* What can be wrong with a surface: an unknown or missing component, no root, a child that is
|
|
290
|
+
* not there, an id twice, a loop, a prop missing, and — given the data keys a run will provide,
|
|
291
|
+
* or the step's schema — a path into data nothing provides.
|
|
292
|
+
*/
|
|
293
|
+
export function validateSurface(raw, data) {
|
|
294
|
+
const dataKeys = Array.isArray(data) ? data : undefined;
|
|
295
|
+
const parsed = surfaceComponentsSchema.safeParse(raw);
|
|
296
|
+
if (!parsed.success) {
|
|
297
|
+
return parsed.error.issues.map((i) => ({ message: `${i.path.join(".")}: ${i.message}` }));
|
|
298
|
+
}
|
|
299
|
+
const components = parsed.data;
|
|
300
|
+
const issues = [];
|
|
301
|
+
const byId = new Map();
|
|
302
|
+
for (const c of components) {
|
|
303
|
+
if (byId.has(c.id)) {
|
|
304
|
+
issues.push({ message: `Duplicate component id "${c.id}".` });
|
|
305
|
+
}
|
|
306
|
+
byId.set(c.id, c);
|
|
307
|
+
}
|
|
308
|
+
if (!byId.has("root")) {
|
|
309
|
+
issues.push({ message: 'A surface has a component with id "root".' });
|
|
310
|
+
}
|
|
311
|
+
for (const c of components) {
|
|
312
|
+
for (const prop of REQUIRED[c.component] ?? []) {
|
|
313
|
+
if (c[prop] === undefined) {
|
|
314
|
+
issues.push({ message: `${c.component} "${c.id}" needs "${prop}".` });
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
const action = c.action;
|
|
318
|
+
if (action !== undefined && !SURFACE_ACTIONS.includes(action)) {
|
|
319
|
+
issues.push({
|
|
320
|
+
message: `"${c.id}": action is one of ${SURFACE_ACTIONS.join(", ")}.`,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
const children = c.children;
|
|
324
|
+
if (children && !CONTAINERS.has(c.component) && c.component !== "Table") {
|
|
325
|
+
issues.push({ message: `${c.component} "${c.id}" holds no children.` });
|
|
326
|
+
}
|
|
327
|
+
if (c.component === "Group" && (!children || Array.isArray(children))) {
|
|
328
|
+
issues.push({
|
|
329
|
+
message: `Group "${c.id}" repeats over a list: children { "path", "componentId" }.`,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
const tabs = c.tabs;
|
|
333
|
+
if (c.component === "Tabs" && !(Array.isArray(tabs) && tabs.length >= 2)) {
|
|
334
|
+
issues.push({ message: `Tabs "${c.id}" needs at least two tabs: [{ label, child }].` });
|
|
335
|
+
}
|
|
336
|
+
const view = c.view;
|
|
337
|
+
const ids = [...childIds(c), ...(typeof view === "string" ? [view] : [])];
|
|
338
|
+
for (const child of ids) {
|
|
339
|
+
if (!byId.has(child)) {
|
|
340
|
+
issues.push({ message: `"${c.id}" names a child "${child}" that is not there.` });
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if (dataKeys) {
|
|
344
|
+
for (const path of pathsOf(c)) {
|
|
345
|
+
const key = path.startsWith("/") ? path.split("/")[1] : null;
|
|
346
|
+
if (key !== null && !dataKeys.includes(key)) {
|
|
347
|
+
issues.push({ message: `"${c.id}" reads "${path}", which no data provides.` });
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
// A child that holds its parent would draw forever.
|
|
353
|
+
const seen = new Set();
|
|
354
|
+
const loops = (cid, stack) => {
|
|
355
|
+
if (stack.has(cid)) {
|
|
356
|
+
return true;
|
|
357
|
+
}
|
|
358
|
+
if (seen.has(cid)) {
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
seen.add(cid);
|
|
362
|
+
const c = byId.get(cid);
|
|
363
|
+
const kids = c ? childIds(c) : [];
|
|
364
|
+
const next = new Set(stack).add(cid);
|
|
365
|
+
return kids.some((k) => loops(k, next));
|
|
366
|
+
};
|
|
367
|
+
if (byId.has("root") && loops("root", new Set())) {
|
|
368
|
+
issues.push({ message: "Components hold each other in a loop." });
|
|
369
|
+
return issues;
|
|
370
|
+
}
|
|
371
|
+
return data && !Array.isArray(data) ? [...issues, ...shapeIssues(byId, data)] : issues;
|
|
372
|
+
}
|
|
373
|
+
/** A JSON pointer into data: "/suppliers/0/name". */
|
|
374
|
+
export function pointer(data, path) {
|
|
375
|
+
let at = data;
|
|
376
|
+
for (const part of path.split("/").slice(1)) {
|
|
377
|
+
if (at === null || typeof at !== "object") {
|
|
378
|
+
return undefined;
|
|
379
|
+
}
|
|
380
|
+
at = at[part.replace(/~1/g, "/").replace(/~0/g, "~")];
|
|
381
|
+
}
|
|
382
|
+
return at;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* A prop's value: a literal as it is, a path read from the data — or, without a leading slash,
|
|
386
|
+
* from the row a List or Table repeats over.
|
|
387
|
+
*/
|
|
388
|
+
export function bound(value, data, row) {
|
|
389
|
+
if (!isPath(value)) {
|
|
390
|
+
return value;
|
|
391
|
+
}
|
|
392
|
+
const raw = value.path.startsWith("/")
|
|
393
|
+
? pointer(data, value.path)
|
|
394
|
+
: row === undefined
|
|
395
|
+
? undefined
|
|
396
|
+
: pointer(row, `/${value.path.replace(/\./g, "/")}`);
|
|
397
|
+
return worded(raw, value);
|
|
398
|
+
}
|
|
399
|
+
/** A value turned into words as its path says: looked up in `map`, set into `format`. */
|
|
400
|
+
export function worded(raw, spec) {
|
|
401
|
+
let v = raw;
|
|
402
|
+
const map = spec.map;
|
|
403
|
+
if (map && typeof map === "object" && !Array.isArray(map)) {
|
|
404
|
+
const key = String(v);
|
|
405
|
+
if (Object.hasOwn(map, key)) {
|
|
406
|
+
v = map[key];
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (typeof spec.format === "string" && v !== undefined && v !== null && v !== "") {
|
|
410
|
+
v = spec.format.replace("{}", Array.isArray(v) ? v.join(", ") : String(v));
|
|
411
|
+
}
|
|
412
|
+
return v;
|
|
413
|
+
}
|
|
414
|
+
/** What a model needs to compose a surface: the catalog, briefly. */
|
|
415
|
+
export const SURFACE_GUIDE = `A surface is a flat JSON array of components; the one with id "root" is drawn. Containers list their children by id.
|
|
416
|
+
Components and props (a prop may be a literal or {"path": "/key/..."} into the data):
|
|
417
|
+
- Column { children: [ids] } — vertical stack (use for root); Column and Grid may also repeat one component per entry: children {"path", "componentId"}
|
|
418
|
+
- Text { text, variant?: "h3"|"h4"|"lead"|"body"|"muted" } — "lead": the one opening line in the wizard's voice
|
|
419
|
+
- List { children: {"path": "/rows", "componentId": "<a Row id>"} } — one Row per array entry; inside, paths without "/" read the entry ("name")
|
|
420
|
+
- Row { title, subtitle?, meta?, badge?, image? }
|
|
421
|
+
- DetailGrid { rows: [{ label, value }] } — label/value facts
|
|
422
|
+
- Badge { label, tone?: "default"|"success"|"warning"|"accent" }
|
|
423
|
+
- Grid { children: [ids], columns?: 2|3|4, min?: rem } — tiles side by side; min: the narrowest a tile gets (14 for cards, so a phone shows one)
|
|
424
|
+
- Metric { label, value, caption? } — a key figure
|
|
425
|
+
- Table { rows: {"path": "/rows"}, columns?: [{ key, label }] }
|
|
426
|
+
- Image { src: an asset id or {"path": ...}, alt? }
|
|
427
|
+
- BarChart / LineChart { title?, points: [{ label, value }] or {"path": ...}, labelKey?, valueKey? }
|
|
428
|
+
- DonutChart { title?, slices: [{ label, value }] or {"path": ...}, labelKey?, valueKey? }
|
|
429
|
+
(labelKey / valueKey: the columns of bound rows that hold the label and the number, e.g. "name", "price")
|
|
430
|
+
- Actions { children: [Button ids] } / Button { label, action: "regenerate"|"open" }
|
|
431
|
+
- Tabs { tabs: [{ label, count?, child: id }] } — two to four views of one result; count may bind a list (shows its length)
|
|
432
|
+
- Card { title, eyebrow?, subtitle?, meta?: [values], image?, children?: [ids] } — one thing: a day, a recipe, an offer
|
|
433
|
+
- Fold { title, open?, children: [ids] } — details that open on a tap
|
|
434
|
+
- Group { children: {"path", "componentId"}, by: "<key>", order?: [values] } — entries under a heading per value of a key
|
|
435
|
+
- Chips { items, labelKey?, flagKey?, flag? } — short things at a glance; flagKey marks some ("bald")
|
|
436
|
+
- Checklist { items, labelKey?, detailKey?, noteKey?, noteFormat?, noteMap?, groupKey?, groupOrder?, share? } — things to get or do; ticks are kept; a yes/no note needs noteMap: {"true": "da", "false": "einkaufen"}
|
|
437
|
+
- Steps { items, textKey?, minutesKey? } — ordered work, numbered, with times
|
|
438
|
+
- Link { title, subtitle?, eyebrow?, meta?, look?: "row"|"card", items: {"path": "/recipes"}, key?: "id", value: {"path": "recipe_id"}, view: id } — opens the entry of items whose key is value in a sheet, drawn by view; title, subtitle and meta read that entry, eyebrow the row the Link sits in
|
|
439
|
+
- Callout { text, title?, tone?: "tip"|"note"|"warning" }
|
|
440
|
+
A path may put its value into words: {"path": "in_fridge", "map": {"true": "da", "false": "einkaufen"}}, {"path": "minutes", "format": "{} Min"}.
|
|
441
|
+
Design it like an app, not a report: lead with a headline, the key figure or the chips; one Card per thing, never a Table of things; ordered work is Steps, things to get are a Checklist, sets are grouped by their key. A Table only for figures people compare across columns.
|
|
442
|
+
Keep it small: what the person needs to see first, then the details. Never invent numbers: bind them by path.`;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type Lang } from "./definition.js";
|
|
2
|
+
/**
|
|
3
|
+
* A line with a form for each plural category of its `{count}` (or `{n}`, `Intl.PluralRules`):
|
|
4
|
+
* "one" and "other" in English and German, more in languages that need them.
|
|
5
|
+
*/
|
|
6
|
+
export interface Plural {
|
|
7
|
+
zero?: string;
|
|
8
|
+
one?: string;
|
|
9
|
+
two?: string;
|
|
10
|
+
few?: string;
|
|
11
|
+
many?: string;
|
|
12
|
+
other: string;
|
|
13
|
+
}
|
|
14
|
+
/** A line of a string table: plain, or with plural forms. */
|
|
15
|
+
export type Line = string | Plural;
|
|
16
|
+
/**
|
|
17
|
+
* A string table: each language's lines by key. English has every line; another language may
|
|
18
|
+
* lack some, and those are said in English. A new language needs only its own table.
|
|
19
|
+
*/
|
|
20
|
+
export type Texts<K extends string> = {
|
|
21
|
+
en: Record<K, Line>;
|
|
22
|
+
} & {
|
|
23
|
+
[L in Exclude<Lang, "en">]: Partial<Record<K, Line>>;
|
|
24
|
+
};
|
|
25
|
+
/** What fills a line's gaps: words, a number (written the language's way), or a list of them. */
|
|
26
|
+
export type Gap = string | number | readonly Gap[];
|
|
27
|
+
/** The plural rules of a language: any language, by its code. */
|
|
28
|
+
export declare function pluralRules(lang: string): Intl.PluralRules;
|
|
29
|
+
/** A gap's words in a language: numbers as the language writes them, lists joined. */
|
|
30
|
+
export declare function gapText(value: Gap, lang: string): string;
|
|
31
|
+
/** Fills `{name}` gaps; a gap with nothing for it stays as it is. */
|
|
32
|
+
export declare function fillGaps(text: string, lang: string, params?: Record<string, Gap | undefined>): string;
|
|
33
|
+
/**
|
|
34
|
+
* A line of a table in a language, its gaps filled and its plural form picked by `{count}`
|
|
35
|
+
* (or `{n}`);
|
|
36
|
+
* the English line where the language lacks one.
|
|
37
|
+
*/
|
|
38
|
+
export declare function textOf<K extends string>(texts: Texts<K>, key: K, lang: Lang, params?: Record<string, Gap | undefined>): string;
|
|
39
|
+
/**
|
|
40
|
+
* A string table of one language outside `LANGS`, translated on request: lines by key, a plural
|
|
41
|
+
* line with the forms of that language's plural categories.
|
|
42
|
+
*/
|
|
43
|
+
export type TextTable = Record<string, Line>;
|
|
44
|
+
/** A line of a table, in a language: its gaps filled and its plural form picked. */
|
|
45
|
+
export declare function lineText(line: Line, lang: string, params?: Record<string, Gap | undefined>): string;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// SPDX-License-Identifier: FSL-1.1-MIT OR MIT
|
|
2
|
+
import { localeOf } from "./definition.js";
|
|
3
|
+
const plurals = new Map();
|
|
4
|
+
/** The plural rules of a language: any language, by its code. */
|
|
5
|
+
export function pluralRules(lang) {
|
|
6
|
+
let rules = plurals.get(lang);
|
|
7
|
+
if (!rules) {
|
|
8
|
+
rules = new Intl.PluralRules(localeOf(lang));
|
|
9
|
+
plurals.set(lang, rules);
|
|
10
|
+
}
|
|
11
|
+
return rules;
|
|
12
|
+
}
|
|
13
|
+
function form(line, lang, count) {
|
|
14
|
+
if (typeof line === "string") {
|
|
15
|
+
return line;
|
|
16
|
+
}
|
|
17
|
+
if (typeof count !== "number") {
|
|
18
|
+
return line.other;
|
|
19
|
+
}
|
|
20
|
+
return line[pluralRules(lang).select(count)] ?? line.other;
|
|
21
|
+
}
|
|
22
|
+
/** A gap's words in a language: numbers as the language writes them, lists joined. */
|
|
23
|
+
export function gapText(value, lang) {
|
|
24
|
+
if (typeof value === "number") {
|
|
25
|
+
return value.toLocaleString(localeOf(lang));
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(value)) {
|
|
28
|
+
return value.map((item) => gapText(item, lang)).join(", ");
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
/** Fills `{name}` gaps; a gap with nothing for it stays as it is. */
|
|
33
|
+
export function fillGaps(text, lang, params) {
|
|
34
|
+
return text.replace(/\{(\w+)\}/g, (gap, key) => {
|
|
35
|
+
const value = params?.[key];
|
|
36
|
+
return value === undefined ? gap : gapText(value, lang);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* A line of a table in a language, its gaps filled and its plural form picked by `{count}`
|
|
41
|
+
* (or `{n}`);
|
|
42
|
+
* the English line where the language lacks one.
|
|
43
|
+
*/
|
|
44
|
+
export function textOf(texts, key, lang, params) {
|
|
45
|
+
const line = texts[lang][key] ?? texts.en[key];
|
|
46
|
+
if (line === undefined) {
|
|
47
|
+
return key;
|
|
48
|
+
}
|
|
49
|
+
return fillGaps(form(line, lang, params?.count ?? params?.n), lang, params);
|
|
50
|
+
}
|
|
51
|
+
/** A line of a table, in a language: its gaps filled and its plural form picked. */
|
|
52
|
+
export function lineText(line, lang, params) {
|
|
53
|
+
return fillGaps(form(line, lang, params?.count ?? params?.n), lang, params);
|
|
54
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { WizardDefinition } from "./definition.js";
|
|
2
|
+
/** The texts of a definition the person reads, each once, in the order they appear. */
|
|
3
|
+
export declare function wizardTexts(def: WizardDefinition): string[];
|
|
4
|
+
/** Whether a translated text keeps every placeholder and gap of its original, no more, no fewer. */
|
|
5
|
+
export declare function keepsPlaceholders(original: string, translated: string): boolean;
|
|
6
|
+
/** A translation as it is kept: each original text with its translation and who wrote it. */
|
|
7
|
+
export interface TranslationEntry {
|
|
8
|
+
text: string;
|
|
9
|
+
by: "machine" | "author";
|
|
10
|
+
}
|
|
11
|
+
export type TranslationMemory = Record<string, TranslationEntry>;
|
|
12
|
+
/** The texts of a definition a translation does not have yet. */
|
|
13
|
+
export declare function missingTexts(def: WizardDefinition, memory: TranslationMemory): string[];
|
|
14
|
+
/**
|
|
15
|
+
* The definition in the viewer's language: a copy with every text the memory has written in,
|
|
16
|
+
* and the labels of the choices beside it (`labels[value]`), the values untouched.
|
|
17
|
+
*/
|
|
18
|
+
export declare function translateDefinition(def: WizardDefinition, memory: TranslationMemory): {
|
|
19
|
+
def: WizardDefinition;
|
|
20
|
+
labels: Record<string, string>;
|
|
21
|
+
};
|
|
22
|
+
/** Whether every text of the memory came from the author, or some from a model. */
|
|
23
|
+
export declare function machineTranslated(memory: TranslationMemory, def: WizardDefinition): boolean;
|