@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.
Files changed (483) hide show
  1. package/bin.js +2 -0
  2. package/dist/agent-model.e2e.test.js +755 -0
  3. package/dist/ai-tool-to-genai.js +233 -0
  4. package/dist/ai-tool-to-genai.test.js +267 -0
  5. package/dist/ai-tool.js +6 -0
  6. package/dist/anthropic-auth-plugin.js +728 -0
  7. package/dist/anthropic-auth-plugin.test.js +125 -0
  8. package/dist/anthropic-auth-state.js +231 -0
  9. package/dist/bin.js +90 -0
  10. package/dist/channel-management.js +227 -0
  11. package/dist/cli-parsing.test.js +137 -0
  12. package/dist/cli-send-thread.e2e.test.js +356 -0
  13. package/dist/cli.js +3276 -0
  14. package/dist/commands/abort.js +65 -0
  15. package/dist/commands/action-buttons.js +245 -0
  16. package/dist/commands/add-project.js +113 -0
  17. package/dist/commands/agent.js +335 -0
  18. package/dist/commands/ask-question.js +274 -0
  19. package/dist/commands/btw.js +116 -0
  20. package/dist/commands/compact.js +120 -0
  21. package/dist/commands/context-usage.js +140 -0
  22. package/dist/commands/create-new-project.js +130 -0
  23. package/dist/commands/diff.js +63 -0
  24. package/dist/commands/file-upload.js +275 -0
  25. package/dist/commands/fork.js +220 -0
  26. package/dist/commands/gemini-apikey.js +70 -0
  27. package/dist/commands/login.js +885 -0
  28. package/dist/commands/mcp.js +239 -0
  29. package/dist/commands/memory-snapshot.js +24 -0
  30. package/dist/commands/mention-mode.js +44 -0
  31. package/dist/commands/merge-worktree.js +159 -0
  32. package/dist/commands/model-variant.js +364 -0
  33. package/dist/commands/model.js +776 -0
  34. package/dist/commands/new-worktree.js +366 -0
  35. package/dist/commands/paginated-select.js +57 -0
  36. package/dist/commands/permissions.js +274 -0
  37. package/dist/commands/queue.js +206 -0
  38. package/dist/commands/remove-project.js +115 -0
  39. package/dist/commands/restart-opencode-server.js +127 -0
  40. package/dist/commands/resume.js +149 -0
  41. package/dist/commands/run-command.js +79 -0
  42. package/dist/commands/screenshare.js +303 -0
  43. package/dist/commands/screenshare.test.js +20 -0
  44. package/dist/commands/session-id.js +78 -0
  45. package/dist/commands/session.js +176 -0
  46. package/dist/commands/share.js +80 -0
  47. package/dist/commands/tasks.js +205 -0
  48. package/dist/commands/types.js +2 -0
  49. package/dist/commands/undo-redo.js +305 -0
  50. package/dist/commands/unset-model.js +138 -0
  51. package/dist/commands/upgrade.js +42 -0
  52. package/dist/commands/user-command.js +155 -0
  53. package/dist/commands/verbosity.js +125 -0
  54. package/dist/commands/worktree-settings.js +43 -0
  55. package/dist/commands/worktrees.js +410 -0
  56. package/dist/condense-memory.js +33 -0
  57. package/dist/config.js +94 -0
  58. package/dist/context-awareness-plugin.js +363 -0
  59. package/dist/context-awareness-plugin.test.js +124 -0
  60. package/dist/critique-utils.js +95 -0
  61. package/dist/database.js +1310 -0
  62. package/dist/db.js +251 -0
  63. package/dist/db.test.js +138 -0
  64. package/dist/debounce-timeout.js +28 -0
  65. package/dist/debounced-process-flush.js +77 -0
  66. package/dist/discord-bot.js +1008 -0
  67. package/dist/discord-command-registration.js +524 -0
  68. package/dist/discord-urls.js +81 -0
  69. package/dist/discord-utils.js +591 -0
  70. package/dist/discord-utils.test.js +134 -0
  71. package/dist/errors.js +157 -0
  72. package/dist/escape-backticks.test.js +429 -0
  73. package/dist/event-stream-real-capture.e2e.test.js +533 -0
  74. package/dist/eventsource-parser.test.js +327 -0
  75. package/dist/exec-async.js +26 -0
  76. package/dist/external-opencode-sync.js +480 -0
  77. package/dist/format-tables.js +302 -0
  78. package/dist/format-tables.test.js +308 -0
  79. package/dist/forum-sync/config.js +79 -0
  80. package/dist/forum-sync/discord-operations.js +154 -0
  81. package/dist/forum-sync/index.js +5 -0
  82. package/dist/forum-sync/markdown.js +113 -0
  83. package/dist/forum-sync/sync-to-discord.js +417 -0
  84. package/dist/forum-sync/sync-to-files.js +190 -0
  85. package/dist/forum-sync/types.js +53 -0
  86. package/dist/forum-sync/watchers.js +307 -0
  87. package/dist/gateway-proxy-reconnect.e2e.test.js +394 -0
  88. package/dist/gateway-proxy.e2e.test.js +483 -0
  89. package/dist/genai-worker-wrapper.js +111 -0
  90. package/dist/genai-worker.js +311 -0
  91. package/dist/genai.js +232 -0
  92. package/dist/generated/browser.js +17 -0
  93. package/dist/generated/client.js +37 -0
  94. package/dist/generated/commonInputTypes.js +10 -0
  95. package/dist/generated/enums.js +52 -0
  96. package/dist/generated/internal/class.js +49 -0
  97. package/dist/generated/internal/prismaNamespace.js +253 -0
  98. package/dist/generated/internal/prismaNamespaceBrowser.js +223 -0
  99. package/dist/generated/models/bot_api_keys.js +1 -0
  100. package/dist/generated/models/bot_tokens.js +1 -0
  101. package/dist/generated/models/channel_agents.js +1 -0
  102. package/dist/generated/models/channel_directories.js +1 -0
  103. package/dist/generated/models/channel_mention_mode.js +1 -0
  104. package/dist/generated/models/channel_models.js +1 -0
  105. package/dist/generated/models/channel_verbosity.js +1 -0
  106. package/dist/generated/models/channel_worktrees.js +1 -0
  107. package/dist/generated/models/forum_sync_configs.js +1 -0
  108. package/dist/generated/models/global_models.js +1 -0
  109. package/dist/generated/models/ipc_requests.js +1 -0
  110. package/dist/generated/models/part_messages.js +1 -0
  111. package/dist/generated/models/scheduled_tasks.js +1 -0
  112. package/dist/generated/models/session_agents.js +1 -0
  113. package/dist/generated/models/session_events.js +1 -0
  114. package/dist/generated/models/session_models.js +1 -0
  115. package/dist/generated/models/session_start_sources.js +1 -0
  116. package/dist/generated/models/thread_sessions.js +1 -0
  117. package/dist/generated/models/thread_worktrees.js +1 -0
  118. package/dist/generated/models.js +1 -0
  119. package/dist/heap-monitor.js +122 -0
  120. package/dist/hrana-server.js +263 -0
  121. package/dist/hrana-server.test.js +370 -0
  122. package/dist/html-actions.js +123 -0
  123. package/dist/html-actions.test.js +70 -0
  124. package/dist/html-components.js +117 -0
  125. package/dist/html-components.test.js +34 -0
  126. package/dist/image-optimizer-plugin.js +153 -0
  127. package/dist/image-utils.js +112 -0
  128. package/dist/interaction-handler.js +397 -0
  129. package/dist/ipc-polling.js +252 -0
  130. package/dist/ipc-tools-plugin.js +193 -0
  131. package/dist/kimaki-digital-twin.e2e.test.js +161 -0
  132. package/dist/kimaki-opencode-plugin-loading.e2e.test.js +87 -0
  133. package/dist/kimaki-opencode-plugin.js +17 -0
  134. package/dist/kimaki-opencode-plugin.test.js +98 -0
  135. package/dist/limit-heading-depth.js +25 -0
  136. package/dist/limit-heading-depth.test.js +105 -0
  137. package/dist/logger.js +165 -0
  138. package/dist/markdown.js +342 -0
  139. package/dist/markdown.test.js +257 -0
  140. package/dist/message-finish-field.e2e.test.js +165 -0
  141. package/dist/message-formatting.js +413 -0
  142. package/dist/message-formatting.test.js +73 -0
  143. package/dist/message-preprocessing.js +330 -0
  144. package/dist/onboarding-tutorial.js +172 -0
  145. package/dist/onboarding-welcome.js +37 -0
  146. package/dist/openai-realtime.js +224 -0
  147. package/dist/opencode-command-detection.js +65 -0
  148. package/dist/opencode-command-detection.test.js +240 -0
  149. package/dist/opencode-command.js +129 -0
  150. package/dist/opencode-command.test.js +48 -0
  151. package/dist/opencode-interrupt-plugin.js +361 -0
  152. package/dist/opencode-interrupt-plugin.test.js +458 -0
  153. package/dist/opencode.js +861 -0
  154. package/dist/otto/branding.js +22 -0
  155. package/dist/otto/index.js +21 -0
  156. package/dist/parse-permission-rules.test.js +117 -0
  157. package/dist/patch-text-parser.js +97 -0
  158. package/dist/plugin-logger.js +59 -0
  159. package/dist/privacy-sanitizer.js +105 -0
  160. package/dist/queue-advanced-abort.e2e.test.js +293 -0
  161. package/dist/queue-advanced-action-buttons.e2e.test.js +206 -0
  162. package/dist/queue-advanced-e2e-setup.js +786 -0
  163. package/dist/queue-advanced-footer.e2e.test.js +472 -0
  164. package/dist/queue-advanced-model-switch.e2e.test.js +299 -0
  165. package/dist/queue-advanced-permissions-typing.e2e.test.js +180 -0
  166. package/dist/queue-advanced-question.e2e.test.js +261 -0
  167. package/dist/queue-advanced-typing-interrupt.e2e.test.js +114 -0
  168. package/dist/queue-advanced-typing.e2e.test.js +153 -0
  169. package/dist/queue-drain-after-interactive-ui.e2e.test.js +119 -0
  170. package/dist/queue-interrupt-drain.e2e.test.js +135 -0
  171. package/dist/queue-question-select-drain.e2e.test.js +120 -0
  172. package/dist/runtime-idle-sweeper.js +52 -0
  173. package/dist/runtime-lifecycle.e2e.test.js +508 -0
  174. package/dist/sentry.js +23 -0
  175. package/dist/session-handler/agent-utils.js +67 -0
  176. package/dist/session-handler/event-stream-state.js +420 -0
  177. package/dist/session-handler/event-stream-state.test.js +563 -0
  178. package/dist/session-handler/model-utils.js +124 -0
  179. package/dist/session-handler/opencode-session-event-log.js +94 -0
  180. package/dist/session-handler/thread-runtime-state.js +104 -0
  181. package/dist/session-handler/thread-session-runtime.js +3258 -0
  182. package/dist/session-handler.js +9 -0
  183. package/dist/session-search.js +100 -0
  184. package/dist/session-search.test.js +40 -0
  185. package/dist/session-title-rename.test.js +80 -0
  186. package/dist/startup-service.js +153 -0
  187. package/dist/startup-time.e2e.test.js +296 -0
  188. package/dist/store.js +17 -0
  189. package/dist/system-message.js +613 -0
  190. package/dist/system-message.test.js +602 -0
  191. package/dist/task-runner.js +295 -0
  192. package/dist/task-schedule.js +209 -0
  193. package/dist/task-schedule.test.js +71 -0
  194. package/dist/test-utils.js +299 -0
  195. package/dist/thinking-utils.js +35 -0
  196. package/dist/thread-message-queue.e2e.test.js +999 -0
  197. package/dist/tools.js +357 -0
  198. package/dist/undo-redo.e2e.test.js +161 -0
  199. package/dist/unnest-code-blocks.js +146 -0
  200. package/dist/unnest-code-blocks.test.js +673 -0
  201. package/dist/upgrade.js +114 -0
  202. package/dist/utils.js +144 -0
  203. package/dist/voice-attachment.js +34 -0
  204. package/dist/voice-handler.js +646 -0
  205. package/dist/voice-message.e2e.test.js +1021 -0
  206. package/dist/voice.js +447 -0
  207. package/dist/voice.test.js +235 -0
  208. package/dist/wait-session.js +94 -0
  209. package/dist/websockify.js +69 -0
  210. package/dist/worker-types.js +4 -0
  211. package/dist/worktree-lifecycle.e2e.test.js +308 -0
  212. package/dist/worktree-utils.js +3 -0
  213. package/dist/worktrees.js +929 -0
  214. package/dist/worktrees.test.js +189 -0
  215. package/dist/xml.js +92 -0
  216. package/dist/xml.test.js +32 -0
  217. package/package.json +98 -0
  218. package/schema.prisma +295 -0
  219. package/skills/batch/SKILL.md +87 -0
  220. package/skills/critique/SKILL.md +112 -0
  221. package/skills/egaki/SKILL.md +100 -0
  222. package/skills/errore/SKILL.md +647 -0
  223. package/skills/event-sourcing-state/SKILL.md +252 -0
  224. package/skills/gitchamber/SKILL.md +93 -0
  225. package/skills/goke/SKILL.md +644 -0
  226. package/skills/jitter/EDITOR.md +219 -0
  227. package/skills/jitter/EXPORT-INTERNALS.md +309 -0
  228. package/skills/jitter/SKILL.md +158 -0
  229. package/skills/jitter/jitter-clipboard.json +1042 -0
  230. package/skills/jitter/package.json +14 -0
  231. package/skills/jitter/tsconfig.json +15 -0
  232. package/skills/jitter/utils/actions.ts +212 -0
  233. package/skills/jitter/utils/export.ts +114 -0
  234. package/skills/jitter/utils/index.ts +141 -0
  235. package/skills/jitter/utils/snapshot.ts +154 -0
  236. package/skills/jitter/utils/traverse.ts +246 -0
  237. package/skills/jitter/utils/types.ts +279 -0
  238. package/skills/jitter/utils/wait.ts +133 -0
  239. package/skills/lintcn/SKILL.md +873 -0
  240. package/skills/new-skill/SKILL.md +211 -0
  241. package/skills/npm-package/SKILL.md +239 -0
  242. package/skills/playwriter/SKILL.md +35 -0
  243. package/skills/proxyman/SKILL.md +215 -0
  244. package/skills/security-review/SKILL.md +208 -0
  245. package/skills/simplify/SKILL.md +58 -0
  246. package/skills/spiceflow/SKILL.md +14 -0
  247. package/skills/termcast/SKILL.md +945 -0
  248. package/skills/tuistory/SKILL.md +250 -0
  249. package/skills/usecomputer/SKILL.md +264 -0
  250. package/skills/x-articles/SKILL.md +554 -0
  251. package/skills/zele/SKILL.md +112 -0
  252. package/skills/zustand-centralized-state/SKILL.md +1004 -0
  253. package/src/agent-model.e2e.test.ts +976 -0
  254. package/src/ai-tool-to-genai.test.ts +296 -0
  255. package/src/ai-tool-to-genai.ts +283 -0
  256. package/src/ai-tool.ts +39 -0
  257. package/src/anthropic-auth-plugin.test.ts +159 -0
  258. package/src/anthropic-auth-plugin.ts +861 -0
  259. package/src/anthropic-auth-state.ts +282 -0
  260. package/src/bin.ts +111 -0
  261. package/src/channel-management.ts +334 -0
  262. package/src/cli-parsing.test.ts +195 -0
  263. package/src/cli-send-thread.e2e.test.ts +464 -0
  264. package/src/cli.ts +4581 -0
  265. package/src/commands/abort.ts +89 -0
  266. package/src/commands/action-buttons.ts +364 -0
  267. package/src/commands/add-project.ts +149 -0
  268. package/src/commands/agent.ts +473 -0
  269. package/src/commands/ask-question.ts +390 -0
  270. package/src/commands/btw.ts +164 -0
  271. package/src/commands/compact.ts +157 -0
  272. package/src/commands/context-usage.ts +199 -0
  273. package/src/commands/create-new-project.ts +190 -0
  274. package/src/commands/diff.ts +91 -0
  275. package/src/commands/file-upload.ts +389 -0
  276. package/src/commands/fork.ts +321 -0
  277. package/src/commands/gemini-apikey.ts +104 -0
  278. package/src/commands/login.ts +1173 -0
  279. package/src/commands/mcp.ts +307 -0
  280. package/src/commands/memory-snapshot.ts +30 -0
  281. package/src/commands/mention-mode.ts +68 -0
  282. package/src/commands/merge-worktree.ts +223 -0
  283. package/src/commands/model-variant.ts +483 -0
  284. package/src/commands/model.ts +1053 -0
  285. package/src/commands/new-worktree.ts +510 -0
  286. package/src/commands/paginated-select.ts +81 -0
  287. package/src/commands/permissions.ts +397 -0
  288. package/src/commands/queue.ts +271 -0
  289. package/src/commands/remove-project.ts +155 -0
  290. package/src/commands/restart-opencode-server.ts +162 -0
  291. package/src/commands/resume.ts +230 -0
  292. package/src/commands/run-command.ts +123 -0
  293. package/src/commands/screenshare.test.ts +30 -0
  294. package/src/commands/screenshare.ts +366 -0
  295. package/src/commands/session-id.ts +109 -0
  296. package/src/commands/session.ts +227 -0
  297. package/src/commands/share.ts +106 -0
  298. package/src/commands/tasks.ts +293 -0
  299. package/src/commands/types.ts +25 -0
  300. package/src/commands/undo-redo.ts +386 -0
  301. package/src/commands/unset-model.ts +173 -0
  302. package/src/commands/upgrade.ts +52 -0
  303. package/src/commands/user-command.ts +198 -0
  304. package/src/commands/verbosity.ts +173 -0
  305. package/src/commands/worktree-settings.ts +70 -0
  306. package/src/commands/worktrees.ts +552 -0
  307. package/src/condense-memory.ts +36 -0
  308. package/src/config.ts +111 -0
  309. package/src/context-awareness-plugin.test.ts +142 -0
  310. package/src/context-awareness-plugin.ts +510 -0
  311. package/src/critique-utils.ts +139 -0
  312. package/src/database.ts +1876 -0
  313. package/src/db.test.ts +162 -0
  314. package/src/db.ts +286 -0
  315. package/src/debounce-timeout.ts +43 -0
  316. package/src/debounced-process-flush.ts +104 -0
  317. package/src/discord-bot.ts +1330 -0
  318. package/src/discord-command-registration.ts +693 -0
  319. package/src/discord-urls.ts +88 -0
  320. package/src/discord-utils.test.ts +153 -0
  321. package/src/discord-utils.ts +800 -0
  322. package/src/errors.ts +201 -0
  323. package/src/escape-backticks.test.ts +469 -0
  324. package/src/event-stream-real-capture.e2e.test.ts +692 -0
  325. package/src/eventsource-parser.test.ts +351 -0
  326. package/src/exec-async.ts +35 -0
  327. package/src/external-opencode-sync.ts +685 -0
  328. package/src/format-tables.test.ts +335 -0
  329. package/src/format-tables.ts +445 -0
  330. package/src/forum-sync/config.ts +92 -0
  331. package/src/forum-sync/discord-operations.ts +241 -0
  332. package/src/forum-sync/index.ts +9 -0
  333. package/src/forum-sync/markdown.ts +172 -0
  334. package/src/forum-sync/sync-to-discord.ts +595 -0
  335. package/src/forum-sync/sync-to-files.ts +294 -0
  336. package/src/forum-sync/types.ts +175 -0
  337. package/src/forum-sync/watchers.ts +454 -0
  338. package/src/gateway-proxy-reconnect.e2e.test.ts +523 -0
  339. package/src/gateway-proxy.e2e.test.ts +640 -0
  340. package/src/genai-worker-wrapper.ts +164 -0
  341. package/src/genai-worker.ts +386 -0
  342. package/src/genai.ts +321 -0
  343. package/src/generated/browser.ts +114 -0
  344. package/src/generated/client.ts +138 -0
  345. package/src/generated/commonInputTypes.ts +736 -0
  346. package/src/generated/enums.ts +88 -0
  347. package/src/generated/internal/class.ts +384 -0
  348. package/src/generated/internal/prismaNamespace.ts +2386 -0
  349. package/src/generated/internal/prismaNamespaceBrowser.ts +326 -0
  350. package/src/generated/models/bot_api_keys.ts +1288 -0
  351. package/src/generated/models/bot_tokens.ts +1656 -0
  352. package/src/generated/models/channel_agents.ts +1256 -0
  353. package/src/generated/models/channel_directories.ts +1859 -0
  354. package/src/generated/models/channel_mention_mode.ts +1300 -0
  355. package/src/generated/models/channel_models.ts +1288 -0
  356. package/src/generated/models/channel_verbosity.ts +1228 -0
  357. package/src/generated/models/channel_worktrees.ts +1300 -0
  358. package/src/generated/models/forum_sync_configs.ts +1452 -0
  359. package/src/generated/models/global_models.ts +1288 -0
  360. package/src/generated/models/ipc_requests.ts +1485 -0
  361. package/src/generated/models/part_messages.ts +1302 -0
  362. package/src/generated/models/scheduled_tasks.ts +2320 -0
  363. package/src/generated/models/session_agents.ts +1086 -0
  364. package/src/generated/models/session_events.ts +1439 -0
  365. package/src/generated/models/session_models.ts +1114 -0
  366. package/src/generated/models/session_start_sources.ts +1408 -0
  367. package/src/generated/models/thread_sessions.ts +1781 -0
  368. package/src/generated/models/thread_worktrees.ts +1356 -0
  369. package/src/generated/models.ts +30 -0
  370. package/src/heap-monitor.ts +152 -0
  371. package/src/hrana-server.test.ts +434 -0
  372. package/src/hrana-server.ts +314 -0
  373. package/src/html-actions.test.ts +87 -0
  374. package/src/html-actions.ts +174 -0
  375. package/src/html-components.test.ts +38 -0
  376. package/src/html-components.ts +181 -0
  377. package/src/image-optimizer-plugin.ts +194 -0
  378. package/src/image-utils.ts +149 -0
  379. package/src/interaction-handler.ts +576 -0
  380. package/src/ipc-polling.ts +326 -0
  381. package/src/ipc-tools-plugin.ts +236 -0
  382. package/src/kimaki-digital-twin.e2e.test.ts +199 -0
  383. package/src/kimaki-opencode-plugin-loading.e2e.test.ts +109 -0
  384. package/src/kimaki-opencode-plugin.test.ts +108 -0
  385. package/src/kimaki-opencode-plugin.ts +18 -0
  386. package/src/limit-heading-depth.test.ts +116 -0
  387. package/src/limit-heading-depth.ts +26 -0
  388. package/src/logger.ts +208 -0
  389. package/src/markdown.test.ts +308 -0
  390. package/src/markdown.ts +410 -0
  391. package/src/message-finish-field.e2e.test.ts +192 -0
  392. package/src/message-formatting.test.ts +81 -0
  393. package/src/message-formatting.ts +533 -0
  394. package/src/message-preprocessing.ts +455 -0
  395. package/src/onboarding-tutorial.ts +176 -0
  396. package/src/onboarding-welcome.ts +49 -0
  397. package/src/openai-realtime.ts +358 -0
  398. package/src/opencode-command-detection.test.ts +307 -0
  399. package/src/opencode-command-detection.ts +76 -0
  400. package/src/opencode-command.test.ts +70 -0
  401. package/src/opencode-command.ts +188 -0
  402. package/src/opencode-interrupt-plugin.test.ts +677 -0
  403. package/src/opencode-interrupt-plugin.ts +477 -0
  404. package/src/opencode.ts +1110 -0
  405. package/src/otto/branding.ts +23 -0
  406. package/src/otto/index.ts +22 -0
  407. package/src/parse-permission-rules.test.ts +127 -0
  408. package/src/patch-text-parser.ts +107 -0
  409. package/src/plugin-logger.ts +68 -0
  410. package/src/privacy-sanitizer.ts +142 -0
  411. package/src/queue-advanced-abort.e2e.test.ts +382 -0
  412. package/src/queue-advanced-action-buttons.e2e.test.ts +268 -0
  413. package/src/queue-advanced-e2e-setup.ts +873 -0
  414. package/src/queue-advanced-footer.e2e.test.ts +576 -0
  415. package/src/queue-advanced-model-switch.e2e.test.ts +383 -0
  416. package/src/queue-advanced-permissions-typing.e2e.test.ts +245 -0
  417. package/src/queue-advanced-question.e2e.test.ts +316 -0
  418. package/src/queue-advanced-typing-interrupt.e2e.test.ts +146 -0
  419. package/src/queue-advanced-typing.e2e.test.ts +199 -0
  420. package/src/queue-drain-after-interactive-ui.e2e.test.ts +151 -0
  421. package/src/queue-interrupt-drain.e2e.test.ts +166 -0
  422. package/src/queue-question-select-drain.e2e.test.ts +152 -0
  423. package/src/runtime-idle-sweeper.ts +76 -0
  424. package/src/runtime-lifecycle.e2e.test.ts +641 -0
  425. package/src/schema.sql +173 -0
  426. package/src/sentry.ts +26 -0
  427. package/src/session-handler/agent-utils.ts +97 -0
  428. package/src/session-handler/event-stream-fixtures/real-session-action-buttons.jsonl +45 -0
  429. package/src/session-handler/event-stream-fixtures/real-session-footer-suppressed-on-pre-idle-interrupt.jsonl +40 -0
  430. package/src/session-handler/event-stream-fixtures/real-session-permission-external-file.jsonl +23 -0
  431. package/src/session-handler/event-stream-fixtures/real-session-task-normal.jsonl +22 -0
  432. package/src/session-handler/event-stream-fixtures/real-session-task-three-parallel-sleeps.jsonl +277 -0
  433. package/src/session-handler/event-stream-fixtures/real-session-task-user-interruption.jsonl +46 -0
  434. package/src/session-handler/event-stream-fixtures/session-abort-after-idle-race.jsonl +21 -0
  435. package/src/session-handler/event-stream-fixtures/session-concurrent-messages-serialized.jsonl +56 -0
  436. package/src/session-handler/event-stream-fixtures/session-explicit-abort.jsonl +44 -0
  437. package/src/session-handler/event-stream-fixtures/session-normal-completion.jsonl +29 -0
  438. package/src/session-handler/event-stream-fixtures/session-tool-call-noisy-stream.jsonl +29 -0
  439. package/src/session-handler/event-stream-fixtures/session-two-completions-same-session.jsonl +50 -0
  440. package/src/session-handler/event-stream-fixtures/session-user-interruption.jsonl +59 -0
  441. package/src/session-handler/event-stream-fixtures/session-voice-queued-followup.jsonl +52 -0
  442. package/src/session-handler/event-stream-state.test.ts +645 -0
  443. package/src/session-handler/event-stream-state.ts +608 -0
  444. package/src/session-handler/model-utils.ts +183 -0
  445. package/src/session-handler/opencode-session-event-log.ts +130 -0
  446. package/src/session-handler/thread-runtime-state.ts +212 -0
  447. package/src/session-handler/thread-session-runtime.ts +4281 -0
  448. package/src/session-handler.ts +15 -0
  449. package/src/session-search.test.ts +50 -0
  450. package/src/session-search.ts +148 -0
  451. package/src/session-title-rename.test.ts +112 -0
  452. package/src/startup-service.ts +200 -0
  453. package/src/startup-time.e2e.test.ts +373 -0
  454. package/src/store.ts +122 -0
  455. package/src/system-message.test.ts +612 -0
  456. package/src/system-message.ts +723 -0
  457. package/src/task-runner.ts +421 -0
  458. package/src/task-schedule.test.ts +84 -0
  459. package/src/task-schedule.ts +311 -0
  460. package/src/test-utils.ts +435 -0
  461. package/src/thinking-utils.ts +61 -0
  462. package/src/thread-message-queue.e2e.test.ts +1219 -0
  463. package/src/tools.ts +430 -0
  464. package/src/undici.d.ts +12 -0
  465. package/src/undo-redo.e2e.test.ts +209 -0
  466. package/src/unnest-code-blocks.test.ts +713 -0
  467. package/src/unnest-code-blocks.ts +185 -0
  468. package/src/upgrade.ts +127 -0
  469. package/src/utils.ts +212 -0
  470. package/src/voice-attachment.ts +51 -0
  471. package/src/voice-handler.ts +908 -0
  472. package/src/voice-message.e2e.test.ts +1255 -0
  473. package/src/voice.test.ts +281 -0
  474. package/src/voice.ts +627 -0
  475. package/src/wait-session.ts +147 -0
  476. package/src/websockify.ts +101 -0
  477. package/src/worker-types.ts +64 -0
  478. package/src/worktree-lifecycle.e2e.test.ts +391 -0
  479. package/src/worktree-utils.ts +4 -0
  480. package/src/worktrees.test.ts +223 -0
  481. package/src/worktrees.ts +1294 -0
  482. package/src/xml.test.ts +38 -0
  483. 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.