@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,196 @@
|
|
|
1
|
+
import { arch, hostname, platform } from "node:os";
|
|
2
|
+
import { desc, eq } from "drizzle-orm";
|
|
3
|
+
import { accountToken, linkedAccount } from "./auth/account.js";
|
|
4
|
+
import { packageVersion } from "./cli/home.js";
|
|
5
|
+
import { db, knownTenants, schema, withTenant } from "./db/client.js";
|
|
6
|
+
import { env } from "./env.js";
|
|
7
|
+
import { logState, startedAt, tail } from "./log.js";
|
|
8
|
+
import { managed } from "./manage.js";
|
|
9
|
+
import { modelSettings } from "./models.js";
|
|
10
|
+
import { loadedPlugins } from "./plugins/registry.js";
|
|
11
|
+
import { runIndexOf, tenantOfRun } from "./tenants/control.js";
|
|
12
|
+
import { LOCAL_TENANT } from "./tenants/tenant.js";
|
|
13
|
+
/**
|
|
14
|
+
* What an installation tells about itself when someone looks at it from afar
|
|
15
|
+
* (docs/plans/remote-debug.md): its status, the lines it printed, one run, a tenant's models.
|
|
16
|
+
* Nothing here holds a key or a person's answers; the log ring took the secrets out already.
|
|
17
|
+
* The Manage-App asks a runtime of its own over `/api/internal/debug/*`; a runtime that runs
|
|
18
|
+
* alone answers the command line over `/api/local/debug/*` and sends a report to its account.
|
|
19
|
+
*/
|
|
20
|
+
/** This process, as every installation names itself. */
|
|
21
|
+
export function processStatus() {
|
|
22
|
+
const memory = process.memoryUsage();
|
|
23
|
+
return {
|
|
24
|
+
pid: process.pid,
|
|
25
|
+
node: process.version,
|
|
26
|
+
platform: `${platform()} ${arch()}`,
|
|
27
|
+
hostname: hostname(),
|
|
28
|
+
startedAt: new Date(startedAt).toISOString(),
|
|
29
|
+
uptimeSeconds: Math.round((Date.now() - startedAt) / 1000),
|
|
30
|
+
memoryMb: Math.round(memory.rss / 1_048_576),
|
|
31
|
+
log: logState(),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export async function status() {
|
|
35
|
+
const tenants = await knownTenants().catch(() => []);
|
|
36
|
+
return {
|
|
37
|
+
app: "engenty-wizards-runtime",
|
|
38
|
+
version: packageVersion(),
|
|
39
|
+
process: processStatus(),
|
|
40
|
+
managed,
|
|
41
|
+
appUrl: env.appUrl,
|
|
42
|
+
manageUrl: env.manage.url || null,
|
|
43
|
+
gatewayUrl: (managed ? env.manage.gatewayUrl : env.local.gatewayUrl) || null,
|
|
44
|
+
sandbox: env.sandbox,
|
|
45
|
+
browser: env.browserCdpUrl ? "cdp" : "local",
|
|
46
|
+
files: env.s3.bucket ? "s3" : "data folder",
|
|
47
|
+
database: env.databaseUrl ? "libsql" : "file",
|
|
48
|
+
tenantDatabases: env.tenantDbUrlTemplate ? "libsql" : "files",
|
|
49
|
+
tenants: tenants.length,
|
|
50
|
+
plugins: loadedPlugins().map((p) => ({
|
|
51
|
+
id: p.source.id,
|
|
52
|
+
version: p.source.manifest.version ?? null,
|
|
53
|
+
})),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const from = () => hostname();
|
|
57
|
+
/** The lines this process printed. */
|
|
58
|
+
export function logs(query) {
|
|
59
|
+
const own = from();
|
|
60
|
+
return {
|
|
61
|
+
sources: [{ from: own, ok: true }],
|
|
62
|
+
lines: tail(query).map((line) => ({ ...line, from: own })),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** One run, whichever tenant it belongs to: its state, its error, what the line knows, its last events. */
|
|
66
|
+
export async function runDetail(runId) {
|
|
67
|
+
if (!/^[A-Za-z0-9_-]{1,64}$/.test(runId)) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
const tenantId = await tenantOfRun(runId);
|
|
71
|
+
if (!tenantId) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return withTenant(tenantId, async () => {
|
|
75
|
+
const run = await db.query.run.findFirst({
|
|
76
|
+
where: eq(schema.run.id, runId),
|
|
77
|
+
columns: {
|
|
78
|
+
id: true,
|
|
79
|
+
wizardId: true,
|
|
80
|
+
version: true,
|
|
81
|
+
mode: true,
|
|
82
|
+
status: true,
|
|
83
|
+
cursor: true,
|
|
84
|
+
error: true,
|
|
85
|
+
ask: true,
|
|
86
|
+
unattended: true,
|
|
87
|
+
costMicros: true,
|
|
88
|
+
userId: true,
|
|
89
|
+
createdAt: true,
|
|
90
|
+
updatedAt: true,
|
|
91
|
+
expiresAt: true,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
if (!run) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
const [wizard, events, line] = await Promise.all([
|
|
98
|
+
db.query.wizard.findFirst({
|
|
99
|
+
where: eq(schema.wizard.id, run.wizardId),
|
|
100
|
+
columns: { title: true, publishedVersion: true },
|
|
101
|
+
}),
|
|
102
|
+
db
|
|
103
|
+
.select({
|
|
104
|
+
id: schema.runEvent.id,
|
|
105
|
+
stepId: schema.runEvent.stepId,
|
|
106
|
+
type: schema.runEvent.type,
|
|
107
|
+
message: schema.runEvent.message,
|
|
108
|
+
createdAt: schema.runEvent.createdAt,
|
|
109
|
+
})
|
|
110
|
+
.from(schema.runEvent)
|
|
111
|
+
.where(eq(schema.runEvent.runId, runId))
|
|
112
|
+
.orderBy(desc(schema.runEvent.id))
|
|
113
|
+
.limit(60),
|
|
114
|
+
runIndexOf(runId),
|
|
115
|
+
]);
|
|
116
|
+
return {
|
|
117
|
+
tenantId,
|
|
118
|
+
run: {
|
|
119
|
+
...run,
|
|
120
|
+
ask: run.ask ? { id: run.ask.id, kind: run.ask.kind } : null,
|
|
121
|
+
costCredits: Math.round(run.costMicros / 10_000) / 100,
|
|
122
|
+
},
|
|
123
|
+
wizard: wizard ? { id: run.wizardId, ...wizard } : null,
|
|
124
|
+
line,
|
|
125
|
+
events: events.reverse(),
|
|
126
|
+
};
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/** Where each class of a tenant runs, as its settings page shows it; never a key. */
|
|
130
|
+
export async function tenantModels(tenantId) {
|
|
131
|
+
if (!/^[A-Za-z0-9_-]{1,64}$/.test(tenantId)) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
const known = await knownTenants();
|
|
135
|
+
if (!known.includes(tenantId)) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
return withTenant(tenantId, async () => {
|
|
139
|
+
const settings = await modelSettings();
|
|
140
|
+
return {
|
|
141
|
+
tenantId,
|
|
142
|
+
source: settings.source,
|
|
143
|
+
bindings: settings.bindings,
|
|
144
|
+
creditFallback: settings.creditFallback,
|
|
145
|
+
keys: settings.keys,
|
|
146
|
+
ways: settings.ways,
|
|
147
|
+
};
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
export class ReportError extends Error {
|
|
151
|
+
code;
|
|
152
|
+
constructor(code, message) {
|
|
153
|
+
super(message);
|
|
154
|
+
this.code = code;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* A runtime that runs alone sends its account what a look from afar needs: its status, its
|
|
159
|
+
* model settings (never a key) and the last lines it printed. The person asks for it
|
|
160
|
+
* (`wizards report`); nothing goes by itself.
|
|
161
|
+
*/
|
|
162
|
+
export async function sendReport() {
|
|
163
|
+
const account = await linkedAccount();
|
|
164
|
+
const token = account ? await accountToken() : null;
|
|
165
|
+
if (!account || !token) {
|
|
166
|
+
throw new ReportError("no_account", "This install is linked to no account.");
|
|
167
|
+
}
|
|
168
|
+
const [state, models] = await Promise.all([status(), withTenant(LOCAL_TENANT, modelSettings)]);
|
|
169
|
+
const body = {
|
|
170
|
+
kind: "install",
|
|
171
|
+
version: state.version,
|
|
172
|
+
status: state,
|
|
173
|
+
models: {
|
|
174
|
+
source: models.source,
|
|
175
|
+
bindings: models.bindings,
|
|
176
|
+
creditFallback: models.creditFallback,
|
|
177
|
+
keys: models.keys,
|
|
178
|
+
ways: models.ways,
|
|
179
|
+
},
|
|
180
|
+
logs: tail({ limit: 500 }),
|
|
181
|
+
};
|
|
182
|
+
const res = await fetch(`${env.local.accountUrl}/v1/diagnostics`, {
|
|
183
|
+
method: "POST",
|
|
184
|
+
headers: { authorization: `Bearer ${token}`, "content-type": "application/json" },
|
|
185
|
+
body: JSON.stringify(body),
|
|
186
|
+
signal: AbortSignal.timeout(20_000),
|
|
187
|
+
}).catch((err) => {
|
|
188
|
+
throw new ReportError("not_sent", `The account did not answer: ${err.message}`);
|
|
189
|
+
});
|
|
190
|
+
if (!res.ok) {
|
|
191
|
+
const text = await res.text().catch(() => "");
|
|
192
|
+
throw new ReportError("not_sent", `The account answered ${res.status}: ${text.slice(0, 200)}`);
|
|
193
|
+
}
|
|
194
|
+
const { id } = (await res.json());
|
|
195
|
+
return { id, to: env.local.accountUrl };
|
|
196
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Developer
|
|
3
|
+
description: Extend engenty wizards with plugins – tools for AI steps, routes with their own tables, pages in the studio.
|
|
4
|
+
version: 0.5.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You extend engenty wizards with **plugins**. A plugin adds to a runtime without changing its
|
|
8
|
+
code, and the runtime loads it from its files while it runs.
|
|
9
|
+
|
|
10
|
+
## Start here
|
|
11
|
+
|
|
12
|
+
| | |
|
|
13
|
+
|---|---|
|
|
14
|
+
| [What a plugin is](./plugins/index.md) | The two halves, what each can add and what a plugin may touch |
|
|
15
|
+
| [Quick start](./plugins/quick-start.md) | A tool for AI steps in one file that works in two minutes |
|
|
16
|
+
| [Reference](./plugins/reference.md) | Every call, type, address and setting |
|
|
17
|
+
| [Examples](./plugins/examples.md) | Two plugins to read and copy |
|
|
18
|
+
|
|
19
|
+
## Wizards as files
|
|
20
|
+
|
|
21
|
+
A wizard is JSON, and it travels as a `.wizard` file. [The wizard format](./wizard-format.md)
|
|
22
|
+
describes the format, the JSON Schema for your editor and `wizards validate`.
|
|
23
|
+
|
|
24
|
+
## What you need
|
|
25
|
+
|
|
26
|
+
- engenty wizards on your computer, or a checkout of
|
|
27
|
+
[engenty/wizards](https://github.com/engenty/wizards).
|
|
28
|
+
- TypeScript. The runtime reads a plugin’s server half as TypeScript, without a build.
|
|
29
|
+
- A checkout, if your plugin draws in the studio: you build its studio half with the studio’s
|
|
30
|
+
own tools.
|
|
31
|
+
|
|
32
|
+
## Working on engenty wizards itself
|
|
33
|
+
|
|
34
|
+
These pages are about extending engenty wizards. The documents about its own code are in the
|
|
35
|
+
repository:
|
|
36
|
+
|
|
37
|
+
| | |
|
|
38
|
+
|---|---|
|
|
39
|
+
| [docs/development.md](https://github.com/engenty/wizards/blob/main/docs/development.md) | How to run it from source, the checks, how it is built and how it is released |
|
|
40
|
+
| [docs/marketplace-contract.md](https://github.com/engenty/wizards/blob/main/docs/marketplace-contract.md) | What a runtime and the marketplace say to each other |
|
|
41
|
+
| [docs/copy-style.md](https://github.com/engenty/wizards/blob/main/docs/copy-style.md) | How the app talks to people: the voice, the glossary and the rules for every string |
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Accounts
|
|
3
|
+
description: Accounts a plugin connects for a space, such as a calendar or a mailbox, through the runtime's built-in connectors.
|
|
4
|
+
version: 0.5.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
A wizard’s connections belong to the person who runs it. A plugin that works for the whole
|
|
8
|
+
space, such as a calendar that every booking wizard reads, connects an account of its own with
|
|
9
|
+
`server.connections`. It uses the runtime’s built-in connectors (Google, Microsoft, Slack,
|
|
10
|
+
GitHub, HubSpot, S3 …). The runtime keeps the tokens and keys sealed in the tenant’s database and
|
|
11
|
+
refreshes the tokens.
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
const ACTIONS = ["list_events", "create_event", "delete_event"];
|
|
15
|
+
|
|
16
|
+
// Which of them can be signed in to on this runtime now.
|
|
17
|
+
const offered = await server.connections.available(["google-calendar", "microsoft-outlook"]);
|
|
18
|
+
|
|
19
|
+
// The provider's sign-in page, for a route of the plugin to hand to its studio half.
|
|
20
|
+
const { url } = await server.connections.start({ space, connector: "google-calendar", actions: ACTIONS });
|
|
21
|
+
|
|
22
|
+
// Later, in a route, a tool or a job:
|
|
23
|
+
const [account] = await server.connections.list(space);
|
|
24
|
+
const { events } = await server.connections.call<{ events: unknown[] }>(account.id, "list_events", {
|
|
25
|
+
time_min: from,
|
|
26
|
+
time_max: to,
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
| `server.connections.` | Does |
|
|
31
|
+
|---|---|
|
|
32
|
+
| `available(ids)` | Returns the connectors of these ids that a person can connect here now: `{ id, name, auth }`, and for `auth: "api_key"` the `fields` to ask for (`key`, `label`, `placeholder`, `required`, `secret`). An OAuth connector is offered once its client is set up (`GOOGLE_OAUTH_CLIENT_ID` …) or when it registers a client itself. On a local install Google is also offered through the linked engenty account. A connector that takes keys (HubSpot, S3) is always offered |
|
|
33
|
+
| `start({ space, connector, actions, lang? })` | Returns the provider’s sign-in page of an OAuth connector. The provider asks only for the rights that `actions` need. `lang` (`"en"` or `"de"`) is the language of the page the person comes back to; without it, the page follows their browser |
|
|
34
|
+
| `connect({ space, connector, actions, credentials })` | Connects a connector that takes keys. `credentials` holds the keys by field key. The runtime tries them once at the provider and then keeps them sealed. Keys the provider refuses throw an error with the status `400` and the code `credentials`, whose message says what was wrong. Returns the connection |
|
|
35
|
+
| `list(space)`, `get(id)` | Return what is connected: `{ id, space, connector, label, actions, createdAt }`, the newest first. `label` is the account as the provider names it, often an email address |
|
|
36
|
+
| `call(id, action, input)` | Runs one of the connector’s actions with the account. When the token has run out, the runtime fetches a fresh one first |
|
|
37
|
+
| `remove(id)` | Forgets the connection and its tokens |
|
|
38
|
+
|
|
39
|
+
## Signing in
|
|
40
|
+
|
|
41
|
+
`start` returns an address. Open it in a window from the studio half. The provider sends the
|
|
42
|
+
person back to the runtime (`/api/connect/callback`, the address a wizard’s connections use too).
|
|
43
|
+
The runtime keeps the account under the plugin and the space. The window then posts
|
|
44
|
+
`{ type: "wizards:connected", ok }` to the studio and closes:
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
const { url } = await studio.api.post<{ url: string }>(`/connect?space=${space.id}`);
|
|
48
|
+
window.open(url, "connect", "width=520,height=700");
|
|
49
|
+
|
|
50
|
+
window.addEventListener("message", (event) => {
|
|
51
|
+
if (event.data?.type === "wizards:connected" && event.data.ok) {
|
|
52
|
+
refetch();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
- A second sign-in to the same account for the same space replaces the first one’s tokens and
|
|
58
|
+
actions. It does not add a second connection.
|
|
59
|
+
- A local install without a Google client of its own connects Google through the linked
|
|
60
|
+
engenty account. Without a linked account, `start` throws an error with the status `409` and
|
|
61
|
+
the code `account`, whose message says what to do.
|
|
62
|
+
|
|
63
|
+
## What `call` refuses
|
|
64
|
+
|
|
65
|
+
- An action the connection was not made for. Connect again with that action in `actions`.
|
|
66
|
+
- What the provider refuses. `call` throws the provider’s error, with the status and the first
|
|
67
|
+
words of its answer. If the person removed the connection at the provider, the next call
|
|
68
|
+
fails this way.
|
|
69
|
+
|
|
70
|
+
## Where it is kept
|
|
71
|
+
|
|
72
|
+
The connections are kept in the table `plugin_connection` of the tenant’s database, by plugin
|
|
73
|
+
and space. A plugin sees only its own connections. Deleting a space deletes them. Unloading or
|
|
74
|
+
removing the plugin leaves them in place.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Events
|
|
3
|
+
description: Do something when a run ends or a space changes – keep who it was, post a message, read a new document.
|
|
4
|
+
version: 0.5.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
A plugin can listen to runs that reach their end, and to spaces that change.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
// A real run ended: keep who it was.
|
|
11
|
+
server.on("run.done", async ({ run, wizard, values }) => {
|
|
12
|
+
const email = typeof values.email === "string" ? values.email.trim().toLowerCase() : "";
|
|
13
|
+
if (run.mode !== "live" || !email) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const seen = {
|
|
17
|
+
name: typeof values.name === "string" ? values.name : null,
|
|
18
|
+
wizard: wizard.title,
|
|
19
|
+
seenAt: new Date(),
|
|
20
|
+
};
|
|
21
|
+
await db()
|
|
22
|
+
.insert(person)
|
|
23
|
+
.values({ email, ...seen })
|
|
24
|
+
.onConflictDoUpdate({ target: person.email, set: seen });
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Events
|
|
29
|
+
|
|
30
|
+
| Event | A run |
|
|
31
|
+
|---|---|
|
|
32
|
+
| `run.done` | reached its result |
|
|
33
|
+
| `run.failed` | stopped with an error |
|
|
34
|
+
| `run.cancelled` | was cancelled |
|
|
35
|
+
|
|
36
|
+
| Event | A space | Gets |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `space.created` | was made here, or arrived from engenty wizards on someone’s computer | `{ space: { id } }` |
|
|
39
|
+
| `space.updated` | changed its name, its brand (Info & brand), its facts or its connected systems, or arrived again from a computer | `{ space: { id } }` |
|
|
40
|
+
| `space.deleted` | was deleted | `{ space: { id } }` |
|
|
41
|
+
| `space.file.ready` | has a file that was read: a document is in the index now | `{ space: { id }, file: { id, name, kind, mime } }` |
|
|
42
|
+
| `space.file.removed` | lost a file | `{ space: { id }, file: { id, name, kind, mime } }` |
|
|
43
|
+
|
|
44
|
+
`file.kind` is `"document"`, `"logo"`, `"asset"` or `"pattern"`.
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
// A document arrived: read it into the wiki.
|
|
48
|
+
server.on("space.file.ready", async ({ space, file }) => {
|
|
49
|
+
if (file.kind === "document") {
|
|
50
|
+
await queue(space.id, file.id);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Nothing waits for the space events: the request that changed the space answers before its
|
|
56
|
+
listeners are done.
|
|
57
|
+
|
|
58
|
+
## What a run listener gets
|
|
59
|
+
|
|
60
|
+
| | |
|
|
61
|
+
|---|---|
|
|
62
|
+
| `run.id`, `run.wizardId` | The run and its wizard |
|
|
63
|
+
| `run.mode` | `"live"`: a real run, over the wizard’s link or from an AI app. `"test"`: a test run |
|
|
64
|
+
| `run.status` | `"done"`, `"failed"` or `"cancelled"` |
|
|
65
|
+
| `wizard` | `{ id, title, projectId }` |
|
|
66
|
+
| `values` | What the person answered, by field id |
|
|
67
|
+
|
|
68
|
+
`values` holds the answers as the wizard asked for them. Which fields exist depends on the
|
|
69
|
+
wizard. A listener that wants an email address looks for a field with the id it expects and does
|
|
70
|
+
nothing when it is missing. Check the type of every value you use.
|
|
71
|
+
|
|
72
|
+
## Rules a listener runs under
|
|
73
|
+
|
|
74
|
+
- **It runs inside the run’s tenant.** `server.getTenantDb()` is that tenant’s database.
|
|
75
|
+
- **It runs after the run ended.** A listener cannot change the run or its result.
|
|
76
|
+
- **It cannot fail the run.** A listener that throws is logged with the plugin’s id.
|
|
77
|
+
- **It can be called twice.** A finished run that is redone and ends again fires the event
|
|
78
|
+
again. Write listeners so that a second call does no harm: update a row instead of adding one,
|
|
79
|
+
or remember the run’s id.
|
|
80
|
+
- **Nothing waits for it.** Give outside calls a time limit:
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
await fetch(url, { method: "POST", body, signal: AbortSignal.timeout(10_000) });
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Test runs
|
|
87
|
+
|
|
88
|
+
Test runs fire the same events with `run.mode === "test"`. A plugin that keeps data about real
|
|
89
|
+
people, or tells someone outside, leaves test runs out, as the example above does.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Examples
|
|
3
|
+
description: Two plugins in the repository to read, run and copy.
|
|
4
|
+
version: 0.5.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
The repository has two example plugins. Load them from a checkout with one line in `.env.local`:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
PLUGINS_DIR=examples/plugins
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## notify: one file
|
|
14
|
+
|
|
15
|
+
[examples/plugins/notify.ts](https://github.com/engenty/wizards/blob/main/examples/plugins/notify.ts)
|
|
16
|
+
posts a line to an address whenever a real run of a wizard reaches its end.
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import type { WizardsPluginFactory } from "@engenty/wizards/plugin";
|
|
20
|
+
|
|
21
|
+
const plugin: WizardsPluginFactory = (wizards) => {
|
|
22
|
+
const url = wizards.config.get("NOTIFY_URL");
|
|
23
|
+
if (!url) {
|
|
24
|
+
wizards.log.warn("NOTIFY_URL is not set: nothing will be sent.");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
wizards.server.on("run.done", async ({ run, wizard }) => {
|
|
28
|
+
if (run.mode !== "live") {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
await fetch(url, {
|
|
32
|
+
method: "POST",
|
|
33
|
+
headers: { "content-type": "application/json" },
|
|
34
|
+
body: JSON.stringify({ wizard: wizard.title, run: run.id }),
|
|
35
|
+
signal: AbortSignal.timeout(10_000),
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default plugin;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
| It shows | |
|
|
44
|
+
|---|---|
|
|
45
|
+
| A plugin of one file | Its id is the file’s name |
|
|
46
|
+
| A setting | `NOTIFY_URL` in the install’s `.env`, read at load time |
|
|
47
|
+
| A listener | Test runs left out, a time limit on the call |
|
|
48
|
+
|
|
49
|
+
## run-log: both halves
|
|
50
|
+
|
|
51
|
+
[examples/plugins/run-log](https://github.com/engenty/wizards/tree/main/examples/plugins/run-log)
|
|
52
|
+
keeps a line for every run that ended and shows them in the studio.
|
|
53
|
+
|
|
54
|
+
| File | Shows |
|
|
55
|
+
|---|---|
|
|
56
|
+
| `engenty.plugin.json` | A manifest |
|
|
57
|
+
| `migrations/0001_init.sql` | A table, `run_log_entry`, with an index |
|
|
58
|
+
| `migrations/0002_space.sql` | A column added later: the space of each line |
|
|
59
|
+
| `src/schema.ts` | The same table for Drizzle |
|
|
60
|
+
| `src/plugin.ts` | A listener on the three run events (`run.done`, `run.failed`, `run.cancelled`), two routes (one for admins only, one that filters by space) and a tool, `run-log.recent` |
|
|
61
|
+
| `ui/messages.ts` | Its texts in English and German |
|
|
62
|
+
| `ui/plugin.tsx` | A section of the space page under Results with the space’s last runs, a page with the whole log, and a settings section that empties the log |
|
|
63
|
+
| `package.json` | A workspace package whose `build` script builds the studio half |
|
|
64
|
+
|
|
65
|
+
Build its studio half once, or on every save:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
node scripts/build-plugin.mjs examples/plugins/run-log
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
node scripts/build-plugin.mjs examples/plugins/run-log --watch
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Then, in the studio:
|
|
76
|
+
|
|
77
|
+
1. Test a wizard to its end.
|
|
78
|
+
2. Open the space’s Results: choose “Results” under Space in the sidebar, or open the space’s
|
|
79
|
+
page with the house icon in the app bar and go to Results. “Runs” stands below the results
|
|
80
|
+
and shows the last five runs of the space’s wizards. Its last line, “All … runs”, opens the
|
|
81
|
+
page with the whole log.
|
|
82
|
+
3. Settings → Runs shows how many lines are kept, and “Delete all” deletes them.
|
|
83
|
+
4. An AI step can list the tool “Run log” and tell how the last runs ended.
|
|
84
|
+
|
|
85
|
+
## The plugin of these pages
|
|
86
|
+
|
|
87
|
+
The `contacts` plugin these pages build up, piece by piece:
|
|
88
|
+
|
|
89
|
+
| Piece | Page |
|
|
90
|
+
|---|---|
|
|
91
|
+
| The table `contacts_person` | [Tables](./tables.md) |
|
|
92
|
+
| The listener that keeps who ran a wizard | [Events](./events.md) |
|
|
93
|
+
| The routes that list and remove contacts | [Routes](./routes.md) |
|
|
94
|
+
| The tool `contacts.lookup` | [Tools](./tools.md) |
|
|
95
|
+
| The page and the settings section | [The studio half](./studio.md) |
|
|
96
|
+
|
|
97
|
+
## Tests to read
|
|
98
|
+
|
|
99
|
+
[apps/runtime/test/plugins.test.ts](https://github.com/engenty/wizards/blob/main/apps/runtime/test/plugins.test.ts)
|
|
100
|
+
writes small plugins into a folder and exercises them: finding, loading, a plugin that fails,
|
|
101
|
+
routes, tables per tenant, tools in a run, events and reloading.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Plugins
|
|
3
|
+
description: What a plugin is, what its two halves can add, and what it may touch.
|
|
4
|
+
version: 0.5.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
A plugin adds to a runtime without changing its code. The runtime finds plugins when it starts,
|
|
8
|
+
loads them from their files and loads a plugin again when its files change.
|
|
9
|
+
|
|
10
|
+
## What a plugin can add
|
|
11
|
+
|
|
12
|
+
| It adds | Where it shows | Page |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| A tool for AI steps | In a step’s tool list, in the assistant’s and the MCP authoring guide | [Tools](./tools.md) |
|
|
15
|
+
| A runner: a door a wizard runs through, with the run API that drives runs from it | In the share dialog’s channels, at `/w/<token>/<runner>`, on the wizard’s first page | [Runners](./runners.md) |
|
|
16
|
+
| A runner’s settings and setup in the share dialog | In the share dialog, behind its gear and behind “Set up” in the runner’s row | [Runners](./runners.md#the-runners-part-of-the-share-dialog) |
|
|
17
|
+
| A block and tools for every AI step of a space | In the steps’ instructions | [The space](./space.md) |
|
|
18
|
+
| Pages, tables and files of a space’s Knowledge, with their categories | In Knowledge, and in what `project_search` finds | [The space](./space.md#knowledge-a-plugin-writes) |
|
|
19
|
+
| Texts in a space’s search index | In what `project_search` finds | [The space](./space.md#the-search-index) |
|
|
20
|
+
| Tools of the studio’s assistant, and their cards | In the assistant’s chat, on every page. For now the assistant is off unless it is switched on | [The space](./space.md#tools-of-the-space-assistant) |
|
|
21
|
+
| Routes | Below `/api/studio/plugins/<id>`, for programs with a key below `/api/v1/plugins/<id>`; public ones below `/api/public/plugins/<id>`, one for every tenant below `/api/public/plugins/<id>/shared` | [Routes](./routes.md) |
|
|
22
|
+
| Tables | In every tenant’s database | [Tables](./tables.md) |
|
|
23
|
+
| A listener on runs that end and spaces that change | Nowhere: it works in the background | [Events](./events.md) |
|
|
24
|
+
| A job, again and again | Nowhere: it works in the background | [The server half](./server.md#jobs) |
|
|
25
|
+
| The team’s own number for texts and calls, on engenty.ai | Where the plugin’s runner and pages use it | [The server half](./server.md#numbers-of-the-manage-app) |
|
|
26
|
+
| An account of a space (a calendar, a mailbox), signed in through a built-in connector | Where the plugin’s own pages offer it | [Accounts](./connections.md) |
|
|
27
|
+
| A wizard as a template | First among the templates of a new wizard, and in the MCP `list_starters` | [Starters](./starters.md) |
|
|
28
|
+
| A page of the studio | Behind an icon in the app bar, or at its address | [The studio half](./studio.md) |
|
|
29
|
+
| A section of the settings | In the settings’ list | [The studio half](./studio.md) |
|
|
30
|
+
| A section of the space page | In one of its parts, below the part’s own sections | [The studio half](./studio.md#the-space) |
|
|
31
|
+
| A part of the space page | In the space’s menu, beside Info & brand, Knowledge, Data and Results | [The studio half](./studio.md#a-part-of-the-plugins-own) |
|
|
32
|
+
|
|
33
|
+
## Two halves
|
|
34
|
+
|
|
35
|
+
| | Server half | Studio half |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| File | `src/plugin.ts`, or the one file a small plugin is | `ui/plugin.tsx`, built to `dist/client.js` and `dist/client.css` |
|
|
38
|
+
| Runs in | The runtime | The studio, after sign-in |
|
|
39
|
+
| Loaded | As TypeScript, no build | As the built script |
|
|
40
|
+
| Types | `@engenty/wizards/plugin` | `@engenty/wizards/plugin/studio` |
|
|
41
|
+
| Adds | Tools, runners, routes, tables, listeners, jobs, starters, accounts, Knowledge, the space’s block, index and assistant tools | Pages, icons in the app bar, sections of the settings and of the space page, parts of the space page, a runner’s settings and setup in the share dialog, cards in the assistant’s chat |
|
|
42
|
+
|
|
43
|
+
A plugin has one half or both. The studio half talks to the server half over the plugin’s own
|
|
44
|
+
routes.
|
|
45
|
+
|
|
46
|
+
```mermaid
|
|
47
|
+
flowchart LR
|
|
48
|
+
page["Studio half, in the browser<br/>ui/plugin.tsx<br/>pages, app bar, settings"]
|
|
49
|
+
runner["The runtime's step runner"]
|
|
50
|
+
server["Server half, in the runtime<br/>src/plugin.ts<br/>tools, routes, listeners"]
|
|
51
|
+
db[("Tenant database<br/>the plugin's tables")]
|
|
52
|
+
page -- "the plugin's routes" --> server
|
|
53
|
+
runner -- "calls a tool, says a run ended" --> server
|
|
54
|
+
server --> db
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## What a plugin may touch
|
|
58
|
+
|
|
59
|
+
A plugin runs inside the runtime’s process with all of its rights. It can read every tenant’s
|
|
60
|
+
data, the install’s settings and the files of the computer it runs on. There is no sandbox and
|
|
61
|
+
no permission list.
|
|
62
|
+
|
|
63
|
+
- Install only code you know.
|
|
64
|
+
- A plugin for others says in its own description what it reads and where it sends it.
|
|
65
|
+
|
|
66
|
+
## Not the Claude Code plugin
|
|
67
|
+
|
|
68
|
+
The “Claude Code plugin” of engenty wizards is something else: it is what a runtime hands to
|
|
69
|
+
Claude Code (`plugin/` in the repository). These pages are about plugins of the runtime.
|
|
70
|
+
|
|
71
|
+
## Not there yet
|
|
72
|
+
|
|
73
|
+
- A plugin can’t bring connectors of its own, or tools for MCP clients and AI apps. It connects
|
|
74
|
+
accounts through the built-in connectors: [Accounts](./connections.md).
|
|
75
|
+
- A plugin can’t add new kinds of steps or fields: the public pages of a wizard load no plugin.
|
|
76
|
+
A plugin’s runner is served whole at its own sub-path; nothing is loaded into the page or the
|
|
77
|
+
chat.
|
|
78
|
+
- You can’t build a studio half without a checkout of the repository.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Files and manifest
|
|
3
|
+
description: Where the runtime looks for plugins, what counts as one, and what engenty.plugin.json says.
|
|
4
|
+
version: 0.5.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Where the runtime looks
|
|
8
|
+
|
|
9
|
+
| Folder | What is in it |
|
|
10
|
+
|---|---|
|
|
11
|
+
| `modules/` of the runtime | Plugins that ship with engenty wizards |
|
|
12
|
+
| Each folder of `PLUGINS_DIR` (comma-separated) | Plugins of this install |
|
|
13
|
+
|
|
14
|
+
- An installed app looks in `~/.engenty/wizards/plugins` unless its `.env` names another folder.
|
|
15
|
+
- In a checkout `PLUGINS_DIR` is empty. `PLUGINS_DIR=examples/plugins` in `.env.local` loads
|
|
16
|
+
the examples.
|
|
17
|
+
- A runtime that watches its plugins creates a folder of `PLUGINS_DIR` that is missing.
|
|
18
|
+
|
|
19
|
+
## What counts as a plugin
|
|
20
|
+
|
|
21
|
+
In such a folder:
|
|
22
|
+
|
|
23
|
+
| Entry | Is |
|
|
24
|
+
|---|---|
|
|
25
|
+
| `notify.ts`, `notify.js` | A plugin of one file. Its id is the file’s name |
|
|
26
|
+
| `contacts/engenty.plugin.json` | A plugin with a manifest |
|
|
27
|
+
| `hello/index.ts`, `hello/index.js` | A plugin without a manifest. Its id is the folder’s name |
|
|
28
|
+
| `node_modules/<package>`, `node_modules/@scope/<package>` | Installed packages that carry a manifest |
|
|
29
|
+
|
|
30
|
+
- The runtime skips names that begin with `.` or `_`.
|
|
31
|
+
- It doesn’t read `.mjs` files: Node keeps such a file once it is imported, so it could not load
|
|
32
|
+
again.
|
|
33
|
+
- Of two plugins with the same id, the first one found stays. The other shows under “Not a
|
|
34
|
+
plugin” in Settings → Plugins, as does a manifest that cannot be read.
|
|
35
|
+
|
|
36
|
+
## A plugin’s folder
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
contacts/
|
|
40
|
+
engenty.plugin.json the manifest
|
|
41
|
+
src/
|
|
42
|
+
plugin.ts the server half
|
|
43
|
+
schema.ts its tables, for Drizzle
|
|
44
|
+
migrations/
|
|
45
|
+
0001_init.sql the tables, as SQL
|
|
46
|
+
ui/
|
|
47
|
+
plugin.tsx the studio half, as you write it
|
|
48
|
+
dist/
|
|
49
|
+
client.js the studio half, built
|
|
50
|
+
client.css
|
|
51
|
+
package.json only if it has dependencies of its own
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Only the manifest is required. A plugin with a studio half must be a folder with a manifest.
|
|
55
|
+
|
|
56
|
+
## The manifest
|
|
57
|
+
|
|
58
|
+
`engenty.plugin.json` is the same file an engenty module has. The runtime keeps fields it
|
|
59
|
+
doesn’t know as they are.
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"id": "contacts",
|
|
64
|
+
"name": "Contacts",
|
|
65
|
+
"version": "0.1.0",
|
|
66
|
+
"description": "Keeps the email address of everyone who ran a wizard to its end."
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
| Field | | Default |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| `id` | Lower case, digits and `-`, starting with a letter, at most 40 characters. Part of the plugin’s addresses and of its tools’ ids | required |
|
|
73
|
+
| `name` | Shown in the settings | required |
|
|
74
|
+
| `version` | Shown in the settings | `0.0.0` |
|
|
75
|
+
| `description` | Shown in the settings | |
|
|
76
|
+
| `server` | The server half, from the plugin’s folder | `src/plugin.ts`, then `src/plugin.js`, then `dist/plugin.js` |
|
|
77
|
+
| `studio` | The built studio half | `dist/client.js` |
|
|
78
|
+
| `styles` | The built studio half’s styles | `dist/client.css` |
|
|
79
|
+
|
|
80
|
+
A path in the manifest must stay inside the plugin’s folder.
|
|
81
|
+
|
|
82
|
+
## Dependencies
|
|
83
|
+
|
|
84
|
+
| The plugin imports | It comes from |
|
|
85
|
+
|---|---|
|
|
86
|
+
| `@engenty/wizards/plugin`, `@engenty/wizards/plugin/thread`, `zod`, `drizzle-orm`, `drizzle-orm/sqlite-core` | The runtime’s own copies, wherever the plugin’s file is |
|
|
87
|
+
| Its own files | Beside it, as TypeScript |
|
|
88
|
+
| Anything else | A `node_modules` the plugin brings beside it |
|
|
89
|
+
|
|
90
|
+
For the studio half see [The studio half](./studio.md#what-the-studio-shares).
|