@otto-assistant/bridge 0.4.92
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/bin.js +2 -0
- package/dist/agent-model.e2e.test.js +755 -0
- package/dist/ai-tool-to-genai.js +233 -0
- package/dist/ai-tool-to-genai.test.js +267 -0
- package/dist/ai-tool.js +6 -0
- package/dist/anthropic-auth-plugin.js +728 -0
- package/dist/anthropic-auth-plugin.test.js +125 -0
- package/dist/anthropic-auth-state.js +231 -0
- package/dist/bin.js +90 -0
- package/dist/channel-management.js +227 -0
- package/dist/cli-parsing.test.js +137 -0
- package/dist/cli-send-thread.e2e.test.js +356 -0
- package/dist/cli.js +3276 -0
- package/dist/commands/abort.js +65 -0
- package/dist/commands/action-buttons.js +245 -0
- package/dist/commands/add-project.js +113 -0
- package/dist/commands/agent.js +335 -0
- package/dist/commands/ask-question.js +274 -0
- package/dist/commands/btw.js +116 -0
- package/dist/commands/compact.js +120 -0
- package/dist/commands/context-usage.js +140 -0
- package/dist/commands/create-new-project.js +130 -0
- package/dist/commands/diff.js +63 -0
- package/dist/commands/file-upload.js +275 -0
- package/dist/commands/fork.js +220 -0
- package/dist/commands/gemini-apikey.js +70 -0
- package/dist/commands/login.js +885 -0
- package/dist/commands/mcp.js +239 -0
- package/dist/commands/memory-snapshot.js +24 -0
- package/dist/commands/mention-mode.js +44 -0
- package/dist/commands/merge-worktree.js +159 -0
- package/dist/commands/model-variant.js +364 -0
- package/dist/commands/model.js +776 -0
- package/dist/commands/new-worktree.js +366 -0
- package/dist/commands/paginated-select.js +57 -0
- package/dist/commands/permissions.js +274 -0
- package/dist/commands/queue.js +206 -0
- package/dist/commands/remove-project.js +115 -0
- package/dist/commands/restart-opencode-server.js +127 -0
- package/dist/commands/resume.js +149 -0
- package/dist/commands/run-command.js +79 -0
- package/dist/commands/screenshare.js +303 -0
- package/dist/commands/screenshare.test.js +20 -0
- package/dist/commands/session-id.js +78 -0
- package/dist/commands/session.js +176 -0
- package/dist/commands/share.js +80 -0
- package/dist/commands/tasks.js +205 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/undo-redo.js +305 -0
- package/dist/commands/unset-model.js +138 -0
- package/dist/commands/upgrade.js +42 -0
- package/dist/commands/user-command.js +155 -0
- package/dist/commands/verbosity.js +125 -0
- package/dist/commands/worktree-settings.js +43 -0
- package/dist/commands/worktrees.js +410 -0
- package/dist/condense-memory.js +33 -0
- package/dist/config.js +94 -0
- package/dist/context-awareness-plugin.js +363 -0
- package/dist/context-awareness-plugin.test.js +124 -0
- package/dist/critique-utils.js +95 -0
- package/dist/database.js +1310 -0
- package/dist/db.js +251 -0
- package/dist/db.test.js +138 -0
- package/dist/debounce-timeout.js +28 -0
- package/dist/debounced-process-flush.js +77 -0
- package/dist/discord-bot.js +1008 -0
- package/dist/discord-command-registration.js +524 -0
- package/dist/discord-urls.js +81 -0
- package/dist/discord-utils.js +591 -0
- package/dist/discord-utils.test.js +134 -0
- package/dist/errors.js +157 -0
- package/dist/escape-backticks.test.js +429 -0
- package/dist/event-stream-real-capture.e2e.test.js +533 -0
- package/dist/eventsource-parser.test.js +327 -0
- package/dist/exec-async.js +26 -0
- package/dist/external-opencode-sync.js +480 -0
- package/dist/format-tables.js +302 -0
- package/dist/format-tables.test.js +308 -0
- package/dist/forum-sync/config.js +79 -0
- package/dist/forum-sync/discord-operations.js +154 -0
- package/dist/forum-sync/index.js +5 -0
- package/dist/forum-sync/markdown.js +113 -0
- package/dist/forum-sync/sync-to-discord.js +417 -0
- package/dist/forum-sync/sync-to-files.js +190 -0
- package/dist/forum-sync/types.js +53 -0
- package/dist/forum-sync/watchers.js +307 -0
- package/dist/gateway-proxy-reconnect.e2e.test.js +394 -0
- package/dist/gateway-proxy.e2e.test.js +483 -0
- package/dist/genai-worker-wrapper.js +111 -0
- package/dist/genai-worker.js +311 -0
- package/dist/genai.js +232 -0
- package/dist/generated/browser.js +17 -0
- package/dist/generated/client.js +37 -0
- package/dist/generated/commonInputTypes.js +10 -0
- package/dist/generated/enums.js +52 -0
- package/dist/generated/internal/class.js +49 -0
- package/dist/generated/internal/prismaNamespace.js +253 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js +223 -0
- package/dist/generated/models/bot_api_keys.js +1 -0
- package/dist/generated/models/bot_tokens.js +1 -0
- package/dist/generated/models/channel_agents.js +1 -0
- package/dist/generated/models/channel_directories.js +1 -0
- package/dist/generated/models/channel_mention_mode.js +1 -0
- package/dist/generated/models/channel_models.js +1 -0
- package/dist/generated/models/channel_verbosity.js +1 -0
- package/dist/generated/models/channel_worktrees.js +1 -0
- package/dist/generated/models/forum_sync_configs.js +1 -0
- package/dist/generated/models/global_models.js +1 -0
- package/dist/generated/models/ipc_requests.js +1 -0
- package/dist/generated/models/part_messages.js +1 -0
- package/dist/generated/models/scheduled_tasks.js +1 -0
- package/dist/generated/models/session_agents.js +1 -0
- package/dist/generated/models/session_events.js +1 -0
- package/dist/generated/models/session_models.js +1 -0
- package/dist/generated/models/session_start_sources.js +1 -0
- package/dist/generated/models/thread_sessions.js +1 -0
- package/dist/generated/models/thread_worktrees.js +1 -0
- package/dist/generated/models.js +1 -0
- package/dist/heap-monitor.js +122 -0
- package/dist/hrana-server.js +263 -0
- package/dist/hrana-server.test.js +370 -0
- package/dist/html-actions.js +123 -0
- package/dist/html-actions.test.js +70 -0
- package/dist/html-components.js +117 -0
- package/dist/html-components.test.js +34 -0
- package/dist/image-optimizer-plugin.js +153 -0
- package/dist/image-utils.js +112 -0
- package/dist/interaction-handler.js +397 -0
- package/dist/ipc-polling.js +252 -0
- package/dist/ipc-tools-plugin.js +193 -0
- package/dist/kimaki-digital-twin.e2e.test.js +161 -0
- package/dist/kimaki-opencode-plugin-loading.e2e.test.js +87 -0
- package/dist/kimaki-opencode-plugin.js +17 -0
- package/dist/kimaki-opencode-plugin.test.js +98 -0
- package/dist/limit-heading-depth.js +25 -0
- package/dist/limit-heading-depth.test.js +105 -0
- package/dist/logger.js +165 -0
- package/dist/markdown.js +342 -0
- package/dist/markdown.test.js +257 -0
- package/dist/message-finish-field.e2e.test.js +165 -0
- package/dist/message-formatting.js +413 -0
- package/dist/message-formatting.test.js +73 -0
- package/dist/message-preprocessing.js +330 -0
- package/dist/onboarding-tutorial.js +172 -0
- package/dist/onboarding-welcome.js +37 -0
- package/dist/openai-realtime.js +224 -0
- package/dist/opencode-command-detection.js +65 -0
- package/dist/opencode-command-detection.test.js +240 -0
- package/dist/opencode-command.js +129 -0
- package/dist/opencode-command.test.js +48 -0
- package/dist/opencode-interrupt-plugin.js +361 -0
- package/dist/opencode-interrupt-plugin.test.js +458 -0
- package/dist/opencode.js +861 -0
- package/dist/otto/branding.js +22 -0
- package/dist/otto/index.js +21 -0
- package/dist/parse-permission-rules.test.js +117 -0
- package/dist/patch-text-parser.js +97 -0
- package/dist/plugin-logger.js +59 -0
- package/dist/privacy-sanitizer.js +105 -0
- package/dist/queue-advanced-abort.e2e.test.js +293 -0
- package/dist/queue-advanced-action-buttons.e2e.test.js +206 -0
- package/dist/queue-advanced-e2e-setup.js +786 -0
- package/dist/queue-advanced-footer.e2e.test.js +472 -0
- package/dist/queue-advanced-model-switch.e2e.test.js +299 -0
- package/dist/queue-advanced-permissions-typing.e2e.test.js +180 -0
- package/dist/queue-advanced-question.e2e.test.js +261 -0
- package/dist/queue-advanced-typing-interrupt.e2e.test.js +114 -0
- package/dist/queue-advanced-typing.e2e.test.js +153 -0
- package/dist/queue-drain-after-interactive-ui.e2e.test.js +119 -0
- package/dist/queue-interrupt-drain.e2e.test.js +135 -0
- package/dist/queue-question-select-drain.e2e.test.js +120 -0
- package/dist/runtime-idle-sweeper.js +52 -0
- package/dist/runtime-lifecycle.e2e.test.js +508 -0
- package/dist/sentry.js +23 -0
- package/dist/session-handler/agent-utils.js +67 -0
- package/dist/session-handler/event-stream-state.js +420 -0
- package/dist/session-handler/event-stream-state.test.js +563 -0
- package/dist/session-handler/model-utils.js +124 -0
- package/dist/session-handler/opencode-session-event-log.js +94 -0
- package/dist/session-handler/thread-runtime-state.js +104 -0
- package/dist/session-handler/thread-session-runtime.js +3258 -0
- package/dist/session-handler.js +9 -0
- package/dist/session-search.js +100 -0
- package/dist/session-search.test.js +40 -0
- package/dist/session-title-rename.test.js +80 -0
- package/dist/startup-service.js +153 -0
- package/dist/startup-time.e2e.test.js +296 -0
- package/dist/store.js +17 -0
- package/dist/system-message.js +613 -0
- package/dist/system-message.test.js +602 -0
- package/dist/task-runner.js +295 -0
- package/dist/task-schedule.js +209 -0
- package/dist/task-schedule.test.js +71 -0
- package/dist/test-utils.js +299 -0
- package/dist/thinking-utils.js +35 -0
- package/dist/thread-message-queue.e2e.test.js +999 -0
- package/dist/tools.js +357 -0
- package/dist/undo-redo.e2e.test.js +161 -0
- package/dist/unnest-code-blocks.js +146 -0
- package/dist/unnest-code-blocks.test.js +673 -0
- package/dist/upgrade.js +114 -0
- package/dist/utils.js +144 -0
- package/dist/voice-attachment.js +34 -0
- package/dist/voice-handler.js +646 -0
- package/dist/voice-message.e2e.test.js +1021 -0
- package/dist/voice.js +447 -0
- package/dist/voice.test.js +235 -0
- package/dist/wait-session.js +94 -0
- package/dist/websockify.js +69 -0
- package/dist/worker-types.js +4 -0
- package/dist/worktree-lifecycle.e2e.test.js +308 -0
- package/dist/worktree-utils.js +3 -0
- package/dist/worktrees.js +929 -0
- package/dist/worktrees.test.js +189 -0
- package/dist/xml.js +92 -0
- package/dist/xml.test.js +32 -0
- package/package.json +98 -0
- package/schema.prisma +295 -0
- package/skills/batch/SKILL.md +87 -0
- package/skills/critique/SKILL.md +112 -0
- package/skills/egaki/SKILL.md +100 -0
- package/skills/errore/SKILL.md +647 -0
- package/skills/event-sourcing-state/SKILL.md +252 -0
- package/skills/gitchamber/SKILL.md +93 -0
- package/skills/goke/SKILL.md +644 -0
- package/skills/jitter/EDITOR.md +219 -0
- package/skills/jitter/EXPORT-INTERNALS.md +309 -0
- package/skills/jitter/SKILL.md +158 -0
- package/skills/jitter/jitter-clipboard.json +1042 -0
- package/skills/jitter/package.json +14 -0
- package/skills/jitter/tsconfig.json +15 -0
- package/skills/jitter/utils/actions.ts +212 -0
- package/skills/jitter/utils/export.ts +114 -0
- package/skills/jitter/utils/index.ts +141 -0
- package/skills/jitter/utils/snapshot.ts +154 -0
- package/skills/jitter/utils/traverse.ts +246 -0
- package/skills/jitter/utils/types.ts +279 -0
- package/skills/jitter/utils/wait.ts +133 -0
- package/skills/lintcn/SKILL.md +873 -0
- package/skills/new-skill/SKILL.md +211 -0
- package/skills/npm-package/SKILL.md +239 -0
- package/skills/playwriter/SKILL.md +35 -0
- package/skills/proxyman/SKILL.md +215 -0
- package/skills/security-review/SKILL.md +208 -0
- package/skills/simplify/SKILL.md +58 -0
- package/skills/spiceflow/SKILL.md +14 -0
- package/skills/termcast/SKILL.md +945 -0
- package/skills/tuistory/SKILL.md +250 -0
- package/skills/usecomputer/SKILL.md +264 -0
- package/skills/x-articles/SKILL.md +554 -0
- package/skills/zele/SKILL.md +112 -0
- package/skills/zustand-centralized-state/SKILL.md +1004 -0
- package/src/agent-model.e2e.test.ts +976 -0
- package/src/ai-tool-to-genai.test.ts +296 -0
- package/src/ai-tool-to-genai.ts +283 -0
- package/src/ai-tool.ts +39 -0
- package/src/anthropic-auth-plugin.test.ts +159 -0
- package/src/anthropic-auth-plugin.ts +861 -0
- package/src/anthropic-auth-state.ts +282 -0
- package/src/bin.ts +111 -0
- package/src/channel-management.ts +334 -0
- package/src/cli-parsing.test.ts +195 -0
- package/src/cli-send-thread.e2e.test.ts +464 -0
- package/src/cli.ts +4581 -0
- package/src/commands/abort.ts +89 -0
- package/src/commands/action-buttons.ts +364 -0
- package/src/commands/add-project.ts +149 -0
- package/src/commands/agent.ts +473 -0
- package/src/commands/ask-question.ts +390 -0
- package/src/commands/btw.ts +164 -0
- package/src/commands/compact.ts +157 -0
- package/src/commands/context-usage.ts +199 -0
- package/src/commands/create-new-project.ts +190 -0
- package/src/commands/diff.ts +91 -0
- package/src/commands/file-upload.ts +389 -0
- package/src/commands/fork.ts +321 -0
- package/src/commands/gemini-apikey.ts +104 -0
- package/src/commands/login.ts +1173 -0
- package/src/commands/mcp.ts +307 -0
- package/src/commands/memory-snapshot.ts +30 -0
- package/src/commands/mention-mode.ts +68 -0
- package/src/commands/merge-worktree.ts +223 -0
- package/src/commands/model-variant.ts +483 -0
- package/src/commands/model.ts +1053 -0
- package/src/commands/new-worktree.ts +510 -0
- package/src/commands/paginated-select.ts +81 -0
- package/src/commands/permissions.ts +397 -0
- package/src/commands/queue.ts +271 -0
- package/src/commands/remove-project.ts +155 -0
- package/src/commands/restart-opencode-server.ts +162 -0
- package/src/commands/resume.ts +230 -0
- package/src/commands/run-command.ts +123 -0
- package/src/commands/screenshare.test.ts +30 -0
- package/src/commands/screenshare.ts +366 -0
- package/src/commands/session-id.ts +109 -0
- package/src/commands/session.ts +227 -0
- package/src/commands/share.ts +106 -0
- package/src/commands/tasks.ts +293 -0
- package/src/commands/types.ts +25 -0
- package/src/commands/undo-redo.ts +386 -0
- package/src/commands/unset-model.ts +173 -0
- package/src/commands/upgrade.ts +52 -0
- package/src/commands/user-command.ts +198 -0
- package/src/commands/verbosity.ts +173 -0
- package/src/commands/worktree-settings.ts +70 -0
- package/src/commands/worktrees.ts +552 -0
- package/src/condense-memory.ts +36 -0
- package/src/config.ts +111 -0
- package/src/context-awareness-plugin.test.ts +142 -0
- package/src/context-awareness-plugin.ts +510 -0
- package/src/critique-utils.ts +139 -0
- package/src/database.ts +1876 -0
- package/src/db.test.ts +162 -0
- package/src/db.ts +286 -0
- package/src/debounce-timeout.ts +43 -0
- package/src/debounced-process-flush.ts +104 -0
- package/src/discord-bot.ts +1330 -0
- package/src/discord-command-registration.ts +693 -0
- package/src/discord-urls.ts +88 -0
- package/src/discord-utils.test.ts +153 -0
- package/src/discord-utils.ts +800 -0
- package/src/errors.ts +201 -0
- package/src/escape-backticks.test.ts +469 -0
- package/src/event-stream-real-capture.e2e.test.ts +692 -0
- package/src/eventsource-parser.test.ts +351 -0
- package/src/exec-async.ts +35 -0
- package/src/external-opencode-sync.ts +685 -0
- package/src/format-tables.test.ts +335 -0
- package/src/format-tables.ts +445 -0
- package/src/forum-sync/config.ts +92 -0
- package/src/forum-sync/discord-operations.ts +241 -0
- package/src/forum-sync/index.ts +9 -0
- package/src/forum-sync/markdown.ts +172 -0
- package/src/forum-sync/sync-to-discord.ts +595 -0
- package/src/forum-sync/sync-to-files.ts +294 -0
- package/src/forum-sync/types.ts +175 -0
- package/src/forum-sync/watchers.ts +454 -0
- package/src/gateway-proxy-reconnect.e2e.test.ts +523 -0
- package/src/gateway-proxy.e2e.test.ts +640 -0
- package/src/genai-worker-wrapper.ts +164 -0
- package/src/genai-worker.ts +386 -0
- package/src/genai.ts +321 -0
- package/src/generated/browser.ts +114 -0
- package/src/generated/client.ts +138 -0
- package/src/generated/commonInputTypes.ts +736 -0
- package/src/generated/enums.ts +88 -0
- package/src/generated/internal/class.ts +384 -0
- package/src/generated/internal/prismaNamespace.ts +2386 -0
- package/src/generated/internal/prismaNamespaceBrowser.ts +326 -0
- package/src/generated/models/bot_api_keys.ts +1288 -0
- package/src/generated/models/bot_tokens.ts +1656 -0
- package/src/generated/models/channel_agents.ts +1256 -0
- package/src/generated/models/channel_directories.ts +1859 -0
- package/src/generated/models/channel_mention_mode.ts +1300 -0
- package/src/generated/models/channel_models.ts +1288 -0
- package/src/generated/models/channel_verbosity.ts +1228 -0
- package/src/generated/models/channel_worktrees.ts +1300 -0
- package/src/generated/models/forum_sync_configs.ts +1452 -0
- package/src/generated/models/global_models.ts +1288 -0
- package/src/generated/models/ipc_requests.ts +1485 -0
- package/src/generated/models/part_messages.ts +1302 -0
- package/src/generated/models/scheduled_tasks.ts +2320 -0
- package/src/generated/models/session_agents.ts +1086 -0
- package/src/generated/models/session_events.ts +1439 -0
- package/src/generated/models/session_models.ts +1114 -0
- package/src/generated/models/session_start_sources.ts +1408 -0
- package/src/generated/models/thread_sessions.ts +1781 -0
- package/src/generated/models/thread_worktrees.ts +1356 -0
- package/src/generated/models.ts +30 -0
- package/src/heap-monitor.ts +152 -0
- package/src/hrana-server.test.ts +434 -0
- package/src/hrana-server.ts +314 -0
- package/src/html-actions.test.ts +87 -0
- package/src/html-actions.ts +174 -0
- package/src/html-components.test.ts +38 -0
- package/src/html-components.ts +181 -0
- package/src/image-optimizer-plugin.ts +194 -0
- package/src/image-utils.ts +149 -0
- package/src/interaction-handler.ts +576 -0
- package/src/ipc-polling.ts +326 -0
- package/src/ipc-tools-plugin.ts +236 -0
- package/src/kimaki-digital-twin.e2e.test.ts +199 -0
- package/src/kimaki-opencode-plugin-loading.e2e.test.ts +109 -0
- package/src/kimaki-opencode-plugin.test.ts +108 -0
- package/src/kimaki-opencode-plugin.ts +18 -0
- package/src/limit-heading-depth.test.ts +116 -0
- package/src/limit-heading-depth.ts +26 -0
- package/src/logger.ts +208 -0
- package/src/markdown.test.ts +308 -0
- package/src/markdown.ts +410 -0
- package/src/message-finish-field.e2e.test.ts +192 -0
- package/src/message-formatting.test.ts +81 -0
- package/src/message-formatting.ts +533 -0
- package/src/message-preprocessing.ts +455 -0
- package/src/onboarding-tutorial.ts +176 -0
- package/src/onboarding-welcome.ts +49 -0
- package/src/openai-realtime.ts +358 -0
- package/src/opencode-command-detection.test.ts +307 -0
- package/src/opencode-command-detection.ts +76 -0
- package/src/opencode-command.test.ts +70 -0
- package/src/opencode-command.ts +188 -0
- package/src/opencode-interrupt-plugin.test.ts +677 -0
- package/src/opencode-interrupt-plugin.ts +477 -0
- package/src/opencode.ts +1110 -0
- package/src/otto/branding.ts +23 -0
- package/src/otto/index.ts +22 -0
- package/src/parse-permission-rules.test.ts +127 -0
- package/src/patch-text-parser.ts +107 -0
- package/src/plugin-logger.ts +68 -0
- package/src/privacy-sanitizer.ts +142 -0
- package/src/queue-advanced-abort.e2e.test.ts +382 -0
- package/src/queue-advanced-action-buttons.e2e.test.ts +268 -0
- package/src/queue-advanced-e2e-setup.ts +873 -0
- package/src/queue-advanced-footer.e2e.test.ts +576 -0
- package/src/queue-advanced-model-switch.e2e.test.ts +383 -0
- package/src/queue-advanced-permissions-typing.e2e.test.ts +245 -0
- package/src/queue-advanced-question.e2e.test.ts +316 -0
- package/src/queue-advanced-typing-interrupt.e2e.test.ts +146 -0
- package/src/queue-advanced-typing.e2e.test.ts +199 -0
- package/src/queue-drain-after-interactive-ui.e2e.test.ts +151 -0
- package/src/queue-interrupt-drain.e2e.test.ts +166 -0
- package/src/queue-question-select-drain.e2e.test.ts +152 -0
- package/src/runtime-idle-sweeper.ts +76 -0
- package/src/runtime-lifecycle.e2e.test.ts +641 -0
- package/src/schema.sql +173 -0
- package/src/sentry.ts +26 -0
- package/src/session-handler/agent-utils.ts +97 -0
- package/src/session-handler/event-stream-fixtures/real-session-action-buttons.jsonl +45 -0
- package/src/session-handler/event-stream-fixtures/real-session-footer-suppressed-on-pre-idle-interrupt.jsonl +40 -0
- package/src/session-handler/event-stream-fixtures/real-session-permission-external-file.jsonl +23 -0
- package/src/session-handler/event-stream-fixtures/real-session-task-normal.jsonl +22 -0
- package/src/session-handler/event-stream-fixtures/real-session-task-three-parallel-sleeps.jsonl +277 -0
- package/src/session-handler/event-stream-fixtures/real-session-task-user-interruption.jsonl +46 -0
- package/src/session-handler/event-stream-fixtures/session-abort-after-idle-race.jsonl +21 -0
- package/src/session-handler/event-stream-fixtures/session-concurrent-messages-serialized.jsonl +56 -0
- package/src/session-handler/event-stream-fixtures/session-explicit-abort.jsonl +44 -0
- package/src/session-handler/event-stream-fixtures/session-normal-completion.jsonl +29 -0
- package/src/session-handler/event-stream-fixtures/session-tool-call-noisy-stream.jsonl +29 -0
- package/src/session-handler/event-stream-fixtures/session-two-completions-same-session.jsonl +50 -0
- package/src/session-handler/event-stream-fixtures/session-user-interruption.jsonl +59 -0
- package/src/session-handler/event-stream-fixtures/session-voice-queued-followup.jsonl +52 -0
- package/src/session-handler/event-stream-state.test.ts +645 -0
- package/src/session-handler/event-stream-state.ts +608 -0
- package/src/session-handler/model-utils.ts +183 -0
- package/src/session-handler/opencode-session-event-log.ts +130 -0
- package/src/session-handler/thread-runtime-state.ts +212 -0
- package/src/session-handler/thread-session-runtime.ts +4281 -0
- package/src/session-handler.ts +15 -0
- package/src/session-search.test.ts +50 -0
- package/src/session-search.ts +148 -0
- package/src/session-title-rename.test.ts +112 -0
- package/src/startup-service.ts +200 -0
- package/src/startup-time.e2e.test.ts +373 -0
- package/src/store.ts +122 -0
- package/src/system-message.test.ts +612 -0
- package/src/system-message.ts +723 -0
- package/src/task-runner.ts +421 -0
- package/src/task-schedule.test.ts +84 -0
- package/src/task-schedule.ts +311 -0
- package/src/test-utils.ts +435 -0
- package/src/thinking-utils.ts +61 -0
- package/src/thread-message-queue.e2e.test.ts +1219 -0
- package/src/tools.ts +430 -0
- package/src/undici.d.ts +12 -0
- package/src/undo-redo.e2e.test.ts +209 -0
- package/src/unnest-code-blocks.test.ts +713 -0
- package/src/unnest-code-blocks.ts +185 -0
- package/src/upgrade.ts +127 -0
- package/src/utils.ts +212 -0
- package/src/voice-attachment.ts +51 -0
- package/src/voice-handler.ts +908 -0
- package/src/voice-message.e2e.test.ts +1255 -0
- package/src/voice.test.ts +281 -0
- package/src/voice.ts +627 -0
- package/src/wait-session.ts +147 -0
- package/src/websockify.ts +101 -0
- package/src/worker-types.ts +64 -0
- package/src/worktree-lifecycle.e2e.test.ts +391 -0
- package/src/worktree-utils.ts +4 -0
- package/src/worktrees.test.ts +223 -0
- package/src/worktrees.ts +1294 -0
- package/src/xml.test.ts +38 -0
- package/src/xml.ts +121 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tuistory
|
|
3
|
+
description: |
|
|
4
|
+
Playwright for terminal apps. Like tmux but designed for agents — virtual terminals you can
|
|
5
|
+
type into, press keys, wait for text, take snapshots, and screenshot as images.
|
|
6
|
+
|
|
7
|
+
tuistory has **2 modes**:
|
|
8
|
+
|
|
9
|
+
- **CLI** (`tuistory` command) — shell-based. Launch sessions, type, press keys, snapshot, screenshot.
|
|
10
|
+
Runs a background daemon that persists sessions across commands. Install globally or use `npx`/`bunx`.
|
|
11
|
+
**You MUST run `tuistory --help` before using the CLI** to see the latest commands and options.
|
|
12
|
+
- **JS/TS API** (`import { launchTerminal } from 'tuistory'`) — programmatic. Use in vitest/bun:test
|
|
13
|
+
to write Playwright-style tests for CLIs and TUIs with inline snapshots.
|
|
14
|
+
|
|
15
|
+
Use tuistory when you need to:
|
|
16
|
+
- Write e2e tests for CLI/TUI apps (vitest, bun:test) with inline snapshots
|
|
17
|
+
- Automate terminal interactions (launch a REPL, debugger, or TUI and drive it)
|
|
18
|
+
- Screenshot terminal as images to send to users (Discord bots, agent UIs like kimaki/openclaw)
|
|
19
|
+
- Reproduce bugs in interactive CLIs by scripting the exact steps
|
|
20
|
+
- Explore TUI apps progressively with observe-act-observe loops
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# tuistory
|
|
24
|
+
|
|
25
|
+
Playwright for terminal user interfaces. Write end-to-end tests for CLI and TUI applications.
|
|
26
|
+
|
|
27
|
+
tuistory has **2 modes**:
|
|
28
|
+
|
|
29
|
+
1. **CLI** — the `tuistory` shell command. Launch terminal sessions, type text, press keys, take text snapshots or image screenshots. Sessions run in a background daemon and persist across commands.
|
|
30
|
+
2. **JS/TS API** — `import { launchTerminal } from 'tuistory'`. Use programmatically in test files (vitest, bun:test) to write Playwright-style tests with inline snapshots.
|
|
31
|
+
|
|
32
|
+
## CLI usage
|
|
33
|
+
|
|
34
|
+
**REQUIREMENT:** You MUST run `tuistory --help` before using the CLI. The CLI evolves and the help output is the source of truth for available commands, options, and syntax. Always check it first.
|
|
35
|
+
|
|
36
|
+
Install globally or use npx/bunx:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# global
|
|
40
|
+
bun add -g tuistory
|
|
41
|
+
npm install -g tuistory
|
|
42
|
+
|
|
43
|
+
# or without installing
|
|
44
|
+
npx tuistory --help
|
|
45
|
+
bunx tuistory --help
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### CLI quick reference
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
tuistory launch <command> -s <name> [--cols N] [--rows N] [--env KEY=VAL]
|
|
52
|
+
tuistory -s <name> snapshot --trim
|
|
53
|
+
tuistory -s <name> screenshot -o image.jpg --pixel-ratio 2
|
|
54
|
+
tuistory -s <name> type "text"
|
|
55
|
+
tuistory -s <name> press enter
|
|
56
|
+
tuistory -s <name> press ctrl c
|
|
57
|
+
tuistory -s <name> click "Submit"
|
|
58
|
+
tuistory -s <name> wait "pattern" --timeout 10000
|
|
59
|
+
tuistory -s <name> wait "/regex/" --timeout 10000
|
|
60
|
+
tuistory -s <name> scroll down 5
|
|
61
|
+
tuistory -s <name> resize 120 40
|
|
62
|
+
tuistory -s <name> close
|
|
63
|
+
tuistory sessions
|
|
64
|
+
tuistory daemon-stop
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Always run `snapshot --trim` after every action to see the current terminal state.
|
|
68
|
+
|
|
69
|
+
### Screenshot for agent bots
|
|
70
|
+
|
|
71
|
+
Capture terminal as an image to upload to users (Discord, Slack, web UIs).
|
|
72
|
+
Use `--pixel-ratio 2` for sharp images on social media and messaging apps:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
tuistory -s myapp screenshot -o /tmp/terminal.jpg --pixel-ratio 2
|
|
76
|
+
# then upload /tmp/terminal.jpg to the user
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## JS/TS API (library)
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
bun add tuistory # or npm install tuistory
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
import { launchTerminal } from 'tuistory'
|
|
87
|
+
|
|
88
|
+
const session = await launchTerminal({
|
|
89
|
+
command: 'my-cli',
|
|
90
|
+
args: ['--flag'],
|
|
91
|
+
cols: 120,
|
|
92
|
+
rows: 36,
|
|
93
|
+
cwd: '/path/to/dir',
|
|
94
|
+
env: { MY_VAR: 'value' },
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
// observe
|
|
98
|
+
const text = await session.text() // full terminal text
|
|
99
|
+
const text = await session.text({ trimEnd: true }) // trimmed
|
|
100
|
+
const bold = await session.text({ only: { bold: true } }) // style filter
|
|
101
|
+
|
|
102
|
+
// act
|
|
103
|
+
await session.type('hello world') // type character by character
|
|
104
|
+
await session.press('enter') // single key
|
|
105
|
+
await session.press(['ctrl', 'c']) // key chord
|
|
106
|
+
await session.click('Submit') // click on text
|
|
107
|
+
|
|
108
|
+
// wait
|
|
109
|
+
await session.waitForText('Ready', { timeout: 10000 })
|
|
110
|
+
await session.waitForText(/Loading\.\.\./, { timeout: 5000 })
|
|
111
|
+
|
|
112
|
+
// screenshot to image
|
|
113
|
+
const data = session.getTerminalData()
|
|
114
|
+
const { renderTerminalToImage } = await import('ghostty-opentui/image')
|
|
115
|
+
const image = await renderTerminalToImage(data, { format: 'jpeg', devicePixelRatio: 2 })
|
|
116
|
+
|
|
117
|
+
// cleanup
|
|
118
|
+
session.close()
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Writing tests with vitest
|
|
122
|
+
|
|
123
|
+
tuistory is like Playwright but for CLIs. The workflow is: **observe** (snapshot with inline snapshot), **act** (type/press/click), **observe** again. Build tests progressively.
|
|
124
|
+
|
|
125
|
+
### Step 1: Launch and observe
|
|
126
|
+
|
|
127
|
+
Start with an empty inline snapshot. Run with `--update` / `-u` to fill it in.
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
import { test, expect } from 'vitest'
|
|
131
|
+
import { launchTerminal } from 'tuistory'
|
|
132
|
+
|
|
133
|
+
test('my CLI shows help', async () => {
|
|
134
|
+
const session = await launchTerminal({
|
|
135
|
+
command: 'my-cli',
|
|
136
|
+
args: ['--help'],
|
|
137
|
+
cols: 120,
|
|
138
|
+
rows: 36,
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
const text = await session.text({ trimEnd: true })
|
|
142
|
+
expect(text).toMatchInlineSnapshot()
|
|
143
|
+
// ^ run `vitest --run -u` to fill this in, then read the file to see what it captured
|
|
144
|
+
|
|
145
|
+
session.close()
|
|
146
|
+
}, 10000)
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Step 2: Interact and observe again
|
|
150
|
+
|
|
151
|
+
Add actions and more snapshots incrementally:
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
test('bash interaction', async () => {
|
|
155
|
+
const session = await launchTerminal({
|
|
156
|
+
command: 'bash',
|
|
157
|
+
args: ['--norc', '--noprofile'],
|
|
158
|
+
cols: 60,
|
|
159
|
+
rows: 10,
|
|
160
|
+
env: { PS1: '$ ', HOME: '/tmp', PATH: process.env.PATH },
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
// observe initial state
|
|
164
|
+
const initial = await session.text({ trimEnd: true })
|
|
165
|
+
expect(initial).toMatchInlineSnapshot()
|
|
166
|
+
|
|
167
|
+
// act
|
|
168
|
+
await session.type('echo "hello world"')
|
|
169
|
+
await session.press('enter')
|
|
170
|
+
|
|
171
|
+
// wait + observe
|
|
172
|
+
const output = await session.waitForText('hello world')
|
|
173
|
+
expect(output).toMatchInlineSnapshot()
|
|
174
|
+
|
|
175
|
+
// cleanup
|
|
176
|
+
await session.type('exit')
|
|
177
|
+
await session.press('enter')
|
|
178
|
+
session.close()
|
|
179
|
+
}, 10000)
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Step 3: Run with -u, read back, iterate
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# fill in snapshots
|
|
186
|
+
vitest --run -u
|
|
187
|
+
|
|
188
|
+
# read the test file to see captured terminal output
|
|
189
|
+
# adjust assertions, add more interactions, repeat
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
This observe-act-observe loop lets you progressively explore any TUI. Each inline snapshot captures the exact terminal state, making tests readable and easy to update.
|
|
193
|
+
|
|
194
|
+
### Testing a TUI app (e.g. opencode, claude)
|
|
195
|
+
|
|
196
|
+
```ts
|
|
197
|
+
test('opencode shows welcome', async () => {
|
|
198
|
+
const session = await launchTerminal({
|
|
199
|
+
command: 'opencode',
|
|
200
|
+
cols: 150,
|
|
201
|
+
rows: 45,
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
await session.waitForText('switch agent', { timeout: 15000 })
|
|
205
|
+
await session.type('hello from tuistory')
|
|
206
|
+
|
|
207
|
+
const text = await session.text({ timeout: 1000 })
|
|
208
|
+
expect(text).toMatchInlineSnapshot()
|
|
209
|
+
|
|
210
|
+
// navigate menus
|
|
211
|
+
await session.press(['ctrl', 'p'])
|
|
212
|
+
const commands = await session.waitForText('Commands', { timeout: 5000 })
|
|
213
|
+
expect(commands).toMatchInlineSnapshot()
|
|
214
|
+
|
|
215
|
+
await session.press('esc')
|
|
216
|
+
session.close()
|
|
217
|
+
}, 30000)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Testing a Node.js debugger
|
|
221
|
+
|
|
222
|
+
```ts
|
|
223
|
+
test('node debugger inspect variables', async () => {
|
|
224
|
+
const session = await launchTerminal({
|
|
225
|
+
command: 'node',
|
|
226
|
+
args: ['inspect', 'app.js'],
|
|
227
|
+
cols: 150,
|
|
228
|
+
rows: 45,
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
await session.waitForText('Break on start', { timeout: 10000 })
|
|
232
|
+
await session.type('cont')
|
|
233
|
+
await session.press('enter')
|
|
234
|
+
await session.waitForText('break in', { timeout: 5000 })
|
|
235
|
+
|
|
236
|
+
const snapshot = await session.text({ trimEnd: true })
|
|
237
|
+
expect(snapshot).toMatchInlineSnapshot()
|
|
238
|
+
|
|
239
|
+
session.close()
|
|
240
|
+
}, 30000)
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Tips
|
|
244
|
+
|
|
245
|
+
- **Always set a timeout** on `waitForText` for async operations
|
|
246
|
+
- **Use `trimEnd: true`** in `session.text()` to avoid trailing whitespace in snapshots
|
|
247
|
+
- **Set `waitForData: false`** for interactive commands that don't produce output immediately (like `cat`)
|
|
248
|
+
- **Use regex** in `waitForText` for dynamic content: `await session.waitForText(/version \d+/)`
|
|
249
|
+
- **Close sessions** in test teardown to avoid leaked processes
|
|
250
|
+
- **Use `--cols` and `--rows`** to control terminal size — affects TUI layout
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: usecomputer
|
|
3
|
+
description: >
|
|
4
|
+
Desktop automation CLI for AI agents (macOS, Linux, Windows). Screenshot,
|
|
5
|
+
click, type, scroll, drag with native Zig backend. Use this skill when
|
|
6
|
+
automating desktop apps with computer use models (GPT-5.4, Claude). Covers
|
|
7
|
+
the screenshot-action feedback loop, coord-map workflow, window-scoped
|
|
8
|
+
screenshots, and system prompts for accurate clicking.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# usecomputer
|
|
12
|
+
|
|
13
|
+
Desktop automation CLI for AI agents. Works on macOS, Linux (X11), and
|
|
14
|
+
Windows. Takes screenshots, clicks, types, scrolls, drags using native
|
|
15
|
+
platform APIs through a Zig binary — no Node.js required at runtime.
|
|
16
|
+
|
|
17
|
+
## Always start with --help
|
|
18
|
+
|
|
19
|
+
**Always run `usecomputer --help` before using this tool.** The help output
|
|
20
|
+
is the source of truth for all commands, options, and examples. Never guess
|
|
21
|
+
command syntax — check help first.
|
|
22
|
+
|
|
23
|
+
When running help commands, read the **full untruncated output**. Never pipe
|
|
24
|
+
help through `head`, `tail`, or `sed` — you will miss critical options.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
usecomputer --help
|
|
28
|
+
usecomputer screenshot --help
|
|
29
|
+
usecomputer click --help
|
|
30
|
+
usecomputer drag --help
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm install -g usecomputer
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Requirements:
|
|
40
|
+
|
|
41
|
+
- **macOS** — Accessibility permission enabled for your terminal app
|
|
42
|
+
- **Linux** — X11 session with `DISPLAY` set (Wayland via XWayland works too)
|
|
43
|
+
- **Windows** — run in an interactive desktop session
|
|
44
|
+
|
|
45
|
+
## Core loop: screenshot -> act -> screenshot
|
|
46
|
+
|
|
47
|
+
Every computer use session follows a feedback loop:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
screenshot -> send to model -> model returns action -> execute action -> screenshot again
|
|
51
|
+
^ |
|
|
52
|
+
|________________________________________________________________________|
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
1. Take a screenshot with `usecomputer screenshot --json`
|
|
56
|
+
2. Send the screenshot image to the model
|
|
57
|
+
3. Model returns coordinates or an action (click, type, press, scroll)
|
|
58
|
+
4. Execute the action, passing the **exact `--coord-map`** from step 1
|
|
59
|
+
5. Take a fresh screenshot and go back to step 2
|
|
60
|
+
|
|
61
|
+
### Full cycle example
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# 1. take screenshot (always use --json to get coordMap)
|
|
65
|
+
usecomputer screenshot ./tmp/screen.png --json
|
|
66
|
+
# output: {"path":"./tmp/screen.png","coordMap":"0,0,3440,1440,1568,657",...}
|
|
67
|
+
|
|
68
|
+
# 2. send ./tmp/screen.png to the model
|
|
69
|
+
# 3. model says: "click the Save button at x=740 y=320"
|
|
70
|
+
|
|
71
|
+
# 4. click using the coord-map from the screenshot output
|
|
72
|
+
usecomputer click -x 740 -y 320 --coord-map "0,0,3440,1440,1568,657"
|
|
73
|
+
|
|
74
|
+
# 5. take a fresh screenshot to see what happened
|
|
75
|
+
usecomputer screenshot ./tmp/screen.png --json
|
|
76
|
+
# ... repeat
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Never skip `--coord-map`.** Screenshots are scaled (longest edge <= 1568px).
|
|
80
|
+
The coord-map maps screenshot-space pixels back to real desktop coordinates.
|
|
81
|
+
Without it, clicks land in wrong positions.
|
|
82
|
+
|
|
83
|
+
**Always take a fresh screenshot after each action.** The UI changes after
|
|
84
|
+
every click, scroll, or keystroke — menus open, pages scroll, dialogs appear.
|
|
85
|
+
Never reuse a stale screenshot.
|
|
86
|
+
|
|
87
|
+
## Window-scoped screenshots
|
|
88
|
+
|
|
89
|
+
Full-desktop screenshots include everything — dock, menu bar, background
|
|
90
|
+
windows. For better accuracy, capture only the target application window.
|
|
91
|
+
This produces a smaller, more focused image the model can reason about.
|
|
92
|
+
|
|
93
|
+
### Step 1: find the window ID
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
usecomputer window list --json
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
This returns an array of visible windows with their `id`, `ownerName`,
|
|
100
|
+
`title`, position, and size. Find the window you want to target.
|
|
101
|
+
|
|
102
|
+
### Step 2: screenshot that window
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
usecomputer screenshot ./tmp/app.png --window 12345 --json
|
|
106
|
+
# output: {"path":"./tmp/app.png","coordMap":"200,100,1200,800,1568,1045",...}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
The coord-map in the output is scoped to that window's region on screen.
|
|
110
|
+
|
|
111
|
+
### Step 3: act using the coord-map
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# model analyzes ./tmp/app.png and says click at x=400 y=220
|
|
115
|
+
usecomputer click -x 400 -y 220 --coord-map "200,100,1200,800,1568,1045"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
The coord-map handles the translation from the window screenshot's pixel
|
|
119
|
+
space back to the correct desktop coordinates. The click lands on the
|
|
120
|
+
right spot even though the screenshot only showed one window.
|
|
121
|
+
|
|
122
|
+
### Region screenshots
|
|
123
|
+
|
|
124
|
+
You can also capture an arbitrary rectangle of the screen:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
usecomputer screenshot ./tmp/region.png --region "100,100,800,600" --json
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The coord-map works the same way — pass it to subsequent pointer commands.
|
|
131
|
+
|
|
132
|
+
## Coord-map explained
|
|
133
|
+
|
|
134
|
+
The coord-map is 6 comma-separated values emitted by every screenshot:
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
captureX,captureY,captureWidth,captureHeight,imageWidth,imageHeight
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
- **captureX, captureY** — top-left corner of the captured region in desktop
|
|
141
|
+
coordinates
|
|
142
|
+
- **captureWidth, captureHeight** — size of the captured region in desktop
|
|
143
|
+
pixels
|
|
144
|
+
- **imageWidth, imageHeight** — size of the output PNG (after scaling)
|
|
145
|
+
|
|
146
|
+
When you pass `--coord-map` to `click`, `hover`, `drag`, or `mouse move`,
|
|
147
|
+
the command maps your screenshot-space x,y coordinates back to the real
|
|
148
|
+
desktop position using these values.
|
|
149
|
+
|
|
150
|
+
## Validating coordinates with debug-point
|
|
151
|
+
|
|
152
|
+
Before clicking, you can validate where the click would land:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
usecomputer debug-point -x 400 -y 220 --coord-map "0,0,1600,900,1568,882"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
This captures a screenshot and draws a red marker at the mapped coordinate.
|
|
159
|
+
Send the output image back to the model so it can see if the target is
|
|
160
|
+
correct and adjust if needed.
|
|
161
|
+
|
|
162
|
+
## Quick examples
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# screenshot the primary display
|
|
166
|
+
usecomputer screenshot ./tmp/screen.png --json
|
|
167
|
+
|
|
168
|
+
# screenshot a specific display (0-indexed)
|
|
169
|
+
usecomputer screenshot ./tmp/screen.png --display 1 --json
|
|
170
|
+
|
|
171
|
+
# click at screenshot coordinates
|
|
172
|
+
usecomputer click -x 600 -y 400 --coord-map "0,0,1600,900,1568,882"
|
|
173
|
+
|
|
174
|
+
# right-click
|
|
175
|
+
usecomputer click -x 600 -y 400 --button right --coord-map "..."
|
|
176
|
+
|
|
177
|
+
# double-click
|
|
178
|
+
usecomputer click -x 600 -y 400 --count 2 --coord-map "..."
|
|
179
|
+
|
|
180
|
+
# click with modifier keys held
|
|
181
|
+
usecomputer click -x 600 -y 400 --modifier option --coord-map "..."
|
|
182
|
+
usecomputer click -x 600 -y 400 --modifier cmd --modifier shift --coord-map "..."
|
|
183
|
+
|
|
184
|
+
# type text
|
|
185
|
+
usecomputer type "hello from usecomputer"
|
|
186
|
+
|
|
187
|
+
# type long text from stdin
|
|
188
|
+
cat ./notes.txt | usecomputer type --stdin --chunk-size 4000 --chunk-delay 15
|
|
189
|
+
|
|
190
|
+
# press a key
|
|
191
|
+
usecomputer press "enter"
|
|
192
|
+
|
|
193
|
+
# press a shortcut
|
|
194
|
+
usecomputer press "cmd+s"
|
|
195
|
+
usecomputer press "cmd+shift+p"
|
|
196
|
+
|
|
197
|
+
# press with repeat
|
|
198
|
+
usecomputer press "down" --count 10 --delay 30
|
|
199
|
+
|
|
200
|
+
# scroll
|
|
201
|
+
usecomputer scroll down 5
|
|
202
|
+
usecomputer scroll up 3
|
|
203
|
+
usecomputer scroll down 5 --at "400,300"
|
|
204
|
+
|
|
205
|
+
# drag (straight line)
|
|
206
|
+
usecomputer drag 100,200 500,600
|
|
207
|
+
|
|
208
|
+
# drag (curved path with bezier control point)
|
|
209
|
+
usecomputer drag 100,200 500,600 300,50
|
|
210
|
+
|
|
211
|
+
# drag with coord-map
|
|
212
|
+
usecomputer drag 100,200 500,600 --coord-map "..."
|
|
213
|
+
|
|
214
|
+
# mouse position
|
|
215
|
+
usecomputer mouse position --json
|
|
216
|
+
|
|
217
|
+
# list displays
|
|
218
|
+
usecomputer display list --json
|
|
219
|
+
|
|
220
|
+
# list windows
|
|
221
|
+
usecomputer window list --json
|
|
222
|
+
|
|
223
|
+
# list desktops with windows
|
|
224
|
+
usecomputer desktop list --windows --json
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## System prompt tips for accurate clicking
|
|
228
|
+
|
|
229
|
+
When using GPT-5.4 or Claude for computer use, keep the system prompt short
|
|
230
|
+
and task-focused. Verbose system prompts reduce click accuracy.
|
|
231
|
+
|
|
232
|
+
**GPT-5.4:** Use `detail: "original"` on screenshot inputs. This is the
|
|
233
|
+
single most important setting for click accuracy. Avoid `detail: "high"` or
|
|
234
|
+
`detail: "low"`.
|
|
235
|
+
|
|
236
|
+
**Claude:** Use the `computer_20251124` tool type with `display_width_px` and
|
|
237
|
+
`display_height_px` matching the screenshot dimensions from the coord-map
|
|
238
|
+
output.
|
|
239
|
+
|
|
240
|
+
**General rules:**
|
|
241
|
+
|
|
242
|
+
- Take a fresh screenshot after every action
|
|
243
|
+
- Always pass the coord-map from the screenshot the model analyzed
|
|
244
|
+
- If clicks land in wrong spots, use `debug-point` to diagnose
|
|
245
|
+
- If the model returns coordinates outside screenshot dimensions, re-send
|
|
246
|
+
the screenshot and remind it of the image size
|
|
247
|
+
|
|
248
|
+
## Troubleshooting
|
|
249
|
+
|
|
250
|
+
1. **Clicks land in wrong position** — you probably forgot `--coord-map`,
|
|
251
|
+
or you are passing a coord-map from a different screenshot than the one
|
|
252
|
+
the model analyzed. Always use the coord-map from the most recent screenshot.
|
|
253
|
+
|
|
254
|
+
2. **Retina displays** — usecomputer handles scaling internally via
|
|
255
|
+
coord-map. Do not try to manually account for display scaling.
|
|
256
|
+
|
|
257
|
+
3. **Stale screenshots** — the most common source of bugs. Always take a
|
|
258
|
+
fresh screenshot after each action. The UI changes constantly.
|
|
259
|
+
|
|
260
|
+
4. **Permission errors on macOS** — enable Accessibility permission for
|
|
261
|
+
your terminal app in System Settings > Privacy & Security > Accessibility.
|
|
262
|
+
|
|
263
|
+
5. **X11 errors on Linux** — ensure `DISPLAY` is set. For XWayland, screenshot
|
|
264
|
+
falls back to XGetImage automatically if XShm fails.
|