@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
package/schema.prisma ADDED
@@ -0,0 +1,295 @@
1
+ // schema.prisma for the kimaki local db
2
+ // prefer using enum for strings with few known options so it is type safe in typescript code. sqlite does not have enum. this is a prisma only concept
3
+ // these enums will be also exported as types by prisma and we can reuse them in our code
4
+
5
+ generator client {
6
+ provider = "prisma-client"
7
+ output = "./src/generated"
8
+ }
9
+
10
+ datasource db {
11
+ provider = "sqlite"
12
+ }
13
+
14
+ model thread_sessions {
15
+ thread_id String @id
16
+ session_id String
17
+ source ThreadSessionSource @default(kimaki)
18
+ created_at DateTime? @default(now())
19
+
20
+ part_messages part_messages[]
21
+ session_events session_events[]
22
+ scheduled_tasks scheduled_tasks[]
23
+ thread_worktree thread_worktrees?
24
+ ipc_requests ipc_requests[]
25
+ }
26
+
27
+ enum ThreadSessionSource {
28
+ kimaki
29
+ external_poll
30
+ }
31
+
32
+ model session_events {
33
+ id Int @id @default(autoincrement())
34
+ session_id String
35
+ thread_id String
36
+ timestamp BigInt // milliseconds since Unix epoch
37
+ event_index Int // stable in-memory insertion order within a session
38
+ event_json String
39
+
40
+ thread thread_sessions @relation(fields: [thread_id], references: [thread_id], onDelete: Cascade, onUpdate: Cascade)
41
+
42
+ @@index([session_id, timestamp, event_index, id])
43
+ @@index([thread_id, timestamp, event_index, id])
44
+ }
45
+
46
+ model part_messages {
47
+ part_id String @id
48
+ message_id String
49
+ thread_id String
50
+ created_at DateTime? @default(now())
51
+
52
+ thread thread_sessions @relation(fields: [thread_id], references: [thread_id])
53
+ }
54
+
55
+ model bot_tokens {
56
+ app_id String @id
57
+ token String
58
+ bot_mode BotMode @default(self_hosted)
59
+ client_id String?
60
+ client_secret String?
61
+ proxy_url String?
62
+ created_at DateTime? @default(now())
63
+ last_used_at DateTime?
64
+
65
+ api_keys bot_api_keys?
66
+ forum_sync_configs forum_sync_configs[]
67
+ global_model global_models?
68
+ }
69
+
70
+ enum BotMode {
71
+ self_hosted
72
+ gateway
73
+ }
74
+
75
+ model channel_directories {
76
+ channel_id String @id
77
+ directory String
78
+ channel_type ChannelType
79
+ // app_id String? // no longer used: channel ownership is no longer scoped per bot app
80
+ created_at DateTime? @default(now())
81
+
82
+ channel_model channel_models?
83
+ channel_agent channel_agents?
84
+ channel_worktree channel_worktrees?
85
+ channel_verbosity channel_verbosity?
86
+ channel_mention_mode channel_mention_mode?
87
+ scheduled_tasks scheduled_tasks[]
88
+ }
89
+
90
+ enum ChannelType {
91
+ text
92
+ voice
93
+ }
94
+
95
+ model bot_api_keys {
96
+ app_id String @id
97
+ gemini_api_key String?
98
+ openai_api_key String?
99
+ xai_api_key String?
100
+ created_at DateTime? @default(now())
101
+
102
+ bot bot_tokens @relation(fields: [app_id], references: [app_id])
103
+ }
104
+
105
+ model thread_worktrees {
106
+ thread_id String @id
107
+ worktree_name String
108
+ worktree_directory String?
109
+ project_directory String
110
+ status WorktreeStatus @default(pending)
111
+ error_message String?
112
+ created_at DateTime? @default(now())
113
+
114
+ thread thread_sessions @relation(fields: [thread_id], references: [thread_id])
115
+ }
116
+
117
+ enum WorktreeStatus {
118
+ pending
119
+ ready
120
+ error
121
+ }
122
+
123
+ model channel_models {
124
+ channel_id String @id
125
+ model_id String
126
+ variant String?
127
+ created_at DateTime? @default(now())
128
+ updated_at DateTime? @default(now()) @updatedAt
129
+
130
+ channel channel_directories @relation(fields: [channel_id], references: [channel_id])
131
+ }
132
+
133
+ model session_models {
134
+ session_id String @id
135
+ model_id String
136
+ variant String?
137
+ created_at DateTime? @default(now())
138
+ }
139
+
140
+ model channel_agents {
141
+ channel_id String @id
142
+ agent_name String
143
+ created_at DateTime? @default(now())
144
+ updated_at DateTime? @default(now()) @updatedAt
145
+
146
+ channel channel_directories @relation(fields: [channel_id], references: [channel_id])
147
+ }
148
+
149
+ model session_agents {
150
+ session_id String @id
151
+ agent_name String
152
+ created_at DateTime? @default(now())
153
+ }
154
+
155
+ model channel_worktrees {
156
+ channel_id String @id
157
+ enabled Int @default(0)
158
+ created_at DateTime? @default(now())
159
+ updated_at DateTime? @default(now()) @updatedAt
160
+
161
+ channel channel_directories @relation(fields: [channel_id], references: [channel_id])
162
+ }
163
+
164
+ model channel_verbosity {
165
+ channel_id String @id
166
+ verbosity VerbosityLevel @default(tools_and_text)
167
+ updated_at DateTime? @default(now()) @updatedAt
168
+
169
+ channel channel_directories @relation(fields: [channel_id], references: [channel_id])
170
+ }
171
+
172
+ enum VerbosityLevel {
173
+ tools_and_text
174
+ text_and_essential_tools
175
+ text_only
176
+ }
177
+
178
+ model channel_mention_mode {
179
+ channel_id String @id
180
+ enabled Int @default(0)
181
+ created_at DateTime? @default(now())
182
+ updated_at DateTime? @default(now()) @updatedAt
183
+
184
+ channel channel_directories @relation(fields: [channel_id], references: [channel_id])
185
+ }
186
+
187
+ model global_models {
188
+ app_id String @id
189
+ model_id String
190
+ variant String?
191
+ created_at DateTime? @default(now())
192
+ updated_at DateTime? @default(now()) @updatedAt
193
+
194
+ bot bot_tokens @relation(fields: [app_id], references: [app_id])
195
+ }
196
+
197
+ enum task_status {
198
+ planned
199
+ running
200
+ completed
201
+ cancelled
202
+ failed
203
+ }
204
+
205
+ enum task_schedule_kind {
206
+ at
207
+ cron
208
+ }
209
+
210
+ model scheduled_tasks {
211
+ id Int @id @default(autoincrement())
212
+ status task_status @default(planned)
213
+ schedule_kind task_schedule_kind
214
+ run_at DateTime?
215
+ cron_expr String?
216
+ timezone String?
217
+ next_run_at DateTime
218
+ running_started_at DateTime?
219
+ last_run_at DateTime?
220
+ last_error String?
221
+ attempts Int @default(0)
222
+ payload_json String
223
+ prompt_preview String
224
+ channel_id String?
225
+ thread_id String?
226
+ session_id String?
227
+ project_directory String?
228
+ created_at DateTime? @default(now())
229
+ updated_at DateTime? @default(now()) @updatedAt
230
+
231
+ channel channel_directories? @relation(fields: [channel_id], references: [channel_id], onDelete: SetNull, onUpdate: Cascade)
232
+ thread thread_sessions? @relation(fields: [thread_id], references: [thread_id], onDelete: SetNull, onUpdate: Cascade)
233
+ session_start_sources session_start_sources[]
234
+
235
+ @@index([status, next_run_at])
236
+ @@index([channel_id, status])
237
+ @@index([thread_id, status])
238
+ }
239
+
240
+ model session_start_sources {
241
+ session_id String @id
242
+ schedule_kind task_schedule_kind
243
+ scheduled_task_id Int?
244
+ created_at DateTime? @default(now())
245
+ updated_at DateTime? @default(now()) @updatedAt
246
+
247
+ scheduled_task scheduled_tasks? @relation(fields: [scheduled_task_id], references: [id], onDelete: SetNull, onUpdate: Cascade)
248
+
249
+ @@index([scheduled_task_id])
250
+ }
251
+
252
+ model forum_sync_configs {
253
+ id Int @id @default(autoincrement())
254
+ app_id String
255
+ forum_channel_id String
256
+ output_dir String
257
+ direction String @default("bidirectional")
258
+ created_at DateTime? @default(now())
259
+ updated_at DateTime? @default(now()) @updatedAt
260
+
261
+ bot bot_tokens @relation(fields: [app_id], references: [app_id], onDelete: Cascade, onUpdate: Cascade)
262
+
263
+ @@unique([app_id, forum_channel_id])
264
+ }
265
+
266
+ enum ipc_request_type {
267
+ file_upload
268
+ action_buttons
269
+ }
270
+
271
+ enum ipc_request_status {
272
+ pending
273
+ processing
274
+ completed
275
+ cancelled
276
+ }
277
+
278
+ // IPC bridge between the opencode plugin process and the Discord bot process.
279
+ // Replaces the old HTTP lock server for file-upload and action-buttons requests.
280
+ // Plugin inserts a pending row, bot polls and dispatches, then writes the response.
281
+ model ipc_requests {
282
+ id String @id @default(uuid())
283
+ type ipc_request_type
284
+ session_id String
285
+ thread_id String
286
+ payload String // JSON-encoded request data
287
+ response String? // JSON-encoded response, null while pending
288
+ status ipc_request_status @default(pending)
289
+ created_at DateTime @default(now())
290
+ updated_at DateTime @default(now()) @updatedAt
291
+
292
+ thread thread_sessions @relation(fields: [thread_id], references: [thread_id])
293
+
294
+ @@index([status, created_at])
295
+ }
@@ -0,0 +1,87 @@
1
+ ---
2
+ name: batch
3
+ description: >
4
+ Research and plan a large-scale change, then execute it in parallel across
5
+ 5-30 isolated worktree agents that each open a PR. Use when the user wants
6
+ to make a sweeping, mechanical change across many files (migrations,
7
+ refactors, bulk renames) that can be decomposed into independent parallel
8
+ units.
9
+ argument-hint: "<instruction>"
10
+ source-path: cli.js (line 7359, function mGz)
11
+ source-package: "@anthropic-ai/claude-code@2.1.63"
12
+ source-date: 2026-02-28
13
+ ---
14
+
15
+ # Batch: Parallel Work Orchestration
16
+
17
+ You are orchestrating a large, parallelizable change across this codebase.
18
+
19
+ ## User Instruction
20
+
21
+ $instruction
22
+
23
+ ## Phase 1: Research and Plan (Plan Mode)
24
+
25
+ Enter plan mode, then:
26
+
27
+ 1. **Understand the scope.** Launch one or more Explore agents (in the foreground — you need their results) to deeply research what this instruction touches. Find all the files, patterns, and call sites that need to change. Understand the existing conventions so the migration is consistent.
28
+
29
+ 2. **Decompose into independent units.** Break the work into 5–30 self-contained units. Each unit must:
30
+ - Be independently implementable in an isolated git worktree (no shared state with sibling units)
31
+ - Be mergeable on its own without depending on another unit's PR landing first
32
+ - Be roughly uniform in size (split large units, merge trivial ones)
33
+
34
+ Scale the count to the actual work: few files → closer to 5; hundreds of files → closer to 30. Prefer per-directory or per-module slicing over arbitrary file lists.
35
+
36
+ 3. **Determine the e2e test recipe.** Figure out how a worker can verify its change actually works end-to-end — not just that unit tests pass. Look for:
37
+ - A browser-automation tool (for UI changes: click through the affected flow, screenshot the result)
38
+ - A tmux or CLI-verifier skill (for CLI changes: launch the app interactively, exercise the changed behavior)
39
+ - A dev-server + curl pattern (for API changes: start the server, hit the affected endpoints)
40
+ - An existing e2e/integration test suite the worker can run
41
+
42
+ If you cannot find a concrete e2e path, ask the user how to verify this change end-to-end. Offer 2–3 specific options based on what you found (e.g., "Screenshot via chrome extension", "Run `bun run dev` and curl the endpoint", "No e2e — unit tests are sufficient"). Do not skip this — the workers cannot ask the user themselves.
43
+
44
+ Write the recipe as a short, concrete set of steps that a worker can execute autonomously. Include any setup (start a dev server, build first) and the exact command/interaction to verify.
45
+
46
+ 4. **Write the plan.** In your plan file, include:
47
+ - A summary of what you found during research
48
+ - A numbered list of work units — for each: a short title, the list of files/directories it covers, and a one-line description of the change
49
+ - The e2e test recipe (or "skip e2e because …" if the user chose that)
50
+ - The exact worker instructions you will give each agent (the shared template)
51
+
52
+ 5. Present the plan for approval.
53
+
54
+ ## Phase 2: Spawn Workers (After Plan Approval)
55
+
56
+ Once the plan is approved, spawn one background agent per work unit using the Task tool. **All agents must use `isolation: "worktree"` and `run_in_background: true`.** Launch them all in a single message block so they run in parallel.
57
+
58
+ For each agent, the prompt must be fully self-contained. Include:
59
+ - The overall goal (the user's instruction)
60
+ - This unit's specific task (title, file list, change description — copied verbatim from your plan)
61
+ - Any codebase conventions you discovered that the worker needs to follow
62
+ - The e2e test recipe from your plan (or "skip e2e because …")
63
+ - The worker instructions below, copied verbatim:
64
+
65
+ ```
66
+ After you finish implementing the change:
67
+ 1. **Simplify** — Invoke the simplify skill to review and clean up your changes.
68
+ 2. **Run unit tests** — Run the project's test suite (check for package.json scripts, Makefile targets, or common commands like `npm test`, `bun test`, `pytest`, `go test`). If tests fail, fix them.
69
+ 3. **Test end-to-end** — Follow the e2e test recipe from the coordinator's prompt (below). If the recipe says to skip e2e for this unit, skip it.
70
+ 4. **Commit and push** — Commit all changes with a clear message, push the branch, and create a PR with `gh pr create`. Use a descriptive title. If `gh` is not available or the push fails, note it in your final message.
71
+ 5. **Report** — End with a single line: `PR: <url>` so the coordinator can track it. If no PR was created, end with `PR: none — <reason>`.
72
+ ```
73
+
74
+ Use `subagent_type: "general-purpose"` unless a more specific agent type fits.
75
+
76
+ ## Phase 3: Track Progress
77
+
78
+ After launching all workers, render an initial status table:
79
+
80
+ | # | Unit | Status | PR |
81
+ |---|------|--------|----|
82
+ | 1 | <title> | running | — |
83
+ | 2 | <title> | running | — |
84
+
85
+ As background-agent completion notifications arrive, parse the `PR: <url>` line from each agent's result and re-render the table with updated status (`done` / `failed`) and PR links. Keep a brief failure note for any agent that did not produce a PR.
86
+
87
+ When all agents have reported, render the final table and a one-line summary (e.g., "22/24 units landed as PRs").
@@ -0,0 +1,112 @@
1
+ ---
2
+ name: critique
3
+ description: >
4
+ Git diff viewer. Renders diffs as web pages, images, and PDFs
5
+ with syntax highlighting. Use this skill when working with critique for showing
6
+ diffs, generating diff URLs, or selective hunk staging.
7
+ ---
8
+
9
+ # critique
10
+
11
+ Git diff viewer that renders diffs as **web pages**, **images**, and **PDFs** with syntax highlighting.
12
+
13
+ Agents running in headless environments (kimaki on Discord, openclaw on Slack/Telegram) have no terminal to show diffs. critique uploads diffs to critique.work and returns a shareable URL you can paste into chat. Users click the link and see a syntax-highlighted split-view diff with mobile support and dark/light mode — no install needed.
14
+
15
+ **Always run `critique --help` first** to see the latest flags and commands. The help output is the source of truth.
16
+
17
+ ## Web — shareable diff URLs
18
+
19
+ Always pass a title to describe what the diff contains.
20
+
21
+ ```bash
22
+ # Working tree changes
23
+ critique --web "Add retry logic to database connections"
24
+
25
+ # Staged changes
26
+ critique --staged --web "Refactor auth middleware"
27
+
28
+ # Branch diff (three-dot: changes since diverging from base)
29
+ critique main...HEAD --web "Feature branch changes"
30
+ critique main...feature-branch --web "Compare branches"
31
+
32
+ # Last N commits
33
+ critique HEAD~3 --web "Recent changes"
34
+
35
+ # Specific commit
36
+ critique --commit HEAD --web "Latest commit"
37
+ critique --commit abc1234 --web "Fix race condition"
38
+
39
+ # Filter to specific files
40
+ critique --web "API changes" --filter "src/api.ts" --filter "src/utils.ts"
41
+
42
+ # JSON output for programmatic use (returns {url, id, files})
43
+ critique --web "Deploy changes" --json
44
+ ```
45
+
46
+ Share the returned URL with the user so they can see the diff.
47
+
48
+ ## PDF
49
+
50
+ ```bash
51
+ critique --pdf # working tree to PDF
52
+ critique --staged --pdf # staged changes
53
+ critique main...HEAD --pdf # branch diff
54
+ critique --commit HEAD --pdf # single commit
55
+ critique --pdf output.pdf # custom filename
56
+ critique --pdf --pdf-page-size a4-portrait # page size options
57
+ critique main...HEAD --pdf --open # open in viewer
58
+ ```
59
+
60
+ ## Image
61
+
62
+ ```bash
63
+ critique --image # renders to /tmp as WebP
64
+ critique main...HEAD --image # branch diff as images
65
+ ```
66
+
67
+ ## Selective hunk staging
68
+
69
+ When multiple agents work on the same repo, each agent should only commit its own changes. `critique hunks` lets you stage individual hunks instead of whole files — like a scriptable `git add -p`.
70
+
71
+ ```bash
72
+ # List hunks with stable IDs
73
+ critique hunks list
74
+ critique hunks list --filter "src/**/*.ts"
75
+
76
+ # Stage specific hunks by ID
77
+ critique hunks add 'src/main.ts:@-10,6+10,7'
78
+ critique hunks add 'src/main.ts:@-10,6+10,7' 'src/utils.ts:@-5,3+5,4'
79
+ ```
80
+
81
+ Hunk ID format: `file:@-oldStart,oldLines+newStart,newLines` — derived from the `@@` diff header, stable across runs.
82
+
83
+ **Typical workflow:**
84
+
85
+ ```bash
86
+ critique hunks list # see all unstaged hunks
87
+ critique hunks add 'file:@-10,6+10,7' # stage only your hunks
88
+ git commit -m "your changes" # commit separately
89
+ ```
90
+
91
+ ## Raw patch access
92
+
93
+ Every `--web` upload also stores the raw unified diff. Append `.patch` to any critique URL to get it:
94
+
95
+ ```bash
96
+ # View the raw patch
97
+ curl https://critique.work/v/<id>.patch
98
+
99
+ # Apply the patch to current repo
100
+ curl -s https://critique.work/v/<id>.patch | git apply
101
+
102
+ # Reverse the patch (undo the changes)
103
+ curl -s https://critique.work/v/<id>.patch | git apply --reverse
104
+ ```
105
+
106
+ Useful when an agent shares a critique URL and you want to programmatically apply or revert those changes.
107
+
108
+ ## Notes
109
+
110
+ - Requires **Bun** — use `bunx critique` or global `critique`
111
+ - Lock files and diffs >6000 lines are auto-hidden
112
+ - `--web` URLs expire after 7 days (content-hashed, same diff = same URL)
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: egaki
3
+ description: >
4
+ AI image and video generation CLI. Use this skill to install egaki, configure
5
+ auth, run help commands, and generate images or videos with provider keys or
6
+ an Egaki subscription.
7
+ ---
8
+
9
+ # egaki
10
+
11
+ Generate AI images and videos from the terminal.
12
+ Use this for text-to-image, image editing, mask-based edits, text-to-video,
13
+ image-to-video, and model discovery.
14
+
15
+ ## Install
16
+
17
+ ```bash
18
+ pnpm add -g egaki
19
+ ```
20
+
21
+ ## Always check help first
22
+
23
+ Run the full help output before using commands:
24
+
25
+ ```bash
26
+ egaki --help
27
+ ```
28
+
29
+ Do not truncate help output with `head`.
30
+
31
+ For subcommand details: `egaki <command> --help` (e.g. `egaki image --help`, `egaki video --help`, `egaki login --help`)
32
+
33
+ ## Auth options
34
+
35
+ You can authenticate in two ways:
36
+
37
+ 1. Egaki subscription key (recommended — all models, one key)
38
+ 2. Provider API keys (Google, OpenAI, Fal, Replicate) via `egaki login`
39
+
40
+ If using Egaki subscription, set it up first with `egaki subscribe`, then store
41
+ the key with `egaki login --provider egaki --key egaki_...`.
42
+
43
+ ## Login behavior for remote agents
44
+
45
+ When login requires a URL flow, run login in the background and send the login URL
46
+ to the user so they can complete auth interactively.
47
+
48
+ ## Example commands
49
+
50
+ ```bash
51
+ # configure key interactively
52
+ egaki login
53
+
54
+ # show login status
55
+ egaki login --show
56
+
57
+ # subscribe to Egaki for all supported models
58
+ egaki subscribe
59
+
60
+ # check subscription usage
61
+ egaki usage
62
+
63
+ # generate an image
64
+ egaki image "a watercolor fox reading a map" -o fox.png
65
+
66
+ # select a model explicitly
67
+ egaki image "isometric floating city, soft colors" -m imagen-4.0-generate-001 -o city.png
68
+
69
+ # edit an existing image (local file or URL)
70
+ egaki image "add a red scarf and make it winter" --input portrait.jpg -o portrait-winter.png
71
+ egaki image "turn this into a manga panel" --input https://example.com/photo.jpg -o manga.png
72
+
73
+ # inpainting with a mask
74
+ egaki image "replace the sky with a dramatic sunset" --input scene.png --mask mask.png -o scene-sunset.png
75
+
76
+ # generate a video — use a 5 minute timeout, video generation is slow
77
+ egaki video "a paper boat drifting on a calm lake at sunrise" -o boat.mp4
78
+
79
+ # generate a video with a specific model
80
+ egaki video "timelapse of a stormy sea, cinematic" -m google/veo-3.1-fast-generate-001 --duration 6 -o storm.mp4
81
+
82
+ # cheap video model
83
+ egaki video "a cat walking on a rooftop at night" -m klingai/kling-v2.5-turbo-t2v --duration 5 -o cat.mp4
84
+
85
+ # image-to-video (model must support i2v)
86
+ egaki video "slowly animate the clouds" --input photo.jpg -m klingai/kling-v2.6-i2v -o animated.mp4
87
+
88
+ # discover all models (image + video)
89
+ egaki models
90
+
91
+ # filter by type
92
+ egaki models --type video
93
+ egaki models --type image
94
+ ```
95
+
96
+ ## Video generation note for agents
97
+
98
+ Video generation can be very slow — some models take 1–3 minutes per request.
99
+ Always use a command timeout of **at least 5 minutes** when invoking `egaki video`
100
+ from automation or agent workflows.