kimaki 0.30.1 → 1.0.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 (987) 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 -221
  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 +75 -0
  18. package/dist/autostart.js.map +1 -0
  19. package/dist/bot.d.ts +90 -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/catalog-refresh.e2e.test.d.ts +1 -0
  26. package/dist/catalog-refresh.e2e.test.js +90 -0
  27. package/dist/catalog-refresh.e2e.test.js.map +1 -0
  28. package/dist/cli/bot.d.ts +5 -0
  29. package/dist/cli/bot.js +427 -0
  30. package/dist/cli/bot.js.map +1 -0
  31. package/dist/cli/discord.d.ts +3 -0
  32. package/dist/cli/discord.js +118 -0
  33. package/dist/cli/discord.js.map +1 -0
  34. package/dist/cli/project.d.ts +5 -0
  35. package/dist/cli/project.js +143 -0
  36. package/dist/cli/project.js.map +1 -0
  37. package/dist/cli/schedule.d.ts +3 -0
  38. package/dist/cli/schedule.js +156 -0
  39. package/dist/cli/schedule.js.map +1 -0
  40. package/dist/cli/session.d.ts +4 -0
  41. package/dist/cli/session.js +281 -0
  42. package/dist/cli/session.js.map +1 -0
  43. package/dist/cli/shared.d.ts +55 -0
  44. package/dist/cli/shared.js +138 -0
  45. package/dist/cli/shared.js.map +1 -0
  46. package/dist/cli-discord.e2e.test.d.ts +1 -0
  47. package/dist/cli-discord.e2e.test.js +64 -0
  48. package/dist/cli-discord.e2e.test.js.map +1 -0
  49. package/dist/cli-lock.e2e.test.d.ts +1 -0
  50. package/dist/cli-lock.e2e.test.js +520 -0
  51. package/dist/cli-lock.e2e.test.js.map +1 -0
  52. package/dist/cli-read.e2e.test.d.ts +1 -0
  53. package/dist/cli-read.e2e.test.js +81 -0
  54. package/dist/cli-read.e2e.test.js.map +1 -0
  55. package/dist/cli-sessions.e2e.test.d.ts +1 -0
  56. package/dist/cli-sessions.e2e.test.js +116 -0
  57. package/dist/cli-sessions.e2e.test.js.map +1 -0
  58. package/dist/cli.d.ts +2 -0
  59. package/dist/cli.js +34 -263
  60. package/dist/cli.js.map +1 -0
  61. package/dist/commands/login-commands.d.ts +59 -0
  62. package/dist/commands/login-commands.js +341 -0
  63. package/dist/commands/login-commands.js.map +1 -0
  64. package/dist/commands/preference-commands.d.ts +44 -0
  65. package/dist/commands/preference-commands.js +551 -0
  66. package/dist/commands/preference-commands.js.map +1 -0
  67. package/dist/commands/session-commands.d.ts +8 -0
  68. package/dist/commands/session-commands.js +267 -0
  69. package/dist/commands/session-commands.js.map +1 -0
  70. package/dist/commands/thread-commands.d.ts +16 -0
  71. package/dist/commands/thread-commands.js +285 -0
  72. package/dist/commands/thread-commands.js.map +1 -0
  73. package/dist/commands/worktree-commands.d.ts +41 -0
  74. package/dist/commands/worktree-commands.js +279 -0
  75. package/dist/commands/worktree-commands.js.map +1 -0
  76. package/dist/commands.e2e.test.d.ts +1 -0
  77. package/dist/commands.e2e.test.js +255 -0
  78. package/dist/commands.e2e.test.js.map +1 -0
  79. package/dist/credentials.d.ts +84 -0
  80. package/dist/credentials.js +320 -0
  81. package/dist/credentials.js.map +1 -0
  82. package/dist/db.d.ts +1532 -0
  83. package/dist/db.js +57 -245
  84. package/dist/db.js.map +1 -0
  85. package/dist/db.test.d.ts +1 -0
  86. package/dist/db.test.js +352 -673
  87. package/dist/db.test.js.map +1 -0
  88. package/dist/duration.d.ts +2 -0
  89. package/dist/duration.js +18 -0
  90. package/dist/duration.js.map +1 -0
  91. package/dist/effects.d.ts +15 -0
  92. package/dist/effects.js +291 -0
  93. package/dist/effects.js.map +1 -0
  94. package/dist/errors.d.ts +38 -0
  95. package/dist/errors.js +40 -170
  96. package/dist/errors.js.map +1 -0
  97. package/dist/event-loop.d.ts +40 -0
  98. package/dist/event-loop.js +414 -0
  99. package/dist/event-loop.js.map +1 -0
  100. package/dist/file-edit-log.d.ts +41 -0
  101. package/dist/file-edit-log.js +122 -164
  102. package/dist/file-edit-log.js.map +1 -0
  103. package/dist/file-edit-log.test.d.ts +1 -0
  104. package/dist/file-edit-log.test.js +68 -244
  105. package/dist/file-edit-log.test.js.map +1 -0
  106. package/dist/format-parts.d.ts +137 -0
  107. package/dist/format-parts.js +300 -0
  108. package/dist/format-parts.js.map +1 -0
  109. package/dist/format-parts.test.d.ts +1 -0
  110. package/dist/format-parts.test.js +144 -0
  111. package/dist/format-parts.test.js.map +1 -0
  112. package/dist/gateway-replay.e2e.test.d.ts +1 -0
  113. package/dist/gateway-replay.e2e.test.js +95 -0
  114. package/dist/gateway-replay.e2e.test.js.map +1 -0
  115. package/dist/harness.e2e.test.d.ts +1 -0
  116. package/dist/harness.e2e.test.js +107 -0
  117. package/dist/harness.e2e.test.js.map +1 -0
  118. package/dist/hello-thread.e2e.test.d.ts +1 -0
  119. package/dist/hello-thread.e2e.test.js +194 -0
  120. package/dist/hello-thread.e2e.test.js.map +1 -0
  121. package/dist/ingress.d.ts +7 -0
  122. package/dist/ingress.js +337 -0
  123. package/dist/ingress.js.map +1 -0
  124. package/dist/interaction-context.d.ts +45 -0
  125. package/dist/interaction-context.js +77 -0
  126. package/dist/interaction-context.js.map +1 -0
  127. package/dist/interrupt.e2e.test.d.ts +1 -0
  128. package/dist/interrupt.e2e.test.js +124 -0
  129. package/dist/interrupt.e2e.test.js.map +1 -0
  130. package/dist/legacy.e2e.test.d.ts +1 -0
  131. package/dist/legacy.e2e.test.js +85 -0
  132. package/dist/legacy.e2e.test.js.map +1 -0
  133. package/dist/live-call.d.ts +51 -0
  134. package/dist/live-call.js +207 -0
  135. package/dist/live-call.js.map +1 -0
  136. package/dist/lock-routes.d.ts +812 -0
  137. package/dist/lock-routes.js +635 -0
  138. package/dist/lock-routes.js.map +1 -0
  139. package/dist/lock-server.d.ts +36 -0
  140. package/dist/lock-server.js +223 -0
  141. package/dist/lock-server.js.map +1 -0
  142. package/dist/logger.d.ts +13 -0
  143. package/dist/logger.js +112 -162
  144. package/dist/logger.js.map +1 -0
  145. package/dist/login.e2e.test.d.ts +1 -0
  146. package/dist/login.e2e.test.js +83 -0
  147. package/dist/login.e2e.test.js.map +1 -0
  148. package/dist/main.d.ts +32 -0
  149. package/dist/main.js +190 -0
  150. package/dist/main.js.map +1 -0
  151. package/dist/markdown/components.d.ts +10 -0
  152. package/dist/markdown/components.js +77 -0
  153. package/dist/markdown/components.js.map +1 -0
  154. package/dist/markdown/markdown.test.d.ts +1 -0
  155. package/dist/markdown/markdown.test.js +393 -0
  156. package/dist/markdown/markdown.test.js.map +1 -0
  157. package/dist/markdown/render-markdown.d.ts +30 -0
  158. package/dist/markdown/render-markdown.js +265 -0
  159. package/dist/markdown/render-markdown.js.map +1 -0
  160. package/dist/message-tool.e2e.test.d.ts +1 -0
  161. package/dist/message-tool.e2e.test.js +39 -0
  162. package/dist/message-tool.e2e.test.js.map +1 -0
  163. package/dist/migrations.d.ts +8 -0
  164. package/dist/migrations.js +187 -0
  165. package/dist/migrations.js.map +1 -0
  166. package/dist/onboarding-cli.e2e.test.d.ts +1 -0
  167. package/dist/onboarding-cli.e2e.test.js +178 -0
  168. package/dist/onboarding-cli.e2e.test.js.map +1 -0
  169. package/dist/onboarding.d.ts +36 -0
  170. package/dist/onboarding.e2e.test.d.ts +1 -0
  171. package/dist/onboarding.e2e.test.js +148 -0
  172. package/dist/onboarding.e2e.test.js.map +1 -0
  173. package/dist/onboarding.js +261 -0
  174. package/dist/onboarding.js.map +1 -0
  175. package/dist/opencode-server.d.ts +54 -0
  176. package/dist/opencode-server.js +413 -0
  177. package/dist/opencode-server.js.map +1 -0
  178. package/dist/opencode-server.test.d.ts +1 -0
  179. package/dist/opencode-server.test.js +21 -0
  180. package/dist/opencode-server.test.js.map +1 -0
  181. package/dist/permissions.d.ts +31 -0
  182. package/dist/permissions.e2e.test.d.ts +1 -0
  183. package/dist/permissions.e2e.test.js +166 -0
  184. package/dist/permissions.e2e.test.js.map +1 -0
  185. package/dist/permissions.js +95 -0
  186. package/dist/permissions.js.map +1 -0
  187. package/dist/plugin/anthropic/index.d.ts +13 -0
  188. package/dist/plugin/anthropic/index.js +201 -0
  189. package/dist/plugin/anthropic/index.js.map +1 -0
  190. package/dist/plugin/anthropic/index.test.d.ts +1 -0
  191. package/dist/plugin/anthropic/index.test.js +39 -0
  192. package/dist/plugin/anthropic/index.test.js.map +1 -0
  193. package/dist/plugin/index.d.ts +3 -0
  194. package/dist/plugin/index.js +106 -0
  195. package/dist/plugin/index.js.map +1 -0
  196. package/dist/plugin/session-id/index.d.ts +3 -0
  197. package/dist/plugin/session-id/index.js +18 -0
  198. package/dist/plugin/session-id/index.js.map +1 -0
  199. package/dist/plugin.e2e.test.d.ts +1 -0
  200. package/dist/plugin.e2e.test.js +87 -0
  201. package/dist/plugin.e2e.test.js.map +1 -0
  202. package/dist/preference-commands.e2e.test.d.ts +1 -0
  203. package/dist/preference-commands.e2e.test.js +555 -0
  204. package/dist/preference-commands.e2e.test.js.map +1 -0
  205. package/dist/probe-live.tmp.d.ts +1 -0
  206. package/dist/probe-live.tmp.js +82 -0
  207. package/dist/probe-live.tmp.js.map +1 -0
  208. package/dist/project.d.ts +58 -0
  209. package/dist/project.js +169 -0
  210. package/dist/project.js.map +1 -0
  211. package/dist/prompt.d.ts +112 -0
  212. package/dist/prompt.js +578 -0
  213. package/dist/prompt.js.map +1 -0
  214. package/dist/questions.d.ts +59 -0
  215. package/dist/questions.e2e.test.d.ts +1 -0
  216. package/dist/questions.e2e.test.js +290 -0
  217. package/dist/questions.e2e.test.js.map +1 -0
  218. package/dist/questions.js +231 -0
  219. package/dist/questions.js.map +1 -0
  220. package/dist/queue.d.ts +45 -0
  221. package/dist/queue.e2e.test.d.ts +1 -0
  222. package/dist/queue.e2e.test.js +220 -0
  223. package/dist/queue.e2e.test.js.map +1 -0
  224. package/dist/queue.js +132 -0
  225. package/dist/queue.js.map +1 -0
  226. package/dist/remote-send.d.ts +32 -0
  227. package/dist/remote-send.e2e.test.d.ts +1 -0
  228. package/dist/remote-send.e2e.test.js +89 -0
  229. package/dist/remote-send.e2e.test.js.map +1 -0
  230. package/dist/remote-send.js +105 -0
  231. package/dist/remote-send.js.map +1 -0
  232. package/dist/renderer.e2e.test.d.ts +1 -0
  233. package/dist/renderer.e2e.test.js +357 -0
  234. package/dist/renderer.e2e.test.js.map +1 -0
  235. package/dist/restart.e2e.test.d.ts +1 -0
  236. package/dist/restart.e2e.test.js +68 -0
  237. package/dist/restart.e2e.test.js.map +1 -0
  238. package/dist/routes.d.ts +24 -0
  239. package/dist/routes.js +42 -0
  240. package/dist/routes.js.map +1 -0
  241. package/dist/routes.test.d.ts +1 -0
  242. package/dist/routes.test.js +79 -0
  243. package/dist/routes.test.js.map +1 -0
  244. package/dist/routines.e2e.test.d.ts +1 -0
  245. package/dist/routines.e2e.test.js +188 -0
  246. package/dist/routines.e2e.test.js.map +1 -0
  247. package/dist/scheduler.d.ts +116 -0
  248. package/dist/scheduler.e2e.test.d.ts +1 -0
  249. package/dist/scheduler.e2e.test.js +163 -0
  250. package/dist/scheduler.e2e.test.js.map +1 -0
  251. package/dist/scheduler.js +602 -0
  252. package/dist/scheduler.js.map +1 -0
  253. package/dist/scheduler.test.d.ts +1 -0
  254. package/dist/scheduler.test.js +180 -0
  255. package/dist/scheduler.test.js.map +1 -0
  256. package/dist/schema-sql.d.ts +1 -0
  257. package/dist/schema-sql.js +3 -0
  258. package/dist/schema-sql.js.map +1 -0
  259. package/dist/schema.d.ts +2968 -0
  260. package/dist/schema.js +95 -252
  261. package/dist/schema.js.map +1 -0
  262. package/dist/session-commands.e2e.test.d.ts +1 -0
  263. package/dist/session-commands.e2e.test.js +285 -0
  264. package/dist/session-commands.e2e.test.js.map +1 -0
  265. package/dist/session-events.d.ts +55 -0
  266. package/dist/session-events.js +190 -0
  267. package/dist/session-events.js.map +1 -0
  268. package/dist/session-ops.e2e.test.d.ts +1 -0
  269. package/dist/session-ops.e2e.test.js +114 -0
  270. package/dist/session-ops.e2e.test.js.map +1 -0
  271. package/dist/sessions.d.ts +121 -0
  272. package/dist/sessions.js +662 -0
  273. package/dist/sessions.js.map +1 -0
  274. package/dist/shell.e2e.test.d.ts +1 -0
  275. package/dist/shell.e2e.test.js +147 -0
  276. package/dist/shell.e2e.test.js.map +1 -0
  277. package/dist/slash-commands.d.ts +62 -0
  278. package/dist/slash-commands.js +475 -0
  279. package/dist/slash-commands.js.map +1 -0
  280. package/dist/slash-commands.test.d.ts +1 -0
  281. package/dist/slash-commands.test.js +87 -0
  282. package/dist/slash-commands.test.js.map +1 -0
  283. package/dist/sleep.e2e.test.d.ts +1 -0
  284. package/dist/sleep.e2e.test.js +115 -487
  285. package/dist/sleep.e2e.test.js.map +1 -0
  286. package/dist/sleeps.d.ts +37 -0
  287. package/dist/sleeps.js +220 -0
  288. package/dist/sleeps.js.map +1 -0
  289. package/dist/store.d.ts +10 -0
  290. package/dist/store.js +8 -28
  291. package/dist/store.js.map +1 -0
  292. package/dist/system-prompt.d.ts +65 -0
  293. package/dist/system-prompt.js +875 -0
  294. package/dist/system-prompt.js.map +1 -0
  295. package/dist/tasks.e2e.test.d.ts +1 -0
  296. package/dist/tasks.e2e.test.js +173 -0
  297. package/dist/tasks.e2e.test.js.map +1 -0
  298. package/dist/test/auth-plugin/index.d.ts +3 -0
  299. package/dist/test/auth-plugin/index.js +18 -0
  300. package/dist/test/auth-plugin/index.js.map +1 -0
  301. package/dist/test/fake-mcp-server.d.ts +1 -0
  302. package/dist/test/fake-mcp-server.js +45 -0
  303. package/dist/test/fake-mcp-server.js.map +1 -0
  304. package/dist/test/harness.d.ts +246 -0
  305. package/dist/test/harness.js +704 -0
  306. package/dist/test/harness.js.map +1 -0
  307. package/dist/test/replay.d.ts +14 -0
  308. package/dist/test/replay.js +75 -0
  309. package/dist/test/replay.js.map +1 -0
  310. package/dist/thread-reducer.d.ts +172 -0
  311. package/dist/thread-reducer.fixtures.test.d.ts +1 -0
  312. package/dist/thread-reducer.fixtures.test.js +360 -0
  313. package/dist/thread-reducer.fixtures.test.js.map +1 -0
  314. package/dist/thread-reducer.js +497 -0
  315. package/dist/thread-reducer.js.map +1 -0
  316. package/dist/thread-reducer.test.d.ts +1 -0
  317. package/dist/thread-reducer.test.js +369 -0
  318. package/dist/thread-reducer.test.js.map +1 -0
  319. package/dist/tts.test.d.ts +1 -0
  320. package/dist/tts.test.js +147 -0
  321. package/dist/tts.test.js.map +1 -0
  322. package/dist/voice-agent.d.ts +33 -0
  323. package/dist/voice-agent.js +159 -0
  324. package/dist/voice-agent.js.map +1 -0
  325. package/dist/voice-attachments.e2e.test.d.ts +1 -0
  326. package/dist/voice-attachments.e2e.test.js +253 -0
  327. package/dist/voice-attachments.e2e.test.js.map +1 -0
  328. package/dist/voice-call.d.ts +59 -0
  329. package/dist/voice-call.e2e.test.d.ts +1 -0
  330. package/dist/voice-call.e2e.test.js +259 -0
  331. package/dist/voice-call.e2e.test.js.map +1 -0
  332. package/dist/voice-call.js +760 -0
  333. package/dist/voice-call.js.map +1 -0
  334. package/dist/voice-openai.e2e.test.d.ts +1 -0
  335. package/dist/voice-openai.e2e.test.js +161 -0
  336. package/dist/voice-openai.e2e.test.js.map +1 -0
  337. package/dist/voice.d.ts +116 -0
  338. package/dist/voice.js +648 -646
  339. package/dist/voice.js.map +1 -0
  340. package/dist/working-directory.e2e.test.d.ts +1 -0
  341. package/dist/working-directory.e2e.test.js +231 -0
  342. package/dist/working-directory.e2e.test.js.map +1 -0
  343. package/dist/worktrees.d.ts +54 -0
  344. package/dist/worktrees.js +247 -709
  345. package/dist/worktrees.js.map +1 -0
  346. package/dist/worktrees.test.d.ts +1 -0
  347. package/dist/worktrees.test.js +97 -952
  348. package/dist/worktrees.test.js.map +1 -0
  349. package/package.json +40 -79
  350. package/src/agent-ui.e2e.test.ts +134 -0
  351. package/src/agent-ui.ts +216 -0
  352. package/src/analytics.e2e.test.ts +138 -0
  353. package/src/analytics.test.ts +122 -182
  354. package/src/analytics.ts +206 -256
  355. package/src/autostart.ts +78 -0
  356. package/src/bot.ts +194 -0
  357. package/src/btw.e2e.test.ts +130 -0
  358. package/src/catalog-refresh.e2e.test.ts +112 -0
  359. package/src/cli/bot.ts +419 -0
  360. package/src/cli/discord.ts +116 -0
  361. package/src/cli/project.ts +147 -0
  362. package/src/cli/schedule.ts +151 -0
  363. package/src/cli/session.ts +285 -0
  364. package/src/cli/shared.ts +139 -0
  365. package/src/cli-discord.e2e.test.ts +62 -0
  366. package/src/cli-lock.e2e.test.ts +530 -0
  367. package/src/cli-read.e2e.test.ts +78 -0
  368. package/src/cli-sessions.e2e.test.ts +122 -0
  369. package/src/cli.ts +35 -418
  370. package/src/commands/login-commands.ts +360 -0
  371. package/src/commands/preference-commands.ts +586 -0
  372. package/src/commands/session-commands.ts +289 -0
  373. package/src/commands/thread-commands.ts +324 -0
  374. package/src/commands/worktree-commands.ts +288 -0
  375. package/src/commands.e2e.test.ts +290 -0
  376. package/src/credentials.ts +425 -0
  377. package/src/db.test.ts +345 -748
  378. package/src/db.ts +66 -284
  379. package/src/duration.ts +18 -0
  380. package/src/effects.ts +303 -0
  381. package/src/errors.ts +39 -222
  382. package/src/event-loop.ts +462 -0
  383. package/src/file-edit-log.test.ts +68 -272
  384. package/src/file-edit-log.ts +108 -231
  385. package/src/fixtures/v1-schema.sql +241 -0
  386. package/src/fixtures/voice.ogg +0 -0
  387. package/src/format-parts.test.ts +150 -0
  388. package/src/format-parts.ts +405 -0
  389. package/src/gateway-replay.e2e.test.ts +116 -0
  390. package/src/harness.e2e.test.ts +124 -0
  391. package/src/hello-thread.e2e.test.ts +223 -0
  392. package/src/ingress.ts +334 -0
  393. package/src/interaction-context.ts +131 -0
  394. package/src/interrupt.e2e.test.ts +151 -0
  395. package/src/legacy.e2e.test.ts +105 -0
  396. package/src/live-call.ts +249 -0
  397. package/src/lock-routes.ts +625 -0
  398. package/src/lock-server.ts +233 -0
  399. package/src/logger.ts +120 -207
  400. package/src/login.e2e.test.ts +86 -0
  401. package/src/main.ts +230 -0
  402. package/src/markdown/components.ts +102 -0
  403. package/src/markdown/markdown.test.ts +414 -0
  404. package/src/markdown/render-markdown.ts +288 -0
  405. package/src/migrations.ts +198 -0
  406. package/src/onboarding-cli.e2e.test.ts +215 -0
  407. package/src/onboarding.e2e.test.ts +171 -0
  408. package/src/onboarding.ts +297 -0
  409. package/src/opencode-server.test.ts +24 -0
  410. package/src/opencode-server.ts +461 -0
  411. package/src/permissions.e2e.test.ts +191 -0
  412. package/src/permissions.ts +121 -0
  413. package/src/plugin/anthropic/index.test.ts +39 -0
  414. package/src/plugin/anthropic/index.ts +213 -0
  415. package/src/plugin/index.ts +93 -0
  416. package/src/plugin/session-id/index.ts +19 -0
  417. package/src/plugin.e2e.test.ts +112 -0
  418. package/src/preference-commands.e2e.test.ts +597 -0
  419. package/src/project.ts +216 -0
  420. package/src/prompt.ts +664 -0
  421. package/src/questions.e2e.test.ts +328 -0
  422. package/src/questions.ts +322 -0
  423. package/src/queue.e2e.test.ts +253 -0
  424. package/src/queue.ts +158 -0
  425. package/src/remote-send.e2e.test.ts +91 -0
  426. package/src/remote-send.ts +110 -0
  427. package/src/renderer.e2e.test.ts +390 -0
  428. package/src/restart.e2e.test.ts +90 -0
  429. package/src/routes.test.ts +81 -0
  430. package/src/routes.ts +48 -0
  431. package/src/routines.e2e.test.ts +210 -0
  432. package/src/scheduler.e2e.test.ts +182 -0
  433. package/src/scheduler.test.ts +183 -0
  434. package/src/scheduler.ts +648 -0
  435. package/src/schema-sql.ts +3 -0
  436. package/src/schema.ts +95 -271
  437. package/src/session-commands.e2e.test.ts +326 -0
  438. package/src/session-events.ts +218 -0
  439. package/src/session-ops.e2e.test.ts +141 -0
  440. package/src/sessions.ts +803 -0
  441. package/src/shell.e2e.test.ts +173 -0
  442. package/src/slash-commands.test.ts +89 -0
  443. package/src/slash-commands.ts +539 -0
  444. package/src/sleep.e2e.test.ts +135 -552
  445. package/src/sleeps.ts +230 -0
  446. package/src/store.ts +19 -217
  447. package/src/system-prompt.ts +944 -0
  448. package/src/test/auth-plugin/index.ts +17 -0
  449. package/src/test/fake-mcp-server.ts +49 -0
  450. package/src/test/harness.ts +957 -0
  451. package/src/test/replay.ts +90 -0
  452. package/src/thread-reducer.fixtures.test.ts +374 -0
  453. package/src/thread-reducer.test.ts +380 -0
  454. package/src/thread-reducer.ts +671 -0
  455. package/src/tts.test.ts +150 -0
  456. package/src/voice-agent.ts +196 -0
  457. package/src/voice-attachments.e2e.test.ts +298 -0
  458. package/src/voice-call.e2e.test.ts +293 -0
  459. package/src/voice-call.ts +764 -0
  460. package/src/voice-openai.e2e.test.ts +191 -0
  461. package/src/voice.ts +691 -890
  462. package/src/working-directory.e2e.test.ts +226 -0
  463. package/src/worktrees.test.ts +89 -1115
  464. package/src/worktrees.ts +195 -957
  465. package/bin.js +0 -2
  466. package/dist/agent-model.e2e.test.js +0 -1215
  467. package/dist/ai-tool-to-genai.js +0 -233
  468. package/dist/ai-tool-to-genai.test.js +0 -267
  469. package/dist/ai-tool.js +0 -6
  470. package/dist/anthropic-account-identity.js +0 -70
  471. package/dist/anthropic-account-identity.test.js +0 -38
  472. package/dist/anthropic-auth-plugin.js +0 -958
  473. package/dist/anthropic-auth-plugin.test.js +0 -115
  474. package/dist/anthropic-auth-state.js +0 -186
  475. package/dist/anthropic-auth-state.test.js +0 -203
  476. package/dist/bash-tool-schema-plugin.js +0 -50
  477. package/dist/bash-tool-schema-plugin.test.js +0 -68
  478. package/dist/bin.js +0 -151
  479. package/dist/bot-lifecycle.test.js +0 -206
  480. package/dist/btw-prefix-detection.js +0 -15
  481. package/dist/btw-prefix-detection.test.js +0 -93
  482. package/dist/cache-drift-plugin.js +0 -183
  483. package/dist/cache-rewrite.js +0 -39
  484. package/dist/cache-rewrite.test.js +0 -41
  485. package/dist/channel-management.js +0 -347
  486. package/dist/cli-commands/bot.js +0 -254
  487. package/dist/cli-commands/maintenance.js +0 -171
  488. package/dist/cli-commands/misc.js +0 -153
  489. package/dist/cli-commands/project.js +0 -510
  490. package/dist/cli-commands/send.js +0 -659
  491. package/dist/cli-commands/session.js +0 -889
  492. package/dist/cli-commands/task.js +0 -277
  493. package/dist/cli-commands/thread.js +0 -63
  494. package/dist/cli-commands/user.js +0 -145
  495. package/dist/cli-parsing.test.js +0 -226
  496. package/dist/cli-runner.js +0 -1579
  497. package/dist/cli-runner.test.js +0 -86
  498. package/dist/cli-send-thread.e2e.test.js +0 -470
  499. package/dist/cloudflare-transcription.js +0 -56
  500. package/dist/commands/abort.js +0 -84
  501. package/dist/commands/action-buttons.js +0 -248
  502. package/dist/commands/add-project.js +0 -111
  503. package/dist/commands/agent.js +0 -658
  504. package/dist/commands/ask-question.js +0 -371
  505. package/dist/commands/ask-question.test.js +0 -150
  506. package/dist/commands/btw.js +0 -167
  507. package/dist/commands/compact.js +0 -117
  508. package/dist/commands/context-usage.js +0 -147
  509. package/dist/commands/create-new-project.js +0 -138
  510. package/dist/commands/diff.js +0 -63
  511. package/dist/commands/file-upload.js +0 -280
  512. package/dist/commands/fork-subagent.js +0 -175
  513. package/dist/commands/fork.js +0 -260
  514. package/dist/commands/gemini-apikey.js +0 -123
  515. package/dist/commands/last-sessions.js +0 -129
  516. package/dist/commands/login.js +0 -893
  517. package/dist/commands/mcp.js +0 -239
  518. package/dist/commands/memory-snapshot.js +0 -24
  519. package/dist/commands/mention-mode.js +0 -42
  520. package/dist/commands/merge-worktree.js +0 -205
  521. package/dist/commands/model-variant.js +0 -390
  522. package/dist/commands/model.js +0 -957
  523. package/dist/commands/multioauth.js +0 -425
  524. package/dist/commands/new-worktree.js +0 -622
  525. package/dist/commands/paginated-select.js +0 -57
  526. package/dist/commands/permissions.js +0 -327
  527. package/dist/commands/queue.js +0 -340
  528. package/dist/commands/queue.test.js +0 -15
  529. package/dist/commands/remove-project.js +0 -111
  530. package/dist/commands/restart-opencode-server.js +0 -133
  531. package/dist/commands/resume.js +0 -148
  532. package/dist/commands/run-command.js +0 -79
  533. package/dist/commands/screenshare.js +0 -307
  534. package/dist/commands/screenshare.test.js +0 -20
  535. package/dist/commands/session-id.js +0 -78
  536. package/dist/commands/session.js +0 -243
  537. package/dist/commands/share.js +0 -80
  538. package/dist/commands/tasks.js +0 -296
  539. package/dist/commands/types.js +0 -2
  540. package/dist/commands/undo-redo.js +0 -313
  541. package/dist/commands/unset-model.js +0 -116
  542. package/dist/commands/upgrade.js +0 -41
  543. package/dist/commands/user-command.js +0 -196
  544. package/dist/commands/verbosity.js +0 -124
  545. package/dist/commands/vscode.js +0 -295
  546. package/dist/commands/worktrees.js +0 -548
  547. package/dist/condense-memory.js +0 -33
  548. package/dist/config.js +0 -126
  549. package/dist/context-awareness-plugin.js +0 -357
  550. package/dist/context-awareness-plugin.test.js +0 -126
  551. package/dist/cpu-profiler.js +0 -211
  552. package/dist/cpu-profiler.test.js +0 -160
  553. package/dist/critique-utils.js +0 -95
  554. package/dist/database.js +0 -1074
  555. package/dist/debounce-timeout.js +0 -28
  556. package/dist/debounced-process-flush.js +0 -77
  557. package/dist/default-channel-provisioning.test.js +0 -149
  558. package/dist/discord-bot.js +0 -1409
  559. package/dist/discord-command-registration.js +0 -519
  560. package/dist/discord-command-registration.test.js +0 -17
  561. package/dist/discord-urls.js +0 -81
  562. package/dist/discord-utils.js +0 -789
  563. package/dist/discord-utils.test.js +0 -400
  564. package/dist/escape-backticks.test.js +0 -429
  565. package/dist/event-stream-real-capture.e2e.test.js +0 -533
  566. package/dist/eventsource-parser.test.js +0 -327
  567. package/dist/exec-async.js +0 -38
  568. package/dist/external-directory-permissions.e2e.test.js +0 -86
  569. package/dist/external-directory-project-deny.e2e.test.js +0 -70
  570. package/dist/external-opencode-sync.js +0 -620
  571. package/dist/external-opencode-sync.test.js +0 -206
  572. package/dist/extract-sdk-error-message.test.js +0 -13
  573. package/dist/format-tables.js +0 -728
  574. package/dist/format-tables.test.js +0 -915
  575. package/dist/forum-sync/config.js +0 -79
  576. package/dist/forum-sync/discord-operations.js +0 -157
  577. package/dist/forum-sync/index.js +0 -5
  578. package/dist/forum-sync/markdown.js +0 -110
  579. package/dist/forum-sync/sync-to-discord.js +0 -417
  580. package/dist/forum-sync/sync-to-files.js +0 -190
  581. package/dist/forum-sync/types.js +0 -53
  582. package/dist/forum-sync/watchers.js +0 -322
  583. package/dist/gateway-proxy-reconnect.e2e.test.js +0 -414
  584. package/dist/gateway-proxy.e2e.test.js +0 -488
  585. package/dist/genai-worker-wrapper.js +0 -111
  586. package/dist/genai-worker.js +0 -309
  587. package/dist/genai.js +0 -232
  588. package/dist/git-worktree-core.js +0 -461
  589. package/dist/guild-categories.test.js +0 -225
  590. package/dist/heap-monitor.js +0 -122
  591. package/dist/hrana-server.js +0 -322
  592. package/dist/hrana-server.test.js +0 -99
  593. package/dist/html-actions.js +0 -123
  594. package/dist/html-actions.test.js +0 -70
  595. package/dist/html-components.js +0 -115
  596. package/dist/html-components.test.js +0 -34
  597. package/dist/image-optimizer-plugin.js +0 -153
  598. package/dist/image-utils.js +0 -112
  599. package/dist/interaction-handler.js +0 -578
  600. package/dist/ipc-polling.js +0 -245
  601. package/dist/ipc-tools-plugin.js +0 -251
  602. package/dist/kimaki-digital-twin.e2e.test.js +0 -161
  603. package/dist/kimaki-opencode-plugin-loading.e2e.test.js +0 -158
  604. package/dist/kimaki-opencode-plugin.js +0 -33
  605. package/dist/kimaki-opencode-plugin.test.js +0 -126
  606. package/dist/kimaki-workspace-adaptor.js +0 -118
  607. package/dist/limit-heading-depth.js +0 -25
  608. package/dist/limit-heading-depth.test.js +0 -105
  609. package/dist/list-channel-threads.js +0 -163
  610. package/dist/list-channel-threads.test.js +0 -80
  611. package/dist/markdown.js +0 -455
  612. package/dist/markdown.test.js +0 -411
  613. package/dist/memory-overview-plugin.js +0 -123
  614. package/dist/message-formatting.js +0 -763
  615. package/dist/message-formatting.test.js +0 -1132
  616. package/dist/message-preprocessing.js +0 -441
  617. package/dist/oauth-rotation-shared.js +0 -253
  618. package/dist/onboarding-tutorial.js +0 -163
  619. package/dist/onboarding-welcome.js +0 -37
  620. package/dist/openai-auth-plugin.js +0 -125
  621. package/dist/openai-auth-state.js +0 -237
  622. package/dist/openai-realtime.js +0 -224
  623. package/dist/opencode-command-detection.js +0 -65
  624. package/dist/opencode-command-detection.test.js +0 -240
  625. package/dist/opencode-command.js +0 -181
  626. package/dist/opencode-command.test.js +0 -218
  627. package/dist/opencode-interrupt-plugin.js +0 -253
  628. package/dist/opencode-interrupt-plugin.test.js +0 -293
  629. package/dist/opencode.js +0 -1217
  630. package/dist/parse-permission-rules.test.js +0 -117
  631. package/dist/patch-text-parser.js +0 -97
  632. package/dist/plugin-logger.js +0 -105
  633. package/dist/plugin-opencode-client.js +0 -54
  634. package/dist/privacy-sanitizer.js +0 -105
  635. package/dist/project-add.test.js +0 -62
  636. package/dist/question-abort-clears-dropdown.e2e.test.js +0 -89
  637. package/dist/question-abort-resume.e2e.test.js +0 -100
  638. package/dist/question-abort-retry-text-before-dropdown.e2e.test.js +0 -150
  639. package/dist/question-text-before-dropdown.e2e.test.js +0 -52
  640. package/dist/queue-advanced-abort.e2e.test.js +0 -348
  641. package/dist/queue-advanced-action-buttons.e2e.test.js +0 -209
  642. package/dist/queue-advanced-e2e-setup.js +0 -1043
  643. package/dist/queue-advanced-footer.e2e.test.js +0 -286
  644. package/dist/queue-advanced-model-switch.e2e.test.js +0 -297
  645. package/dist/queue-advanced-permissions-typing.e2e.test.js +0 -189
  646. package/dist/queue-advanced-question.e2e.test.js +0 -266
  647. package/dist/queue-advanced-typing-interrupt.e2e.test.js +0 -113
  648. package/dist/queue-advanced-typing.e2e.test.js +0 -151
  649. package/dist/queue-delete-message.e2e.test.js +0 -75
  650. package/dist/queue-drain-after-interactive-ui.e2e.test.js +0 -120
  651. package/dist/queue-interrupt-drain.e2e.test.js +0 -246
  652. package/dist/queue-question-select-drain.e2e.test.js +0 -162
  653. package/dist/runtime-idle-sweeper.js +0 -52
  654. package/dist/runtime-lifecycle.e2e.test.js +0 -570
  655. package/dist/sentry.js +0 -23
  656. package/dist/session-handler/agent-utils.js +0 -66
  657. package/dist/session-handler/event-stream-state.js +0 -1217
  658. package/dist/session-handler/event-stream-state.test.js +0 -3034
  659. package/dist/session-handler/global-event-listener.js +0 -212
  660. package/dist/session-handler/model-utils.js +0 -311
  661. package/dist/session-handler/model-utils.test.js +0 -445
  662. package/dist/session-handler/opencode-session-event-log.js +0 -121
  663. package/dist/session-handler/thread-ingress.test.js +0 -41
  664. package/dist/session-handler/thread-runtime-state.js +0 -209
  665. package/dist/session-handler/thread-session-runtime-summary.test.js +0 -121
  666. package/dist/session-handler/thread-session-runtime.js +0 -4252
  667. package/dist/session-handler.js +0 -9
  668. package/dist/session-search.js +0 -219
  669. package/dist/session-search.test.js +0 -287
  670. package/dist/session-sleep.test.js +0 -224
  671. package/dist/session-title-rename.test.js +0 -128
  672. package/dist/skill-filter.js +0 -43
  673. package/dist/skill-filter.test.js +0 -86
  674. package/dist/startup-service.js +0 -153
  675. package/dist/startup-time.e2e.test.js +0 -297
  676. package/dist/system-message.js +0 -984
  677. package/dist/system-message.test.js +0 -1093
  678. package/dist/task-id-plugin.js +0 -16
  679. package/dist/task-runner.js +0 -554
  680. package/dist/task-schedule.js +0 -298
  681. package/dist/task-schedule.test.js +0 -366
  682. package/dist/test-utils.js +0 -359
  683. package/dist/thinking-utils.js +0 -45
  684. package/dist/thinking-utils.test.js +0 -35
  685. package/dist/thread-message-queue.e2e.test.js +0 -1155
  686. package/dist/tools.js +0 -357
  687. package/dist/undo-redo.e2e.test.js +0 -171
  688. package/dist/unnest-code-blocks.js +0 -146
  689. package/dist/unnest-code-blocks.test.js +0 -673
  690. package/dist/upgrade.js +0 -114
  691. package/dist/utils.js +0 -148
  692. package/dist/voice-attachment.js +0 -56
  693. package/dist/voice-handler.js +0 -726
  694. package/dist/voice-message.e2e.test.js +0 -1263
  695. package/dist/voice-routing-input.e2e.test.js +0 -195
  696. package/dist/voice-routing-question.e2e.test.js +0 -125
  697. package/dist/voice.test.js +0 -352
  698. package/dist/wait-session.js +0 -193
  699. package/dist/websockify.js +0 -69
  700. package/dist/worker-types.js +0 -4
  701. package/dist/worktree-clone-isolation.e2e.test.js +0 -188
  702. package/dist/worktree-lifecycle.e2e.test.js +0 -735
  703. package/dist/worktree-utils.js +0 -3
  704. package/dist/xai-auth-plugin.js +0 -238
  705. package/dist/xai-auth-state.js +0 -234
  706. package/dist/xai-auth-state.test.js +0 -183
  707. package/dist/xml.js +0 -92
  708. package/dist/xml.test.js +0 -32
  709. package/skills/bump-holocron-consumers/SKILL.md +0 -137
  710. package/skills/critique/SKILL.md +0 -112
  711. package/skills/egaki/SKILL.md +0 -86
  712. package/skills/errore/SKILL.md +0 -501
  713. package/skills/goke/SKILL.md +0 -695
  714. package/skills/holocron/SKILL.md +0 -942
  715. package/skills/lintcn/SKILL.md +0 -873
  716. package/skills/new-skill/SKILL.md +0 -339
  717. package/skills/npm-package/SKILL.md +0 -692
  718. package/skills/opensrc/SKILL.md +0 -95
  719. package/skills/playwriter/SKILL.md +0 -35
  720. package/skills/profano/SKILL.md +0 -33
  721. package/skills/readme.md +0 -20
  722. package/skills/sigillo/SKILL.md +0 -370
  723. package/skills/spiceflow/SKILL.md +0 -80
  724. package/skills/strada/SKILL.md +0 -104
  725. package/skills/termcast/SKILL.md +0 -133
  726. package/skills/tuistory/SKILL.md +0 -237
  727. package/skills/usecomputer/SKILL.md +0 -264
  728. package/skills/zele/SKILL.md +0 -81
  729. package/src/agent-model.e2e.test.ts +0 -1548
  730. package/src/ai-tool-to-genai.test.ts +0 -296
  731. package/src/ai-tool-to-genai.ts +0 -283
  732. package/src/ai-tool.ts +0 -39
  733. package/src/anthropic-account-identity.test.ts +0 -52
  734. package/src/anthropic-account-identity.ts +0 -96
  735. package/src/anthropic-auth-plugin.test.ts +0 -135
  736. package/src/anthropic-auth-plugin.ts +0 -1180
  737. package/src/anthropic-auth-state.test.ts +0 -259
  738. package/src/anthropic-auth-state.ts +0 -272
  739. package/src/bash-tool-schema-plugin.test.ts +0 -84
  740. package/src/bash-tool-schema-plugin.ts +0 -77
  741. package/src/bin.ts +0 -173
  742. package/src/bot-lifecycle.test.ts +0 -252
  743. package/src/btw-prefix-detection.test.ts +0 -104
  744. package/src/btw-prefix-detection.ts +0 -19
  745. package/src/cache-drift-plugin.ts +0 -249
  746. package/src/cache-rewrite.test.ts +0 -49
  747. package/src/cache-rewrite.ts +0 -96
  748. package/src/channel-management.ts +0 -494
  749. package/src/cli-commands/bot.ts +0 -374
  750. package/src/cli-commands/maintenance.ts +0 -237
  751. package/src/cli-commands/misc.ts +0 -208
  752. package/src/cli-commands/project.ts +0 -680
  753. package/src/cli-commands/send.ts +0 -879
  754. package/src/cli-commands/session.ts +0 -1181
  755. package/src/cli-commands/task.ts +0 -358
  756. package/src/cli-commands/thread.ts +0 -86
  757. package/src/cli-commands/user.ts +0 -195
  758. package/src/cli-parsing.test.ts +0 -305
  759. package/src/cli-runner.test.ts +0 -129
  760. package/src/cli-runner.ts +0 -2141
  761. package/src/cli-send-thread.e2e.test.ts +0 -609
  762. package/src/cloudflare-transcription.ts +0 -76
  763. package/src/commands/abort.ts +0 -113
  764. package/src/commands/action-buttons.ts +0 -371
  765. package/src/commands/add-project.ts +0 -146
  766. package/src/commands/agent.ts +0 -911
  767. package/src/commands/ask-question.test.ts +0 -177
  768. package/src/commands/ask-question.ts +0 -532
  769. package/src/commands/btw.ts +0 -246
  770. package/src/commands/compact.ts +0 -154
  771. package/src/commands/context-usage.ts +0 -208
  772. package/src/commands/create-new-project.ts +0 -203
  773. package/src/commands/diff.ts +0 -91
  774. package/src/commands/file-upload.ts +0 -398
  775. package/src/commands/fork-subagent.ts +0 -262
  776. package/src/commands/fork.ts +0 -388
  777. package/src/commands/gemini-apikey.ts +0 -205
  778. package/src/commands/last-sessions.ts +0 -176
  779. package/src/commands/login.ts +0 -1182
  780. package/src/commands/mcp.ts +0 -307
  781. package/src/commands/memory-snapshot.ts +0 -30
  782. package/src/commands/mention-mode.ts +0 -66
  783. package/src/commands/merge-worktree.ts +0 -282
  784. package/src/commands/model-variant.ts +0 -522
  785. package/src/commands/model.ts +0 -1310
  786. package/src/commands/multioauth.ts +0 -508
  787. package/src/commands/new-worktree.ts +0 -832
  788. package/src/commands/paginated-select.ts +0 -81
  789. package/src/commands/permissions.ts +0 -458
  790. package/src/commands/queue.test.ts +0 -19
  791. package/src/commands/queue.ts +0 -455
  792. package/src/commands/remove-project.ts +0 -152
  793. package/src/commands/restart-opencode-server.ts +0 -173
  794. package/src/commands/resume.ts +0 -229
  795. package/src/commands/run-command.ts +0 -123
  796. package/src/commands/screenshare.test.ts +0 -30
  797. package/src/commands/screenshare.ts +0 -388
  798. package/src/commands/session-id.ts +0 -109
  799. package/src/commands/session.ts +0 -311
  800. package/src/commands/share.ts +0 -106
  801. package/src/commands/tasks.ts +0 -399
  802. package/src/commands/types.ts +0 -25
  803. package/src/commands/undo-redo.ts +0 -394
  804. package/src/commands/unset-model.ts +0 -152
  805. package/src/commands/upgrade.ts +0 -51
  806. package/src/commands/user-command.ts +0 -260
  807. package/src/commands/verbosity.ts +0 -172
  808. package/src/commands/vscode.ts +0 -378
  809. package/src/commands/worktrees.ts +0 -762
  810. package/src/condense-memory.ts +0 -36
  811. package/src/config.ts +0 -147
  812. package/src/context-awareness-plugin.test.ts +0 -144
  813. package/src/context-awareness-plugin.ts +0 -508
  814. package/src/cpu-profiler.test.ts +0 -183
  815. package/src/cpu-profiler.ts +0 -293
  816. package/src/critique-utils.ts +0 -139
  817. package/src/database.ts +0 -1484
  818. package/src/debounce-timeout.ts +0 -43
  819. package/src/debounced-process-flush.ts +0 -104
  820. package/src/default-channel-provisioning.test.ts +0 -156
  821. package/src/discord-bot.ts +0 -1836
  822. package/src/discord-command-registration.test.ts +0 -20
  823. package/src/discord-command-registration.ts +0 -704
  824. package/src/discord-urls.ts +0 -88
  825. package/src/discord-utils.test.ts +0 -470
  826. package/src/discord-utils.ts +0 -1079
  827. package/src/escape-backticks.test.ts +0 -469
  828. package/src/event-stream-real-capture.e2e.test.ts +0 -692
  829. package/src/eventsource-parser.test.ts +0 -351
  830. package/src/exec-async.ts +0 -44
  831. package/src/external-directory-permissions.e2e.test.ts +0 -103
  832. package/src/external-directory-project-deny.e2e.test.ts +0 -84
  833. package/src/external-opencode-sync.test.ts +0 -248
  834. package/src/external-opencode-sync.ts +0 -867
  835. package/src/extract-sdk-error-message.test.ts +0 -18
  836. package/src/format-tables.test.ts +0 -988
  837. package/src/format-tables.ts +0 -1031
  838. package/src/forum-sync/config.ts +0 -92
  839. package/src/forum-sync/discord-operations.ts +0 -245
  840. package/src/forum-sync/index.ts +0 -9
  841. package/src/forum-sync/markdown.ts +0 -172
  842. package/src/forum-sync/sync-to-discord.ts +0 -595
  843. package/src/forum-sync/sync-to-files.ts +0 -294
  844. package/src/forum-sync/types.ts +0 -175
  845. package/src/forum-sync/watchers.ts +0 -474
  846. package/src/gateway-proxy-reconnect.e2e.test.ts +0 -553
  847. package/src/gateway-proxy.e2e.test.ts +0 -648
  848. package/src/genai-worker-wrapper.ts +0 -164
  849. package/src/genai-worker.ts +0 -385
  850. package/src/genai.ts +0 -318
  851. package/src/git-worktree-core.ts +0 -616
  852. package/src/guild-categories.test.ts +0 -260
  853. package/src/heap-monitor.ts +0 -152
  854. package/src/hrana-server.test.ts +0 -130
  855. package/src/hrana-server.ts +0 -399
  856. package/src/html-actions.test.ts +0 -87
  857. package/src/html-actions.ts +0 -174
  858. package/src/html-components.test.ts +0 -38
  859. package/src/html-components.ts +0 -177
  860. package/src/image-optimizer-plugin.ts +0 -194
  861. package/src/image-utils.ts +0 -150
  862. package/src/interaction-handler.ts +0 -775
  863. package/src/ipc-polling.ts +0 -325
  864. package/src/ipc-tools-plugin.ts +0 -306
  865. package/src/kimaki-digital-twin.e2e.test.ts +0 -199
  866. package/src/kimaki-opencode-plugin-loading.e2e.test.ts +0 -208
  867. package/src/kimaki-opencode-plugin.test.ts +0 -142
  868. package/src/kimaki-opencode-plugin.ts +0 -34
  869. package/src/kimaki-workspace-adaptor.ts +0 -144
  870. package/src/limit-heading-depth.test.ts +0 -116
  871. package/src/limit-heading-depth.ts +0 -26
  872. package/src/list-channel-threads.test.ts +0 -90
  873. package/src/list-channel-threads.ts +0 -252
  874. package/src/markdown.test.ts +0 -498
  875. package/src/markdown.ts +0 -577
  876. package/src/memory-overview-plugin.ts +0 -159
  877. package/src/message-formatting.test.ts +0 -1401
  878. package/src/message-formatting.ts +0 -972
  879. package/src/message-preprocessing.ts +0 -579
  880. package/src/oauth-rotation-shared.ts +0 -332
  881. package/src/onboarding-tutorial.ts +0 -167
  882. package/src/onboarding-welcome.ts +0 -49
  883. package/src/openai-auth-plugin.ts +0 -158
  884. package/src/openai-auth-state.ts +0 -297
  885. package/src/openai-realtime.ts +0 -358
  886. package/src/opencode-command-detection.test.ts +0 -307
  887. package/src/opencode-command-detection.ts +0 -76
  888. package/src/opencode-command.test.ts +0 -290
  889. package/src/opencode-command.ts +0 -251
  890. package/src/opencode-interrupt-plugin.test.ts +0 -419
  891. package/src/opencode-interrupt-plugin.ts +0 -306
  892. package/src/opencode.ts +0 -1590
  893. package/src/parse-permission-rules.test.ts +0 -127
  894. package/src/patch-text-parser.ts +0 -107
  895. package/src/plugin-logger.ts +0 -139
  896. package/src/plugin-opencode-client.ts +0 -71
  897. package/src/privacy-sanitizer.ts +0 -142
  898. package/src/project-add.test.ts +0 -80
  899. package/src/question-abort-clears-dropdown.e2e.test.ts +0 -109
  900. package/src/question-abort-resume.e2e.test.ts +0 -121
  901. package/src/question-abort-retry-text-before-dropdown.e2e.test.ts +0 -172
  902. package/src/question-text-before-dropdown.e2e.test.ts +0 -67
  903. package/src/queue-advanced-abort.e2e.test.ts +0 -449
  904. package/src/queue-advanced-action-buttons.e2e.test.ts +0 -271
  905. package/src/queue-advanced-e2e-setup.ts +0 -1164
  906. package/src/queue-advanced-footer.e2e.test.ts +0 -357
  907. package/src/queue-advanced-model-switch.e2e.test.ts +0 -382
  908. package/src/queue-advanced-permissions-typing.e2e.test.ts +0 -256
  909. package/src/queue-advanced-question.e2e.test.ts +0 -322
  910. package/src/queue-advanced-typing-interrupt.e2e.test.ts +0 -147
  911. package/src/queue-advanced-typing.e2e.test.ts +0 -199
  912. package/src/queue-delete-message.e2e.test.ts +0 -102
  913. package/src/queue-drain-after-interactive-ui.e2e.test.ts +0 -152
  914. package/src/queue-interrupt-drain.e2e.test.ts +0 -288
  915. package/src/queue-question-select-drain.e2e.test.ts +0 -206
  916. package/src/runtime-idle-sweeper.ts +0 -76
  917. package/src/runtime-lifecycle.e2e.test.ts +0 -714
  918. package/src/schema.sql +0 -251
  919. package/src/sentry.ts +0 -26
  920. package/src/session-handler/agent-utils.ts +0 -99
  921. package/src/session-handler/event-stream-fixtures/real-session-action-buttons.jsonl +0 -45
  922. package/src/session-handler/event-stream-fixtures/real-session-footer-suppressed-on-pre-idle-interrupt.jsonl +0 -40
  923. package/src/session-handler/event-stream-fixtures/real-session-permission-external-file.jsonl +0 -23
  924. package/src/session-handler/event-stream-fixtures/real-session-task-normal.jsonl +0 -22
  925. package/src/session-handler/event-stream-fixtures/real-session-task-three-parallel-sleeps.jsonl +0 -277
  926. package/src/session-handler/event-stream-fixtures/real-session-task-user-interruption.jsonl +0 -46
  927. package/src/session-handler/event-stream-fixtures/session-abort-after-idle-race.jsonl +0 -21
  928. package/src/session-handler/event-stream-fixtures/session-concurrent-messages-serialized.jsonl +0 -56
  929. package/src/session-handler/event-stream-fixtures/session-explicit-abort.jsonl +0 -44
  930. package/src/session-handler/event-stream-fixtures/session-normal-completion.jsonl +0 -29
  931. package/src/session-handler/event-stream-fixtures/session-tool-call-noisy-stream.jsonl +0 -29
  932. package/src/session-handler/event-stream-fixtures/session-two-completions-same-session.jsonl +0 -50
  933. package/src/session-handler/event-stream-fixtures/session-user-interruption.jsonl +0 -59
  934. package/src/session-handler/event-stream-fixtures/session-voice-queued-followup.jsonl +0 -52
  935. package/src/session-handler/event-stream-state.test.ts +0 -3304
  936. package/src/session-handler/event-stream-state.ts +0 -1773
  937. package/src/session-handler/global-event-listener.ts +0 -258
  938. package/src/session-handler/model-utils.test.ts +0 -537
  939. package/src/session-handler/model-utils.ts +0 -489
  940. package/src/session-handler/opencode-session-event-log.ts +0 -159
  941. package/src/session-handler/thread-ingress.test.ts +0 -54
  942. package/src/session-handler/thread-runtime-state.ts +0 -351
  943. package/src/session-handler/thread-session-runtime-summary.test.ts +0 -169
  944. package/src/session-handler/thread-session-runtime.ts +0 -5608
  945. package/src/session-handler.ts +0 -15
  946. package/src/session-search.test.ts +0 -331
  947. package/src/session-search.ts +0 -382
  948. package/src/session-sleep.test.ts +0 -294
  949. package/src/session-title-rename.test.ts +0 -186
  950. package/src/skill-filter.test.ts +0 -110
  951. package/src/skill-filter.ts +0 -63
  952. package/src/startup-service.ts +0 -200
  953. package/src/startup-time.e2e.test.ts +0 -377
  954. package/src/system-message.test.ts +0 -1176
  955. package/src/system-message.ts +0 -1179
  956. package/src/task-id-plugin.ts +0 -17
  957. package/src/task-runner.ts +0 -768
  958. package/src/task-schedule.test.ts +0 -424
  959. package/src/task-schedule.ts +0 -470
  960. package/src/test-utils.ts +0 -506
  961. package/src/thinking-utils.test.ts +0 -46
  962. package/src/thinking-utils.ts +0 -82
  963. package/src/thread-message-queue.e2e.test.ts +0 -1395
  964. package/src/tools.ts +0 -430
  965. package/src/undici.d.ts +0 -12
  966. package/src/undo-redo.e2e.test.ts +0 -219
  967. package/src/unnest-code-blocks.test.ts +0 -713
  968. package/src/unnest-code-blocks.ts +0 -185
  969. package/src/upgrade.ts +0 -127
  970. package/src/utils.ts +0 -216
  971. package/src/voice-attachment.ts +0 -79
  972. package/src/voice-handler.ts +0 -999
  973. package/src/voice-message.e2e.test.ts +0 -1524
  974. package/src/voice-routing-input.e2e.test.ts +0 -203
  975. package/src/voice-routing-question.e2e.test.ts +0 -131
  976. package/src/voice.test.ts +0 -415
  977. package/src/wait-session.ts +0 -291
  978. package/src/websockify.ts +0 -101
  979. package/src/worker-types.ts +0 -64
  980. package/src/worktree-clone-isolation.e2e.test.ts +0 -213
  981. package/src/worktree-lifecycle.e2e.test.ts +0 -900
  982. package/src/worktree-utils.ts +0 -4
  983. package/src/xai-auth-plugin.ts +0 -303
  984. package/src/xai-auth-state.test.ts +0 -224
  985. package/src/xai-auth-state.ts +0 -294
  986. package/src/xml.test.ts +0 -38
  987. 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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"}