kimaki 0.26.0 → 0.28.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 (302) hide show
  1. package/dist/agent-model.e2e.test.js +250 -164
  2. package/dist/anthropic-account-identity.js +9 -1
  3. package/dist/anthropic-auth-plugin.js +10 -13
  4. package/dist/anthropic-auth-plugin.test.js +17 -0
  5. package/dist/anthropic-auth-state.js +1 -0
  6. package/dist/bash-tool-schema-plugin.js +32 -0
  7. package/dist/bash-tool-schema-plugin.test.js +49 -0
  8. package/dist/bin.js +73 -19
  9. package/dist/cli-commands/maintenance.js +46 -7
  10. package/dist/cli-commands/project.js +11 -27
  11. package/dist/cli-commands/send.js +30 -1
  12. package/dist/cli-commands/session.js +322 -90
  13. package/dist/cli-commands/task.js +34 -15
  14. package/dist/cli-parsing.test.js +83 -4
  15. package/dist/cli-runner.js +44 -8
  16. package/dist/cli-runner.test.js +27 -0
  17. package/dist/cli-send-thread.e2e.test.js +9 -9
  18. package/dist/cli.js +32 -0
  19. package/dist/commands/abort.js +5 -1
  20. package/dist/commands/action-buttons.js +2 -1
  21. package/dist/commands/add-project.js +4 -7
  22. package/dist/commands/agent.js +164 -32
  23. package/dist/commands/ask-question.js +23 -33
  24. package/dist/commands/ask-question.test.js +43 -1
  25. package/dist/commands/btw.js +28 -6
  26. package/dist/commands/file-upload.js +2 -1
  27. package/dist/commands/fork-subagent.js +2 -4
  28. package/dist/commands/fork.js +4 -4
  29. package/dist/commands/last-sessions.js +17 -10
  30. package/dist/commands/login.js +6 -0
  31. package/dist/commands/merge-worktree.js +47 -14
  32. package/dist/commands/model-variant.js +8 -1
  33. package/dist/commands/model.js +16 -9
  34. package/dist/commands/multioauth.js +1 -0
  35. package/dist/commands/new-worktree.js +170 -102
  36. package/dist/commands/queue.js +3 -2
  37. package/dist/commands/resume.js +4 -4
  38. package/dist/commands/session.js +78 -63
  39. package/dist/commands/user-command.js +6 -8
  40. package/dist/commands/worktrees.js +5 -13
  41. package/dist/config.js +16 -1
  42. package/dist/cpu-profiler.js +211 -0
  43. package/dist/cpu-profiler.test.js +160 -0
  44. package/dist/database.js +152 -3
  45. package/dist/db.js +33 -0
  46. package/dist/db.test.js +267 -1
  47. package/dist/default-channel-provisioning.test.js +148 -0
  48. package/dist/discord-bot.js +517 -488
  49. package/dist/discord-command-registration.js +25 -10
  50. package/dist/discord-command-registration.test.js +17 -0
  51. package/dist/discord-utils.js +97 -5
  52. package/dist/discord-utils.test.js +151 -1
  53. package/dist/errors.js +10 -0
  54. package/dist/exec-async.js +17 -5
  55. package/dist/external-directory-permissions.e2e.test.js +11 -7
  56. package/dist/external-directory-project-deny.e2e.test.js +5 -3
  57. package/dist/external-opencode-sync.js +94 -17
  58. package/dist/external-opencode-sync.test.js +206 -0
  59. package/dist/extract-sdk-error-message.test.js +13 -0
  60. package/dist/file-edit-log.js +197 -0
  61. package/dist/file-edit-log.test.js +258 -0
  62. package/dist/format-tables.js +52 -0
  63. package/dist/format-tables.test.js +93 -0
  64. package/dist/gateway-proxy-reconnect.e2e.test.js +28 -8
  65. package/dist/gateway-proxy.e2e.test.js +18 -18
  66. package/dist/git-worktree-core.js +182 -17
  67. package/dist/interaction-handler.js +416 -398
  68. package/dist/ipc-tools-plugin.js +68 -3
  69. package/dist/kimaki-opencode-plugin-loading.e2e.test.js +122 -58
  70. package/dist/kimaki-opencode-plugin.js +9 -3
  71. package/dist/kimaki-workspace-adaptor.js +33 -10
  72. package/dist/logger.js +11 -1
  73. package/dist/markdown.js +3 -1
  74. package/dist/markdown.test.js +11 -3
  75. package/dist/message-formatting.js +181 -51
  76. package/dist/message-formatting.test.js +529 -22
  77. package/dist/message-preprocessing.js +105 -1
  78. package/dist/oauth-rotation-shared.js +10 -0
  79. package/dist/openai-auth-plugin.js +1 -0
  80. package/dist/openai-auth-state.js +1 -0
  81. package/dist/opencode-command.js +28 -0
  82. package/dist/opencode-command.test.js +109 -1
  83. package/dist/opencode-interrupt-plugin.js +4 -0
  84. package/dist/opencode-interrupt-plugin.test.js +24 -0
  85. package/dist/opencode.js +82 -15
  86. package/dist/project-add.test.js +62 -0
  87. package/dist/question-abort-clears-dropdown.e2e.test.js +89 -0
  88. package/dist/question-abort-retry-text-before-dropdown.e2e.test.js +150 -0
  89. package/dist/question-text-before-dropdown.e2e.test.js +52 -0
  90. package/dist/queue-advanced-abort.e2e.test.js +8 -10
  91. package/dist/queue-advanced-action-buttons.e2e.test.js +8 -8
  92. package/dist/queue-advanced-e2e-setup.js +78 -5
  93. package/dist/queue-advanced-footer.e2e.test.js +60 -269
  94. package/dist/queue-advanced-model-switch.e2e.test.js +9 -11
  95. package/dist/queue-advanced-permissions-typing.e2e.test.js +15 -15
  96. package/dist/queue-advanced-question.e2e.test.js +32 -27
  97. package/dist/queue-advanced-typing-interrupt.e2e.test.js +10 -12
  98. package/dist/queue-advanced-typing.e2e.test.js +7 -9
  99. package/dist/queue-delete-message.e2e.test.js +3 -3
  100. package/dist/queue-drain-after-interactive-ui.e2e.test.js +5 -5
  101. package/dist/queue-interrupt-drain.e2e.test.js +122 -12
  102. package/dist/queue-question-select-drain.e2e.test.js +34 -132
  103. package/dist/runtime-lifecycle.e2e.test.js +21 -51
  104. package/dist/schema.js +35 -1
  105. package/dist/session-handler/event-stream-state.js +391 -50
  106. package/dist/session-handler/event-stream-state.test.js +736 -8
  107. package/dist/session-handler/model-utils.js +172 -5
  108. package/dist/session-handler/model-utils.test.js +445 -0
  109. package/dist/session-handler/opencode-session-event-log.js +30 -1
  110. package/dist/session-handler/thread-ingress.test.js +41 -0
  111. package/dist/session-handler/thread-runtime-state.js +2 -0
  112. package/dist/session-handler/thread-session-runtime-summary.test.js +121 -0
  113. package/dist/session-handler/thread-session-runtime.js +574 -299
  114. package/dist/session-search.js +123 -4
  115. package/dist/session-search.test.js +248 -1
  116. package/dist/session-sleep.test.js +224 -0
  117. package/dist/session-title-rename.test.js +37 -39
  118. package/dist/sleep.e2e.test.js +494 -0
  119. package/dist/startup-time.e2e.test.js +2 -1
  120. package/dist/store.js +3 -0
  121. package/dist/system-message.js +102 -16
  122. package/dist/system-message.test.js +192 -15
  123. package/dist/task-runner.js +96 -5
  124. package/dist/task-schedule.js +87 -1
  125. package/dist/task-schedule.test.js +149 -1
  126. package/dist/test-utils.js +17 -9
  127. package/dist/thinking-utils.js +10 -0
  128. package/dist/thinking-utils.test.js +35 -0
  129. package/dist/thread-message-queue.e2e.test.js +65 -213
  130. package/dist/undo-redo.e2e.test.js +17 -9
  131. package/dist/voice-attachment.js +23 -1
  132. package/dist/voice-handler.js +21 -4
  133. package/dist/voice-message.e2e.test.js +144 -30
  134. package/dist/voice-routing-input.e2e.test.js +195 -0
  135. package/dist/voice-routing-question.e2e.test.js +125 -0
  136. package/dist/voice.js +28 -8
  137. package/dist/voice.test.js +96 -30
  138. package/dist/worktree-clone-isolation.e2e.test.js +188 -0
  139. package/dist/worktree-lifecycle.e2e.test.js +55 -36
  140. package/dist/worktrees.js +226 -443
  141. package/dist/worktrees.test.js +435 -58
  142. package/dist/xai-auth-plugin.js +1 -0
  143. package/dist/xai-auth-state.js +1 -0
  144. package/package.json +8 -6
  145. package/skills/bump-holocron-consumers/SKILL.md +137 -0
  146. package/skills/critique/SKILL.md +4 -4
  147. package/skills/errore/SKILL.md +60 -218
  148. package/skills/goke/SKILL.md +150 -10
  149. package/skills/holocron/SKILL.md +154 -17
  150. package/skills/npm-package/SKILL.md +55 -35
  151. package/skills/profano/SKILL.md +17 -2
  152. package/skills/spiceflow/SKILL.md +39 -3
  153. package/skills/strada/SKILL.md +39 -0
  154. package/skills/zele/SKILL.md +19 -0
  155. package/src/agent-model.e2e.test.ts +287 -186
  156. package/src/anthropic-account-identity.ts +20 -1
  157. package/src/anthropic-auth-plugin.test.ts +19 -0
  158. package/src/anthropic-auth-plugin.ts +12 -16
  159. package/src/anthropic-auth-state.ts +1 -0
  160. package/src/bash-tool-schema-plugin.test.ts +55 -0
  161. package/src/bash-tool-schema-plugin.ts +46 -0
  162. package/src/bin.ts +78 -26
  163. package/src/cli-commands/maintenance.ts +59 -13
  164. package/src/cli-commands/project.ts +14 -35
  165. package/src/cli-commands/send.ts +31 -1
  166. package/src/cli-commands/session.ts +374 -114
  167. package/src/cli-commands/task.ts +34 -15
  168. package/src/cli-parsing.test.ts +103 -4
  169. package/src/cli-runner.test.ts +49 -0
  170. package/src/cli-runner.ts +44 -7
  171. package/src/cli-send-thread.e2e.test.ts +9 -11
  172. package/src/cli.ts +53 -0
  173. package/src/commands/abort.ts +6 -1
  174. package/src/commands/action-buttons.ts +2 -1
  175. package/src/commands/add-project.ts +4 -8
  176. package/src/commands/agent.ts +205 -29
  177. package/src/commands/ask-question.test.ts +48 -1
  178. package/src/commands/ask-question.ts +23 -33
  179. package/src/commands/btw.ts +40 -5
  180. package/src/commands/file-upload.ts +2 -1
  181. package/src/commands/fork-subagent.ts +2 -3
  182. package/src/commands/fork.ts +4 -3
  183. package/src/commands/last-sessions.ts +10 -4
  184. package/src/commands/login.ts +6 -0
  185. package/src/commands/merge-worktree.ts +54 -16
  186. package/src/commands/model-variant.ts +9 -1
  187. package/src/commands/model.ts +20 -9
  188. package/src/commands/multioauth.ts +1 -0
  189. package/src/commands/new-worktree.ts +138 -55
  190. package/src/commands/queue.ts +3 -2
  191. package/src/commands/resume.ts +4 -3
  192. package/src/commands/session.ts +94 -70
  193. package/src/commands/user-command.ts +6 -6
  194. package/src/commands/worktrees.ts +5 -12
  195. package/src/config.ts +18 -1
  196. package/src/cpu-profiler.test.ts +183 -0
  197. package/src/cpu-profiler.ts +293 -0
  198. package/src/database.ts +235 -3
  199. package/src/db.test.ts +293 -0
  200. package/src/db.ts +38 -0
  201. package/src/default-channel-provisioning.test.ts +155 -0
  202. package/src/discord-bot.ts +78 -36
  203. package/src/discord-command-registration.test.ts +20 -0
  204. package/src/discord-command-registration.ts +42 -12
  205. package/src/discord-utils.test.ts +176 -0
  206. package/src/discord-utils.ts +152 -7
  207. package/src/errors.ts +12 -0
  208. package/src/exec-async.ts +20 -11
  209. package/src/external-directory-permissions.e2e.test.ts +11 -7
  210. package/src/external-directory-project-deny.e2e.test.ts +5 -3
  211. package/src/external-opencode-sync.test.ts +248 -0
  212. package/src/external-opencode-sync.ts +122 -19
  213. package/src/extract-sdk-error-message.test.ts +18 -0
  214. package/src/file-edit-log.test.ts +287 -0
  215. package/src/file-edit-log.ts +283 -0
  216. package/src/format-tables.test.ts +101 -0
  217. package/src/format-tables.ts +75 -0
  218. package/src/gateway-proxy-reconnect.e2e.test.ts +38 -8
  219. package/src/gateway-proxy.e2e.test.ts +18 -17
  220. package/src/git-worktree-core.ts +247 -20
  221. package/src/interaction-handler.ts +36 -13
  222. package/src/ipc-tools-plugin.ts +82 -5
  223. package/src/kimaki-opencode-plugin-loading.e2e.test.ts +188 -97
  224. package/src/kimaki-opencode-plugin.ts +9 -3
  225. package/src/kimaki-workspace-adaptor.ts +40 -11
  226. package/src/logger.ts +14 -4
  227. package/src/markdown.test.ts +13 -3
  228. package/src/markdown.ts +4 -1
  229. package/src/message-formatting.test.ts +672 -25
  230. package/src/message-formatting.ts +242 -53
  231. package/src/message-preprocessing.ts +116 -1
  232. package/src/oauth-rotation-shared.ts +10 -0
  233. package/src/openai-auth-plugin.ts +1 -0
  234. package/src/openai-auth-state.ts +1 -0
  235. package/src/opencode-command.test.ts +140 -0
  236. package/src/opencode-command.ts +38 -0
  237. package/src/opencode-interrupt-plugin.test.ts +32 -0
  238. package/src/opencode-interrupt-plugin.ts +3 -0
  239. package/src/opencode.ts +115 -15
  240. package/src/project-add.test.ts +80 -0
  241. package/src/question-abort-clears-dropdown.e2e.test.ts +109 -0
  242. package/src/question-abort-retry-text-before-dropdown.e2e.test.ts +172 -0
  243. package/src/question-text-before-dropdown.e2e.test.ts +67 -0
  244. package/src/queue-advanced-abort.e2e.test.ts +8 -9
  245. package/src/queue-advanced-action-buttons.e2e.test.ts +8 -8
  246. package/src/queue-advanced-e2e-setup.ts +83 -4
  247. package/src/queue-advanced-footer.e2e.test.ts +67 -315
  248. package/src/queue-advanced-model-switch.e2e.test.ts +9 -10
  249. package/src/queue-advanced-permissions-typing.e2e.test.ts +15 -15
  250. package/src/queue-advanced-question.e2e.test.ts +36 -30
  251. package/src/queue-advanced-typing-interrupt.e2e.test.ts +11 -11
  252. package/src/queue-advanced-typing.e2e.test.ts +8 -8
  253. package/src/queue-delete-message.e2e.test.ts +3 -3
  254. package/src/queue-drain-after-interactive-ui.e2e.test.ts +5 -5
  255. package/src/queue-interrupt-drain.e2e.test.ts +133 -12
  256. package/src/queue-question-select-drain.e2e.test.ts +36 -161
  257. package/src/runtime-lifecycle.e2e.test.ts +21 -54
  258. package/src/schema.sql +15 -2
  259. package/src/schema.ts +37 -1
  260. package/src/session-handler/event-stream-state.test.ts +790 -7
  261. package/src/session-handler/event-stream-state.ts +568 -53
  262. package/src/session-handler/model-utils.test.ts +537 -0
  263. package/src/session-handler/model-utils.ts +281 -5
  264. package/src/session-handler/opencode-session-event-log.ts +31 -1
  265. package/src/session-handler/thread-ingress.test.ts +54 -0
  266. package/src/session-handler/thread-runtime-state.ts +3 -0
  267. package/src/session-handler/thread-session-runtime-summary.test.ts +169 -0
  268. package/src/session-handler/thread-session-runtime.ts +712 -358
  269. package/src/session-search.test.ts +281 -0
  270. package/src/session-search.ts +241 -7
  271. package/src/session-sleep.test.ts +294 -0
  272. package/src/session-title-rename.test.ts +54 -48
  273. package/src/sleep.e2e.test.ts +565 -0
  274. package/src/startup-time.e2e.test.ts +5 -1
  275. package/src/store.ts +22 -0
  276. package/src/system-message.test.ts +226 -15
  277. package/src/system-message.ts +130 -16
  278. package/src/task-runner.ts +138 -3
  279. package/src/task-schedule.test.ts +170 -0
  280. package/src/task-schedule.ts +141 -1
  281. package/src/test-utils.ts +21 -10
  282. package/src/thinking-utils.test.ts +46 -0
  283. package/src/thinking-utils.ts +21 -0
  284. package/src/thread-message-queue.e2e.test.ts +65 -245
  285. package/src/undo-redo.e2e.test.ts +17 -9
  286. package/src/voice-attachment.ts +29 -1
  287. package/src/voice-handler.ts +23 -4
  288. package/src/voice-message.e2e.test.ts +149 -29
  289. package/src/voice-routing-input.e2e.test.ts +203 -0
  290. package/src/voice-routing-question.e2e.test.ts +131 -0
  291. package/src/voice.test.ts +107 -29
  292. package/src/voice.ts +34 -6
  293. package/src/worktree-clone-isolation.e2e.test.ts +213 -0
  294. package/src/worktree-lifecycle.e2e.test.ts +55 -35
  295. package/src/worktrees.test.ts +505 -64
  296. package/src/worktrees.ts +257 -603
  297. package/src/xai-auth-plugin.ts +1 -0
  298. package/src/xai-auth-state.ts +1 -0
  299. package/dist/message-finish-field.e2e.test.js +0 -169
  300. package/dist/subagent-rate-limit-plugin.js +0 -184
  301. package/src/message-finish-field.e2e.test.ts +0 -196
  302. package/src/subagent-rate-limit-plugin.ts +0 -228
@@ -32,6 +32,8 @@ import {
32
32
  setChannelWorktreesEnabled,
33
33
  getThreadSession,
34
34
  getThreadWorktreeOrWorkspace,
35
+ getSessionModel,
36
+ setSessionModel,
35
37
  type VerbosityLevel,
36
38
  } from './database.js'
37
39
  import { startHranaServer, stopHranaServer } from './hrana-server.js'
@@ -55,6 +57,7 @@ const WORKTREE_SUFFIX = Date.now().toString(36).slice(-6)
55
57
  const WORKTREE_NAME = `wt-e2e-${WORKTREE_SUFFIX}`
56
58
  const CHANNEL_WORKTREE_NAME = `wt-chan-${WORKTREE_SUFFIX}`
57
59
  const AUTO_WORKTREE_SUFFIX = `wt-auto-${WORKTREE_SUFFIX}`
60
+ const SOURCE_MODEL = 'source-model-v2'
58
61
 
59
62
  function normalizeWorktreeLifecycleText(text: string): string {
60
63
  return text
@@ -224,6 +227,9 @@ describe('worktree lifecycle', () => {
224
227
  matchers: createDeterministicMatchers(),
225
228
  },
226
229
  })
230
+ const providerConfig = opencodeConfig.provider['deterministic-provider']
231
+ if (!providerConfig) throw new Error('Missing deterministic provider config')
232
+ providerConfig.models[SOURCE_MODEL] = { name: SOURCE_MODEL }
227
233
  fs.writeFileSync(
228
234
  path.join(directories.projectDirectory, 'opencode.json'),
229
235
  JSON.stringify(opencodeConfig, null, 2),
@@ -386,7 +392,7 @@ describe('worktree lifecycle', () => {
386
392
  discord,
387
393
  threadId: thread.id,
388
394
  userId: TEST_USER_ID,
389
- text: '⬥ ok',
395
+ text: 'ok',
390
396
  afterUserMessageIncludes: 'before-worktree',
391
397
  timeout: 10_000,
392
398
  })
@@ -397,6 +403,11 @@ describe('worktree lifecycle', () => {
397
403
  expect(runtimeBefore!.sdkDirectory).toBe(directories.projectDirectory)
398
404
  const sessionBefore = await getThreadSession(thread.id)
399
405
  expect(sessionBefore).toBeTruthy()
406
+ if (!sessionBefore) throw new Error('Source session was not persisted')
407
+ await setSessionModel({
408
+ sessionId: sessionBefore,
409
+ modelId: `deterministic-provider/${SOURCE_MODEL}`,
410
+ })
400
411
 
401
412
  // 2. Run /new-worktree inside the source thread.
402
413
  // This should create a new worktree thread instead of switching this one.
@@ -436,6 +447,12 @@ describe('worktree lifecycle', () => {
436
447
  timeout: 10_000,
437
448
  })
438
449
 
450
+ // Messages sent as soon as the checkout is ready must wait for the
451
+ // source session fork and keep its model.
452
+ await worktreeTh.user(TEST_USER_ID).sendMessage({
453
+ content: 'Reply with exactly: after-worktree-thread',
454
+ })
455
+
439
456
  await waitForBotMessageContaining({
440
457
  discord,
441
458
  threadId: worktreeThread.id,
@@ -450,6 +467,12 @@ describe('worktree lifecycle', () => {
450
467
  expect(worktreeSession).toBeTruthy()
451
468
  if (!worktreeSession) throw new Error('Worktree session was not persisted')
452
469
  expect(worktreeSession).not.toBe(sessionBefore)
470
+ await expect(getSessionModel(worktreeSession)).resolves.toMatchInlineSnapshot(`
471
+ {
472
+ "modelId": "deterministic-provider/source-model-v2",
473
+ "variant": null,
474
+ }
475
+ `)
453
476
  await expect(getThreadWorktreeOrWorkspace(thread.id)).resolves.toBeUndefined()
454
477
  const worktreeInfo = await getThreadWorktreeOrWorkspace(worktreeThread.id)
455
478
  expect(worktreeInfo?.status).toBe('ready')
@@ -478,9 +501,6 @@ describe('worktree lifecycle', () => {
478
501
 
479
502
  // 4. Send messages to both threads. The source continues in the base
480
503
  // checkout, and the new thread runs in the worktree checkout.
481
- await worktreeTh.user(TEST_USER_ID).sendMessage({
482
- content: 'Reply with exactly: after-worktree-thread',
483
- })
484
504
  await th.user(TEST_USER_ID).sendMessage({
485
505
  content: 'Reply with exactly: after-source-thread',
486
506
  })
@@ -489,7 +509,7 @@ describe('worktree lifecycle', () => {
489
509
  discord,
490
510
  threadId: worktreeThread.id,
491
511
  userId: TEST_USER_ID,
492
- text: '⬥ ok',
512
+ text: 'ok',
493
513
  afterUserMessageIncludes: 'after-worktree-thread',
494
514
  timeout: 4_000,
495
515
  })
@@ -497,7 +517,7 @@ describe('worktree lifecycle', () => {
497
517
  discord,
498
518
  threadId: thread.id,
499
519
  userId: TEST_USER_ID,
500
- text: '⬥ ok',
520
+ text: 'ok',
501
521
  afterUserMessageIncludes: 'after-source-thread',
502
522
  timeout: 4_000,
503
523
  })
@@ -507,7 +527,7 @@ describe('worktree lifecycle', () => {
507
527
  discord,
508
528
  threadId: worktreeThread.id,
509
529
  userId: TEST_USER_ID,
510
- text: 'deterministic-v2',
530
+ text: SOURCE_MODEL,
511
531
  afterUserMessageIncludes: 'after-worktree-thread',
512
532
  timeout: 4_000,
513
533
  })
@@ -515,7 +535,7 @@ describe('worktree lifecycle', () => {
515
535
  discord,
516
536
  threadId: thread.id,
517
537
  userId: TEST_USER_ID,
518
- text: 'deterministic-v2',
538
+ text: SOURCE_MODEL,
519
539
  afterUserMessageIncludes: 'after-source-thread',
520
540
  timeout: 4_000,
521
541
  })
@@ -525,20 +545,20 @@ describe('worktree lifecycle', () => {
525
545
  "--- from: user (worktree-tester)
526
546
  Reply with exactly: before-worktree
527
547
  --- from: assistant (TestBot)
528
- *using deterministic-provider/deterministic-v2*
529
- ⬥ ok
548
+ > *using deterministic-provider/deterministic-v2*
549
+ > ok
530
550
  Creating worktree in <#THREAD_ID>
531
- *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
551
+ > *project ⋅ main ⋅ <1s ⋅ 0% ⋅ deterministic-v2* <@200000000000000901>
532
552
  --- from: user (worktree-tester)
533
553
  Reply with exactly: after-source-thread
534
554
  --- from: assistant (TestBot)
535
- ⬥ ok
536
- *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
555
+ > ok
556
+ > *project ⋅ main ⋅ <1s ⋅ 0% ⋅ source-model-v2* <@200000000000000901>"
537
557
  `)
538
558
  expect(sourceText).toContain('Reply with exactly: before-worktree')
539
559
  expect(sourceText).toContain('Reply with exactly: after-source-thread')
540
560
  expect(sourceText).not.toContain('Worktree:')
541
- expect((sourceText.match(/⬥ ok/g) || []).length).toBe(2)
561
+ expect((sourceText.match(/ok/g) || []).length).toBe(2)
542
562
 
543
563
  const worktreeText = await worktreeTh.text()
544
564
  expect(normalizeWorktreeLifecycleText(worktreeText)).toMatchInlineSnapshot(`
@@ -550,14 +570,14 @@ describe('worktree lifecycle', () => {
550
570
  --- from: user (worktree-tester)
551
571
  Reply with exactly: after-worktree-thread
552
572
  --- from: assistant (TestBot)
553
- ⬥ ok
554
- *WORKTREE_NAME ⋅ opencode/kimaki-WORKTREE_NAME ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
573
+ > ok
574
+ > *WORKTREE_NAME ⋅ opencode/kimaki-WORKTREE_NAME ⋅ <1s ⋅ 0% ⋅ source-model-v2* <@200000000000000901>"
555
575
  `)
556
576
  expect(worktreeText).toContain('Worktree:')
557
577
  expect(worktreeText).toContain('Branch:')
558
578
  expect(worktreeText).toContain('Reusing context from')
559
579
  expect(worktreeText).toContain('Reply with exactly: after-worktree-thread')
560
- expect(worktreeText).toContain('⬥ ok')
580
+ expect(worktreeText).toContain('ok')
561
581
  },
562
582
  30_000,
563
583
  )
@@ -615,7 +635,7 @@ describe('worktree lifecycle', () => {
615
635
  discord,
616
636
  threadId: worktreeThread.id,
617
637
  userId: TEST_USER_ID,
618
- text: '⬥ ok',
638
+ text: 'ok',
619
639
  afterUserMessageIncludes: 'channel-worktree-msg',
620
640
  timeout: 10_000,
621
641
  })
@@ -646,11 +666,11 @@ describe('worktree lifecycle', () => {
646
666
  --- from: user (worktree-tester)
647
667
  Reply with exactly: channel-worktree-msg
648
668
  --- from: assistant (TestBot)
649
- *using deterministic-provider/deterministic-v2*
650
- ⬥ ok"
669
+ > *using deterministic-provider/deterministic-v2*
670
+ > ok"
651
671
  `)
652
672
  expect(worktreeText).toContain('Branch:')
653
- expect(worktreeText).toContain('⬥ ok')
673
+ expect(worktreeText).toContain('ok')
654
674
  expect(worktreeText).toContain('Reply with exactly: channel-worktree-msg')
655
675
  },
656
676
  30_000,
@@ -684,7 +704,7 @@ describe('worktree lifecycle', () => {
684
704
  discord,
685
705
  threadId: thread.id,
686
706
  userId: TEST_USER_ID,
687
- text: '⬥ ok',
707
+ text: 'ok',
688
708
  afterUserMessageIncludes: AUTO_WORKTREE_SUFFIX,
689
709
  timeout: 25_000,
690
710
  })
@@ -709,17 +729,17 @@ describe('worktree lifecycle', () => {
709
729
  discord,
710
730
  threadId: thread.id,
711
731
  userId: TEST_USER_ID,
712
- text: '⬥ ok',
732
+ text: 'ok',
713
733
  afterUserMessageIncludes: 'auto-followup',
714
734
  timeout: 4_000,
715
735
  })
716
736
 
717
737
  const text = await th.text()
718
- expect(text).toContain('⬥ ok')
738
+ expect(text).toContain('ok')
719
739
  expect(text).toContain(AUTO_WORKTREE_SUFFIX)
720
740
  expect(text).toContain('Reply with exactly: auto-followup')
721
741
  // Should have at least 2 ok replies
722
- expect((text.match(/⬥ ok/g) || []).length).toBeGreaterThanOrEqual(2)
742
+ expect((text.match(/ok/g) || []).length).toBeGreaterThanOrEqual(2)
723
743
  },
724
744
  35_000,
725
745
  )
@@ -744,7 +764,7 @@ describe('worktree lifecycle', () => {
744
764
  discord,
745
765
  threadId: thread.id,
746
766
  userId: TEST_USER_ID,
747
- text: '⬥ ok',
767
+ text: 'ok',
748
768
  afterUserMessageIncludes: 'non-git-first',
749
769
  timeout: 4_000,
750
770
  })
@@ -757,7 +777,7 @@ describe('worktree lifecycle', () => {
757
777
  discord,
758
778
  threadId: thread.id,
759
779
  userId: TEST_USER_ID,
760
- text: '⬥ ok',
780
+ text: 'ok',
761
781
  afterUserMessageIncludes: 'non-git-second',
762
782
  timeout: 4_000,
763
783
  })
@@ -777,18 +797,18 @@ describe('worktree lifecycle', () => {
777
797
  "--- from: user (worktree-tester)
778
798
  Reply with exactly: non-git-first
779
799
  --- from: assistant (TestBot)
780
- *using deterministic-provider/deterministic-v2*
781
- ⬥ ok
800
+ > *using deterministic-provider/deterministic-v2*
801
+ > ok
782
802
  --- from: user (worktree-tester)
783
803
  Reply with exactly: non-git-second
784
804
  --- from: assistant (TestBot)
785
- *non-git-project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
786
- ⬥ ok"
805
+ > *non-git-project ⋅ main ⋅ <1s ⋅ 0% ⋅ deterministic-v2* <@200000000000000901>
806
+ > ok"
787
807
  `)
788
808
  expect(text).toContain('Reply with exactly: non-git-first')
789
809
  expect(text).toContain('Reply with exactly: non-git-second')
790
810
  expect(text).not.toContain('Worktree creation failed')
791
- const okCount = (text.match(/⬥ ok/g) || []).length
811
+ const okCount = (text.match(/ok/g) || []).length
792
812
  expect(okCount).toBe(2)
793
813
  },
794
814
  20_000,
@@ -844,7 +864,7 @@ describe('worktree lifecycle', () => {
844
864
  discord,
845
865
  threadId: threadData.id,
846
866
  userId: discord.botUserId,
847
- text: '⬥ ok',
867
+ text: 'ok',
848
868
  timeout: 10_000,
849
869
  })
850
870
 
@@ -860,8 +880,8 @@ describe('worktree lifecycle', () => {
860
880
  🌳 **Worktree: AUTO_WORKTREE_BRANCH**
861
881
  📁 \`/tmp/worktrees/WORKTREE_NAME\`
862
882
  🌿 Branch: \`AUTO_WORKTREE_BRANCH\`
863
- *using deterministic-provider/deterministic-v2*
864
- ⬥ ok"
883
+ > *using deterministic-provider/deterministic-v2*
884
+ > ok"
865
885
  `)
866
886
 
867
887
  // Verify DB has worktree info