@zenalexa/unicli 0.210.0 → 0.212.1
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/AGENTS.md +71 -134
- package/README.md +222 -209
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +114 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/acp.d.ts +14 -0
- package/dist/commands/acp.d.ts.map +1 -0
- package/dist/commands/acp.js +41 -0
- package/dist/commands/acp.js.map +1 -0
- package/dist/commands/agents.d.ts +14 -3
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +369 -140
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +14 -0
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/lint.d.ts +32 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +377 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -4
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +47 -62
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/migrate-schema.d.ts +56 -0
- package/dist/commands/migrate-schema.d.ts.map +1 -0
- package/dist/commands/migrate-schema.js +522 -0
- package/dist/commands/migrate-schema.js.map +1 -0
- package/dist/commands/migrate.d.ts +54 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +270 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/schema.d.ts +12 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +72 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/search.d.ts +12 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +47 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +76 -0
- package/dist/commands/skills.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/core/envelope.d.ts +87 -0
- package/dist/core/envelope.d.ts.map +1 -0
- package/dist/core/envelope.js +94 -0
- package/dist/core/envelope.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/registry.d.ts +63 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +62 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/schema-v2.d.ts +111 -0
- package/dist/core/schema-v2.d.ts.map +1 -0
- package/dist/core/schema-v2.js +118 -0
- package/dist/core/schema-v2.js.map +1 -0
- package/dist/core/types.d.ts +24 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +15 -0
- package/dist/core/types.js.map +1 -0
- package/dist/discovery/aliases.d.ts +36 -0
- package/dist/discovery/aliases.d.ts.map +1 -0
- package/dist/discovery/aliases.js +520 -0
- package/dist/discovery/aliases.js.map +1 -0
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +107 -5
- package/dist/discovery/loader.js.map +1 -1
- package/dist/discovery/search.d.ts +73 -0
- package/dist/discovery/search.d.ts.map +1 -0
- package/dist/discovery/search.js +392 -0
- package/dist/discovery/search.js.map +1 -0
- package/dist/engine/repair/logger.d.ts.map +1 -1
- package/dist/engine/repair/logger.js +11 -1
- package/dist/engine/repair/logger.js.map +1 -1
- package/dist/engine/steps/browser.d.ts +11 -0
- package/dist/engine/steps/browser.d.ts.map +1 -0
- package/dist/engine/steps/browser.js +11 -0
- package/dist/engine/steps/browser.js.map +1 -0
- package/dist/engine/steps/control.d.ts +10 -0
- package/dist/engine/steps/control.d.ts.map +1 -0
- package/dist/engine/steps/control.js +10 -0
- package/dist/engine/steps/control.js.map +1 -0
- package/dist/engine/steps/cua.d.ts +53 -0
- package/dist/engine/steps/cua.d.ts.map +1 -0
- package/dist/engine/steps/cua.js +71 -0
- package/dist/engine/steps/cua.js.map +1 -0
- package/dist/engine/steps/desktop-ax.d.ts +38 -0
- package/dist/engine/steps/desktop-ax.d.ts.map +1 -0
- package/dist/engine/steps/desktop-ax.js +49 -0
- package/dist/engine/steps/desktop-ax.js.map +1 -0
- package/dist/engine/steps/desktop.d.ts +10 -0
- package/dist/engine/steps/desktop.d.ts.map +1 -0
- package/dist/engine/steps/desktop.js +10 -0
- package/dist/engine/steps/desktop.js.map +1 -0
- package/dist/engine/steps/download.d.ts +10 -0
- package/dist/engine/steps/download.d.ts.map +1 -0
- package/dist/engine/steps/download.js +10 -0
- package/dist/engine/steps/download.js.map +1 -0
- package/dist/engine/steps/fetch.d.ts +10 -0
- package/dist/engine/steps/fetch.d.ts.map +1 -0
- package/dist/engine/steps/fetch.js +10 -0
- package/dist/engine/steps/fetch.js.map +1 -0
- package/dist/engine/steps/index.d.ts +19 -0
- package/dist/engine/steps/index.d.ts.map +1 -0
- package/dist/engine/steps/index.js +19 -0
- package/dist/engine/steps/index.js.map +1 -0
- package/dist/engine/steps/transform.d.ts +10 -0
- package/dist/engine/steps/transform.d.ts.map +1 -0
- package/dist/engine/steps/transform.js +10 -0
- package/dist/engine/steps/transform.js.map +1 -0
- package/dist/engine/steps/websocket.d.ts +10 -0
- package/dist/engine/steps/websocket.d.ts.map +1 -0
- package/dist/engine/steps/websocket.js +10 -0
- package/dist/engine/steps/websocket.js.map +1 -0
- package/dist/engine/yaml-runner.d.ts +159 -1
- package/dist/engine/yaml-runner.d.ts.map +1 -1
- package/dist/engine/yaml-runner.js +180 -32
- package/dist/engine/yaml-runner.js.map +1 -1
- package/dist/manifest-compact.txt +15 -0
- package/dist/manifest-search.json +1 -0
- package/dist/manifest.json +530 -244
- package/dist/mcp/elicitation.d.ts +56 -0
- package/dist/mcp/elicitation.d.ts.map +1 -0
- package/dist/mcp/elicitation.js +62 -0
- package/dist/mcp/elicitation.js.map +1 -0
- package/dist/mcp/oauth.d.ts +33 -0
- package/dist/mcp/oauth.d.ts.map +1 -0
- package/dist/mcp/oauth.js +291 -0
- package/dist/mcp/oauth.js.map +1 -0
- package/dist/mcp/schema.d.ts +65 -0
- package/dist/mcp/schema.d.ts.map +1 -0
- package/dist/mcp/schema.js +136 -0
- package/dist/mcp/schema.js.map +1 -0
- package/dist/mcp/server.d.ts +28 -10
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +408 -234
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/sse-transport.d.ts +34 -0
- package/dist/mcp/sse-transport.d.ts.map +1 -0
- package/dist/mcp/sse-transport.js +182 -0
- package/dist/mcp/sse-transport.js.map +1 -0
- package/dist/mcp/streamable-http.d.ts +89 -0
- package/dist/mcp/streamable-http.d.ts.map +1 -0
- package/dist/mcp/streamable-http.js +566 -0
- package/dist/mcp/streamable-http.js.map +1 -0
- package/dist/output/formatter.d.ts +14 -4
- package/dist/output/formatter.d.ts.map +1 -1
- package/dist/output/formatter.js +49 -25
- package/dist/output/formatter.js.map +1 -1
- package/dist/permissions/sensitive-paths.js +2 -2
- package/dist/permissions/sensitive-paths.js.map +1 -1
- package/dist/protocol/acp.d.ts +126 -0
- package/dist/protocol/acp.d.ts.map +1 -0
- package/dist/protocol/acp.js +588 -0
- package/dist/protocol/acp.js.map +1 -0
- package/dist/protocol/skill.d.ts +106 -0
- package/dist/protocol/skill.d.ts.map +1 -0
- package/dist/protocol/skill.js +276 -0
- package/dist/protocol/skill.js.map +1 -0
- package/dist/registry.d.ts +2 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +2 -0
- package/dist/registry.js.map +1 -1
- package/dist/transport/adapters/cdp-browser.d.ts +44 -0
- package/dist/transport/adapters/cdp-browser.d.ts.map +1 -0
- package/dist/transport/adapters/cdp-browser.js +240 -0
- package/dist/transport/adapters/cdp-browser.js.map +1 -0
- package/dist/transport/adapters/cua.d.ts +240 -0
- package/dist/transport/adapters/cua.d.ts.map +1 -0
- package/dist/transport/adapters/cua.js +663 -0
- package/dist/transport/adapters/cua.js.map +1 -0
- package/dist/transport/adapters/desktop-atspi.d.ts +27 -0
- package/dist/transport/adapters/desktop-atspi.d.ts.map +1 -0
- package/dist/transport/adapters/desktop-atspi.js +65 -0
- package/dist/transport/adapters/desktop-atspi.js.map +1 -0
- package/dist/transport/adapters/desktop-ax.d.ts +59 -0
- package/dist/transport/adapters/desktop-ax.d.ts.map +1 -0
- package/dist/transport/adapters/desktop-ax.js +311 -0
- package/dist/transport/adapters/desktop-ax.js.map +1 -0
- package/dist/transport/adapters/desktop-uia.d.ts +27 -0
- package/dist/transport/adapters/desktop-uia.d.ts.map +1 -0
- package/dist/transport/adapters/desktop-uia.js +66 -0
- package/dist/transport/adapters/desktop-uia.js.map +1 -0
- package/dist/transport/adapters/http.d.ts +40 -0
- package/dist/transport/adapters/http.d.ts.map +1 -0
- package/dist/transport/adapters/http.js +353 -0
- package/dist/transport/adapters/http.js.map +1 -0
- package/dist/transport/adapters/subprocess.d.ts +27 -0
- package/dist/transport/adapters/subprocess.d.ts.map +1 -0
- package/dist/transport/adapters/subprocess.js +254 -0
- package/dist/transport/adapters/subprocess.js.map +1 -0
- package/dist/transport/bus.d.ts +28 -0
- package/dist/transport/bus.d.ts.map +1 -0
- package/dist/transport/bus.js +112 -0
- package/dist/transport/bus.js.map +1 -0
- package/dist/transport/capability.d.ts +38 -0
- package/dist/transport/capability.d.ts.map +1 -0
- package/dist/transport/capability.js +254 -0
- package/dist/transport/capability.js.map +1 -0
- package/dist/transport/types.d.ts +148 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +19 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/types.d.ts +18 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +32 -10
- package/src/adapters/1688/_site.json +9 -0
- package/src/adapters/1688/item.yaml +7 -0
- package/src/adapters/1688/search.yaml +7 -0
- package/src/adapters/1688/store.yaml +7 -0
- package/src/adapters/36kr/article.yaml +7 -0
- package/src/adapters/36kr/hot.yaml +7 -0
- package/src/adapters/36kr/latest.yaml +7 -0
- package/src/adapters/36kr/news.yaml +7 -0
- package/src/adapters/36kr/search.yaml +7 -0
- package/src/adapters/adguardhome/add-rule.yaml +7 -0
- package/src/adapters/adguardhome/rules.yaml +7 -0
- package/src/adapters/adguardhome/stats.yaml +7 -0
- package/src/adapters/adguardhome/status.yaml +7 -0
- package/src/adapters/adguardhome/toggle.yaml +7 -0
- package/src/adapters/amazon/bestsellers.yaml +7 -0
- package/src/adapters/amazon/discussion.yaml +7 -0
- package/src/adapters/amazon/movers-shakers.yaml +7 -0
- package/src/adapters/amazon/new-releases.yaml +7 -0
- package/src/adapters/amazon/offer.yaml +7 -0
- package/src/adapters/amazon/product.yaml +7 -0
- package/src/adapters/amazon/rankings.yaml +7 -0
- package/src/adapters/amazon/search.yaml +7 -0
- package/src/adapters/apple-music/rate-album.yaml +71 -0
- package/src/adapters/apple-notes/list.yaml +52 -0
- package/src/adapters/apple-notes/read.yaml +44 -0
- package/src/adapters/apple-notes/search.yaml +43 -0
- package/src/adapters/apple-podcasts/episodes.yaml +7 -0
- package/src/adapters/apple-podcasts/search.yaml +7 -0
- package/src/adapters/apple-podcasts/top.yaml +7 -0
- package/src/adapters/arxiv/paper.yaml +7 -0
- package/src/adapters/arxiv/search.yaml +7 -0
- package/src/adapters/arxiv/trending.yaml +7 -0
- package/src/adapters/audacity/convert.yaml +7 -0
- package/src/adapters/audacity/effects.yaml +7 -0
- package/src/adapters/audacity/info.yaml +7 -0
- package/src/adapters/audacity/mix.yaml +7 -0
- package/src/adapters/audacity/normalize.yaml +7 -0
- package/src/adapters/audacity/spectrogram.yaml +7 -0
- package/src/adapters/audacity/split-channels.yaml +7 -0
- package/src/adapters/audacity/trim.yaml +7 -0
- package/src/adapters/autoagent/eval-run.yaml +7 -0
- package/src/adapters/aws/s3-ls.yaml +7 -0
- package/src/adapters/az/account.yaml +7 -0
- package/src/adapters/baidu/hot.yaml +7 -0
- package/src/adapters/baidu/search.yaml +7 -0
- package/src/adapters/band/bands.yaml +7 -0
- package/src/adapters/band/mentions.yaml +7 -0
- package/src/adapters/band/post.yaml +7 -0
- package/src/adapters/band/posts.yaml +7 -0
- package/src/adapters/barchart/_site.json +10 -0
- package/src/adapters/barchart/flow.yaml +7 -0
- package/src/adapters/barchart/greeks.yaml +7 -0
- package/src/adapters/barchart/options.yaml +7 -0
- package/src/adapters/barchart/quote.yaml +7 -0
- package/src/adapters/bbc/news.yaml +7 -0
- package/src/adapters/bbc/technology.yaml +7 -0
- package/src/adapters/bbc/top.yaml +7 -0
- package/src/adapters/bbc/world.yaml +7 -0
- package/src/adapters/bilibili/coin.yaml +7 -0
- package/src/adapters/bilibili/dynamic.yaml +7 -0
- package/src/adapters/bilibili/favorites.yaml +7 -0
- package/src/adapters/bilibili/feed.yaml +7 -0
- package/src/adapters/bilibili/following.yaml +7 -0
- package/src/adapters/bilibili/history.yaml +7 -0
- package/src/adapters/bilibili/hot.yaml +7 -0
- package/src/adapters/bilibili/later.yaml +7 -0
- package/src/adapters/bilibili/live.yaml +7 -0
- package/src/adapters/bilibili/me.yaml +7 -0
- package/src/adapters/bilibili/ranking.yaml +7 -0
- package/src/adapters/bilibili/trending.yaml +7 -0
- package/src/adapters/binance/hot.yaml +7 -0
- package/src/adapters/binance/kline.yaml +7 -0
- package/src/adapters/binance/ticker.yaml +7 -0
- package/src/adapters/blender/animation.yaml +7 -0
- package/src/adapters/blender/camera.yaml +7 -0
- package/src/adapters/blender/convert.yaml +7 -0
- package/src/adapters/blender/export.yaml +7 -0
- package/src/adapters/blender/import.yaml +7 -0
- package/src/adapters/blender/info.yaml +7 -0
- package/src/adapters/blender/lighting.yaml +7 -0
- package/src/adapters/blender/materials.yaml +7 -0
- package/src/adapters/blender/objects.yaml +7 -0
- package/src/adapters/blender/render.yaml +7 -0
- package/src/adapters/blender/scene.yaml +7 -0
- package/src/adapters/blender/screenshot.yaml +7 -0
- package/src/adapters/blender/script.yaml +7 -0
- package/src/adapters/bloomberg/businessweek.yaml +7 -0
- package/src/adapters/bloomberg/economics.yaml +7 -0
- package/src/adapters/bloomberg/feeds.yaml +7 -0
- package/src/adapters/bloomberg/industries.yaml +7 -0
- package/src/adapters/bloomberg/main.yaml +7 -0
- package/src/adapters/bloomberg/markets.yaml +7 -0
- package/src/adapters/bloomberg/news.yaml +7 -0
- package/src/adapters/bloomberg/opinions.yaml +7 -0
- package/src/adapters/bloomberg/politics.yaml +7 -0
- package/src/adapters/bloomberg/tech.yaml +7 -0
- package/src/adapters/bluesky/feeds.yaml +7 -0
- package/src/adapters/bluesky/followers.yaml +7 -0
- package/src/adapters/bluesky/following.yaml +7 -0
- package/src/adapters/bluesky/likes.yaml +7 -0
- package/src/adapters/bluesky/notifications.yaml +7 -0
- package/src/adapters/bluesky/post.yaml +7 -0
- package/src/adapters/bluesky/profile.yaml +7 -0
- package/src/adapters/bluesky/search.yaml +7 -0
- package/src/adapters/bluesky/starter-packs.yaml +7 -0
- package/src/adapters/bluesky/thread.yaml +7 -0
- package/src/adapters/bluesky/trending.yaml +7 -0
- package/src/adapters/bluesky/user.yaml +7 -0
- package/src/adapters/boss/batchgreet.yaml +7 -0
- package/src/adapters/boss/chatlist.yaml +7 -0
- package/src/adapters/boss/chatmsg.yaml +7 -0
- package/src/adapters/boss/detail.yaml +7 -0
- package/src/adapters/boss/exchange.yaml +7 -0
- package/src/adapters/boss/greet.yaml +7 -0
- package/src/adapters/boss/invite.yaml +7 -0
- package/src/adapters/boss/joblist.yaml +7 -0
- package/src/adapters/boss/mark.yaml +7 -0
- package/src/adapters/boss/recommend.yaml +7 -0
- package/src/adapters/boss/resume.yaml +7 -0
- package/src/adapters/boss/search.yaml +7 -0
- package/src/adapters/boss/send.yaml +7 -0
- package/src/adapters/boss/stats.yaml +7 -0
- package/src/adapters/chaoxing/assignments.yaml +7 -0
- package/src/adapters/chaoxing/exams.yaml +7 -0
- package/src/adapters/chrome/bookmarks.yaml +7 -0
- package/src/adapters/chrome/tabs.yaml +7 -0
- package/src/adapters/claude-code/version.yaml +7 -0
- package/src/adapters/cloudcompare/compare.yaml +7 -0
- package/src/adapters/cloudcompare/convert.yaml +7 -0
- package/src/adapters/cloudcompare/info.yaml +7 -0
- package/src/adapters/cloudcompare/subsample.yaml +7 -0
- package/src/adapters/cnki/search.yaml +7 -0
- package/src/adapters/cnn/technology.yaml +7 -0
- package/src/adapters/cnn/top.yaml +7 -0
- package/src/adapters/cocoapods/info.yaml +7 -0
- package/src/adapters/cocoapods/search.yaml +7 -0
- package/src/adapters/codex-cli/version.yaml +7 -0
- package/src/adapters/coinbase/prices.yaml +7 -0
- package/src/adapters/coinbase/rates.yaml +7 -0
- package/src/adapters/comfyui/generate.yaml +7 -0
- package/src/adapters/comfyui/history.yaml +7 -0
- package/src/adapters/comfyui/nodes.yaml +7 -0
- package/src/adapters/comfyui/status.yaml +7 -0
- package/src/adapters/coupang/add-to-cart.yaml +7 -0
- package/src/adapters/coupang/hot.yaml +7 -0
- package/src/adapters/coupang/search.yaml +7 -0
- package/src/adapters/crates-io/info.yaml +7 -0
- package/src/adapters/crates-io/search.yaml +7 -0
- package/src/adapters/crates-io/versions.yaml +7 -0
- package/src/adapters/ctrip/hot.yaml +7 -0
- package/src/adapters/ctrip/search.yaml +7 -0
- package/src/adapters/cua/bench-list.yaml +7 -0
- package/src/adapters/cua/bench-run.yaml +7 -0
- package/src/adapters/dangdang/hot.yaml +7 -0
- package/src/adapters/dangdang/search.yaml +7 -0
- package/src/adapters/deepseek/chat.yaml +7 -0
- package/src/adapters/deepseek/models.yaml +7 -0
- package/src/adapters/devto/latest.yaml +7 -0
- package/src/adapters/devto/search.yaml +7 -0
- package/src/adapters/devto/tag.yaml +7 -0
- package/src/adapters/devto/top.yaml +7 -0
- package/src/adapters/devto/user.yaml +7 -0
- package/src/adapters/dianping/hot.yaml +7 -0
- package/src/adapters/dianping/search.yaml +7 -0
- package/src/adapters/dictionary/examples.yaml +7 -0
- package/src/adapters/dictionary/search.yaml +7 -0
- package/src/adapters/dictionary/synonyms.yaml +7 -0
- package/src/adapters/dingtalk/version.yaml +7 -0
- package/src/adapters/docker/build.yaml +7 -0
- package/src/adapters/docker/images.yaml +7 -0
- package/src/adapters/docker/logs.yaml +7 -0
- package/src/adapters/docker/networks.yaml +7 -0
- package/src/adapters/docker/ps.yaml +7 -0
- package/src/adapters/docker/run.yaml +7 -0
- package/src/adapters/docker/volumes.yaml +7 -0
- package/src/adapters/docker-hub/info.yaml +7 -0
- package/src/adapters/docker-hub/search.yaml +7 -0
- package/src/adapters/docker-hub/tags.yaml +7 -0
- package/src/adapters/doctl/droplets.yaml +7 -0
- package/src/adapters/douban/book-hot.yaml +7 -0
- package/src/adapters/douban/download.yaml +7 -0
- package/src/adapters/douban/group-hot.yaml +7 -0
- package/src/adapters/douban/marks.yaml +7 -0
- package/src/adapters/douban/movie-hot.yaml +7 -0
- package/src/adapters/douban/new-movies.yaml +7 -0
- package/src/adapters/douban/photos.yaml +7 -0
- package/src/adapters/douban/reviews.yaml +7 -0
- package/src/adapters/douban/search.yaml +7 -0
- package/src/adapters/douban/subject.yaml +7 -0
- package/src/adapters/douban/top250.yaml +7 -0
- package/src/adapters/douban/tv-hot.yaml +7 -0
- package/src/adapters/doubao/ask.yaml +7 -0
- package/src/adapters/doubao/new.yaml +7 -0
- package/src/adapters/doubao/status.yaml +7 -0
- package/src/adapters/doubao-web/ask.yaml +7 -0
- package/src/adapters/doubao-web/detail.yaml +7 -0
- package/src/adapters/doubao-web/history.yaml +7 -0
- package/src/adapters/doubao-web/meeting-summary.yaml +7 -0
- package/src/adapters/doubao-web/meeting-transcript.yaml +7 -0
- package/src/adapters/doubao-web/new.yaml +7 -0
- package/src/adapters/doubao-web/read.yaml +7 -0
- package/src/adapters/doubao-web/send.yaml +7 -0
- package/src/adapters/doubao-web/status.yaml +7 -0
- package/src/adapters/douyu/hot.yaml +7 -0
- package/src/adapters/douyu/search.yaml +7 -0
- package/src/adapters/drawio/export.yaml +7 -0
- package/src/adapters/eastmoney/fund.yaml +7 -0
- package/src/adapters/eastmoney/hot.yaml +7 -0
- package/src/adapters/eastmoney/market.yaml +7 -0
- package/src/adapters/eastmoney/search.yaml +7 -0
- package/src/adapters/ele/hot.yaml +8 -0
- package/src/adapters/ele/search.yaml +8 -0
- package/src/adapters/exchangerate/convert.yaml +7 -0
- package/src/adapters/exchangerate/list.yaml +7 -0
- package/src/adapters/facebook/add-friend.yaml +7 -0
- package/src/adapters/facebook/events.yaml +7 -0
- package/src/adapters/facebook/feed.yaml +7 -0
- package/src/adapters/facebook/friends.yaml +7 -0
- package/src/adapters/facebook/groups.yaml +7 -0
- package/src/adapters/facebook/join-group.yaml +7 -0
- package/src/adapters/facebook/marketplace.yaml +7 -0
- package/src/adapters/facebook/memories.yaml +7 -0
- package/src/adapters/facebook/notifications.yaml +7 -0
- package/src/adapters/facebook/post.yaml +7 -0
- package/src/adapters/facebook/profile.yaml +7 -0
- package/src/adapters/facebook/search.yaml +7 -0
- package/src/adapters/feishu/calendar.yaml +7 -0
- package/src/adapters/feishu/docs.yaml +7 -0
- package/src/adapters/feishu/send.yaml +7 -0
- package/src/adapters/feishu/tasks.yaml +7 -0
- package/src/adapters/ffmpeg/compress.yaml +7 -0
- package/src/adapters/ffmpeg/concat.yaml +7 -0
- package/src/adapters/ffmpeg/convert.yaml +7 -0
- package/src/adapters/ffmpeg/extract-audio.yaml +7 -0
- package/src/adapters/ffmpeg/gif.yaml +7 -0
- package/src/adapters/ffmpeg/normalize.yaml +7 -0
- package/src/adapters/ffmpeg/probe.yaml +7 -0
- package/src/adapters/ffmpeg/resize.yaml +7 -0
- package/src/adapters/ffmpeg/subtitles.yaml +7 -0
- package/src/adapters/ffmpeg/thumbnail.yaml +7 -0
- package/src/adapters/ffmpeg/trim.yaml +7 -0
- package/src/adapters/figma/export-selected.yaml +67 -0
- package/src/adapters/flyctl/apps.yaml +7 -0
- package/src/adapters/freecad/assembly.yaml +7 -0
- package/src/adapters/freecad/bom.yaml +7 -0
- package/src/adapters/freecad/boolean.yaml +7 -0
- package/src/adapters/freecad/check.yaml +7 -0
- package/src/adapters/freecad/convert.yaml +7 -0
- package/src/adapters/freecad/export-stl.yaml +7 -0
- package/src/adapters/freecad/import.yaml +7 -0
- package/src/adapters/freecad/info.yaml +7 -0
- package/src/adapters/freecad/macro.yaml +7 -0
- package/src/adapters/freecad/measure.yaml +7 -0
- package/src/adapters/freecad/mesh.yaml +7 -0
- package/src/adapters/freecad/properties.yaml +7 -0
- package/src/adapters/freecad/render.yaml +7 -0
- package/src/adapters/freecad/section.yaml +7 -0
- package/src/adapters/freecad/sketch.yaml +7 -0
- package/src/adapters/futu/hot.yaml +7 -0
- package/src/adapters/futu/quote.yaml +7 -0
- package/src/adapters/gcloud/projects.yaml +7 -0
- package/src/adapters/gemini/ask.yaml +7 -0
- package/src/adapters/gemini/deep-research-result.yaml +7 -0
- package/src/adapters/gemini/deep-research.yaml +7 -0
- package/src/adapters/gemini/image.yaml +7 -0
- package/src/adapters/gemini/new.yaml +7 -0
- package/src/adapters/gh/issue.yaml +7 -0
- package/src/adapters/gh/pr.yaml +7 -0
- package/src/adapters/gh/release.yaml +7 -0
- package/src/adapters/gh/repo.yaml +7 -0
- package/src/adapters/gh/run.yaml +7 -0
- package/src/adapters/gimp/adjust.yaml +7 -0
- package/src/adapters/gimp/batch.yaml +7 -0
- package/src/adapters/gimp/convert.yaml +7 -0
- package/src/adapters/gimp/crop.yaml +7 -0
- package/src/adapters/gimp/filter.yaml +7 -0
- package/src/adapters/gimp/flip.yaml +7 -0
- package/src/adapters/gimp/info.yaml +7 -0
- package/src/adapters/gimp/layers.yaml +7 -0
- package/src/adapters/gimp/merge-layers.yaml +7 -0
- package/src/adapters/gimp/resize.yaml +7 -0
- package/src/adapters/gimp/rotate.yaml +7 -0
- package/src/adapters/gimp/text.yaml +7 -0
- package/src/adapters/gitee/repos.yaml +7 -0
- package/src/adapters/gitee/search.yaml +7 -0
- package/src/adapters/gitee/trending.yaml +7 -0
- package/src/adapters/github-trending/daily.yaml +7 -0
- package/src/adapters/github-trending/developers.yaml +7 -0
- package/src/adapters/github-trending/weekly.yaml +7 -0
- package/src/adapters/gitlab/projects.yaml +7 -0
- package/src/adapters/gitlab/search.yaml +7 -0
- package/src/adapters/gitlab/trending.yaml +7 -0
- package/src/adapters/godot/project-run.yaml +7 -0
- package/src/adapters/godot/scene-export.yaml +7 -0
- package/src/adapters/google/news.yaml +7 -0
- package/src/adapters/google/search.yaml +7 -0
- package/src/adapters/google/suggest.yaml +7 -0
- package/src/adapters/google/trends.yaml +7 -0
- package/src/adapters/grok/ask.yaml +7 -0
- package/src/adapters/hackernews/ask.yaml +7 -0
- package/src/adapters/hackernews/best.yaml +7 -0
- package/src/adapters/hackernews/comments.yaml +7 -0
- package/src/adapters/hackernews/item.yaml +7 -0
- package/src/adapters/hackernews/jobs.yaml +7 -0
- package/src/adapters/hackernews/new.yaml +7 -0
- package/src/adapters/hackernews/search.yaml +7 -0
- package/src/adapters/hackernews/show.yaml +7 -0
- package/src/adapters/hackernews/top.yaml +7 -0
- package/src/adapters/hackernews/user.yaml +7 -0
- package/src/adapters/hermes/sessions-search.yaml +7 -0
- package/src/adapters/hermes/skills-list.yaml +7 -0
- package/src/adapters/hermes/skills-read.yaml +7 -0
- package/src/adapters/hf/datasets.yaml +7 -0
- package/src/adapters/hf/models.yaml +7 -0
- package/src/adapters/hf/spaces.yaml +7 -0
- package/src/adapters/hf/top.yaml +7 -0
- package/src/adapters/homebrew/info.yaml +7 -0
- package/src/adapters/homebrew/search.yaml +7 -0
- package/src/adapters/huggingface-papers/daily.yaml +7 -0
- package/src/adapters/huggingface-papers/search.yaml +7 -0
- package/src/adapters/hupu/detail.yaml +7 -0
- package/src/adapters/hupu/hot.yaml +7 -0
- package/src/adapters/hupu/like.yaml +7 -0
- package/src/adapters/hupu/mentions.yaml +7 -0
- package/src/adapters/hupu/reply.yaml +7 -0
- package/src/adapters/hupu/search.yaml +7 -0
- package/src/adapters/hupu/unlike.yaml +7 -0
- package/src/adapters/imagemagick/compare.yaml +7 -0
- package/src/adapters/imagemagick/composite.yaml +7 -0
- package/src/adapters/imagemagick/convert.yaml +7 -0
- package/src/adapters/imagemagick/identify.yaml +7 -0
- package/src/adapters/imagemagick/montage.yaml +7 -0
- package/src/adapters/imagemagick/resize.yaml +7 -0
- package/src/adapters/imdb/box-office.yaml +7 -0
- package/src/adapters/imdb/person.yaml +7 -0
- package/src/adapters/imdb/reviews.yaml +7 -0
- package/src/adapters/imdb/search.yaml +7 -0
- package/src/adapters/imdb/title.yaml +7 -0
- package/src/adapters/imdb/top.yaml +7 -0
- package/src/adapters/imdb/trending.yaml +7 -0
- package/src/adapters/imessage/contact.yaml +73 -0
- package/src/adapters/imessage/recent.yaml +66 -0
- package/src/adapters/imessage/search.yaml +75 -0
- package/src/adapters/infoq/articles.yaml +7 -0
- package/src/adapters/infoq/latest.yaml +7 -0
- package/src/adapters/inkscape/convert.yaml +7 -0
- package/src/adapters/inkscape/export.yaml +7 -0
- package/src/adapters/inkscape/optimize.yaml +7 -0
- package/src/adapters/instagram/activity.yaml +7 -0
- package/src/adapters/instagram/comment.yaml +7 -0
- package/src/adapters/instagram/explore.yaml +7 -0
- package/src/adapters/instagram/follow.yaml +7 -0
- package/src/adapters/instagram/followers.yaml +7 -0
- package/src/adapters/instagram/following.yaml +7 -0
- package/src/adapters/instagram/highlights.yaml +7 -0
- package/src/adapters/instagram/like.yaml +7 -0
- package/src/adapters/instagram/profile.yaml +7 -0
- package/src/adapters/instagram/reels-trending.yaml +7 -0
- package/src/adapters/instagram/reels.yaml +7 -0
- package/src/adapters/instagram/save.yaml +7 -0
- package/src/adapters/instagram/saved.yaml +7 -0
- package/src/adapters/instagram/search.yaml +7 -0
- package/src/adapters/instagram/stories.yaml +7 -0
- package/src/adapters/instagram/suggested.yaml +7 -0
- package/src/adapters/instagram/tags.yaml +7 -0
- package/src/adapters/instagram/unfollow.yaml +7 -0
- package/src/adapters/instagram/unlike.yaml +7 -0
- package/src/adapters/instagram/unsave.yaml +7 -0
- package/src/adapters/instagram/user.yaml +7 -0
- package/src/adapters/ip-info/lookup.yaml +7 -0
- package/src/adapters/itch-io/popular.yaml +7 -0
- package/src/adapters/itch-io/search.yaml +7 -0
- package/src/adapters/itch-io/top.yaml +7 -0
- package/src/adapters/ithome/hot.yaml +7 -0
- package/src/adapters/ithome/latest.yaml +7 -0
- package/src/adapters/ithome/news.yaml +7 -0
- package/src/adapters/jd/_site.json +9 -0
- package/src/adapters/jd/hot.yaml +7 -0
- package/src/adapters/jd/item.yaml +7 -0
- package/src/adapters/jd/search.yaml +7 -0
- package/src/adapters/jianyu/search.yaml +7 -0
- package/src/adapters/jike/feed.yaml +7 -0
- package/src/adapters/jike/notifications.yaml +7 -0
- package/src/adapters/jike/post.yaml +7 -0
- package/src/adapters/jike/search.yaml +7 -0
- package/src/adapters/jike/topic.yaml +7 -0
- package/src/adapters/jike/user.yaml +7 -0
- package/src/adapters/jimeng/generate.yaml +7 -0
- package/src/adapters/jimeng/history.yaml +7 -0
- package/src/adapters/jq/format.yaml +7 -0
- package/src/adapters/jq/query.yaml +7 -0
- package/src/adapters/kdenlive/effects.yaml +7 -0
- package/src/adapters/kdenlive/info.yaml +7 -0
- package/src/adapters/kdenlive/render.yaml +7 -0
- package/src/adapters/ke/ershoufang.yaml +7 -0
- package/src/adapters/ke/xiaoqu.yaml +7 -0
- package/src/adapters/krita/batch.yaml +7 -0
- package/src/adapters/krita/convert.yaml +7 -0
- package/src/adapters/krita/export.yaml +7 -0
- package/src/adapters/krita/info.yaml +7 -0
- package/src/adapters/kuaishou/hot.yaml +8 -0
- package/src/adapters/kuaishou/search.yaml +8 -0
- package/src/adapters/lark/version.yaml +7 -0
- package/src/adapters/lesswrong/comments.yaml +7 -0
- package/src/adapters/lesswrong/curated.yaml +7 -0
- package/src/adapters/lesswrong/frontpage.yaml +7 -0
- package/src/adapters/lesswrong/new.yaml +7 -0
- package/src/adapters/lesswrong/read.yaml +7 -0
- package/src/adapters/lesswrong/sequences.yaml +7 -0
- package/src/adapters/lesswrong/shortform.yaml +7 -0
- package/src/adapters/lesswrong/tag.yaml +7 -0
- package/src/adapters/lesswrong/tags.yaml +7 -0
- package/src/adapters/lesswrong/top-month.yaml +7 -0
- package/src/adapters/lesswrong/top-week.yaml +7 -0
- package/src/adapters/lesswrong/top-year.yaml +7 -0
- package/src/adapters/lesswrong/top.yaml +7 -0
- package/src/adapters/lesswrong/user-posts.yaml +7 -0
- package/src/adapters/lesswrong/user.yaml +7 -0
- package/src/adapters/libreoffice/convert.yaml +7 -0
- package/src/adapters/libreoffice/print.yaml +7 -0
- package/src/adapters/linear/issue-create.yaml +98 -0
- package/src/adapters/linear/issue-list.yaml +87 -0
- package/src/adapters/linear/issue-update.yaml +100 -0
- package/src/adapters/linkedin/_site.json +10 -0
- package/src/adapters/linkedin/jobs.yaml +7 -0
- package/src/adapters/linkedin/profile.yaml +7 -0
- package/src/adapters/linkedin/search.yaml +7 -0
- package/src/adapters/linkedin/timeline.yaml +7 -0
- package/src/adapters/linux-do/categories.yaml +7 -0
- package/src/adapters/linux-do/category.yaml +7 -0
- package/src/adapters/linux-do/feed.yaml +7 -0
- package/src/adapters/linux-do/hot.yaml +7 -0
- package/src/adapters/linux-do/latest.yaml +7 -0
- package/src/adapters/linux-do/search.yaml +7 -0
- package/src/adapters/linux-do/tags.yaml +7 -0
- package/src/adapters/linux-do/topic.yaml +7 -0
- package/src/adapters/linux-do/user-posts.yaml +7 -0
- package/src/adapters/linux-do/user-topics.yaml +7 -0
- package/src/adapters/lobsters/active.yaml +7 -0
- package/src/adapters/lobsters/hot.yaml +7 -0
- package/src/adapters/lobsters/newest.yaml +7 -0
- package/src/adapters/lobsters/search.yaml +7 -0
- package/src/adapters/lobsters/tag.yaml +7 -0
- package/src/adapters/macos/active-app.yaml +7 -0
- package/src/adapters/macos/apps-list.yaml +7 -0
- package/src/adapters/macos/apps.yaml +7 -0
- package/src/adapters/macos/battery.yaml +7 -0
- package/src/adapters/macos/bluetooth.yaml +7 -0
- package/src/adapters/macos/brightness.yaml +7 -0
- package/src/adapters/macos/caffeinate.yaml +7 -0
- package/src/adapters/macos/calendar-create.yaml +7 -0
- package/src/adapters/macos/calendar-list.yaml +7 -0
- package/src/adapters/macos/calendar-today.yaml +7 -0
- package/src/adapters/macos/clipboard.yaml +7 -0
- package/src/adapters/macos/contacts-search.yaml +7 -0
- package/src/adapters/macos/dark-mode.yaml +7 -0
- package/src/adapters/macos/disk-info.yaml +7 -0
- package/src/adapters/macos/disk-usage.yaml +7 -0
- package/src/adapters/macos/do-not-disturb.yaml +7 -0
- package/src/adapters/macos/empty-trash.yaml +7 -0
- package/src/adapters/macos/finder-copy.yaml +47 -0
- package/src/adapters/macos/finder-move.yaml +47 -0
- package/src/adapters/macos/finder-new-folder.yaml +43 -0
- package/src/adapters/macos/finder-recent.yaml +7 -0
- package/src/adapters/macos/finder-selection.yaml +7 -0
- package/src/adapters/macos/finder-tags.yaml +7 -0
- package/src/adapters/macos/lock-screen.yaml +7 -0
- package/src/adapters/macos/mail-send.yaml +7 -0
- package/src/adapters/macos/mail-status.yaml +7 -0
- package/src/adapters/macos/messages-send.yaml +7 -0
- package/src/adapters/macos/music-control.yaml +7 -0
- package/src/adapters/macos/music-now.yaml +7 -0
- package/src/adapters/macos/notes-list.yaml +7 -0
- package/src/adapters/macos/notes-search.yaml +7 -0
- package/src/adapters/macos/notification.yaml +7 -0
- package/src/adapters/macos/notify.yaml +7 -0
- package/src/adapters/macos/open-app.yaml +7 -0
- package/src/adapters/macos/open.yaml +7 -0
- package/src/adapters/macos/photos-search.yaml +7 -0
- package/src/adapters/macos/processes.yaml +7 -0
- package/src/adapters/macos/reminder-create.yaml +7 -0
- package/src/adapters/macos/reminders-complete.yaml +7 -0
- package/src/adapters/macos/reminders-list.yaml +7 -0
- package/src/adapters/macos/safari-history.yaml +30 -0
- package/src/adapters/macos/safari-tabs.yaml +7 -0
- package/src/adapters/macos/safari-url.yaml +29 -0
- package/src/adapters/macos/say.yaml +7 -0
- package/src/adapters/macos/screen-lock.yaml +7 -0
- package/src/adapters/macos/screen-recording.yaml +39 -0
- package/src/adapters/macos/screenshot.yaml +7 -0
- package/src/adapters/macos/shortcuts-list.yaml +7 -0
- package/src/adapters/macos/shortcuts-run.yaml +7 -0
- package/src/adapters/macos/sleep.yaml +7 -0
- package/src/adapters/macos/spotlight.yaml +7 -0
- package/src/adapters/macos/system-info.yaml +7 -0
- package/src/adapters/macos/trash.yaml +7 -0
- package/src/adapters/macos/uptime.yaml +7 -0
- package/src/adapters/macos/volume.yaml +7 -0
- package/src/adapters/macos/wallpaper.yaml +40 -0
- package/src/adapters/macos/wifi-info.yaml +7 -0
- package/src/adapters/macos/wifi.yaml +7 -0
- package/src/adapters/maimai/search.yaml +7 -0
- package/src/adapters/maoyan/hot.yaml +7 -0
- package/src/adapters/maoyan/search.yaml +7 -0
- package/src/adapters/mastodon/search.yaml +7 -0
- package/src/adapters/mastodon/timeline.yaml +7 -0
- package/src/adapters/mastodon/trending.yaml +7 -0
- package/src/adapters/mastodon/user.yaml +7 -0
- package/src/adapters/medium/article.yaml +7 -0
- package/src/adapters/medium/feed.yaml +7 -0
- package/src/adapters/medium/search.yaml +7 -0
- package/src/adapters/medium/trending.yaml +7 -0
- package/src/adapters/medium/user.yaml +7 -0
- package/src/adapters/meituan/hot.yaml +7 -0
- package/src/adapters/meituan/search.yaml +7 -0
- package/src/adapters/mermaid/render.yaml +7 -0
- package/src/adapters/minimax/chat.yaml +7 -0
- package/src/adapters/minimax/models.yaml +7 -0
- package/src/adapters/minimax/tts.yaml +7 -0
- package/src/adapters/motion-studio/component-get.yaml +7 -0
- package/src/adapters/mubu/list.yaml +7 -0
- package/src/adapters/mubu/search.yaml +14 -0
- package/src/adapters/musescore/convert.yaml +7 -0
- package/src/adapters/musescore/export.yaml +7 -0
- package/src/adapters/musescore/info.yaml +7 -0
- package/src/adapters/musescore/instruments.yaml +7 -0
- package/src/adapters/musescore/transpose.yaml +7 -0
- package/src/adapters/neonctl/projects.yaml +7 -0
- package/src/adapters/netease-music/hot.yaml +7 -0
- package/src/adapters/netease-music/playlist.yaml +7 -0
- package/src/adapters/netease-music/search.yaml +7 -0
- package/src/adapters/netease-music/top.yaml +7 -0
- package/src/adapters/netlify/sites.yaml +7 -0
- package/src/adapters/notebooklm/current.yaml +7 -0
- package/src/adapters/notebooklm/get.yaml +7 -0
- package/src/adapters/notebooklm/history.yaml +7 -0
- package/src/adapters/notebooklm/list.yaml +7 -0
- package/src/adapters/notebooklm/note-list.yaml +7 -0
- package/src/adapters/notebooklm/notes-get.yaml +7 -0
- package/src/adapters/notebooklm/open.yaml +7 -0
- package/src/adapters/notebooklm/rpc.yaml +7 -0
- package/src/adapters/notebooklm/shared.yaml +7 -0
- package/src/adapters/notebooklm/source-fulltext.yaml +7 -0
- package/src/adapters/notebooklm/source-get.yaml +7 -0
- package/src/adapters/notebooklm/source-guide.yaml +7 -0
- package/src/adapters/notebooklm/source-list.yaml +7 -0
- package/src/adapters/notebooklm/status.yaml +7 -0
- package/src/adapters/notebooklm/summary.yaml +7 -0
- package/src/adapters/notion/databases.yaml +7 -0
- package/src/adapters/notion/pages.yaml +7 -0
- package/src/adapters/notion/search.yaml +7 -0
- package/src/adapters/novita/generate.yaml +7 -0
- package/src/adapters/novita/models.yaml +7 -0
- package/src/adapters/novita/status.yaml +7 -0
- package/src/adapters/npm/downloads.yaml +7 -0
- package/src/adapters/npm/info.yaml +7 -0
- package/src/adapters/npm/search.yaml +7 -0
- package/src/adapters/npm/versions.yaml +7 -0
- package/src/adapters/npm-trends/compare.yaml +7 -0
- package/src/adapters/npm-trends/trending.yaml +7 -0
- package/src/adapters/nytimes/search.yaml +7 -0
- package/src/adapters/nytimes/top.yaml +7 -0
- package/src/adapters/obs/record-start.yaml +7 -0
- package/src/adapters/obs/record-stop.yaml +7 -0
- package/src/adapters/obs/scenes.yaml +7 -0
- package/src/adapters/obs/screenshot.yaml +7 -0
- package/src/adapters/obs/sources.yaml +7 -0
- package/src/adapters/obs/status.yaml +7 -0
- package/src/adapters/obs/stream-start.yaml +7 -0
- package/src/adapters/obs/stream-stop.yaml +7 -0
- package/src/adapters/obsidian/daily.yaml +7 -0
- package/src/adapters/obsidian/open.yaml +7 -0
- package/src/adapters/obsidian/search.yaml +7 -0
- package/src/adapters/ollama/generate.yaml +7 -0
- package/src/adapters/ollama/list.yaml +7 -0
- package/src/adapters/ollama/models.yaml +7 -0
- package/src/adapters/ollama/ps.yaml +7 -0
- package/src/adapters/ones/enrich-tasks.yaml +7 -0
- package/src/adapters/ones/login.yaml +7 -0
- package/src/adapters/ones/logout.yaml +7 -0
- package/src/adapters/ones/me.yaml +7 -0
- package/src/adapters/ones/my-tasks.yaml +7 -0
- package/src/adapters/ones/resolve-labels.yaml +7 -0
- package/src/adapters/ones/task-helpers.yaml +7 -0
- package/src/adapters/ones/task.yaml +7 -0
- package/src/adapters/ones/tasks.yaml +7 -0
- package/src/adapters/ones/token-info.yaml +7 -0
- package/src/adapters/ones/worklog.yaml +7 -0
- package/src/adapters/opencode/version.yaml +7 -0
- package/src/adapters/openharness/memory-read.yaml +7 -0
- package/src/adapters/openharness/skills-list.yaml +7 -0
- package/src/adapters/openrouter/models.yaml +7 -0
- package/src/adapters/openrouter/search.yaml +7 -0
- package/src/adapters/pandoc/convert.yaml +7 -0
- package/src/adapters/paperreview/feedback.yaml +7 -0
- package/src/adapters/paperreview/review.yaml +7 -0
- package/src/adapters/paperreview/submit.yaml +7 -0
- package/src/adapters/perplexity/ask.yaml +7 -0
- package/src/adapters/pexels/curated.yaml +7 -0
- package/src/adapters/pexels/search.yaml +7 -0
- package/src/adapters/pinduoduo/hot.yaml +7 -0
- package/src/adapters/pinduoduo/search.yaml +7 -0
- package/src/adapters/pixiv/detail.yaml +7 -0
- package/src/adapters/pixiv/download.yaml +7 -0
- package/src/adapters/pixiv/illusts.yaml +7 -0
- package/src/adapters/pixiv/ranking.yaml +7 -0
- package/src/adapters/pixiv/search.yaml +7 -0
- package/src/adapters/pixiv/user.yaml +7 -0
- package/src/adapters/producthunt/browse.yaml +7 -0
- package/src/adapters/producthunt/hot.yaml +7 -0
- package/src/adapters/producthunt/posts.yaml +7 -0
- package/src/adapters/producthunt/search.yaml +7 -0
- package/src/adapters/producthunt/today.yaml +7 -0
- package/src/adapters/pscale/databases.yaml +7 -0
- package/src/adapters/pypi/info.yaml +7 -0
- package/src/adapters/pypi/search.yaml +7 -0
- package/src/adapters/pypi/versions.yaml +7 -0
- package/src/adapters/quark/ls.yaml +7 -0
- package/src/adapters/quark/search.yaml +7 -0
- package/src/adapters/qweather/forecast.yaml +7 -0
- package/src/adapters/qweather/now.yaml +7 -0
- package/src/adapters/railway/deploy.yaml +7 -0
- package/src/adapters/reddit/comment.yaml +7 -0
- package/src/adapters/reddit/comments.yaml +7 -0
- package/src/adapters/reddit/frontpage.yaml +7 -0
- package/src/adapters/reddit/hot.yaml +7 -0
- package/src/adapters/reddit/new.yaml +7 -0
- package/src/adapters/reddit/popular.yaml +7 -0
- package/src/adapters/reddit/read.yaml +7 -0
- package/src/adapters/reddit/rising.yaml +7 -0
- package/src/adapters/reddit/save.yaml +7 -0
- package/src/adapters/reddit/saved.yaml +7 -0
- package/src/adapters/reddit/search.yaml +7 -0
- package/src/adapters/reddit/subreddit.yaml +7 -0
- package/src/adapters/reddit/subscribe.yaml +7 -0
- package/src/adapters/reddit/top.yaml +7 -0
- package/src/adapters/reddit/trending.yaml +7 -0
- package/src/adapters/reddit/upvote.yaml +7 -0
- package/src/adapters/reddit/upvoted.yaml +7 -0
- package/src/adapters/reddit/user-comments.yaml +7 -0
- package/src/adapters/reddit/user-posts.yaml +7 -0
- package/src/adapters/reddit/user.yaml +7 -0
- package/src/adapters/renderdoc/capture-list.yaml +7 -0
- package/src/adapters/renderdoc/frame-export.yaml +7 -0
- package/src/adapters/replicate/run.yaml +7 -0
- package/src/adapters/replicate/search.yaml +7 -0
- package/src/adapters/replicate/trending.yaml +7 -0
- package/src/adapters/reuters/_site.json +9 -0
- package/src/adapters/reuters/article.yaml +7 -0
- package/src/adapters/reuters/latest.yaml +7 -0
- package/src/adapters/reuters/search.yaml +7 -0
- package/src/adapters/reuters/top.yaml +7 -0
- package/src/adapters/shotcut/effects.yaml +7 -0
- package/src/adapters/shotcut/info.yaml +7 -0
- package/src/adapters/shotcut/render.yaml +7 -0
- package/src/adapters/sinablog/_site.json +9 -0
- package/src/adapters/sinablog/article.yaml +7 -0
- package/src/adapters/sinablog/hot.yaml +7 -0
- package/src/adapters/sinablog/search.yaml +7 -0
- package/src/adapters/sinablog/user.yaml +7 -0
- package/src/adapters/sinafinance/market.yaml +7 -0
- package/src/adapters/sinafinance/news.yaml +7 -0
- package/src/adapters/sinafinance/rolling-news.yaml +7 -0
- package/src/adapters/sinafinance/stock-rank.yaml +7 -0
- package/src/adapters/sinafinance/stock.yaml +7 -0
- package/src/adapters/sketch/artboards.yaml +7 -0
- package/src/adapters/sketch/export.yaml +7 -0
- package/src/adapters/sketch/symbols.yaml +7 -0
- package/src/adapters/slack/channels.yaml +7 -0
- package/src/adapters/slack/messages.yaml +7 -0
- package/src/adapters/slack/post.yaml +7 -0
- package/src/adapters/slack/search.yaml +7 -0
- package/src/adapters/slack/send.yaml +7 -0
- package/src/adapters/slack/status.yaml +7 -0
- package/src/adapters/slack/users.yaml +7 -0
- package/src/adapters/slay-the-spire-ii/deck.yaml +7 -0
- package/src/adapters/slay-the-spire-ii/end-turn.yaml +7 -0
- package/src/adapters/slay-the-spire-ii/map.yaml +7 -0
- package/src/adapters/slay-the-spire-ii/play-card.yaml +7 -0
- package/src/adapters/slay-the-spire-ii/status.yaml +7 -0
- package/src/adapters/slay-the-spire-ii/use-potion.yaml +7 -0
- package/src/adapters/slock/servers.yaml +7 -0
- package/src/adapters/smzdm/_site.json +9 -0
- package/src/adapters/smzdm/article.yaml +7 -0
- package/src/adapters/smzdm/hot.yaml +7 -0
- package/src/adapters/smzdm/search.yaml +7 -0
- package/src/adapters/spotify/now-playing.yaml +7 -0
- package/src/adapters/spotify/playlists.yaml +7 -0
- package/src/adapters/spotify/search.yaml +7 -0
- package/src/adapters/spotify/top-tracks.yaml +7 -0
- package/src/adapters/sspai/hot.yaml +7 -0
- package/src/adapters/sspai/latest.yaml +7 -0
- package/src/adapters/stackoverflow/bounties.yaml +7 -0
- package/src/adapters/stackoverflow/hot.yaml +7 -0
- package/src/adapters/stackoverflow/question.yaml +7 -0
- package/src/adapters/stackoverflow/search.yaml +7 -0
- package/src/adapters/stackoverflow/tags.yaml +7 -0
- package/src/adapters/stackoverflow/unanswered.yaml +7 -0
- package/src/adapters/stagehand/wrap-observe.yaml +7 -0
- package/src/adapters/steam/app-details.yaml +7 -0
- package/src/adapters/steam/new-releases.yaml +7 -0
- package/src/adapters/steam/search.yaml +7 -0
- package/src/adapters/steam/specials.yaml +7 -0
- package/src/adapters/steam/top-sellers.yaml +7 -0
- package/src/adapters/steam/wishlist.yaml +7 -0
- package/src/adapters/substack/feed.yaml +7 -0
- package/src/adapters/substack/publication.yaml +7 -0
- package/src/adapters/substack/search.yaml +7 -0
- package/src/adapters/substack/trending.yaml +7 -0
- package/src/adapters/supabase/projects.yaml +7 -0
- package/src/adapters/taobao/hot.yaml +7 -0
- package/src/adapters/taobao/search.yaml +7 -0
- package/src/adapters/techcrunch/latest.yaml +7 -0
- package/src/adapters/techcrunch/search.yaml +7 -0
- package/src/adapters/theverge/latest.yaml +7 -0
- package/src/adapters/theverge/search.yaml +7 -0
- package/src/adapters/threads/hot.yaml +8 -0
- package/src/adapters/threads/search.yaml +8 -0
- package/src/adapters/tieba/hot.yaml +7 -0
- package/src/adapters/tieba/posts.yaml +7 -0
- package/src/adapters/tieba/read.yaml +7 -0
- package/src/adapters/tieba/search.yaml +7 -0
- package/src/adapters/tiktok/comment.yaml +7 -0
- package/src/adapters/tiktok/explore.yaml +7 -0
- package/src/adapters/tiktok/follow.yaml +7 -0
- package/src/adapters/tiktok/following.yaml +7 -0
- package/src/adapters/tiktok/friends.yaml +7 -0
- package/src/adapters/tiktok/like.yaml +7 -0
- package/src/adapters/tiktok/live.yaml +7 -0
- package/src/adapters/tiktok/notifications.yaml +7 -0
- package/src/adapters/tiktok/profile.yaml +7 -0
- package/src/adapters/tiktok/save.yaml +7 -0
- package/src/adapters/tiktok/search.yaml +7 -0
- package/src/adapters/tiktok/trending.yaml +7 -0
- package/src/adapters/tiktok/unfollow.yaml +7 -0
- package/src/adapters/tiktok/unlike.yaml +7 -0
- package/src/adapters/tiktok/unsave.yaml +7 -0
- package/src/adapters/tiktok/user.yaml +7 -0
- package/src/adapters/toutiao/hot.yaml +7 -0
- package/src/adapters/toutiao/search.yaml +8 -0
- package/src/adapters/twitch/games.yaml +7 -0
- package/src/adapters/twitch/search.yaml +7 -0
- package/src/adapters/twitch/streams.yaml +7 -0
- package/src/adapters/twitch/top.yaml +7 -0
- package/src/adapters/twitter/lists.yaml +7 -0
- package/src/adapters/twitter/media.yaml +7 -0
- package/src/adapters/twitter/mentions.yaml +7 -0
- package/src/adapters/twitter/mute.yaml +7 -0
- package/src/adapters/twitter/pin.yaml +7 -0
- package/src/adapters/twitter/quotes.yaml +7 -0
- package/src/adapters/twitter/retweets.yaml +7 -0
- package/src/adapters/twitter/spaces.yaml +7 -0
- package/src/adapters/twitter/unmute.yaml +7 -0
- package/src/adapters/unsplash/random.yaml +7 -0
- package/src/adapters/unsplash/search.yaml +7 -0
- package/src/adapters/v2ex/daily.yaml +7 -0
- package/src/adapters/v2ex/hot.yaml +7 -0
- package/src/adapters/v2ex/latest.yaml +7 -0
- package/src/adapters/v2ex/me.yaml +7 -0
- package/src/adapters/v2ex/member.yaml +7 -0
- package/src/adapters/v2ex/node.yaml +7 -0
- package/src/adapters/v2ex/nodes.yaml +7 -0
- package/src/adapters/v2ex/notifications.yaml +7 -0
- package/src/adapters/v2ex/replies.yaml +7 -0
- package/src/adapters/v2ex/search.yaml +7 -0
- package/src/adapters/v2ex/topic.yaml +7 -0
- package/src/adapters/v2ex/user.yaml +7 -0
- package/src/adapters/vercel/list.yaml +7 -0
- package/src/adapters/vscode/extensions.yaml +7 -0
- package/src/adapters/vscode/install-ext.yaml +7 -0
- package/src/adapters/vscode/open.yaml +7 -0
- package/src/adapters/web/read.yaml +7 -0
- package/src/adapters/wechat-channels/hot.yaml +8 -0
- package/src/adapters/wechat-channels/search.yaml +15 -0
- package/src/adapters/weibo/comments.yaml +7 -0
- package/src/adapters/weibo/feed.yaml +7 -0
- package/src/adapters/weibo/hot.yaml +7 -0
- package/src/adapters/weibo/me.yaml +7 -0
- package/src/adapters/weibo/post.yaml +7 -0
- package/src/adapters/weibo/profile.yaml +7 -0
- package/src/adapters/weibo/search.yaml +7 -0
- package/src/adapters/weibo/timeline.yaml +7 -0
- package/src/adapters/weibo/trending.yaml +7 -0
- package/src/adapters/weibo/user.yaml +7 -0
- package/src/adapters/weixin/_site.json +9 -0
- package/src/adapters/weixin/article.yaml +7 -0
- package/src/adapters/weixin/download.yaml +7 -0
- package/src/adapters/weixin/hot.yaml +7 -0
- package/src/adapters/weixin/search.yaml +7 -0
- package/src/adapters/weread/book.yaml +7 -0
- package/src/adapters/weread/highlights.yaml +7 -0
- package/src/adapters/weread/notebooks.yaml +7 -0
- package/src/adapters/weread/notes.yaml +7 -0
- package/src/adapters/weread/ranking.yaml +7 -0
- package/src/adapters/weread/search.yaml +7 -0
- package/src/adapters/weread/shelf.yaml +7 -0
- package/src/adapters/wikipedia/random.yaml +7 -0
- package/src/adapters/wikipedia/search.yaml +7 -0
- package/src/adapters/wikipedia/summary.yaml +7 -0
- package/src/adapters/wikipedia/today.yaml +7 -0
- package/src/adapters/wikipedia/trending.yaml +7 -0
- package/src/adapters/wiremock/create-stub.yaml +7 -0
- package/src/adapters/wiremock/delete-stub.yaml +7 -0
- package/src/adapters/wiremock/reset.yaml +7 -0
- package/src/adapters/wiremock/stubs.yaml +7 -0
- package/src/adapters/wiremock/verify.yaml +7 -0
- package/src/adapters/wrangler/list.yaml +7 -0
- package/src/adapters/xianyu/chat.yaml +7 -0
- package/src/adapters/xianyu/item.yaml +7 -0
- package/src/adapters/xianyu/search.yaml +8 -0
- package/src/adapters/xiaoe/catalog.yaml +7 -0
- package/src/adapters/xiaoe/content.yaml +7 -0
- package/src/adapters/xiaoe/courses.yaml +7 -0
- package/src/adapters/xiaoe/detail.yaml +7 -0
- package/src/adapters/xiaoe/play-url.yaml +7 -0
- package/src/adapters/xiaohongshu/feed.yaml +7 -0
- package/src/adapters/xiaohongshu/follow.yaml +7 -0
- package/src/adapters/xiaohongshu/hashtag.yaml +7 -0
- package/src/adapters/xiaohongshu/hot.yaml +7 -0
- package/src/adapters/xiaohongshu/like.yaml +7 -0
- package/src/adapters/xiaohongshu/notifications.yaml +7 -0
- package/src/adapters/xiaohongshu/profile.yaml +7 -0
- package/src/adapters/xiaohongshu/save.yaml +7 -0
- package/src/adapters/xiaohongshu/suggest.yaml +7 -0
- package/src/adapters/xiaohongshu/trending.yaml +7 -0
- package/src/adapters/xiaohongshu/unfollow.yaml +7 -0
- package/src/adapters/xiaoyuzhou/episode.yaml +7 -0
- package/src/adapters/xiaoyuzhou/podcast-episodes.yaml +7 -0
- package/src/adapters/xiaoyuzhou/podcast.yaml +7 -0
- package/src/adapters/xueqiu/comments.yaml +7 -0
- package/src/adapters/xueqiu/earnings-date.yaml +7 -0
- package/src/adapters/xueqiu/feed.yaml +7 -0
- package/src/adapters/xueqiu/fund-holdings.yaml +7 -0
- package/src/adapters/xueqiu/fund-snapshot.yaml +7 -0
- package/src/adapters/xueqiu/hot-stock.yaml +7 -0
- package/src/adapters/xueqiu/hot.yaml +7 -0
- package/src/adapters/xueqiu/market.yaml +7 -0
- package/src/adapters/xueqiu/quote.yaml +7 -0
- package/src/adapters/xueqiu/search.yaml +7 -0
- package/src/adapters/xueqiu/stock.yaml +7 -0
- package/src/adapters/xueqiu/watchlist.yaml +7 -0
- package/src/adapters/yahoo-finance/quote.yaml +7 -0
- package/src/adapters/yahoo-finance/search.yaml +7 -0
- package/src/adapters/yahoo-finance/trending.yaml +7 -0
- package/src/adapters/ycombinator/launches.yaml +7 -0
- package/src/adapters/yollomi/background.yaml +7 -0
- package/src/adapters/yollomi/edit.yaml +7 -0
- package/src/adapters/yollomi/face-swap.yaml +7 -0
- package/src/adapters/yollomi/generate.yaml +7 -0
- package/src/adapters/yollomi/models.yaml +7 -0
- package/src/adapters/yollomi/object-remover.yaml +7 -0
- package/src/adapters/yollomi/remove-bg.yaml +7 -0
- package/src/adapters/yollomi/restore.yaml +7 -0
- package/src/adapters/yollomi/try-on.yaml +7 -0
- package/src/adapters/yollomi/upload.yaml +7 -0
- package/src/adapters/yollomi/upscale.yaml +7 -0
- package/src/adapters/yollomi/video.yaml +7 -0
- package/src/adapters/youtube/playlist.yaml +7 -0
- package/src/adapters/youtube/shorts.yaml +7 -0
- package/src/adapters/youtube/trending.yaml +7 -0
- package/src/adapters/yt-dlp/download.yaml +7 -0
- package/src/adapters/yt-dlp/extract-audio.yaml +7 -0
- package/src/adapters/yt-dlp/info.yaml +7 -0
- package/src/adapters/yt-dlp/search.yaml +7 -0
- package/src/adapters/yuanbao/ask.yaml +7 -0
- package/src/adapters/yuanbao/new.yaml +7 -0
- package/src/adapters/yuanbao/shared.yaml +7 -0
- package/src/adapters/zhihu/answer.yaml +7 -0
- package/src/adapters/zhihu/answers.yaml +7 -0
- package/src/adapters/zhihu/article.yaml +7 -0
- package/src/adapters/zhihu/articles.yaml +7 -0
- package/src/adapters/zhihu/collections.yaml +7 -0
- package/src/adapters/zhihu/columns.yaml +7 -0
- package/src/adapters/zhihu/comment.yaml +7 -0
- package/src/adapters/zhihu/download.yaml +7 -0
- package/src/adapters/zhihu/feed.yaml +7 -0
- package/src/adapters/zhihu/followers.yaml +7 -0
- package/src/adapters/zhihu/following.yaml +7 -0
- package/src/adapters/zhihu/hot.yaml +7 -0
- package/src/adapters/zhihu/me.yaml +7 -0
- package/src/adapters/zhihu/notifications.yaml +7 -0
- package/src/adapters/zhihu/pins.yaml +7 -0
- package/src/adapters/zhihu/question.yaml +7 -0
- package/src/adapters/zhihu/search.yaml +7 -0
- package/src/adapters/zhihu/topic.yaml +7 -0
- package/src/adapters/zhihu/topics.yaml +7 -0
- package/src/adapters/zhihu/trending.yaml +7 -0
- package/src/adapters/zhihu/user.yaml +7 -0
- package/src/adapters/zoom/join.yaml +7 -0
- package/src/adapters/zoom/start.yaml +7 -0
- package/src/adapters/zoom/toggle-mute.yaml +37 -0
- package/src/adapters/zotero/add-note.yaml +7 -0
- package/src/adapters/zotero/add-tag.yaml +7 -0
- package/src/adapters/zotero/collections.yaml +7 -0
- package/src/adapters/zotero/export.yaml +7 -0
- package/src/adapters/zotero/items.yaml +7 -0
- package/src/adapters/zotero/notes.yaml +7 -0
- package/src/adapters/zotero/search.yaml +7 -0
- package/src/adapters/zotero/tags.yaml +7 -0
- package/src/adapters/zsxq/dynamics.yaml +7 -0
- package/src/adapters/zsxq/groups.yaml +7 -0
- package/src/adapters/zsxq/search.yaml +7 -0
- package/src/adapters/zsxq/topic.yaml +7 -0
- package/src/adapters/zsxq/topics.yaml +7 -0
- package/src/adapters/1688/manifest.yaml +0 -7
- package/src/adapters/barchart/manifest.yaml +0 -8
- package/src/adapters/jd/manifest.yaml +0 -7
- package/src/adapters/linkedin/manifest.yaml +0 -8
- package/src/adapters/reuters/manifest.yaml +0 -7
- package/src/adapters/sinablog/manifest.yaml +0 -7
- package/src/adapters/smzdm/manifest.yaml +0 -7
- package/src/adapters/weixin/manifest.yaml +0 -7
|
@@ -0,0 +1,663 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CuaTransport — screenshot + VLM "Computer Use" transport.
|
|
3
|
+
*
|
|
4
|
+
* Unlike the other transports, CUA has no single protocol — it wraps a
|
|
5
|
+
* pluggable "backend" that implements the primitive perception/action
|
|
6
|
+
* verbs against a real computer-use model or emulator. v0.212 ships four
|
|
7
|
+
* backends selected by `CUA_BACKEND`:
|
|
8
|
+
*
|
|
9
|
+
* - `anthropic` Anthropic `computer_20251124` beta tool, `ANTHROPIC_API_KEY`
|
|
10
|
+
* - `trycua` trycua/cua compute-server v0.1.9+, `TRYCUA_API_KEY`
|
|
11
|
+
* - `opencua` OpenCUA-72B via local vLLM, `OPENCUA_ENDPOINT`
|
|
12
|
+
* - `scrapybara` Scrapybara Computer API, `SCRAPYBARA_API_KEY`
|
|
13
|
+
* - `mock` in-memory stub used by tests and when no key is present
|
|
14
|
+
*
|
|
15
|
+
* The real network paths to each provider are stubbed in v0.212 — they are
|
|
16
|
+
* gated behind the corresponding env keys and throw a structured
|
|
17
|
+
* `config_error` envelope if selected without credentials. The MockBackend
|
|
18
|
+
* is always available so the offline test suite runs without secrets.
|
|
19
|
+
*
|
|
20
|
+
* Design contract:
|
|
21
|
+
* - `action()` NEVER throws
|
|
22
|
+
* - all backends implement the same primitive verb surface (below)
|
|
23
|
+
* - selection is deterministic: `selectCuaBackend()` returns the same
|
|
24
|
+
* backend for the same env — no hidden state
|
|
25
|
+
*/
|
|
26
|
+
import { err, exitCodeFor, ok } from "../../core/envelope.js";
|
|
27
|
+
// ── Supported pipeline steps ────────────────────────────────────────────
|
|
28
|
+
const CUA_STEPS = [
|
|
29
|
+
"cua_snapshot",
|
|
30
|
+
"cua_click",
|
|
31
|
+
"cua_type",
|
|
32
|
+
"cua_key",
|
|
33
|
+
"cua_scroll",
|
|
34
|
+
"cua_drag",
|
|
35
|
+
"cua_wait",
|
|
36
|
+
"cua_assert",
|
|
37
|
+
"cua_ask",
|
|
38
|
+
"cua_backend",
|
|
39
|
+
"cua_launch",
|
|
40
|
+
];
|
|
41
|
+
const CUA_CAPABILITY = {
|
|
42
|
+
steps: CUA_STEPS,
|
|
43
|
+
snapshotFormats: ["screenshot"],
|
|
44
|
+
mutatesHost: true,
|
|
45
|
+
};
|
|
46
|
+
// ── Mock backend (offline, deterministic) ───────────────────────────────
|
|
47
|
+
/** Fixed 1x1 transparent PNG used by {@link MockBackend.snapshot}. */
|
|
48
|
+
const MOCK_PNG_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkAAIAAAoAAv/lxKUAAAAASUVORK5CYII=";
|
|
49
|
+
/**
|
|
50
|
+
* MockBackend — deterministic, offline CUA backend used when no provider
|
|
51
|
+
* credentials are present and by every test in this file. Records the
|
|
52
|
+
* sequence of calls on `history` so tests can assert against it without
|
|
53
|
+
* having to stub `fetch`.
|
|
54
|
+
*/
|
|
55
|
+
export class MockBackend {
|
|
56
|
+
name = "mock";
|
|
57
|
+
history = [];
|
|
58
|
+
record(verb, ...args) {
|
|
59
|
+
this.history.push({ verb, args });
|
|
60
|
+
}
|
|
61
|
+
async snapshot() {
|
|
62
|
+
this.record("snapshot");
|
|
63
|
+
return { base64: MOCK_PNG_BASE64, width: 1, height: 1, mime: "image/png" };
|
|
64
|
+
}
|
|
65
|
+
async click(x, y, button = "left") {
|
|
66
|
+
this.record("click", x, y, button);
|
|
67
|
+
}
|
|
68
|
+
async type(text) {
|
|
69
|
+
this.record("type", text);
|
|
70
|
+
}
|
|
71
|
+
async key(key) {
|
|
72
|
+
this.record("key", key);
|
|
73
|
+
}
|
|
74
|
+
async scroll(dx, dy) {
|
|
75
|
+
this.record("scroll", dx, dy);
|
|
76
|
+
}
|
|
77
|
+
async drag(fromX, fromY, toX, toY) {
|
|
78
|
+
this.record("drag", fromX, fromY, toX, toY);
|
|
79
|
+
}
|
|
80
|
+
async wait(ms) {
|
|
81
|
+
this.record("wait", ms);
|
|
82
|
+
// Intentionally not calling setTimeout — tests want determinism.
|
|
83
|
+
}
|
|
84
|
+
async ask(question) {
|
|
85
|
+
this.record("ask", question);
|
|
86
|
+
return "yes";
|
|
87
|
+
}
|
|
88
|
+
async launch(app) {
|
|
89
|
+
this.record("launch", app);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// ── Real-backend stubs ──────────────────────────────────────────────────
|
|
93
|
+
/**
|
|
94
|
+
* Base class used by every real backend. All verbs throw `BackendNotReadyError`
|
|
95
|
+
* by default; subclasses override what they support.
|
|
96
|
+
*
|
|
97
|
+
* Honesty note (2026-04-15): v0.212 ships `Anthropic`, `Trycua`, `OpenCua`
|
|
98
|
+
* and `Scrapybara` as **interface stubs**. They declare the shape the real
|
|
99
|
+
* backends will take, fail fast with a structured envelope when selected
|
|
100
|
+
* without their credentials, and let downstream tests pin the Mock
|
|
101
|
+
* backend for offline determinism. Full network implementations are
|
|
102
|
+
* tracked in `docs/ROADMAP.md` as v0.213 "Gagarin" targets — see there
|
|
103
|
+
* for the design of the screen-source ↔ planner composition that real
|
|
104
|
+
* Anthropic computer-use requires.
|
|
105
|
+
*
|
|
106
|
+
* Users who want a real backend today can implement the `CuaBackend`
|
|
107
|
+
* interface in their own code and inject it via
|
|
108
|
+
* {@link CuaTransport.setBackend}, or provide a factory through the
|
|
109
|
+
* `opts.backend` of the transport constructor. That surface is stable.
|
|
110
|
+
*/
|
|
111
|
+
class BackendNotReadyError extends Error {
|
|
112
|
+
backend;
|
|
113
|
+
verb;
|
|
114
|
+
hint;
|
|
115
|
+
constructor(backend, verb, hint) {
|
|
116
|
+
super(`cua backend "${backend}" is a v0.212 stub — ${verb} not implemented (${hint})`);
|
|
117
|
+
this.backend = backend;
|
|
118
|
+
this.verb = verb;
|
|
119
|
+
this.hint = hint;
|
|
120
|
+
this.name = "BackendNotReadyError";
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Anthropic `computer_use` tool stub. Selected when `CUA_BACKEND=anthropic`
|
|
125
|
+
* and `ANTHROPIC_API_KEY` is set.
|
|
126
|
+
*
|
|
127
|
+
* IMPORTANT — two-layer architecture: the Anthropic Messages API is a
|
|
128
|
+
* planner, not a screen capture service. A production Anthropic backend
|
|
129
|
+
* MUST be composed with a screenshot source (macOS `screencapture`,
|
|
130
|
+
* trycua sandbox, scrapybara VM) because the model receives screenshots
|
|
131
|
+
* from the client and returns `tool_use` actions. v0.212 ships this as
|
|
132
|
+
* a stub; the composition layer lands in v0.213 via a new
|
|
133
|
+
* `AnthropicPlanner(screenshotSource)` constructor — see
|
|
134
|
+
* `docs/ROADMAP.md` > v0.213 "Gagarin".
|
|
135
|
+
*
|
|
136
|
+
* `tool_version` defaults to `"computer_20260301"` (the successor to
|
|
137
|
+
* `computer_20251124` in the Sonnet 4.6 rollout); override via env
|
|
138
|
+
* `ANTHROPIC_CUA_TOOL_VERSION` so operators can follow Anthropic's
|
|
139
|
+
* release cadence without a code change.
|
|
140
|
+
*/
|
|
141
|
+
export class AnthropicBackend {
|
|
142
|
+
name = "anthropic";
|
|
143
|
+
apiKey;
|
|
144
|
+
model;
|
|
145
|
+
toolVersion;
|
|
146
|
+
constructor(apiKey, model = process.env.ANTHROPIC_CUA_MODEL ?? "claude-sonnet-4-6", toolVersion = process.env.ANTHROPIC_CUA_TOOL_VERSION ??
|
|
147
|
+
"computer_20260301") {
|
|
148
|
+
this.apiKey = apiKey;
|
|
149
|
+
this.model = model;
|
|
150
|
+
this.toolVersion = toolVersion;
|
|
151
|
+
}
|
|
152
|
+
async snapshot() {
|
|
153
|
+
throw new BackendNotReadyError(this.name, "snapshot", `the Anthropic Messages API does not capture screens; pair ${this.name} with a screenshot source (screencapture/trycua/scrapybara) — v0.213 Gagarin target`);
|
|
154
|
+
}
|
|
155
|
+
async click() {
|
|
156
|
+
throw new BackendNotReadyError(this.name, "click", `will POST /v1/messages with tool "${this.toolVersion}" action "left_click" in v0.213`);
|
|
157
|
+
}
|
|
158
|
+
async type() {
|
|
159
|
+
throw new BackendNotReadyError(this.name, "type", `will POST /v1/messages with tool "${this.toolVersion}" action "type" in v0.213`);
|
|
160
|
+
}
|
|
161
|
+
async key() {
|
|
162
|
+
throw new BackendNotReadyError(this.name, "key", `will POST /v1/messages with tool "${this.toolVersion}" action "key" in v0.213`);
|
|
163
|
+
}
|
|
164
|
+
async scroll() {
|
|
165
|
+
throw new BackendNotReadyError(this.name, "scroll", `will POST /v1/messages with tool "${this.toolVersion}" action "scroll" in v0.213`);
|
|
166
|
+
}
|
|
167
|
+
async drag() {
|
|
168
|
+
throw new BackendNotReadyError(this.name, "drag", `will POST /v1/messages with tool "${this.toolVersion}" action "left_click_drag" in v0.213`);
|
|
169
|
+
}
|
|
170
|
+
async wait(ms) {
|
|
171
|
+
await new Promise((r) => setTimeout(r, Math.max(0, ms)));
|
|
172
|
+
}
|
|
173
|
+
async ask() {
|
|
174
|
+
throw new BackendNotReadyError(this.name, "ask", `will POST /v1/messages without a tool for plain Q&A in v0.213; supply your own backend via CuaTransport.setBackend() today`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** trycua/cua compute-server v0.1.9+. Activated when `CUA_BACKEND=trycua`. */
|
|
178
|
+
export class TrycuaBackend {
|
|
179
|
+
name = "trycua";
|
|
180
|
+
apiKey;
|
|
181
|
+
endpoint;
|
|
182
|
+
constructor(apiKey, endpoint = "https://api.cua.dev") {
|
|
183
|
+
this.apiKey = apiKey;
|
|
184
|
+
this.endpoint = endpoint;
|
|
185
|
+
}
|
|
186
|
+
async snapshot() {
|
|
187
|
+
throw new BackendNotReadyError(this.name, "snapshot", "implement GET /v1/screen against the trycua compute-server");
|
|
188
|
+
}
|
|
189
|
+
async click() {
|
|
190
|
+
throw new BackendNotReadyError(this.name, "click", "POST /v1/click");
|
|
191
|
+
}
|
|
192
|
+
async type() {
|
|
193
|
+
throw new BackendNotReadyError(this.name, "type", "POST /v1/type");
|
|
194
|
+
}
|
|
195
|
+
async key() {
|
|
196
|
+
throw new BackendNotReadyError(this.name, "key", "POST /v1/key");
|
|
197
|
+
}
|
|
198
|
+
async scroll() {
|
|
199
|
+
throw new BackendNotReadyError(this.name, "scroll", "POST /v1/scroll");
|
|
200
|
+
}
|
|
201
|
+
async drag() {
|
|
202
|
+
throw new BackendNotReadyError(this.name, "drag", "POST /v1/drag");
|
|
203
|
+
}
|
|
204
|
+
async wait(ms) {
|
|
205
|
+
await new Promise((r) => setTimeout(r, Math.max(0, ms)));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/** OpenCUA-72B via local vLLM. Activated when `CUA_BACKEND=opencua`. */
|
|
209
|
+
export class OpenCuaBackend {
|
|
210
|
+
endpoint;
|
|
211
|
+
name = "opencua";
|
|
212
|
+
constructor(endpoint) {
|
|
213
|
+
this.endpoint = endpoint;
|
|
214
|
+
}
|
|
215
|
+
async snapshot() {
|
|
216
|
+
throw new BackendNotReadyError(this.name, "snapshot", "implement vLLM OpenCUA-72B screenshot call at " + this.endpoint);
|
|
217
|
+
}
|
|
218
|
+
async click() {
|
|
219
|
+
throw new BackendNotReadyError(this.name, "click", "implement vLLM action");
|
|
220
|
+
}
|
|
221
|
+
async type() {
|
|
222
|
+
throw new BackendNotReadyError(this.name, "type", "implement vLLM action");
|
|
223
|
+
}
|
|
224
|
+
async key() {
|
|
225
|
+
throw new BackendNotReadyError(this.name, "key", "implement vLLM action");
|
|
226
|
+
}
|
|
227
|
+
async scroll() {
|
|
228
|
+
throw new BackendNotReadyError(this.name, "scroll", "implement vLLM action");
|
|
229
|
+
}
|
|
230
|
+
async drag() {
|
|
231
|
+
throw new BackendNotReadyError(this.name, "drag", "implement vLLM action");
|
|
232
|
+
}
|
|
233
|
+
async wait(ms) {
|
|
234
|
+
await new Promise((r) => setTimeout(r, Math.max(0, ms)));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/** Scrapybara Computer API. Activated when `CUA_BACKEND=scrapybara`. */
|
|
238
|
+
export class ScrapybaraBackend {
|
|
239
|
+
name = "scrapybara";
|
|
240
|
+
apiKey;
|
|
241
|
+
endpoint;
|
|
242
|
+
constructor(apiKey, endpoint = "https://api.scrapybara.com") {
|
|
243
|
+
this.apiKey = apiKey;
|
|
244
|
+
this.endpoint = endpoint;
|
|
245
|
+
}
|
|
246
|
+
async snapshot() {
|
|
247
|
+
throw new BackendNotReadyError(this.name, "snapshot", "implement Scrapybara screenshot API");
|
|
248
|
+
}
|
|
249
|
+
async click() {
|
|
250
|
+
throw new BackendNotReadyError(this.name, "click", "Scrapybara click");
|
|
251
|
+
}
|
|
252
|
+
async type() {
|
|
253
|
+
throw new BackendNotReadyError(this.name, "type", "Scrapybara type");
|
|
254
|
+
}
|
|
255
|
+
async key() {
|
|
256
|
+
throw new BackendNotReadyError(this.name, "key", "Scrapybara key");
|
|
257
|
+
}
|
|
258
|
+
async scroll() {
|
|
259
|
+
throw new BackendNotReadyError(this.name, "scroll", "Scrapybara scroll");
|
|
260
|
+
}
|
|
261
|
+
async drag() {
|
|
262
|
+
throw new BackendNotReadyError(this.name, "drag", "Scrapybara drag");
|
|
263
|
+
}
|
|
264
|
+
async wait(ms) {
|
|
265
|
+
await new Promise((r) => setTimeout(r, Math.max(0, ms)));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Pure function — given an env snapshot, return the backend to use.
|
|
270
|
+
*
|
|
271
|
+
* Selection rules (first match wins):
|
|
272
|
+
* 1. `CUA_BACKEND=anthropic` and ANTHROPIC_API_KEY → AnthropicBackend
|
|
273
|
+
* 2. `CUA_BACKEND=trycua` and TRYCUA_API_KEY → TrycuaBackend
|
|
274
|
+
* 3. `CUA_BACKEND=opencua` and OPENCUA_ENDPOINT → OpenCuaBackend
|
|
275
|
+
* 4. `CUA_BACKEND=scrapybara` and SCRAPYBARA_API_KEY → ScrapybaraBackend
|
|
276
|
+
* 5. otherwise → MockBackend
|
|
277
|
+
*
|
|
278
|
+
* If the user names a backend but the required env is missing, we return a
|
|
279
|
+
* MockBackend tagged with a `missing` sentinel so the caller can emit a
|
|
280
|
+
* structured `config_error` envelope on first use.
|
|
281
|
+
*/
|
|
282
|
+
export function selectCuaBackend(env = process.env) {
|
|
283
|
+
const requested = (env.CUA_BACKEND ?? "").toLowerCase();
|
|
284
|
+
switch (requested) {
|
|
285
|
+
case "anthropic":
|
|
286
|
+
if (env.ANTHROPIC_API_KEY)
|
|
287
|
+
return new AnthropicBackend(env.ANTHROPIC_API_KEY);
|
|
288
|
+
return new MockBackend(); // ANTHROPIC_API_KEY missing → fallback
|
|
289
|
+
case "trycua":
|
|
290
|
+
if (env.TRYCUA_API_KEY)
|
|
291
|
+
return new TrycuaBackend(env.TRYCUA_API_KEY);
|
|
292
|
+
return new MockBackend();
|
|
293
|
+
case "opencua":
|
|
294
|
+
if (env.OPENCUA_ENDPOINT)
|
|
295
|
+
return new OpenCuaBackend(env.OPENCUA_ENDPOINT);
|
|
296
|
+
return new MockBackend();
|
|
297
|
+
case "scrapybara":
|
|
298
|
+
if (env.SCRAPYBARA_API_KEY)
|
|
299
|
+
return new ScrapybaraBackend(env.SCRAPYBARA_API_KEY);
|
|
300
|
+
return new MockBackend();
|
|
301
|
+
case "mock":
|
|
302
|
+
case "":
|
|
303
|
+
return new MockBackend();
|
|
304
|
+
default:
|
|
305
|
+
// Unknown backend name — fall back to mock so action() can envelope.
|
|
306
|
+
return new MockBackend();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* CuaTransport routes `cua_*` pipeline steps to the active backend, wraps
|
|
311
|
+
* every outcome in an envelope, and never throws from `action()`.
|
|
312
|
+
*/
|
|
313
|
+
export class CuaTransport {
|
|
314
|
+
kind = "cua";
|
|
315
|
+
capability = CUA_CAPABILITY;
|
|
316
|
+
backend;
|
|
317
|
+
lastSnapshot = undefined;
|
|
318
|
+
constructor(opts = {}) {
|
|
319
|
+
this.backend = opts.backend ?? selectCuaBackend(opts.env);
|
|
320
|
+
}
|
|
321
|
+
/** Introspect the active backend (used by tests + `cua_backend` step). */
|
|
322
|
+
get activeBackendName() {
|
|
323
|
+
return this.backend.name;
|
|
324
|
+
}
|
|
325
|
+
/** Swap backends at runtime — the `cua_backend` step uses this. */
|
|
326
|
+
setBackend(backend) {
|
|
327
|
+
this.backend = backend;
|
|
328
|
+
}
|
|
329
|
+
async open(_ctx) {
|
|
330
|
+
// No-op — CUA backends don't need pipeline vars today.
|
|
331
|
+
}
|
|
332
|
+
async snapshot(opts) {
|
|
333
|
+
const format = opts?.format ?? "screenshot";
|
|
334
|
+
if (this.lastSnapshot && format === this.lastSnapshot.format)
|
|
335
|
+
return this.lastSnapshot;
|
|
336
|
+
try {
|
|
337
|
+
const raw = await this.backend.snapshot();
|
|
338
|
+
const snap = {
|
|
339
|
+
format: "screenshot",
|
|
340
|
+
data: Buffer.from(raw.base64, "base64"),
|
|
341
|
+
width: raw.width,
|
|
342
|
+
height: raw.height,
|
|
343
|
+
};
|
|
344
|
+
this.lastSnapshot = snap;
|
|
345
|
+
return snap;
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
// Never throw from snapshot — return an empty JSON envelope.
|
|
349
|
+
return { format: "json", data: JSON.stringify({ ok: false }) };
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
async action(req) {
|
|
353
|
+
const start = Date.now();
|
|
354
|
+
try {
|
|
355
|
+
const envelope = await this.dispatch(req);
|
|
356
|
+
envelope.elapsedMs = Date.now() - start;
|
|
357
|
+
return envelope;
|
|
358
|
+
}
|
|
359
|
+
catch (e) {
|
|
360
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
361
|
+
return err({
|
|
362
|
+
transport: "cua",
|
|
363
|
+
step: 0,
|
|
364
|
+
action: req.kind,
|
|
365
|
+
reason: `unexpected error in cua.${req.kind}: ${msg}`,
|
|
366
|
+
suggestion: "check backend configuration and env vars",
|
|
367
|
+
retryable: false,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
async close() {
|
|
372
|
+
this.lastSnapshot = undefined;
|
|
373
|
+
}
|
|
374
|
+
// ── internals ────────────────────────────────────────────────────────
|
|
375
|
+
async dispatch(req) {
|
|
376
|
+
switch (req.kind) {
|
|
377
|
+
case "cua_snapshot":
|
|
378
|
+
return this.doSnapshot();
|
|
379
|
+
case "cua_click":
|
|
380
|
+
return this.doClick(req.params);
|
|
381
|
+
case "cua_type":
|
|
382
|
+
return this.doType(req.params);
|
|
383
|
+
case "cua_key":
|
|
384
|
+
return this.doKey(req.params);
|
|
385
|
+
case "cua_scroll":
|
|
386
|
+
return this.doScroll(req.params);
|
|
387
|
+
case "cua_drag":
|
|
388
|
+
return this.doDrag(req.params);
|
|
389
|
+
case "cua_wait":
|
|
390
|
+
return this.doWait(req.params);
|
|
391
|
+
case "cua_assert":
|
|
392
|
+
return this.doAssert(req.params);
|
|
393
|
+
case "cua_ask":
|
|
394
|
+
return this.doAsk(req.params);
|
|
395
|
+
case "cua_backend":
|
|
396
|
+
return this.doBackendInfo();
|
|
397
|
+
case "cua_launch":
|
|
398
|
+
return this.doLaunch(req.params);
|
|
399
|
+
default:
|
|
400
|
+
return err({
|
|
401
|
+
transport: "cua",
|
|
402
|
+
step: 0,
|
|
403
|
+
action: req.kind,
|
|
404
|
+
reason: `unsupported action "${req.kind}" for cua transport`,
|
|
405
|
+
suggestion: `cua transport supports: ${CUA_STEPS.join(", ")}`,
|
|
406
|
+
minimum_capability: `cua.${req.kind}`,
|
|
407
|
+
exit_code: exitCodeFor("usage_error"),
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
envelopeFromBackendError(verb, e) {
|
|
412
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
413
|
+
const notReady = e instanceof BackendNotReadyError;
|
|
414
|
+
return err({
|
|
415
|
+
transport: "cua",
|
|
416
|
+
step: 0,
|
|
417
|
+
action: verb,
|
|
418
|
+
reason: msg,
|
|
419
|
+
suggestion: notReady
|
|
420
|
+
? `install or configure the \`${this.backend.name}\` backend before calling cua.${verb}`
|
|
421
|
+
: "inspect backend error and retry",
|
|
422
|
+
minimum_capability: `cua.${verb}`,
|
|
423
|
+
retryable: !notReady,
|
|
424
|
+
exit_code: notReady
|
|
425
|
+
? exitCodeFor("config_error")
|
|
426
|
+
: exitCodeFor("service_unavailable"),
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
async doSnapshot() {
|
|
430
|
+
try {
|
|
431
|
+
const raw = await this.backend.snapshot();
|
|
432
|
+
this.lastSnapshot = {
|
|
433
|
+
format: "screenshot",
|
|
434
|
+
data: Buffer.from(raw.base64, "base64"),
|
|
435
|
+
width: raw.width,
|
|
436
|
+
height: raw.height,
|
|
437
|
+
};
|
|
438
|
+
return ok({
|
|
439
|
+
backend: this.backend.name,
|
|
440
|
+
width: raw.width,
|
|
441
|
+
height: raw.height,
|
|
442
|
+
base64: raw.base64,
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
catch (e) {
|
|
446
|
+
return this.envelopeFromBackendError("snapshot", e);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
async doClick(params) {
|
|
450
|
+
const x = typeof params.x === "number" ? params.x : undefined;
|
|
451
|
+
const y = typeof params.y === "number" ? params.y : undefined;
|
|
452
|
+
if (x === undefined || y === undefined) {
|
|
453
|
+
return err({
|
|
454
|
+
transport: "cua",
|
|
455
|
+
step: 0,
|
|
456
|
+
action: "cua_click",
|
|
457
|
+
reason: "cua_click requires numeric params.x and params.y",
|
|
458
|
+
suggestion: "pass { x, y } coordinates in pixel space",
|
|
459
|
+
exit_code: exitCodeFor("usage_error"),
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
const button = params.button === "right" ? "right" : "left";
|
|
463
|
+
try {
|
|
464
|
+
await this.backend.click(x, y, button);
|
|
465
|
+
return ok({ x, y, button });
|
|
466
|
+
}
|
|
467
|
+
catch (e) {
|
|
468
|
+
return this.envelopeFromBackendError("click", e);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
async doType(params) {
|
|
472
|
+
const text = typeof params.text === "string" ? params.text : undefined;
|
|
473
|
+
if (text === undefined) {
|
|
474
|
+
return err({
|
|
475
|
+
transport: "cua",
|
|
476
|
+
step: 0,
|
|
477
|
+
action: "cua_type",
|
|
478
|
+
reason: "cua_type requires params.text (string)",
|
|
479
|
+
suggestion: "pass the literal text to type",
|
|
480
|
+
exit_code: exitCodeFor("usage_error"),
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
try {
|
|
484
|
+
await this.backend.type(text);
|
|
485
|
+
return ok({ text });
|
|
486
|
+
}
|
|
487
|
+
catch (e) {
|
|
488
|
+
return this.envelopeFromBackendError("type", e);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
async doKey(params) {
|
|
492
|
+
const key = typeof params.key === "string" ? params.key : undefined;
|
|
493
|
+
if (!key) {
|
|
494
|
+
return err({
|
|
495
|
+
transport: "cua",
|
|
496
|
+
step: 0,
|
|
497
|
+
action: "cua_key",
|
|
498
|
+
reason: "cua_key requires params.key (string)",
|
|
499
|
+
suggestion: 'pass a named key, e.g. "Return", "cmd+a"',
|
|
500
|
+
exit_code: exitCodeFor("usage_error"),
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
try {
|
|
504
|
+
await this.backend.key(key);
|
|
505
|
+
return ok({ key });
|
|
506
|
+
}
|
|
507
|
+
catch (e) {
|
|
508
|
+
return this.envelopeFromBackendError("key", e);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
async doScroll(params) {
|
|
512
|
+
const dx = typeof params.dx === "number" ? params.dx : 0;
|
|
513
|
+
const dy = typeof params.dy === "number" ? params.dy : 0;
|
|
514
|
+
try {
|
|
515
|
+
await this.backend.scroll(dx, dy);
|
|
516
|
+
return ok({ dx, dy });
|
|
517
|
+
}
|
|
518
|
+
catch (e) {
|
|
519
|
+
return this.envelopeFromBackendError("scroll", e);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
async doDrag(params) {
|
|
523
|
+
const fromX = typeof params.fromX === "number" ? params.fromX : undefined;
|
|
524
|
+
const fromY = typeof params.fromY === "number" ? params.fromY : undefined;
|
|
525
|
+
const toX = typeof params.toX === "number" ? params.toX : undefined;
|
|
526
|
+
const toY = typeof params.toY === "number" ? params.toY : undefined;
|
|
527
|
+
if (fromX === undefined ||
|
|
528
|
+
fromY === undefined ||
|
|
529
|
+
toX === undefined ||
|
|
530
|
+
toY === undefined) {
|
|
531
|
+
return err({
|
|
532
|
+
transport: "cua",
|
|
533
|
+
step: 0,
|
|
534
|
+
action: "cua_drag",
|
|
535
|
+
reason: "cua_drag requires params.fromX/fromY/toX/toY numbers",
|
|
536
|
+
suggestion: "pass all four drag endpoints as numeric pixel coords",
|
|
537
|
+
exit_code: exitCodeFor("usage_error"),
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
try {
|
|
541
|
+
await this.backend.drag(fromX, fromY, toX, toY);
|
|
542
|
+
return ok({ fromX, fromY, toX, toY });
|
|
543
|
+
}
|
|
544
|
+
catch (e) {
|
|
545
|
+
return this.envelopeFromBackendError("drag", e);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
async doWait(params) {
|
|
549
|
+
const ms = typeof params.ms === "number"
|
|
550
|
+
? params.ms
|
|
551
|
+
: typeof params.seconds === "number"
|
|
552
|
+
? params.seconds * 1000
|
|
553
|
+
: 0;
|
|
554
|
+
try {
|
|
555
|
+
await this.backend.wait(Math.max(0, ms));
|
|
556
|
+
return ok({ ms });
|
|
557
|
+
}
|
|
558
|
+
catch (e) {
|
|
559
|
+
return this.envelopeFromBackendError("wait", e);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
async doAssert(params) {
|
|
563
|
+
// The CUA assert is a ask→boolean — the VLM decides whether the
|
|
564
|
+
// screen satisfies the predicate. With MockBackend it always passes.
|
|
565
|
+
const predicate = typeof params.predicate === "string" ? params.predicate : undefined;
|
|
566
|
+
if (!predicate) {
|
|
567
|
+
return err({
|
|
568
|
+
transport: "cua",
|
|
569
|
+
step: 0,
|
|
570
|
+
action: "cua_assert",
|
|
571
|
+
reason: "cua_assert requires params.predicate (string)",
|
|
572
|
+
suggestion: "pass a natural-language predicate for the VLM",
|
|
573
|
+
exit_code: exitCodeFor("usage_error"),
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
try {
|
|
577
|
+
const answer = this.backend.ask
|
|
578
|
+
? await this.backend.ask(`Does the screen satisfy: ${predicate}?`)
|
|
579
|
+
: "yes";
|
|
580
|
+
const truthy = /^(y|yes|true|1)$/i.test(answer.trim());
|
|
581
|
+
if (!truthy) {
|
|
582
|
+
return err({
|
|
583
|
+
transport: "cua",
|
|
584
|
+
step: 0,
|
|
585
|
+
action: "cua_assert",
|
|
586
|
+
reason: `VLM did not confirm predicate "${predicate}" (got ${answer})`,
|
|
587
|
+
suggestion: "inspect the latest snapshot or refine the predicate",
|
|
588
|
+
retryable: true,
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
return ok({ predicate, answer });
|
|
592
|
+
}
|
|
593
|
+
catch (e) {
|
|
594
|
+
return this.envelopeFromBackendError("assert", e);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
async doAsk(params) {
|
|
598
|
+
const question = typeof params.question === "string" ? params.question : undefined;
|
|
599
|
+
if (!question) {
|
|
600
|
+
return err({
|
|
601
|
+
transport: "cua",
|
|
602
|
+
step: 0,
|
|
603
|
+
action: "cua_ask",
|
|
604
|
+
reason: "cua_ask requires params.question (string)",
|
|
605
|
+
suggestion: "pass a natural-language question for the VLM",
|
|
606
|
+
exit_code: exitCodeFor("usage_error"),
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
if (!this.backend.ask) {
|
|
610
|
+
return err({
|
|
611
|
+
transport: "cua",
|
|
612
|
+
step: 0,
|
|
613
|
+
action: "cua_ask",
|
|
614
|
+
reason: `backend ${this.backend.name} does not implement ask()`,
|
|
615
|
+
suggestion: "use the anthropic or mock backend, or add ask() to the backend",
|
|
616
|
+
minimum_capability: "cua.ask",
|
|
617
|
+
exit_code: exitCodeFor("service_unavailable"),
|
|
618
|
+
});
|
|
619
|
+
}
|
|
620
|
+
try {
|
|
621
|
+
const answer = await this.backend.ask(question);
|
|
622
|
+
return ok({ question, answer });
|
|
623
|
+
}
|
|
624
|
+
catch (e) {
|
|
625
|
+
return this.envelopeFromBackendError("ask", e);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
async doBackendInfo() {
|
|
629
|
+
return ok({ backend: this.backend.name });
|
|
630
|
+
}
|
|
631
|
+
async doLaunch(params) {
|
|
632
|
+
const app = typeof params.app === "string" ? params.app : undefined;
|
|
633
|
+
if (!app) {
|
|
634
|
+
return err({
|
|
635
|
+
transport: "cua",
|
|
636
|
+
step: 0,
|
|
637
|
+
action: "cua_launch",
|
|
638
|
+
reason: "cua_launch requires params.app (string)",
|
|
639
|
+
suggestion: "pass the app name to launch",
|
|
640
|
+
exit_code: exitCodeFor("usage_error"),
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
if (!this.backend.launch) {
|
|
644
|
+
return err({
|
|
645
|
+
transport: "cua",
|
|
646
|
+
step: 0,
|
|
647
|
+
action: "cua_launch",
|
|
648
|
+
reason: `backend ${this.backend.name} does not support launch()`,
|
|
649
|
+
suggestion: "use desktop-ax.launch_app for native macOS launch, or Scrapybara sandbox",
|
|
650
|
+
minimum_capability: "cua.launch",
|
|
651
|
+
exit_code: exitCodeFor("service_unavailable"),
|
|
652
|
+
});
|
|
653
|
+
}
|
|
654
|
+
try {
|
|
655
|
+
await this.backend.launch(app);
|
|
656
|
+
return ok({ app });
|
|
657
|
+
}
|
|
658
|
+
catch (e) {
|
|
659
|
+
return this.envelopeFromBackendError("launch", e);
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
//# sourceMappingURL=cua.js.map
|