kimaki 1.3.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 (346) 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 +13 -6
  15. package/dist/bot.js +17 -15
  16. package/dist/bot.js.map +1 -1
  17. package/dist/btw.e2e.test.js +3 -3
  18. package/dist/builtin-skills.d.ts +3 -0
  19. package/dist/builtin-skills.js +29 -0
  20. package/dist/builtin-skills.js.map +1 -1
  21. package/dist/builtin-skills.test.js +72 -1
  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.d.ts +1 -1
  25. package/dist/cli/bot.js +33 -18
  26. package/dist/cli/bot.js.map +1 -1
  27. package/dist/cli/discord.js +32 -6
  28. package/dist/cli/discord.js.map +1 -1
  29. package/dist/cli/schedule.js +23 -9
  30. package/dist/cli/schedule.js.map +1 -1
  31. package/dist/cli/session.js +37 -12
  32. package/dist/cli/session.js.map +1 -1
  33. package/dist/cli/shared.d.ts +5 -3
  34. package/dist/cli/shared.js +45 -10
  35. package/dist/cli/shared.js.map +1 -1
  36. package/dist/cli-discord.e2e.test.js +13 -8
  37. package/dist/cli-discord.e2e.test.js.map +1 -1
  38. package/dist/cli-lock.e2e.test.js +87 -20
  39. package/dist/cli-lock.e2e.test.js.map +1 -1
  40. package/dist/cli-read.e2e.test.js +18 -9
  41. package/dist/cli-read.e2e.test.js.map +1 -1
  42. package/dist/cli-sessions.e2e.test.js +4 -3
  43. package/dist/cli-sessions.e2e.test.js.map +1 -1
  44. package/dist/cli.js +2 -0
  45. package/dist/cli.js.map +1 -1
  46. package/dist/commands/preference-commands.d.ts +4 -0
  47. package/dist/commands/preference-commands.js +38 -4
  48. package/dist/commands/preference-commands.js.map +1 -1
  49. package/dist/commands/session-commands.js +11 -8
  50. package/dist/commands/session-commands.js.map +1 -1
  51. package/dist/commands/thread-commands.js +94 -24
  52. package/dist/commands/thread-commands.js.map +1 -1
  53. package/dist/commands/worktree-commands.d.ts +5 -6
  54. package/dist/commands/worktree-commands.js +8 -7
  55. package/dist/commands/worktree-commands.js.map +1 -1
  56. package/dist/commands.e2e.test.js +25 -21
  57. package/dist/commands.e2e.test.js.map +1 -1
  58. package/dist/coordinator-agents.e2e.test.d.ts +1 -0
  59. package/dist/coordinator-agents.e2e.test.js +113 -0
  60. package/dist/coordinator-agents.e2e.test.js.map +1 -0
  61. package/dist/coordinator-idle.e2e.test.d.ts +1 -0
  62. package/dist/coordinator-idle.e2e.test.js +100 -0
  63. package/dist/coordinator-idle.e2e.test.js.map +1 -0
  64. package/dist/coordinator-queue.e2e.test.d.ts +1 -0
  65. package/dist/coordinator-queue.e2e.test.js +244 -0
  66. package/dist/coordinator-queue.e2e.test.js.map +1 -0
  67. package/dist/coordinator-warmup.e2e.test.d.ts +1 -0
  68. package/dist/coordinator-warmup.e2e.test.js +131 -0
  69. package/dist/coordinator-warmup.e2e.test.js.map +1 -0
  70. package/dist/coordinator.d.ts +6 -0
  71. package/dist/coordinator.e2e.test.d.ts +1 -0
  72. package/dist/coordinator.e2e.test.js +505 -0
  73. package/dist/coordinator.e2e.test.js.map +1 -0
  74. package/dist/coordinator.js +164 -0
  75. package/dist/coordinator.js.map +1 -0
  76. package/dist/db.d.ts +78 -3
  77. package/dist/db.test.js +1 -0
  78. package/dist/db.test.js.map +1 -1
  79. package/dist/diagram.d.ts +11 -0
  80. package/dist/diagram.js +232 -0
  81. package/dist/diagram.js.map +1 -0
  82. package/dist/diagram.test.d.ts +1 -0
  83. package/dist/diagram.test.js +52 -0
  84. package/dist/diagram.test.js.map +1 -0
  85. package/dist/duration.js +13 -5
  86. package/dist/duration.js.map +1 -1
  87. package/dist/effects.d.ts +6 -1
  88. package/dist/effects.js +97 -26
  89. package/dist/effects.js.map +1 -1
  90. package/dist/event-loop.d.ts +2 -3
  91. package/dist/event-loop.js +74 -44
  92. package/dist/event-loop.js.map +1 -1
  93. package/dist/format-parts.d.ts +21 -4
  94. package/dist/format-parts.js +40 -23
  95. package/dist/format-parts.js.map +1 -1
  96. package/dist/gateway-replay.e2e.test.js +4 -4
  97. package/dist/harness.e2e.test.js +2 -2
  98. package/dist/harness.e2e.test.js.map +1 -1
  99. package/dist/hello-thread.e2e.test.js +56 -5
  100. package/dist/hello-thread.e2e.test.js.map +1 -1
  101. package/dist/ingress.js +47 -12
  102. package/dist/ingress.js.map +1 -1
  103. package/dist/interaction-context.d.ts +4 -4
  104. package/dist/interaction-context.js +9 -7
  105. package/dist/interaction-context.js.map +1 -1
  106. package/dist/interrupt.e2e.test.js +8 -5
  107. package/dist/interrupt.e2e.test.js.map +1 -1
  108. package/dist/legacy.e2e.test.js +1 -1
  109. package/dist/lock-routes.d.ts +83 -31
  110. package/dist/lock-routes.js +68 -8
  111. package/dist/lock-routes.js.map +1 -1
  112. package/dist/lock-server.d.ts +3 -2
  113. package/dist/lock-server.js +23 -7
  114. package/dist/lock-server.js.map +1 -1
  115. package/dist/main.d.ts +6 -3
  116. package/dist/main.js +14 -4
  117. package/dist/main.js.map +1 -1
  118. package/dist/mainmast-idle.e2e.test.d.ts +1 -0
  119. package/dist/mainmast-idle.e2e.test.js +99 -0
  120. package/dist/mainmast-idle.e2e.test.js.map +1 -0
  121. package/dist/mainmast-queue.e2e.test.d.ts +1 -0
  122. package/dist/mainmast-queue.e2e.test.js +244 -0
  123. package/dist/mainmast-queue.e2e.test.js.map +1 -0
  124. package/dist/mainmast-warmup.e2e.test.d.ts +1 -0
  125. package/dist/mainmast-warmup.e2e.test.js +130 -0
  126. package/dist/mainmast-warmup.e2e.test.js.map +1 -0
  127. package/dist/mainmast.d.ts +6 -0
  128. package/dist/mainmast.e2e.test.d.ts +1 -0
  129. package/dist/mainmast.e2e.test.js +428 -0
  130. package/dist/mainmast.e2e.test.js.map +1 -0
  131. package/dist/mainmast.js +156 -0
  132. package/dist/mainmast.js.map +1 -0
  133. package/dist/markdown/markdown.test.js +14 -4
  134. package/dist/markdown/markdown.test.js.map +1 -1
  135. package/dist/markdown/render-markdown.js +9 -6
  136. package/dist/markdown/render-markdown.js.map +1 -1
  137. package/dist/onboarding-cli.e2e.test.js +7 -6
  138. package/dist/onboarding-cli.e2e.test.js.map +1 -1
  139. package/dist/onboarding.d.ts +3 -10
  140. package/dist/onboarding.e2e.test.js +8 -10
  141. package/dist/onboarding.e2e.test.js.map +1 -1
  142. package/dist/onboarding.js +14 -24
  143. package/dist/onboarding.js.map +1 -1
  144. package/dist/permissions.e2e.test.js +3 -3
  145. package/dist/plugin/coordinator.d.ts +4 -0
  146. package/dist/plugin/coordinator.js +389 -0
  147. package/dist/plugin/coordinator.js.map +1 -0
  148. package/dist/plugin/index.js +93 -61
  149. package/dist/plugin/index.js.map +1 -1
  150. package/dist/plugin/mainmast.d.ts +4 -0
  151. package/dist/plugin/mainmast.js +379 -0
  152. package/dist/plugin/mainmast.js.map +1 -0
  153. package/dist/plugin.e2e.test.js +1 -1
  154. package/dist/preference-commands.e2e.test.js +103 -24
  155. package/dist/preference-commands.e2e.test.js.map +1 -1
  156. package/dist/project.d.ts +1 -1
  157. package/dist/prompt.d.ts +22 -9
  158. package/dist/prompt.js +64 -48
  159. package/dist/prompt.js.map +1 -1
  160. package/dist/questions.e2e.test.js +13 -13
  161. package/dist/queue-sources.e2e.test.d.ts +1 -0
  162. package/dist/queue-sources.e2e.test.js +168 -0
  163. package/dist/queue-sources.e2e.test.js.map +1 -0
  164. package/dist/queue.d.ts +9 -1
  165. package/dist/queue.e2e.test.js +48 -30
  166. package/dist/queue.e2e.test.js.map +1 -1
  167. package/dist/queue.js +97 -24
  168. package/dist/queue.js.map +1 -1
  169. package/dist/queue.test.d.ts +1 -0
  170. package/dist/queue.test.js +57 -0
  171. package/dist/queue.test.js.map +1 -0
  172. package/dist/remote-send.e2e.test.js +6 -6
  173. package/dist/remote-send.js +2 -1
  174. package/dist/remote-send.js.map +1 -1
  175. package/dist/renderer.e2e.test.js +7 -7
  176. package/dist/restart.e2e.test.js +2 -2
  177. package/dist/routines.e2e.test.js +2 -2
  178. package/dist/scheduler.d.ts +3 -3
  179. package/dist/scheduler.e2e.test.js +43 -20
  180. package/dist/scheduler.e2e.test.js.map +1 -1
  181. package/dist/scheduler.js +4 -2
  182. package/dist/scheduler.js.map +1 -1
  183. package/dist/schema-sql.d.ts +1 -1
  184. package/dist/schema-sql.js +1 -1
  185. package/dist/schema-sql.js.map +1 -1
  186. package/dist/schema.d.ts +152 -6
  187. package/dist/schema.js +12 -0
  188. package/dist/schema.js.map +1 -1
  189. package/dist/session-commands.e2e.test.js +36 -11
  190. package/dist/session-commands.e2e.test.js.map +1 -1
  191. package/dist/session-events.d.ts +18 -6
  192. package/dist/session-events.js +175 -27
  193. package/dist/session-events.js.map +1 -1
  194. package/dist/session-ops.e2e.test.js +63 -12
  195. package/dist/session-ops.e2e.test.js.map +1 -1
  196. package/dist/sessions.d.ts +44 -21
  197. package/dist/sessions.js +177 -65
  198. package/dist/sessions.js.map +1 -1
  199. package/dist/shell.e2e.test.js +4 -4
  200. package/dist/slash-commands.js +6 -4
  201. package/dist/slash-commands.js.map +1 -1
  202. package/dist/slash-commands.test.js +2 -0
  203. package/dist/slash-commands.test.js.map +1 -1
  204. package/dist/sleep.e2e.test.js +29 -14
  205. package/dist/sleep.e2e.test.js.map +1 -1
  206. package/dist/sleeps.d.ts +2 -1
  207. package/dist/sleeps.js +21 -3
  208. package/dist/sleeps.js.map +1 -1
  209. package/dist/store.d.ts +1 -0
  210. package/dist/store.js +3 -2
  211. package/dist/store.js.map +1 -1
  212. package/dist/system-prompt.d.ts +5 -15
  213. package/dist/system-prompt.js +180 -131
  214. package/dist/system-prompt.js.map +1 -1
  215. package/dist/test/generate-log-plugin/index.d.ts +3 -0
  216. package/dist/test/generate-log-plugin/index.js +15 -0
  217. package/dist/test/generate-log-plugin/index.js.map +1 -0
  218. package/dist/test/harness.d.ts +20 -2
  219. package/dist/test/harness.js +51 -11
  220. package/dist/test/harness.js.map +1 -1
  221. package/dist/test/replay.js +11 -8
  222. package/dist/test/replay.js.map +1 -1
  223. package/dist/thread-reducer.d.ts +29 -6
  224. package/dist/thread-reducer.fixtures.test.js +58 -51
  225. package/dist/thread-reducer.fixtures.test.js.map +1 -1
  226. package/dist/thread-reducer.js +109 -50
  227. package/dist/thread-reducer.js.map +1 -1
  228. package/dist/thread-reducer.test.js +190 -48
  229. package/dist/thread-reducer.test.js.map +1 -1
  230. package/dist/tunnel.d.ts +9 -0
  231. package/dist/tunnel.js +117 -28
  232. package/dist/tunnel.js.map +1 -1
  233. package/dist/tunnel.test.js +81 -5
  234. package/dist/tunnel.test.js.map +1 -1
  235. package/dist/voice-attachments.e2e.test.js +108 -18
  236. package/dist/voice-attachments.e2e.test.js.map +1 -1
  237. package/dist/voice-call.e2e.test.js +9 -9
  238. package/dist/voice-call.js +6 -6
  239. package/dist/voice-call.js.map +1 -1
  240. package/dist/voice-openai.e2e.test.js +59 -23
  241. package/dist/voice-openai.e2e.test.js.map +1 -1
  242. package/dist/voice.d.ts +1 -1
  243. package/dist/voice.js +72 -24
  244. package/dist/voice.js.map +1 -1
  245. package/dist/working-directory.e2e.test.js +11 -11
  246. package/dist/working-directory.e2e.test.js.map +1 -1
  247. package/package.json +11 -5
  248. package/skills/kimaki-tunnel/SKILL.md +3 -2
  249. package/src/agent-ui.e2e.test.ts +27 -13
  250. package/src/agent-ui.ts +2 -1
  251. package/src/analytics.e2e.test.ts +1 -1
  252. package/src/autostart.ts +55 -10
  253. package/src/bot.ts +36 -19
  254. package/src/btw.e2e.test.ts +3 -3
  255. package/src/builtin-skills.test.ts +73 -1
  256. package/src/builtin-skills.ts +33 -0
  257. package/src/catalog-refresh.e2e.test.ts +2 -2
  258. package/src/cli/bot.ts +30 -19
  259. package/src/cli/discord.ts +30 -6
  260. package/src/cli/schedule.ts +23 -9
  261. package/src/cli/session.ts +35 -12
  262. package/src/cli/shared.ts +43 -8
  263. package/src/cli-discord.e2e.test.ts +13 -8
  264. package/src/cli-lock.e2e.test.ts +88 -20
  265. package/src/cli-read.e2e.test.ts +17 -8
  266. package/src/cli-sessions.e2e.test.ts +4 -3
  267. package/src/cli.ts +2 -0
  268. package/src/commands/preference-commands.ts +38 -4
  269. package/src/commands/session-commands.ts +12 -7
  270. package/src/commands/thread-commands.ts +92 -24
  271. package/src/commands/worktree-commands.ts +10 -9
  272. package/src/commands.e2e.test.ts +25 -21
  273. package/src/coordinator-agents.e2e.test.ts +145 -0
  274. package/src/coordinator-idle.e2e.test.ts +122 -0
  275. package/src/coordinator-queue.e2e.test.ts +279 -0
  276. package/src/coordinator-warmup.e2e.test.ts +158 -0
  277. package/src/coordinator.e2e.test.ts +545 -0
  278. package/src/coordinator.ts +168 -0
  279. package/src/db.test.ts +1 -0
  280. package/src/diagram.test.ts +56 -0
  281. package/src/diagram.ts +243 -0
  282. package/src/duration.ts +13 -5
  283. package/src/effects.ts +99 -27
  284. package/src/event-loop.ts +71 -45
  285. package/src/format-parts.ts +53 -22
  286. package/src/gateway-replay.e2e.test.ts +4 -4
  287. package/src/harness.e2e.test.ts +2 -2
  288. package/src/hello-thread.e2e.test.ts +59 -5
  289. package/src/ingress.ts +44 -11
  290. package/src/interaction-context.ts +12 -11
  291. package/src/interrupt.e2e.test.ts +8 -5
  292. package/src/legacy.e2e.test.ts +1 -1
  293. package/src/lock-routes.ts +62 -8
  294. package/src/lock-server.ts +23 -7
  295. package/src/main.ts +26 -10
  296. package/src/markdown/markdown.test.ts +15 -4
  297. package/src/markdown/render-markdown.ts +9 -6
  298. package/src/onboarding-cli.e2e.test.ts +7 -6
  299. package/src/onboarding.e2e.test.ts +8 -10
  300. package/src/onboarding.ts +13 -29
  301. package/src/permissions.e2e.test.ts +3 -3
  302. package/src/plugin/coordinator.ts +401 -0
  303. package/src/plugin/index.ts +86 -59
  304. package/src/plugin.e2e.test.ts +1 -1
  305. package/src/preference-commands.e2e.test.ts +103 -23
  306. package/src/prompt.ts +87 -43
  307. package/src/questions.e2e.test.ts +13 -13
  308. package/src/queue-sources.e2e.test.ts +197 -0
  309. package/src/queue.e2e.test.ts +48 -30
  310. package/src/queue.test.ts +59 -0
  311. package/src/queue.ts +104 -24
  312. package/src/remote-send.e2e.test.ts +6 -6
  313. package/src/remote-send.ts +2 -1
  314. package/src/renderer.e2e.test.ts +7 -7
  315. package/src/restart.e2e.test.ts +2 -2
  316. package/src/routines.e2e.test.ts +2 -2
  317. package/src/scheduler.e2e.test.ts +45 -19
  318. package/src/scheduler.ts +4 -2
  319. package/src/schema-sql.ts +1 -1
  320. package/src/schema.ts +13 -0
  321. package/src/session-commands.e2e.test.ts +38 -11
  322. package/src/session-events.ts +168 -25
  323. package/src/session-ops.e2e.test.ts +64 -11
  324. package/src/sessions.ts +217 -67
  325. package/src/shell.e2e.test.ts +4 -4
  326. package/src/slash-commands.test.ts +2 -0
  327. package/src/slash-commands.ts +6 -4
  328. package/src/sleep.e2e.test.ts +30 -13
  329. package/src/sleeps.ts +20 -3
  330. package/src/store.ts +5 -2
  331. package/src/system-prompt.ts +190 -134
  332. package/src/test/generate-log-plugin/index.ts +16 -0
  333. package/src/test/harness.ts +77 -17
  334. package/src/test/replay.ts +12 -7
  335. package/src/thread-reducer.fixtures.test.ts +58 -51
  336. package/src/thread-reducer.test.ts +199 -49
  337. package/src/thread-reducer.ts +135 -66
  338. package/src/tunnel.test.ts +81 -5
  339. package/src/tunnel.ts +124 -25
  340. package/src/voice-attachments.e2e.test.ts +110 -18
  341. package/src/voice-call.e2e.test.ts +9 -9
  342. package/src/voice-call.ts +6 -6
  343. package/src/voice-openai.e2e.test.ts +64 -24
  344. package/src/voice.ts +93 -26
  345. package/src/working-directory.e2e.test.ts +11 -11
  346. package/src/message-tool.e2e.test.ts +0 -45
@@ -16,6 +16,8 @@ export declare const sendInput: z.ZodObject<{
16
16
  baseBranch: z.ZodOptional<z.ZodString>;
17
17
  worktree: z.ZodOptional<z.ZodString>;
18
18
  notifyOnly: z.ZodOptional<z.ZodBoolean>;
19
+ wait: z.ZodOptional<z.ZodNumber>;
20
+ senderSessionId: z.ZodOptional<z.ZodString>;
19
21
  permissions: z.ZodOptional<z.ZodArray<z.ZodString>>;
20
22
  prompt: z.ZodString;
21
23
  files: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -46,6 +48,8 @@ export declare const lockRoutes: {
46
48
  baseBranch: z.ZodOptional<z.ZodString>;
47
49
  worktree: z.ZodOptional<z.ZodString>;
48
50
  notifyOnly: z.ZodOptional<z.ZodBoolean>;
51
+ wait: z.ZodOptional<z.ZodNumber>;
52
+ senderSessionId: z.ZodOptional<z.ZodString>;
49
53
  permissions: z.ZodOptional<z.ZodArray<z.ZodString>>;
50
54
  prompt: z.ZodString;
51
55
  files: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -71,6 +75,8 @@ export declare const lockRoutes: {
71
75
  baseBranch?: string | undefined;
72
76
  worktree?: string | undefined;
73
77
  notifyOnly?: boolean | undefined;
78
+ wait?: number | undefined;
79
+ senderSessionId?: string | undefined;
74
80
  permissions?: string[] | undefined;
75
81
  files?: {
76
82
  uri: string;
@@ -100,7 +106,10 @@ export declare const lockRoutes: {
100
106
  name: string;
101
107
  }[];
102
108
  }, signal: AbortSignal) => Promise<Error | {
103
- uploaded: string[];
109
+ uploaded: {
110
+ name: string;
111
+ url: string | null;
112
+ }[];
104
113
  }>;
105
114
  };
106
115
  status: {
@@ -125,12 +134,26 @@ export declare const lockRoutes: {
125
134
  }[];
126
135
  }>;
127
136
  };
137
+ 'session.warmup': {
138
+ handle: (bot: Bot, raw: unknown, signal: AbortSignal) => Promise<Error | {
139
+ data: unknown;
140
+ }>;
141
+ input: z.ZodObject<{
142
+ sessionId: z.ZodString;
143
+ }, z.core.$strip>;
144
+ run: (bot: Bot, input: {
145
+ sessionId: string;
146
+ }, signal: AbortSignal) => Promise<Error | DbError | {
147
+ busy: boolean;
148
+ sleeping: boolean;
149
+ }>;
150
+ };
128
151
  restart: {
129
152
  handle: (bot: Bot, raw: unknown, signal: AbortSignal) => Promise<Error | {
130
153
  data: unknown;
131
154
  }>;
132
155
  input: z.ZodObject<{}, z.core.$strip>;
133
- run: (bot: Bot, input: Record<string, never>, signal: AbortSignal) => Promise<Error | ConfigError | {
156
+ run: (bot: Bot, input: Record<string, never>, signal: AbortSignal) => Promise<ConfigError | Error | {
134
157
  restarting: boolean;
135
158
  pid: number;
136
159
  }>;
@@ -144,7 +167,7 @@ export declare const lockRoutes: {
144
167
  }, z.core.$strip>;
145
168
  run: (bot: Bot, input: {
146
169
  durationMs: number;
147
- }, signal: AbortSignal) => Promise<Error | ConfigError | FilesystemError | {
170
+ }, signal: AbortSignal) => Promise<ConfigError | Error | FilesystemError | {
148
171
  path: string;
149
172
  }>;
150
173
  };
@@ -174,7 +197,7 @@ export declare const lockRoutes: {
174
197
  reason?: string | undefined;
175
198
  sessionId?: string | undefined;
176
199
  threadId?: string | undefined;
177
- }, signal: AbortSignal) => Promise<Error | DbError | ConfigError | {
200
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | {
178
201
  sessionId: string;
179
202
  threadId: string;
180
203
  wakeAt: string;
@@ -204,7 +227,7 @@ export declare const lockRoutes: {
204
227
  preRun?: string | undefined;
205
228
  user?: string | undefined;
206
229
  allowConcurrency?: boolean | undefined;
207
- }, signal: AbortSignal) => Promise<Error | DbError | ConfigError | {
230
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | {
208
231
  routineId: number;
209
232
  updated: string[];
210
233
  }>;
@@ -218,7 +241,7 @@ export declare const lockRoutes: {
218
241
  }, z.core.$strip>;
219
242
  run: (bot: Bot, input: {
220
243
  id: number;
221
- }, signal: AbortSignal) => Promise<Error | DbError | ConfigError | {
244
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | {
222
245
  routineId: number;
223
246
  deleted: boolean;
224
247
  }>;
@@ -263,7 +286,7 @@ export declare const lockRoutes: {
263
286
  toolCall?: string | undefined;
264
287
  sessionId?: string | undefined;
265
288
  threadId?: string | undefined;
266
- }, signal: AbortSignal) => Promise<Error | ConfigError | {
289
+ }, signal: AbortSignal) => Promise<ConfigError | Error | {
267
290
  shown: true;
268
291
  } | {
269
292
  paths: string[];
@@ -271,6 +294,19 @@ export declare const lockRoutes: {
271
294
  cancelled: true;
272
295
  }>;
273
296
  };
297
+ 'session.buttons': {
298
+ handle: (bot: Bot, raw: unknown, signal: AbortSignal) => Promise<Error | {
299
+ data: unknown;
300
+ }>;
301
+ input: z.ZodObject<{
302
+ sessionIds: z.ZodArray<z.ZodString>;
303
+ }, z.core.$strip>;
304
+ run: (bot: Bot, input: {
305
+ sessionIds: string[];
306
+ }, signal: AbortSignal) => Promise<Error | {
307
+ [k: string]: string[];
308
+ }>;
309
+ };
274
310
  'upload-request': {
275
311
  handle: (bot: Bot, raw: unknown, signal: AbortSignal) => Promise<Error | {
276
312
  data: unknown;
@@ -290,7 +326,7 @@ export declare const lockRoutes: {
290
326
  toolCall?: string | undefined;
291
327
  sessionId?: string | undefined;
292
328
  threadId?: string | undefined;
293
- }, signal: AbortSignal) => Promise<Error | ConfigError | {
329
+ }, signal: AbortSignal) => Promise<ConfigError | Error | {
294
330
  shown: true;
295
331
  } | {
296
332
  paths: string[];
@@ -367,15 +403,15 @@ export declare const lockRoutes: {
367
403
  input: z.ZodObject<{
368
404
  id: z.ZodString;
369
405
  operation: z.ZodPipe<z.ZodString, z.ZodEnum<{
370
- label: "label";
371
406
  remove: "remove";
372
407
  activate: "activate";
408
+ label: "label";
373
409
  }>>;
374
410
  label: z.ZodOptional<z.ZodString>;
375
411
  }, z.core.$strip>;
376
412
  run: (bot: Bot, input: {
377
413
  id: string;
378
- operation: "label" | "remove" | "activate";
414
+ operation: "remove" | "activate" | "label";
379
415
  label?: string | undefined;
380
416
  }, signal: AbortSignal) => Promise<Error | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | {
381
417
  message: string;
@@ -397,7 +433,7 @@ export declare const lockRoutes: {
397
433
  text: "on" | "off";
398
434
  channelId?: string | undefined;
399
435
  directory?: string | undefined;
400
- }, signal: AbortSignal) => Promise<Error | DbError | ConfigError | {
436
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | {
401
437
  enabled: boolean;
402
438
  }>;
403
439
  };
@@ -416,7 +452,7 @@ export declare const lockRoutes: {
416
452
  clear?: boolean | undefined;
417
453
  channelId?: string | undefined;
418
454
  directory?: string | undefined;
419
- }, signal: AbortSignal) => Promise<Error | DbError | ConfigError | {
455
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | {
420
456
  cleared: boolean;
421
457
  } | {
422
458
  agent: string;
@@ -439,7 +475,7 @@ export declare const lockRoutes: {
439
475
  clear?: boolean | undefined;
440
476
  channelId?: string | undefined;
441
477
  directory?: string | undefined;
442
- }, signal: AbortSignal) => Promise<Error | DbError | ConfigError | {
478
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | {
443
479
  cleared: boolean;
444
480
  } | {
445
481
  model: {
@@ -462,7 +498,7 @@ export declare const lockRoutes: {
462
498
  model?: string | undefined;
463
499
  variant?: string | undefined;
464
500
  clear?: boolean | undefined;
465
- }, signal: AbortSignal) => Promise<Error | DbError | ConfigError | {
501
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | {
466
502
  cleared: boolean;
467
503
  } | {
468
504
  model: {
@@ -478,18 +514,18 @@ export declare const lockRoutes: {
478
514
  }>;
479
515
  input: z.ZodObject<{
480
516
  text: z.ZodPipe<z.ZodString, z.ZodEnum<{
481
- text: "text";
482
517
  tools: "tools";
518
+ text: "text";
483
519
  }>>;
484
520
  channelId: z.ZodOptional<z.ZodString>;
485
521
  directory: z.ZodOptional<z.ZodString>;
486
522
  }, z.core.$strip>;
487
523
  run: (bot: Bot, input: {
488
- text: "text" | "tools";
524
+ text: "tools" | "text";
489
525
  channelId?: string | undefined;
490
526
  directory?: string | undefined;
491
- }, signal: AbortSignal) => Promise<Error | DbError | ConfigError | {
492
- verbosity: "text" | "tools";
527
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | {
528
+ verbosity: "tools" | "text";
493
529
  }>;
494
530
  };
495
531
  'worktree.list': {
@@ -503,7 +539,7 @@ export declare const lockRoutes: {
503
539
  run: (bot: Bot, input: {
504
540
  channelId?: string | undefined;
505
541
  directory?: string | undefined;
506
- }, signal: AbortSignal) => Promise<Error | DbError | ConfigError | import("./worktrees.ts").GitError | {
542
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | import("./worktrees.ts").GitError | {
507
543
  entries: import("./worktrees.ts").GitWorktree[];
508
544
  enabled: boolean;
509
545
  }>;
@@ -548,7 +584,7 @@ export declare const lockRoutes: {
548
584
  targetBranch?: string | undefined;
549
585
  channelId?: string | undefined;
550
586
  directory?: string | undefined;
551
- }, signal: AbortSignal) => Promise<Error | DbError | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | ConfigError | import("./worktrees.ts").GitError | {
587
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | import("./worktrees.ts").GitError | {
552
588
  targetBranch: string;
553
589
  commitCount: number;
554
590
  sha: string;
@@ -576,7 +612,7 @@ export declare const lockRoutes: {
576
612
  targetBranch?: string | undefined;
577
613
  channelId?: string | undefined;
578
614
  directory?: string | undefined;
579
- }, signal: AbortSignal) => Promise<Error | DbError | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | ConfigError | import("./worktrees.ts").GitError | {
615
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | import("./worktrees.ts").GitError | {
580
616
  targetBranch: string;
581
617
  commitCount: number;
582
618
  sha: string;
@@ -595,7 +631,7 @@ export declare const lockRoutes: {
595
631
  run: (bot: Bot, input: {
596
632
  sessionId: string;
597
633
  channelId?: string | undefined;
598
- }, signal: AbortSignal) => Promise<Error | DbError | import("./errors.ts").OpenCodeError | DiscordError | OpenCodeUnavailableError | ConfigError | {
634
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | import("./errors.ts").OpenCodeError | DiscordError | OpenCodeUnavailableError | {
599
635
  title: string;
600
636
  threadId: string;
601
637
  sessionId: string;
@@ -614,7 +650,7 @@ export declare const lockRoutes: {
614
650
  sessionId?: string | undefined;
615
651
  threadId?: string | undefined;
616
652
  directory?: string | undefined;
617
- }, signal: AbortSignal) => Promise<Error | DbError | import("./errors.ts").OpenCodeError | DiscordError | OpenCodeUnavailableError | ConfigError | import("./worktrees.ts").GitError | {
653
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | import("./errors.ts").OpenCodeError | DiscordError | OpenCodeUnavailableError | import("./worktrees.ts").GitError | {
618
654
  directory: string;
619
655
  requestedDirectory?: undefined;
620
656
  } | {
@@ -635,7 +671,7 @@ export declare const lockRoutes: {
635
671
  text: string;
636
672
  sessionId?: string | undefined;
637
673
  threadId?: string | undefined;
638
- }, signal: AbortSignal) => Promise<Error | import("./errors.ts").OpenCodeError | DiscordError | OpenCodeUnavailableError | ConfigError | {
674
+ }, signal: AbortSignal) => Promise<ConfigError | Error | import("./errors.ts").OpenCodeError | DiscordError | OpenCodeUnavailableError | {
639
675
  title: string;
640
676
  }>;
641
677
  };
@@ -650,7 +686,7 @@ export declare const lockRoutes: {
650
686
  run: (bot: Bot, input: {
651
687
  sessionId?: string | undefined;
652
688
  threadId?: string | undefined;
653
- }, signal: AbortSignal) => Promise<Error | DiscordError | OpenCodeUnavailableError | ConfigError | {
689
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DiscordError | OpenCodeUnavailableError | {
654
690
  archived: boolean;
655
691
  }>;
656
692
  };
@@ -665,10 +701,26 @@ export declare const lockRoutes: {
665
701
  run: (bot: Bot, input: {
666
702
  sessionId?: string | undefined;
667
703
  threadId?: string | undefined;
668
- }, signal: AbortSignal) => Promise<Error | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | ConfigError | {
704
+ }, signal: AbortSignal) => Promise<ConfigError | Error | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | {
669
705
  cleared: number;
670
706
  }>;
671
707
  };
708
+ 'session.compact': {
709
+ handle: (bot: Bot, raw: unknown, signal: AbortSignal) => Promise<Error | {
710
+ data: unknown;
711
+ }>;
712
+ input: z.ZodObject<{
713
+ sessionId: z.ZodOptional<z.ZodString>;
714
+ threadId: z.ZodOptional<z.ZodString>;
715
+ }, z.core.$strip>;
716
+ run: (bot: Bot, input: {
717
+ sessionId?: string | undefined;
718
+ threadId?: string | undefined;
719
+ }, signal: AbortSignal) => Promise<ConfigError | Error | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | {
720
+ sessionId: string;
721
+ queued: boolean;
722
+ }>;
723
+ };
672
724
  'session.fork': {
673
725
  handle: (bot: Bot, raw: unknown, signal: AbortSignal) => Promise<Error | {
674
726
  data: unknown;
@@ -684,7 +736,7 @@ export declare const lockRoutes: {
684
736
  threadId?: string | undefined;
685
737
  before?: string | undefined;
686
738
  name?: string | undefined;
687
- }, signal: AbortSignal) => Promise<Error | DbError | import("./errors.ts").OpenCodeError | DiscordError | OpenCodeUnavailableError | ConfigError | import("./worktrees.ts").GitError | {
739
+ }, signal: AbortSignal) => Promise<ConfigError | Error | DbError | import("./errors.ts").OpenCodeError | DiscordError | OpenCodeUnavailableError | import("./worktrees.ts").GitError | {
688
740
  threadId: string;
689
741
  sessionId: string;
690
742
  }>;
@@ -719,7 +771,7 @@ export declare const lockRoutes: {
719
771
  text: string;
720
772
  sessionId?: string | undefined;
721
773
  threadId?: string | undefined;
722
- }, signal: AbortSignal) => Promise<Error | OpenCodeUnavailableError | ConfigError | {
774
+ }, signal: AbortSignal) => Promise<ConfigError | Error | OpenCodeUnavailableError | {
723
775
  started: boolean;
724
776
  }>;
725
777
  };
@@ -764,7 +816,7 @@ export declare const lockRoutes: {
764
816
  run: (bot: Bot, input: {
765
817
  sessionId?: string | undefined;
766
818
  threadId?: string | undefined;
767
- }, signal: AbortSignal) => Promise<Error | import("./errors.ts").OpenCodeError | import("@opencode/client").SessionInboxInfo[] | OpenCodeUnavailableError | ConfigError>;
819
+ }, signal: AbortSignal) => Promise<ConfigError | Error | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | import("@opencode/client").SessionInboxInfo[]>;
768
820
  };
769
821
  'queue.remove': {
770
822
  handle: (bot: Bot, raw: unknown, signal: AbortSignal) => Promise<Error | {
@@ -779,7 +831,7 @@ export declare const lockRoutes: {
779
831
  inboxId: string;
780
832
  sessionId?: string | undefined;
781
833
  threadId?: string | undefined;
782
- }, signal: AbortSignal) => Promise<Error | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | ConfigError | {
834
+ }, signal: AbortSignal) => Promise<ConfigError | Error | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | {
783
835
  removed: boolean;
784
836
  }>;
785
837
  };
@@ -794,7 +846,7 @@ export declare const lockRoutes: {
794
846
  run: (bot: Bot, input: {
795
847
  sessionId?: string | undefined;
796
848
  threadId?: string | undefined;
797
- }, signal: AbortSignal) => Promise<Error | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | ConfigError | {
849
+ }, signal: AbortSignal) => Promise<ConfigError | Error | import("./errors.ts").OpenCodeError | OpenCodeUnavailableError | {
798
850
  cleared: number;
799
851
  }>;
800
852
  };
@@ -11,7 +11,7 @@ import * as errore from 'errore';
11
11
  import * as orm from 'drizzle-orm';
12
12
  import { z } from 'zod';
13
13
  import { parseButton } from "./agent-ui.js";
14
- import { fetchThread, oc, parseModel, projectOf } from "./bot.js";
14
+ import { fetchConversation, isCoordinatorChannel, oc, parseModel, projectOf } from "./bot.js";
15
15
  import { credential, loginCli } from "./commands/login-commands.js";
16
16
  import { setChannelAgent, setChannelModel, setGlobalModel, setVerbosity } from "./commands/preference-commands.js";
17
17
  import { channelWorktrees, manageWorktree, newWorktree, setAutoWorktrees } from "./commands/worktree-commands.js";
@@ -21,7 +21,8 @@ import { abort, cancelQueuedPrompt, clearQueue, send, shell, upload } from "./pr
21
21
  import { createTask, deleteTask, editTask, runTaskNow } from "./scheduler.js";
22
22
  import * as schema from "./schema.js";
23
23
  import { channelForDirectory, channelForSession, fork, resume, sessionCwd } from "./sessions.js";
24
- import { createSleep } from "./sleeps.js";
24
+ import { createSleep, sleepsWarm } from "./sleeps.js";
25
+ import { conversationTyping, workersTyping } from "./thread-reducer.js";
25
26
  import { worktreeName } from "./worktrees.js";
26
27
  // Keeps input and run correlated, and gives the dispatcher one untyped entry point.
27
28
  function route(definition) {
@@ -70,6 +71,10 @@ const sendFields = {
70
71
  // '' asks for an automatic name.
71
72
  worktree: z.string({ error: 'worktree must be a name or an empty string for an automatic name' }).optional(),
72
73
  notifyOnly: z.boolean({ error: 'notifyOnly must be boolean' }).optional(),
74
+ // Seconds the CLI waits for the run (`--wait [seconds]`): a run that ends within them sends no coordinator note.
75
+ wait: z.number({ error: 'wait must be a number of seconds' }).positive({ error: 'wait must be a positive number of seconds' }).optional(),
76
+ // OPENCODE_SESSION_ID of the shell that ran `kimaki send`: a coordinator wakes when the runs it prompted end.
77
+ senderSessionId: text('senderSessionId').optional(),
73
78
  permissions: z.array(z.string(), { error: 'Permission rules must be strings' }).optional(),
74
79
  prompt: text('prompt'),
75
80
  files: z.array(z.object({ uri: z.string(), name: z.string() }), { error: 'files must contain uri and name strings' }).optional(),
@@ -241,6 +246,20 @@ async function snapshotHeap({ dataDir }) {
241
246
  return chmod;
242
247
  return { path: written };
243
248
  }
249
+ // The coordinator or a thread of its channel runs, from the thread views.
250
+ function coordinatorBusy(bot, sessionId) {
251
+ const { sessionThreads, roots, threads } = bot.store.getState();
252
+ // A coordinator's conversation is its channel. A replaced one (/reset-coordinator), one of a
253
+ // channel with coordinator mode off, or a thread session is never busy.
254
+ const channelId = sessionThreads[sessionId];
255
+ if (!channelId || roots[channelId] !== sessionId || !isCoordinatorChannel(bot, channelId))
256
+ return false;
257
+ const view = threads[channelId];
258
+ // An idle coordinator has no view after a bot restart; its threads do.
259
+ if (!view)
260
+ return workersTyping({ threads, channelId });
261
+ return view.coordinator && conversationTyping({ threads, threadId: channelId });
262
+ }
244
263
  const loginField = z.string({ error: 'Login fields must be non-empty strings' }).min(1, { error: 'Login fields must be non-empty strings' }).optional();
245
264
  export const lockRoutes = {
246
265
  send: route({
@@ -273,6 +292,17 @@ export const lockRoutes = {
273
292
  };
274
293
  },
275
294
  }),
295
+ // The plugin keeps a session's prompt cache warm while its coordinator channel is busy
296
+ // or it sleeps (plugin/coordinator.ts).
297
+ 'session.warmup': route({
298
+ input: z.object({ sessionId: text('sessionId') }),
299
+ run: async (bot, { sessionId }) => {
300
+ const sleeping = await sleepsWarm(bot, sessionId);
301
+ if (sleeping instanceof Error)
302
+ return sleeping;
303
+ return { busy: coordinatorBusy(bot, sessionId), sleeping };
304
+ },
305
+ }),
276
306
  restart: route({
277
307
  input: z.object({}),
278
308
  run: async (bot) => {
@@ -350,6 +380,17 @@ export const lockRoutes = {
350
380
  return bot.features.agentUi.request({ ...input, sessionId, content: { buttons }, signal });
351
381
  },
352
382
  }),
383
+ // Labels of buttons each session showed and the user did not click yet (`kimaki session wait`).
384
+ 'session.buttons': route({
385
+ input: z.object({ sessionIds: z.array(text('sessionId'), { error: 'sessionIds must be an array' }) }),
386
+ run: async (bot, { sessionIds }) => {
387
+ const prompts = Object.values(bot.store.getState().threads).flatMap((view) => view.agentUi);
388
+ return Object.fromEntries(sessionIds.map((sessionId) => [
389
+ sessionId,
390
+ prompts.flatMap((prompt) => prompt.sessionId === sessionId ? (prompt.buttons ?? []).map((item) => item.label) : []),
391
+ ]));
392
+ },
393
+ }),
353
394
  'upload-request': route({
354
395
  input: z.object({
355
396
  ...agentUiFields,
@@ -488,10 +529,10 @@ export const lockRoutes = {
488
529
  const target = localSession(bot, input);
489
530
  if (target instanceof Error)
490
531
  return target;
491
- const thread = await fetchThread(bot, target.threadId);
532
+ const thread = await fetchConversation(bot, target.threadId);
492
533
  if (thread instanceof Error)
493
534
  return thread;
494
- return sessionCwd(bot, { thread, directory: input.directory });
535
+ return sessionCwd(bot, { conversation: thread, directory: input.directory });
495
536
  },
496
537
  }),
497
538
  'session.title': route({
@@ -504,9 +545,12 @@ export const lockRoutes = {
504
545
  const renamed = await oc(bot, 'session.update', (client) => client.session.update({ sessionID: target.sessionId, title }));
505
546
  if (renamed instanceof Error)
506
547
  return renamed;
507
- const thread = await fetchThread(bot, target.threadId);
548
+ const thread = await fetchConversation(bot, target.threadId);
508
549
  if (thread instanceof Error)
509
550
  return thread;
551
+ // A coordinator channel keeps its project name.
552
+ if (!thread.isThread())
553
+ return { title };
510
554
  const updated = await thread.setName(title.slice(0, 100)).catch((cause) => new DiscordError({ operation: 'rename thread', cause }));
511
555
  if (updated instanceof Error)
512
556
  return updated;
@@ -519,9 +563,11 @@ export const lockRoutes = {
519
563
  const target = localSession(bot, input);
520
564
  if (target instanceof Error)
521
565
  return target;
522
- const thread = await fetchThread(bot, target.threadId);
566
+ const thread = await fetchConversation(bot, target.threadId);
523
567
  if (thread instanceof Error)
524
568
  return thread;
569
+ if (!thread.isThread())
570
+ return new ConfigError({ reason: 'A coordinator channel cannot be archived' });
525
571
  const archived = await thread.setArchived(true).catch((cause) => new DiscordError({ operation: 'archive thread', cause }));
526
572
  if (archived instanceof Error)
527
573
  return archived;
@@ -537,17 +583,31 @@ export const lockRoutes = {
537
583
  return abort(bot, { threadId: target.threadId });
538
584
  },
539
585
  }),
586
+ 'session.compact': route({
587
+ input: sessionInput({}),
588
+ run: async (bot, input) => {
589
+ const target = localSession(bot, input);
590
+ if (target instanceof Error)
591
+ return target;
592
+ // Queued, so an agent compacting its own session finishes its turn first.
593
+ const sessionID = input.sessionId ?? target.sessionId;
594
+ const compaction = await oc(bot, 'session.compact', (client) => client.session.compact({ sessionID, delivery: 'queue' }));
595
+ if (compaction instanceof Error)
596
+ return compaction;
597
+ return { sessionId: sessionID, queued: true };
598
+ },
599
+ }),
540
600
  'session.fork': route({
541
601
  input: sessionInput({ before: text('before').optional(), name: text('name').optional() }),
542
602
  run: async (bot, input) => {
543
603
  const target = localSession(bot, input);
544
604
  if (target instanceof Error)
545
605
  return target;
546
- const thread = await fetchThread(bot, target.threadId);
606
+ const thread = await fetchConversation(bot, target.threadId);
547
607
  if (thread instanceof Error)
548
608
  return thread;
549
609
  // A child session ID forks that child, not the root.
550
- return fork(bot, { sourceThread: thread, sessionId: input.sessionId ?? target.sessionId, before: input.before, name: input.name, author: cliAuthor(bot) });
610
+ return fork(bot, { source: thread, sessionId: input.sessionId ?? target.sessionId, before: input.before, name: input.name, author: cliAuthor(bot) });
551
611
  },
552
612
  }),
553
613
  'session.command': route({