@engenty/wizards-runtime 0.0.0-stage → 0.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +110 -0
- package/README.md +214 -2
- package/apps/runtime/dist/agents/architect.js +444 -0
- package/apps/runtime/dist/agents/studio-assistant.js +883 -0
- package/apps/runtime/dist/agents/subscription.js +207 -0
- package/apps/runtime/dist/agents/thought.js +21 -0
- package/apps/runtime/dist/agents/website.js +480 -0
- package/apps/runtime/dist/app.js +359 -0
- package/apps/runtime/dist/apple/wizards-apple +0 -0
- package/apps/runtime/dist/assistant/browser.js +26 -0
- package/apps/runtime/dist/assistant/docs.js +158 -0
- package/apps/runtime/dist/assistant/knows.js +353 -0
- package/apps/runtime/dist/assistant/primer.js +26 -0
- package/apps/runtime/dist/assistant/runs.js +24 -0
- package/apps/runtime/dist/auth/account.js +175 -0
- package/apps/runtime/dist/auth/device.js +112 -0
- package/apps/runtime/dist/auth/index.js +358 -0
- package/apps/runtime/dist/auth/keys.js +55 -0
- package/apps/runtime/dist/auth/local-ticket.js +26 -0
- package/apps/runtime/dist/authoring/example.js +74 -0
- package/apps/runtime/dist/authoring/guide.js +433 -0
- package/apps/runtime/dist/authoring/ops.js +117 -0
- package/apps/runtime/dist/browser/fast/action-space.js +160 -0
- package/apps/runtime/dist/browser/fast/classifier.js +91 -0
- package/apps/runtime/dist/browser/fast/decide.js +171 -0
- package/apps/runtime/dist/browser/fast/driver.js +141 -0
- package/apps/runtime/dist/browser/fast/instructions.js +33 -0
- package/apps/runtime/dist/browser/fast/run.js +249 -0
- package/apps/runtime/dist/browser/fast/span-picker.js +153 -0
- package/apps/runtime/dist/browser/fast/text-helper.js +178 -0
- package/apps/runtime/dist/browser/snapshot.js +335 -0
- package/apps/runtime/dist/cli/account.js +385 -0
- package/apps/runtime/dist/cli/autostart.js +182 -0
- package/apps/runtime/dist/cli/autoupdate.js +221 -0
- package/apps/runtime/dist/cli/clients.js +44 -0
- package/apps/runtime/dist/cli/connect.js +540 -0
- package/apps/runtime/dist/cli/environment.js +93 -0
- package/apps/runtime/dist/cli/exec.js +45 -0
- package/apps/runtime/dist/cli/features.js +50 -0
- package/apps/runtime/dist/cli/home.js +88 -0
- package/apps/runtime/dist/cli/install-env.js +33 -0
- package/apps/runtime/dist/cli/machine.js +107 -0
- package/apps/runtime/dist/cli/main.js +222 -0
- package/apps/runtime/dist/cli/mcp.js +136 -0
- package/apps/runtime/dist/cli/menu.js +202 -0
- package/apps/runtime/dist/cli/processes.js +72 -0
- package/apps/runtime/dist/cli/report.js +66 -0
- package/apps/runtime/dist/cli/setup.js +335 -0
- package/apps/runtime/dist/cli/start.js +276 -0
- package/apps/runtime/dist/cli/status.js +203 -0
- package/apps/runtime/dist/cli/ui.js +59 -0
- package/apps/runtime/dist/cli/uninstall-main.js +20 -0
- package/apps/runtime/dist/cli/uninstall.js +231 -0
- package/apps/runtime/dist/cli/update.js +86 -0
- package/apps/runtime/dist/cli/validate.js +75 -0
- package/apps/runtime/dist/cli/versions.js +123 -0
- package/apps/runtime/dist/connectors/builtin.js +86 -0
- package/apps/runtime/dist/connectors/external.js +409 -0
- package/apps/runtime/dist/connectors/gmail.js +107 -0
- package/apps/runtime/dist/connectors/imap.js +261 -0
- package/apps/runtime/dist/connectors/index.js +325 -0
- package/apps/runtime/dist/connectors/mail.js +72 -0
- package/apps/runtime/dist/connectors/outlook.js +90 -0
- package/apps/runtime/dist/connectors/plugin-connections.js +343 -0
- package/apps/runtime/dist/connectors/via-account.js +65 -0
- package/apps/runtime/dist/credits/credits.js +100 -0
- package/apps/runtime/dist/credits/estimate.js +152 -0
- package/apps/runtime/dist/db/adopt.js +149 -0
- package/apps/runtime/dist/db/client.js +173 -0
- package/apps/runtime/dist/db/control-schema.js +133 -0
- package/apps/runtime/dist/db/migrations/control/0000_last_absorbing_man.sql +47 -0
- package/apps/runtime/dist/db/migrations/control/0001_gorgeous_nicolaos.sql +41 -0
- package/apps/runtime/dist/db/migrations/control/0002_secret_penance.sql +1 -0
- package/apps/runtime/dist/db/migrations/control/0003_nasty_mordo.sql +3 -0
- package/apps/runtime/dist/db/migrations/control/0004_breezy_eddie_brock.sql +6 -0
- package/apps/runtime/dist/db/migrations/control/0005_chilly_oracle.sql +1 -0
- package/apps/runtime/dist/db/migrations/control/0006_sleepy_mojo.sql +1 -0
- package/apps/runtime/dist/db/migrations/control/0007_common_the_hand.sql +15 -0
- package/apps/runtime/dist/db/migrations/control/0008_runner.sql +8 -0
- package/apps/runtime/dist/db/migrations/control/0009_plugin_claim.sql +9 -0
- package/apps/runtime/dist/db/migrations/control/0010_tan_snowbird.sql +6 -0
- package/apps/runtime/dist/db/migrations/control/meta/0000_snapshot.json +311 -0
- package/apps/runtime/dist/db/migrations/control/meta/0001_snapshot.json +599 -0
- package/apps/runtime/dist/db/migrations/control/meta/0002_snapshot.json +607 -0
- package/apps/runtime/dist/db/migrations/control/meta/0003_snapshot.json +311 -0
- package/apps/runtime/dist/db/migrations/control/meta/0004_snapshot.json +350 -0
- package/apps/runtime/dist/db/migrations/control/meta/0005_snapshot.json +358 -0
- package/apps/runtime/dist/db/migrations/control/meta/0006_snapshot.json +365 -0
- package/apps/runtime/dist/db/migrations/control/meta/0007_snapshot.json +460 -0
- package/apps/runtime/dist/db/migrations/control/meta/0008_snapshot.json +505 -0
- package/apps/runtime/dist/db/migrations/control/meta/0009_snapshot.json +561 -0
- package/apps/runtime/dist/db/migrations/control/meta/0010_snapshot.json +600 -0
- package/apps/runtime/dist/db/migrations/control/meta/_journal.json +83 -0
- package/apps/runtime/dist/db/migrations/tenant/0000_eminent_freak.sql +188 -0
- package/apps/runtime/dist/db/migrations/tenant/0001_salty_master_chief.sql +1 -0
- package/apps/runtime/dist/db/migrations/tenant/0002_cloudy_firebird.sql +1 -0
- package/apps/runtime/dist/db/migrations/tenant/0003_brown_warbound.sql +52 -0
- package/apps/runtime/dist/db/migrations/tenant/0004_romantic_nocturne.sql +6 -0
- package/apps/runtime/dist/db/migrations/tenant/0005_reflective_forgotten_one.sql +2 -0
- package/apps/runtime/dist/db/migrations/tenant/0006_hard_war_machine.sql +30 -0
- package/apps/runtime/dist/db/migrations/tenant/0007_space_data.sql +43 -0
- package/apps/runtime/dist/db/migrations/tenant/0008_run_event_note.sql +1 -0
- package/apps/runtime/dist/db/migrations/tenant/0009_knowledge.sql +104 -0
- package/apps/runtime/dist/db/migrations/tenant/0010_plugin_connection.sql +15 -0
- package/apps/runtime/dist/db/migrations/tenant/0011_runners.sql +2 -0
- package/apps/runtime/dist/db/migrations/tenant/0012_assistant_chat.sql +40 -0
- package/apps/runtime/dist/db/migrations/tenant/0013_run_origin.sql +1 -0
- package/apps/runtime/dist/db/migrations/tenant/0014_run_answer.sql +2 -0
- package/apps/runtime/dist/db/migrations/tenant/0015_device_calls.sql +13 -0
- package/apps/runtime/dist/db/migrations/tenant/0016_even_trish_tilby.sql +12 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0000_snapshot.json +1323 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0001_snapshot.json +1330 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0002_snapshot.json +1337 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0003_snapshot.json +1605 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0004_snapshot.json +1645 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0005_snapshot.json +1659 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0006_snapshot.json +1696 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0007_snapshot.json +2012 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0008_snapshot.json +2019 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0009_snapshot.json +2837 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0010_snapshot.json +2942 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0011_snapshot.json +2956 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0012_snapshot.json +3132 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0013_snapshot.json +3139 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0014_snapshot.json +3154 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0015_snapshot.json +3243 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0016_snapshot.json +3326 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/_journal.json +125 -0
- package/apps/runtime/dist/db/schema.js +602 -0
- package/apps/runtime/dist/debug.js +196 -0
- package/apps/runtime/dist/docs/dev/index.md +41 -0
- package/apps/runtime/dist/docs/dev/meta.json +7 -0
- package/apps/runtime/dist/docs/dev/plugins/connections.md +74 -0
- package/apps/runtime/dist/docs/dev/plugins/events.md +89 -0
- package/apps/runtime/dist/docs/dev/plugins/examples.md +101 -0
- package/apps/runtime/dist/docs/dev/plugins/index.md +78 -0
- package/apps/runtime/dist/docs/dev/plugins/layout.md +90 -0
- package/apps/runtime/dist/docs/dev/plugins/meta.json +28 -0
- package/apps/runtime/dist/docs/dev/plugins/quick-start.md +94 -0
- package/apps/runtime/dist/docs/dev/plugins/reference.md +348 -0
- package/apps/runtime/dist/docs/dev/plugins/reloading.md +76 -0
- package/apps/runtime/dist/docs/dev/plugins/routes.md +185 -0
- package/apps/runtime/dist/docs/dev/plugins/runners.md +230 -0
- package/apps/runtime/dist/docs/dev/plugins/server.md +281 -0
- package/apps/runtime/dist/docs/dev/plugins/shipping.md +79 -0
- package/apps/runtime/dist/docs/dev/plugins/space.md +297 -0
- package/apps/runtime/dist/docs/dev/plugins/starters.md +70 -0
- package/apps/runtime/dist/docs/dev/plugins/studio.md +363 -0
- package/apps/runtime/dist/docs/dev/plugins/styling.md +129 -0
- package/apps/runtime/dist/docs/dev/plugins/tables.md +104 -0
- package/apps/runtime/dist/docs/dev/plugins/tools.md +139 -0
- package/apps/runtime/dist/docs/dev/wizard-format.md +125 -0
- package/apps/runtime/dist/docs/meta.json +3 -0
- package/apps/runtime/dist/docs/user/ai-apps.md +112 -0
- package/apps/runtime/dist/docs/user/assistant.md +77 -0
- package/apps/runtime/dist/docs/user/build-a-wizard.md +116 -0
- package/apps/runtime/dist/docs/user/command-line.md +83 -0
- package/apps/runtime/dist/docs/user/connectors.md +90 -0
- package/apps/runtime/dist/docs/user/create-account.md +52 -0
- package/apps/runtime/dist/docs/user/data.md +66 -0
- package/apps/runtime/dist/docs/user/first-start.md +60 -0
- package/apps/runtime/dist/docs/user/index.md +49 -0
- package/apps/runtime/dist/docs/user/install.md +123 -0
- package/apps/runtime/dist/docs/user/local-only.md +42 -0
- package/apps/runtime/dist/docs/user/meta.json +32 -0
- package/apps/runtime/dist/docs/user/models.md +156 -0
- package/apps/runtime/dist/docs/user/plugins.md +71 -0
- package/apps/runtime/dist/docs/user/run.md +98 -0
- package/apps/runtime/dist/docs/user/server.md +52 -0
- package/apps/runtime/dist/docs/user/space.md +126 -0
- package/apps/runtime/dist/docs/user/steps.md +220 -0
- package/apps/runtime/dist/docs/user/test-and-share.md +224 -0
- package/apps/runtime/dist/docs/user/troubleshooting.md +67 -0
- package/apps/runtime/dist/docs/user/wordpress.md +121 -0
- package/apps/runtime/dist/documents/parse.js +246 -0
- package/apps/runtime/dist/engenty/connections-external/build-connector.js +193 -0
- package/apps/runtime/dist/engenty/connections-external/errors.js +11 -0
- package/apps/runtime/dist/engenty/connections-external/import-service.js +270 -0
- package/apps/runtime/dist/engenty/connections-external/importer/classify.js +34 -0
- package/apps/runtime/dist/engenty/connections-external/importer/map-auth.js +185 -0
- package/apps/runtime/dist/engenty/connections-external/importer/normalize-mcp.js +63 -0
- package/apps/runtime/dist/engenty/connections-external/importer/normalize-openapi.js +130 -0
- package/apps/runtime/dist/engenty/connections-external/invoke/http-invoker.js +143 -0
- package/apps/runtime/dist/engenty/connections-external/invoke/mcp-client.js +143 -0
- package/apps/runtime/dist/engenty/connections-external/net/guarded-fetch.js +119 -0
- package/apps/runtime/dist/engenty/connections-external/oauth-dcr.js +88 -0
- package/apps/runtime/dist/engenty/connections-external/registry-client.js +336 -0
- package/apps/runtime/dist/engenty/connections-external/registry-source.js +82 -0
- package/apps/runtime/dist/engenty/connections-external/types.js +7 -0
- package/apps/runtime/dist/engenty/connections-github/connector.js +209 -0
- package/apps/runtime/dist/engenty/connections-google/connectors/calendar.js +381 -0
- package/apps/runtime/dist/engenty/connections-google/connectors/contacts.js +94 -0
- package/apps/runtime/dist/engenty/connections-google/connectors/drive.js +290 -0
- package/apps/runtime/dist/engenty/connections-google/connectors/gmail.js +567 -0
- package/apps/runtime/dist/engenty/connections-google/definitions.js +11 -0
- package/apps/runtime/dist/engenty/connections-google/shared.js +73 -0
- package/apps/runtime/dist/engenty/connections-hubspot/connector.js +140 -0
- package/apps/runtime/dist/engenty/connections-microsoft/action.js +17 -0
- package/apps/runtime/dist/engenty/connections-microsoft/graph.js +114 -0
- package/apps/runtime/dist/engenty/connections-microsoft/onedrive.js +286 -0
- package/apps/runtime/dist/engenty/connections-microsoft/outlook.js +492 -0
- package/apps/runtime/dist/engenty/connections-s3/s3.js +328 -0
- package/apps/runtime/dist/engenty/connections-sdk/files-capability.js +86 -0
- package/apps/runtime/dist/engenty/connections-sdk/oauth2.js +150 -0
- package/apps/runtime/dist/engenty/connections-sdk/registry.js +89 -0
- package/apps/runtime/dist/engenty/connections-sdk/storage-capability.js +84 -0
- package/apps/runtime/dist/engenty/connections-sdk/types.js +30 -0
- package/apps/runtime/dist/engenty/connections-slack/connector.js +360 -0
- package/apps/runtime/dist/engenty/csv-import/csv-matrix.js +178 -0
- package/apps/runtime/dist/engenty/csv-import/import-sources.js +87 -0
- package/apps/runtime/dist/engenty/csv-import/parse-csv.js +129 -0
- package/apps/runtime/dist/engenty/csv-import/serialize-csv.js +20 -0
- package/apps/runtime/dist/engenty/csv-import/types.js +1 -0
- package/apps/runtime/dist/engenty/csv-import/xlsx-workbook.js +159 -0
- package/apps/runtime/dist/engenty/doc-converter/interface.js +9 -0
- package/apps/runtime/dist/engenty/doc-converter/page-break.js +92 -0
- package/apps/runtime/dist/engenty/doc-converter/providers/local/index.js +72 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/classifier.js +30 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/index.js +4 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/invoice.js +73 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/receipt.js +63 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/shared.js +40 -0
- package/apps/runtime/dist/engenty/search-index/chunks.js +164 -0
- package/apps/runtime/dist/engenty/search-index/contracts.js +9 -0
- package/apps/runtime/dist/engenty/shims/connections-sdk.js +39 -0
- package/apps/runtime/dist/engenty/shims/plugin-sdk.js +1 -0
- package/apps/runtime/dist/engenty/shims/web-ingest.js +19 -0
- package/apps/runtime/dist/engenty/web-ingest/ssrf.js +277 -0
- package/apps/runtime/dist/engine/asks.js +82 -0
- package/apps/runtime/dist/engine/decide.js +82 -0
- package/apps/runtime/dist/engine/device.js +194 -0
- package/apps/runtime/dist/engine/events.js +128 -0
- package/apps/runtime/dist/engine/input.js +208 -0
- package/apps/runtime/dist/engine/owner.js +32 -0
- package/apps/runtime/dist/engine/prepare.js +90 -0
- package/apps/runtime/dist/engine/push.js +58 -0
- package/apps/runtime/dist/engine/requirements.js +355 -0
- package/apps/runtime/dist/engine/resources.js +198 -0
- package/apps/runtime/dist/engine/runner.js +970 -0
- package/apps/runtime/dist/engine/steps.js +1000 -0
- package/apps/runtime/dist/engine/surface.js +91 -0
- package/apps/runtime/dist/engine/template.js +240 -0
- package/apps/runtime/dist/engine/types.js +4 -0
- package/apps/runtime/dist/env.js +295 -0
- package/apps/runtime/dist/features.js +123 -0
- package/apps/runtime/dist/files/blobs.js +22 -0
- package/apps/runtime/dist/files/objects.js +86 -0
- package/apps/runtime/dist/files/storage.js +120 -0
- package/apps/runtime/dist/files/web-images.js +101 -0
- package/apps/runtime/dist/film/project.js +257 -0
- package/apps/runtime/dist/film/skills.js +91 -0
- package/apps/runtime/dist/film/sounds.js +122 -0
- package/apps/runtime/dist/film/step.js +289 -0
- package/apps/runtime/dist/film/tools.js +99 -0
- package/apps/runtime/dist/geocode.js +58 -0
- package/apps/runtime/dist/harness/antigravity.js +129 -0
- package/apps/runtime/dist/harness/apple.js +270 -0
- package/apps/runtime/dist/harness/claude.js +147 -0
- package/apps/runtime/dist/harness/codex.js +229 -0
- package/apps/runtime/dist/harness/cursor.js +93 -0
- package/apps/runtime/dist/harness/env.js +124 -0
- package/apps/runtime/dist/harness/index.js +95 -0
- package/apps/runtime/dist/harness/model.js +279 -0
- package/apps/runtime/dist/harness/prompt.js +121 -0
- package/apps/runtime/dist/harness/terminal.js +194 -0
- package/apps/runtime/dist/harness/types.js +7 -0
- package/apps/runtime/dist/index.js +113 -0
- package/apps/runtime/dist/limits.js +81 -0
- package/apps/runtime/dist/link-preview.js +60 -0
- package/apps/runtime/dist/log.js +106 -0
- package/apps/runtime/dist/manage.js +249 -0
- package/apps/runtime/dist/mcp/auth.js +161 -0
- package/apps/runtime/dist/mcp/bridge.js +59 -0
- package/apps/runtime/dist/mcp/flow-app.js +97 -0
- package/apps/runtime/dist/mcp/handler.js +54 -0
- package/apps/runtime/dist/mcp/scopes.js +14 -0
- package/apps/runtime/dist/mcp/seen.js +65 -0
- package/apps/runtime/dist/mcp/tools.js +572 -0
- package/apps/runtime/dist/media/conversation.js +167 -0
- package/apps/runtime/dist/media/ffmpeg.js +121 -0
- package/apps/runtime/dist/media/generate.js +120 -0
- package/apps/runtime/dist/media/marking.js +121 -0
- package/apps/runtime/dist/media/transcribe.js +198 -0
- package/apps/runtime/dist/model-errors.js +42 -0
- package/apps/runtime/dist/models.js +1164 -0
- package/apps/runtime/dist/plugin.js +61 -0
- package/apps/runtime/dist/plugins/channels.js +78 -0
- package/apps/runtime/dist/plugins/claims.js +56 -0
- package/apps/runtime/dist/plugins/discovery.js +155 -0
- package/apps/runtime/dist/plugins/events.js +63 -0
- package/apps/runtime/dist/plugins/jobs.js +64 -0
- package/apps/runtime/dist/plugins/loader.js +508 -0
- package/apps/runtime/dist/plugins/migrations.js +69 -0
- package/apps/runtime/dist/plugins/pro-keys.js +34 -0
- package/apps/runtime/dist/plugins/pro-state.js +83 -0
- package/apps/runtime/dist/plugins/pro.js +310 -0
- package/apps/runtime/dist/plugins/public.js +44 -0
- package/apps/runtime/dist/plugins/registry.js +122 -0
- package/apps/runtime/dist/plugins/runs.js +210 -0
- package/apps/runtime/dist/render/browser-path.js +54 -0
- package/apps/runtime/dist/render/chromium.js +98 -0
- package/apps/runtime/dist/render/convert.js +158 -0
- package/apps/runtime/dist/render/downloads.js +299 -0
- package/apps/runtime/dist/render/guard.js +25 -0
- package/apps/runtime/dist/render/shaped.js +137 -0
- package/apps/runtime/dist/routes/api.js +440 -0
- package/apps/runtime/dist/routes/debug.js +42 -0
- package/apps/runtime/dist/routes/delivery.js +90 -0
- package/apps/runtime/dist/routes/internal.js +81 -0
- package/apps/runtime/dist/routes/lang.js +25 -0
- package/apps/runtime/dist/routes/marketplace.js +43 -0
- package/apps/runtime/dist/routes/plugin-public.js +113 -0
- package/apps/runtime/dist/routes/plugins.js +212 -0
- package/apps/runtime/dist/routes/runs.js +1422 -0
- package/apps/runtime/dist/routes/studio.js +1629 -0
- package/apps/runtime/dist/routes/wizard-stream.js +30 -0
- package/apps/runtime/dist/running.js +39 -0
- package/apps/runtime/dist/sandbox/docker.js +75 -0
- package/apps/runtime/dist/sandbox/index.js +23 -0
- package/apps/runtime/dist/sandbox/types.js +1 -0
- package/apps/runtime/dist/secrets/crypto.js +28 -0
- package/apps/runtime/dist/secrets/signing.js +52 -0
- package/apps/runtime/dist/secrets/vault.js +59 -0
- package/apps/runtime/dist/services/access.js +88 -0
- package/apps/runtime/dist/services/api.js +248 -0
- package/apps/runtime/dist/services/architect.js +95 -0
- package/apps/runtime/dist/services/assistant-chats.js +311 -0
- package/apps/runtime/dist/services/brand.js +85 -0
- package/apps/runtime/dist/services/cloud.js +456 -0
- package/apps/runtime/dist/services/draft-events.js +27 -0
- package/apps/runtime/dist/services/engenty-shapes.js +71 -0
- package/apps/runtime/dist/services/errors.js +29 -0
- package/apps/runtime/dist/services/files.js +178 -0
- package/apps/runtime/dist/services/knowledge-model.js +559 -0
- package/apps/runtime/dist/services/knowledge.js +721 -0
- package/apps/runtime/dist/services/links.js +16 -0
- package/apps/runtime/dist/services/marketplace.js +492 -0
- package/apps/runtime/dist/services/onboarding.js +152 -0
- package/apps/runtime/dist/services/package-file.js +82 -0
- package/apps/runtime/dist/services/package.js +170 -0
- package/apps/runtime/dist/services/profile.js +51 -0
- package/apps/runtime/dist/services/project-files.js +439 -0
- package/apps/runtime/dist/services/project-index.js +707 -0
- package/apps/runtime/dist/services/projects.js +387 -0
- package/apps/runtime/dist/services/relevance.js +58 -0
- package/apps/runtime/dist/services/runners.js +178 -0
- package/apps/runtime/dist/services/runs.js +524 -0
- package/apps/runtime/dist/services/shares.js +130 -0
- package/apps/runtime/dist/services/site.js +270 -0
- package/apps/runtime/dist/services/space-categories.js +861 -0
- package/apps/runtime/dist/services/space-data.js +792 -0
- package/apps/runtime/dist/services/space-origin.js +207 -0
- package/apps/runtime/dist/services/spaces.js +656 -0
- package/apps/runtime/dist/services/translations.js +306 -0
- package/apps/runtime/dist/services/widgets.js +34 -0
- package/apps/runtime/dist/services/wizard-icon.js +157 -0
- package/apps/runtime/dist/services/wizards.js +420 -0
- package/apps/runtime/dist/settings.js +16 -0
- package/apps/runtime/dist/store/errors.js +4 -0
- package/apps/runtime/dist/store/index.js +299 -0
- package/apps/runtime/dist/store/shared-lists.js +123 -0
- package/apps/runtime/dist/tenants/control.js +238 -0
- package/apps/runtime/dist/tenants/tenant.js +26 -0
- package/apps/runtime/dist/texts.js +207 -0
- package/apps/runtime/dist/tools/browser.js +703 -0
- package/apps/runtime/dist/tools/connector.js +204 -0
- package/apps/runtime/dist/tools/index.js +291 -0
- package/apps/runtime/dist/tools/mail.js +104 -0
- package/apps/runtime/dist/tools/net-guard.js +170 -0
- package/apps/runtime/dist/tools/pages.js +81 -0
- package/apps/runtime/dist/tools/plugin.js +180 -0
- package/apps/runtime/dist/tools/project.js +154 -0
- package/apps/runtime/dist/tools/shared.js +69 -0
- package/apps/runtime/dist/tools/store.js +238 -0
- package/apps/runtime/dist/update.js +113 -0
- package/apps/runtime/dist/widgets/bundle.js +99 -0
- package/apps/runtime/dist/widgets/render.js +329 -0
- package/apps/runtime/dist/widgets/runtime.js +108 -0
- package/apps/runtime/dist/widgets/script.js +30 -0
- package/apps/runtime/dist/widgets/step.js +223 -0
- package/apps/web/dist/ai-labels/ai-black.svg +20 -0
- package/apps/web/dist/ai-labels/ai-generated-black.svg +31 -0
- package/apps/web/dist/ai-labels/ai-generated-white.svg +32 -0
- package/apps/web/dist/ai-labels/ai-modified-black.svg +30 -0
- package/apps/web/dist/ai-labels/ai-modified-white.svg +31 -0
- package/apps/web/dist/ai-labels/ai-white.svg +21 -0
- package/apps/web/dist/assets/AboutDialog-D4mvc-zu.js +1 -0
- package/apps/web/dist/assets/ChangelogDialog-DLqpJsF6.js +1 -0
- package/apps/web/dist/assets/ChatView-3laypRcE.js +10 -0
- package/apps/web/dist/assets/EditorPage-BalA5U2Y.js +3 -0
- package/apps/web/dist/assets/FlowPreview-CusP7ci9.js +1 -0
- package/apps/web/dist/assets/Harness-BrP-ENHg.css +1 -0
- package/apps/web/dist/assets/Harness-iYLtOLaK.js +16 -0
- package/apps/web/dist/assets/NewWizardChannels-CbwJ9A56.js +1 -0
- package/apps/web/dist/assets/NewWizardPage-BOBYiB9i.js +7 -0
- package/apps/web/dist/assets/OnboardingPage-CUwCiVIr.js +1 -0
- package/apps/web/dist/assets/ProjectPage-Bb16MdYG.js +1 -0
- package/apps/web/dist/assets/PublicRunner-BCt7Q6C-.js +1 -0
- package/apps/web/dist/assets/ReadOnly-kIHX2TEy.js +1 -0
- package/apps/web/dist/assets/RunDrawer-hZ9oeSXu.js +4 -0
- package/apps/web/dist/assets/RunnerView-DUS9fPmx.js +1 -0
- package/apps/web/dist/assets/SettingsPage-BzwR50fi.js +1 -0
- package/apps/web/dist/assets/SetupPage-gAp7rPxp.js +1 -0
- package/apps/web/dist/assets/SharePage-DqZWHva_.js +1 -0
- package/apps/web/dist/assets/changelog-DugmCNSf.js +1 -0
- package/apps/web/dist/assets/engenty-eXZ-EAwd.js +1 -0
- package/apps/web/dist/assets/esm-DXeMu8Lb.js +7 -0
- package/apps/web/dist/assets/fluffy-engenty-ClRou7yu.js +456 -0
- package/apps/web/dist/assets/index-AfUa8xKD.css +1 -0
- package/apps/web/dist/assets/index-C5Sm7tTR.js +14 -0
- package/apps/web/dist/assets/jsx-runtime-BNakU3Ej.js +1 -0
- package/apps/web/dist/assets/lock-R_CfU0Xo.js +1 -0
- package/apps/web/dist/assets/oss-credits-cZ9NUaLZ.js +1 -0
- package/apps/web/dist/assets/pdfmake-Cx9scTbD.js +228 -0
- package/apps/web/dist/assets/phone-CgrIS4_-.js +1 -0
- package/apps/web/dist/assets/preload-helper-CNEI7N0N.js +1 -0
- package/apps/web/dist/assets/qr-scanner-worker.min-CJaXo3yu.js +98 -0
- package/apps/web/dist/assets/qr-scanner.min-C_UI0gH-.js +1 -0
- package/apps/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/apps/web/dist/assets/settings-menu-2IMOOlLl.js +1 -0
- package/apps/web/dist/assets/ui-dzGvc3xk.js +137 -0
- package/apps/web/dist/assets/upload-BSuTilFF.js +1 -0
- package/apps/web/dist/assets/vfs_fonts-DllDSYt1.js +1 -0
- package/apps/web/dist/embed.js +266 -0
- package/apps/web/dist/favicon.svg +1 -0
- package/apps/web/dist/icons/apple-touch-icon.png +0 -0
- package/apps/web/dist/icons/icon-192.png +0 -0
- package/apps/web/dist/icons/icon-512.png +0 -0
- package/apps/web/dist/icons/icon-maskable-512.png +0 -0
- package/apps/web/dist/index.html +48 -0
- package/apps/web/dist/install.sh +577 -0
- package/apps/web/dist/manifest.webmanifest +21 -0
- package/apps/web/dist/mcp/flow.html +980 -0
- package/apps/web/dist/sw.js +15 -0
- package/bin/wizards.mjs +288 -0
- package/modules/README.md +15 -0
- package/node_modules/@engenty/wizards/dist/plugin/index.d.ts +1150 -0
- package/node_modules/@engenty/wizards/dist/plugin/index.js +4 -0
- package/node_modules/@engenty/wizards/dist/plugin/studio.d.ts +322 -0
- package/node_modules/@engenty/wizards/dist/plugin/studio.js +4 -0
- package/node_modules/@engenty/wizards/dist/plugin/thread.d.ts +174 -0
- package/node_modules/@engenty/wizards/dist/plugin/thread.js +821 -0
- package/node_modules/@engenty/wizards/package.json +11 -0
- package/node_modules/@engenty-wizards/shared/dist/assistant.d.ts +174 -0
- package/node_modules/@engenty-wizards/shared/dist/assistant.js +65 -0
- package/node_modules/@engenty-wizards/shared/dist/changes.d.ts +22 -0
- package/node_modules/@engenty-wizards/shared/dist/changes.js +61 -0
- package/node_modules/@engenty-wizards/shared/dist/connectors.d.ts +77 -0
- package/node_modules/@engenty-wizards/shared/dist/connectors.js +2 -0
- package/node_modules/@engenty-wizards/shared/dist/decision.d.ts +76 -0
- package/node_modules/@engenty-wizards/shared/dist/decision.js +147 -0
- package/node_modules/@engenty-wizards/shared/dist/definition.d.ts +2922 -0
- package/node_modules/@engenty-wizards/shared/dist/definition.js +1920 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.d.ts +5 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.js +132 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.d.ts +11 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.js +209 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.d.ts +532 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.js +217 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.d.ts +3 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.js +3 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.d.ts +14 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.js +166 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.d.ts +33 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.js +99 -0
- package/node_modules/@engenty-wizards/shared/dist/feature-flags.d.ts +78 -0
- package/node_modules/@engenty-wizards/shared/dist/feature-flags.js +70 -0
- package/node_modules/@engenty-wizards/shared/dist/features.d.ts +41 -0
- package/node_modules/@engenty-wizards/shared/dist/features.js +89 -0
- package/node_modules/@engenty-wizards/shared/dist/fit.d.ts +71 -0
- package/node_modules/@engenty-wizards/shared/dist/fit.js +382 -0
- package/node_modules/@engenty-wizards/shared/dist/json-schema.d.ts +14 -0
- package/node_modules/@engenty-wizards/shared/dist/json-schema.js +66 -0
- package/node_modules/@engenty-wizards/shared/dist/knowledge.d.ts +199 -0
- package/node_modules/@engenty-wizards/shared/dist/knowledge.js +68 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.d.ts +35 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.js +107 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace-search.d.ts +20 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace-search.js +136 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace.d.ts +227 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace.js +354 -0
- package/node_modules/@engenty-wizards/shared/dist/merge.d.ts +7 -0
- package/node_modules/@engenty-wizards/shared/dist/merge.js +40 -0
- package/node_modules/@engenty-wizards/shared/dist/numbers.d.ts +24 -0
- package/node_modules/@engenty-wizards/shared/dist/numbers.js +54 -0
- package/node_modules/@engenty-wizards/shared/dist/projects.d.ts +224 -0
- package/node_modules/@engenty-wizards/shared/dist/projects.js +319 -0
- package/node_modules/@engenty-wizards/shared/dist/providers.d.ts +101 -0
- package/node_modules/@engenty-wizards/shared/dist/providers.js +390 -0
- package/node_modules/@engenty-wizards/shared/dist/run.d.ts +680 -0
- package/node_modules/@engenty-wizards/shared/dist/run.js +620 -0
- package/node_modules/@engenty-wizards/shared/dist/runner-texts.d.ts +546 -0
- package/node_modules/@engenty-wizards/shared/dist/runner-texts.js +523 -0
- package/node_modules/@engenty-wizards/shared/dist/runners.d.ts +93 -0
- package/node_modules/@engenty-wizards/shared/dist/runners.js +146 -0
- package/node_modules/@engenty-wizards/shared/dist/shape.d.ts +102 -0
- package/node_modules/@engenty-wizards/shared/dist/shape.js +318 -0
- package/node_modules/@engenty-wizards/shared/dist/space-data.d.ts +89 -0
- package/node_modules/@engenty-wizards/shared/dist/space-data.js +47 -0
- package/node_modules/@engenty-wizards/shared/dist/store.d.ts +117 -0
- package/node_modules/@engenty-wizards/shared/dist/store.js +81 -0
- package/node_modules/@engenty-wizards/shared/dist/surface.d.ts +115 -0
- package/node_modules/@engenty-wizards/shared/dist/surface.js +442 -0
- package/node_modules/@engenty-wizards/shared/dist/texts.d.ts +45 -0
- package/node_modules/@engenty-wizards/shared/dist/texts.js +54 -0
- package/node_modules/@engenty-wizards/shared/dist/translation.d.ts +23 -0
- package/node_modules/@engenty-wizards/shared/dist/translation.js +154 -0
- package/node_modules/@engenty-wizards/shared/dist/wizard-package.d.ts +48 -0
- package/node_modules/@engenty-wizards/shared/dist/wizard-package.js +49 -0
- package/node_modules/@engenty-wizards/shared/dist/workspace.d.ts +16 -0
- package/node_modules/@engenty-wizards/shared/dist/workspace.js +51 -0
- package/node_modules/@engenty-wizards/shared/package.json +10 -0
- package/package.json +77 -4
- package/plugin/.claude-plugin/plugin.json +9 -0
- package/plugin/.mcp.json +8 -0
- package/plugin/commands/wizard.md +8 -0
- package/plugin/skills/build-wizard/SKILL.md +27 -0
- package/plugin/skills/use-wizard/SKILL.md +18 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { release } from "node:os";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { langOf, SPEECH_LOCALES } from "@engenty-wizards/shared/definition";
|
|
6
|
+
import { nanoid } from "nanoid";
|
|
7
|
+
import { env } from "../env.js";
|
|
8
|
+
import { ffmpeg, hasFfmpeg } from "../media/ffmpeg.js";
|
|
9
|
+
import { ModelUnavailableError, NotedError } from "../model-errors.js";
|
|
10
|
+
import { HarnessModel, lastJson, runClient, } from "./model.js";
|
|
11
|
+
/**
|
|
12
|
+
* Apple Intelligence on this Mac as a model: the on-device foundation model of macOS 26, run
|
|
13
|
+
* through `wizards-apple` (apps/runtime/apple/main.swift) — one process per call, as every
|
|
14
|
+
* installed AI client is run. Nothing leaves the machine and nothing is signed in. It is offered
|
|
15
|
+
* where it can run: a Mac with Apple silicon on macOS 26 or later with the helper built, and it
|
|
16
|
+
* answers once Apple Intelligence is switched on. The model is small (about 3B parameters,
|
|
17
|
+
* 4,096 tokens for prompt and answer together): a way for the Classifier and Standard classes,
|
|
18
|
+
* not for research, long documents or code. `apple:default` is the model; `apple:tagging` is
|
|
19
|
+
* Apple's adapter for tagging and extraction.
|
|
20
|
+
*/
|
|
21
|
+
/** The helper: built into dist/apple by `scripts/build-apple.mjs`, or named by the environment. */
|
|
22
|
+
export const APPLE_BIN = process.env.WIZARDS_APPLE_BIN?.trim() ||
|
|
23
|
+
resolve(dirname(fileURLToPath(import.meta.url)), "../../dist/apple/wizards-apple");
|
|
24
|
+
export const APPLE = { id: "apple", name: "Apple Intelligence" };
|
|
25
|
+
/** Darwin 25 is macOS 26: the first system with the Foundation Models framework. */
|
|
26
|
+
const DARWIN_OF_MACOS_26 = 25;
|
|
27
|
+
/** What this machine is, before the helper is asked: a Mac with Apple silicon on macOS 26 or later. */
|
|
28
|
+
export function appleMachine(platform = process.platform, arch = process.arch, darwin = release()) {
|
|
29
|
+
if (platform !== "darwin" || arch !== "arm64") {
|
|
30
|
+
return "device";
|
|
31
|
+
}
|
|
32
|
+
return Number.parseInt(darwin, 10) >= DARWIN_OF_MACOS_26 ? null : "os";
|
|
33
|
+
}
|
|
34
|
+
/** The helper's reason, as the status names it. */
|
|
35
|
+
export function appleReasonOf(helper) {
|
|
36
|
+
switch (helper) {
|
|
37
|
+
case "appleIntelligenceNotEnabled":
|
|
38
|
+
return "off";
|
|
39
|
+
case "modelNotReady":
|
|
40
|
+
return "loading";
|
|
41
|
+
default:
|
|
42
|
+
return "device";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Without instructions the model refuses guided calls as "likely unsafe" (seen on macOS 26.5
|
|
47
|
+
* with a billing complaint); any instruction settles it. A step always brings its own.
|
|
48
|
+
*/
|
|
49
|
+
const DEFAULT_INSTRUCTIONS = "Answer what the prompt asks, precisely and briefly.";
|
|
50
|
+
const helperEnv = () => ({
|
|
51
|
+
PATH: process.env.PATH ?? "/usr/bin:/bin",
|
|
52
|
+
HOME: process.env.HOME ?? "",
|
|
53
|
+
LANG: process.env.LANG ?? "en_US.UTF-8",
|
|
54
|
+
});
|
|
55
|
+
let detected = null;
|
|
56
|
+
/** Apple Intelligence as it is now; asked again after a minute — the person may switch it on meanwhile. */
|
|
57
|
+
export async function appleStatus(force = false) {
|
|
58
|
+
if (!force && detected && Date.now() - detected.at < 60_000) {
|
|
59
|
+
return detected.value;
|
|
60
|
+
}
|
|
61
|
+
const value = await detectApple();
|
|
62
|
+
detected = { at: Date.now(), value };
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
async function detectApple() {
|
|
66
|
+
const machine = appleMachine();
|
|
67
|
+
if (machine) {
|
|
68
|
+
return { supported: false, available: false, reason: machine };
|
|
69
|
+
}
|
|
70
|
+
if (!existsSync(APPLE_BIN)) {
|
|
71
|
+
return { supported: false, available: false, reason: "missing" };
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const { stdout } = await runClient(APPLE_BIN, ["status"], {
|
|
75
|
+
cwd: process.cwd(),
|
|
76
|
+
env: helperEnv(),
|
|
77
|
+
signal: AbortSignal.timeout(15_000),
|
|
78
|
+
});
|
|
79
|
+
const status = lastJson(stdout);
|
|
80
|
+
if (!status) {
|
|
81
|
+
return { supported: true, available: false, reason: "missing" };
|
|
82
|
+
}
|
|
83
|
+
return status.available
|
|
84
|
+
? { supported: true, available: true, reason: null }
|
|
85
|
+
: { supported: true, available: false, reason: appleReasonOf(status.reason) };
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return { supported: true, available: false, reason: "missing" };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** What to tell the person when Apple Intelligence cannot answer, as a note of `RUN_NOTES`. */
|
|
92
|
+
export function appleUnavailableNote(status) {
|
|
93
|
+
switch (status.reason) {
|
|
94
|
+
case "off":
|
|
95
|
+
return { code: "appleOff" };
|
|
96
|
+
case "loading":
|
|
97
|
+
return { code: "appleLoading" };
|
|
98
|
+
case "missing":
|
|
99
|
+
return { code: "appleMissing" };
|
|
100
|
+
case "os":
|
|
101
|
+
return { code: "appleOs" };
|
|
102
|
+
default:
|
|
103
|
+
return { code: "appleDevice" };
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The failure the helper reports, as the person should read it: a note, so a run shows it in the
|
|
108
|
+
* wizard's language.
|
|
109
|
+
*/
|
|
110
|
+
export function appleFailure(error) {
|
|
111
|
+
switch (error.kind) {
|
|
112
|
+
case "unavailable":
|
|
113
|
+
return new ModelUnavailableError(appleUnavailableNote({
|
|
114
|
+
supported: true,
|
|
115
|
+
available: false,
|
|
116
|
+
reason: appleReasonOf(error.message),
|
|
117
|
+
}));
|
|
118
|
+
case "rateLimited":
|
|
119
|
+
return new ModelUnavailableError({ code: "appleBusy" });
|
|
120
|
+
case "contextWindow":
|
|
121
|
+
return new NotedError({ code: "appleTooLong" });
|
|
122
|
+
case "guardrail":
|
|
123
|
+
case "refusal":
|
|
124
|
+
return new NotedError({ code: "appleRefused" });
|
|
125
|
+
case "language":
|
|
126
|
+
return new NotedError({ code: "appleLanguage" });
|
|
127
|
+
case "schema":
|
|
128
|
+
return new NotedError({ code: "appleFormat", params: { detail: error.message } });
|
|
129
|
+
default:
|
|
130
|
+
return appleFailed(error.message);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Anything else the helper says, in its own words. */
|
|
134
|
+
function appleFailed(detail) {
|
|
135
|
+
return new NotedError({ code: "appleFailed", params: { detail: detail.slice(0, 480) } });
|
|
136
|
+
}
|
|
137
|
+
class AppleModel extends HarnessModel {
|
|
138
|
+
provider = "apple";
|
|
139
|
+
/** The model keeps to the schema itself (guided generation). */
|
|
140
|
+
nativeSchema = true;
|
|
141
|
+
/** The helper calls no tools: a call with tools answers from the prompt alone. */
|
|
142
|
+
usesTools = false;
|
|
143
|
+
searchesWeb = false;
|
|
144
|
+
async invoke(call) {
|
|
145
|
+
const { stdout, stderr, code } = await runClient(APPLE_BIN, ["generate"], {
|
|
146
|
+
cwd: call.dir,
|
|
147
|
+
env: helperEnv(),
|
|
148
|
+
signal: call.signal,
|
|
149
|
+
stdin: JSON.stringify({
|
|
150
|
+
system: call.system || DEFAULT_INSTRUCTIONS,
|
|
151
|
+
prompt: call.prompt,
|
|
152
|
+
schema: call.schema,
|
|
153
|
+
useCase: this.modelId === "tagging" ? "tagging" : "general",
|
|
154
|
+
}),
|
|
155
|
+
});
|
|
156
|
+
const answer = lastJson(stdout);
|
|
157
|
+
if (!answer) {
|
|
158
|
+
throw appleFailed(stderr.trim() || `exit ${code}`);
|
|
159
|
+
}
|
|
160
|
+
if (answer.error) {
|
|
161
|
+
throw appleFailure(answer.error);
|
|
162
|
+
}
|
|
163
|
+
return { text: answer.text ?? "" };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** `apple:default` or `apple:tagging` as a language model. */
|
|
167
|
+
export function appleModel(alias) {
|
|
168
|
+
return new AppleModel(APPLE, alias || "default");
|
|
169
|
+
}
|
|
170
|
+
/** The Mac's own language: what a voice note is most likely in, unless the call names one. */
|
|
171
|
+
function systemLocale() {
|
|
172
|
+
const locale = Intl.DateTimeFormat().resolvedOptions().locale;
|
|
173
|
+
return /^[a-z]{2}-[A-Z]{2}$/.test(locale) ? locale : SPEECH_LOCALES[langOf(locale) ?? "en"];
|
|
174
|
+
}
|
|
175
|
+
/** What AVAudioFile reads as it is; a browser's WebM or Ogg (Opus) is turned into WAV first. */
|
|
176
|
+
function audioExtension(mediaType) {
|
|
177
|
+
const type = mediaType.split(";")[0].trim().toLowerCase();
|
|
178
|
+
if (/mp4|m4a|aac/.test(type)) {
|
|
179
|
+
return { ext: "m4a", native: true };
|
|
180
|
+
}
|
|
181
|
+
if (/wav/.test(type)) {
|
|
182
|
+
return { ext: "wav", native: true };
|
|
183
|
+
}
|
|
184
|
+
if (/aiff/.test(type)) {
|
|
185
|
+
return { ext: "aiff", native: true };
|
|
186
|
+
}
|
|
187
|
+
if (/mpeg|mp3/.test(type)) {
|
|
188
|
+
return { ext: "mp3", native: true };
|
|
189
|
+
}
|
|
190
|
+
if (/ogg|opus/.test(type)) {
|
|
191
|
+
return { ext: "ogg", native: false };
|
|
192
|
+
}
|
|
193
|
+
return { ext: "webm", native: false };
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* `apple:transcribe`: a voice note written down on this Mac by SpeechAnalyzer (macOS 26). It
|
|
197
|
+
* needs no Apple Intelligence, only the language's assets, which the system installs on the
|
|
198
|
+
* first call. The recording goes through a file of its own, deleted afterwards; what the
|
|
199
|
+
* system cannot read (a browser's WebM) becomes WAV through ffmpeg on the way.
|
|
200
|
+
*/
|
|
201
|
+
class AppleTranscriptionModel {
|
|
202
|
+
specificationVersion = "v3";
|
|
203
|
+
provider = "apple";
|
|
204
|
+
modelId = "transcribe";
|
|
205
|
+
async doGenerate(options) {
|
|
206
|
+
const dir = join(env.dataDir, "harness", nanoid(10));
|
|
207
|
+
mkdirSync(dir, { recursive: true });
|
|
208
|
+
const { ext, native } = audioExtension(options.mediaType);
|
|
209
|
+
const given = join(dir, `note.${ext}`);
|
|
210
|
+
const locale = options.providerOptions?.apple?.locale ?? systemLocale();
|
|
211
|
+
try {
|
|
212
|
+
writeFileSync(given, typeof options.audio === "string" ? Buffer.from(options.audio, "base64") : options.audio);
|
|
213
|
+
let path = given;
|
|
214
|
+
if (!native) {
|
|
215
|
+
if (!(await hasFfmpeg())) {
|
|
216
|
+
throw new NotedError({ code: "appleNoFfmpeg", params: { type: options.mediaType } });
|
|
217
|
+
}
|
|
218
|
+
path = join(dir, "note.wav");
|
|
219
|
+
const { code, stderr } = await ffmpeg([
|
|
220
|
+
"-y",
|
|
221
|
+
"-i",
|
|
222
|
+
given,
|
|
223
|
+
"-ac",
|
|
224
|
+
"1",
|
|
225
|
+
"-ar",
|
|
226
|
+
"16000",
|
|
227
|
+
path,
|
|
228
|
+
]);
|
|
229
|
+
if (code !== 0) {
|
|
230
|
+
throw new NotedError({
|
|
231
|
+
code: "appleNotConverted",
|
|
232
|
+
params: { detail: stderr.slice(-300) },
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const { stdout, stderr, code } = await runClient(APPLE_BIN, ["transcribe", path, locale], {
|
|
237
|
+
cwd: dir,
|
|
238
|
+
env: helperEnv(),
|
|
239
|
+
signal: options.abortSignal,
|
|
240
|
+
});
|
|
241
|
+
const answer = lastJson(stdout);
|
|
242
|
+
if (!answer) {
|
|
243
|
+
throw appleFailed(stderr.trim() || `exit ${code}`);
|
|
244
|
+
}
|
|
245
|
+
if (answer.error) {
|
|
246
|
+
throw appleFailure(answer.error);
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
text: answer.text ?? "",
|
|
250
|
+
segments: [],
|
|
251
|
+
language: locale.slice(0, 2),
|
|
252
|
+
durationInSeconds: undefined,
|
|
253
|
+
warnings: [],
|
|
254
|
+
response: { timestamp: new Date(), modelId: this.modelId, headers: undefined },
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
if (err.code === "ENOENT") {
|
|
259
|
+
throw new ModelUnavailableError(appleUnavailableNote({ supported: false, available: false, reason: "missing" }));
|
|
260
|
+
}
|
|
261
|
+
throw err;
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
rmSync(dir, { recursive: true, force: true });
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
export function appleTranscriptionModel() {
|
|
269
|
+
return new AppleTranscriptionModel();
|
|
270
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { note } from "@engenty-wizards/shared/run";
|
|
2
|
+
import { resolveEnv, run } from "./env.js";
|
|
3
|
+
import { failureOf, HarnessModel, lastJson, runClient, } from "./model.js";
|
|
4
|
+
/**
|
|
5
|
+
* Claude Code: `claude -p` answers on the person's sign-in — the client's keychain, or the key
|
|
6
|
+
* or token their login shell sets. Tools go over MCP; structured output is validated by the
|
|
7
|
+
* client (`--json-schema`); web search is its own tool.
|
|
8
|
+
*/
|
|
9
|
+
export const CLAUDE_BIN = process.env.CLAUDE_BIN?.trim() || "claude";
|
|
10
|
+
const CLASSES = {
|
|
11
|
+
classifier: "haiku",
|
|
12
|
+
standard: "sonnet",
|
|
13
|
+
high: "opus",
|
|
14
|
+
highest: "opus",
|
|
15
|
+
};
|
|
16
|
+
const spec = {
|
|
17
|
+
id: "claude",
|
|
18
|
+
passThrough: /^(ANTHROPIC_|CLAUDE_CODE_OAUTH_TOKEN$|CLAUDE_CODE_USE_|CLAUDE_CONFIG_DIR$|AWS_(PROFILE|REGION|DEFAULT_REGION|ACCESS_KEY_ID|SECRET_ACCESS_KEY|SESSION_TOKEN)$|GOOGLE_APPLICATION_CREDENTIALS$|CLOUD_ML_REGION$)/,
|
|
19
|
+
keyVars: ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"],
|
|
20
|
+
async auth(env) {
|
|
21
|
+
try {
|
|
22
|
+
const { stdout } = await run(CLAUDE_BIN, ["auth", "status", "--json"], {
|
|
23
|
+
timeout: 15_000,
|
|
24
|
+
env,
|
|
25
|
+
});
|
|
26
|
+
const status = JSON.parse(stdout.trim());
|
|
27
|
+
if (!status.loggedIn) {
|
|
28
|
+
return "none";
|
|
29
|
+
}
|
|
30
|
+
return status.authMethod === "api_key" ? "api_key" : "subscription";
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return "none";
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
export async function claudeEnv() {
|
|
38
|
+
return (await resolveEnv(spec)).env;
|
|
39
|
+
}
|
|
40
|
+
/** The client's result as the model call wants it: text (or the structured output as JSON) and usage. */
|
|
41
|
+
export function claudeAnswer(event) {
|
|
42
|
+
const u = event.usage ?? {};
|
|
43
|
+
const cacheRead = u.cache_read_input_tokens ?? 0;
|
|
44
|
+
const cacheWrite = u.cache_creation_input_tokens ?? 0;
|
|
45
|
+
return {
|
|
46
|
+
text: event.structured_output !== undefined
|
|
47
|
+
? JSON.stringify(event.structured_output)
|
|
48
|
+
: typeof event.result === "string"
|
|
49
|
+
? event.result
|
|
50
|
+
: JSON.stringify(event.result ?? ""),
|
|
51
|
+
usage: {
|
|
52
|
+
input: (u.input_tokens ?? 0) + cacheRead + cacheWrite,
|
|
53
|
+
cacheRead,
|
|
54
|
+
cacheWrite,
|
|
55
|
+
output: u.output_tokens ?? 0,
|
|
56
|
+
},
|
|
57
|
+
meta: { costUsd: event.total_cost_usd ?? 0, turns: event.num_turns ?? 1 },
|
|
58
|
+
sessionId: event.session_id,
|
|
59
|
+
stopReason: event.stop_reason,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
class ClaudeCodeModel extends HarnessModel {
|
|
63
|
+
provider = "claude-code";
|
|
64
|
+
nativeSchema = true;
|
|
65
|
+
async invoke(call) {
|
|
66
|
+
const builtin = [];
|
|
67
|
+
if (call.files.length) {
|
|
68
|
+
builtin.push("Read");
|
|
69
|
+
}
|
|
70
|
+
if (call.webSearch) {
|
|
71
|
+
builtin.push("WebSearch");
|
|
72
|
+
}
|
|
73
|
+
const args = [
|
|
74
|
+
"-p",
|
|
75
|
+
"--output-format",
|
|
76
|
+
"json",
|
|
77
|
+
"--model",
|
|
78
|
+
this.modelId,
|
|
79
|
+
"--tools",
|
|
80
|
+
builtin.join(","),
|
|
81
|
+
"--strict-mcp-config",
|
|
82
|
+
"--setting-sources",
|
|
83
|
+
"",
|
|
84
|
+
"--disable-slash-commands",
|
|
85
|
+
"--no-session-persistence",
|
|
86
|
+
];
|
|
87
|
+
if (call.system) {
|
|
88
|
+
args.push("--system-prompt", call.system);
|
|
89
|
+
}
|
|
90
|
+
if (call.effort) {
|
|
91
|
+
args.push("--effort", call.effort);
|
|
92
|
+
}
|
|
93
|
+
if (call.schema) {
|
|
94
|
+
args.push("--json-schema", JSON.stringify(call.schema));
|
|
95
|
+
}
|
|
96
|
+
if (call.bridgeUrl) {
|
|
97
|
+
args.push("--mcp-config", JSON.stringify({ mcpServers: { step: { type: "http", url: call.bridgeUrl } } }));
|
|
98
|
+
}
|
|
99
|
+
const allowed = [...builtin, ...(call.bridgeUrl ? ["mcp__step"] : [])];
|
|
100
|
+
if (allowed.length) {
|
|
101
|
+
args.push("--allowedTools", allowed.join(","));
|
|
102
|
+
}
|
|
103
|
+
if (call.files.length) {
|
|
104
|
+
args.push("--add-dir", call.dir);
|
|
105
|
+
}
|
|
106
|
+
const { stdout, stderr, code } = await runClient(CLAUDE_BIN, args, {
|
|
107
|
+
cwd: call.dir,
|
|
108
|
+
env: await claudeEnv(),
|
|
109
|
+
signal: call.signal,
|
|
110
|
+
stdin: call.prompt,
|
|
111
|
+
});
|
|
112
|
+
const event = lastJson(stdout);
|
|
113
|
+
if (!event) {
|
|
114
|
+
throw failureOf(this.harness, stderr.trim() || `exit ${code}`);
|
|
115
|
+
}
|
|
116
|
+
if (event.is_error) {
|
|
117
|
+
// A failed run carries no result, only why (subtype) and sometimes what (errors).
|
|
118
|
+
const why = [
|
|
119
|
+
typeof event.result === "string" ? event.result : "",
|
|
120
|
+
event.subtype ?? "",
|
|
121
|
+
...(event.errors ?? []).map((e) => (typeof e === "string" ? e : JSON.stringify(e))),
|
|
122
|
+
event.num_turns ? `after ${event.num_turns} turns` : "",
|
|
123
|
+
].filter(Boolean);
|
|
124
|
+
console.warn("[claude] the client failed:", JSON.stringify(event).slice(0, 2000));
|
|
125
|
+
throw failureOf(this.harness, why.join(" – ") || "error");
|
|
126
|
+
}
|
|
127
|
+
return claudeAnswer(event);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
export const claude = {
|
|
131
|
+
...spec,
|
|
132
|
+
name: "Claude Code",
|
|
133
|
+
bin: CLAUDE_BIN,
|
|
134
|
+
classes: CLASSES,
|
|
135
|
+
async version(env) {
|
|
136
|
+
try {
|
|
137
|
+
const { stdout } = await run(CLAUDE_BIN, ["--version"], { timeout: 5000, env });
|
|
138
|
+
return stdout.trim().split(/\s+/)[0] || stdout.trim();
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
login: { args: ["auth", "login"], interactive: false },
|
|
145
|
+
model: (alias, effort) => new ClaudeCodeModel(claude, alias || "sonnet", effort),
|
|
146
|
+
exhausted: note("anthropicAccountClaudeCode"),
|
|
147
|
+
};
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { note } from "@engenty-wizards/shared/run";
|
|
5
|
+
import { resolveEnv, run } from "./env.js";
|
|
6
|
+
import { failureOf, HarnessImageModel, HarnessModel, runClient, } from "./model.js";
|
|
7
|
+
/**
|
|
8
|
+
* Codex: `codex exec` answers on the ChatGPT sign-in kept in CODEX_HOME. The person's own
|
|
9
|
+
* config is left out so none of their MCP servers start for a call; tools go over MCP through
|
|
10
|
+
* a config override; structured output is validated by the client (`--output-schema`).
|
|
11
|
+
*/
|
|
12
|
+
export const CODEX_BIN = process.env.CODEX_BIN?.trim() || "codex";
|
|
13
|
+
/**
|
|
14
|
+
* Models a ChatGPT sign-in runs (checked 2026-10-04): Luna for small calls, Sol as the
|
|
15
|
+
* workhorse, Astra for the hardest work. A binding `codex/<model>` names another;
|
|
16
|
+
* `codex/default` = the model the client picks itself.
|
|
17
|
+
*/
|
|
18
|
+
const CLASSES = {
|
|
19
|
+
classifier: "gpt-6-luna",
|
|
20
|
+
standard: "gpt-6.1-sol",
|
|
21
|
+
high: "gpt-6.1-sol",
|
|
22
|
+
highest: "gpt-6-astra",
|
|
23
|
+
};
|
|
24
|
+
const spec = {
|
|
25
|
+
id: "codex",
|
|
26
|
+
passThrough: /^CODEX_HOME$/,
|
|
27
|
+
keyVars: [],
|
|
28
|
+
async auth(env) {
|
|
29
|
+
try {
|
|
30
|
+
const { stdout, stderr } = await run(CODEX_BIN, ["login", "status"], {
|
|
31
|
+
timeout: 15_000,
|
|
32
|
+
env,
|
|
33
|
+
});
|
|
34
|
+
const text = `${stdout}\n${stderr}`;
|
|
35
|
+
if (/not logged in/i.test(text)) {
|
|
36
|
+
return "none";
|
|
37
|
+
}
|
|
38
|
+
if (/api key/i.test(text)) {
|
|
39
|
+
return "api_key";
|
|
40
|
+
}
|
|
41
|
+
return /logged in/i.test(text) ? "subscription" : "none";
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return "none";
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
/** The events of one run as the model call wants them: the last agent message and the usage. */
|
|
49
|
+
export function codexAnswer(stdout) {
|
|
50
|
+
let text = null;
|
|
51
|
+
let usage;
|
|
52
|
+
let failure = null;
|
|
53
|
+
let sessionId;
|
|
54
|
+
for (const line of stdout.split("\n")) {
|
|
55
|
+
let event;
|
|
56
|
+
try {
|
|
57
|
+
event = JSON.parse(line);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (event.type === "thread.started") {
|
|
63
|
+
sessionId = event.thread_id;
|
|
64
|
+
}
|
|
65
|
+
else if (event.type === "item.completed" && event.item?.type === "agent_message") {
|
|
66
|
+
text = event.item.text ?? "";
|
|
67
|
+
}
|
|
68
|
+
else if (event.type === "turn.completed") {
|
|
69
|
+
const u = event.usage ?? {};
|
|
70
|
+
usage = {
|
|
71
|
+
input: u.input_tokens ?? 0,
|
|
72
|
+
cacheRead: u.cached_input_tokens ?? 0,
|
|
73
|
+
cacheWrite: u.cache_write_input_tokens ?? 0,
|
|
74
|
+
output: u.output_tokens ?? 0,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
else if (event.type === "turn.failed" || event.type === "error") {
|
|
78
|
+
failure =
|
|
79
|
+
typeof event.error === "string"
|
|
80
|
+
? event.error
|
|
81
|
+
: (event.error?.message ?? event.message ?? "error");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
answer: text === null ? null : { text, usage, sessionId },
|
|
86
|
+
failure,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
class CodexModel extends HarnessModel {
|
|
90
|
+
provider = "codex";
|
|
91
|
+
nativeSchema = true;
|
|
92
|
+
async invoke(call) {
|
|
93
|
+
const args = [
|
|
94
|
+
"exec",
|
|
95
|
+
"-",
|
|
96
|
+
"--json",
|
|
97
|
+
"--ephemeral",
|
|
98
|
+
"--skip-git-repo-check",
|
|
99
|
+
"--ignore-user-config",
|
|
100
|
+
"-s",
|
|
101
|
+
"read-only",
|
|
102
|
+
"-C",
|
|
103
|
+
call.dir,
|
|
104
|
+
"-c",
|
|
105
|
+
'approval_policy="never"',
|
|
106
|
+
"-c",
|
|
107
|
+
`web_search="${call.webSearch ? "live" : "disabled"}"`,
|
|
108
|
+
];
|
|
109
|
+
if (this.modelId !== "default") {
|
|
110
|
+
args.push("-m", this.modelId);
|
|
111
|
+
}
|
|
112
|
+
if (call.effort) {
|
|
113
|
+
args.push("-c", `model_reasoning_effort="${call.effort}"`);
|
|
114
|
+
}
|
|
115
|
+
if (call.system) {
|
|
116
|
+
// A JSON string is a TOML basic string: the instructions travel as one config value.
|
|
117
|
+
args.push("-c", `developer_instructions=${JSON.stringify(call.system)}`);
|
|
118
|
+
}
|
|
119
|
+
if (call.bridgeUrl) {
|
|
120
|
+
args.push("-c", `mcp_servers.step.url="${call.bridgeUrl}"`, "-c", "mcp_servers.step.startup_timeout_sec=30", "-c", "mcp_servers.step.tool_timeout_sec=600",
|
|
121
|
+
// The tools are this runtime's own: they run without the client asking anyone.
|
|
122
|
+
"-c", 'mcp_servers.step.default_tools_approval_mode="approve"');
|
|
123
|
+
}
|
|
124
|
+
if (call.schema) {
|
|
125
|
+
const file = join(call.dir, "schema.json");
|
|
126
|
+
writeFileSync(file, JSON.stringify(call.schema));
|
|
127
|
+
args.push("--output-schema", file);
|
|
128
|
+
}
|
|
129
|
+
const { stdout, stderr, code } = await runClient(CODEX_BIN, args, {
|
|
130
|
+
cwd: call.dir,
|
|
131
|
+
env: (await resolveEnv(spec)).env,
|
|
132
|
+
signal: call.signal,
|
|
133
|
+
stdin: call.prompt,
|
|
134
|
+
});
|
|
135
|
+
const { answer, failure } = codexAnswer(stdout);
|
|
136
|
+
if (failure || !answer) {
|
|
137
|
+
throw failureOf(this.harness, failure ?? stderr.trim() ?? `exit ${code}`);
|
|
138
|
+
}
|
|
139
|
+
return answer;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Images: `codex exec` with the built-in image tool, the reference photos attached with `-i`.
|
|
144
|
+
* Codex keeps what it made under CODEX_HOME/generated_images/<thread>; the file is read from
|
|
145
|
+
* there and that folder removed. `codex/image` runs the tool on the standard model.
|
|
146
|
+
*/
|
|
147
|
+
class CodexImageModel extends HarnessImageModel {
|
|
148
|
+
provider = "codex";
|
|
149
|
+
async invoke(call) {
|
|
150
|
+
const prompt = [
|
|
151
|
+
call.prompt,
|
|
152
|
+
call.files.length
|
|
153
|
+
? "Work from the attached image(s): edit them as described, keeping what is not to change."
|
|
154
|
+
: "",
|
|
155
|
+
call.aspectRatio ? `Aspect ratio: ${call.aspectRatio}.` : "",
|
|
156
|
+
"Make exactly one image with your image generation tool. Write no files yourself and run no commands. Reply only with: done",
|
|
157
|
+
]
|
|
158
|
+
.filter(Boolean)
|
|
159
|
+
.join("\n\n");
|
|
160
|
+
const args = [
|
|
161
|
+
"exec",
|
|
162
|
+
"-",
|
|
163
|
+
"--json",
|
|
164
|
+
"--ephemeral",
|
|
165
|
+
"--skip-git-repo-check",
|
|
166
|
+
"--ignore-user-config",
|
|
167
|
+
"-s",
|
|
168
|
+
"read-only",
|
|
169
|
+
"-C",
|
|
170
|
+
call.dir,
|
|
171
|
+
"-c",
|
|
172
|
+
'approval_policy="never"',
|
|
173
|
+
"-c",
|
|
174
|
+
'web_search="disabled"',
|
|
175
|
+
"-m",
|
|
176
|
+
this.modelId === "image" ? CLASSES.standard : this.modelId,
|
|
177
|
+
];
|
|
178
|
+
for (const file of call.files) {
|
|
179
|
+
args.push("-i", file);
|
|
180
|
+
}
|
|
181
|
+
const { env } = await resolveEnv(spec);
|
|
182
|
+
const { stdout, stderr, code } = await runClient(CODEX_BIN, args, {
|
|
183
|
+
cwd: call.dir,
|
|
184
|
+
env,
|
|
185
|
+
signal: call.signal,
|
|
186
|
+
stdin: prompt,
|
|
187
|
+
});
|
|
188
|
+
const { answer, failure } = codexAnswer(stdout);
|
|
189
|
+
if (failure || !answer?.sessionId) {
|
|
190
|
+
throw failureOf(this.harness, failure ?? stderr.trim() ?? `exit ${code}`);
|
|
191
|
+
}
|
|
192
|
+
const folder = join(env.CODEX_HOME?.trim() || join(homedir(), ".codex"), "generated_images", answer.sessionId);
|
|
193
|
+
try {
|
|
194
|
+
const made = existsSync(folder)
|
|
195
|
+
? readdirSync(folder)
|
|
196
|
+
.filter((f) => /\.(png|jpe?g|webp)$/i.test(f))
|
|
197
|
+
.map((f) => join(folder, f))
|
|
198
|
+
.sort((a, b) => statSync(b).mtimeMs - statSync(a).mtimeMs)
|
|
199
|
+
: [];
|
|
200
|
+
if (!made[0]) {
|
|
201
|
+
throw new Error(`Codex made no image: ${answer.text.slice(0, 300)}`);
|
|
202
|
+
}
|
|
203
|
+
return new Uint8Array(readFileSync(made[0]));
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
rmSync(folder, { recursive: true, force: true });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
export const codex = {
|
|
211
|
+
...spec,
|
|
212
|
+
name: "Codex",
|
|
213
|
+
bin: CODEX_BIN,
|
|
214
|
+
classes: CLASSES,
|
|
215
|
+
async version(env) {
|
|
216
|
+
try {
|
|
217
|
+
const { stdout } = await run(CODEX_BIN, ["--version"], { timeout: 5000, env });
|
|
218
|
+
const words = stdout.trim().split(/\s+/);
|
|
219
|
+
return words[words.length - 1] || null;
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
login: { args: ["login"], interactive: false },
|
|
226
|
+
model: (alias, effort) => new CodexModel(codex, alias || "default", effort),
|
|
227
|
+
image: { alias: "image", model: (alias) => new CodexImageModel(codex, alias || "image") },
|
|
228
|
+
exhausted: note("chatgptAccountCodexSigned"),
|
|
229
|
+
};
|