@engenty/wizards-runtime 0.0.0-stage → 0.7.6
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 +95 -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 +231 -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/sandbox.js +77 -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 +212 -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 +197 -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 +86 -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 +279 -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/agentos-package.js +73 -0
- package/apps/runtime/dist/sandbox/agentos.js +162 -0
- package/apps/runtime/dist/sandbox/docker.js +45 -0
- package/apps/runtime/dist/sandbox/index.js +52 -0
- package/apps/runtime/dist/sandbox/install.js +122 -0
- package/apps/runtime/dist/sandbox/mastra.js +71 -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 +657 -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-DYgXPagX.js +1 -0
- package/apps/web/dist/assets/ChangelogDialog-BXqBW8j3.js +1 -0
- package/apps/web/dist/assets/ChatView-CK2--tsE.js +10 -0
- package/apps/web/dist/assets/EditorPage-jvcwyXbU.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-CV9uYzbv.js +16 -0
- package/apps/web/dist/assets/NewWizardChannels-BakW5q6s.js +1 -0
- package/apps/web/dist/assets/NewWizardPage-BoA-LJuW.js +7 -0
- package/apps/web/dist/assets/OnboardingPage-DaD1XnOe.js +1 -0
- package/apps/web/dist/assets/ProjectPage-BFgk1DEv.js +1 -0
- package/apps/web/dist/assets/PublicRunner-C9MwEvxy.js +1 -0
- package/apps/web/dist/assets/ReadOnly-DC2Kp7l8.js +1 -0
- package/apps/web/dist/assets/RunDrawer-CY6NZSrI.js +4 -0
- package/apps/web/dist/assets/RunnerView-BT26XgcY.js +1 -0
- package/apps/web/dist/assets/SettingsPage-AFt9IDLt.js +1 -0
- package/apps/web/dist/assets/SetupPage-DtFYAbwJ.js +1 -0
- package/apps/web/dist/assets/SharePage-t2xwNS61.js +1 -0
- package/apps/web/dist/assets/changelog-CATQFxCQ.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-Drw7FMTQ.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,335 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { delimiter, join } from "node:path";
|
|
4
|
+
import * as p from "@clack/prompts";
|
|
5
|
+
import { accountStep } from "./account.js";
|
|
6
|
+
import { autostartForStatus, setAutostart } from "./autostart.js";
|
|
7
|
+
import { installClient, installCommand } from "./clients.js";
|
|
8
|
+
import { appStates, connectApps } from "./connect.js";
|
|
9
|
+
import { runLogged } from "./exec.js";
|
|
10
|
+
import { command, installedByScript, isCheckout, packageVersion, readInstallNote, writeInstallNote, } from "./home.js";
|
|
11
|
+
import { CLIENTS, detectClients, findChrome, findFfmpeg, findOnPath, suggestedClient, vendorApp, } from "./machine.js";
|
|
12
|
+
import { runningRuntime, settings } from "./start.js";
|
|
13
|
+
import { badge, busy, cmd, cyan, dim, tilde } from "./ui.js";
|
|
14
|
+
/** The studio as an app of its own: Chrome (or Edge) installs it from the page. */
|
|
15
|
+
const CHROME_APP = "Tip: in Chrome or Edge you can install the studio as an app, with its own window and icon. Use the offer at the top of the studio, or the install icon in the address bar.";
|
|
16
|
+
function cancelled(value) {
|
|
17
|
+
if (p.isCancel(value)) {
|
|
18
|
+
p.cancel(`Setup stopped. To run it again: ${cmd("setup")}`);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
async function install(client, paths) {
|
|
24
|
+
const task = p.taskLog({ title: `Installing ${client.name}`, limit: 6 });
|
|
25
|
+
task.message(dim(installCommand(client, paths)));
|
|
26
|
+
const { code, tail } = await installClient(client, paths, (line) => task.message(line));
|
|
27
|
+
const installed = (await detectClients(paths)).find((state) => state.client.id === client.id);
|
|
28
|
+
if (code === 0 && installed?.path) {
|
|
29
|
+
task.success(`${client.name} ${installed.version ?? ""} installed`.trim());
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
task.error(`${client.name} didn’t install${code === 0 ? ": its command isn’t on the PATH" : ""}. ${tail.split("\n").pop() ?? ""}`);
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
async function clientsStep(paths, options, interactive) {
|
|
36
|
+
const spinner = busy("Looking for AI clients on this computer…");
|
|
37
|
+
const found = await detectClients(paths);
|
|
38
|
+
const installed = found.filter((state) => state.path);
|
|
39
|
+
const missing = found.filter((state) => !state.path);
|
|
40
|
+
spinner.stop(installed.length
|
|
41
|
+
? `Found AI clients: ${installed.map((s) => `${s.client.name} ${s.version}`).join(", ")}.`
|
|
42
|
+
: "No AI client on this computer yet.");
|
|
43
|
+
if (!installed.length) {
|
|
44
|
+
p.log.message(dim("engenty wizards runs its AI through an AI client, like Claude Code or Codex, on a subscription you already have."));
|
|
45
|
+
}
|
|
46
|
+
let wanted = missing.filter((s) => options.clients.includes(s.client.id));
|
|
47
|
+
// With a client already here, setup asks nothing more; another one is a `--client` away.
|
|
48
|
+
if (interactive && !installed.length && missing.length && !wanted.length) {
|
|
49
|
+
const suggested = suggestedClient(missing);
|
|
50
|
+
// A client whose app is on this Mac comes first: its subscription is most likely paid for.
|
|
51
|
+
const offered = [...missing].sort((a, b) => Number(!vendorApp(a.client)) - Number(!vendorApp(b.client)));
|
|
52
|
+
const answer = await p.multiselect({
|
|
53
|
+
message: "Which AI client should be installed? (space to choose, enter to continue)",
|
|
54
|
+
options: offered.map(({ client }) => {
|
|
55
|
+
const app = vendorApp(client);
|
|
56
|
+
return {
|
|
57
|
+
value: client.id,
|
|
58
|
+
label: client.name,
|
|
59
|
+
hint: [
|
|
60
|
+
`${client.account} subscription`,
|
|
61
|
+
app ? `the ${app} app is on this Mac` : "",
|
|
62
|
+
client.id === suggested?.client.id ? "recommended" : "",
|
|
63
|
+
]
|
|
64
|
+
.filter(Boolean)
|
|
65
|
+
.join(", "),
|
|
66
|
+
};
|
|
67
|
+
}),
|
|
68
|
+
initialValues: suggested ? [suggested.client.id] : [],
|
|
69
|
+
required: false,
|
|
70
|
+
});
|
|
71
|
+
if (cancelled(answer)) {
|
|
72
|
+
return "cancelled";
|
|
73
|
+
}
|
|
74
|
+
wanted = missing.filter((s) => answer.includes(s.client.id));
|
|
75
|
+
}
|
|
76
|
+
let any = installed.length > 0;
|
|
77
|
+
for (const { client } of wanted) {
|
|
78
|
+
any = (await install(client, paths)) || any;
|
|
79
|
+
}
|
|
80
|
+
if (any) {
|
|
81
|
+
p.log.info("Sign in to the AI client on the first page of the studio.");
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
p.log.warn(`No AI client yet. The first page of the studio can install one, or you can use an API key (Vercel AI Gateway, OpenAI, Anthropic) or a local model (Ollama).\n${dim(`To install ${CLIENTS.map((c) => c.name).join(", ")} here later: ${cmd("setup")}`)}`);
|
|
85
|
+
}
|
|
86
|
+
return any;
|
|
87
|
+
}
|
|
88
|
+
async function toolsStep(interactive) {
|
|
89
|
+
const chrome = findChrome();
|
|
90
|
+
if (chrome) {
|
|
91
|
+
p.log.success(`Browser for PDF and PNG exports: ${dim(tilde(chrome))}`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
p.log.warn("No Chrome, Edge or Chromium found. PDF and PNG exports and browser steps need one.\nhttps://www.google.com/chrome");
|
|
95
|
+
}
|
|
96
|
+
const ffmpeg = await findFfmpeg();
|
|
97
|
+
if (ffmpeg.path) {
|
|
98
|
+
p.log.success(`ffmpeg ${ffmpeg.version ?? ""} for videos`.replace(" ", " "));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const brew = findOnPath("brew", process.env.PATH ?? "");
|
|
102
|
+
if (!interactive || !brew) {
|
|
103
|
+
p.log.warn(`No ffmpeg found. MP4 videos of animated widgets need it.${brew ? `\n${dim(`To install it: ${cyan("brew install ffmpeg")}`)}` : ""}`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const answer = await p.confirm({
|
|
107
|
+
message: "No ffmpeg (for MP4 videos of animated widgets). Install it with Homebrew?",
|
|
108
|
+
initialValue: false,
|
|
109
|
+
});
|
|
110
|
+
if (cancelled(answer)) {
|
|
111
|
+
return "cancelled";
|
|
112
|
+
}
|
|
113
|
+
if (answer) {
|
|
114
|
+
const task = p.taskLog({ title: "Installing ffmpeg", limit: 6 });
|
|
115
|
+
const { code, tail } = await runLogged(brew, ["install", "ffmpeg"], {
|
|
116
|
+
onLine: (line) => task.message(line),
|
|
117
|
+
});
|
|
118
|
+
if (code === 0) {
|
|
119
|
+
task.success("ffmpeg installed");
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
task.error(`ffmpeg didn’t install. ${tail.split("\n").pop() ?? ""}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Starting at login: on a Mac a LaunchAgent starts the runtime, on Linux a systemd user
|
|
128
|
+
* service does. Asked, never assumed; `autostart off` undoes it.
|
|
129
|
+
*/
|
|
130
|
+
async function autostartStep(paths, interactive) {
|
|
131
|
+
const state = await autostartForStatus(paths);
|
|
132
|
+
if ("unavailable" in state) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (state.on) {
|
|
136
|
+
p.log.success(`Starts when you log in to this computer: ${dim(state.how)}`);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (!interactive) {
|
|
140
|
+
p.log.info(dim(`To start it when you log in to this computer: ${cmd("autostart on")}`));
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const answer = await p.confirm({
|
|
144
|
+
message: "Start engenty wizards when you log in to this computer? It runs as a background process, without a terminal window, so links and your AI apps can always reach it.",
|
|
145
|
+
initialValue: true,
|
|
146
|
+
});
|
|
147
|
+
if (cancelled(answer)) {
|
|
148
|
+
return "cancelled";
|
|
149
|
+
}
|
|
150
|
+
if (!answer) {
|
|
151
|
+
p.log.info(dim(`To do it later: ${cmd("autostart on")}`));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
const after = await setAutostart(paths, true);
|
|
156
|
+
if ("on" in after && after.on) {
|
|
157
|
+
p.log.success(`Starts when you log in to this computer: ${dim(after.how)}`);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
p.log.warn("Couldn’t set it to start when you log in.");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
p.log.warn(`Couldn’t set it to start when you log in. ${error.message}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* The wizards in the person's AI apps (Claude Desktop, Cursor, Codex …): offered for each app on
|
|
169
|
+
* this machine that does not have them yet. Asked, never assumed; `disconnect` undoes it.
|
|
170
|
+
*/
|
|
171
|
+
async function appsStep(paths, interactive) {
|
|
172
|
+
const states = await appStates(paths);
|
|
173
|
+
const connected = states.filter((s) => s.connected);
|
|
174
|
+
const offered = states.filter((s) => s.installed && !s.connected);
|
|
175
|
+
if (connected.length) {
|
|
176
|
+
p.log.success(`Already in your AI apps: ${connected.map((s) => s.name).join(", ")}`);
|
|
177
|
+
}
|
|
178
|
+
if (!offered.length) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (!interactive) {
|
|
182
|
+
p.log.info(dim(`To use your wizards in ${offered.map((s) => s.name).join(", ")}: ${cmd("connect")}`));
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const answer = await p.multiselect({
|
|
186
|
+
message: "Add your wizards to these AI apps, as an MCP server in each app’s settings? (space to choose, enter to continue)",
|
|
187
|
+
options: offered.map((s) => ({ value: s.id, label: s.name })),
|
|
188
|
+
initialValues: offered.map((s) => s.id),
|
|
189
|
+
required: false,
|
|
190
|
+
});
|
|
191
|
+
if (cancelled(answer)) {
|
|
192
|
+
return "cancelled";
|
|
193
|
+
}
|
|
194
|
+
if (!answer.length) {
|
|
195
|
+
p.log.info(dim(`To do it later: ${cmd("connect")}`));
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
for (const { app, outcome } of await connectApps(paths, answer)) {
|
|
199
|
+
if (outcome.ok) {
|
|
200
|
+
p.log.success(`${app.name}: ${dim(outcome.message)}`);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
p.log.warn(`${app.name}: ${outcome.message}${outcome.snippet ? `\n${outcome.snippet}` : ""}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
p.log.info(dim("Restart those apps to see the wizards in them."));
|
|
207
|
+
}
|
|
208
|
+
/** The line that puts `~/.local/bin` on the PATH, and the shell file it belongs in. */
|
|
209
|
+
function pathLine() {
|
|
210
|
+
const shell = process.env.SHELL ?? "";
|
|
211
|
+
if (shell.endsWith("fish")) {
|
|
212
|
+
return {
|
|
213
|
+
file: join(homedir(), ".config/fish/config.fish"),
|
|
214
|
+
line: "fish_add_path ~/.local/bin",
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
const file = shell.endsWith("zsh")
|
|
218
|
+
? ".zshrc"
|
|
219
|
+
: process.platform === "darwin"
|
|
220
|
+
? ".bash_profile"
|
|
221
|
+
: ".bashrc";
|
|
222
|
+
return { file: join(homedir(), file), line: 'export PATH="$HOME/.local/bin:$PATH"' };
|
|
223
|
+
}
|
|
224
|
+
/** An install made by install.sh has its command in `~/.local/bin`: is that on the PATH? */
|
|
225
|
+
async function pathStep(interactive) {
|
|
226
|
+
const local = join(homedir(), ".local", "bin");
|
|
227
|
+
if (!installedByScript() || (process.env.PATH ?? "").split(delimiter).includes(local)) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const { file, line } = pathLine();
|
|
231
|
+
if (existsSync(file) && readFileSync(file, "utf8").includes(".local/bin")) {
|
|
232
|
+
p.log.info(`Open a new terminal to use the ${cyan("wizards")} command.`);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const hint = `Until then, use ${cyan(tilde(join(local, "wizards")))}`;
|
|
236
|
+
if (!interactive) {
|
|
237
|
+
p.log.warn(`~/.local/bin isn’t on your PATH. Add this to ${tilde(file)}:\n${line}\n${dim(hint)}`);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
const answer = await p.confirm({
|
|
241
|
+
message: `The wizards command is in ~/.local/bin, which isn’t on your PATH. Add it in ${tilde(file)}?`,
|
|
242
|
+
initialValue: true,
|
|
243
|
+
});
|
|
244
|
+
if (cancelled(answer)) {
|
|
245
|
+
return "cancelled";
|
|
246
|
+
}
|
|
247
|
+
if (answer) {
|
|
248
|
+
appendFileSync(file, `\n# engenty wizards\n${line}\n`);
|
|
249
|
+
p.log.success(`Added to ${tilde(file)}. Open a new terminal to use it.\n${dim(hint)}`);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
p.log.info(hint);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/** What runs now, and the commands to start, stop and check it from now on. */
|
|
256
|
+
async function howToUse(paths) {
|
|
257
|
+
const [running, atLogin] = await Promise.all([
|
|
258
|
+
runningRuntime(settings(paths).dataDir),
|
|
259
|
+
autostartForStatus(paths),
|
|
260
|
+
]);
|
|
261
|
+
const wizards = command();
|
|
262
|
+
const row = (what, cmd, note = "") => `${what.padEnd(9)}${cyan(cmd.padEnd(wizards.length + 12))}${note ? dim(note) : ""}`;
|
|
263
|
+
p.log.message([
|
|
264
|
+
running
|
|
265
|
+
? `engenty wizards is running: ${cyan(running.url)}`
|
|
266
|
+
: "engenty wizards isn’t running yet.",
|
|
267
|
+
"unavailable" in atLogin || !atLogin.on
|
|
268
|
+
? ""
|
|
269
|
+
: dim("It starts automatically when you log in to this computer."),
|
|
270
|
+
]
|
|
271
|
+
.filter(Boolean)
|
|
272
|
+
.join("\n"));
|
|
273
|
+
p.outro([
|
|
274
|
+
"From now on, in a terminal:",
|
|
275
|
+
"",
|
|
276
|
+
row("Start", `${wizards} start`, "runs in this terminal; Ctrl-C stops it"),
|
|
277
|
+
row("", `${wizards} start -s`, "runs in the background; the terminal stays free"),
|
|
278
|
+
row("Studio", `${wizards} studio`, "opens the studio, starting it first if needed"),
|
|
279
|
+
row("Stop", `${wizards} stop`, "your data is kept"),
|
|
280
|
+
row("Check", `${wizards} status`, "shows what’s running and where"),
|
|
281
|
+
row("Restart", `${wizards} restart`),
|
|
282
|
+
row("Menu", wizards, "everything in one menu"),
|
|
283
|
+
"",
|
|
284
|
+
dim("It’s installed, so there’s no need to run the installer again. To update: ") +
|
|
285
|
+
cmd("update"),
|
|
286
|
+
].join("\n"));
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* The guided setup: the account this computer joins, then what this machine has, what is
|
|
290
|
+
* missing, and what to install — an AI client to think with, ffmpeg, starting at login. It
|
|
291
|
+
* starts nothing; it ends with what runs and how to start, stop and check it. Returns false
|
|
292
|
+
* when it was stopped.
|
|
293
|
+
*/
|
|
294
|
+
export async function setup(paths, options) {
|
|
295
|
+
const interactive = !options.yes && Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
296
|
+
const version = packageVersion();
|
|
297
|
+
p.intro(`${badge("engenty wizards")} ${dim(version)}`);
|
|
298
|
+
p.log.message([
|
|
299
|
+
`Install ${tilde(paths.home)}${installedByScript() ? "" : dim(` (data; the code runs from ${isCheckout() ? "this checkout" : "npm"})`)}`,
|
|
300
|
+
`Node ${process.version} ${dim(tilde(process.execPath))}`,
|
|
301
|
+
].join("\n"));
|
|
302
|
+
if ((await accountStep(paths, options, interactive)) === "cancelled") {
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
if ((await clientsStep(paths, options, interactive)) === "cancelled") {
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
if ((await toolsStep(interactive)) === "cancelled") {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
if ((await autostartStep(paths, interactive)) === "cancelled") {
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
if ((await appsStep(paths, interactive)) === "cancelled") {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
if ((await pathStep(interactive)) === "cancelled") {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
writeInstallNote({
|
|
321
|
+
...readInstallNote(paths),
|
|
322
|
+
setupAt: new Date().toISOString(),
|
|
323
|
+
version,
|
|
324
|
+
unattended: !process.stdout.isTTY,
|
|
325
|
+
}, paths);
|
|
326
|
+
p.log.info(CHROME_APP);
|
|
327
|
+
if (options.next) {
|
|
328
|
+
p.outro(options.next === "start"
|
|
329
|
+
? "Setup is done. Starting engenty wizards…"
|
|
330
|
+
: `Setup is done. ${dim(`${cmd("help")} lists every command.`)}`);
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
await howToUse(paths);
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import { existsSync, mkdirSync, openSync, readFileSync } from "node:fs";
|
|
4
|
+
import { createServer } from "node:net";
|
|
5
|
+
import { join, resolve } from "node:path";
|
|
6
|
+
import { mintLocalTicket } from "../auth/local-ticket.js";
|
|
7
|
+
import { readRunning } from "../running.js";
|
|
8
|
+
import { RESTART_EXIT } from "../update.js";
|
|
9
|
+
import { applyPendingUpdate, autoUpdatePolicy, notesUrl } from "./autoupdate.js";
|
|
10
|
+
import { runtimeEnv } from "./environment.js";
|
|
11
|
+
import { installedByScript, packageRoot, readEnvFile } from "./home.js";
|
|
12
|
+
import { findOnPath } from "./machine.js";
|
|
13
|
+
import { cmd, cyan, dim, live, tilde } from "./ui.js";
|
|
14
|
+
const DEFAULT_PORT = 24368;
|
|
15
|
+
const START_TIMEOUT_MS = 60_000;
|
|
16
|
+
/** The settings this install starts with: its `.env`, overridden by the terminal's variables. */
|
|
17
|
+
export function settings(paths, env = process.env) {
|
|
18
|
+
const fileEnv = readEnvFile(paths.envFile);
|
|
19
|
+
const value = (key) => env[key]?.trim() || fileEnv[key]?.trim() || "";
|
|
20
|
+
return {
|
|
21
|
+
fileEnv,
|
|
22
|
+
dataDir: value("DATA_DIR") ? resolve(paths.home, value("DATA_DIR")) : paths.data,
|
|
23
|
+
port: Number(value("API_PORT")) || null,
|
|
24
|
+
appUrl: value("APP_URL").replace(/\/$/, ""),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The secret the runtime this command starts signs with, read the way it reads it (env.ts): its
|
|
29
|
+
* APP_SECRET, else the one it keeps in the data folder; null before it made one. The runtime
|
|
30
|
+
* never sees the terminal's APP_SECRET (cli/environment.ts), only its folder's `.env.local` and
|
|
31
|
+
* `.env`, so the terminal's is left out here too: a ticket signed with it would be refused.
|
|
32
|
+
*/
|
|
33
|
+
export function readSecret(paths, env = process.env) {
|
|
34
|
+
const { fileEnv, dataDir } = settings(paths, env);
|
|
35
|
+
const given = readEnvFile(join(paths.home, ".env.local")).APP_SECRET?.trim() || fileEnv.APP_SECRET?.trim();
|
|
36
|
+
if (given) {
|
|
37
|
+
return given;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
return readFileSync(join(dataDir, "secret"), "utf8").trim() || null;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function healthy(port) {
|
|
47
|
+
try {
|
|
48
|
+
const response = await fetch(`http://127.0.0.1:${port}/api/health`, {
|
|
49
|
+
signal: AbortSignal.timeout(1500),
|
|
50
|
+
});
|
|
51
|
+
return response.ok;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function portIsFree(port) {
|
|
58
|
+
return new Promise((done) => {
|
|
59
|
+
const probe = createServer();
|
|
60
|
+
probe.once("error", () => done(false));
|
|
61
|
+
probe.listen(port, "127.0.0.1", () => probe.close(() => done(true)));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** The usual port, or the next free one after it. */
|
|
65
|
+
async function freePort() {
|
|
66
|
+
for (let port = DEFAULT_PORT; port < DEFAULT_PORT + 20; port++) {
|
|
67
|
+
if (await portIsFree(port)) {
|
|
68
|
+
return port;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
throw new Error(`No free port between ${DEFAULT_PORT} and ${DEFAULT_PORT + 19}.`);
|
|
72
|
+
}
|
|
73
|
+
/** The runtime that already runs on this install's data folder and answers. */
|
|
74
|
+
export async function runningRuntime(dataDir) {
|
|
75
|
+
const running = readRunning(dataDir);
|
|
76
|
+
return running && (await healthy(running.port)) ? running : null;
|
|
77
|
+
}
|
|
78
|
+
/** A link that lets this browser into a running runtime: a ticket signed with the runtime's secret. */
|
|
79
|
+
export function entryUrl(running, paths, env = process.env) {
|
|
80
|
+
const secret = readSecret(paths, env);
|
|
81
|
+
// No secret to be read here: the browser gets in if it was let in before.
|
|
82
|
+
return secret ? `${running.url}/api/local/enter?t=${mintLocalTicket(secret)}` : `${running.url}/`;
|
|
83
|
+
}
|
|
84
|
+
/** Opens an address in the person's browser; false when this machine has none to open it with. */
|
|
85
|
+
export function openBrowser(url) {
|
|
86
|
+
const opener = process.platform === "darwin"
|
|
87
|
+
? "open"
|
|
88
|
+
: process.env.DISPLAY || process.env.WAYLAND_DISPLAY
|
|
89
|
+
? "xdg-open"
|
|
90
|
+
: null;
|
|
91
|
+
if (!opener || !findOnPath(opener, process.env.PATH ?? "")) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
spawn(opener, [url], { stdio: "ignore", detached: true }).unref();
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function show(url, entry, open) {
|
|
103
|
+
const opened = open && openBrowser(entry);
|
|
104
|
+
console.log("");
|
|
105
|
+
console.log(` ${live} engenty wizards is running: ${cyan(url)}`);
|
|
106
|
+
if (opened) {
|
|
107
|
+
console.log(dim(" The studio opens in your browser."));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
console.log(` Open the studio: ${cyan(entry)}`);
|
|
111
|
+
console.log(dim(" The link signs in one browser and works only once."));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** The command of this install, as it is on disk now: `wizards <args>`. */
|
|
115
|
+
function spawnCommand(paths, args, options) {
|
|
116
|
+
const wrapper = join(paths.bin, "wizards");
|
|
117
|
+
return existsSync(wrapper)
|
|
118
|
+
? spawn(wrapper, args, options)
|
|
119
|
+
: spawn(process.execPath, [join(packageRoot, "bin/wizards.mjs"), ...args], options);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* `wizards start --no-open` detached from this terminal, its output in logs/runtime.log; the
|
|
123
|
+
* runtime once it answers, or null when it ended or did not answer within a minute.
|
|
124
|
+
*/
|
|
125
|
+
export async function startInBackground(paths) {
|
|
126
|
+
const { dataDir } = settings(paths);
|
|
127
|
+
mkdirSync(paths.logs, { recursive: true });
|
|
128
|
+
const log = openSync(join(paths.logs, "runtime.log"), "a");
|
|
129
|
+
const child = spawnCommand(paths, ["start", "--no-open"], {
|
|
130
|
+
cwd: paths.home,
|
|
131
|
+
detached: true,
|
|
132
|
+
stdio: ["ignore", log, log],
|
|
133
|
+
});
|
|
134
|
+
let exited = false;
|
|
135
|
+
child.on("error", () => {
|
|
136
|
+
exited = true;
|
|
137
|
+
});
|
|
138
|
+
child.on("exit", () => {
|
|
139
|
+
exited = true;
|
|
140
|
+
});
|
|
141
|
+
child.unref();
|
|
142
|
+
const began = Date.now();
|
|
143
|
+
while (!exited && Date.now() - began < START_TIMEOUT_MS) {
|
|
144
|
+
await new Promise((wait) => setTimeout(wait, 300));
|
|
145
|
+
const started = await runningRuntime(dataDir);
|
|
146
|
+
if (started) {
|
|
147
|
+
return started;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Starts the runtime of this install and opens the studio: in the foreground, or with
|
|
154
|
+
* `background` detached from this terminal. If one already runs on the same data folder
|
|
155
|
+
* (another terminal, the desktop app), that one is opened instead.
|
|
156
|
+
*/
|
|
157
|
+
export async function start(paths, options) {
|
|
158
|
+
const { fileEnv, dataDir, port: wanted, appUrl } = settings(paths);
|
|
159
|
+
mkdirSync(dataDir, { recursive: true });
|
|
160
|
+
mkdirSync(paths.logs, { recursive: true });
|
|
161
|
+
const running = await runningRuntime(dataDir);
|
|
162
|
+
if (running) {
|
|
163
|
+
show(running.url, entryUrl(running, paths), options.open);
|
|
164
|
+
console.log(dim(` It was already running. To stop it: ${cmd("stop")}`));
|
|
165
|
+
return 0;
|
|
166
|
+
}
|
|
167
|
+
// Nothing runs, so no run is cut off: a version downloaded meanwhile becomes current and
|
|
168
|
+
// takes this process's place (the login item keeps waiting on the same pid). In the
|
|
169
|
+
// background, the `start` spawned below does it.
|
|
170
|
+
if (!options.background && installedByScript(paths) && process.execve) {
|
|
171
|
+
const switched = autoUpdatePolicy(paths, { installed: true }).on && applyPendingUpdate(paths);
|
|
172
|
+
if (switched) {
|
|
173
|
+
console.log(` ${live} Updated to ${switched.to}. What changed: ${notesUrl(switched.to)}`);
|
|
174
|
+
const wrapper = join(paths.bin, "wizards");
|
|
175
|
+
try {
|
|
176
|
+
process.execve(wrapper, [wrapper, "start", ...(options.open ? [] : ["--no-open"])]);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// This version starts once more; the next start is the new one.
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (options.background) {
|
|
184
|
+
const started = await startInBackground(paths);
|
|
185
|
+
if (!started) {
|
|
186
|
+
console.error(`engenty wizards didn’t start. Its log is in ${tilde(join(paths.logs, "runtime.log"))}.`);
|
|
187
|
+
return 1;
|
|
188
|
+
}
|
|
189
|
+
show(started.url, entryUrl(started, paths), options.open);
|
|
190
|
+
console.log(dim(` It’s running in the background. To stop it: ${cmd("stop")}`));
|
|
191
|
+
console.log(dim(` Its log is in ${tilde(join(paths.logs, "runtime.log"))}.`));
|
|
192
|
+
return 0;
|
|
193
|
+
}
|
|
194
|
+
const port = wanted ?? (await freePort());
|
|
195
|
+
if (!wanted && port !== DEFAULT_PORT) {
|
|
196
|
+
console.log(dim(` Port ${DEFAULT_PORT} is taken, so it uses ${port}.`));
|
|
197
|
+
}
|
|
198
|
+
const accessKey = randomBytes(24).toString("hex");
|
|
199
|
+
const url = appUrl || `http://localhost:${port}`;
|
|
200
|
+
const child = spawn(process.execPath, [join(packageRoot, "apps/runtime/dist/index.js")], {
|
|
201
|
+
cwd: paths.home,
|
|
202
|
+
env: {
|
|
203
|
+
...runtimeEnv(paths, { port, url, dataDir, accessKey }, process.env, fileEnv),
|
|
204
|
+
// This command starts it again when it exits with RESTART_EXIT.
|
|
205
|
+
ENGENTY_WIZARDS_RESTARTS: "1",
|
|
206
|
+
},
|
|
207
|
+
stdio: ["ignore", "inherit", "inherit"],
|
|
208
|
+
});
|
|
209
|
+
let current = child;
|
|
210
|
+
let exited = null;
|
|
211
|
+
const ended = new Promise((done) => {
|
|
212
|
+
child.on("error", (error) => {
|
|
213
|
+
console.error(`engenty wizards didn’t start: ${error.message}`);
|
|
214
|
+
exited = 1;
|
|
215
|
+
done(1);
|
|
216
|
+
});
|
|
217
|
+
child.on("exit", (code, signal) => {
|
|
218
|
+
exited = code ?? (signal ? 0 : 1);
|
|
219
|
+
done(exited);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
// Ctrl-C reaches the runtime as well (same terminal); it closes its browser and its databases.
|
|
223
|
+
process.on("SIGINT", () => undefined);
|
|
224
|
+
process.on("SIGTERM", () => current.kill("SIGTERM"));
|
|
225
|
+
const began = Date.now();
|
|
226
|
+
while (exited === null && !(await healthy(port))) {
|
|
227
|
+
if (Date.now() - began > START_TIMEOUT_MS) {
|
|
228
|
+
child.kill("SIGTERM");
|
|
229
|
+
console.error("engenty wizards didn’t respond within 60 seconds.");
|
|
230
|
+
return 1;
|
|
231
|
+
}
|
|
232
|
+
await new Promise((wait) => setTimeout(wait, 150));
|
|
233
|
+
}
|
|
234
|
+
if (exited !== null) {
|
|
235
|
+
return exited || 1;
|
|
236
|
+
}
|
|
237
|
+
show(url, `${url}/api/local/enter?k=${accessKey}`, options.open);
|
|
238
|
+
console.log(dim(" To stop it, press Ctrl-C."));
|
|
239
|
+
console.log("");
|
|
240
|
+
const code = await ended;
|
|
241
|
+
if (code !== RESTART_EXIT) {
|
|
242
|
+
return code;
|
|
243
|
+
}
|
|
244
|
+
// Updated or `wizards restart`: the command as it is on disk now starts it again, in this
|
|
245
|
+
// terminal or under the login item, which keeps waiting on this process.
|
|
246
|
+
console.log(dim(" Restarting…"));
|
|
247
|
+
current = spawnCommand(paths, ["start", "--no-open"], { stdio: "inherit" });
|
|
248
|
+
return new Promise((done) => {
|
|
249
|
+
current.on("error", () => done(1));
|
|
250
|
+
current.on("exit", (exit) => done(exit ?? 0));
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
/** `wizards studio`: opens the studio in the browser; when nothing runs, it starts as a service first. */
|
|
254
|
+
export async function studio(paths) {
|
|
255
|
+
const { dataDir } = settings(paths);
|
|
256
|
+
const running = await runningRuntime(dataDir);
|
|
257
|
+
if (running) {
|
|
258
|
+
show(running.url, entryUrl(running, paths), true);
|
|
259
|
+
return 0;
|
|
260
|
+
}
|
|
261
|
+
return start(paths, { open: true, background: true });
|
|
262
|
+
}
|
|
263
|
+
/** `wizards open`: lets the browser into the runtime that runs. */
|
|
264
|
+
export async function open(paths, print) {
|
|
265
|
+
const { dataDir } = settings(paths);
|
|
266
|
+
const running = await runningRuntime(dataDir);
|
|
267
|
+
if (!running) {
|
|
268
|
+
console.error(`engenty wizards isn’t running. To start it: ${cmd("start")}`);
|
|
269
|
+
return 1;
|
|
270
|
+
}
|
|
271
|
+
const entry = entryUrl(running, paths);
|
|
272
|
+
if (print || !openBrowser(entry)) {
|
|
273
|
+
console.log(entry);
|
|
274
|
+
}
|
|
275
|
+
return 0;
|
|
276
|
+
}
|