@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,249 @@
|
|
|
1
|
+
// The loop: observe → decide → (text) → act → observe, until DONE, BLOCKED,
|
|
2
|
+
// the step budget, an ambiguous step (the planner LLM takes over), or
|
|
3
|
+
// the seat is gone. Ported from engenty-pro, which took it from jev-ultrafast
|
|
4
|
+
// `agent.py` `Agent.command`.
|
|
5
|
+
import { buildActionSpace } from "./action-space.js";
|
|
6
|
+
import { decide, tiebreak } from "./decide.js";
|
|
7
|
+
import { FastLoopDriver, StalePageError } from "./driver.js";
|
|
8
|
+
import { buildFieldContext } from "./text-helper.js";
|
|
9
|
+
/** How much page text the planner gets back. */
|
|
10
|
+
const RESULT_TEXT_CHARS = 1500;
|
|
11
|
+
/** Three consecutive non-wait steps that changed nothing = stuck. */
|
|
12
|
+
const STUCK_WINDOW = 3;
|
|
13
|
+
/**
|
|
14
|
+
* A stale or covered target is re-observed after the page settles; each
|
|
15
|
+
* retry re-asks the classifier on the fresh observation.
|
|
16
|
+
*/
|
|
17
|
+
const STALE_RETRIES_PER_STEP = 3;
|
|
18
|
+
/** Every note that stops short of DONE ends with the way back. */
|
|
19
|
+
const RESUME = "Do that one step with the browser_* tools, then call browser_run_fast again with the same goal.";
|
|
20
|
+
function describe(step) {
|
|
21
|
+
return step.target === null
|
|
22
|
+
? step.operation
|
|
23
|
+
: `${step.operation} → [${step.target}] ${step.label}`;
|
|
24
|
+
}
|
|
25
|
+
/** What the acted-on element shows after the step, for the history. */
|
|
26
|
+
function valueAfter(page, action) {
|
|
27
|
+
if (action.node === undefined) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const now = page.actions.find((a) => a.node === action.node && a.kind === action.kind);
|
|
31
|
+
if (!now) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
if (action.kind === "fill") {
|
|
35
|
+
return now.value ?? null;
|
|
36
|
+
}
|
|
37
|
+
if (action.kind === "select") {
|
|
38
|
+
return now.current_value ?? null;
|
|
39
|
+
}
|
|
40
|
+
return now.checked ?? null;
|
|
41
|
+
}
|
|
42
|
+
export async function runFastLoop(input) {
|
|
43
|
+
const driver = new FastLoopDriver(input.page);
|
|
44
|
+
const history = [];
|
|
45
|
+
const startedAt = performance.now();
|
|
46
|
+
const totals = { input_tokens: 0, jev_latency_ms: 0, text_latency_ms: 0 };
|
|
47
|
+
let page = await driver.observe();
|
|
48
|
+
// The helper runs alongside the classifier: as soon as a page with a
|
|
49
|
+
// typeable field is observed, its values are asked for, so a TYPE_TEXT
|
|
50
|
+
// decision finds them ready (one call per page, cached per field).
|
|
51
|
+
const prefetch = { current: null };
|
|
52
|
+
const prefetchText = (snapshot) => {
|
|
53
|
+
if (prefetch.current?.fingerprint === snapshot.fingerprint) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const field = snapshot.actions.find((a) => a.kind === "fill");
|
|
57
|
+
if (!field) {
|
|
58
|
+
prefetch.current = null;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const context = buildFieldContext(input.goal, field, snapshot, history);
|
|
62
|
+
prefetch.current = {
|
|
63
|
+
fingerprint: snapshot.fingerprint,
|
|
64
|
+
promise: Promise.resolve()
|
|
65
|
+
.then(() => input.fieldText(context))
|
|
66
|
+
.then((result) => {
|
|
67
|
+
totals.text_latency_ms += result?.latency_ms ?? 0;
|
|
68
|
+
}, () => {
|
|
69
|
+
// The per-field read below reports the failure if the step needs it.
|
|
70
|
+
}),
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
prefetchText(page);
|
|
74
|
+
const finish = (status, note, withElements) => ({
|
|
75
|
+
elapsed_ms: Math.round(performance.now() - startedAt),
|
|
76
|
+
elements: withElements ? buildActionSpace(page.actions).elements : null,
|
|
77
|
+
history,
|
|
78
|
+
note,
|
|
79
|
+
page: {
|
|
80
|
+
text: page.text.slice(0, RESULT_TEXT_CHARS),
|
|
81
|
+
title: page.title,
|
|
82
|
+
url: page.url,
|
|
83
|
+
},
|
|
84
|
+
status,
|
|
85
|
+
steps: history.length,
|
|
86
|
+
totals,
|
|
87
|
+
});
|
|
88
|
+
let staleRetries = 0;
|
|
89
|
+
while (history.length < input.maxSteps) {
|
|
90
|
+
if (input.shouldStop?.()) {
|
|
91
|
+
return finish("interrupted", "The seat was taken or the run stopped; no further step ran.", false);
|
|
92
|
+
}
|
|
93
|
+
if (!(await driver.fresh(page))) {
|
|
94
|
+
page = await driver.observe();
|
|
95
|
+
prefetchText(page);
|
|
96
|
+
}
|
|
97
|
+
const decideInput = {
|
|
98
|
+
client: input.client,
|
|
99
|
+
goal: input.goal,
|
|
100
|
+
history,
|
|
101
|
+
...(input.model ? { model: input.model } : {}),
|
|
102
|
+
page,
|
|
103
|
+
};
|
|
104
|
+
let decision;
|
|
105
|
+
try {
|
|
106
|
+
decision = await decide(decideInput);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
return finish("error", `The classifier gave no usable decision: ${error instanceof Error ? error.message : String(error)}. ${RESUME}`, true);
|
|
110
|
+
}
|
|
111
|
+
totals.jev_latency_ms += decision.latency_ms;
|
|
112
|
+
totals.input_tokens += decision.usage?.input_tokens ?? 0;
|
|
113
|
+
let tiebreakProbability = null;
|
|
114
|
+
if (decision.margin < input.minMargin) {
|
|
115
|
+
const best = {
|
|
116
|
+
label: decision.target
|
|
117
|
+
? (page.actions.find((a) => a.id === decision.choice)?.label ?? decision.choice)
|
|
118
|
+
: decision.operation,
|
|
119
|
+
operation: decision.operation,
|
|
120
|
+
target: decision.target,
|
|
121
|
+
};
|
|
122
|
+
const contest = decision.runnerUp
|
|
123
|
+
? `${describe(best)} (${(decision.runnerUp.joint + decision.margin).toFixed(2)}) and ${describe(decision.runnerUp)} (${decision.runnerUp.joint.toFixed(2)})`
|
|
124
|
+
: describe(best);
|
|
125
|
+
let verdict;
|
|
126
|
+
try {
|
|
127
|
+
verdict = await tiebreak({ ...decideInput, decision });
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
return finish("error", `The tiebreak gave no usable answer: ${error instanceof Error ? error.message : String(error)}. ${RESUME}`, true);
|
|
131
|
+
}
|
|
132
|
+
totals.jev_latency_ms += verdict.latency_ms;
|
|
133
|
+
totals.input_tokens += verdict.usage?.input_tokens ?? 0;
|
|
134
|
+
if (verdict.winner === null) {
|
|
135
|
+
return finish("uncertain", `The classifier could not choose between ${contest}; a tiebreak did not settle it either (${verdict.probability.toFixed(2)}). ${RESUME}`, true);
|
|
136
|
+
}
|
|
137
|
+
tiebreakProbability = verdict.probability;
|
|
138
|
+
if (verdict.winner === "runner_up" && decision.runnerUp) {
|
|
139
|
+
const chosen = decision.runnerUp;
|
|
140
|
+
decision = {
|
|
141
|
+
...decision,
|
|
142
|
+
choice: chosen.choice,
|
|
143
|
+
operation: chosen.operation,
|
|
144
|
+
probability: chosen.probability,
|
|
145
|
+
target: chosen.target,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (decision.choice === "DONE" || decision.choice === "BLOCKED") {
|
|
150
|
+
if (!(await driver.fresh(page))) {
|
|
151
|
+
page = await driver.observe();
|
|
152
|
+
prefetchText(page);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const done = decision.choice === "DONE";
|
|
156
|
+
return finish(done ? "done" : "blocked", done
|
|
157
|
+
? "The classifier saw every requirement of the goal visibly satisfied."
|
|
158
|
+
: `The classifier found no supported operation that makes progress. ${RESUME} If the page itself is the obstacle, ask the person.`, !done);
|
|
159
|
+
}
|
|
160
|
+
const action = page.actions.find((a) => a.id === decision.choice);
|
|
161
|
+
if (!action) {
|
|
162
|
+
return finish("error", `Decision named an action the page did not offer. ${RESUME}`, true);
|
|
163
|
+
}
|
|
164
|
+
let text = null;
|
|
165
|
+
let textWait = 0;
|
|
166
|
+
let textSource = null;
|
|
167
|
+
try {
|
|
168
|
+
if (action.kind === "fill") {
|
|
169
|
+
if (!(await driver.fresh(page))) {
|
|
170
|
+
throw new StalePageError("Page changed before text generation.");
|
|
171
|
+
}
|
|
172
|
+
const waitStarted = performance.now();
|
|
173
|
+
if (prefetch.current?.fingerprint === page.fingerprint) {
|
|
174
|
+
await prefetch.current.promise;
|
|
175
|
+
}
|
|
176
|
+
const context = buildFieldContext(input.goal, action, page, history);
|
|
177
|
+
const result = await input.fieldText(context);
|
|
178
|
+
textWait = Math.round(performance.now() - waitStarted);
|
|
179
|
+
// A hit on the prefetched page reports 0; a value the prefetch did
|
|
180
|
+
// not cover (another source, a changed page) reports its own call.
|
|
181
|
+
totals.text_latency_ms += result.latency_ms;
|
|
182
|
+
text = result.text;
|
|
183
|
+
textSource = result.source;
|
|
184
|
+
if (text === null) {
|
|
185
|
+
return finish("uncertain", `The field "${action.label}" needs a value the goal does not contain. Supply it in the goal and call browser_run_fast again, or ask the person.`, true);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
await driver.act(action, page, text);
|
|
189
|
+
staleRetries = 0;
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
if (error instanceof StalePageError && staleRetries < STALE_RETRIES_PER_STEP) {
|
|
193
|
+
staleRetries += 1;
|
|
194
|
+
// The target moved or is covered because the page is still changing
|
|
195
|
+
// (a calendar re-rendering, a dialog sliding in). Let it come to rest
|
|
196
|
+
// before observing again, or the retry sees the same frame.
|
|
197
|
+
await driver.settle();
|
|
198
|
+
page = await driver.observe();
|
|
199
|
+
prefetchText(page);
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
return finish("error", `Step failed: ${error instanceof Error ? error.message : String(error)}. ${RESUME}`, true);
|
|
203
|
+
}
|
|
204
|
+
const entry = {
|
|
205
|
+
action: action.label,
|
|
206
|
+
confidence: decision.confidence,
|
|
207
|
+
kind: action.kind,
|
|
208
|
+
latency_ms: decision.latency_ms,
|
|
209
|
+
operation: decision.operation,
|
|
210
|
+
page_changed: null,
|
|
211
|
+
probability: decision.probability,
|
|
212
|
+
step: history.length + 1,
|
|
213
|
+
target: decision.target,
|
|
214
|
+
text,
|
|
215
|
+
text_latency_ms: textWait,
|
|
216
|
+
url: page.url,
|
|
217
|
+
usage: decision.usage,
|
|
218
|
+
value_after: null,
|
|
219
|
+
};
|
|
220
|
+
history.push(entry);
|
|
221
|
+
const before = page.fingerprint;
|
|
222
|
+
page = await driver.observe();
|
|
223
|
+
entry.page_changed = page.fingerprint !== before;
|
|
224
|
+
entry.url = page.url;
|
|
225
|
+
entry.value_after = valueAfter(page, action);
|
|
226
|
+
prefetchText(page);
|
|
227
|
+
input.onStep?.({
|
|
228
|
+
confidence: decision.confidence,
|
|
229
|
+
latency_ms: decision.latency_ms,
|
|
230
|
+
margin: decision.margin,
|
|
231
|
+
operation: decision.operation,
|
|
232
|
+
page_changed: entry.page_changed,
|
|
233
|
+
probability: decision.probability,
|
|
234
|
+
step: entry.step,
|
|
235
|
+
target_confidence: decision.targetConfidence,
|
|
236
|
+
target_label: decision.target ? action.label : null,
|
|
237
|
+
text_latency_ms: textWait,
|
|
238
|
+
text_source: textSource,
|
|
239
|
+
tiebreak: tiebreakProbability,
|
|
240
|
+
usage: decision.usage,
|
|
241
|
+
});
|
|
242
|
+
const recent = history.slice(-STUCK_WINDOW);
|
|
243
|
+
if (recent.length === STUCK_WINDOW &&
|
|
244
|
+
recent.every((h) => h.page_changed === false && h.kind !== "wait")) {
|
|
245
|
+
return finish("blocked", `The last ${STUCK_WINDOW} steps changed nothing on the page. ${RESUME}`, true);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return finish("budget", `Stopped at the ${input.maxSteps}-step budget for one call. Check the page, then call browser_run_fast again with the remaining goal.`, true);
|
|
249
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// Field values without generation: the goal is cut into candidate spans
|
|
2
|
+
// (dates, names, numbers, quoted strings) and the classifier picks, per
|
|
3
|
+
// typeable field, which span is that field's value — or NONE. A span picker
|
|
4
|
+
// cannot invent a value, which is the contract the text helper promises
|
|
5
|
+
// ("it never invents data"); what it cannot do is rewrite one, so NONE and a
|
|
6
|
+
// close call fall through to the LLM helper. Ported from engenty-pro's fast loop.
|
|
7
|
+
import { validateChoiceAnswer } from "./classifier.js";
|
|
8
|
+
import { SPAN_VALUE } from "./instructions.js";
|
|
9
|
+
/** At most this many spans are offered; beyond that the goal is prose, not values. */
|
|
10
|
+
export const MAX_SPANS = 20;
|
|
11
|
+
/** A span must lead the runner-up by this much of the head's mass. */
|
|
12
|
+
export const SPAN_MIN_MARGIN = 0.2;
|
|
13
|
+
export const NONE = "NONE";
|
|
14
|
+
const MONTH = "(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Sept|Oct|Nov|Dec|Jän|Mär|Mai|Okt|Dez)[a-zäö]*\\.?";
|
|
15
|
+
const SPAN_PATTERNS = [
|
|
16
|
+
// "12 Oct 2026", "12. Oktober 2026", "Oct 12, 2026", "October 12"
|
|
17
|
+
new RegExp(`\\b\\d{1,2}\\.?\\s?${MONTH}(?:,?\\s\\d{4})?\\b|\\b${MONTH}\\s\\d{1,2}(?:,?\\s\\d{4})?\\b`, "gi"),
|
|
18
|
+
// 2026-10-12, 12.10.2026, 10/12/2026, 12.10.
|
|
19
|
+
/\b\d{4}-\d{2}-\d{2}\b|\b\d{1,2}[./]\d{1,2}(?:[./]\d{2,4})?\b/g,
|
|
20
|
+
// "quoted" or 'quoted' or „quoted“
|
|
21
|
+
/["“„']([^"“”„']{1,80})["”“']/g,
|
|
22
|
+
// e-mail
|
|
23
|
+
/\b[\w.+-]+@[\w-]+\.[\w.-]+\b/g,
|
|
24
|
+
// number with a unit or currency: 1 126 €, €1,126, 2 adults, 3 nights
|
|
25
|
+
/(?:[€$£]\s?\d[\d.,\s]*\d|\b\d[\d.,]*\s?(?:€|EUR|USD|\$|£|%|kg|km|adults?|nights?|persons?|people|passengers?|rooms?|days?|hours?|h))\b/gi,
|
|
26
|
+
// runs of capitalised words, incl. "Seoul, South Korea", "New York"
|
|
27
|
+
/\b(?:\p{Lu}[\p{L}\p{M}'’-]+)(?:(?:,\s|\s)(?:\p{Lu}[\p{L}\p{M}'’-]+))*\b/gu,
|
|
28
|
+
// bare integers
|
|
29
|
+
/\b\d{1,9}\b/g,
|
|
30
|
+
];
|
|
31
|
+
const SENTENCE_STARTERS = new Set([
|
|
32
|
+
"a",
|
|
33
|
+
"an",
|
|
34
|
+
"and",
|
|
35
|
+
"book",
|
|
36
|
+
"click",
|
|
37
|
+
"enter",
|
|
38
|
+
"fill",
|
|
39
|
+
"find",
|
|
40
|
+
"for",
|
|
41
|
+
"from",
|
|
42
|
+
"go",
|
|
43
|
+
"in",
|
|
44
|
+
"on",
|
|
45
|
+
"open",
|
|
46
|
+
"pick",
|
|
47
|
+
"search",
|
|
48
|
+
"select",
|
|
49
|
+
"set",
|
|
50
|
+
"the",
|
|
51
|
+
"then",
|
|
52
|
+
"to",
|
|
53
|
+
"type",
|
|
54
|
+
"use",
|
|
55
|
+
"with",
|
|
56
|
+
]);
|
|
57
|
+
/**
|
|
58
|
+
* Candidate values in the goal, in order of appearance, deduplicated. A
|
|
59
|
+
* quoted span is offered without its quotes. A lone capitalised word that is
|
|
60
|
+
* only a sentence start ("Search flights…") is not a value.
|
|
61
|
+
*/
|
|
62
|
+
export function extractSpans(goal) {
|
|
63
|
+
const found = [];
|
|
64
|
+
for (const pattern of SPAN_PATTERNS) {
|
|
65
|
+
pattern.lastIndex = 0;
|
|
66
|
+
for (const match of goal.matchAll(pattern)) {
|
|
67
|
+
const text = (match[1] ?? match[0]).trim();
|
|
68
|
+
if (!text) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
found.push({ index: match.index ?? 0, text });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
found.sort((a, b) => a.index - b.index);
|
|
75
|
+
const spans = [];
|
|
76
|
+
const seen = new Set();
|
|
77
|
+
for (const { index, text } of found) {
|
|
78
|
+
if (seen.has(text)) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (/^\p{Lu}[\p{L}]*$/u.test(text) &&
|
|
82
|
+
SENTENCE_STARTERS.has(text.toLowerCase()) &&
|
|
83
|
+
(index === 0 || /[.!?;:]\s*$/.test(goal.slice(0, index)))) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
seen.add(text);
|
|
87
|
+
spans.push(text);
|
|
88
|
+
if (spans.length >= MAX_SPANS) {
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return spans;
|
|
93
|
+
}
|
|
94
|
+
/** Head key per field: `field_1`, `field_2`, … in the fields' order. */
|
|
95
|
+
function headKey(position) {
|
|
96
|
+
return `field_${position + 1}`;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* One classifier call for every typeable field on the page: which span, if
|
|
100
|
+
* any, is that field's value. Returns null when the goal offers no spans.
|
|
101
|
+
*/
|
|
102
|
+
export async function pickSpans(input) {
|
|
103
|
+
const spans = extractSpans(input.context.goal);
|
|
104
|
+
if (spans.length === 0) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
const ids = spans.map((_, i) => `s${i + 1}`);
|
|
108
|
+
const criteria = {
|
|
109
|
+
[NONE]: "No offered piece is this field's value.",
|
|
110
|
+
};
|
|
111
|
+
ids.forEach((id, i) => {
|
|
112
|
+
criteria[id] = spans[i];
|
|
113
|
+
});
|
|
114
|
+
const fields = input.context.fields;
|
|
115
|
+
const questions = {};
|
|
116
|
+
fields.forEach((field, i) => {
|
|
117
|
+
questions[headKey(i)] = {
|
|
118
|
+
criteria,
|
|
119
|
+
instructions: {
|
|
120
|
+
field: { label: field.label, role: field.role, value: field.value },
|
|
121
|
+
goal: input.context.goal,
|
|
122
|
+
rules: SPAN_VALUE,
|
|
123
|
+
},
|
|
124
|
+
type: "choice",
|
|
125
|
+
};
|
|
126
|
+
});
|
|
127
|
+
const startedAt = performance.now();
|
|
128
|
+
const result = await input.client.systemOne({
|
|
129
|
+
...(input.model ? { model: input.model } : {}),
|
|
130
|
+
questions,
|
|
131
|
+
state: {
|
|
132
|
+
fields: fields,
|
|
133
|
+
goal: input.context.goal,
|
|
134
|
+
page: input.context.page,
|
|
135
|
+
recent_actions: input.context.recent_actions,
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
const latency_ms = Math.round(performance.now() - startedAt);
|
|
139
|
+
const values = new Map();
|
|
140
|
+
const offered = [NONE, ...ids];
|
|
141
|
+
fields.forEach((field, i) => {
|
|
142
|
+
const answer = validateChoiceAnswer(result.answers[headKey(i)], offered);
|
|
143
|
+
const ranked = Object.entries(answer.probabilities).sort((a, b) => b[1] - a[1]);
|
|
144
|
+
const [best, second] = ranked;
|
|
145
|
+
const margin = (best?.[1] ?? 0) - (second?.[1] ?? 0);
|
|
146
|
+
if (!best || best[0] === NONE || margin < SPAN_MIN_MARGIN) {
|
|
147
|
+
values.set(field.label, null);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
values.set(field.label, spans[ids.indexOf(best[0])] ?? null);
|
|
151
|
+
});
|
|
152
|
+
return { latency_ms, values };
|
|
153
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// The only generated text in the loop: values for TYPE_TEXT fields. Two
|
|
2
|
+
// sources, tried in order and cached per page and goal: the classifier
|
|
3
|
+
// picking a span of the goal (`span-picker.ts` — it cannot invent a value),
|
|
4
|
+
// then a language model (the run's classifier class) for a value that has to
|
|
5
|
+
// be rewritten. One call per page and goal answers EVERY typeable field on it
|
|
6
|
+
// at once, so a three-field form costs one round trip, not three. Strict
|
|
7
|
+
// contract — `{ "values": { "<label>": string | null } }`, each under 2000
|
|
8
|
+
// chars — else nothing is typed. Page content is data. Ported from
|
|
9
|
+
// engenty-pro's fast loop; the model call is the caller's.
|
|
10
|
+
import { TEXT_VALUES } from "./instructions.js";
|
|
11
|
+
import { pickSpans } from "./span-picker.js";
|
|
12
|
+
const MAX_TEXT_CHARS = 2000;
|
|
13
|
+
const MAX_PAGE_TEXT_CHARS = 6000;
|
|
14
|
+
/** Pages remembered per helper; a loop rarely revisits more than a few. */
|
|
15
|
+
const CACHE_ENTRIES = 8;
|
|
16
|
+
function describe(action) {
|
|
17
|
+
return {
|
|
18
|
+
label: action.label,
|
|
19
|
+
role: action.role ?? null,
|
|
20
|
+
value: action.value ?? null,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function buildFieldContext(goal, action, page, history) {
|
|
24
|
+
return {
|
|
25
|
+
field: describe(action),
|
|
26
|
+
fields: page.actions.filter((a) => a.kind === "fill").map(describe),
|
|
27
|
+
goal,
|
|
28
|
+
page: { text: page.text.slice(0, MAX_PAGE_TEXT_CHARS), title: page.title },
|
|
29
|
+
recent_actions: history
|
|
30
|
+
.filter((h) => h.kind === "fill")
|
|
31
|
+
.slice(-6)
|
|
32
|
+
.map((h) => ({ action: h.action, text: h.text })),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function parseValuesObject(raw, labels) {
|
|
36
|
+
const stripped = raw
|
|
37
|
+
.trim()
|
|
38
|
+
.replace(/^```(?:json)?\s*/i, "")
|
|
39
|
+
.replace(/\s*```$/, "");
|
|
40
|
+
const parsed = JSON.parse(stripped);
|
|
41
|
+
if (!parsed ||
|
|
42
|
+
typeof parsed !== "object" ||
|
|
43
|
+
Object.keys(parsed).length !== 1 ||
|
|
44
|
+
!("values" in parsed)) {
|
|
45
|
+
throw new Error("text_helper_invalid_shape");
|
|
46
|
+
}
|
|
47
|
+
const values = parsed.values;
|
|
48
|
+
if (!values || typeof values !== "object" || Array.isArray(values)) {
|
|
49
|
+
throw new Error("text_helper_invalid_shape");
|
|
50
|
+
}
|
|
51
|
+
const out = new Map();
|
|
52
|
+
for (const label of labels) {
|
|
53
|
+
const value = values[label];
|
|
54
|
+
if (value === null || value === undefined) {
|
|
55
|
+
out.set(label, null);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (typeof value !== "string" || !value.trim() || value.length > MAX_TEXT_CHARS) {
|
|
59
|
+
throw new Error("text_helper_invalid_value");
|
|
60
|
+
}
|
|
61
|
+
out.set(label, value);
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* One page's worth of values is asked for once: the key is the goal plus the
|
|
67
|
+
* fields as they stand, so a field the loop just filled (its value changed)
|
|
68
|
+
* asks again with the new state, and a revisit of an unchanged page is free.
|
|
69
|
+
*/
|
|
70
|
+
function cacheKey(context) {
|
|
71
|
+
return JSON.stringify([context.goal, context.page.title, context.fields]);
|
|
72
|
+
}
|
|
73
|
+
export function createFieldText(options) {
|
|
74
|
+
const spans = options.spans ?? null;
|
|
75
|
+
const cache = new Map();
|
|
76
|
+
/** Keys whose span pick already ran (with or without a value). */
|
|
77
|
+
const spansAsked = new Set();
|
|
78
|
+
const inflight = new Map();
|
|
79
|
+
const remember = (key) => {
|
|
80
|
+
let entry = cache.get(key);
|
|
81
|
+
if (!entry) {
|
|
82
|
+
entry = new Map();
|
|
83
|
+
cache.set(key, entry);
|
|
84
|
+
if (cache.size > CACHE_ENTRIES) {
|
|
85
|
+
const oldest = cache.keys().next().value;
|
|
86
|
+
if (oldest !== undefined) {
|
|
87
|
+
cache.delete(oldest);
|
|
88
|
+
spansAsked.delete(oldest);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return entry;
|
|
93
|
+
};
|
|
94
|
+
const askSpans = async (key, context) => {
|
|
95
|
+
if (!spans || spansAsked.has(key)) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
spansAsked.add(key);
|
|
99
|
+
try {
|
|
100
|
+
const pick = await pickSpans({
|
|
101
|
+
client: spans.client,
|
|
102
|
+
context,
|
|
103
|
+
...(spans.model ? { model: spans.model } : {}),
|
|
104
|
+
});
|
|
105
|
+
if (!pick) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const known = remember(key);
|
|
109
|
+
for (const [label, text] of pick.values) {
|
|
110
|
+
if (text !== null) {
|
|
111
|
+
known.set(label, { latency_ms: pick.latency_ms, source: "span", text });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.warn("[browser] the span picker failed; asking the language model:", error instanceof Error ? error.message : String(error));
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const askModel = async (key, context) => {
|
|
120
|
+
const labels = context.fields.map((f) => f.label);
|
|
121
|
+
if (!labels.includes(context.field.label)) {
|
|
122
|
+
labels.push(context.field.label);
|
|
123
|
+
}
|
|
124
|
+
const startedAt = performance.now();
|
|
125
|
+
const text = await options.ask(TEXT_VALUES, JSON.stringify({
|
|
126
|
+
fields: context.fields,
|
|
127
|
+
goal: context.goal,
|
|
128
|
+
page: context.page,
|
|
129
|
+
recent_actions: context.recent_actions,
|
|
130
|
+
}));
|
|
131
|
+
const latency_ms = Math.round(performance.now() - startedAt);
|
|
132
|
+
let values;
|
|
133
|
+
try {
|
|
134
|
+
values = parseValuesObject(text, labels);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
throw new Error("text_helper_invalid: no valid field value; nothing typed");
|
|
138
|
+
}
|
|
139
|
+
const known = remember(key);
|
|
140
|
+
for (const [label, value] of values) {
|
|
141
|
+
if (!known.has(label)) {
|
|
142
|
+
known.set(label, { latency_ms, source: "llm", text: value });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
const resolve = async (key, context) => {
|
|
147
|
+
await askSpans(key, context);
|
|
148
|
+
if (cache.get(key)?.has(context.field.label)) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
await askModel(key, context);
|
|
152
|
+
};
|
|
153
|
+
return async (context) => {
|
|
154
|
+
const key = cacheKey(context);
|
|
155
|
+
const label = context.field.label;
|
|
156
|
+
const hit = cache.get(key)?.get(label);
|
|
157
|
+
if (hit) {
|
|
158
|
+
return { latency_ms: 0, source: hit.source, text: hit.text };
|
|
159
|
+
}
|
|
160
|
+
let pending = inflight.get(key);
|
|
161
|
+
if (!pending) {
|
|
162
|
+
pending = resolve(key, context).finally(() => inflight.delete(key));
|
|
163
|
+
inflight.set(key, pending);
|
|
164
|
+
}
|
|
165
|
+
await pending;
|
|
166
|
+
if (!cache.get(key)?.get(label)) {
|
|
167
|
+
// Another field's in-flight call did not cover this label (the page
|
|
168
|
+
// changed between them); ask once more for this page as it stands.
|
|
169
|
+
await resolve(key, context);
|
|
170
|
+
}
|
|
171
|
+
const found = cache.get(key)?.get(label);
|
|
172
|
+
return {
|
|
173
|
+
latency_ms: found?.latency_ms ?? 0,
|
|
174
|
+
source: found?.source ?? "llm",
|
|
175
|
+
text: found?.text ?? null,
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
}
|