kimaki 1.4.0 → 1.5.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 (335) hide show
  1. package/assets/fonts/Geist-Bold.ttf +0 -0
  2. package/assets/fonts/Geist-Regular.ttf +0 -0
  3. package/assets/fonts/GeistMono-Regular.ttf +0 -0
  4. package/assets/fonts/OFL.txt +92 -0
  5. package/dist/agent-ui.e2e.test.js +27 -13
  6. package/dist/agent-ui.e2e.test.js.map +1 -1
  7. package/dist/agent-ui.js +2 -1
  8. package/dist/agent-ui.js.map +1 -1
  9. package/dist/analytics.e2e.test.js +1 -1
  10. package/dist/analytics.e2e.test.js.map +1 -1
  11. package/dist/autostart.d.ts +4 -0
  12. package/dist/autostart.js +55 -10
  13. package/dist/autostart.js.map +1 -1
  14. package/dist/bot.d.ts +10 -1
  15. package/dist/bot.js +14 -6
  16. package/dist/bot.js.map +1 -1
  17. package/dist/btw.e2e.test.js +3 -3
  18. package/dist/builtin-skills.d.ts +1 -1
  19. package/dist/builtin-skills.js +1 -1
  20. package/dist/builtin-skills.js.map +1 -1
  21. package/dist/builtin-skills.test.js +3 -4
  22. package/dist/builtin-skills.test.js.map +1 -1
  23. package/dist/catalog-refresh.e2e.test.js +2 -2
  24. package/dist/cli/bot.js +25 -14
  25. package/dist/cli/bot.js.map +1 -1
  26. package/dist/cli/discord.js +32 -6
  27. package/dist/cli/discord.js.map +1 -1
  28. package/dist/cli/schedule.js +23 -9
  29. package/dist/cli/schedule.js.map +1 -1
  30. package/dist/cli/session.js +37 -12
  31. package/dist/cli/session.js.map +1 -1
  32. package/dist/cli/shared.d.ts +5 -3
  33. package/dist/cli/shared.js +45 -10
  34. package/dist/cli/shared.js.map +1 -1
  35. package/dist/cli-discord.e2e.test.js +13 -8
  36. package/dist/cli-discord.e2e.test.js.map +1 -1
  37. package/dist/cli-lock.e2e.test.js +87 -20
  38. package/dist/cli-lock.e2e.test.js.map +1 -1
  39. package/dist/cli-read.e2e.test.js +18 -9
  40. package/dist/cli-read.e2e.test.js.map +1 -1
  41. package/dist/cli-sessions.e2e.test.js +4 -3
  42. package/dist/cli-sessions.e2e.test.js.map +1 -1
  43. package/dist/cli.js +2 -0
  44. package/dist/cli.js.map +1 -1
  45. package/dist/commands/preference-commands.d.ts +4 -0
  46. package/dist/commands/preference-commands.js +38 -4
  47. package/dist/commands/preference-commands.js.map +1 -1
  48. package/dist/commands/session-commands.js +11 -8
  49. package/dist/commands/session-commands.js.map +1 -1
  50. package/dist/commands/thread-commands.js +94 -24
  51. package/dist/commands/thread-commands.js.map +1 -1
  52. package/dist/commands/worktree-commands.d.ts +5 -6
  53. package/dist/commands/worktree-commands.js +8 -7
  54. package/dist/commands/worktree-commands.js.map +1 -1
  55. package/dist/commands.e2e.test.js +25 -21
  56. package/dist/commands.e2e.test.js.map +1 -1
  57. package/dist/coordinator-agents.e2e.test.d.ts +1 -0
  58. package/dist/coordinator-agents.e2e.test.js +113 -0
  59. package/dist/coordinator-agents.e2e.test.js.map +1 -0
  60. package/dist/coordinator-idle.e2e.test.d.ts +1 -0
  61. package/dist/coordinator-idle.e2e.test.js +100 -0
  62. package/dist/coordinator-idle.e2e.test.js.map +1 -0
  63. package/dist/coordinator-queue.e2e.test.d.ts +1 -0
  64. package/dist/coordinator-queue.e2e.test.js +244 -0
  65. package/dist/coordinator-queue.e2e.test.js.map +1 -0
  66. package/dist/coordinator-warmup.e2e.test.d.ts +1 -0
  67. package/dist/coordinator-warmup.e2e.test.js +131 -0
  68. package/dist/coordinator-warmup.e2e.test.js.map +1 -0
  69. package/dist/coordinator.d.ts +6 -0
  70. package/dist/coordinator.e2e.test.d.ts +1 -0
  71. package/dist/coordinator.e2e.test.js +505 -0
  72. package/dist/coordinator.e2e.test.js.map +1 -0
  73. package/dist/coordinator.js +164 -0
  74. package/dist/coordinator.js.map +1 -0
  75. package/dist/db.d.ts +78 -3
  76. package/dist/db.test.js +1 -0
  77. package/dist/db.test.js.map +1 -1
  78. package/dist/diagram.d.ts +11 -0
  79. package/dist/diagram.js +232 -0
  80. package/dist/diagram.js.map +1 -0
  81. package/dist/diagram.test.d.ts +1 -0
  82. package/dist/diagram.test.js +52 -0
  83. package/dist/diagram.test.js.map +1 -0
  84. package/dist/duration.js +13 -5
  85. package/dist/duration.js.map +1 -1
  86. package/dist/effects.d.ts +6 -1
  87. package/dist/effects.js +97 -26
  88. package/dist/effects.js.map +1 -1
  89. package/dist/event-loop.d.ts +1 -1
  90. package/dist/event-loop.js +73 -43
  91. package/dist/event-loop.js.map +1 -1
  92. package/dist/format-parts.d.ts +21 -4
  93. package/dist/format-parts.js +40 -23
  94. package/dist/format-parts.js.map +1 -1
  95. package/dist/gateway-replay.e2e.test.js +4 -4
  96. package/dist/harness.e2e.test.js +2 -2
  97. package/dist/harness.e2e.test.js.map +1 -1
  98. package/dist/hello-thread.e2e.test.js +56 -5
  99. package/dist/hello-thread.e2e.test.js.map +1 -1
  100. package/dist/ingress.js +47 -12
  101. package/dist/ingress.js.map +1 -1
  102. package/dist/interaction-context.d.ts +4 -4
  103. package/dist/interaction-context.js +9 -7
  104. package/dist/interaction-context.js.map +1 -1
  105. package/dist/interrupt.e2e.test.js +8 -5
  106. package/dist/interrupt.e2e.test.js.map +1 -1
  107. package/dist/legacy.e2e.test.js +1 -1
  108. package/dist/lock-routes.d.ts +83 -31
  109. package/dist/lock-routes.js +68 -8
  110. package/dist/lock-routes.js.map +1 -1
  111. package/dist/lock-server.d.ts +3 -2
  112. package/dist/lock-server.js +23 -7
  113. package/dist/lock-server.js.map +1 -1
  114. package/dist/main.d.ts +4 -2
  115. package/dist/main.js +13 -3
  116. package/dist/main.js.map +1 -1
  117. package/dist/mainmast-idle.e2e.test.d.ts +1 -0
  118. package/dist/mainmast-idle.e2e.test.js +99 -0
  119. package/dist/mainmast-idle.e2e.test.js.map +1 -0
  120. package/dist/mainmast-queue.e2e.test.d.ts +1 -0
  121. package/dist/mainmast-queue.e2e.test.js +244 -0
  122. package/dist/mainmast-queue.e2e.test.js.map +1 -0
  123. package/dist/mainmast-warmup.e2e.test.d.ts +1 -0
  124. package/dist/mainmast-warmup.e2e.test.js +130 -0
  125. package/dist/mainmast-warmup.e2e.test.js.map +1 -0
  126. package/dist/mainmast.d.ts +6 -0
  127. package/dist/mainmast.e2e.test.d.ts +1 -0
  128. package/dist/mainmast.e2e.test.js +428 -0
  129. package/dist/mainmast.e2e.test.js.map +1 -0
  130. package/dist/mainmast.js +156 -0
  131. package/dist/mainmast.js.map +1 -0
  132. package/dist/markdown/markdown.test.js +4 -4
  133. package/dist/markdown/render-markdown.js +6 -5
  134. package/dist/markdown/render-markdown.js.map +1 -1
  135. package/dist/onboarding-cli.e2e.test.js +7 -6
  136. package/dist/onboarding-cli.e2e.test.js.map +1 -1
  137. package/dist/onboarding.d.ts +3 -10
  138. package/dist/onboarding.e2e.test.js +8 -10
  139. package/dist/onboarding.e2e.test.js.map +1 -1
  140. package/dist/onboarding.js +14 -24
  141. package/dist/onboarding.js.map +1 -1
  142. package/dist/permissions.e2e.test.js +3 -3
  143. package/dist/plugin/coordinator.d.ts +4 -0
  144. package/dist/plugin/coordinator.js +389 -0
  145. package/dist/plugin/coordinator.js.map +1 -0
  146. package/dist/plugin/index.js +76 -17
  147. package/dist/plugin/index.js.map +1 -1
  148. package/dist/plugin/mainmast.d.ts +4 -0
  149. package/dist/plugin/mainmast.js +379 -0
  150. package/dist/plugin/mainmast.js.map +1 -0
  151. package/dist/plugin.e2e.test.js +1 -1
  152. package/dist/preference-commands.e2e.test.js +103 -24
  153. package/dist/preference-commands.e2e.test.js.map +1 -1
  154. package/dist/project.d.ts +1 -1
  155. package/dist/prompt.d.ts +22 -9
  156. package/dist/prompt.js +64 -48
  157. package/dist/prompt.js.map +1 -1
  158. package/dist/questions.e2e.test.js +13 -13
  159. package/dist/queue-sources.e2e.test.d.ts +1 -0
  160. package/dist/queue-sources.e2e.test.js +168 -0
  161. package/dist/queue-sources.e2e.test.js.map +1 -0
  162. package/dist/queue.d.ts +9 -1
  163. package/dist/queue.e2e.test.js +48 -30
  164. package/dist/queue.e2e.test.js.map +1 -1
  165. package/dist/queue.js +97 -24
  166. package/dist/queue.js.map +1 -1
  167. package/dist/queue.test.d.ts +1 -0
  168. package/dist/queue.test.js +57 -0
  169. package/dist/queue.test.js.map +1 -0
  170. package/dist/remote-send.e2e.test.js +6 -6
  171. package/dist/remote-send.js +2 -1
  172. package/dist/remote-send.js.map +1 -1
  173. package/dist/renderer.e2e.test.js +7 -7
  174. package/dist/restart.e2e.test.js +2 -2
  175. package/dist/routines.e2e.test.js +2 -2
  176. package/dist/scheduler.d.ts +3 -3
  177. package/dist/scheduler.e2e.test.js +43 -20
  178. package/dist/scheduler.e2e.test.js.map +1 -1
  179. package/dist/scheduler.js +4 -2
  180. package/dist/scheduler.js.map +1 -1
  181. package/dist/schema-sql.d.ts +1 -1
  182. package/dist/schema-sql.js +1 -1
  183. package/dist/schema-sql.js.map +1 -1
  184. package/dist/schema.d.ts +152 -6
  185. package/dist/schema.js +12 -0
  186. package/dist/schema.js.map +1 -1
  187. package/dist/session-commands.e2e.test.js +36 -11
  188. package/dist/session-commands.e2e.test.js.map +1 -1
  189. package/dist/session-events.d.ts +18 -6
  190. package/dist/session-events.js +166 -22
  191. package/dist/session-events.js.map +1 -1
  192. package/dist/session-ops.e2e.test.js +63 -12
  193. package/dist/session-ops.e2e.test.js.map +1 -1
  194. package/dist/sessions.d.ts +44 -21
  195. package/dist/sessions.js +174 -63
  196. package/dist/sessions.js.map +1 -1
  197. package/dist/shell.e2e.test.js +4 -4
  198. package/dist/slash-commands.js +6 -4
  199. package/dist/slash-commands.js.map +1 -1
  200. package/dist/slash-commands.test.js +2 -0
  201. package/dist/slash-commands.test.js.map +1 -1
  202. package/dist/sleep.e2e.test.js +29 -14
  203. package/dist/sleep.e2e.test.js.map +1 -1
  204. package/dist/sleeps.d.ts +2 -1
  205. package/dist/sleeps.js +21 -3
  206. package/dist/sleeps.js.map +1 -1
  207. package/dist/store.d.ts +1 -0
  208. package/dist/store.js +3 -2
  209. package/dist/store.js.map +1 -1
  210. package/dist/system-prompt.d.ts +3 -1
  211. package/dist/system-prompt.js +138 -64
  212. package/dist/system-prompt.js.map +1 -1
  213. package/dist/test/generate-log-plugin/index.d.ts +3 -0
  214. package/dist/test/generate-log-plugin/index.js +15 -0
  215. package/dist/test/generate-log-plugin/index.js.map +1 -0
  216. package/dist/test/harness.d.ts +20 -1
  217. package/dist/test/harness.js +51 -10
  218. package/dist/test/harness.js.map +1 -1
  219. package/dist/test/replay.js +11 -7
  220. package/dist/test/replay.js.map +1 -1
  221. package/dist/thread-reducer.d.ts +29 -3
  222. package/dist/thread-reducer.fixtures.test.js +58 -51
  223. package/dist/thread-reducer.fixtures.test.js.map +1 -1
  224. package/dist/thread-reducer.js +112 -25
  225. package/dist/thread-reducer.js.map +1 -1
  226. package/dist/thread-reducer.test.js +197 -24
  227. package/dist/thread-reducer.test.js.map +1 -1
  228. package/dist/voice-attachments.e2e.test.js +108 -18
  229. package/dist/voice-attachments.e2e.test.js.map +1 -1
  230. package/dist/voice-call.e2e.test.js +9 -9
  231. package/dist/voice-call.js +6 -6
  232. package/dist/voice-call.js.map +1 -1
  233. package/dist/voice-openai.e2e.test.js +59 -23
  234. package/dist/voice-openai.e2e.test.js.map +1 -1
  235. package/dist/voice.d.ts +1 -1
  236. package/dist/voice.js +72 -24
  237. package/dist/voice.js.map +1 -1
  238. package/dist/working-directory.e2e.test.js +11 -11
  239. package/dist/working-directory.e2e.test.js.map +1 -1
  240. package/package.json +12 -6
  241. package/src/agent-ui.e2e.test.ts +27 -13
  242. package/src/agent-ui.ts +2 -1
  243. package/src/analytics.e2e.test.ts +1 -1
  244. package/src/autostart.ts +55 -10
  245. package/src/bot.ts +29 -5
  246. package/src/btw.e2e.test.ts +3 -3
  247. package/src/builtin-skills.test.ts +3 -4
  248. package/src/builtin-skills.ts +1 -1
  249. package/src/catalog-refresh.e2e.test.ts +2 -2
  250. package/src/cli/bot.ts +23 -14
  251. package/src/cli/discord.ts +30 -6
  252. package/src/cli/schedule.ts +23 -9
  253. package/src/cli/session.ts +35 -12
  254. package/src/cli/shared.ts +43 -8
  255. package/src/cli-discord.e2e.test.ts +13 -8
  256. package/src/cli-lock.e2e.test.ts +88 -20
  257. package/src/cli-read.e2e.test.ts +17 -8
  258. package/src/cli-sessions.e2e.test.ts +4 -3
  259. package/src/cli.ts +2 -0
  260. package/src/commands/preference-commands.ts +38 -4
  261. package/src/commands/session-commands.ts +12 -7
  262. package/src/commands/thread-commands.ts +92 -24
  263. package/src/commands/worktree-commands.ts +10 -9
  264. package/src/commands.e2e.test.ts +25 -21
  265. package/src/coordinator-agents.e2e.test.ts +145 -0
  266. package/src/coordinator-idle.e2e.test.ts +122 -0
  267. package/src/coordinator-queue.e2e.test.ts +279 -0
  268. package/src/coordinator-warmup.e2e.test.ts +158 -0
  269. package/src/coordinator.e2e.test.ts +545 -0
  270. package/src/coordinator.ts +168 -0
  271. package/src/db.test.ts +1 -0
  272. package/src/diagram.test.ts +56 -0
  273. package/src/diagram.ts +243 -0
  274. package/src/duration.ts +13 -5
  275. package/src/effects.ts +99 -27
  276. package/src/event-loop.ts +71 -42
  277. package/src/format-parts.ts +53 -22
  278. package/src/gateway-replay.e2e.test.ts +4 -4
  279. package/src/harness.e2e.test.ts +2 -2
  280. package/src/hello-thread.e2e.test.ts +59 -5
  281. package/src/ingress.ts +44 -11
  282. package/src/interaction-context.ts +12 -11
  283. package/src/interrupt.e2e.test.ts +8 -5
  284. package/src/legacy.e2e.test.ts +1 -1
  285. package/src/lock-routes.ts +62 -8
  286. package/src/lock-server.ts +23 -7
  287. package/src/main.ts +22 -7
  288. package/src/markdown/markdown.test.ts +4 -4
  289. package/src/markdown/render-markdown.ts +6 -5
  290. package/src/onboarding-cli.e2e.test.ts +7 -6
  291. package/src/onboarding.e2e.test.ts +8 -10
  292. package/src/onboarding.ts +13 -29
  293. package/src/permissions.e2e.test.ts +3 -3
  294. package/src/plugin/coordinator.ts +401 -0
  295. package/src/plugin/index.ts +68 -15
  296. package/src/plugin.e2e.test.ts +1 -1
  297. package/src/preference-commands.e2e.test.ts +103 -23
  298. package/src/prompt.ts +87 -43
  299. package/src/questions.e2e.test.ts +13 -13
  300. package/src/queue-sources.e2e.test.ts +197 -0
  301. package/src/queue.e2e.test.ts +48 -30
  302. package/src/queue.test.ts +59 -0
  303. package/src/queue.ts +104 -24
  304. package/src/remote-send.e2e.test.ts +6 -6
  305. package/src/remote-send.ts +2 -1
  306. package/src/renderer.e2e.test.ts +7 -7
  307. package/src/restart.e2e.test.ts +2 -2
  308. package/src/routines.e2e.test.ts +2 -2
  309. package/src/scheduler.e2e.test.ts +45 -19
  310. package/src/scheduler.ts +4 -2
  311. package/src/schema-sql.ts +1 -1
  312. package/src/schema.ts +13 -0
  313. package/src/session-commands.e2e.test.ts +38 -11
  314. package/src/session-events.ts +160 -21
  315. package/src/session-ops.e2e.test.ts +64 -11
  316. package/src/sessions.ts +214 -64
  317. package/src/shell.e2e.test.ts +4 -4
  318. package/src/slash-commands.test.ts +2 -0
  319. package/src/slash-commands.ts +6 -4
  320. package/src/sleep.e2e.test.ts +30 -13
  321. package/src/sleeps.ts +20 -3
  322. package/src/store.ts +5 -2
  323. package/src/system-prompt.ts +143 -63
  324. package/src/test/generate-log-plugin/index.ts +16 -0
  325. package/src/test/harness.ts +77 -14
  326. package/src/test/replay.ts +12 -6
  327. package/src/thread-reducer.fixtures.test.ts +58 -51
  328. package/src/thread-reducer.test.ts +207 -26
  329. package/src/thread-reducer.ts +138 -37
  330. package/src/voice-attachments.e2e.test.ts +110 -18
  331. package/src/voice-call.e2e.test.ts +9 -9
  332. package/src/voice-call.ts +6 -6
  333. package/src/voice-openai.e2e.test.ts +64 -24
  334. package/src/voice.ts +93 -26
  335. package/src/working-directory.e2e.test.ts +11 -11
@@ -0,0 +1,168 @@
1
+ // Queue cases in a thread that do not start from a queued Discord message:
2
+ // `kimaki send . queue`, a TUI prompt queued on the session, an item the TUI
3
+ // promotes to steer, a plain message while an item waits, and `. queue` on an
4
+ // idle thread. Split from queue.e2e so both files run in parallel.
5
+ import { execFile } from 'node:child_process';
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ import { promisify } from 'node:util';
9
+ import { afterAll, beforeAll, expect, test } from 'vitest';
10
+ import { TEST_USER_ID, seedProjectChannel, slowTextMatcher, startOpencodeTestServer, startTestBot, startTwin, tempDataDir, textParts, waitForBotMessageContaining, waitForFooter, warmUp, } from "./test/harness.js";
11
+ const exec = promisify(execFile);
12
+ function reply(marker, text) {
13
+ return { id: marker, priority: 50, when: { latestUserTextIncludes: marker }, then: { parts: textParts(text) } };
14
+ }
15
+ const matchers = [
16
+ slowTextMatcher({ marker: 'slow-marker', text: 'slow-done', delayMs: 1_200 }),
17
+ reply('steer-marker', 'steer ok'),
18
+ reply('queued-one', 'queued one ok'),
19
+ reply('idle-marker', 'idle ok'),
20
+ ];
21
+ let server;
22
+ let twin;
23
+ let bot;
24
+ let dataDir;
25
+ beforeAll(async () => {
26
+ dataDir = tempDataDir();
27
+ [server, twin] = await Promise.all([startOpencodeTestServer({ matchers }), startTwin()]);
28
+ await seedProjectChannel({ dataDir, channelId: twin.channelId, guildId: twin.discord.guildId, directory: server.projectDirectory });
29
+ await warmUp({ server });
30
+ bot = await startTestBot({ dataDir, twin, server });
31
+ });
32
+ afterAll(async () => {
33
+ await bot?.stop();
34
+ await twin?.stop();
35
+ await server?.stop();
36
+ fs.rmSync(dataDir, { recursive: true, force: true });
37
+ });
38
+ // Starts a slow turn in a new thread and waits until it runs (banner posted).
39
+ async function startSlowThread(content) {
40
+ const { discord, channelId } = twin;
41
+ const before = new Set((await discord.channel(channelId).getThreads()).map((thread) => thread.id));
42
+ await discord.channel(channelId).user(TEST_USER_ID).sendMessage({ content: `${content} slow-marker` });
43
+ const thread = await discord.channel(channelId).waitForThread({ timeout: 8_000, predicate: (candidate) => !before.has(candidate.id) });
44
+ await waitForBotMessageContaining({ discord, threadId: thread.id, text: '*using ' });
45
+ return thread;
46
+ }
47
+ function rootOf(threadId) {
48
+ const sessionID = bot.store.getState().roots[threadId];
49
+ if (!sessionID)
50
+ throw new Error(`thread ${threadId} has no session`);
51
+ return sessionID;
52
+ }
53
+ test('CLI . queue into a busy thread shows the full text, then replies to it when it runs', async () => {
54
+ const thread = await startSlowThread('CLI queue');
55
+ await exec(process.execPath, ['--import', 'tsx', path.resolve('src/cli.ts'), 'send', '--thread', thread.id, '--prompt', 'From the CLI queued-one\nsecond line. queue', '--data-dir', dataDir], {
56
+ env: { ...process.env, KIMAKI_LOCK_PORT: String(bot.lock.port) },
57
+ });
58
+ await waitForBotMessageContaining({ discord: twin.discord, threadId: thread.id, text: 'queued one ok' });
59
+ await waitForFooter({ discord: twin.discord, threadId: thread.id, count: 2 });
60
+ expect(await twin.discord.thread(thread.id).text({ showReplies: true })).toMatchInlineSnapshot(`
61
+ "--- from: user (tommy)
62
+ CLI queue slow-marker
63
+ --- from: assistant (TestBot)
64
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
65
+ -# » **CLI:** From the CLI queued-one
66
+ -# second line
67
+ slow-done
68
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
69
+ [reply to TestBot: -# » **CLI:** From the CLI queued-one -#]
70
+ -# Queued message sent
71
+ queued one ok
72
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
73
+ `);
74
+ });
75
+ test('a prompt queued from the TUI shows its text, then a reply to it when it runs', async () => {
76
+ const thread = await startSlowThread('TUI queue');
77
+ const client = await server.client();
78
+ await client.session.prompt({ sessionID: rootOf(thread.id), text: 'Typed in the TUI queued-one', delivery: 'queue' });
79
+ await waitForBotMessageContaining({ discord: twin.discord, threadId: thread.id, text: 'queued one ok' });
80
+ await waitForFooter({ discord: twin.discord, threadId: thread.id, count: 2 });
81
+ expect(await twin.discord.thread(thread.id).text({ showReplies: true })).toMatchInlineSnapshot(`
82
+ "--- from: user (tommy)
83
+ TUI queue slow-marker
84
+ --- from: assistant (TestBot)
85
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
86
+ -# » **user:** Typed in the TUI queued-one
87
+ slow-done
88
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
89
+ [reply to TestBot: -# » **user:** Typed in the TUI queued-o]
90
+ -# Queued message sent
91
+ queued one ok
92
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
93
+ `);
94
+ });
95
+ test('a queued item the TUI sends now (steer) gets its reply when promoted, once', async () => {
96
+ const thread = await startSlowThread('Promote me');
97
+ const queued = await twin.discord.thread(thread.id).user(TEST_USER_ID).sendMessage({ content: 'Run me now queued-one. queue' });
98
+ await waitForBotMessageContaining({ discord: twin.discord, threadId: thread.id, text: 'position 1' });
99
+ const client = await server.client();
100
+ await client.session.inbox.update({ sessionID: rootOf(thread.id), inboxID: `msg_discord_${queued.id}`, delivery: 'steer' });
101
+ await waitForBotMessageContaining({ discord: twin.discord, threadId: thread.id, text: 'queued one ok' });
102
+ await waitForFooter({ discord: twin.discord, threadId: thread.id });
103
+ expect(await twin.discord.thread(thread.id).text({ showReplies: true })).toMatchInlineSnapshot(`
104
+ "--- from: user (tommy)
105
+ Promote me slow-marker
106
+ --- from: assistant (TestBot)
107
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
108
+ --- from: user (tommy)
109
+ Run me now queued-one. queue
110
+ --- from: assistant (TestBot)
111
+ [reply to tommy: Run me now queued-one. queue]
112
+ -# Queued
113
+ [reply to tommy: Run me now queued-one. queue]
114
+ -# Queued message sent
115
+ slow-done
116
+ queued one ok
117
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
118
+ `);
119
+ });
120
+ test('a plain message while an item waits runs first, then the queued item gets its reply', async () => {
121
+ const thread = await startSlowThread('Steer past the queue');
122
+ const user = twin.discord.thread(thread.id).user(TEST_USER_ID);
123
+ await user.sendMessage({ content: 'Later queued-one. queue' });
124
+ await waitForBotMessageContaining({ discord: twin.discord, threadId: thread.id, text: 'position 1' });
125
+ await user.sendMessage({ content: 'Now steer-marker' });
126
+ await waitForBotMessageContaining({ discord: twin.discord, threadId: thread.id, text: 'queued one ok' });
127
+ await waitForFooter({ discord: twin.discord, threadId: thread.id, count: 2 });
128
+ expect(await twin.discord.thread(thread.id).text({ showReplies: true })).toMatchInlineSnapshot(`
129
+ "--- from: user (tommy)
130
+ Steer past the queue slow-marker
131
+ --- from: assistant (TestBot)
132
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
133
+ --- from: user (tommy)
134
+ Later queued-one. queue
135
+ --- from: assistant (TestBot)
136
+ [reply to tommy: Later queued-one. queue]
137
+ -# Queued
138
+ --- from: user (tommy)
139
+ Now steer-marker
140
+ --- from: assistant (TestBot)
141
+ steer ok
142
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
143
+ [reply to tommy: Later queued-one. queue]
144
+ -# Queued message sent
145
+ queued one ok
146
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
147
+ `);
148
+ });
149
+ test('. queue on an idle thread runs at once, like a plain message', async () => {
150
+ const thread = await startSlowThread('Idle queue');
151
+ await waitForFooter({ discord: twin.discord, threadId: thread.id });
152
+ await twin.discord.thread(thread.id).user(TEST_USER_ID).sendMessage({ content: 'Nothing waits idle-marker. queue' });
153
+ await waitForFooter({ discord: twin.discord, threadId: thread.id, count: 2 });
154
+ expect(await twin.discord.thread(thread.id).text({ showReplies: true })).toMatchInlineSnapshot(`
155
+ "--- from: user (tommy)
156
+ Idle queue slow-marker
157
+ --- from: assistant (TestBot)
158
+ -# *using deterministic-provider/deterministic-v2 ⋅ build*
159
+ slow-done
160
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
161
+ --- from: user (tommy)
162
+ Nothing waits idle-marker. queue
163
+ --- from: assistant (TestBot)
164
+ idle ok
165
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
166
+ `);
167
+ });
168
+ //# sourceMappingURL=queue-sources.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-sources.e2e.test.js","sourceRoot":"","sources":["../src/queue-sources.e2e.test.ts"],"names":[],"mappings":"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"}
package/dist/queue.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { SessionInboxInfo, V2Event } from '@opencode/client';
2
2
  import type { Draft } from 'immer';
3
3
  import type { Bot } from './bot.ts';
4
+ import { type DiscordPayload } from './markdown/components.ts';
4
5
  import type { Emit, ThreadView } from './thread-reducer.ts';
5
6
  export type PendingInput = {
6
7
  inboxID: string;
@@ -8,11 +9,18 @@ export type PendingInput = {
8
9
  text: string;
9
10
  username: string | null;
10
11
  messageId: string | null;
12
+ replyTo: string | null;
11
13
  acked: boolean;
12
14
  echo: string | null;
13
15
  };
14
16
  export declare function queuedItems(view: Pick<ThreadView, 'inbox'>): readonly PendingInput[];
15
- export declare function formatEcho({ username, text }: {
17
+ export declare function discordMessageId(messageId: string): string | null;
18
+ export declare function formatEcho(input: {
19
+ username: string | null;
20
+ text: string;
21
+ }): string;
22
+ export declare function echoPayloads(echo: string): DiscordPayload[];
23
+ export declare function formatEchoReply(input: {
16
24
  username: string | null;
17
25
  text: string;
18
26
  }): string;
@@ -1,5 +1,6 @@
1
1
  // Phase 3: the queue on the native OpenCode inbox. `. queue` waits for the run,
2
- // message delete/edit and /clear-queue change the inbox.
2
+ // message delete/edit and /clear-queue change the inbox. Other sources
3
+ // (CLI, TUI, promotion) are in queue-sources.e2e.
3
4
  import fs from 'node:fs';
4
5
  import { setTimeout as sleep } from 'node:timers/promises';
5
6
  import { afterAll, beforeAll, expect, onTestFinished, test } from 'vitest';
@@ -8,7 +9,7 @@ function reply(marker, text) {
8
9
  return { id: marker, priority: 50, when: { latestUserTextIncludes: marker }, then: { parts: textParts(text) } };
9
10
  }
10
11
  const matchers = [
11
- slowTextMatcher({ marker: 'slow-marker', text: 'slow-done', delayMs: 2_500 }),
12
+ slowTextMatcher({ marker: 'slow-marker', text: 'slow-done', delayMs: 1_500 }),
12
13
  reply('steer-marker', 'steer ok'),
13
14
  reply('queued-one', 'queued one ok'),
14
15
  reply('queued-two', 'queued two ok'),
@@ -66,15 +67,15 @@ async function expectNever({ threadId, text }) {
66
67
  expect(messages.some((message) => message.content.includes(text))).toBe(false);
67
68
  }
68
69
  }
69
- test('. queue waits for the run, acks with position, echoes when it starts', async () => {
70
+ test('. queue waits for the run, acks with position, replies to the message when it starts', async () => {
70
71
  const thread = await startSlowThread('Queue after me');
71
72
  const user = twin.discord.thread(thread.id).user(TEST_USER_ID);
72
- await user.sendMessage({ content: 'First queued-one. queue' });
73
+ const first = await user.sendMessage({ content: 'First queued-one. queue' });
73
74
  await waitForBotMessageContaining({ discord: twin.discord, threadId: thread.id, text: 'position 1' });
74
- await user.sendMessage({ content: 'Second queued-two. queue' });
75
+ const second = await user.sendMessage({ content: 'Second queued-two. queue' });
75
76
  await waitForBotMessageContaining({ discord: twin.discord, threadId: thread.id, text: 'queued two ok' });
76
77
  await waitForFooter({ discord: twin.discord, threadId: thread.id, count: 3 });
77
- expect(await twin.discord.thread(thread.id).text()).toMatchInlineSnapshot(`
78
+ expect(await twin.discord.thread(thread.id).text({ showReplies: true })).toMatchInlineSnapshot(`
78
79
  "--- from: user (tommy)
79
80
  Queue after me slow-marker
80
81
  --- from: assistant (TestBot)
@@ -82,20 +83,27 @@ test('. queue waits for the run, acks with position, echoes when it starts', asy
82
83
  --- from: user (tommy)
83
84
  First queued-one. queue
84
85
  --- from: assistant (TestBot)
85
- -# Queued message sent
86
+ [reply to tommy: First queued-one. queue]
87
+ -# Queued
86
88
  --- from: user (tommy)
87
89
  Second queued-two. queue
88
90
  --- from: assistant (TestBot)
89
- -# Queued message sent
91
+ [reply to tommy: Second queued-two. queue]
92
+ -# Queued
90
93
  slow-done
91
- -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
92
- » **tommy:** First queued-one
94
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
95
+ [reply to tommy: First queued-one. queue]
96
+ -# Queued message sent
93
97
  queued one ok
94
- -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
95
- » **tommy:** Second queued-two
98
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
99
+ [reply to tommy: Second queued-two. queue]
100
+ -# Queued message sent
96
101
  queued two ok
97
- -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
102
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
98
103
  `);
104
+ const messages = await twin.discord.thread(thread.id).getMessages();
105
+ const sent = messages.filter((message) => message.content === '-# Queued message sent');
106
+ expect(sent.map((message) => message.message_reference?.message_id)).toEqual([first.id, second.id]);
99
107
  });
100
108
  test('message delete takes items out of the queue, edit re-queues', async () => {
101
109
  const thread = await startSlowThread('Queue edits');
@@ -131,24 +139,29 @@ test('message delete takes items out of the queue, edit re-queues', async () =>
131
139
  await user.editMessage({ messageId: edited.id, content: 'New text edited-marker. queue' });
132
140
  await waitForBotMessageContaining({ discord: twin.discord, threadId: thread.id, text: 'edited ok' });
133
141
  await waitForFooter({ discord: twin.discord, threadId: thread.id, count: 2 });
134
- expect(await twin.discord.thread(thread.id).text()).toMatchInlineSnapshot(`
142
+ expect(await twin.discord.thread(thread.id).text({ showReplies: true })).toMatchInlineSnapshot(`
135
143
  "--- from: user (tommy)
136
144
  Queue edits slow-marker
137
145
  --- from: assistant (TestBot)
138
146
  -# *using deterministic-provider/deterministic-v2 ⋅ build*
147
+ [reply to unknown message]
139
148
  -# Removed from queue
149
+ [reply to unknown message]
140
150
  -# Removed from queue
141
151
  --- from: user (tommy)
142
152
  New text edited-marker. queue
143
153
  [attachment: queued-notes.txt]
144
154
  --- from: assistant (TestBot)
155
+ [reply to tommy: New text edited-marker. queue]
145
156
  -# Removed from queue
146
- -# Queued message sent
157
+ [reply to tommy: New text edited-marker. queue]
158
+ -# Queued
147
159
  slow-done
148
- -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
149
- » **tommy:** New text edited-marker
160
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
161
+ [reply to tommy: New text edited-marker. queue]
162
+ -# Queued message sent
150
163
  edited ok
151
- -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
164
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
152
165
  `);
153
166
  await expectNever({ threadId: thread.id, text: 'queued one ok' });
154
167
  await expectNever({ threadId: thread.id, text: 'queued two ok' });
@@ -171,7 +184,7 @@ test('a revoked user cannot replace a queued prompt', async () => {
171
184
  await twin.discord.prisma.guildMember.update({ where: member, data: { roles: JSON.stringify([deny.id]) } });
172
185
  await user.editMessage({ messageId: queued.id, content: 'Replacement edited-marker. queue' });
173
186
  await waitForFooter({ discord: twin.discord, threadId: thread.id, count: 2 });
174
- expect(await twin.discord.thread(thread.id).text()).toMatchInlineSnapshot(`
187
+ expect(await twin.discord.thread(thread.id).text({ showReplies: true })).toMatchInlineSnapshot(`
175
188
  "--- from: user (tommy)
176
189
  Queue before revocation slow-marker
177
190
  --- from: assistant (TestBot)
@@ -179,12 +192,14 @@ test('a revoked user cannot replace a queued prompt', async () => {
179
192
  --- from: user (tommy)
180
193
  Replacement edited-marker. queue
181
194
  --- from: assistant (TestBot)
182
- -# Queued message sent
195
+ [reply to tommy: Replacement edited-marker. queue]
196
+ -# Queued
183
197
  slow-done
184
- -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
185
- » **tommy:** Original queued-one
198
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
199
+ [reply to tommy: Replacement edited-marker. queue]
200
+ -# Queued message sent
186
201
  queued one ok
187
- -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
202
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
188
203
  `);
189
204
  expect(await twin.discord.thread(thread.id).text()).toContain('queued one ok');
190
205
  expect(await twin.discord.thread(thread.id).text()).not.toContain('edited ok');
@@ -199,21 +214,24 @@ test('/queue and /clear-queue', async () => {
199
214
  await user.runSlashCommand({ name: 'clear-queue', options: [{ name: 'position', type: 4, value: 1 }] });
200
215
  await waitForBotMessageContaining({ discord: twin.discord, threadId: thread.id, text: 'queued two ok' });
201
216
  await waitForFooter({ discord: twin.discord, threadId: thread.id, count: 2 });
202
- expect(await twin.discord.thread(thread.id).text()).toMatchInlineSnapshot(`
217
+ expect(await twin.discord.thread(thread.id).text({ showReplies: true })).toMatchInlineSnapshot(`
203
218
  "--- from: user (tommy)
204
219
  Slash queue slow-marker
205
220
  --- from: assistant (TestBot)
206
221
  -# *using deterministic-provider/deterministic-v2 ⋅ build*
207
- » **tommy:** Slash queued-one
222
+ -# » **tommy:** Slash queued-one
223
+ [reply to TestBot: -# » **tommy:** Slash queued-one]
208
224
  -# Removed from queue
209
- » **tommy:** Slash queued-two
210
- -# Queued message sent
225
+ -# » **tommy:** Slash queued-two
226
+ [reply to TestBot: -# » **tommy:** Slash queued-two]
227
+ -# Queued
211
228
  -# Cleared 1 queued message
212
229
  slow-done
213
- -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
214
- » **tommy:** Slash queued-two
230
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
231
+ [reply to TestBot: -# » **tommy:** Slash queued-two]
232
+ -# Queued message sent
215
233
  queued two ok
216
- -# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
234
+ -# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
217
235
  `);
218
236
  await expectNever({ threadId: thread.id, text: 'queued one ok' });
219
237
  });
@@ -1 +1 @@
1
- {"version":3,"file":"queue.e2e.test.js","sourceRoot":"","sources":["../src/queue.e2e.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queue.e2e.test.js","sourceRoot":"","sources":["../src/queue.e2e.test.ts"],"names":[],"mappings":"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"}
package/dist/queue.js CHANGED
@@ -4,49 +4,115 @@
4
4
  //
5
5
  // inbox.enqueued (queue, while busy) ─▶ "Queued at position N" ack
6
6
  // inbox.enqueued (steer, echo) ─▶ the echo line (wakes, scheduled runs, TUI prompts)
7
- // inbox.delivered ─▶ "» user: text" echo, ack says "Queued message sent"
7
+ // inbox.delivered (or promoted) ─▶ "Queued message sent" reply to the user message, ack says "Queued"
8
8
  // inbox.cancelled ─▶ ack says "Removed from queue"
9
9
  //
10
+ // Every acked item gets that reply when it starts, in threads and coordinator
11
+ // channels alike. The prompt text is never posted again. Prompts without a Discord
12
+ // message (CLI, routines, TUI) have nothing for the ack to reply to: the ack
13
+ // shows the full prompt, and the "Queued message sent" reply goes to the ack.
14
+ //
10
15
  // A queued prompt's inbox ID is msg_discord_<messageId> (prompt.ts), so a
11
16
  // message delete or an edit maps to the item by ID alone. Items without a
12
17
  // Discord source message (/queue, CLI, commands) are removed with /clear-queue.
13
18
  // The Discord handlers live in ingress.ts: this file must not import writers.
14
19
  import { asSubtext, textOnly } from "./format-parts.js";
15
20
  import { stripTurnContext } from "./system-prompt.js";
16
- const ECHO_LIMIT = 1_900;
21
+ import { markdownPayloads } from "./markdown/components.js";
22
+ import { DISCORD_TEXT_LIMIT } from "./markdown/render-markdown.js";
17
23
  export function queuedItems(view) {
18
24
  return view.inbox.filter((item) => item.delivery === 'queue');
19
25
  }
20
26
  function ackKey(inboxID) {
21
27
  return `queue:${inboxID}`;
22
28
  }
23
- function inputFields(payload) {
29
+ // CLI and scheduled prompts carry a UUID, not a Discord message to reply to.
30
+ export function discordMessageId(messageId) {
31
+ return /^\d+$/.test(messageId) ? messageId : null;
32
+ }
33
+ function inputFields({ payload, channelId }) {
24
34
  const text = stripTurnContext(payload.text);
25
35
  const discord = payload.metadata?.['discord'];
26
36
  // Sent outside Discord (TUI, other clients): echo it like V1 external sync did.
27
37
  if (!discord || typeof discord !== 'object' || Array.isArray(discord)) {
28
- return { external: true, text, username: null, messageId: null, echo: text.trim() ? formatEcho({ username: 'user', text }) : null };
38
+ return { external: true, text, username: null, messageId: null, replyTo: null, echo: text.trim() ? formatEcho({ username: 'user', text }) : null };
29
39
  }
30
40
  const username = discord['username'];
31
- const messageId = discord['messageId'];
41
+ const raw = discord['messageId'];
32
42
  const echo = discord['echo'];
43
+ const messageId = typeof raw === 'string' ? discordMessageId(raw) : null;
33
44
  return {
34
45
  external: false,
35
46
  text,
36
47
  username: typeof username === 'string' ? username : null,
37
- // CLI and scheduled prompts carry a UUID, not a Discord message to reply to.
38
- messageId: typeof messageId === 'string' && /^\d+$/.test(messageId) ? messageId : null,
48
+ messageId,
49
+ // A coordinator prompt's conversation is the project channel itself.
50
+ replyTo: discord['threadId'] === channelId ? messageId : null,
39
51
  // Shown when a prompt without a Discord message is taken (wake, scheduled run).
40
52
  echo: typeof echo === 'string' ? echo : null,
41
53
  };
42
54
  }
43
- export function formatEcho({ username, text }) {
44
- const body = text.length > ECHO_LIMIT ? `${text.slice(0, ECHO_LIMIT - 1)}…` : text;
45
- return `» **${username ?? 'queued'}:** ${body}`;
55
+ function echoLine({ username, text }) {
56
+ // Block markdown only renders at the start of a line, so it goes below the prefix.
57
+ const separator = BLOCK_MARKDOWN_START.test(text) ? '\n' : ' ';
58
+ return `» **${username ?? 'queued'}:**${separator}${text}`;
59
+ }
60
+ // Headings, quotes, lists, code fences, rules, tables and subtext.
61
+ const BLOCK_MARKDOWN_START = /^ {0,3}(#{1,6}(\s|$)|-#\s|>|[-*+]\s|\d{1,9}[.)]\s|```|~~~|-{3,}\s*$|\|)/;
62
+ const CODE_FENCE = /^ {0,3}(```|~~~)/;
63
+ // Every prompt the bot posts (CLI, routines, TUI, voice, slash commands) is
64
+ // subtext, so it reads apart from model output. A long one becomes several messages (effects.ts).
65
+ export function formatEcho(input) {
66
+ return subtext(echoLine(input));
67
+ }
68
+ // A long echo (formatEcho) as several messages, split like model markdown.
69
+ // Each piece gets its `-# ` again: a line cut at a word break would lose it.
70
+ export function echoPayloads(echo) {
71
+ return markdownPayloads(echo).map((payload) => ('content' in payload ? { content: subtext(payload.content.trim()) } : payload));
72
+ }
73
+ // A slash command reply stands in for the user message: one Discord message, long text is cut.
74
+ export function formatEchoReply(input) {
75
+ return cut(formatEcho(input), DISCORD_TEXT_LIMIT);
76
+ }
77
+ // Every non-empty line gets `-# `. Subtext only renders inline markdown: code
78
+ // blocks stay as they are, headings become bold, other block markers show as text.
79
+ function subtext(text) {
80
+ let fenced = false;
81
+ return text
82
+ .split('\n')
83
+ .flatMap((line) => {
84
+ if (CODE_FENCE.test(line))
85
+ fenced = !fenced;
86
+ else if (!fenced && line.trim() === '')
87
+ return [];
88
+ else if (!fenced && !line.startsWith('-# '))
89
+ return [asSubtext(line.replace(HEADING, '**$1**'))];
90
+ return [line];
91
+ })
92
+ .join('\n');
46
93
  }
47
- function closeAck({ emit }, item, content) {
94
+ const HEADING = /^ {0,3}#{1,6}\s+(.+?)\s*$/;
95
+ function cut(text, limit) {
96
+ return text.length > limit ? `${text.slice(0, limit - 1)}…` : text;
97
+ }
98
+ // The ack of a prompt with a Discord message replies to it. Without one (CLI,
99
+ // routines, TUI) the ack itself shows the prompt, and its status line below.
100
+ function ackContent(item, status) {
101
+ if (item.messageId)
102
+ return asSubtext(status ?? '');
103
+ const line = status ? `\n${asSubtext(status)}` : '';
104
+ return `${cut(subtext(item.echo ?? echoLine(item)), DISCORD_TEXT_LIMIT - line.length)}${line}`;
105
+ }
106
+ function closeAck({ emit }, item, status) {
48
107
  if (item.acked)
49
- emit({ type: 'edit', key: ackKey(item.inboxID), messages: [textOnly(asSubtext(content))] });
108
+ emit({ type: 'edit', key: ackKey(item.inboxID), messages: [textOnly(ackContent(item, status))] });
109
+ }
110
+ // An acked item starts running. The user message (or the ack without one)
111
+ // already shows the prompt: a reply to it marks where it runs, instead of a
112
+ // second copy. Also in a coordinator, where the answer may post no text (IDLE).
113
+ function markStarted({ emit }, item) {
114
+ const ack = textOnly(ackContent(item, item.messageId ? 'Queued' : null));
115
+ emit({ type: 'edit', key: ackKey(item.inboxID), messages: [ack], reply: asSubtext('Queued message sent'), replyTo: item.messageId });
50
116
  }
51
117
  // Removes the item from the inbox; returns it when it was still queued.
52
118
  function takeQueued({ draft }, inboxID) {
@@ -60,35 +126,38 @@ export function enqueueInput(slice) {
60
126
  const { item, inboxID } = data;
61
127
  if (item.type !== 'user' || draft.inbox.some((candidate) => candidate.inboxID === inboxID))
62
128
  return;
63
- const { external, ...fields } = inputFields(item.payload);
129
+ const { external, ...fields } = inputFields({ payload: item.payload, channelId: draft.channelId });
64
130
  // The expanded prompt of a command Kimaki ran: the queue echo shows the typed command, never the template.
65
131
  const command = external ? draft.commandPending : null;
66
132
  if (external)
67
133
  draft.commandPending = null;
68
- const meta = command ? { ...fields, ...command, echo: null } : fields;
134
+ const meta = command ? { ...fields, ...command } : fields;
69
135
  // Idle with nothing pending: OpenCode runs it at once, like a normal message.
70
136
  const acked = item.delivery === 'queue' && (busy || draft.inbox.length > 0);
71
- draft.inbox.push({ inboxID, delivery: item.delivery, ...meta, acked });
137
+ const pending = { inboxID, delivery: item.delivery, ...meta, acked };
138
+ draft.inbox.push(pending);
72
139
  if (item.delivery !== 'queue') {
73
140
  if (!meta.echo)
74
141
  return;
75
- emit({ type: 'send', text: meta.echo });
142
+ emit({ type: 'send', text: meta.echo, echo: true });
76
143
  draft.lastKind = null;
77
144
  return;
78
145
  }
79
146
  if (!acked)
80
147
  return;
81
148
  const position = queuedItems(draft).length;
82
- const ack = textOnly(asSubtext(`Queued at position ${position}. Delete the original message to remove it, or use /clear-queue position:${position}`));
83
- emit({ type: 'show', key: ackKey(inboxID), messages: [ack], replyTo: meta.messageId, notify: false });
149
+ const remove = meta.messageId ? 'Delete the original message to remove it, or use' : 'Remove it with';
150
+ const ack = textOnly(ackContent(pending, `Queued at position ${position}. ${remove} /clear-queue position:${position}`));
151
+ emit({ type: 'show', key: ackKey(inboxID), messages: [ack], replyTo: meta.messageId, notify: false, echo: true });
84
152
  }
85
153
  export function deliverQueued(slice) {
86
154
  const item = takeQueued(slice, slice.inboxID);
87
155
  if (!item || (!item.acked && !item.echo))
88
156
  return;
89
- closeAck(slice, item, 'Queued message sent');
90
- slice.emit({ type: 'send', text: item.echo ?? formatEcho(item) });
91
157
  slice.draft.lastKind = null;
158
+ if (item.acked)
159
+ return markStarted(slice, item);
160
+ slice.emit({ type: 'send', text: item.echo ?? formatEcho(item), echo: true });
92
161
  }
93
162
  export function cancelQueued(slice) {
94
163
  const item = takeQueued(slice, slice.inboxID);
@@ -100,7 +169,8 @@ export function promoteQueued(slice) {
100
169
  const item = slice.draft.inbox.find((candidate) => candidate.inboxID === slice.inboxID);
101
170
  if (item?.delivery !== 'queue')
102
171
  return;
103
- closeAck(slice, { ...item }, 'Queued message sent');
172
+ if (item.acked)
173
+ markStarted(slice, { ...item });
104
174
  item.delivery = 'steer';
105
175
  }
106
176
  // After a (re)connect: the inbox as OpenCode has it now. Items this view does
@@ -119,9 +189,12 @@ export function hydrateQueue(slice) {
119
189
  const existing = known.get(item.id);
120
190
  if (existing?.delivery === item.delivery)
121
191
  return existing;
122
- if (existing?.delivery === 'queue' && item.delivery === 'steer')
123
- closeAck(slice, existing, 'Queued message sent');
124
- const { external: _external, ...fields } = inputFields(item.payload);
192
+ if (existing?.delivery === 'queue' && item.delivery === 'steer') {
193
+ if (existing.acked)
194
+ markStarted(slice, existing);
195
+ return { ...existing, delivery: 'steer' };
196
+ }
197
+ const { external: _external, ...fields } = inputFields({ payload: item.payload, channelId: draft.channelId });
125
198
  return { inboxID: item.id, delivery: item.delivery, ...fields, acked: item.delivery === 'queue' };
126
199
  });
127
200
  }