kimaki 0.31.0 → 1.1.0

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 (1001) hide show
  1. package/dist/agent-ui.d.ts +33 -0
  2. package/dist/agent-ui.e2e.test.d.ts +1 -0
  3. package/dist/agent-ui.e2e.test.js +140 -0
  4. package/dist/agent-ui.e2e.test.js.map +1 -0
  5. package/dist/agent-ui.js +199 -0
  6. package/dist/agent-ui.js.map +1 -0
  7. package/dist/analytics.d.ts +42 -0
  8. package/dist/analytics.e2e.test.d.ts +1 -0
  9. package/dist/analytics.e2e.test.js +112 -0
  10. package/dist/analytics.e2e.test.js.map +1 -0
  11. package/dist/analytics.js +162 -223
  12. package/dist/analytics.js.map +1 -0
  13. package/dist/analytics.test.d.ts +1 -0
  14. package/dist/analytics.test.js +121 -157
  15. package/dist/analytics.test.js.map +1 -0
  16. package/dist/autostart.d.ts +7 -0
  17. package/dist/autostart.js +87 -0
  18. package/dist/autostart.js.map +1 -0
  19. package/dist/bot.d.ts +91 -0
  20. package/dist/bot.js +120 -0
  21. package/dist/bot.js.map +1 -0
  22. package/dist/btw.e2e.test.d.ts +1 -0
  23. package/dist/btw.e2e.test.js +102 -0
  24. package/dist/btw.e2e.test.js.map +1 -0
  25. package/dist/builtin-skills.d.ts +18 -0
  26. package/dist/builtin-skills.js +51 -0
  27. package/dist/builtin-skills.js.map +1 -0
  28. package/dist/builtin-skills.test.d.ts +1 -0
  29. package/dist/builtin-skills.test.js +28 -0
  30. package/dist/builtin-skills.test.js.map +1 -0
  31. package/dist/catalog-refresh.e2e.test.d.ts +1 -0
  32. package/dist/catalog-refresh.e2e.test.js +90 -0
  33. package/dist/catalog-refresh.e2e.test.js.map +1 -0
  34. package/dist/cli/bot.d.ts +5 -0
  35. package/dist/cli/bot.js +434 -0
  36. package/dist/cli/bot.js.map +1 -0
  37. package/dist/cli/discord.d.ts +3 -0
  38. package/dist/cli/discord.js +118 -0
  39. package/dist/cli/discord.js.map +1 -0
  40. package/dist/cli/project.d.ts +5 -0
  41. package/dist/cli/project.js +143 -0
  42. package/dist/cli/project.js.map +1 -0
  43. package/dist/cli/schedule.d.ts +3 -0
  44. package/dist/cli/schedule.js +156 -0
  45. package/dist/cli/schedule.js.map +1 -0
  46. package/dist/cli/session.d.ts +4 -0
  47. package/dist/cli/session.js +245 -0
  48. package/dist/cli/session.js.map +1 -0
  49. package/dist/cli/shared.d.ts +55 -0
  50. package/dist/cli/shared.js +138 -0
  51. package/dist/cli/shared.js.map +1 -0
  52. package/dist/cli-discord.e2e.test.d.ts +1 -0
  53. package/dist/cli-discord.e2e.test.js +82 -0
  54. package/dist/cli-discord.e2e.test.js.map +1 -0
  55. package/dist/cli-lock.e2e.test.d.ts +1 -0
  56. package/dist/cli-lock.e2e.test.js +520 -0
  57. package/dist/cli-lock.e2e.test.js.map +1 -0
  58. package/dist/cli-read.e2e.test.d.ts +1 -0
  59. package/dist/cli-read.e2e.test.js +86 -0
  60. package/dist/cli-read.e2e.test.js.map +1 -0
  61. package/dist/cli-sessions.e2e.test.d.ts +1 -0
  62. package/dist/cli-sessions.e2e.test.js +116 -0
  63. package/dist/cli-sessions.e2e.test.js.map +1 -0
  64. package/dist/cli.d.ts +2 -0
  65. package/dist/cli.js +34 -263
  66. package/dist/cli.js.map +1 -0
  67. package/dist/commands/login-commands.d.ts +59 -0
  68. package/dist/commands/login-commands.js +341 -0
  69. package/dist/commands/login-commands.js.map +1 -0
  70. package/dist/commands/preference-commands.d.ts +44 -0
  71. package/dist/commands/preference-commands.js +565 -0
  72. package/dist/commands/preference-commands.js.map +1 -0
  73. package/dist/commands/session-commands.d.ts +8 -0
  74. package/dist/commands/session-commands.js +267 -0
  75. package/dist/commands/session-commands.js.map +1 -0
  76. package/dist/commands/thread-commands.d.ts +16 -0
  77. package/dist/commands/thread-commands.js +285 -0
  78. package/dist/commands/thread-commands.js.map +1 -0
  79. package/dist/commands/worktree-commands.d.ts +41 -0
  80. package/dist/commands/worktree-commands.js +279 -0
  81. package/dist/commands/worktree-commands.js.map +1 -0
  82. package/dist/commands.e2e.test.d.ts +1 -0
  83. package/dist/commands.e2e.test.js +255 -0
  84. package/dist/commands.e2e.test.js.map +1 -0
  85. package/dist/credentials.d.ts +84 -0
  86. package/dist/credentials.js +320 -0
  87. package/dist/credentials.js.map +1 -0
  88. package/dist/db.d.ts +1532 -0
  89. package/dist/db.js +57 -245
  90. package/dist/db.js.map +1 -0
  91. package/dist/db.test.d.ts +1 -0
  92. package/dist/db.test.js +351 -682
  93. package/dist/db.test.js.map +1 -0
  94. package/dist/duration.d.ts +2 -0
  95. package/dist/duration.js +18 -0
  96. package/dist/duration.js.map +1 -0
  97. package/dist/effects.d.ts +15 -0
  98. package/dist/effects.js +315 -0
  99. package/dist/effects.js.map +1 -0
  100. package/dist/errors.d.ts +38 -0
  101. package/dist/errors.js +40 -175
  102. package/dist/errors.js.map +1 -0
  103. package/dist/event-loop.d.ts +41 -0
  104. package/dist/event-loop.js +418 -0
  105. package/dist/event-loop.js.map +1 -0
  106. package/dist/file-edit-log.d.ts +41 -0
  107. package/dist/file-edit-log.js +122 -164
  108. package/dist/file-edit-log.js.map +1 -0
  109. package/dist/file-edit-log.test.d.ts +1 -0
  110. package/dist/file-edit-log.test.js +68 -244
  111. package/dist/file-edit-log.test.js.map +1 -0
  112. package/dist/format-parts.d.ts +137 -0
  113. package/dist/format-parts.js +300 -0
  114. package/dist/format-parts.js.map +1 -0
  115. package/dist/format-parts.test.d.ts +1 -0
  116. package/dist/format-parts.test.js +144 -0
  117. package/dist/format-parts.test.js.map +1 -0
  118. package/dist/gateway-replay.e2e.test.d.ts +1 -0
  119. package/dist/gateway-replay.e2e.test.js +95 -0
  120. package/dist/gateway-replay.e2e.test.js.map +1 -0
  121. package/dist/harness.e2e.test.d.ts +1 -0
  122. package/dist/harness.e2e.test.js +107 -0
  123. package/dist/harness.e2e.test.js.map +1 -0
  124. package/dist/hello-thread.e2e.test.d.ts +1 -0
  125. package/dist/hello-thread.e2e.test.js +194 -0
  126. package/dist/hello-thread.e2e.test.js.map +1 -0
  127. package/dist/ingress.d.ts +7 -0
  128. package/dist/ingress.js +337 -0
  129. package/dist/ingress.js.map +1 -0
  130. package/dist/interaction-context.d.ts +45 -0
  131. package/dist/interaction-context.js +77 -0
  132. package/dist/interaction-context.js.map +1 -0
  133. package/dist/interrupt.e2e.test.d.ts +1 -0
  134. package/dist/interrupt.e2e.test.js +124 -0
  135. package/dist/interrupt.e2e.test.js.map +1 -0
  136. package/dist/legacy.e2e.test.d.ts +1 -0
  137. package/dist/legacy.e2e.test.js +85 -0
  138. package/dist/legacy.e2e.test.js.map +1 -0
  139. package/dist/live-call.d.ts +51 -0
  140. package/dist/live-call.js +207 -0
  141. package/dist/live-call.js.map +1 -0
  142. package/dist/lock-routes.d.ts +812 -0
  143. package/dist/lock-routes.js +635 -0
  144. package/dist/lock-routes.js.map +1 -0
  145. package/dist/lock-server.d.ts +36 -0
  146. package/dist/lock-server.js +223 -0
  147. package/dist/lock-server.js.map +1 -0
  148. package/dist/logger.d.ts +13 -0
  149. package/dist/logger.js +112 -162
  150. package/dist/logger.js.map +1 -0
  151. package/dist/login.e2e.test.d.ts +1 -0
  152. package/dist/login.e2e.test.js +83 -0
  153. package/dist/login.e2e.test.js.map +1 -0
  154. package/dist/main.d.ts +33 -0
  155. package/dist/main.js +261 -0
  156. package/dist/main.js.map +1 -0
  157. package/dist/markdown/components.d.ts +10 -0
  158. package/dist/markdown/components.js +77 -0
  159. package/dist/markdown/components.js.map +1 -0
  160. package/dist/markdown/markdown.test.d.ts +1 -0
  161. package/dist/markdown/markdown.test.js +393 -0
  162. package/dist/markdown/markdown.test.js.map +1 -0
  163. package/dist/markdown/render-markdown.d.ts +30 -0
  164. package/dist/markdown/render-markdown.js +265 -0
  165. package/dist/markdown/render-markdown.js.map +1 -0
  166. package/dist/message-tool.e2e.test.d.ts +1 -0
  167. package/dist/message-tool.e2e.test.js +39 -0
  168. package/dist/message-tool.e2e.test.js.map +1 -0
  169. package/dist/migrations.d.ts +8 -0
  170. package/dist/migrations.js +187 -0
  171. package/dist/migrations.js.map +1 -0
  172. package/dist/onboarding-cli.e2e.test.d.ts +1 -0
  173. package/dist/onboarding-cli.e2e.test.js +178 -0
  174. package/dist/onboarding-cli.e2e.test.js.map +1 -0
  175. package/dist/onboarding.d.ts +36 -0
  176. package/dist/onboarding.e2e.test.d.ts +1 -0
  177. package/dist/onboarding.e2e.test.js +148 -0
  178. package/dist/onboarding.e2e.test.js.map +1 -0
  179. package/dist/onboarding.js +261 -0
  180. package/dist/onboarding.js.map +1 -0
  181. package/dist/opencode-server.d.ts +54 -0
  182. package/dist/opencode-server.js +417 -0
  183. package/dist/opencode-server.js.map +1 -0
  184. package/dist/opencode-server.test.d.ts +1 -0
  185. package/dist/opencode-server.test.js +21 -0
  186. package/dist/opencode-server.test.js.map +1 -0
  187. package/dist/permissions.d.ts +31 -0
  188. package/dist/permissions.e2e.test.d.ts +1 -0
  189. package/dist/permissions.e2e.test.js +166 -0
  190. package/dist/permissions.e2e.test.js.map +1 -0
  191. package/dist/permissions.js +95 -0
  192. package/dist/permissions.js.map +1 -0
  193. package/dist/plugin/anthropic/index.d.ts +13 -0
  194. package/dist/plugin/anthropic/index.js +201 -0
  195. package/dist/plugin/anthropic/index.js.map +1 -0
  196. package/dist/plugin/anthropic/index.test.d.ts +1 -0
  197. package/dist/plugin/anthropic/index.test.js +39 -0
  198. package/dist/plugin/anthropic/index.test.js.map +1 -0
  199. package/dist/plugin/index.d.ts +3 -0
  200. package/dist/plugin/index.js +124 -0
  201. package/dist/plugin/index.js.map +1 -0
  202. package/dist/plugin/read-media.d.ts +23 -0
  203. package/dist/plugin/read-media.js +72 -0
  204. package/dist/plugin/read-media.js.map +1 -0
  205. package/dist/plugin/session-id/index.d.ts +3 -0
  206. package/dist/plugin/session-id/index.js +18 -0
  207. package/dist/plugin/session-id/index.js.map +1 -0
  208. package/dist/plugin.e2e.test.d.ts +1 -0
  209. package/dist/plugin.e2e.test.js +92 -0
  210. package/dist/plugin.e2e.test.js.map +1 -0
  211. package/dist/preference-commands.e2e.test.d.ts +1 -0
  212. package/dist/preference-commands.e2e.test.js +555 -0
  213. package/dist/preference-commands.e2e.test.js.map +1 -0
  214. package/dist/probe-live.tmp.d.ts +1 -0
  215. package/dist/probe-live.tmp.js +82 -0
  216. package/dist/probe-live.tmp.js.map +1 -0
  217. package/dist/project.d.ts +58 -0
  218. package/dist/project.js +169 -0
  219. package/dist/project.js.map +1 -0
  220. package/dist/prompt.d.ts +112 -0
  221. package/dist/prompt.js +577 -0
  222. package/dist/prompt.js.map +1 -0
  223. package/dist/questions.d.ts +59 -0
  224. package/dist/questions.e2e.test.d.ts +1 -0
  225. package/dist/questions.e2e.test.js +290 -0
  226. package/dist/questions.e2e.test.js.map +1 -0
  227. package/dist/questions.js +231 -0
  228. package/dist/questions.js.map +1 -0
  229. package/dist/queue.d.ts +45 -0
  230. package/dist/queue.e2e.test.d.ts +1 -0
  231. package/dist/queue.e2e.test.js +220 -0
  232. package/dist/queue.e2e.test.js.map +1 -0
  233. package/dist/queue.js +132 -0
  234. package/dist/queue.js.map +1 -0
  235. package/dist/remote-send.d.ts +32 -0
  236. package/dist/remote-send.e2e.test.d.ts +1 -0
  237. package/dist/remote-send.e2e.test.js +89 -0
  238. package/dist/remote-send.e2e.test.js.map +1 -0
  239. package/dist/remote-send.js +105 -0
  240. package/dist/remote-send.js.map +1 -0
  241. package/dist/renderer.e2e.test.d.ts +1 -0
  242. package/dist/renderer.e2e.test.js +357 -0
  243. package/dist/renderer.e2e.test.js.map +1 -0
  244. package/dist/restart.e2e.test.d.ts +1 -0
  245. package/dist/restart.e2e.test.js +68 -0
  246. package/dist/restart.e2e.test.js.map +1 -0
  247. package/dist/routes.d.ts +24 -0
  248. package/dist/routes.js +42 -0
  249. package/dist/routes.js.map +1 -0
  250. package/dist/routes.test.d.ts +1 -0
  251. package/dist/routes.test.js +79 -0
  252. package/dist/routes.test.js.map +1 -0
  253. package/dist/routines.e2e.test.d.ts +1 -0
  254. package/dist/routines.e2e.test.js +188 -0
  255. package/dist/routines.e2e.test.js.map +1 -0
  256. package/dist/scheduler.d.ts +116 -0
  257. package/dist/scheduler.e2e.test.d.ts +1 -0
  258. package/dist/scheduler.e2e.test.js +163 -0
  259. package/dist/scheduler.e2e.test.js.map +1 -0
  260. package/dist/scheduler.js +602 -0
  261. package/dist/scheduler.js.map +1 -0
  262. package/dist/scheduler.test.d.ts +1 -0
  263. package/dist/scheduler.test.js +180 -0
  264. package/dist/scheduler.test.js.map +1 -0
  265. package/dist/schema-sql.d.ts +1 -0
  266. package/dist/schema-sql.js +3 -0
  267. package/dist/schema-sql.js.map +1 -0
  268. package/dist/schema.d.ts +2968 -0
  269. package/dist/schema.js +95 -252
  270. package/dist/schema.js.map +1 -0
  271. package/dist/session-commands.e2e.test.d.ts +1 -0
  272. package/dist/session-commands.e2e.test.js +285 -0
  273. package/dist/session-commands.e2e.test.js.map +1 -0
  274. package/dist/session-events.d.ts +83 -0
  275. package/dist/session-events.js +260 -0
  276. package/dist/session-events.js.map +1 -0
  277. package/dist/session-ops.e2e.test.d.ts +1 -0
  278. package/dist/session-ops.e2e.test.js +114 -0
  279. package/dist/session-ops.e2e.test.js.map +1 -0
  280. package/dist/sessions.d.ts +121 -0
  281. package/dist/sessions.js +663 -0
  282. package/dist/sessions.js.map +1 -0
  283. package/dist/shell.e2e.test.d.ts +1 -0
  284. package/dist/shell.e2e.test.js +147 -0
  285. package/dist/shell.e2e.test.js.map +1 -0
  286. package/dist/slash-commands.d.ts +62 -0
  287. package/dist/slash-commands.js +476 -0
  288. package/dist/slash-commands.js.map +1 -0
  289. package/dist/slash-commands.test.d.ts +1 -0
  290. package/dist/slash-commands.test.js +87 -0
  291. package/dist/slash-commands.test.js.map +1 -0
  292. package/dist/sleep.e2e.test.d.ts +1 -0
  293. package/dist/sleep.e2e.test.js +115 -487
  294. package/dist/sleep.e2e.test.js.map +1 -0
  295. package/dist/sleeps.d.ts +37 -0
  296. package/dist/sleeps.js +220 -0
  297. package/dist/sleeps.js.map +1 -0
  298. package/dist/store.d.ts +10 -0
  299. package/dist/store.js +8 -28
  300. package/dist/store.js.map +1 -0
  301. package/dist/system-prompt.d.ts +76 -0
  302. package/dist/system-prompt.js +852 -0
  303. package/dist/system-prompt.js.map +1 -0
  304. package/dist/tasks.e2e.test.d.ts +1 -0
  305. package/dist/tasks.e2e.test.js +173 -0
  306. package/dist/tasks.e2e.test.js.map +1 -0
  307. package/dist/test/auth-plugin/index.d.ts +3 -0
  308. package/dist/test/auth-plugin/index.js +18 -0
  309. package/dist/test/auth-plugin/index.js.map +1 -0
  310. package/dist/test/fake-mcp-server.d.ts +1 -0
  311. package/dist/test/fake-mcp-server.js +45 -0
  312. package/dist/test/fake-mcp-server.js.map +1 -0
  313. package/dist/test/harness.d.ts +246 -0
  314. package/dist/test/harness.js +704 -0
  315. package/dist/test/harness.js.map +1 -0
  316. package/dist/test/replay.d.ts +14 -0
  317. package/dist/test/replay.js +75 -0
  318. package/dist/test/replay.js.map +1 -0
  319. package/dist/thread-reducer.d.ts +172 -0
  320. package/dist/thread-reducer.fixtures.test.d.ts +1 -0
  321. package/dist/thread-reducer.fixtures.test.js +360 -0
  322. package/dist/thread-reducer.fixtures.test.js.map +1 -0
  323. package/dist/thread-reducer.js +497 -0
  324. package/dist/thread-reducer.js.map +1 -0
  325. package/dist/thread-reducer.test.d.ts +1 -0
  326. package/dist/thread-reducer.test.js +369 -0
  327. package/dist/thread-reducer.test.js.map +1 -0
  328. package/dist/tts.test.d.ts +1 -0
  329. package/dist/tts.test.js +147 -0
  330. package/dist/tts.test.js.map +1 -0
  331. package/dist/voice-agent.d.ts +33 -0
  332. package/dist/voice-agent.js +159 -0
  333. package/dist/voice-agent.js.map +1 -0
  334. package/dist/voice-attachments.e2e.test.d.ts +1 -0
  335. package/dist/voice-attachments.e2e.test.js +256 -0
  336. package/dist/voice-attachments.e2e.test.js.map +1 -0
  337. package/dist/voice-call.d.ts +59 -0
  338. package/dist/voice-call.e2e.test.d.ts +1 -0
  339. package/dist/voice-call.e2e.test.js +259 -0
  340. package/dist/voice-call.e2e.test.js.map +1 -0
  341. package/dist/voice-call.js +760 -0
  342. package/dist/voice-call.js.map +1 -0
  343. package/dist/voice-openai.e2e.test.d.ts +1 -0
  344. package/dist/voice-openai.e2e.test.js +161 -0
  345. package/dist/voice-openai.e2e.test.js.map +1 -0
  346. package/dist/voice.d.ts +116 -0
  347. package/dist/voice.js +619 -717
  348. package/dist/voice.js.map +1 -0
  349. package/dist/working-directory.e2e.test.d.ts +1 -0
  350. package/dist/working-directory.e2e.test.js +231 -0
  351. package/dist/working-directory.e2e.test.js.map +1 -0
  352. package/dist/worktrees.d.ts +54 -0
  353. package/dist/worktrees.js +247 -709
  354. package/dist/worktrees.js.map +1 -0
  355. package/dist/worktrees.test.d.ts +1 -0
  356. package/dist/worktrees.test.js +97 -952
  357. package/dist/worktrees.test.js.map +1 -0
  358. package/package.json +38 -73
  359. package/skills/kimaki-debug/SKILL.md +44 -0
  360. package/skills/kimaki-tunnel/SKILL.md +34 -0
  361. package/src/agent-ui.e2e.test.ts +134 -0
  362. package/src/agent-ui.ts +216 -0
  363. package/src/analytics.e2e.test.ts +138 -0
  364. package/src/analytics.test.ts +122 -182
  365. package/src/analytics.ts +206 -258
  366. package/src/autostart.ts +90 -0
  367. package/src/bot.ts +196 -0
  368. package/src/btw.e2e.test.ts +130 -0
  369. package/src/builtin-skills.test.ts +29 -0
  370. package/src/builtin-skills.ts +59 -0
  371. package/src/catalog-refresh.e2e.test.ts +112 -0
  372. package/src/cli/bot.ts +425 -0
  373. package/src/cli/discord.ts +116 -0
  374. package/src/cli/project.ts +147 -0
  375. package/src/cli/schedule.ts +151 -0
  376. package/src/cli/session.ts +252 -0
  377. package/src/cli/shared.ts +139 -0
  378. package/src/cli-discord.e2e.test.ts +79 -0
  379. package/src/cli-lock.e2e.test.ts +530 -0
  380. package/src/cli-read.e2e.test.ts +83 -0
  381. package/src/cli-sessions.e2e.test.ts +120 -0
  382. package/src/cli.ts +35 -418
  383. package/src/commands/login-commands.ts +360 -0
  384. package/src/commands/preference-commands.ts +599 -0
  385. package/src/commands/session-commands.ts +289 -0
  386. package/src/commands/thread-commands.ts +324 -0
  387. package/src/commands/worktree-commands.ts +288 -0
  388. package/src/commands.e2e.test.ts +290 -0
  389. package/src/credentials.ts +425 -0
  390. package/src/db.test.ts +344 -759
  391. package/src/db.ts +66 -284
  392. package/src/duration.ts +18 -0
  393. package/src/effects.ts +337 -0
  394. package/src/errors.ts +39 -228
  395. package/src/event-loop.ts +471 -0
  396. package/src/file-edit-log.test.ts +68 -272
  397. package/src/file-edit-log.ts +108 -231
  398. package/src/fixtures/v1-schema.sql +241 -0
  399. package/src/fixtures/voice.ogg +0 -0
  400. package/src/format-parts.test.ts +150 -0
  401. package/src/format-parts.ts +405 -0
  402. package/src/gateway-replay.e2e.test.ts +116 -0
  403. package/src/harness.e2e.test.ts +124 -0
  404. package/src/hello-thread.e2e.test.ts +223 -0
  405. package/src/ingress.ts +334 -0
  406. package/src/interaction-context.ts +131 -0
  407. package/src/interrupt.e2e.test.ts +151 -0
  408. package/src/legacy.e2e.test.ts +105 -0
  409. package/src/live-call.ts +249 -0
  410. package/src/lock-routes.ts +625 -0
  411. package/src/lock-server.ts +233 -0
  412. package/src/logger.ts +120 -207
  413. package/src/login.e2e.test.ts +86 -0
  414. package/src/main.ts +238 -0
  415. package/src/markdown/components.ts +102 -0
  416. package/src/markdown/markdown.test.ts +414 -0
  417. package/src/markdown/render-markdown.ts +288 -0
  418. package/src/migrations.ts +198 -0
  419. package/src/onboarding-cli.e2e.test.ts +215 -0
  420. package/src/onboarding.e2e.test.ts +171 -0
  421. package/src/onboarding.ts +297 -0
  422. package/src/opencode-server.test.ts +24 -0
  423. package/src/opencode-server.ts +464 -0
  424. package/src/permissions.e2e.test.ts +191 -0
  425. package/src/permissions.ts +121 -0
  426. package/src/plugin/anthropic/index.test.ts +39 -0
  427. package/src/plugin/anthropic/index.ts +213 -0
  428. package/src/plugin/index.ts +112 -0
  429. package/src/plugin.e2e.test.ts +117 -0
  430. package/src/preference-commands.e2e.test.ts +597 -0
  431. package/src/project.ts +216 -0
  432. package/src/prompt.ts +664 -0
  433. package/src/questions.e2e.test.ts +328 -0
  434. package/src/questions.ts +322 -0
  435. package/src/queue.e2e.test.ts +253 -0
  436. package/src/queue.ts +158 -0
  437. package/src/remote-send.e2e.test.ts +91 -0
  438. package/src/remote-send.ts +110 -0
  439. package/src/renderer.e2e.test.ts +390 -0
  440. package/src/restart.e2e.test.ts +90 -0
  441. package/src/routes.test.ts +81 -0
  442. package/src/routes.ts +48 -0
  443. package/src/routines.e2e.test.ts +210 -0
  444. package/src/scheduler.e2e.test.ts +182 -0
  445. package/src/scheduler.test.ts +183 -0
  446. package/src/scheduler.ts +648 -0
  447. package/src/schema-sql.ts +3 -0
  448. package/src/schema.ts +95 -271
  449. package/src/session-commands.e2e.test.ts +326 -0
  450. package/src/session-events.ts +301 -0
  451. package/src/session-ops.e2e.test.ts +141 -0
  452. package/src/sessions.ts +804 -0
  453. package/src/shell.e2e.test.ts +173 -0
  454. package/src/slash-commands.test.ts +89 -0
  455. package/src/slash-commands.ts +540 -0
  456. package/src/sleep.e2e.test.ts +135 -552
  457. package/src/sleeps.ts +230 -0
  458. package/src/store.ts +19 -217
  459. package/src/system-prompt.ts +923 -0
  460. package/src/test/auth-plugin/index.ts +17 -0
  461. package/src/test/fake-mcp-server.ts +49 -0
  462. package/src/test/harness.ts +957 -0
  463. package/src/test/replay.ts +90 -0
  464. package/src/thread-reducer.fixtures.test.ts +374 -0
  465. package/src/thread-reducer.test.ts +380 -0
  466. package/src/thread-reducer.ts +671 -0
  467. package/src/tts.test.ts +150 -0
  468. package/src/voice-agent.ts +196 -0
  469. package/src/voice-attachments.e2e.test.ts +301 -0
  470. package/src/voice-call.e2e.test.ts +293 -0
  471. package/src/voice-call.ts +764 -0
  472. package/src/voice-openai.e2e.test.ts +191 -0
  473. package/src/voice.ts +668 -988
  474. package/src/working-directory.e2e.test.ts +226 -0
  475. package/src/worktrees.test.ts +89 -1115
  476. package/src/worktrees.ts +195 -957
  477. package/bin.js +0 -2
  478. package/dist/agent-model.e2e.test.js +0 -1223
  479. package/dist/ai-tool-to-genai.js +0 -233
  480. package/dist/ai-tool-to-genai.test.js +0 -267
  481. package/dist/ai-tool.js +0 -6
  482. package/dist/anthropic-account-identity.js +0 -70
  483. package/dist/anthropic-account-identity.test.js +0 -38
  484. package/dist/anthropic-auth-plugin.js +0 -958
  485. package/dist/anthropic-auth-plugin.test.js +0 -115
  486. package/dist/anthropic-auth-state.js +0 -186
  487. package/dist/anthropic-auth-state.test.js +0 -203
  488. package/dist/bash-tool-schema-plugin.js +0 -50
  489. package/dist/bash-tool-schema-plugin.test.js +0 -68
  490. package/dist/bin.js +0 -151
  491. package/dist/bot-lifecycle.test.js +0 -206
  492. package/dist/btw-prefix-detection.js +0 -24
  493. package/dist/btw-prefix-detection.test.js +0 -130
  494. package/dist/cache-drift-plugin.js +0 -183
  495. package/dist/cache-rewrite.js +0 -39
  496. package/dist/cache-rewrite.test.js +0 -41
  497. package/dist/channel-management.js +0 -347
  498. package/dist/cli-commands/bot.js +0 -254
  499. package/dist/cli-commands/maintenance.js +0 -171
  500. package/dist/cli-commands/misc.js +0 -153
  501. package/dist/cli-commands/project.js +0 -510
  502. package/dist/cli-commands/send.js +0 -659
  503. package/dist/cli-commands/session.js +0 -889
  504. package/dist/cli-commands/task.js +0 -277
  505. package/dist/cli-commands/thread.js +0 -63
  506. package/dist/cli-commands/user.js +0 -145
  507. package/dist/cli-parsing.test.js +0 -226
  508. package/dist/cli-runner.js +0 -1591
  509. package/dist/cli-runner.test.js +0 -119
  510. package/dist/cli-send-thread.e2e.test.js +0 -470
  511. package/dist/cloudflare-transcription.js +0 -56
  512. package/dist/commands/abort.js +0 -84
  513. package/dist/commands/action-buttons.js +0 -248
  514. package/dist/commands/add-project.js +0 -111
  515. package/dist/commands/agent.js +0 -658
  516. package/dist/commands/ask-question.js +0 -371
  517. package/dist/commands/ask-question.test.js +0 -150
  518. package/dist/commands/btw.js +0 -275
  519. package/dist/commands/compact.js +0 -117
  520. package/dist/commands/context-usage.js +0 -194
  521. package/dist/commands/context-usage.test.js +0 -49
  522. package/dist/commands/create-new-project.js +0 -138
  523. package/dist/commands/diff.js +0 -63
  524. package/dist/commands/file-upload.js +0 -280
  525. package/dist/commands/fork-subagent.js +0 -175
  526. package/dist/commands/fork.js +0 -291
  527. package/dist/commands/gemini-apikey.js +0 -123
  528. package/dist/commands/last-sessions.js +0 -129
  529. package/dist/commands/login.js +0 -893
  530. package/dist/commands/mcp.js +0 -239
  531. package/dist/commands/memory-snapshot.js +0 -24
  532. package/dist/commands/mention-mode.js +0 -42
  533. package/dist/commands/merge-worktree.js +0 -205
  534. package/dist/commands/model-variant.js +0 -390
  535. package/dist/commands/model.js +0 -1012
  536. package/dist/commands/multioauth.js +0 -425
  537. package/dist/commands/new-worktree.js +0 -625
  538. package/dist/commands/paginated-select.js +0 -57
  539. package/dist/commands/permissions.js +0 -327
  540. package/dist/commands/queue.js +0 -347
  541. package/dist/commands/queue.test.js +0 -15
  542. package/dist/commands/remove-project.js +0 -111
  543. package/dist/commands/restart-opencode-server.js +0 -133
  544. package/dist/commands/resume.js +0 -148
  545. package/dist/commands/run-command.js +0 -79
  546. package/dist/commands/screenshare.js +0 -307
  547. package/dist/commands/screenshare.test.js +0 -20
  548. package/dist/commands/session-id.js +0 -78
  549. package/dist/commands/session.js +0 -248
  550. package/dist/commands/share.js +0 -80
  551. package/dist/commands/tasks.js +0 -296
  552. package/dist/commands/types.js +0 -2
  553. package/dist/commands/undo-redo.js +0 -313
  554. package/dist/commands/unset-model.js +0 -116
  555. package/dist/commands/upgrade.js +0 -41
  556. package/dist/commands/user-command.js +0 -196
  557. package/dist/commands/verbosity.js +0 -124
  558. package/dist/commands/vscode.js +0 -295
  559. package/dist/commands/worktrees.js +0 -548
  560. package/dist/condense-memory.js +0 -33
  561. package/dist/config.js +0 -126
  562. package/dist/context-awareness-plugin.js +0 -357
  563. package/dist/context-awareness-plugin.test.js +0 -126
  564. package/dist/cpu-profiler.js +0 -211
  565. package/dist/cpu-profiler.test.js +0 -160
  566. package/dist/critique-utils.js +0 -95
  567. package/dist/database.js +0 -1074
  568. package/dist/debounce-timeout.js +0 -28
  569. package/dist/debounced-process-flush.js +0 -77
  570. package/dist/default-channel-provisioning.test.js +0 -149
  571. package/dist/discord-bot.js +0 -1432
  572. package/dist/discord-command-registration.js +0 -519
  573. package/dist/discord-command-registration.test.js +0 -17
  574. package/dist/discord-urls.js +0 -81
  575. package/dist/discord-utils.js +0 -789
  576. package/dist/discord-utils.test.js +0 -400
  577. package/dist/escape-backticks.test.js +0 -429
  578. package/dist/event-stream-real-capture.e2e.test.js +0 -533
  579. package/dist/eventsource-parser.test.js +0 -327
  580. package/dist/exec-async.js +0 -38
  581. package/dist/external-directory-permissions.e2e.test.js +0 -86
  582. package/dist/external-directory-project-deny.e2e.test.js +0 -70
  583. package/dist/external-opencode-sync.js +0 -620
  584. package/dist/external-opencode-sync.test.js +0 -206
  585. package/dist/extract-sdk-error-message.test.js +0 -13
  586. package/dist/format-tables.js +0 -728
  587. package/dist/format-tables.test.js +0 -915
  588. package/dist/forum-sync/config.js +0 -79
  589. package/dist/forum-sync/discord-operations.js +0 -157
  590. package/dist/forum-sync/index.js +0 -5
  591. package/dist/forum-sync/markdown.js +0 -110
  592. package/dist/forum-sync/sync-to-discord.js +0 -417
  593. package/dist/forum-sync/sync-to-files.js +0 -190
  594. package/dist/forum-sync/types.js +0 -53
  595. package/dist/forum-sync/watchers.js +0 -322
  596. package/dist/gateway-proxy-reconnect.e2e.test.js +0 -414
  597. package/dist/gateway-proxy.e2e.test.js +0 -488
  598. package/dist/genai-worker-wrapper.js +0 -111
  599. package/dist/genai-worker.js +0 -309
  600. package/dist/genai.js +0 -232
  601. package/dist/git-worktree-core.js +0 -461
  602. package/dist/guild-categories.test.js +0 -225
  603. package/dist/heap-monitor.js +0 -122
  604. package/dist/hrana-server.js +0 -322
  605. package/dist/hrana-server.test.js +0 -99
  606. package/dist/html-actions.js +0 -123
  607. package/dist/html-actions.test.js +0 -70
  608. package/dist/html-components.js +0 -115
  609. package/dist/html-components.test.js +0 -34
  610. package/dist/image-optimizer-plugin.js +0 -153
  611. package/dist/image-utils.js +0 -112
  612. package/dist/interaction-handler.js +0 -578
  613. package/dist/ipc-polling.js +0 -245
  614. package/dist/ipc-tools-plugin.js +0 -251
  615. package/dist/kimaki-digital-twin.e2e.test.js +0 -161
  616. package/dist/kimaki-opencode-plugin-loading.e2e.test.js +0 -158
  617. package/dist/kimaki-opencode-plugin.js +0 -33
  618. package/dist/kimaki-opencode-plugin.test.js +0 -126
  619. package/dist/kimaki-workspace-adaptor.js +0 -118
  620. package/dist/limit-heading-depth.js +0 -25
  621. package/dist/limit-heading-depth.test.js +0 -105
  622. package/dist/list-channel-threads.js +0 -163
  623. package/dist/list-channel-threads.test.js +0 -80
  624. package/dist/markdown.js +0 -455
  625. package/dist/markdown.test.js +0 -411
  626. package/dist/memory-overview-plugin.js +0 -123
  627. package/dist/message-formatting.js +0 -788
  628. package/dist/message-formatting.test.js +0 -1132
  629. package/dist/message-preprocessing.js +0 -419
  630. package/dist/oauth-rotation-shared.js +0 -253
  631. package/dist/onboarding-tutorial.js +0 -163
  632. package/dist/onboarding-welcome.js +0 -37
  633. package/dist/openai-auth-plugin.js +0 -125
  634. package/dist/openai-auth-state.js +0 -237
  635. package/dist/openai-realtime.js +0 -224
  636. package/dist/opencode-command-detection.js +0 -65
  637. package/dist/opencode-command-detection.test.js +0 -240
  638. package/dist/opencode-command.js +0 -181
  639. package/dist/opencode-command.test.js +0 -218
  640. package/dist/opencode-interrupt-plugin.js +0 -253
  641. package/dist/opencode-interrupt-plugin.test.js +0 -293
  642. package/dist/opencode.js +0 -1217
  643. package/dist/parse-permission-rules.test.js +0 -117
  644. package/dist/patch-text-parser.js +0 -97
  645. package/dist/plugin-logger.js +0 -105
  646. package/dist/plugin-opencode-client.js +0 -54
  647. package/dist/privacy-sanitizer.js +0 -105
  648. package/dist/project-add.test.js +0 -62
  649. package/dist/question-abort-clears-dropdown.e2e.test.js +0 -89
  650. package/dist/question-abort-resume.e2e.test.js +0 -100
  651. package/dist/question-abort-retry-text-before-dropdown.e2e.test.js +0 -150
  652. package/dist/question-text-before-dropdown.e2e.test.js +0 -52
  653. package/dist/queue-advanced-abort.e2e.test.js +0 -348
  654. package/dist/queue-advanced-action-buttons.e2e.test.js +0 -209
  655. package/dist/queue-advanced-e2e-setup.js +0 -1043
  656. package/dist/queue-advanced-footer.e2e.test.js +0 -286
  657. package/dist/queue-advanced-model-switch.e2e.test.js +0 -297
  658. package/dist/queue-advanced-permissions-typing.e2e.test.js +0 -189
  659. package/dist/queue-advanced-question.e2e.test.js +0 -266
  660. package/dist/queue-advanced-typing-interrupt.e2e.test.js +0 -113
  661. package/dist/queue-advanced-typing.e2e.test.js +0 -151
  662. package/dist/queue-delete-message.e2e.test.js +0 -216
  663. package/dist/queue-drain-after-interactive-ui.e2e.test.js +0 -120
  664. package/dist/queue-interrupt-drain.e2e.test.js +0 -256
  665. package/dist/queue-question-select-drain.e2e.test.js +0 -162
  666. package/dist/runtime-idle-sweeper.js +0 -52
  667. package/dist/runtime-lifecycle.e2e.test.js +0 -570
  668. package/dist/sentry.js +0 -23
  669. package/dist/session-handler/agent-utils.js +0 -65
  670. package/dist/session-handler/event-stream-state.js +0 -1225
  671. package/dist/session-handler/event-stream-state.test.js +0 -3160
  672. package/dist/session-handler/global-event-listener.js +0 -212
  673. package/dist/session-handler/model-utils.js +0 -311
  674. package/dist/session-handler/model-utils.test.js +0 -445
  675. package/dist/session-handler/opencode-session-event-log.js +0 -121
  676. package/dist/session-handler/thread-ingress.test.js +0 -41
  677. package/dist/session-handler/thread-runtime-state.js +0 -209
  678. package/dist/session-handler/thread-session-runtime-summary.test.js +0 -121
  679. package/dist/session-handler/thread-session-runtime.js +0 -4320
  680. package/dist/session-handler.js +0 -9
  681. package/dist/session-search.js +0 -219
  682. package/dist/session-search.test.js +0 -287
  683. package/dist/session-sleep.test.js +0 -224
  684. package/dist/session-title-rename.test.js +0 -128
  685. package/dist/skill-filter.js +0 -43
  686. package/dist/skill-filter.test.js +0 -86
  687. package/dist/startup-service.js +0 -153
  688. package/dist/startup-time.e2e.test.js +0 -297
  689. package/dist/system-message.js +0 -806
  690. package/dist/system-message.test.js +0 -917
  691. package/dist/task-id-plugin.js +0 -16
  692. package/dist/task-runner.js +0 -554
  693. package/dist/task-schedule.js +0 -298
  694. package/dist/task-schedule.test.js +0 -366
  695. package/dist/test-utils.js +0 -385
  696. package/dist/thinking-utils.js +0 -45
  697. package/dist/thinking-utils.test.js +0 -35
  698. package/dist/thread-message-queue.e2e.test.js +0 -1227
  699. package/dist/tools.js +0 -357
  700. package/dist/undo-redo.e2e.test.js +0 -171
  701. package/dist/unnest-code-blocks.js +0 -146
  702. package/dist/unnest-code-blocks.test.js +0 -673
  703. package/dist/upgrade.js +0 -114
  704. package/dist/utils.js +0 -148
  705. package/dist/voice-attachment.js +0 -56
  706. package/dist/voice-handler.js +0 -727
  707. package/dist/voice-message.e2e.test.js +0 -1254
  708. package/dist/voice-routing-input.e2e.test.js +0 -195
  709. package/dist/voice-routing-question.e2e.test.js +0 -182
  710. package/dist/voice.test.js +0 -500
  711. package/dist/wait-session.js +0 -193
  712. package/dist/websockify.js +0 -69
  713. package/dist/worker-types.js +0 -4
  714. package/dist/worktree-clone-isolation.e2e.test.js +0 -188
  715. package/dist/worktree-lifecycle.e2e.test.js +0 -735
  716. package/dist/worktree-utils.js +0 -3
  717. package/dist/xai-auth-plugin.js +0 -238
  718. package/dist/xai-auth-state.js +0 -234
  719. package/dist/xai-auth-state.test.js +0 -183
  720. package/dist/xml.js +0 -92
  721. package/dist/xml.test.js +0 -32
  722. package/skills/bump-holocron-consumers/SKILL.md +0 -137
  723. package/skills/critique/SKILL.md +0 -116
  724. package/skills/egaki/SKILL.md +0 -86
  725. package/skills/errore/SKILL.md +0 -501
  726. package/skills/goke/SKILL.md +0 -695
  727. package/skills/holocron/SKILL.md +0 -942
  728. package/skills/lintcn/SKILL.md +0 -873
  729. package/skills/new-skill/SKILL.md +0 -339
  730. package/skills/npm-package/SKILL.md +0 -692
  731. package/skills/opensrc/SKILL.md +0 -102
  732. package/skills/playwriter/SKILL.md +0 -35
  733. package/skills/profano/SKILL.md +0 -33
  734. package/skills/readme.md +0 -20
  735. package/skills/sigillo/SKILL.md +0 -370
  736. package/skills/spiceflow/SKILL.md +0 -80
  737. package/skills/strada/SKILL.md +0 -104
  738. package/skills/termcast/SKILL.md +0 -133
  739. package/skills/tuistory/SKILL.md +0 -237
  740. package/skills/usecomputer/SKILL.md +0 -264
  741. package/skills/zele/SKILL.md +0 -81
  742. package/src/agent-model.e2e.test.ts +0 -1557
  743. package/src/ai-tool-to-genai.test.ts +0 -296
  744. package/src/ai-tool-to-genai.ts +0 -283
  745. package/src/ai-tool.ts +0 -39
  746. package/src/anthropic-account-identity.test.ts +0 -52
  747. package/src/anthropic-account-identity.ts +0 -96
  748. package/src/anthropic-auth-plugin.test.ts +0 -135
  749. package/src/anthropic-auth-plugin.ts +0 -1180
  750. package/src/anthropic-auth-state.test.ts +0 -259
  751. package/src/anthropic-auth-state.ts +0 -272
  752. package/src/bash-tool-schema-plugin.test.ts +0 -84
  753. package/src/bash-tool-schema-plugin.ts +0 -77
  754. package/src/bin.ts +0 -173
  755. package/src/bot-lifecycle.test.ts +0 -252
  756. package/src/btw-prefix-detection.test.ts +0 -142
  757. package/src/btw-prefix-detection.ts +0 -30
  758. package/src/cache-drift-plugin.ts +0 -249
  759. package/src/cache-rewrite.test.ts +0 -49
  760. package/src/cache-rewrite.ts +0 -96
  761. package/src/channel-management.ts +0 -494
  762. package/src/cli-commands/bot.ts +0 -374
  763. package/src/cli-commands/maintenance.ts +0 -237
  764. package/src/cli-commands/misc.ts +0 -208
  765. package/src/cli-commands/project.ts +0 -680
  766. package/src/cli-commands/send.ts +0 -885
  767. package/src/cli-commands/session.ts +0 -1181
  768. package/src/cli-commands/task.ts +0 -358
  769. package/src/cli-commands/thread.ts +0 -86
  770. package/src/cli-commands/user.ts +0 -195
  771. package/src/cli-parsing.test.ts +0 -305
  772. package/src/cli-runner.test.ts +0 -166
  773. package/src/cli-runner.ts +0 -2157
  774. package/src/cli-send-thread.e2e.test.ts +0 -609
  775. package/src/cloudflare-transcription.ts +0 -76
  776. package/src/commands/abort.ts +0 -113
  777. package/src/commands/action-buttons.ts +0 -371
  778. package/src/commands/add-project.ts +0 -146
  779. package/src/commands/agent.ts +0 -911
  780. package/src/commands/ask-question.test.ts +0 -177
  781. package/src/commands/ask-question.ts +0 -532
  782. package/src/commands/btw.ts +0 -356
  783. package/src/commands/compact.ts +0 -154
  784. package/src/commands/context-usage.test.ts +0 -57
  785. package/src/commands/context-usage.ts +0 -267
  786. package/src/commands/create-new-project.ts +0 -203
  787. package/src/commands/diff.ts +0 -91
  788. package/src/commands/file-upload.ts +0 -398
  789. package/src/commands/fork-subagent.ts +0 -262
  790. package/src/commands/fork.ts +0 -421
  791. package/src/commands/gemini-apikey.ts +0 -205
  792. package/src/commands/last-sessions.ts +0 -176
  793. package/src/commands/login.ts +0 -1182
  794. package/src/commands/mcp.ts +0 -307
  795. package/src/commands/memory-snapshot.ts +0 -30
  796. package/src/commands/mention-mode.ts +0 -66
  797. package/src/commands/merge-worktree.ts +0 -282
  798. package/src/commands/model-variant.ts +0 -522
  799. package/src/commands/model.ts +0 -1377
  800. package/src/commands/multioauth.ts +0 -508
  801. package/src/commands/new-worktree.ts +0 -835
  802. package/src/commands/paginated-select.ts +0 -81
  803. package/src/commands/permissions.ts +0 -458
  804. package/src/commands/queue.test.ts +0 -19
  805. package/src/commands/queue.ts +0 -471
  806. package/src/commands/remove-project.ts +0 -152
  807. package/src/commands/restart-opencode-server.ts +0 -173
  808. package/src/commands/resume.ts +0 -229
  809. package/src/commands/run-command.ts +0 -123
  810. package/src/commands/screenshare.test.ts +0 -30
  811. package/src/commands/screenshare.ts +0 -388
  812. package/src/commands/session-id.ts +0 -109
  813. package/src/commands/session.ts +0 -319
  814. package/src/commands/share.ts +0 -106
  815. package/src/commands/tasks.ts +0 -399
  816. package/src/commands/types.ts +0 -25
  817. package/src/commands/undo-redo.ts +0 -394
  818. package/src/commands/unset-model.ts +0 -152
  819. package/src/commands/upgrade.ts +0 -51
  820. package/src/commands/user-command.ts +0 -260
  821. package/src/commands/verbosity.ts +0 -172
  822. package/src/commands/vscode.ts +0 -378
  823. package/src/commands/worktrees.ts +0 -762
  824. package/src/condense-memory.ts +0 -36
  825. package/src/config.ts +0 -147
  826. package/src/context-awareness-plugin.test.ts +0 -144
  827. package/src/context-awareness-plugin.ts +0 -508
  828. package/src/cpu-profiler.test.ts +0 -183
  829. package/src/cpu-profiler.ts +0 -293
  830. package/src/critique-utils.ts +0 -139
  831. package/src/database.ts +0 -1484
  832. package/src/debounce-timeout.ts +0 -43
  833. package/src/debounced-process-flush.ts +0 -104
  834. package/src/default-channel-provisioning.test.ts +0 -156
  835. package/src/discord-bot.ts +0 -1852
  836. package/src/discord-command-registration.test.ts +0 -20
  837. package/src/discord-command-registration.ts +0 -704
  838. package/src/discord-urls.ts +0 -88
  839. package/src/discord-utils.test.ts +0 -470
  840. package/src/discord-utils.ts +0 -1079
  841. package/src/escape-backticks.test.ts +0 -469
  842. package/src/event-stream-real-capture.e2e.test.ts +0 -692
  843. package/src/eventsource-parser.test.ts +0 -351
  844. package/src/exec-async.ts +0 -44
  845. package/src/external-directory-permissions.e2e.test.ts +0 -103
  846. package/src/external-directory-project-deny.e2e.test.ts +0 -84
  847. package/src/external-opencode-sync.test.ts +0 -248
  848. package/src/external-opencode-sync.ts +0 -867
  849. package/src/extract-sdk-error-message.test.ts +0 -18
  850. package/src/format-tables.test.ts +0 -988
  851. package/src/format-tables.ts +0 -1031
  852. package/src/forum-sync/config.ts +0 -92
  853. package/src/forum-sync/discord-operations.ts +0 -245
  854. package/src/forum-sync/index.ts +0 -9
  855. package/src/forum-sync/markdown.ts +0 -172
  856. package/src/forum-sync/sync-to-discord.ts +0 -595
  857. package/src/forum-sync/sync-to-files.ts +0 -294
  858. package/src/forum-sync/types.ts +0 -175
  859. package/src/forum-sync/watchers.ts +0 -474
  860. package/src/gateway-proxy-reconnect.e2e.test.ts +0 -553
  861. package/src/gateway-proxy.e2e.test.ts +0 -648
  862. package/src/genai-worker-wrapper.ts +0 -164
  863. package/src/genai-worker.ts +0 -385
  864. package/src/genai.ts +0 -318
  865. package/src/git-worktree-core.ts +0 -616
  866. package/src/guild-categories.test.ts +0 -260
  867. package/src/heap-monitor.ts +0 -152
  868. package/src/hrana-server.test.ts +0 -130
  869. package/src/hrana-server.ts +0 -399
  870. package/src/html-actions.test.ts +0 -87
  871. package/src/html-actions.ts +0 -174
  872. package/src/html-components.test.ts +0 -38
  873. package/src/html-components.ts +0 -177
  874. package/src/image-optimizer-plugin.ts +0 -194
  875. package/src/image-utils.ts +0 -150
  876. package/src/interaction-handler.ts +0 -775
  877. package/src/ipc-polling.ts +0 -325
  878. package/src/ipc-tools-plugin.ts +0 -306
  879. package/src/kimaki-digital-twin.e2e.test.ts +0 -199
  880. package/src/kimaki-opencode-plugin-loading.e2e.test.ts +0 -208
  881. package/src/kimaki-opencode-plugin.test.ts +0 -142
  882. package/src/kimaki-opencode-plugin.ts +0 -34
  883. package/src/kimaki-workspace-adaptor.ts +0 -144
  884. package/src/limit-heading-depth.test.ts +0 -116
  885. package/src/limit-heading-depth.ts +0 -26
  886. package/src/list-channel-threads.test.ts +0 -90
  887. package/src/list-channel-threads.ts +0 -252
  888. package/src/markdown.test.ts +0 -498
  889. package/src/markdown.ts +0 -577
  890. package/src/memory-overview-plugin.ts +0 -159
  891. package/src/message-formatting.test.ts +0 -1401
  892. package/src/message-formatting.ts +0 -999
  893. package/src/message-preprocessing.ts +0 -557
  894. package/src/oauth-rotation-shared.ts +0 -332
  895. package/src/onboarding-tutorial.ts +0 -167
  896. package/src/onboarding-welcome.ts +0 -49
  897. package/src/openai-auth-plugin.ts +0 -158
  898. package/src/openai-auth-state.ts +0 -297
  899. package/src/openai-realtime.ts +0 -358
  900. package/src/opencode-command-detection.test.ts +0 -307
  901. package/src/opencode-command-detection.ts +0 -76
  902. package/src/opencode-command.test.ts +0 -290
  903. package/src/opencode-command.ts +0 -251
  904. package/src/opencode-interrupt-plugin.test.ts +0 -419
  905. package/src/opencode-interrupt-plugin.ts +0 -306
  906. package/src/opencode.ts +0 -1590
  907. package/src/parse-permission-rules.test.ts +0 -127
  908. package/src/patch-text-parser.ts +0 -107
  909. package/src/plugin-logger.ts +0 -139
  910. package/src/plugin-opencode-client.ts +0 -71
  911. package/src/privacy-sanitizer.ts +0 -142
  912. package/src/project-add.test.ts +0 -80
  913. package/src/question-abort-clears-dropdown.e2e.test.ts +0 -109
  914. package/src/question-abort-resume.e2e.test.ts +0 -121
  915. package/src/question-abort-retry-text-before-dropdown.e2e.test.ts +0 -172
  916. package/src/question-text-before-dropdown.e2e.test.ts +0 -67
  917. package/src/queue-advanced-abort.e2e.test.ts +0 -449
  918. package/src/queue-advanced-action-buttons.e2e.test.ts +0 -271
  919. package/src/queue-advanced-e2e-setup.ts +0 -1164
  920. package/src/queue-advanced-footer.e2e.test.ts +0 -357
  921. package/src/queue-advanced-model-switch.e2e.test.ts +0 -382
  922. package/src/queue-advanced-permissions-typing.e2e.test.ts +0 -256
  923. package/src/queue-advanced-question.e2e.test.ts +0 -322
  924. package/src/queue-advanced-typing-interrupt.e2e.test.ts +0 -147
  925. package/src/queue-advanced-typing.e2e.test.ts +0 -199
  926. package/src/queue-delete-message.e2e.test.ts +0 -262
  927. package/src/queue-drain-after-interactive-ui.e2e.test.ts +0 -152
  928. package/src/queue-interrupt-drain.e2e.test.ts +0 -299
  929. package/src/queue-question-select-drain.e2e.test.ts +0 -209
  930. package/src/runtime-idle-sweeper.ts +0 -76
  931. package/src/runtime-lifecycle.e2e.test.ts +0 -714
  932. package/src/schema.sql +0 -251
  933. package/src/sentry.ts +0 -26
  934. package/src/session-handler/agent-utils.ts +0 -104
  935. package/src/session-handler/event-stream-fixtures/real-session-action-buttons.jsonl +0 -45
  936. package/src/session-handler/event-stream-fixtures/real-session-footer-suppressed-on-pre-idle-interrupt.jsonl +0 -40
  937. package/src/session-handler/event-stream-fixtures/real-session-permission-external-file.jsonl +0 -23
  938. package/src/session-handler/event-stream-fixtures/real-session-task-normal.jsonl +0 -22
  939. package/src/session-handler/event-stream-fixtures/real-session-task-three-parallel-sleeps.jsonl +0 -277
  940. package/src/session-handler/event-stream-fixtures/real-session-task-user-interruption.jsonl +0 -46
  941. package/src/session-handler/event-stream-fixtures/session-abort-after-idle-race.jsonl +0 -21
  942. package/src/session-handler/event-stream-fixtures/session-concurrent-messages-serialized.jsonl +0 -56
  943. package/src/session-handler/event-stream-fixtures/session-explicit-abort.jsonl +0 -44
  944. package/src/session-handler/event-stream-fixtures/session-normal-completion.jsonl +0 -29
  945. package/src/session-handler/event-stream-fixtures/session-tool-call-noisy-stream.jsonl +0 -29
  946. package/src/session-handler/event-stream-fixtures/session-two-completions-same-session.jsonl +0 -50
  947. package/src/session-handler/event-stream-fixtures/session-user-interruption.jsonl +0 -59
  948. package/src/session-handler/event-stream-fixtures/session-voice-queued-followup.jsonl +0 -52
  949. package/src/session-handler/event-stream-state.test.ts +0 -3431
  950. package/src/session-handler/event-stream-state.ts +0 -1792
  951. package/src/session-handler/global-event-listener.ts +0 -258
  952. package/src/session-handler/model-utils.test.ts +0 -537
  953. package/src/session-handler/model-utils.ts +0 -489
  954. package/src/session-handler/opencode-session-event-log.ts +0 -159
  955. package/src/session-handler/thread-ingress.test.ts +0 -54
  956. package/src/session-handler/thread-runtime-state.ts +0 -358
  957. package/src/session-handler/thread-session-runtime-summary.test.ts +0 -169
  958. package/src/session-handler/thread-session-runtime.ts +0 -5696
  959. package/src/session-handler.ts +0 -15
  960. package/src/session-search.test.ts +0 -331
  961. package/src/session-search.ts +0 -382
  962. package/src/session-sleep.test.ts +0 -294
  963. package/src/session-title-rename.test.ts +0 -186
  964. package/src/skill-filter.test.ts +0 -110
  965. package/src/skill-filter.ts +0 -63
  966. package/src/startup-service.ts +0 -200
  967. package/src/startup-time.e2e.test.ts +0 -377
  968. package/src/system-message.test.ts +0 -1013
  969. package/src/system-message.ts +0 -1043
  970. package/src/task-id-plugin.ts +0 -17
  971. package/src/task-runner.ts +0 -768
  972. package/src/task-schedule.test.ts +0 -424
  973. package/src/task-schedule.ts +0 -470
  974. package/src/test-utils.ts +0 -549
  975. package/src/thinking-utils.test.ts +0 -46
  976. package/src/thinking-utils.ts +0 -82
  977. package/src/thread-message-queue.e2e.test.ts +0 -1468
  978. package/src/tools.ts +0 -430
  979. package/src/undici.d.ts +0 -12
  980. package/src/undo-redo.e2e.test.ts +0 -219
  981. package/src/unnest-code-blocks.test.ts +0 -713
  982. package/src/unnest-code-blocks.ts +0 -185
  983. package/src/upgrade.ts +0 -127
  984. package/src/utils.ts +0 -216
  985. package/src/voice-attachment.ts +0 -79
  986. package/src/voice-handler.ts +0 -1000
  987. package/src/voice-message.e2e.test.ts +0 -1513
  988. package/src/voice-routing-input.e2e.test.ts +0 -203
  989. package/src/voice-routing-question.e2e.test.ts +0 -188
  990. package/src/voice.test.ts +0 -565
  991. package/src/wait-session.ts +0 -291
  992. package/src/websockify.ts +0 -101
  993. package/src/worker-types.ts +0 -64
  994. package/src/worktree-clone-isolation.e2e.test.ts +0 -213
  995. package/src/worktree-lifecycle.e2e.test.ts +0 -900
  996. package/src/worktree-utils.ts +0 -4
  997. package/src/xai-auth-plugin.ts +0 -303
  998. package/src/xai-auth-state.test.ts +0 -224
  999. package/src/xai-auth-state.ts +0 -294
  1000. package/src/xml.test.ts +0 -38
  1001. package/src/xml.ts +0 -121
@@ -0,0 +1,33 @@
1
+ import { type ModalSubmitInteraction } from 'discord.js';
2
+ import { type Bot } from './bot.ts';
3
+ import { ConfigError } from './errors.ts';
4
+ import type { InteractionRoutes } from './interaction-context.ts';
5
+ import type { AgentButton } from './thread-reducer.ts';
6
+ export declare function parseButton(value: string): ConfigError | AgentButton;
7
+ type UploadResult = {
8
+ paths: string[];
9
+ } | {
10
+ cancelled: true;
11
+ };
12
+ type AgentUiInput = {
13
+ sessionId: string;
14
+ content: {
15
+ buttons: AgentButton[];
16
+ } | {
17
+ prompt: string;
18
+ maxFiles: number;
19
+ };
20
+ fromShell?: boolean;
21
+ toolCall?: string;
22
+ signal: AbortSignal;
23
+ };
24
+ export type AgentUi = {
25
+ request: (input: AgentUiInput) => Promise<ConfigError | {
26
+ shown: true;
27
+ } | UploadResult>;
28
+ submitUpload: (interaction: ModalSubmitInteraction) => Promise<unknown>;
29
+ stop: () => void;
30
+ };
31
+ export declare function createAgentUi(bot: Pick<Bot, 'store' | 'eventLoop' | 'opencode'>): AgentUi;
32
+ export declare const agentUiRoutes: InteractionRoutes;
33
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,140 @@
1
+ import fs from 'node:fs';
2
+ import { ComponentType } from 'discord.js';
3
+ import { afterAll, beforeAll, expect, test } from 'vitest';
4
+ import { TEST_USER_ID, seedProjectChannel, startOpencodeTestServer, startTestBot, startTwin, tempDataDir, waitFor, waitForFooter, warmUp, toolParts, textParts } from "./test/harness.js";
5
+ import { send, shell } from "./prompt.js";
6
+ const dataDir = tempDataDir();
7
+ let server;
8
+ let twin;
9
+ let bot;
10
+ beforeAll(async () => {
11
+ ;
12
+ [server, twin] = await Promise.all([startOpencodeTestServer({ matchers: [
13
+ { id: 'buttons', priority: 100, when: { latestUserTextIncludes: 'button-marker' }, then: { parts: [
14
+ { type: 'text-start', id: 'intro' }, { type: 'text-delta', id: 'intro', delta: 'Choose the next action.' }, { type: 'text-end', id: 'intro' },
15
+ ...toolParts({ toolCallId: 'buttons-call', toolName: 'shell', input: { command: "kimaki buttons --button 'Proceed' --button 'Build:green'", description: 'Show choices', hasSideEffect: true } }),
16
+ ] } },
17
+ { id: 'buttons-done', priority: 110, when: { latestUserTextIncludes: 'button-marker', rawPromptIncludes: 'buttons-call' }, then: { parts: textParts('Buttons shown.') } },
18
+ { id: 'click', priority: 200, when: { latestUserTextIncludes: 'User clicked: Proceed' }, then: { parts: textParts('Proceed accepted.') } },
19
+ { id: 'upload', priority: 100, when: { latestUserTextIncludes: 'upload-marker' }, then: { parts: toolParts({ toolCallId: 'upload-call', toolName: 'shell', input: { command: "kimaki upload-request --prompt 'Send the logo' --max-files 2", timeout: 600000, description: 'Request logo', hasSideEffect: true } }) } },
20
+ { id: 'upload-done', priority: 110, when: { latestUserTextIncludes: 'upload-marker', rawPromptIncludes: 'upload-call' }, then: { parts: textParts('Upload received.') } },
21
+ { id: 'branch', priority: 200, when: { latestUserTextIncludes: 'git-marker', rawPromptIncludes: '[current git branch is main]' }, then: { parts: textParts('Git context received.') } },
22
+ ] }), startTwin()]);
23
+ await seedProjectChannel({ dataDir, channelId: twin.channelId, guildId: twin.discord.guildId, directory: server.projectDirectory });
24
+ bot = await startTestBot({ dataDir, twin, server });
25
+ await warmUp({ server });
26
+ }, 60_000);
27
+ afterAll(async () => {
28
+ await bot?.stop();
29
+ await Promise.all([server?.stop(), twin?.stop()]);
30
+ fs.rmSync(dataDir, { recursive: true, force: true });
31
+ });
32
+ async function start(prompt) {
33
+ const result = await send(bot, { channelId: twin.channelId, prompt });
34
+ if (result instanceof Error)
35
+ throw result;
36
+ return result.threadId;
37
+ }
38
+ async function ui(threadId, prefix) {
39
+ return waitFor({ label: prefix, check: async () => {
40
+ for (const message of await twin.discord.thread(threadId).getMessages())
41
+ for (const row of message.components ?? []) {
42
+ if (row.type !== ComponentType.ActionRow)
43
+ continue;
44
+ for (const item of row.components)
45
+ if (item.type === ComponentType.Button && 'custom_id' in item && item.custom_id.startsWith(prefix))
46
+ return { message, button: item };
47
+ }
48
+ return null;
49
+ } });
50
+ }
51
+ test('agent shim shows buttons after text and a click resumes the real session', async () => {
52
+ const threadId = await start('button-marker');
53
+ const shown = await ui(threadId, 'action_button:');
54
+ await waitForFooter({ discord: twin.discord, threadId });
55
+ const sessionId = bot.store.getState().roots[threadId];
56
+ const started = shell(bot, { threadId, sessionId, command: 'printf synthetic' });
57
+ if (started instanceof Error)
58
+ throw started;
59
+ await waitFor({ label: 'synthetic shell output', check: async () => (await twin.discord.thread(threadId).text()).includes('```\nsynthetic\n```') });
60
+ await twin.discord.thread(threadId).user(TEST_USER_ID).clickButton({ messageId: shown.message.id, customId: shown.button.custom_id });
61
+ await waitForFooter({ discord: twin.discord, threadId, count: 2 });
62
+ expect(await twin.discord.thread(threadId).text()).toMatchInlineSnapshot(`
63
+ "--- from: assistant (TestBot)
64
+ » **CLI:** button-marker
65
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
66
+ Choose the next action.
67
+
68
+ -# ┣ shell _Show choices_
69
+ -# ⬦ clicked "Proceed"
70
+
71
+ Buttons shown.
72
+ -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
73
+ -# $ printf synthetic
74
+ \`\`\`
75
+ synthetic
76
+ \`\`\`
77
+
78
+ Proceed accepted.
79
+ -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
80
+ `);
81
+ const messages = await twin.discord.thread(threadId).getMessages();
82
+ expect(messages.findIndex((message) => message.content.includes('Choose the next action.'))).toBeLessThan(messages.findIndex((message) => message.id === shown.message.id));
83
+ expect(messages.some((message) => message.content.includes('Proceed accepted.'))).toBe(true);
84
+ });
85
+ test('native file upload modal returns local paths to the agent shell', async () => {
86
+ const threadId = await start('upload-marker');
87
+ const shown = await ui(threadId, 'file_upload_btn:');
88
+ const user = twin.discord.thread(threadId).user(TEST_USER_ID);
89
+ const clicked = await user.clickButton({ messageId: shown.message.id, customId: shown.button.custom_id });
90
+ await twin.discord.thread(threadId).waitForInteractionAck({ interactionId: clicked.id });
91
+ await user.submitModal({ customId: shown.button.custom_id.replace('file_upload_btn:', 'file_upload_modal:'), fields: [], files: [{ customId: 'files', attachments: [{
92
+ id: '200000000000009999', filename: 'logo.txt', size: 4, url: 'data:text/plain;base64,bG9nbw==', proxy_url: 'data:text/plain;base64,bG9nbw==',
93
+ }] }] });
94
+ await waitForFooter({ discord: twin.discord, threadId });
95
+ expect(await twin.discord.thread(threadId).text()).toMatchInlineSnapshot(`
96
+ "--- from: assistant (TestBot)
97
+ » **CLI:** upload-marker
98
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
99
+ -# ┣ shell _Request logo_
100
+ -# ⬦ dismissed
101
+ Uploaded 1 file(s)
102
+
103
+ Upload received.
104
+ -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
105
+ `);
106
+ const dirs = fs.readdirSync(`${server.projectDirectory}/uploads`);
107
+ expect(fs.readFileSync(`${server.projectDirectory}/uploads/${dirs[0]}/0-logo.txt`, 'utf8')).toBe('logo');
108
+ });
109
+ test('git context is added only to marked Discord sessions', async () => {
110
+ const threadId = await start('git-marker');
111
+ await waitForFooter({ discord: twin.discord, threadId });
112
+ expect(await twin.discord.thread(threadId).text()).toMatchInlineSnapshot(`
113
+ "--- from: assistant (TestBot)
114
+ » **CLI:** git-marker
115
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
116
+ Git context received.
117
+ -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
118
+ `);
119
+ expect((await twin.discord.thread(threadId).text()).includes('Git context received.')).toBe(true);
120
+ const client = await server.client();
121
+ // The branch is a synthetic message before the prompt, added again only when it changes.
122
+ const sessionId = bot.store.getState().roots[threadId];
123
+ await client.session.prompt({ sessionID: sessionId, text: 'git-marker again' });
124
+ await client.session.wait({ sessionID: sessionId });
125
+ const history = await client.session.context({ sessionID: sessionId });
126
+ expect(history.flatMap((message) => message.type === 'synthetic' || message.type === 'user' ? [`${message.type}: ${message.text.split('\n')[0]}`] : [])).toMatchInlineSnapshot(`
127
+ [
128
+ "synthetic: [current git branch is main]",
129
+ "user: git-marker",
130
+ "user: git-marker again",
131
+ ]
132
+ `);
133
+ const plugins = await client.plugin.list({ location: { directory: server.projectDirectory } });
134
+ expect(plugins.data.find((plugin) => plugin.id === 'kimaki')?.state.status).toBe('active');
135
+ const session = await client.session.create({ location: { directory: server.projectDirectory } });
136
+ await client.session.prompt({ sessionID: session.id, text: 'git-marker' });
137
+ await client.session.wait({ sessionID: session.id });
138
+ expect(JSON.stringify(await client.message.list({ sessionID: session.id }))).not.toContain('Git context received.');
139
+ });
140
+ //# sourceMappingURL=agent-ui.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-ui.e2e.test.js","sourceRoot":"","sources":["../src/agent-ui.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ // Agent UI: `kimaki buttons` and `kimaki upload-request` prompts in a session
2
+ // thread, their buttons and the file upload modal.
3
+ import crypto from 'node:crypto';
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import { FileUploadBuilder, LabelBuilder, ModalBuilder, MessageFlags } from 'discord.js';
7
+ import { sessionDirectory } from "./bot.js";
8
+ import { ConfigError, DiscordError } from "./errors.js";
9
+ import { send } from "./prompt.js";
10
+ export function parseButton(value) {
11
+ const match = value.match(/:(white|blue|green|red)$/);
12
+ const color = match?.[1] ?? 'white';
13
+ const label = match ? value.slice(0, -match[0].length) : value;
14
+ if (!label.trim() || label.length > 80)
15
+ return new ConfigError({ reason: 'Button labels must have 1 to 80 characters' });
16
+ if (color !== 'white' && color !== 'blue' && color !== 'green' && color !== 'red')
17
+ return new ConfigError({ reason: 'Unknown button color' });
18
+ return { label, color };
19
+ }
20
+ function cancelUpload(pending) {
21
+ clearTimeout(pending.timer);
22
+ pending.controller.abort();
23
+ pending.resolve({ cancelled: true });
24
+ }
25
+ function promptShown(threads, id) {
26
+ return Object.values(threads).some((view) => view.agentUi.some((prompt) => prompt.id === id));
27
+ }
28
+ function shownPrompt(bot, { id, threadId }) {
29
+ return bot.store.getState().threads[threadId]?.agentUi.find((prompt) => prompt.id === id);
30
+ }
31
+ // `kimaki buttons --from-shell` must post after its shell's tool line.
32
+ async function waitForShellCall(bot, { toolCall, signal }) {
33
+ const seen = () => Object.values(bot.store.getState().threads).some((view) => {
34
+ const tool = view.tools[toolCall];
35
+ return tool?.name === 'shell' && tool.phase === 'called';
36
+ });
37
+ if (seen())
38
+ return;
39
+ return new Promise((resolve) => {
40
+ const finish = (value) => {
41
+ clearTimeout(timer);
42
+ off();
43
+ signal.removeEventListener('abort', abort);
44
+ resolve(value);
45
+ };
46
+ const off = bot.store.subscribe(() => {
47
+ if (seen())
48
+ finish();
49
+ });
50
+ const abort = () => finish(new ConfigError({ reason: 'Agent UI request cancelled' }));
51
+ const timer = setTimeout(() => {
52
+ finish(new ConfigError({ reason: 'No running shell call observed. Run this command from the session shell.' }));
53
+ }, 10_000);
54
+ signal.addEventListener('abort', abort, { once: true });
55
+ if (signal.aborted)
56
+ abort();
57
+ else if (seen())
58
+ finish();
59
+ });
60
+ }
61
+ // One per bot (bot.features.agentUi). The upload waits stay in this closure.
62
+ export function createAgentUi(bot) {
63
+ // Agent UI upload id -> the `kimaki upload-request` call waiting for files.
64
+ const uploads = new Map();
65
+ // The one reactive side effect of uploads: a prompt that leaves every view
66
+ // (dismissed by a new message, the session ended) cancels its waiting call.
67
+ const unsubscribe = bot.store.subscribe((state, previous) => {
68
+ for (const [id, pending] of uploads) {
69
+ if (!promptShown(previous.threads, id) || promptShown(state.threads, id))
70
+ continue;
71
+ cancelUpload(pending);
72
+ uploads.delete(id);
73
+ }
74
+ });
75
+ async function request({ sessionId, content, fromShell, toolCall, signal }) {
76
+ const threadId = bot.store.getState().sessionThreads[sessionId];
77
+ if (!threadId)
78
+ return new ConfigError({ reason: 'This session has no local Discord thread' });
79
+ const prompt = { id: crypto.randomBytes(8).toString('hex'), sessionId, ...content };
80
+ if (fromShell) {
81
+ if (!toolCall)
82
+ return new ConfigError({ reason: 'The Kimaki plugin must provide KIMAKI_TOOL_CALL for agent UI commands' });
83
+ const waited = await waitForShellCall(bot, { toolCall, signal });
84
+ if (waited instanceof Error)
85
+ return waited;
86
+ }
87
+ bot.eventLoop.dispatch(threadId, { type: 'kimaki.agent-ui', prompt });
88
+ if (prompt.buttons)
89
+ return { shown: true };
90
+ return new Promise((resolve) => {
91
+ const finish = (value) => {
92
+ signal.removeEventListener('abort', abort);
93
+ resolve(value);
94
+ };
95
+ const abort = () => {
96
+ bot.eventLoop.dispatch(threadId, { type: 'kimaki.agent-ui-dismiss', id: prompt.id });
97
+ finish({ cancelled: true });
98
+ };
99
+ const timer = setTimeout(abort, 6 * 60_000);
100
+ uploads.set(prompt.id, { resolve: finish, timer, controller: new AbortController() });
101
+ signal.addEventListener('abort', abort, { once: true });
102
+ if (signal.aborted)
103
+ abort();
104
+ });
105
+ }
106
+ async function submitUpload(interaction) {
107
+ await interaction.deferReply({ flags: MessageFlags.Ephemeral });
108
+ const threadId = interaction.channelId;
109
+ if (!threadId)
110
+ return interaction.editReply({ content: 'Use this upload in its session thread' });
111
+ const id = interaction.customId.split(':')[1] ?? '';
112
+ const prompt = shownPrompt(bot, { id, threadId });
113
+ const pending = uploads.get(id);
114
+ if (!prompt || !pending)
115
+ return interaction.editReply({ content: 'Upload request expired' });
116
+ const active = () => uploads.get(id) === pending && !pending.controller.signal.aborted;
117
+ const directory = await sessionDirectory(bot, prompt.sessionId);
118
+ if (!active())
119
+ return interaction.editReply({ content: 'Upload cancelled' });
120
+ if (directory instanceof Error)
121
+ return interaction.editReply({ content: directory.message });
122
+ const files = [...interaction.fields.getUploadedFiles('files', true).values()];
123
+ if (files.length < 1 || files.length > (prompt.maxFiles ?? 5))
124
+ return interaction.editReply({ content: 'Too many files' });
125
+ const output = path.join(directory, 'uploads', id);
126
+ const created = await fs.promises
127
+ .mkdir(output, { recursive: true })
128
+ .catch((cause) => new DiscordError({ operation: 'create upload directory', cause }));
129
+ if (created instanceof Error)
130
+ return interaction.editReply({ content: created.message });
131
+ const paths = [];
132
+ for (const [index, file] of files.entries()) {
133
+ const signal = AbortSignal.any([pending.controller.signal, AbortSignal.timeout(30000)]);
134
+ const response = await fetch(file.url, { signal }).catch((cause) => new DiscordError({ operation: 'download upload', cause }));
135
+ if (!active())
136
+ return interaction.editReply({ content: 'Upload cancelled' });
137
+ if (response instanceof Error || !response.ok)
138
+ return interaction.editReply({ content: 'Upload download failed. Try again.' });
139
+ const bytes = await response.arrayBuffer().catch((cause) => new DiscordError({ operation: 'read upload', cause }));
140
+ if (!active())
141
+ return interaction.editReply({ content: 'Upload cancelled' });
142
+ if (bytes instanceof Error)
143
+ return interaction.editReply({ content: bytes.message });
144
+ const destination = path.join(output, `${index}-${path.basename(file.name)}`);
145
+ const written = await fs.promises
146
+ .writeFile(destination, Buffer.from(bytes), { signal: pending.controller.signal })
147
+ .catch((cause) => new DiscordError({ operation: 'save upload', cause }));
148
+ if (!active())
149
+ return interaction.editReply({ content: 'Upload cancelled' });
150
+ if (written instanceof Error)
151
+ return interaction.editReply({ content: written.message });
152
+ paths.push(destination);
153
+ }
154
+ uploads.delete(id);
155
+ clearTimeout(pending.timer);
156
+ pending.resolve({ paths });
157
+ bot.eventLoop.dispatch(threadId, { type: 'kimaki.agent-ui-dismiss', id });
158
+ return interaction.editReply({ content: `Uploaded ${paths.length} file(s)` });
159
+ }
160
+ return {
161
+ request,
162
+ submitUpload,
163
+ stop() {
164
+ unsubscribe();
165
+ for (const pending of uploads.values())
166
+ cancelUpload(pending);
167
+ uploads.clear();
168
+ },
169
+ };
170
+ }
171
+ // Buttons of an agent prompt: an action button sends `User clicked: <label>`; the
172
+ // upload button opens the file modal.
173
+ async function clickAgentButton(bot, interaction) {
174
+ const [, id = '', index = '0'] = interaction.customId.split(':');
175
+ const prompt = shownPrompt(bot, { id, threadId: interaction.channelId });
176
+ if (!prompt)
177
+ return interaction.reply({ content: 'This request has expired', flags: MessageFlags.Ephemeral });
178
+ if (!prompt.buttons) {
179
+ const files = new FileUploadBuilder().setCustomId('files').setMinValues(1).setMaxValues(prompt.maxFiles ?? 5).setRequired(true);
180
+ const modal = new ModalBuilder()
181
+ .setCustomId(`file_upload_modal:${id}`)
182
+ .setTitle('Upload files')
183
+ .addLabelComponents(new LabelBuilder().setLabel('Files').setFileUploadComponent(files));
184
+ return interaction.showModal(modal);
185
+ }
186
+ await interaction.deferUpdate();
187
+ const item = prompt.buttons[Number(index)];
188
+ if (!item)
189
+ return;
190
+ bot.eventLoop.dispatch(interaction.channelId, { type: 'kimaki.agent-ui-dismiss', id, result: `clicked "${item.label}"` });
191
+ const result = await send(bot, { threadId: interaction.channelId, prompt: `User clicked: ${item.label}`, user: [interaction.user.id] });
192
+ if (result instanceof Error)
193
+ await interaction.followUp({ content: result.message, flags: MessageFlags.Ephemeral });
194
+ }
195
+ export const agentUiRoutes = {
196
+ buttons: { 'action_button:': clickAgentButton, 'file_upload_btn:': clickAgentButton },
197
+ modals: { 'file_upload_modal:': (bot, interaction) => bot.features.agentUi.submitUpload(interaction) },
198
+ };
199
+ //# sourceMappingURL=agent-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-ui.js","sourceRoot":"","sources":["../src/agent-ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { V2Event } from './opencode-server.ts';
2
+ export type AnalyticsEventName = 'bot_started' | 'project_registered' | 'session_created' | 'turn_started' | 'turn_completed' | 'tokens_used';
3
+ export type AnalyticsProps = Record<string, string | number | boolean>;
4
+ export type AnalyticsEvent = {
5
+ name: AnalyticsEventName;
6
+ properties: AnalyticsProps;
7
+ };
8
+ type ExecutionUsage = {
9
+ startedAt: number;
10
+ steps: number;
11
+ input: number;
12
+ output: number;
13
+ reasoning: number;
14
+ cacheRead: number;
15
+ cacheWrite: number;
16
+ cost: number;
17
+ model: string | null;
18
+ provider: string | null;
19
+ };
20
+ export type UsageState = Readonly<Record<string, ExecutionUsage>>;
21
+ export declare function foldAnalytics({ state, event, isRoot, }: {
22
+ state: UsageState;
23
+ event: V2Event;
24
+ isRoot: boolean;
25
+ }): {
26
+ state: UsageState;
27
+ events: AnalyticsEvent[];
28
+ };
29
+ export type Analytics = {
30
+ enabled: boolean;
31
+ track: (name: AnalyticsEventName, properties?: AnalyticsProps) => void;
32
+ observe: (event: V2Event, isRoot: boolean) => void;
33
+ flush: () => Promise<void>;
34
+ };
35
+ export declare const disabledAnalytics: Analytics;
36
+ export declare function createAnalytics({ dataDir, botMode, enabled, endpoint, }: {
37
+ dataDir: string;
38
+ botMode: 'gateway' | 'self_hosted';
39
+ enabled: boolean;
40
+ endpoint?: string;
41
+ }): Analytics;
42
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,112 @@
1
+ // Product analytics end to end: the real Strada SDK exports OTLP JSON logs to
2
+ // a local receiver instead of strada.sh. One Discord turn produces the funnel
3
+ // events with the common identity props. The deterministic model reports zero
4
+ // tokens, so tokens_used is skipped here; analytics.test.ts covers it.
5
+ import fs from 'node:fs';
6
+ import http from 'node:http';
7
+ import { afterAll, beforeAll, expect, test } from 'vitest';
8
+ import { createAnalytics } from "./analytics.js";
9
+ import { freePort, seedProjectChannel, startOpencodeTestServer, startTestBot, startTwin, tempDataDir, TEST_USER_ID, waitFor, waitForFooter, warmUp, } from "./test/harness.js";
10
+ let server;
11
+ let twin;
12
+ let bot;
13
+ let dataDir;
14
+ let receiver;
15
+ const received = [];
16
+ beforeAll(async () => {
17
+ dataDir = tempDataDir();
18
+ receiver = http.createServer((request, response) => {
19
+ const chunks = [];
20
+ request.on('data', (chunk) => chunks.push(chunk));
21
+ request.on('end', () => {
22
+ if (request.url === '/v1/logs') {
23
+ const body = JSON.parse(Buffer.concat(chunks).toString('utf8'));
24
+ for (const record of body.resourceLogs.flatMap((logs) => logs.scopeLogs.flatMap((scope) => scope.logRecords))) {
25
+ received.push(Object.fromEntries(record.attributes.map(({ key, value }) => [key, value.stringValue ?? value.boolValue ?? value.doubleValue ?? Number(value.intValue)])));
26
+ }
27
+ }
28
+ response.writeHead(200, { 'content-type': 'application/json' }).end('{}');
29
+ });
30
+ });
31
+ const port = await freePort();
32
+ await new Promise((resolve) => receiver.listen(port, '127.0.0.1', resolve));
33
+ [server, twin] = await Promise.all([startOpencodeTestServer(), startTwin()]);
34
+ await warmUp({ server });
35
+ await seedProjectChannel({ dataDir, channelId: twin.channelId, guildId: twin.discord.guildId, directory: server.projectDirectory });
36
+ bot = await startTestBot({
37
+ dataDir,
38
+ twin,
39
+ server,
40
+ analytics: createAnalytics({ dataDir, botMode: 'self_hosted', enabled: true, endpoint: `http://127.0.0.1:${port}` }),
41
+ });
42
+ }, 60_000);
43
+ afterAll(async () => {
44
+ await bot?.stop();
45
+ await twin?.stop();
46
+ await server?.stop();
47
+ await new Promise((resolve) => receiver?.close(() => resolve()));
48
+ fs.rmSync(dataDir, { recursive: true, force: true });
49
+ });
50
+ test('a Discord turn sends the funnel events with anonymous identity props', async () => {
51
+ await twin.discord.channel(twin.channelId).user(TEST_USER_ID).sendMessage({ content: 'analytics turn' });
52
+ const thread = await twin.discord.channel(twin.channelId).waitForThread({ timeout: 8_000 });
53
+ await waitForFooter({ discord: twin.discord, threadId: thread.id });
54
+ await waitFor({
55
+ label: 'turn_completed exported',
56
+ check: async () => {
57
+ await bot.analytics.flush();
58
+ return received.some((event) => event['event.name'] === 'turn_completed');
59
+ },
60
+ });
61
+ const installId = fs.readFileSync(`${dataDir}/install-id`, 'utf8').trim();
62
+ expect(received.map((event) => {
63
+ const { ['custom.install_id']: id, ['custom.platform']: platform, ['custom.arch']: arch, ...rest } = event;
64
+ return {
65
+ ...rest,
66
+ 'custom.install_id': id === installId ? '<install-id>' : id,
67
+ 'custom.platform': platform === process.platform ? '<platform>' : platform,
68
+ 'custom.arch': arch === process.arch ? '<arch>' : arch,
69
+ };
70
+ })).toMatchInlineSnapshot(`
71
+ [
72
+ {
73
+ "custom.arch": "<arch>",
74
+ "custom.bot_mode": "self_hosted",
75
+ "custom.guild_count": 1,
76
+ "custom.install_id": "<install-id>",
77
+ "custom.platform": "<platform>",
78
+ "custom.schema_version": 1,
79
+ "custom.user_project_count": 1,
80
+ "event.name": "bot_started",
81
+ },
82
+ {
83
+ "custom.arch": "<arch>",
84
+ "custom.bot_mode": "self_hosted",
85
+ "custom.has_worktree": false,
86
+ "custom.install_id": "<install-id>",
87
+ "custom.platform": "<platform>",
88
+ "custom.schema_version": 1,
89
+ "custom.source": "discord",
90
+ "event.name": "session_created",
91
+ },
92
+ {
93
+ "custom.arch": "<arch>",
94
+ "custom.bot_mode": "self_hosted",
95
+ "custom.install_id": "<install-id>",
96
+ "custom.platform": "<platform>",
97
+ "custom.schema_version": 1,
98
+ "event.name": "turn_started",
99
+ },
100
+ {
101
+ "custom.arch": "<arch>",
102
+ "custom.bot_mode": "self_hosted",
103
+ "custom.duration_sec": 0,
104
+ "custom.install_id": "<install-id>",
105
+ "custom.platform": "<platform>",
106
+ "custom.schema_version": 1,
107
+ "event.name": "turn_completed",
108
+ },
109
+ ]
110
+ `);
111
+ });
112
+ //# sourceMappingURL=analytics.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.e2e.test.js","sourceRoot":"","sources":["../src/analytics.e2e.test.ts"],"names":[],"mappings":"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"}