kimaki 0.31.0 → 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 (989) 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 +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 +351 -682
  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 -175
  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 +619 -717
  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 +38 -74
  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 -258
  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 +344 -759
  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 -228
  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 +668 -988
  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 -1223
  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 -24
  481. package/dist/btw-prefix-detection.test.js +0 -130
  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 -1591
  497. package/dist/cli-runner.test.js +0 -119
  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 -275
  507. package/dist/commands/compact.js +0 -117
  508. package/dist/commands/context-usage.js +0 -194
  509. package/dist/commands/context-usage.test.js +0 -49
  510. package/dist/commands/create-new-project.js +0 -138
  511. package/dist/commands/diff.js +0 -63
  512. package/dist/commands/file-upload.js +0 -280
  513. package/dist/commands/fork-subagent.js +0 -175
  514. package/dist/commands/fork.js +0 -291
  515. package/dist/commands/gemini-apikey.js +0 -123
  516. package/dist/commands/last-sessions.js +0 -129
  517. package/dist/commands/login.js +0 -893
  518. package/dist/commands/mcp.js +0 -239
  519. package/dist/commands/memory-snapshot.js +0 -24
  520. package/dist/commands/mention-mode.js +0 -42
  521. package/dist/commands/merge-worktree.js +0 -205
  522. package/dist/commands/model-variant.js +0 -390
  523. package/dist/commands/model.js +0 -1012
  524. package/dist/commands/multioauth.js +0 -425
  525. package/dist/commands/new-worktree.js +0 -625
  526. package/dist/commands/paginated-select.js +0 -57
  527. package/dist/commands/permissions.js +0 -327
  528. package/dist/commands/queue.js +0 -347
  529. package/dist/commands/queue.test.js +0 -15
  530. package/dist/commands/remove-project.js +0 -111
  531. package/dist/commands/restart-opencode-server.js +0 -133
  532. package/dist/commands/resume.js +0 -148
  533. package/dist/commands/run-command.js +0 -79
  534. package/dist/commands/screenshare.js +0 -307
  535. package/dist/commands/screenshare.test.js +0 -20
  536. package/dist/commands/session-id.js +0 -78
  537. package/dist/commands/session.js +0 -248
  538. package/dist/commands/share.js +0 -80
  539. package/dist/commands/tasks.js +0 -296
  540. package/dist/commands/types.js +0 -2
  541. package/dist/commands/undo-redo.js +0 -313
  542. package/dist/commands/unset-model.js +0 -116
  543. package/dist/commands/upgrade.js +0 -41
  544. package/dist/commands/user-command.js +0 -196
  545. package/dist/commands/verbosity.js +0 -124
  546. package/dist/commands/vscode.js +0 -295
  547. package/dist/commands/worktrees.js +0 -548
  548. package/dist/condense-memory.js +0 -33
  549. package/dist/config.js +0 -126
  550. package/dist/context-awareness-plugin.js +0 -357
  551. package/dist/context-awareness-plugin.test.js +0 -126
  552. package/dist/cpu-profiler.js +0 -211
  553. package/dist/cpu-profiler.test.js +0 -160
  554. package/dist/critique-utils.js +0 -95
  555. package/dist/database.js +0 -1074
  556. package/dist/debounce-timeout.js +0 -28
  557. package/dist/debounced-process-flush.js +0 -77
  558. package/dist/default-channel-provisioning.test.js +0 -149
  559. package/dist/discord-bot.js +0 -1432
  560. package/dist/discord-command-registration.js +0 -519
  561. package/dist/discord-command-registration.test.js +0 -17
  562. package/dist/discord-urls.js +0 -81
  563. package/dist/discord-utils.js +0 -789
  564. package/dist/discord-utils.test.js +0 -400
  565. package/dist/escape-backticks.test.js +0 -429
  566. package/dist/event-stream-real-capture.e2e.test.js +0 -533
  567. package/dist/eventsource-parser.test.js +0 -327
  568. package/dist/exec-async.js +0 -38
  569. package/dist/external-directory-permissions.e2e.test.js +0 -86
  570. package/dist/external-directory-project-deny.e2e.test.js +0 -70
  571. package/dist/external-opencode-sync.js +0 -620
  572. package/dist/external-opencode-sync.test.js +0 -206
  573. package/dist/extract-sdk-error-message.test.js +0 -13
  574. package/dist/format-tables.js +0 -728
  575. package/dist/format-tables.test.js +0 -915
  576. package/dist/forum-sync/config.js +0 -79
  577. package/dist/forum-sync/discord-operations.js +0 -157
  578. package/dist/forum-sync/index.js +0 -5
  579. package/dist/forum-sync/markdown.js +0 -110
  580. package/dist/forum-sync/sync-to-discord.js +0 -417
  581. package/dist/forum-sync/sync-to-files.js +0 -190
  582. package/dist/forum-sync/types.js +0 -53
  583. package/dist/forum-sync/watchers.js +0 -322
  584. package/dist/gateway-proxy-reconnect.e2e.test.js +0 -414
  585. package/dist/gateway-proxy.e2e.test.js +0 -488
  586. package/dist/genai-worker-wrapper.js +0 -111
  587. package/dist/genai-worker.js +0 -309
  588. package/dist/genai.js +0 -232
  589. package/dist/git-worktree-core.js +0 -461
  590. package/dist/guild-categories.test.js +0 -225
  591. package/dist/heap-monitor.js +0 -122
  592. package/dist/hrana-server.js +0 -322
  593. package/dist/hrana-server.test.js +0 -99
  594. package/dist/html-actions.js +0 -123
  595. package/dist/html-actions.test.js +0 -70
  596. package/dist/html-components.js +0 -115
  597. package/dist/html-components.test.js +0 -34
  598. package/dist/image-optimizer-plugin.js +0 -153
  599. package/dist/image-utils.js +0 -112
  600. package/dist/interaction-handler.js +0 -578
  601. package/dist/ipc-polling.js +0 -245
  602. package/dist/ipc-tools-plugin.js +0 -251
  603. package/dist/kimaki-digital-twin.e2e.test.js +0 -161
  604. package/dist/kimaki-opencode-plugin-loading.e2e.test.js +0 -158
  605. package/dist/kimaki-opencode-plugin.js +0 -33
  606. package/dist/kimaki-opencode-plugin.test.js +0 -126
  607. package/dist/kimaki-workspace-adaptor.js +0 -118
  608. package/dist/limit-heading-depth.js +0 -25
  609. package/dist/limit-heading-depth.test.js +0 -105
  610. package/dist/list-channel-threads.js +0 -163
  611. package/dist/list-channel-threads.test.js +0 -80
  612. package/dist/markdown.js +0 -455
  613. package/dist/markdown.test.js +0 -411
  614. package/dist/memory-overview-plugin.js +0 -123
  615. package/dist/message-formatting.js +0 -788
  616. package/dist/message-formatting.test.js +0 -1132
  617. package/dist/message-preprocessing.js +0 -419
  618. package/dist/oauth-rotation-shared.js +0 -253
  619. package/dist/onboarding-tutorial.js +0 -163
  620. package/dist/onboarding-welcome.js +0 -37
  621. package/dist/openai-auth-plugin.js +0 -125
  622. package/dist/openai-auth-state.js +0 -237
  623. package/dist/openai-realtime.js +0 -224
  624. package/dist/opencode-command-detection.js +0 -65
  625. package/dist/opencode-command-detection.test.js +0 -240
  626. package/dist/opencode-command.js +0 -181
  627. package/dist/opencode-command.test.js +0 -218
  628. package/dist/opencode-interrupt-plugin.js +0 -253
  629. package/dist/opencode-interrupt-plugin.test.js +0 -293
  630. package/dist/opencode.js +0 -1217
  631. package/dist/parse-permission-rules.test.js +0 -117
  632. package/dist/patch-text-parser.js +0 -97
  633. package/dist/plugin-logger.js +0 -105
  634. package/dist/plugin-opencode-client.js +0 -54
  635. package/dist/privacy-sanitizer.js +0 -105
  636. package/dist/project-add.test.js +0 -62
  637. package/dist/question-abort-clears-dropdown.e2e.test.js +0 -89
  638. package/dist/question-abort-resume.e2e.test.js +0 -100
  639. package/dist/question-abort-retry-text-before-dropdown.e2e.test.js +0 -150
  640. package/dist/question-text-before-dropdown.e2e.test.js +0 -52
  641. package/dist/queue-advanced-abort.e2e.test.js +0 -348
  642. package/dist/queue-advanced-action-buttons.e2e.test.js +0 -209
  643. package/dist/queue-advanced-e2e-setup.js +0 -1043
  644. package/dist/queue-advanced-footer.e2e.test.js +0 -286
  645. package/dist/queue-advanced-model-switch.e2e.test.js +0 -297
  646. package/dist/queue-advanced-permissions-typing.e2e.test.js +0 -189
  647. package/dist/queue-advanced-question.e2e.test.js +0 -266
  648. package/dist/queue-advanced-typing-interrupt.e2e.test.js +0 -113
  649. package/dist/queue-advanced-typing.e2e.test.js +0 -151
  650. package/dist/queue-delete-message.e2e.test.js +0 -216
  651. package/dist/queue-drain-after-interactive-ui.e2e.test.js +0 -120
  652. package/dist/queue-interrupt-drain.e2e.test.js +0 -256
  653. package/dist/queue-question-select-drain.e2e.test.js +0 -162
  654. package/dist/runtime-idle-sweeper.js +0 -52
  655. package/dist/runtime-lifecycle.e2e.test.js +0 -570
  656. package/dist/sentry.js +0 -23
  657. package/dist/session-handler/agent-utils.js +0 -65
  658. package/dist/session-handler/event-stream-state.js +0 -1225
  659. package/dist/session-handler/event-stream-state.test.js +0 -3160
  660. package/dist/session-handler/global-event-listener.js +0 -212
  661. package/dist/session-handler/model-utils.js +0 -311
  662. package/dist/session-handler/model-utils.test.js +0 -445
  663. package/dist/session-handler/opencode-session-event-log.js +0 -121
  664. package/dist/session-handler/thread-ingress.test.js +0 -41
  665. package/dist/session-handler/thread-runtime-state.js +0 -209
  666. package/dist/session-handler/thread-session-runtime-summary.test.js +0 -121
  667. package/dist/session-handler/thread-session-runtime.js +0 -4320
  668. package/dist/session-handler.js +0 -9
  669. package/dist/session-search.js +0 -219
  670. package/dist/session-search.test.js +0 -287
  671. package/dist/session-sleep.test.js +0 -224
  672. package/dist/session-title-rename.test.js +0 -128
  673. package/dist/skill-filter.js +0 -43
  674. package/dist/skill-filter.test.js +0 -86
  675. package/dist/startup-service.js +0 -153
  676. package/dist/startup-time.e2e.test.js +0 -297
  677. package/dist/system-message.js +0 -806
  678. package/dist/system-message.test.js +0 -917
  679. package/dist/task-id-plugin.js +0 -16
  680. package/dist/task-runner.js +0 -554
  681. package/dist/task-schedule.js +0 -298
  682. package/dist/task-schedule.test.js +0 -366
  683. package/dist/test-utils.js +0 -385
  684. package/dist/thinking-utils.js +0 -45
  685. package/dist/thinking-utils.test.js +0 -35
  686. package/dist/thread-message-queue.e2e.test.js +0 -1227
  687. package/dist/tools.js +0 -357
  688. package/dist/undo-redo.e2e.test.js +0 -171
  689. package/dist/unnest-code-blocks.js +0 -146
  690. package/dist/unnest-code-blocks.test.js +0 -673
  691. package/dist/upgrade.js +0 -114
  692. package/dist/utils.js +0 -148
  693. package/dist/voice-attachment.js +0 -56
  694. package/dist/voice-handler.js +0 -727
  695. package/dist/voice-message.e2e.test.js +0 -1254
  696. package/dist/voice-routing-input.e2e.test.js +0 -195
  697. package/dist/voice-routing-question.e2e.test.js +0 -182
  698. package/dist/voice.test.js +0 -500
  699. package/dist/wait-session.js +0 -193
  700. package/dist/websockify.js +0 -69
  701. package/dist/worker-types.js +0 -4
  702. package/dist/worktree-clone-isolation.e2e.test.js +0 -188
  703. package/dist/worktree-lifecycle.e2e.test.js +0 -735
  704. package/dist/worktree-utils.js +0 -3
  705. package/dist/xai-auth-plugin.js +0 -238
  706. package/dist/xai-auth-state.js +0 -234
  707. package/dist/xai-auth-state.test.js +0 -183
  708. package/dist/xml.js +0 -92
  709. package/dist/xml.test.js +0 -32
  710. package/skills/bump-holocron-consumers/SKILL.md +0 -137
  711. package/skills/critique/SKILL.md +0 -116
  712. package/skills/egaki/SKILL.md +0 -86
  713. package/skills/errore/SKILL.md +0 -501
  714. package/skills/goke/SKILL.md +0 -695
  715. package/skills/holocron/SKILL.md +0 -942
  716. package/skills/lintcn/SKILL.md +0 -873
  717. package/skills/new-skill/SKILL.md +0 -339
  718. package/skills/npm-package/SKILL.md +0 -692
  719. package/skills/opensrc/SKILL.md +0 -102
  720. package/skills/playwriter/SKILL.md +0 -35
  721. package/skills/profano/SKILL.md +0 -33
  722. package/skills/readme.md +0 -20
  723. package/skills/sigillo/SKILL.md +0 -370
  724. package/skills/spiceflow/SKILL.md +0 -80
  725. package/skills/strada/SKILL.md +0 -104
  726. package/skills/termcast/SKILL.md +0 -133
  727. package/skills/tuistory/SKILL.md +0 -237
  728. package/skills/usecomputer/SKILL.md +0 -264
  729. package/skills/zele/SKILL.md +0 -81
  730. package/src/agent-model.e2e.test.ts +0 -1557
  731. package/src/ai-tool-to-genai.test.ts +0 -296
  732. package/src/ai-tool-to-genai.ts +0 -283
  733. package/src/ai-tool.ts +0 -39
  734. package/src/anthropic-account-identity.test.ts +0 -52
  735. package/src/anthropic-account-identity.ts +0 -96
  736. package/src/anthropic-auth-plugin.test.ts +0 -135
  737. package/src/anthropic-auth-plugin.ts +0 -1180
  738. package/src/anthropic-auth-state.test.ts +0 -259
  739. package/src/anthropic-auth-state.ts +0 -272
  740. package/src/bash-tool-schema-plugin.test.ts +0 -84
  741. package/src/bash-tool-schema-plugin.ts +0 -77
  742. package/src/bin.ts +0 -173
  743. package/src/bot-lifecycle.test.ts +0 -252
  744. package/src/btw-prefix-detection.test.ts +0 -142
  745. package/src/btw-prefix-detection.ts +0 -30
  746. package/src/cache-drift-plugin.ts +0 -249
  747. package/src/cache-rewrite.test.ts +0 -49
  748. package/src/cache-rewrite.ts +0 -96
  749. package/src/channel-management.ts +0 -494
  750. package/src/cli-commands/bot.ts +0 -374
  751. package/src/cli-commands/maintenance.ts +0 -237
  752. package/src/cli-commands/misc.ts +0 -208
  753. package/src/cli-commands/project.ts +0 -680
  754. package/src/cli-commands/send.ts +0 -885
  755. package/src/cli-commands/session.ts +0 -1181
  756. package/src/cli-commands/task.ts +0 -358
  757. package/src/cli-commands/thread.ts +0 -86
  758. package/src/cli-commands/user.ts +0 -195
  759. package/src/cli-parsing.test.ts +0 -305
  760. package/src/cli-runner.test.ts +0 -166
  761. package/src/cli-runner.ts +0 -2157
  762. package/src/cli-send-thread.e2e.test.ts +0 -609
  763. package/src/cloudflare-transcription.ts +0 -76
  764. package/src/commands/abort.ts +0 -113
  765. package/src/commands/action-buttons.ts +0 -371
  766. package/src/commands/add-project.ts +0 -146
  767. package/src/commands/agent.ts +0 -911
  768. package/src/commands/ask-question.test.ts +0 -177
  769. package/src/commands/ask-question.ts +0 -532
  770. package/src/commands/btw.ts +0 -356
  771. package/src/commands/compact.ts +0 -154
  772. package/src/commands/context-usage.test.ts +0 -57
  773. package/src/commands/context-usage.ts +0 -267
  774. package/src/commands/create-new-project.ts +0 -203
  775. package/src/commands/diff.ts +0 -91
  776. package/src/commands/file-upload.ts +0 -398
  777. package/src/commands/fork-subagent.ts +0 -262
  778. package/src/commands/fork.ts +0 -421
  779. package/src/commands/gemini-apikey.ts +0 -205
  780. package/src/commands/last-sessions.ts +0 -176
  781. package/src/commands/login.ts +0 -1182
  782. package/src/commands/mcp.ts +0 -307
  783. package/src/commands/memory-snapshot.ts +0 -30
  784. package/src/commands/mention-mode.ts +0 -66
  785. package/src/commands/merge-worktree.ts +0 -282
  786. package/src/commands/model-variant.ts +0 -522
  787. package/src/commands/model.ts +0 -1377
  788. package/src/commands/multioauth.ts +0 -508
  789. package/src/commands/new-worktree.ts +0 -835
  790. package/src/commands/paginated-select.ts +0 -81
  791. package/src/commands/permissions.ts +0 -458
  792. package/src/commands/queue.test.ts +0 -19
  793. package/src/commands/queue.ts +0 -471
  794. package/src/commands/remove-project.ts +0 -152
  795. package/src/commands/restart-opencode-server.ts +0 -173
  796. package/src/commands/resume.ts +0 -229
  797. package/src/commands/run-command.ts +0 -123
  798. package/src/commands/screenshare.test.ts +0 -30
  799. package/src/commands/screenshare.ts +0 -388
  800. package/src/commands/session-id.ts +0 -109
  801. package/src/commands/session.ts +0 -319
  802. package/src/commands/share.ts +0 -106
  803. package/src/commands/tasks.ts +0 -399
  804. package/src/commands/types.ts +0 -25
  805. package/src/commands/undo-redo.ts +0 -394
  806. package/src/commands/unset-model.ts +0 -152
  807. package/src/commands/upgrade.ts +0 -51
  808. package/src/commands/user-command.ts +0 -260
  809. package/src/commands/verbosity.ts +0 -172
  810. package/src/commands/vscode.ts +0 -378
  811. package/src/commands/worktrees.ts +0 -762
  812. package/src/condense-memory.ts +0 -36
  813. package/src/config.ts +0 -147
  814. package/src/context-awareness-plugin.test.ts +0 -144
  815. package/src/context-awareness-plugin.ts +0 -508
  816. package/src/cpu-profiler.test.ts +0 -183
  817. package/src/cpu-profiler.ts +0 -293
  818. package/src/critique-utils.ts +0 -139
  819. package/src/database.ts +0 -1484
  820. package/src/debounce-timeout.ts +0 -43
  821. package/src/debounced-process-flush.ts +0 -104
  822. package/src/default-channel-provisioning.test.ts +0 -156
  823. package/src/discord-bot.ts +0 -1852
  824. package/src/discord-command-registration.test.ts +0 -20
  825. package/src/discord-command-registration.ts +0 -704
  826. package/src/discord-urls.ts +0 -88
  827. package/src/discord-utils.test.ts +0 -470
  828. package/src/discord-utils.ts +0 -1079
  829. package/src/escape-backticks.test.ts +0 -469
  830. package/src/event-stream-real-capture.e2e.test.ts +0 -692
  831. package/src/eventsource-parser.test.ts +0 -351
  832. package/src/exec-async.ts +0 -44
  833. package/src/external-directory-permissions.e2e.test.ts +0 -103
  834. package/src/external-directory-project-deny.e2e.test.ts +0 -84
  835. package/src/external-opencode-sync.test.ts +0 -248
  836. package/src/external-opencode-sync.ts +0 -867
  837. package/src/extract-sdk-error-message.test.ts +0 -18
  838. package/src/format-tables.test.ts +0 -988
  839. package/src/format-tables.ts +0 -1031
  840. package/src/forum-sync/config.ts +0 -92
  841. package/src/forum-sync/discord-operations.ts +0 -245
  842. package/src/forum-sync/index.ts +0 -9
  843. package/src/forum-sync/markdown.ts +0 -172
  844. package/src/forum-sync/sync-to-discord.ts +0 -595
  845. package/src/forum-sync/sync-to-files.ts +0 -294
  846. package/src/forum-sync/types.ts +0 -175
  847. package/src/forum-sync/watchers.ts +0 -474
  848. package/src/gateway-proxy-reconnect.e2e.test.ts +0 -553
  849. package/src/gateway-proxy.e2e.test.ts +0 -648
  850. package/src/genai-worker-wrapper.ts +0 -164
  851. package/src/genai-worker.ts +0 -385
  852. package/src/genai.ts +0 -318
  853. package/src/git-worktree-core.ts +0 -616
  854. package/src/guild-categories.test.ts +0 -260
  855. package/src/heap-monitor.ts +0 -152
  856. package/src/hrana-server.test.ts +0 -130
  857. package/src/hrana-server.ts +0 -399
  858. package/src/html-actions.test.ts +0 -87
  859. package/src/html-actions.ts +0 -174
  860. package/src/html-components.test.ts +0 -38
  861. package/src/html-components.ts +0 -177
  862. package/src/image-optimizer-plugin.ts +0 -194
  863. package/src/image-utils.ts +0 -150
  864. package/src/interaction-handler.ts +0 -775
  865. package/src/ipc-polling.ts +0 -325
  866. package/src/ipc-tools-plugin.ts +0 -306
  867. package/src/kimaki-digital-twin.e2e.test.ts +0 -199
  868. package/src/kimaki-opencode-plugin-loading.e2e.test.ts +0 -208
  869. package/src/kimaki-opencode-plugin.test.ts +0 -142
  870. package/src/kimaki-opencode-plugin.ts +0 -34
  871. package/src/kimaki-workspace-adaptor.ts +0 -144
  872. package/src/limit-heading-depth.test.ts +0 -116
  873. package/src/limit-heading-depth.ts +0 -26
  874. package/src/list-channel-threads.test.ts +0 -90
  875. package/src/list-channel-threads.ts +0 -252
  876. package/src/markdown.test.ts +0 -498
  877. package/src/markdown.ts +0 -577
  878. package/src/memory-overview-plugin.ts +0 -159
  879. package/src/message-formatting.test.ts +0 -1401
  880. package/src/message-formatting.ts +0 -999
  881. package/src/message-preprocessing.ts +0 -557
  882. package/src/oauth-rotation-shared.ts +0 -332
  883. package/src/onboarding-tutorial.ts +0 -167
  884. package/src/onboarding-welcome.ts +0 -49
  885. package/src/openai-auth-plugin.ts +0 -158
  886. package/src/openai-auth-state.ts +0 -297
  887. package/src/openai-realtime.ts +0 -358
  888. package/src/opencode-command-detection.test.ts +0 -307
  889. package/src/opencode-command-detection.ts +0 -76
  890. package/src/opencode-command.test.ts +0 -290
  891. package/src/opencode-command.ts +0 -251
  892. package/src/opencode-interrupt-plugin.test.ts +0 -419
  893. package/src/opencode-interrupt-plugin.ts +0 -306
  894. package/src/opencode.ts +0 -1590
  895. package/src/parse-permission-rules.test.ts +0 -127
  896. package/src/patch-text-parser.ts +0 -107
  897. package/src/plugin-logger.ts +0 -139
  898. package/src/plugin-opencode-client.ts +0 -71
  899. package/src/privacy-sanitizer.ts +0 -142
  900. package/src/project-add.test.ts +0 -80
  901. package/src/question-abort-clears-dropdown.e2e.test.ts +0 -109
  902. package/src/question-abort-resume.e2e.test.ts +0 -121
  903. package/src/question-abort-retry-text-before-dropdown.e2e.test.ts +0 -172
  904. package/src/question-text-before-dropdown.e2e.test.ts +0 -67
  905. package/src/queue-advanced-abort.e2e.test.ts +0 -449
  906. package/src/queue-advanced-action-buttons.e2e.test.ts +0 -271
  907. package/src/queue-advanced-e2e-setup.ts +0 -1164
  908. package/src/queue-advanced-footer.e2e.test.ts +0 -357
  909. package/src/queue-advanced-model-switch.e2e.test.ts +0 -382
  910. package/src/queue-advanced-permissions-typing.e2e.test.ts +0 -256
  911. package/src/queue-advanced-question.e2e.test.ts +0 -322
  912. package/src/queue-advanced-typing-interrupt.e2e.test.ts +0 -147
  913. package/src/queue-advanced-typing.e2e.test.ts +0 -199
  914. package/src/queue-delete-message.e2e.test.ts +0 -262
  915. package/src/queue-drain-after-interactive-ui.e2e.test.ts +0 -152
  916. package/src/queue-interrupt-drain.e2e.test.ts +0 -299
  917. package/src/queue-question-select-drain.e2e.test.ts +0 -209
  918. package/src/runtime-idle-sweeper.ts +0 -76
  919. package/src/runtime-lifecycle.e2e.test.ts +0 -714
  920. package/src/schema.sql +0 -251
  921. package/src/sentry.ts +0 -26
  922. package/src/session-handler/agent-utils.ts +0 -104
  923. package/src/session-handler/event-stream-fixtures/real-session-action-buttons.jsonl +0 -45
  924. package/src/session-handler/event-stream-fixtures/real-session-footer-suppressed-on-pre-idle-interrupt.jsonl +0 -40
  925. package/src/session-handler/event-stream-fixtures/real-session-permission-external-file.jsonl +0 -23
  926. package/src/session-handler/event-stream-fixtures/real-session-task-normal.jsonl +0 -22
  927. package/src/session-handler/event-stream-fixtures/real-session-task-three-parallel-sleeps.jsonl +0 -277
  928. package/src/session-handler/event-stream-fixtures/real-session-task-user-interruption.jsonl +0 -46
  929. package/src/session-handler/event-stream-fixtures/session-abort-after-idle-race.jsonl +0 -21
  930. package/src/session-handler/event-stream-fixtures/session-concurrent-messages-serialized.jsonl +0 -56
  931. package/src/session-handler/event-stream-fixtures/session-explicit-abort.jsonl +0 -44
  932. package/src/session-handler/event-stream-fixtures/session-normal-completion.jsonl +0 -29
  933. package/src/session-handler/event-stream-fixtures/session-tool-call-noisy-stream.jsonl +0 -29
  934. package/src/session-handler/event-stream-fixtures/session-two-completions-same-session.jsonl +0 -50
  935. package/src/session-handler/event-stream-fixtures/session-user-interruption.jsonl +0 -59
  936. package/src/session-handler/event-stream-fixtures/session-voice-queued-followup.jsonl +0 -52
  937. package/src/session-handler/event-stream-state.test.ts +0 -3431
  938. package/src/session-handler/event-stream-state.ts +0 -1792
  939. package/src/session-handler/global-event-listener.ts +0 -258
  940. package/src/session-handler/model-utils.test.ts +0 -537
  941. package/src/session-handler/model-utils.ts +0 -489
  942. package/src/session-handler/opencode-session-event-log.ts +0 -159
  943. package/src/session-handler/thread-ingress.test.ts +0 -54
  944. package/src/session-handler/thread-runtime-state.ts +0 -358
  945. package/src/session-handler/thread-session-runtime-summary.test.ts +0 -169
  946. package/src/session-handler/thread-session-runtime.ts +0 -5696
  947. package/src/session-handler.ts +0 -15
  948. package/src/session-search.test.ts +0 -331
  949. package/src/session-search.ts +0 -382
  950. package/src/session-sleep.test.ts +0 -294
  951. package/src/session-title-rename.test.ts +0 -186
  952. package/src/skill-filter.test.ts +0 -110
  953. package/src/skill-filter.ts +0 -63
  954. package/src/startup-service.ts +0 -200
  955. package/src/startup-time.e2e.test.ts +0 -377
  956. package/src/system-message.test.ts +0 -1013
  957. package/src/system-message.ts +0 -1043
  958. package/src/task-id-plugin.ts +0 -17
  959. package/src/task-runner.ts +0 -768
  960. package/src/task-schedule.test.ts +0 -424
  961. package/src/task-schedule.ts +0 -470
  962. package/src/test-utils.ts +0 -549
  963. package/src/thinking-utils.test.ts +0 -46
  964. package/src/thinking-utils.ts +0 -82
  965. package/src/thread-message-queue.e2e.test.ts +0 -1468
  966. package/src/tools.ts +0 -430
  967. package/src/undici.d.ts +0 -12
  968. package/src/undo-redo.e2e.test.ts +0 -219
  969. package/src/unnest-code-blocks.test.ts +0 -713
  970. package/src/unnest-code-blocks.ts +0 -185
  971. package/src/upgrade.ts +0 -127
  972. package/src/utils.ts +0 -216
  973. package/src/voice-attachment.ts +0 -79
  974. package/src/voice-handler.ts +0 -1000
  975. package/src/voice-message.e2e.test.ts +0 -1513
  976. package/src/voice-routing-input.e2e.test.ts +0 -203
  977. package/src/voice-routing-question.e2e.test.ts +0 -188
  978. package/src/voice.test.ts +0 -565
  979. package/src/wait-session.ts +0 -291
  980. package/src/websockify.ts +0 -101
  981. package/src/worker-types.ts +0 -64
  982. package/src/worktree-clone-isolation.e2e.test.ts +0 -213
  983. package/src/worktree-lifecycle.e2e.test.ts +0 -900
  984. package/src/worktree-utils.ts +0 -4
  985. package/src/xai-auth-plugin.ts +0 -303
  986. package/src/xai-auth-state.test.ts +0 -224
  987. package/src/xai-auth-state.ts +0 -294
  988. package/src/xml.test.ts +0 -38
  989. package/src/xml.ts +0 -121
@@ -0,0 +1,59 @@
1
+ import type { FormInfo, JsonValue, V2Event } from '@opencode/client';
2
+ import { type Draft } from 'immer';
3
+ import type { InteractionRoutes } from './interaction-context.ts';
4
+ import type { Emit, ThreadView } from './thread-reducer.ts';
5
+ export type QuestionField = {
6
+ key: string;
7
+ type: 'string' | 'multiselect' | 'boolean';
8
+ title: string;
9
+ description: string;
10
+ custom: boolean;
11
+ options: ReadonlyArray<{
12
+ value: string;
13
+ label: string;
14
+ description: string;
15
+ }>;
16
+ };
17
+ export type PendingForm = {
18
+ sessionId: string;
19
+ fields: readonly QuestionField[];
20
+ label: string | null;
21
+ };
22
+ type FormLike = {
23
+ id: string;
24
+ sessionID: string;
25
+ title: string;
26
+ metadata?: {
27
+ readonly [key: string]: JsonValue;
28
+ };
29
+ fields: FormInfo['fields'] | Extract<V2Event, {
30
+ type: 'form.created';
31
+ }>['data']['form']['fields'];
32
+ };
33
+ export declare function formatAnswer({ field, value }: {
34
+ field: QuestionField;
35
+ value: string | readonly string[] | number | boolean | undefined;
36
+ }): string;
37
+ export declare function withAnswer({ header: text, answer }: {
38
+ header: string;
39
+ answer: string;
40
+ }): string;
41
+ type Slice = {
42
+ draft: Draft<ThreadView>;
43
+ emit: Emit;
44
+ };
45
+ export declare function showForm({ draft, emit, form, label }: Slice & {
46
+ form: FormLike;
47
+ label: string | null;
48
+ }): void;
49
+ export declare function closeForm({ draft, emit, formID, render, }: Slice & {
50
+ formID: string;
51
+ render: (field: QuestionField, header: string) => string;
52
+ }): void;
53
+ export declare function hydrateForms(slice: Slice & {
54
+ sessionId: string;
55
+ forms: readonly FormLike[];
56
+ label: string | null;
57
+ }): void;
58
+ export declare function createQuestionHandlers(): InteractionRoutes;
59
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,290 @@
1
+ // Phase 4: the question tool (V2 forms) as Discord dropdowns. Answer by
2
+ // select, by the "Other" modal, several questions in one form, a new message
3
+ // cancels a pending question, and a restarted bot shows it again.
4
+ import fs from 'node:fs';
5
+ import { ComponentType } from 'discord.js';
6
+ import { afterAll, beforeAll, expect, test } from 'vitest';
7
+ import { send } from "./prompt.js";
8
+ import { TEST_USER_ID, scriptedTurn, seedProjectChannel, startOpencodeTestServer, startTestBot, startTwin, tempDataDir, textParts, waitFor, waitForFooter, warmUp, } from "./test/harness.js";
9
+ const COLOR = {
10
+ question: 'Which color do you prefer?',
11
+ header: 'Color',
12
+ options: [
13
+ { label: 'Red', description: 'warm' },
14
+ { label: 'Blue', description: 'cold' },
15
+ ],
16
+ };
17
+ const FRUITS = {
18
+ question: 'Which fruits do you like?',
19
+ header: 'Fruits',
20
+ multiple: true,
21
+ options: [
22
+ { label: 'Apple', description: 'crisp' },
23
+ { label: 'Kiwi', description: 'green' },
24
+ { label: 'Pear', description: 'soft' },
25
+ ],
26
+ };
27
+ function askTurn({ marker, questions }) {
28
+ return scriptedTurn({
29
+ marker,
30
+ steps: [{ id: `call-${marker}`, tool: 'question', input: { questions: JSON.parse(JSON.stringify(questions)) } }],
31
+ finalText: `answers received ${marker}`,
32
+ });
33
+ }
34
+ const matchers = [
35
+ ...askTurn({ marker: 'ask-one', questions: [COLOR] }),
36
+ ...askTurn({ marker: 'ask-two', questions: [COLOR, FRUITS] }),
37
+ ...askTurn({ marker: 'ask-other', questions: [COLOR] }),
38
+ ...askTurn({ marker: 'ask-cancel', questions: [COLOR] }),
39
+ ...askTurn({ marker: 'ask-restart', questions: [COLOR] }),
40
+ ...askTurn({ marker: 'ask-denied', questions: [COLOR] }),
41
+ { id: 'instead', priority: 500, when: { latestUserTextIncludes: 'instead-marker' }, then: { parts: textParts('did the other thing') } },
42
+ ];
43
+ let server;
44
+ let twin;
45
+ let bot;
46
+ let dataDir;
47
+ beforeAll(async () => {
48
+ dataDir = tempDataDir();
49
+ [server, twin] = await Promise.all([startOpencodeTestServer({ matchers }), startTwin()]);
50
+ await seedProjectChannel({
51
+ dataDir,
52
+ channelId: twin.channelId,
53
+ guildId: twin.discord.guildId,
54
+ directory: server.projectDirectory,
55
+ });
56
+ await warmUp({ server });
57
+ bot = await startTestBot({ dataDir, twin, server });
58
+ });
59
+ afterAll(async () => {
60
+ await bot?.stop();
61
+ await twin?.stop();
62
+ await server?.stop();
63
+ fs.rmSync(dataDir, { recursive: true, force: true });
64
+ });
65
+ function selectsOf(message) {
66
+ return (message.components ?? []).flatMap((row) => row.type === ComponentType.ActionRow
67
+ ? row.components.flatMap((component) => component.type === ComponentType.StringSelect
68
+ ? [{ message, customId: component.custom_id, values: component.options.map((option) => option.value) }]
69
+ : [])
70
+ : []);
71
+ }
72
+ // Waits until the thread shows `count` question dropdowns.
73
+ async function waitForSelects({ threadId, count }) {
74
+ return waitFor({
75
+ label: `${count} question dropdowns`,
76
+ check: async () => {
77
+ const messages = await twin.discord.thread(threadId).getMessages();
78
+ const selects = messages.flatMap(selectsOf);
79
+ return selects.length >= count ? selects : null;
80
+ },
81
+ });
82
+ }
83
+ // Kimaki sessions deny the question tool; `--permission question:allow` turns it back on.
84
+ async function startThread(content) {
85
+ const started = await send(bot, { channelId: twin.channelId, prompt: content, user: [TEST_USER_ID], permissions: ['question:allow'] });
86
+ if (started instanceof Error)
87
+ throw started;
88
+ return { id: started.threadId };
89
+ }
90
+ test('single question answered from the dropdown', async () => {
91
+ const thread = await startThread('Pick a color ask-one');
92
+ const [select] = await waitForSelects({ threadId: thread.id, count: 1 });
93
+ expect(select.values).toMatchInlineSnapshot(`
94
+ [
95
+ "0",
96
+ "1",
97
+ "other",
98
+ ]
99
+ `);
100
+ await twin.discord.thread(thread.id).user(TEST_USER_ID).selectMenu({
101
+ messageId: select.message.id,
102
+ customId: select.customId,
103
+ values: [select.values[1]],
104
+ });
105
+ await waitForFooter({ discord: twin.discord, threadId: thread.id });
106
+ expect(await twin.discord.thread(thread.id).text({ showInteractions: true })).toMatchInlineSnapshot(`
107
+ "--- from: assistant (TestBot)
108
+ » **CLI:** Pick a color ask-one
109
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
110
+ **Color**
111
+ Which color do you prefer?
112
+ ✓ _Blue_
113
+ [user selects dropdown: 1]
114
+ answers received ask-one
115
+ -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
116
+ `);
117
+ });
118
+ test('two questions: the form is answered after both, multi-select keeps options picked with Other', async () => {
119
+ const thread = await startThread('Two questions ask-two');
120
+ const [color, fruits] = await waitForSelects({ threadId: thread.id, count: 2 });
121
+ const user = twin.discord.thread(thread.id).user(TEST_USER_ID);
122
+ await user.selectMenu({ messageId: fruits.message.id, customId: fruits.customId, values: [fruits.values[0], fruits.values[1], 'other'] });
123
+ await user.submitModal({
124
+ customId: fruits.customId.replace(/^form:/, 'form_other:'),
125
+ messageId: fruits.message.id,
126
+ fields: [{ customId: 'answer', value: 'Banana' }],
127
+ });
128
+ await user.selectMenu({ messageId: color.message.id, customId: color.customId, values: [color.values[0]] });
129
+ await waitForFooter({ discord: twin.discord, threadId: thread.id });
130
+ expect(await twin.discord.thread(thread.id).text()).toMatchInlineSnapshot(`
131
+ "--- from: assistant (TestBot)
132
+ » **CLI:** Two questions ask-two
133
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
134
+ **Color**
135
+ Which color do you prefer?
136
+ ✓ _Red_
137
+ **Fruits**
138
+ Which fruits do you like?
139
+ ✓ _Apple, Kiwi, Banana_
140
+ answers received ask-two
141
+ -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
142
+ `);
143
+ const sessionId = bot.store.getState().roots[thread.id];
144
+ const messages = await (await server.client()).message.list({ sessionID: sessionId });
145
+ expect(JSON.stringify(messages.data)).toContain('\\"Which fruits do you like?\\"=\\"Apple, Kiwi, Banana\\"');
146
+ });
147
+ test('Other opens a modal and sends the typed answer', async () => {
148
+ const thread = await startThread('Custom color ask-other');
149
+ const [select] = await waitForSelects({ threadId: thread.id, count: 1 });
150
+ const user = twin.discord.thread(thread.id).user(TEST_USER_ID);
151
+ await user.selectMenu({ messageId: select.message.id, customId: select.customId, values: ['other'] });
152
+ const modalId = select.customId.replace(/^form:/, 'form_other:');
153
+ await user.submitModal({ customId: modalId, messageId: select.message.id, fields: [{ customId: 'answer', value: 'Teal' }] });
154
+ await waitForFooter({ discord: twin.discord, threadId: thread.id });
155
+ expect(await twin.discord.thread(thread.id).text()).toMatchInlineSnapshot(`
156
+ "--- from: assistant (TestBot)
157
+ » **CLI:** Custom color ask-other
158
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
159
+ **Color**
160
+ Which color do you prefer?
161
+ ✓ _Teal_
162
+ answers received ask-other
163
+ -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
164
+ `);
165
+ });
166
+ test('OpenCode forms without the question tool (web search setup, yes/no) show labels and send typed values', async () => {
167
+ const thread = await startThread('Hello instead-marker');
168
+ await waitForFooter({ discord: twin.discord, threadId: thread.id });
169
+ const sessionId = bot.store.getState().roots[thread.id];
170
+ const client = await server.client();
171
+ // Same shape as the form of OpenCode's websearch tool: no field title, kind "websearch.provider".
172
+ const form = await client.session.form.create({
173
+ sessionID: sessionId,
174
+ title: 'Web Search',
175
+ metadata: { kind: 'websearch.provider' },
176
+ fields: [
177
+ {
178
+ key: 'choice',
179
+ description: 'Allow OpenCode to search the web for up-to-date information?',
180
+ type: 'string',
181
+ required: true,
182
+ custom: false,
183
+ options: [
184
+ { value: 'allow', label: 'Allow search via Exa' },
185
+ { value: 'disable', label: 'Disable web search' },
186
+ ],
187
+ },
188
+ { key: 'remember', title: 'Remember', description: 'Keep this choice?', type: 'boolean' },
189
+ ],
190
+ });
191
+ const [choice, remember] = await waitForSelects({ threadId: thread.id, count: 2 });
192
+ const user = twin.discord.thread(thread.id).user(TEST_USER_ID);
193
+ await user.selectMenu({ messageId: choice.message.id, customId: choice.customId, values: ['1'] });
194
+ await user.selectMenu({ messageId: remember.message.id, customId: remember.customId, values: ['0'] });
195
+ const detail = await waitFor({
196
+ label: 'form answered',
197
+ check: async () => {
198
+ const result = await client.session.form.get({ sessionID: sessionId, formID: form.id });
199
+ return result.state.status === 'answered' ? result.state : null;
200
+ },
201
+ });
202
+ expect(detail).toMatchInlineSnapshot(`
203
+ {
204
+ "answer": {
205
+ "choice": "disable",
206
+ "remember": true,
207
+ },
208
+ "status": "answered",
209
+ }
210
+ `);
211
+ expect(await twin.discord.thread(thread.id).text()).toMatchInlineSnapshot(`
212
+ "--- from: assistant (TestBot)
213
+ » **CLI:** Hello instead-marker
214
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
215
+ did the other thing
216
+ -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
217
+ **Web Search**
218
+ Allow OpenCode to search the web for up-to-date information?
219
+ ✓ _Disable web search_
220
+ **Remember**
221
+ Keep this choice?
222
+ ✓ _Yes_"
223
+ `);
224
+ });
225
+ test('a new message cancels the pending question and is answered', async () => {
226
+ const thread = await startThread('Ask then change ask-cancel');
227
+ await waitForSelects({ threadId: thread.id, count: 1 });
228
+ await twin.discord.thread(thread.id).user(TEST_USER_ID).sendMessage({ content: 'Forget it instead-marker' });
229
+ await waitForFooter({ discord: twin.discord, threadId: thread.id });
230
+ expect(await twin.discord.thread(thread.id).text()).toMatchInlineSnapshot(`
231
+ "--- from: assistant (TestBot)
232
+ » **CLI:** Ask then change ask-cancel
233
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
234
+ **Color**
235
+ Which color do you prefer?
236
+ ✗ _cancelled_
237
+ --- from: user (tommy)
238
+ Forget it instead-marker
239
+ --- from: assistant (TestBot)
240
+ did the other thing
241
+ -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
242
+ `);
243
+ });
244
+ test('a restarted bot shows the pending question again and it still works', async () => {
245
+ const thread = await startThread('Survive restart ask-restart');
246
+ await waitForSelects({ threadId: thread.id, count: 1 });
247
+ await bot.stop();
248
+ bot = await startTestBot({ dataDir, twin, server });
249
+ const selects = await waitForSelects({ threadId: thread.id, count: 2 });
250
+ const fresh = selects[selects.length - 1];
251
+ await twin.discord.thread(thread.id).user(TEST_USER_ID).selectMenu({
252
+ messageId: fresh.message.id,
253
+ customId: fresh.customId,
254
+ values: [fresh.values[0]],
255
+ });
256
+ await waitForFooter({ discord: twin.discord, threadId: thread.id });
257
+ expect(await twin.discord.thread(thread.id).text()).toMatchInlineSnapshot(`
258
+ "--- from: assistant (TestBot)
259
+ » **CLI:** Survive restart ask-restart
260
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
261
+ **Color**
262
+ Which color do you prefer?
263
+ **Color**
264
+ Which color do you prefer?
265
+ ✓ _Red_
266
+ answers received ask-restart
267
+ -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
268
+ `);
269
+ });
270
+ test('Kimaki sessions hide the question tool by default', async () => {
271
+ const { discord, channelId } = twin;
272
+ const before = new Set((await discord.channel(channelId).getThreads()).map((thread) => thread.id));
273
+ await discord.channel(channelId).user(TEST_USER_ID).sendMessage({ content: 'No dropdowns ask-denied' });
274
+ const thread = await discord.channel(channelId).waitForThread({ timeout: 8_000, predicate: (thread) => !before.has(thread.id) });
275
+ await waitForFooter({ discord: twin.discord, threadId: thread.id });
276
+ expect(await twin.discord.thread(thread.id).text()).toMatchInlineSnapshot(`
277
+ "--- from: user (tommy)
278
+ No dropdowns ask-denied
279
+ --- from: assistant (TestBot)
280
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
281
+ answers received ask-denied
282
+ -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
283
+ `);
284
+ const messages = await twin.discord.thread(thread.id).getMessages();
285
+ expect(messages.flatMap(selectsOf)).toEqual([]);
286
+ const sessionId = bot.store.getState().roots[thread.id];
287
+ const info = await (await server.client()).session.get({ sessionID: sessionId });
288
+ expect(info.permissions).toEqual([{ action: 'question', resource: '*', effect: 'deny' }]);
289
+ });
290
+ //# sourceMappingURL=questions.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questions.e2e.test.js","sourceRoot":"","sources":["../src/questions.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,231 @@
1
+ // Questions feature (spec 10.1, 27.6): every V2 form with choice fields, from
2
+ // the `question` tool or OpenCode itself (web search setup: metadata.kind
3
+ // "websearch.provider"). Kimaki shows one message with a dropdown per field,
4
+ // like V1 and OpenCode Mini. Subagent forms show in the parent thread with a
5
+ // "From: <agent>" line. Forms with number, external or conditional fields are
6
+ // not shown; OpenCode cancels them after its timeout.
7
+ //
8
+ // form.created ─▶ one dropdown message per field (+ "Other" when custom or free text)
9
+ // select ─▶ message shows "✓ answer"; last field answered ─▶ form.reply
10
+ // "Other" ─▶ modal with a text input ─▶ same as a select
11
+ // form.replied / form.cancelled ─▶ every message of the form is edited: answer or cancelled, no dropdown
12
+ //
13
+ // Custom IDs carry only the form ID and field index. Answers of a form with
14
+ // several questions wait in the createQuestionHandlers closure until the last
15
+ // one (lost on restart, the user picks again).
16
+ import { ActionRowBuilder, ComponentType, MessageFlags, ModalBuilder, TextInputBuilder, TextInputStyle, } from 'discord.js';
17
+ import { oc } from "./bot.js";
18
+ import { createLogger } from "./logger.js";
19
+ import { castDraft } from 'immer';
20
+ import { textOnly } from "./format-parts.js";
21
+ const logger = createLogger('QUESTION');
22
+ const FORM_SELECT_PREFIX = 'form:';
23
+ const FORM_OTHER_PREFIX = 'form_other:';
24
+ const OTHER_VALUE = 'other';
25
+ // Discord: 25 options per select, one is "Other".
26
+ const MAX_OPTIONS = 24;
27
+ function uiKey(formID) {
28
+ return `form:${formID}`;
29
+ }
30
+ const BOOLEAN_OPTIONS = [
31
+ { value: 'true', label: 'Yes', description: '' },
32
+ { value: 'false', label: 'No', description: '' },
33
+ ];
34
+ // null when a field cannot be answered with a dropdown (number, external, conditional, pattern).
35
+ function questionFields(form) {
36
+ const fields = form.fields.map((field) => {
37
+ if (field.type !== 'string' && field.type !== 'multiselect' && field.type !== 'boolean')
38
+ return null;
39
+ if (field.when?.length)
40
+ return null;
41
+ // Fields without a title (web search setup) use the form title, like Mini.
42
+ const base = { key: field.key, title: field.title ?? form.title, description: field.description ?? '' };
43
+ if (field.type === 'boolean')
44
+ return { ...base, type: 'boolean', custom: false, options: BOOLEAN_OPTIONS };
45
+ if (field.type === 'string' && field.pattern !== undefined)
46
+ return null;
47
+ const options = (field.options ?? []).slice(0, MAX_OPTIONS).map((option) => ({
48
+ value: option.value,
49
+ label: option.label,
50
+ description: option.description ?? '',
51
+ }));
52
+ // A string field without options is free text: only the "Other" modal.
53
+ return { ...base, type: field.type, custom: field.custom === true || options.length === 0, options };
54
+ });
55
+ return fields.every((field) => field !== null) ? fields : null;
56
+ }
57
+ function header({ field, label }) {
58
+ const from = label ? `**From:** \`${label}\`\n` : '';
59
+ const title = field.title ? `**${field.title.slice(0, 200)}**\n` : '';
60
+ return `${from}${title}${field.description.slice(0, 1_500)}`.trimEnd();
61
+ }
62
+ function questionMessage({ formID, index, field, label, }) {
63
+ const options = [
64
+ ...field.options.map((option, optionIndex) => ({
65
+ label: option.label.slice(0, 100),
66
+ value: String(optionIndex),
67
+ ...(option.description && { description: option.description.slice(0, 100) }),
68
+ })),
69
+ ...(field.custom
70
+ ? [field.options.length ? { label: 'Other', value: OTHER_VALUE, description: 'Type your own answer' } : { label: 'Type your answer', value: OTHER_VALUE }]
71
+ : []),
72
+ ];
73
+ return {
74
+ content: header({ field, label }),
75
+ components: [
76
+ {
77
+ type: ComponentType.ActionRow,
78
+ components: [
79
+ {
80
+ type: ComponentType.StringSelect,
81
+ custom_id: `${FORM_SELECT_PREFIX}${formID}:${index}`,
82
+ placeholder: 'Select an option',
83
+ options,
84
+ min_values: 1,
85
+ max_values: field.type === 'multiselect' ? options.length : 1,
86
+ },
87
+ ],
88
+ },
89
+ ],
90
+ };
91
+ }
92
+ // Option labels instead of values ("Disable web search", not "disable").
93
+ export function formatAnswer({ field, value }) {
94
+ if (value === undefined)
95
+ return 'no answer';
96
+ const label = (item) => field.options.find((option) => option.value === String(item))?.label ?? String(item);
97
+ if (typeof value === 'object')
98
+ return value.map(label).join(', ');
99
+ return label(value);
100
+ }
101
+ const MESSAGE_LIMIT = 2_000;
102
+ // Header plus "✓ answer" within one Discord message. Only the display is
103
+ // cut: OpenCode always gets the full answer.
104
+ export function withAnswer({ header: text, answer }) {
105
+ const room = MESSAGE_LIMIT - text.length - 6;
106
+ return `${text}\n✓ _${answer.length > room ? `${answer.slice(0, room - 1)}…` : answer}_`;
107
+ }
108
+ function answeredMessage({ field, label, answer }) {
109
+ return textOnly(withAnswer({ header: header({ field, label }), answer }));
110
+ }
111
+ export function showForm({ draft, emit, form, label }) {
112
+ const fields = questionFields(form);
113
+ if (!fields || draft.forms[form.id])
114
+ return;
115
+ draft.forms[form.id] = castDraft({ sessionId: form.sessionID, fields, label });
116
+ const messages = fields.map((field, index) => questionMessage({ formID: form.id, index, field, label }));
117
+ emit({ type: 'show', key: uiKey(form.id), messages, replyTo: null, notify: true });
118
+ }
119
+ // `render` builds each question's final text from its header.
120
+ export function closeForm({ draft, emit, formID, render, }) {
121
+ const form = draft.forms[formID];
122
+ if (!form)
123
+ return;
124
+ const messages = form.fields.map((field) => textOnly(render(field, header({ field, label: form.label }))));
125
+ delete draft.forms[formID];
126
+ emit({ type: 'edit', key: uiKey(formID), messages });
127
+ }
128
+ // After a (re)connect: pending forms of one session as OpenCode has them.
129
+ // Unknown ones are shown (again); gone ones are closed.
130
+ export function hydrateForms(slice) {
131
+ const pending = new Set(slice.forms.map((form) => form.id));
132
+ for (const [formID, form] of Object.entries(slice.draft.forms)) {
133
+ if (form.sessionId !== slice.sessionId || pending.has(formID))
134
+ continue;
135
+ closeForm({ ...slice, formID, render: (_field, text) => `${text}\n_no longer pending_` });
136
+ }
137
+ for (const form of slice.forms)
138
+ showForm({ ...slice, form });
139
+ }
140
+ // --- Discord handlers
141
+ function parseCustomId(customId, prefix) {
142
+ const [formID, index] = customId.slice(prefix.length).split(':');
143
+ const parsed = Number(index);
144
+ if (!formID || !Number.isInteger(parsed))
145
+ return null;
146
+ return { formID, index: parsed };
147
+ }
148
+ // Shows the answer in the question's own message.
149
+ async function acknowledge({ interaction, content, }) {
150
+ if (interaction.isStringSelectMenu() || interaction.isFromMessage()) {
151
+ await interaction.update({ content, components: [] });
152
+ return;
153
+ }
154
+ await interaction.reply({ content, flags: MessageFlags.Ephemeral });
155
+ }
156
+ async function expired(interaction) {
157
+ await interaction.reply({ content: 'This question is no longer pending', flags: MessageFlags.Ephemeral });
158
+ }
159
+ // The dropdown and "Other" modal handlers of question forms. One per bot.
160
+ export function createQuestionHandlers() {
161
+ // formID -> answers so far, for forms with several fields.
162
+ const answers = new Map();
163
+ // "formID:key" -> options picked together with "Other", while the modal asks for the text.
164
+ const otherPicks = new Map();
165
+ function pendingField(bot, { threadId, customId, prefix }) {
166
+ const parsed = parseCustomId(customId, prefix);
167
+ if (!parsed)
168
+ return null;
169
+ const form = bot.store.getState().threads[threadId]?.forms[parsed.formID];
170
+ const field = form?.fields[parsed.index];
171
+ if (!form || !field) {
172
+ answers.delete(parsed.formID);
173
+ return null;
174
+ }
175
+ return { formID: parsed.formID, form, field };
176
+ }
177
+ async function record(bot, { interaction, formID, form, field, value, }) {
178
+ const answer = { ...answers.get(formID), [field.key]: value };
179
+ const complete = form.fields.every((candidate) => answer[candidate.key] !== undefined);
180
+ if (complete)
181
+ answers.delete(formID);
182
+ if (!complete)
183
+ answers.set(formID, answer);
184
+ const answered = answeredMessage({ field, label: form.label, answer: formatAnswer({ field, value }) });
185
+ await acknowledge({ interaction, content: answered.content });
186
+ if (!complete)
187
+ return;
188
+ const result = await oc(bot, 'session.form.reply', (client) => client.session.form.reply({ sessionID: form.sessionId, formID, answer }));
189
+ if (!(result instanceof Error))
190
+ return;
191
+ logger.warn(`answer ${formID} failed`, result);
192
+ await interaction.followUp({ content: 'This question is no longer pending', flags: MessageFlags.Ephemeral });
193
+ }
194
+ async function select(bot, interaction) {
195
+ const pending = pendingField(bot, { threadId: interaction.channelId, customId: interaction.customId, prefix: FORM_SELECT_PREFIX });
196
+ if (!pending)
197
+ return expired(interaction);
198
+ const { formID, field } = pending;
199
+ const values = interaction.values.flatMap((value) => {
200
+ const option = field.options[Number(value)];
201
+ return option ? [option.value] : [];
202
+ });
203
+ if (interaction.values.includes(OTHER_VALUE)) {
204
+ otherPicks.set(`${formID}:${field.key}`, values);
205
+ const input = new TextInputBuilder()
206
+ .setCustomId('answer')
207
+ .setLabel('Your answer')
208
+ .setStyle(TextInputStyle.Paragraph)
209
+ .setRequired(true);
210
+ await interaction.showModal(new ModalBuilder()
211
+ .setCustomId(interaction.customId.replace(FORM_SELECT_PREFIX, FORM_OTHER_PREFIX))
212
+ .setTitle((field.title || 'Answer').slice(0, 45))
213
+ .addComponents(new ActionRowBuilder().addComponents(input)));
214
+ return;
215
+ }
216
+ const value = field.type === 'multiselect' ? values : field.type === 'boolean' ? values[0] === 'true' : (values[0] ?? '');
217
+ await record(bot, { interaction, ...pending, value });
218
+ }
219
+ async function other(bot, interaction) {
220
+ const pending = pendingField(bot, { threadId: interaction.channelId ?? '', customId: interaction.customId, prefix: FORM_OTHER_PREFIX });
221
+ if (!pending)
222
+ return expired(interaction);
223
+ const text = interaction.fields.getTextInputValue('answer').trim();
224
+ const key = `${pending.formID}:${pending.field.key}`;
225
+ const picked = otherPicks.get(key) ?? [];
226
+ otherPicks.delete(key);
227
+ await record(bot, { interaction, ...pending, value: pending.field.type === 'multiselect' ? [...picked, text] : text });
228
+ }
229
+ return { selects: { [FORM_SELECT_PREFIX]: select }, modals: { [FORM_OTHER_PREFIX]: other } };
230
+ }
231
+ //# sourceMappingURL=questions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questions.js","sourceRoot":"","sources":["../src/questions.ts"],"names":[],"mappings":"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"}