@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,212 @@
|
|
|
1
|
+
import { accessSync, constants, existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { accountState, describeAccount } from "./account.js";
|
|
4
|
+
import { autostartForStatus, autostartState, setAutostart } from "./autostart.js";
|
|
5
|
+
import { autoUpdatePolicy, updateNotice } from "./autoupdate.js";
|
|
6
|
+
import { installedByScript, isCheckout, packageRoot, packageVersion } from "./home.js";
|
|
7
|
+
import { detectClients, findChrome, findFfmpeg, nodeIsCurrent } from "./machine.js";
|
|
8
|
+
import { findWizardsProcesses, stopProcesses } from "./processes.js";
|
|
9
|
+
import { installedEngines } from "./sandbox.js";
|
|
10
|
+
import { entryUrl, runningRuntime, settings, startInBackground } from "./start.js";
|
|
11
|
+
import { bad, badge, cmd, cyan, dim, no, ok, tilde } from "./ui.js";
|
|
12
|
+
/**
|
|
13
|
+
* What is installed and what runs. With `checks` (`doctor`) it also says what is wrong and
|
|
14
|
+
* returns 1 when something is.
|
|
15
|
+
*/
|
|
16
|
+
export async function status(paths, checks) {
|
|
17
|
+
const { dataDir } = settings(paths);
|
|
18
|
+
const [running, clients, ffmpeg, atLogin, account] = await Promise.all([
|
|
19
|
+
runningRuntime(dataDir),
|
|
20
|
+
detectClients(paths),
|
|
21
|
+
findFfmpeg(),
|
|
22
|
+
autostartForStatus(paths),
|
|
23
|
+
accountState(),
|
|
24
|
+
]);
|
|
25
|
+
const chrome = findChrome();
|
|
26
|
+
const row = (label, value) => console.log(` ${label.padEnd(9)} ${value}`);
|
|
27
|
+
console.log(`\n${badge("engenty wizards")} ${dim(packageVersion())}\n`);
|
|
28
|
+
row("Install", installedByScript()
|
|
29
|
+
? tilde(paths.home)
|
|
30
|
+
: `${tilde(packageRoot)} ${dim(isCheckout() ? "(a checkout)" : "(npm)")}`);
|
|
31
|
+
row("Data", tilde(dataDir));
|
|
32
|
+
row("Node", `${process.version} ${dim(tilde(process.execPath))}`);
|
|
33
|
+
row("Running", running
|
|
34
|
+
? `${ok} ${cyan(running.url)} ${dim(`pid ${running.pid}, since ${new Date(running.startedAt).toLocaleString()}`)}`
|
|
35
|
+
: `${no} not running`);
|
|
36
|
+
if (!("unavailable" in atLogin)) {
|
|
37
|
+
row("At login", atLogin.on ? `${ok} starts ${dim(`(${atLogin.how})`)}` : `${no} doesn’t start`);
|
|
38
|
+
}
|
|
39
|
+
if (installedByScript(paths)) {
|
|
40
|
+
const policy = autoUpdatePolicy(paths, { installed: true });
|
|
41
|
+
row("Updates", policy.on ? `${ok} automatic` : `${no} ${policy.reason} ${dim(`(${cmd("autoupdate on")})`)}`);
|
|
42
|
+
}
|
|
43
|
+
row("Account", `${account.kind === "linked" ? ok : no} ${describeAccount(account)}`);
|
|
44
|
+
for (const { client, path, version } of clients) {
|
|
45
|
+
row(client.name.split(" ")[0], path ? `${ok} ${version} ${dim(tilde(path))}` : `${no} not installed`);
|
|
46
|
+
}
|
|
47
|
+
row("Browser", chrome ? `${ok} ${dim(tilde(chrome))}` : `${no} not found (needed for PDF and PNG)`);
|
|
48
|
+
row("ffmpeg", ffmpeg.path ? `${ok} ${ffmpeg.version ?? ""}` : `${no} not found (needed for MP4)`);
|
|
49
|
+
const engines = installedEngines(paths);
|
|
50
|
+
row("Sandbox", engines.length
|
|
51
|
+
? engines
|
|
52
|
+
.map(({ label, version, current }) => version === current
|
|
53
|
+
? `${ok} ${label} ${version}`
|
|
54
|
+
: `${no} ${label} ${version} is outdated (${cmd("sandbox add")} installs ${current})`)
|
|
55
|
+
.join(", ")
|
|
56
|
+
: `${no} not installed (${cmd("sandbox add")} lets AI steps run code)`);
|
|
57
|
+
const { updated, pending } = updateNotice(paths, packageVersion());
|
|
58
|
+
if (updated) {
|
|
59
|
+
console.log(`\n ${ok} Updated to ${updated.to}. What changed: ${cyan(updated.notes)}`);
|
|
60
|
+
}
|
|
61
|
+
else if (pending) {
|
|
62
|
+
console.log(`\n ${ok} Version ${pending.version} is downloaded; it runs from the next start.`);
|
|
63
|
+
}
|
|
64
|
+
console.log("");
|
|
65
|
+
if (!checks) {
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
const problems = [];
|
|
69
|
+
if (!nodeIsCurrent()) {
|
|
70
|
+
problems.push(`Node ${process.version} is too old. engenty wizards needs 24.11 or newer.`);
|
|
71
|
+
}
|
|
72
|
+
for (const part of ["apps/runtime/dist/index.js", "apps/web/dist/index.html", "plugin"]) {
|
|
73
|
+
if (!existsSync(join(packageRoot, part))) {
|
|
74
|
+
problems.push(`${part} is missing from this install (${tilde(packageRoot)}).`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
mkdirSync(paths.home, { recursive: true });
|
|
79
|
+
accessSync(paths.home, constants.W_OK);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
problems.push(`${tilde(paths.home)} can’t be written to.`);
|
|
83
|
+
}
|
|
84
|
+
if (!clients.some((state) => state.path)) {
|
|
85
|
+
console.log(` ${no} No AI client. The studio needs an API key, Ollama or Apple Intelligence (Mac only) instead. ${dim(`To install one: ${cmd("setup")}`)}`);
|
|
86
|
+
}
|
|
87
|
+
for (const problem of problems) {
|
|
88
|
+
console.log(` ${bad} ${problem}`);
|
|
89
|
+
}
|
|
90
|
+
if (!problems.length) {
|
|
91
|
+
console.log(` ${ok} No problems found.`);
|
|
92
|
+
}
|
|
93
|
+
console.log("");
|
|
94
|
+
return problems.length ? 1 : 0;
|
|
95
|
+
}
|
|
96
|
+
/** Waits for a process to end; false when it still runs after `ms`. */
|
|
97
|
+
async function ended(pid, ms) {
|
|
98
|
+
for (let waited = 0; waited < ms; waited += 100) {
|
|
99
|
+
try {
|
|
100
|
+
process.kill(pid, 0);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
await new Promise((wait) => setTimeout(wait, 100));
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Stops engenty wizards: the runtime that runs on this install's data folder, and every other
|
|
111
|
+
* runtime or `start` of this install still about (an older `start --no-open` whose note another
|
|
112
|
+
* one overwrote). `wizards mcp` processes belong to the AI apps and stay.
|
|
113
|
+
*/
|
|
114
|
+
export async function stop(paths) {
|
|
115
|
+
const { dataDir } = settings(paths);
|
|
116
|
+
const running = await runningRuntime(dataDir);
|
|
117
|
+
const found = findWizardsProcesses(paths.home);
|
|
118
|
+
const pids = [
|
|
119
|
+
...new Set([
|
|
120
|
+
...(running ? [running.pid] : []),
|
|
121
|
+
...found.filter((p) => p.kind === "runtime" || p.kind === "start").map((p) => p.pid),
|
|
122
|
+
]),
|
|
123
|
+
];
|
|
124
|
+
if (!pids.length) {
|
|
125
|
+
console.log("engenty wizards isn’t running.");
|
|
126
|
+
return 0;
|
|
127
|
+
}
|
|
128
|
+
const left = await stopProcesses(pids);
|
|
129
|
+
const stopped = pids.length - left.length;
|
|
130
|
+
if (stopped) {
|
|
131
|
+
console.log(pids.length === 1
|
|
132
|
+
? `Stopped (pid ${pids[0]}). Your data is kept.`
|
|
133
|
+
: `Stopped ${stopped} processes (pid ${pids.filter((pid) => !left.includes(pid)).join(", ")}). Your data is kept.`);
|
|
134
|
+
}
|
|
135
|
+
const apps = found.filter((p) => p.kind === "mcp").length;
|
|
136
|
+
if (apps && !left.length) {
|
|
137
|
+
console.log(dim(`${apps === 1 ? "An AI app connection still runs" : `${apps} AI app connections still run`}. Using a wizard there starts engenty wizards again.`));
|
|
138
|
+
}
|
|
139
|
+
if (left.length) {
|
|
140
|
+
console.error(`${left.length === 1 ? "A process" : `${left.length} processes`} of engenty wizards didn’t stop (pid ${left.join(", ")}). To stop ${left.length === 1 ? "it" : "them"}: ${cyan(`kill -9 ${left.join(" ")}`)}`);
|
|
141
|
+
return 1;
|
|
142
|
+
}
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Stops the runtime and starts it again, the version on disk now. One the command started (a
|
|
147
|
+
* terminal, the login item) is started again by that command, where it ran; any other is
|
|
148
|
+
* stopped and started in the background. When nothing runs, it is started in the background.
|
|
149
|
+
*/
|
|
150
|
+
export async function restart(paths) {
|
|
151
|
+
const { dataDir } = settings(paths);
|
|
152
|
+
const running = await runningRuntime(dataDir);
|
|
153
|
+
if (running?.restarts && process.platform !== "win32") {
|
|
154
|
+
process.kill(running.pid, "SIGUSR2");
|
|
155
|
+
for (let waited = 0; waited < 60_000; waited += 300) {
|
|
156
|
+
await new Promise((wait) => setTimeout(wait, 300));
|
|
157
|
+
const again = await runningRuntime(dataDir);
|
|
158
|
+
if (again && again.pid !== running.pid) {
|
|
159
|
+
console.log(`${ok} Restarted: ${cyan(again.url)} ${dim(`pid ${again.pid}`)}`);
|
|
160
|
+
return 0;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
console.error("engenty wizards didn’t restart within a minute.");
|
|
164
|
+
return 1;
|
|
165
|
+
}
|
|
166
|
+
if (running) {
|
|
167
|
+
process.kill(running.pid, "SIGTERM");
|
|
168
|
+
if (!(await ended(running.pid, 8000))) {
|
|
169
|
+
console.error(`engenty wizards (pid ${running.pid}) didn’t stop within 8 seconds.`);
|
|
170
|
+
return 1;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const started = await startInBackground(paths);
|
|
174
|
+
if (!started) {
|
|
175
|
+
console.error(`engenty wizards didn’t start. Its log is in ${tilde(join(paths.logs, "runtime.log"))}.`);
|
|
176
|
+
return 1;
|
|
177
|
+
}
|
|
178
|
+
console.log(`${ok} ${running ? "Restarted" : "Started"}: ${cyan(started.url)} ${dim(`pid ${started.pid}, in the background`)}`);
|
|
179
|
+
if (!running) {
|
|
180
|
+
console.log(` Open the studio: ${cyan(entryUrl(started, paths))}`);
|
|
181
|
+
}
|
|
182
|
+
return 0;
|
|
183
|
+
}
|
|
184
|
+
/** `autostart [on|off]`: whether it starts at login, and the switch. */
|
|
185
|
+
export async function autostart(paths, value) {
|
|
186
|
+
if (value && value !== "on" && value !== "off") {
|
|
187
|
+
console.error(`Use ${cmd("autostart on")} or ${cmd("autostart off")}.`);
|
|
188
|
+
return 2;
|
|
189
|
+
}
|
|
190
|
+
let state;
|
|
191
|
+
try {
|
|
192
|
+
state = await autostartState(paths);
|
|
193
|
+
if (value && !("unavailable" in state)) {
|
|
194
|
+
state = await setAutostart(paths, value === "on");
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
console.error(`Couldn’t ${value ? `turn start at login ${value}` : "check start at login"}: ${error.message}`);
|
|
199
|
+
return 1;
|
|
200
|
+
}
|
|
201
|
+
if ("unavailable" in state) {
|
|
202
|
+
console.error(`Start at login isn’t available here: ${state.unavailable}.`);
|
|
203
|
+
return value ? 1 : 0;
|
|
204
|
+
}
|
|
205
|
+
console.log(state.on
|
|
206
|
+
? `${ok} engenty wizards starts at login: ${state.how}.`
|
|
207
|
+
: `${no} engenty wizards doesn’t start at login. ${dim(`To turn it on: ${cmd("autostart on")}`)}`);
|
|
208
|
+
if (state.on && process.platform === "linux") {
|
|
209
|
+
console.log(dim(` To start it even before anyone logs in: ${cyan("loginctl enable-linger")}`));
|
|
210
|
+
}
|
|
211
|
+
return value && state.on !== (value === "on") ? 1 : 0;
|
|
212
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { emitKeypressEvents } from "node:readline";
|
|
3
|
+
import { styleText } from "node:util";
|
|
4
|
+
import * as p from "@clack/prompts";
|
|
5
|
+
import { command } from "./home.js";
|
|
6
|
+
const colours = Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;
|
|
7
|
+
/** The name on engenty's orange. */
|
|
8
|
+
export const badge = (text) => colours ? `\x1b[48;2;224;83;27m\x1b[97m\x1b[1m ${text} \x1b[0m` : text;
|
|
9
|
+
export const dim = (text) => styleText("dim", text);
|
|
10
|
+
export const bold = (text) => styleText("bold", text);
|
|
11
|
+
export const cyan = (text) => styleText("cyan", text);
|
|
12
|
+
export const ok = styleText("green", "✓");
|
|
13
|
+
export const no = styleText("yellow", "–");
|
|
14
|
+
export const bad = styleText("red", "✗");
|
|
15
|
+
export const live = styleText("green", "●");
|
|
16
|
+
/** A path as the person would write it. */
|
|
17
|
+
export const tilde = (path) => path.startsWith(homedir()) ? `~${path.slice(homedir().length)}` : path;
|
|
18
|
+
/** A command as the person types it, with this install's prefix: `cmd("stop")` → wizards stop. */
|
|
19
|
+
export const cmd = (args = "") => cyan(args ? `${command()} ${args}` : command());
|
|
20
|
+
/**
|
|
21
|
+
* A spinner on a terminal; where nobody watches, only what came of it. The message ends in "…"
|
|
22
|
+
* ("Checking status…"); clack animates its own dots in its place.
|
|
23
|
+
*/
|
|
24
|
+
export function busy(message) {
|
|
25
|
+
if (!process.stdout.isTTY) {
|
|
26
|
+
return { stop: (text) => p.log.step(text), fail: (text) => p.log.warn(text) };
|
|
27
|
+
}
|
|
28
|
+
exitOnCtrlC();
|
|
29
|
+
const spinner = p.spinner();
|
|
30
|
+
spinner.start(message.replace(/…$/, ""));
|
|
31
|
+
return {
|
|
32
|
+
stop: (text) => spinner.stop(text),
|
|
33
|
+
fail: (text) => spinner.error(text),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
let watching = false;
|
|
37
|
+
/**
|
|
38
|
+
* Ctrl-C under a spinner: clack ends the process itself, with code 0, as if all went well. The
|
|
39
|
+
* key is noted before clack sees it (this listener comes first), and the process ends with 130
|
|
40
|
+
* instead, as a command stopped by Ctrl-C does: `wizards setup && …` goes no further.
|
|
41
|
+
*/
|
|
42
|
+
function exitOnCtrlC() {
|
|
43
|
+
if (watching || !process.stdin.isTTY) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
watching = true;
|
|
47
|
+
let pressed = false;
|
|
48
|
+
emitKeypressEvents(process.stdin);
|
|
49
|
+
process.stdin.on("keypress", (_text, key) => {
|
|
50
|
+
if (key?.ctrl && key.name === "c") {
|
|
51
|
+
pressed = true;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
process.on("exit", () => {
|
|
55
|
+
if (pressed) {
|
|
56
|
+
process.exitCode = 130;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { layout } from "./home.js";
|
|
2
|
+
import { nodeIsCurrent } from "./machine.js";
|
|
3
|
+
import { parseUninstall, uninstall } from "./uninstall.js";
|
|
4
|
+
/**
|
|
5
|
+
* `wizards uninstall` on its own: bin/wizards.mjs starts it instead of main.ts, whose modules make
|
|
6
|
+
* the install folder, its data folder and a secret when they load (install-env.ts, env.ts,
|
|
7
|
+
* db/client.ts). An uninstall must find the computer as it is, and leave nothing behind.
|
|
8
|
+
*/
|
|
9
|
+
if (!nodeIsCurrent()) {
|
|
10
|
+
console.error(`engenty wizards needs Node.js 24.11 or newer. This is ${process.version}.`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const options = parseUninstall(process.argv.slice(2));
|
|
14
|
+
if (typeof options === "string") {
|
|
15
|
+
console.error(options);
|
|
16
|
+
process.exitCode = 2;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
process.exitCode = await uninstall(layout(), options);
|
|
20
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync, lstatSync, readdirSync, readlinkSync, rmdirSync, rmSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join, resolve, sep } from "node:path";
|
|
5
|
+
import * as p from "@clack/prompts";
|
|
6
|
+
import { LOGIN_LABEL, present, removeUnit, UNIT, unloadLoginItem } from "./autostart.js";
|
|
7
|
+
import { apps as allApps } from "./connect.js";
|
|
8
|
+
import { findWizardsProcesses, stopProcesses } from "./processes.js";
|
|
9
|
+
import { settings } from "./start.js";
|
|
10
|
+
import { bad, cyan, dim, no, ok } from "./ui.js";
|
|
11
|
+
export const realSystem = () => ({
|
|
12
|
+
userHome: homedir(),
|
|
13
|
+
platform: process.platform,
|
|
14
|
+
env: process.env,
|
|
15
|
+
interactive: Boolean(process.stdin.isTTY && process.stdout.isTTY),
|
|
16
|
+
apps: allApps,
|
|
17
|
+
processes: findWizardsProcesses,
|
|
18
|
+
stop: (pids) => stopProcesses(pids),
|
|
19
|
+
unloadLoginItem,
|
|
20
|
+
removeUnit,
|
|
21
|
+
});
|
|
22
|
+
/** Parts of the install folder that are the person's: kept or deleted with the data. */
|
|
23
|
+
const WITH_DATA = [".env", ".env.local", "plugins"];
|
|
24
|
+
function loginItemPath(system) {
|
|
25
|
+
if (system.platform === "darwin") {
|
|
26
|
+
return join(system.userHome, "Library", "LaunchAgents", `${LOGIN_LABEL}.plist`);
|
|
27
|
+
}
|
|
28
|
+
if (system.platform === "linux") {
|
|
29
|
+
const config = system.env.XDG_CONFIG_HOME || join(system.userHome, ".config");
|
|
30
|
+
return join(config, "systemd", "user", UNIT);
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
/** The links install.sh put into ~/.local/bin that point into the install. */
|
|
35
|
+
function ourLinks(home, system) {
|
|
36
|
+
return ["wizards", "engenty-wizards"]
|
|
37
|
+
.map((name) => join(system.userHome, ".local", "bin", name))
|
|
38
|
+
.filter((link) => {
|
|
39
|
+
try {
|
|
40
|
+
return (lstatSync(link).isSymbolicLink() &&
|
|
41
|
+
resolve(dirname(link), readlinkSync(link)).startsWith(home + sep));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** Works out what an uninstall takes away, without changing anything. */
|
|
49
|
+
export async function makePlan(paths, system) {
|
|
50
|
+
const apps = [];
|
|
51
|
+
for (const app of system.apps(paths)) {
|
|
52
|
+
if (await app.connected().catch(() => false)) {
|
|
53
|
+
apps.push(app);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const item = loginItemPath(system);
|
|
57
|
+
let loginItem = null;
|
|
58
|
+
try {
|
|
59
|
+
loginItem = item && present(item) ? item : null;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Can't look: count it as there, so the uninstall tries and says so.
|
|
63
|
+
loginItem = item;
|
|
64
|
+
}
|
|
65
|
+
const { dataDir } = settings(paths, system.env);
|
|
66
|
+
const program = [];
|
|
67
|
+
const data = existsSync(dataDir) ? [dataDir] : [];
|
|
68
|
+
for (const name of existsSync(paths.home) ? readdirSync(paths.home) : []) {
|
|
69
|
+
const path = join(paths.home, name);
|
|
70
|
+
if (path === dataDir) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const empty = name === "plugins" && readdirSync(path).length === 0;
|
|
74
|
+
(WITH_DATA.includes(name) && !empty ? data : program).push(path);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
home: paths.home,
|
|
78
|
+
apps,
|
|
79
|
+
loginItem,
|
|
80
|
+
processes: system.processes(paths.home),
|
|
81
|
+
program,
|
|
82
|
+
links: ourLinks(paths.home, system),
|
|
83
|
+
data,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** Size of a folder as `du` counts it, e.g. " (805 MB)"; "" where it can't tell. */
|
|
87
|
+
function size(path) {
|
|
88
|
+
const kb = Number(spawnSync("du", ["-sk", path], { encoding: "utf8" }).stdout?.split(/\s/)[0]);
|
|
89
|
+
return kb > 0 ? ` (${kb < 1024 ? `${kb} KB` : `${Math.round(kb / 1024)} MB`})` : "";
|
|
90
|
+
}
|
|
91
|
+
const processes = (n) => `${n} running process${n === 1 ? "" : "es"}`;
|
|
92
|
+
/** `wizards uninstall [--dry-run] [--yes] [--delete-data]`. */
|
|
93
|
+
export async function uninstall(paths, options, system = realSystem()) {
|
|
94
|
+
const t = (path) => path.startsWith(system.userHome + sep) ? `~${path.slice(system.userHome.length)}` : path;
|
|
95
|
+
if (!options.dryRun && !options.yes && !system.interactive) {
|
|
96
|
+
console.error("The uninstall asks before it deletes anything, and there is no terminal to ask in.\n" +
|
|
97
|
+
"Run it with --yes (your data is kept), --yes --delete-data, or --dry-run to only look.");
|
|
98
|
+
return 2;
|
|
99
|
+
}
|
|
100
|
+
const plan = await makePlan(paths, system);
|
|
101
|
+
const steps = [
|
|
102
|
+
...plan.apps.map((app) => `Disconnect ${app.name}`),
|
|
103
|
+
...(plan.loginItem ? [`Remove the login item ${t(plan.loginItem)}`] : []),
|
|
104
|
+
...(plan.processes.length ? [`Stop ${processes(plan.processes.length)}`] : []),
|
|
105
|
+
...(plan.program.length ? [`Delete the program in ${t(plan.home)}${size(plan.home)}`] : []),
|
|
106
|
+
...plan.links.map((link) => `Delete the command ${t(link)}`),
|
|
107
|
+
];
|
|
108
|
+
if (!steps.length && !plan.data.length) {
|
|
109
|
+
console.log(`${ok} engenty wizards isn’t installed here.`);
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
if (steps.length) {
|
|
113
|
+
console.log("\nThis removes engenty wizards:");
|
|
114
|
+
}
|
|
115
|
+
for (const step of steps) {
|
|
116
|
+
console.log(` ${no} ${step}`);
|
|
117
|
+
}
|
|
118
|
+
if (plan.data.length) {
|
|
119
|
+
console.log(`\nYour data: ${plan.data.map((path) => t(path) + size(path)).join(", ")}`);
|
|
120
|
+
console.log(dim(" Kept unless you choose to delete it. A reinstall picks it up again."));
|
|
121
|
+
}
|
|
122
|
+
console.log("");
|
|
123
|
+
if (options.dryRun) {
|
|
124
|
+
console.log(dim("Nothing was changed (--dry-run)."));
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
let deleteData = options.yes && options.deleteData;
|
|
128
|
+
if (!options.yes) {
|
|
129
|
+
if (plan.data.length) {
|
|
130
|
+
const answer = await p.confirm({
|
|
131
|
+
message: "Delete your data too? Your wizards, runs and results are gone for good.",
|
|
132
|
+
initialValue: false,
|
|
133
|
+
});
|
|
134
|
+
if (p.isCancel(answer)) {
|
|
135
|
+
return 130;
|
|
136
|
+
}
|
|
137
|
+
deleteData = answer;
|
|
138
|
+
}
|
|
139
|
+
const go = await p.confirm({
|
|
140
|
+
message: deleteData ? "Uninstall and delete your data now?" : "Uninstall now?",
|
|
141
|
+
});
|
|
142
|
+
if (p.isCancel(go) || !go) {
|
|
143
|
+
p.cancel("Nothing was changed.");
|
|
144
|
+
return 130;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const failed = (what, error) => console.log(`${bad} ${what}: ${error.message.split("\n")[0]}`);
|
|
148
|
+
for (const app of plan.apps) {
|
|
149
|
+
const result = await app
|
|
150
|
+
.disconnect()
|
|
151
|
+
.catch((error) => ({ ok: false, message: error.message }));
|
|
152
|
+
console.log(result.ok ? `${ok} Disconnected ${app.name}` : `${bad} ${app.name}: ${result.message}`);
|
|
153
|
+
}
|
|
154
|
+
if (plan.loginItem) {
|
|
155
|
+
try {
|
|
156
|
+
if (system.platform === "darwin") {
|
|
157
|
+
await system.unloadLoginItem();
|
|
158
|
+
rmSync(plan.loginItem, { force: true });
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
await system.removeUnit(plan.loginItem);
|
|
162
|
+
}
|
|
163
|
+
console.log(`${ok} Removed the login item`);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
failed("The login item", error);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Twice: an AI app's `wizards mcp` may start the studio again meanwhile.
|
|
170
|
+
for (let round = 0; round < 2; round++) {
|
|
171
|
+
const running = system.processes(paths.home);
|
|
172
|
+
if (running.length && !(await system.stop(running.map((proc) => proc.pid))).length) {
|
|
173
|
+
console.log(`${ok} Stopped ${processes(running.length)}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
for (const path of [...plan.program, ...plan.links, ...(deleteData ? plan.data : [])]) {
|
|
177
|
+
try {
|
|
178
|
+
rmSync(path, { recursive: true, force: true });
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
failed(`Couldn’t delete ${t(path)}`, error);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
for (const dir of [plan.home, join(system.userHome, ".engenty")]) {
|
|
185
|
+
try {
|
|
186
|
+
rmdirSync(dir);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// not empty, or not there
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// A second look: what is still there.
|
|
193
|
+
const after = await makePlan(paths, system);
|
|
194
|
+
const left = [
|
|
195
|
+
...after.apps.map((app) => `${app.name} still lists the wizards: ${cyan(`npx wizards disconnect ${app.id}`)}`),
|
|
196
|
+
...(after.loginItem ? [t(after.loginItem)] : []),
|
|
197
|
+
...after.processes.map((proc) => `process ${proc.pid}: ${cyan(`kill -9 ${proc.pid}`)}`),
|
|
198
|
+
...[...after.program, ...after.links, ...(deleteData ? after.data : [])].map(t),
|
|
199
|
+
];
|
|
200
|
+
if (!deleteData && after.data.length) {
|
|
201
|
+
console.log(`${ok} Kept your data: ${after.data.map(t).join(", ")}`);
|
|
202
|
+
}
|
|
203
|
+
if (left.length) {
|
|
204
|
+
console.log(`\n${bad} Still there:`);
|
|
205
|
+
for (const line of left) {
|
|
206
|
+
console.log(` ${line}`);
|
|
207
|
+
}
|
|
208
|
+
return 1;
|
|
209
|
+
}
|
|
210
|
+
console.log(`\n${ok} engenty wizards is uninstalled.\n`);
|
|
211
|
+
return 0;
|
|
212
|
+
}
|
|
213
|
+
/** The options of `uninstall` from its command line; a message when something is off. */
|
|
214
|
+
export function parseUninstall(argv) {
|
|
215
|
+
const options = { dryRun: false, yes: false, deleteData: false };
|
|
216
|
+
for (const arg of argv) {
|
|
217
|
+
if (arg === "--dry-run") {
|
|
218
|
+
options.dryRun = true;
|
|
219
|
+
}
|
|
220
|
+
else if (arg === "--yes" || arg === "-y") {
|
|
221
|
+
options.yes = true;
|
|
222
|
+
}
|
|
223
|
+
else if (arg === "--delete-data") {
|
|
224
|
+
options.deleteData = true;
|
|
225
|
+
}
|
|
226
|
+
else if (arg !== "uninstall") {
|
|
227
|
+
return `Unknown option ${arg}. The uninstall takes --dry-run, --yes and --delete-data.`;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return options;
|
|
231
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { autoUpdatePolicy, noteUpdated } from "./autoupdate.js";
|
|
5
|
+
import { installedByScript, isCheckout, readInstallNote, writeInstallNote, } from "./home.js";
|
|
6
|
+
import { runningRuntime, settings } from "./start.js";
|
|
7
|
+
import { restart } from "./status.js";
|
|
8
|
+
import { cmd, cyan, no, ok } from "./ui.js";
|
|
9
|
+
import { currentVersion } from "./versions.js";
|
|
10
|
+
/** The installer this install was made with; it also updates one. */
|
|
11
|
+
const INSTALLER = "https://engenty.ai/install.sh";
|
|
12
|
+
async function installer(into) {
|
|
13
|
+
const source = process.env.ENGENTY_WIZARDS_INSTALLER?.trim() || INSTALLER;
|
|
14
|
+
if (!/^https?:\/\//.test(source)) {
|
|
15
|
+
return source;
|
|
16
|
+
}
|
|
17
|
+
const response = await fetch(source);
|
|
18
|
+
const text = response.ok ? await response.text() : "";
|
|
19
|
+
// The address answers with the studio's page while a server has no installer yet.
|
|
20
|
+
if (!text.startsWith("#!")) {
|
|
21
|
+
throw new Error(`${source} didn’t return the installer.`);
|
|
22
|
+
}
|
|
23
|
+
const file = join(into, "install.sh");
|
|
24
|
+
writeFileSync(file, text, { mode: 0o700 });
|
|
25
|
+
return file;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Brings an install made by install.sh to the newest version by running the installer again
|
|
29
|
+
* without its questions: Node, the runtime and the command. With `restart`, a runtime that runs
|
|
30
|
+
* restarts into the new version; otherwise it says how.
|
|
31
|
+
*/
|
|
32
|
+
export async function update(paths, options = {}) {
|
|
33
|
+
if (!installedByScript(paths)) {
|
|
34
|
+
console.log(isCheckout()
|
|
35
|
+
? `This is a source checkout. To update: ${cyan("git pull && pnpm install && pnpm build")}`
|
|
36
|
+
: `This copy runs from npm. To update: ${cyan("npx wizards@latest")}`);
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
const before = currentVersion(paths);
|
|
40
|
+
const tmp = mkdtempSync(join(paths.home, "update-"));
|
|
41
|
+
try {
|
|
42
|
+
const script = await installer(tmp);
|
|
43
|
+
const code = await new Promise((done) => {
|
|
44
|
+
const child = spawn("bash", [script, "--no-setup"], { stdio: "inherit" });
|
|
45
|
+
child.on("error", () => done(127));
|
|
46
|
+
child.on("exit", (exit) => done(exit ?? 1));
|
|
47
|
+
});
|
|
48
|
+
if (code !== 0) {
|
|
49
|
+
return code;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error(error.message);
|
|
54
|
+
return 1;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
58
|
+
}
|
|
59
|
+
const after = currentVersion(paths);
|
|
60
|
+
if (before && after) {
|
|
61
|
+
noteUpdated(paths, before, after);
|
|
62
|
+
}
|
|
63
|
+
if (await runningRuntime(settings(paths).dataDir)) {
|
|
64
|
+
if (options.restart) {
|
|
65
|
+
return restart(paths);
|
|
66
|
+
}
|
|
67
|
+
console.log(` Installed. Restart engenty wizards to use the new version: ${cmd("restart")}`);
|
|
68
|
+
}
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
/** `wizards autoupdate [on|off]`: whether updates come by themselves (autoupdate.ts). */
|
|
72
|
+
export function autoUpdateCommand(paths, value) {
|
|
73
|
+
if (value && value !== "on" && value !== "off") {
|
|
74
|
+
console.error(`Use ${cmd("autoupdate on")} or ${cmd("autoupdate off")}.`);
|
|
75
|
+
return 2;
|
|
76
|
+
}
|
|
77
|
+
const installed = installedByScript(paths);
|
|
78
|
+
if (value && installed) {
|
|
79
|
+
writeInstallNote({ ...readInstallNote(paths), autoUpdate: value === "on" }, paths);
|
|
80
|
+
}
|
|
81
|
+
const policy = autoUpdatePolicy(paths, { installed });
|
|
82
|
+
console.log(policy.on
|
|
83
|
+
? `${ok} Updates come by themselves: downloaded in the background, used from the next start.`
|
|
84
|
+
: `${no} Updates don’t come by themselves: ${policy.reason}. To update now: ${cmd("update")}`);
|
|
85
|
+
return value && !installed ? 1 : 0;
|
|
86
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { basename, dirname, join, relative } from "node:path";
|
|
3
|
+
import { parseWizard } from "@engenty-wizards/shared/definition";
|
|
4
|
+
import { PACKAGE_FILES, PACKAGE_MANIFEST } from "@engenty-wizards/shared/wizard-package";
|
|
5
|
+
import { json, readManifest, readPackage } from "../services/package-file.js";
|
|
6
|
+
import { bad, dim, ok } from "./ui.js";
|
|
7
|
+
function workspace(folder) {
|
|
8
|
+
const root = join(folder, PACKAGE_FILES);
|
|
9
|
+
try {
|
|
10
|
+
return readdirSync(root, { recursive: true, withFileTypes: true })
|
|
11
|
+
.filter((entry) => entry.isFile() && entry.name !== ".DS_Store")
|
|
12
|
+
.map((entry) => relative(root, join(entry.parentPath, entry.name)).split("\\").join("/"));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** The definition and the workspace's paths, read the way the import reads them. */
|
|
19
|
+
function read(path) {
|
|
20
|
+
const folder = statSync(path).isDirectory()
|
|
21
|
+
? path
|
|
22
|
+
: basename(path) === PACKAGE_MANIFEST
|
|
23
|
+
? dirname(path)
|
|
24
|
+
: null;
|
|
25
|
+
if (folder) {
|
|
26
|
+
const manifest = readManifest(json(readFileSync(join(folder, PACKAGE_MANIFEST))));
|
|
27
|
+
return { definition: manifest.definition, files: workspace(folder) };
|
|
28
|
+
}
|
|
29
|
+
const { manifest, files } = readPackage(readFileSync(path));
|
|
30
|
+
return { definition: manifest.definition, files: files.map((f) => f.path) };
|
|
31
|
+
}
|
|
32
|
+
export function validatePath(path) {
|
|
33
|
+
let given;
|
|
34
|
+
try {
|
|
35
|
+
given = read(path);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const message = err.code === "ENOENT"
|
|
39
|
+
? "No such file or folder."
|
|
40
|
+
: err.message;
|
|
41
|
+
return { path, ok: false, issues: [{ message }] };
|
|
42
|
+
}
|
|
43
|
+
const parsed = parseWizard(given.definition, given.files);
|
|
44
|
+
return {
|
|
45
|
+
path,
|
|
46
|
+
ok: parsed.ok && parsed.issues.length === 0,
|
|
47
|
+
steps: parsed.ok ? parsed.wizard.steps.length : undefined,
|
|
48
|
+
files: given.files.length,
|
|
49
|
+
issues: parsed.issues,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function validateCommand(paths, asJson) {
|
|
53
|
+
if (!paths.length) {
|
|
54
|
+
console.error("Give a path: a .wizard file, an unpacked package or a wizard JSON file.");
|
|
55
|
+
return 2;
|
|
56
|
+
}
|
|
57
|
+
const results = paths.map(validatePath);
|
|
58
|
+
if (asJson) {
|
|
59
|
+
console.log(JSON.stringify(results, null, 2));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
for (const r of results) {
|
|
63
|
+
if (r.ok) {
|
|
64
|
+
console.log(`${ok} ${r.path} ${dim(`${r.steps} ${r.steps === 1 ? "step" : "steps"}, ${r.files} ${r.files === 1 ? "file" : "files"}`)}`);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const count = `${r.issues.length} ${r.issues.length === 1 ? "issue" : "issues"}`;
|
|
68
|
+
console.log(`${bad} ${r.path} ${dim(count)}`);
|
|
69
|
+
for (const issue of r.issues) {
|
|
70
|
+
console.log(` ${issue.message}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return results.every((r) => r.ok) ? 0 : 1;
|
|
75
|
+
}
|