commandmate 0.42.2 → 0.43.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 (421) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +148 -148
  3. package/.next/app-path-routes-manifest.json +25 -25
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/update-check/route.js +1 -1
  13. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/capabilities/route.js +1 -1
  18. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/daily-summary/route.js +1 -1
  20. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  21. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  23. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  24. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/hooks/agent-event/route.js +103 -1
  31. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  32. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  34. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  35. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  37. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  38. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  45. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  46. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/relays/route.js +1 -1
  48. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  49. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  53. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  54. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/repositories/clone/route.js +1 -1
  56. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  57. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/repositories/restore/route.js +1 -1
  60. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  61. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/route.js +1 -1
  63. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/scan/route.js +1 -1
  66. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/sync/route.js +1 -1
  69. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  70. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  73. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  74. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/skills/[id]/route.js +1 -1
  78. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/skills/route.js +1 -1
  83. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/slash-commands/route.js +1 -1
  85. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  94. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  97. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  100. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -1
  104. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  105. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  108. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  111. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -1
  116. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  117. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  145. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  148. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  151. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  161. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  167. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  171. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/route.js +1 -103
  173. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  174. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +3 -1
  176. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +3 -1
  179. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  180. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -1
  182. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  183. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -103
  186. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +104 -2
  189. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  200. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  203. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/route.js +1 -1
  225. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  228. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  230. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  231. package/.next/server/app/page_client-reference-manifest.js +1 -1
  232. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  234. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  235. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  236. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  237. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  238. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  239. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  240. package/.next/server/app/worktrees/[id]/page.js +9 -9
  241. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  242. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  243. package/.next/server/app-paths-manifest.json +25 -25
  244. package/.next/server/chunks/1068.js +1 -1
  245. package/.next/server/chunks/1210.js +1 -1
  246. package/.next/server/chunks/1501.js +3 -3
  247. package/.next/server/chunks/1990.js +1 -1
  248. package/.next/server/chunks/2119.js +1 -1
  249. package/.next/server/chunks/22.js +1 -1
  250. package/.next/server/chunks/2328.js +1 -1
  251. package/.next/server/chunks/2404.js +4 -3
  252. package/.next/server/chunks/2445.js +1 -1
  253. package/.next/server/chunks/252.js +1 -1
  254. package/.next/server/chunks/2816.js +1 -1
  255. package/.next/server/chunks/3543.js +1 -1
  256. package/.next/server/chunks/3730.js +1 -1
  257. package/.next/server/chunks/3945.js +1 -1
  258. package/.next/server/chunks/4207.js +3 -3
  259. package/.next/server/chunks/5064.js +1 -1
  260. package/.next/server/chunks/5571.js +1 -1
  261. package/.next/server/chunks/5742.js +1 -1
  262. package/.next/server/chunks/5775.js +1 -1
  263. package/.next/server/chunks/611.js +1 -1
  264. package/.next/server/chunks/6130.js +1 -1
  265. package/.next/server/chunks/6285.js +1 -1
  266. package/.next/server/chunks/6491.js +103 -0
  267. package/.next/server/chunks/6661.js +1 -1
  268. package/.next/server/chunks/6781.js +1 -1
  269. package/.next/server/chunks/6793.js +1 -1
  270. package/.next/server/chunks/7491.js +3 -0
  271. package/.next/server/chunks/7685.js +1 -1
  272. package/.next/server/chunks/7905.js +1 -1
  273. package/.next/server/chunks/8581.js +2 -2
  274. package/.next/server/chunks/8673.js +6 -6
  275. package/.next/server/chunks/8728.js +2 -2
  276. package/.next/server/chunks/8791.js +1 -1
  277. package/.next/server/chunks/8800.js +4 -3
  278. package/.next/server/chunks/8918.js +5 -5
  279. package/.next/server/chunks/9130.js +3 -3
  280. package/.next/server/chunks/{8052.js → 9353.js} +4 -2
  281. package/.next/server/chunks/9390.js +3 -0
  282. package/.next/server/chunks/9627.js +3 -3
  283. package/.next/server/chunks/967.js +1 -0
  284. package/.next/server/chunks/9731.js +3 -3
  285. package/.next/server/chunks/9882.js +3 -3
  286. package/.next/server/middleware-manifest.json +5 -5
  287. package/.next/server/pages/500.html +1 -1
  288. package/.next/server/server-reference-manifest.json +1 -1
  289. package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
  290. package/.next/static/chunks/{2407-6b9e12c099fa598c.js → 2407-940df9b11fadafc6.js} +1 -1
  291. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  292. package/.next/static/chunks/5449-6cb80bab2bd06b79.js +1 -0
  293. package/.next/static/chunks/7705-1f58d4c03d991fcf.js +1 -0
  294. package/.next/static/chunks/8165-3525fb42f1b4976e.js +1 -0
  295. package/.next/static/chunks/app/{layout-5b95e1236dcd9ef6.js → layout-057c850cd0df978e.js} +1 -1
  296. package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +1 -0
  297. package/.next/static/chunks/app/skills/[skillId]/page-74aac15286504ef4.js +1 -0
  298. package/.next/static/chunks/app/skills/page-182e16168b2fc098.js +1 -0
  299. package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +1 -0
  300. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  301. package/.next/trace +13 -13
  302. package/README.md +3 -3
  303. package/dist/cli/commands/ask.d.ts.map +1 -1
  304. package/dist/cli/commands/ask.js +23 -149
  305. package/dist/cli/commands/reply.d.ts +40 -0
  306. package/dist/cli/commands/reply.d.ts.map +1 -0
  307. package/dist/cli/commands/reply.js +133 -0
  308. package/dist/cli/commands/wait.d.ts +5 -0
  309. package/dist/cli/commands/wait.d.ts.map +1 -1
  310. package/dist/cli/commands/wait.js +10 -1
  311. package/dist/cli/docs/agent-operations.d.ts +2 -2
  312. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  313. package/dist/cli/docs/agent-operations.js +13 -0
  314. package/dist/cli/program.d.ts.map +1 -1
  315. package/dist/cli/program.js +4 -0
  316. package/dist/cli/utils/reply-ledger.d.ts +95 -0
  317. package/dist/cli/utils/reply-ledger.d.ts.map +1 -0
  318. package/dist/cli/utils/reply-ledger.js +187 -0
  319. package/dist/lib/cli-tools/copilot-executable.d.ts +9 -0
  320. package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -1
  321. package/dist/lib/cli-tools/copilot-executable.js +21 -5
  322. package/dist/lib/cli-tools/opencode-executable.d.ts +103 -0
  323. package/dist/lib/cli-tools/opencode-executable.d.ts.map +1 -0
  324. package/dist/lib/cli-tools/opencode-executable.js +179 -0
  325. package/dist/lib/cli-tools/types.d.ts +1 -1
  326. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  327. package/dist/lib/cli-tools/types.js +5 -1
  328. package/dist/lib/detection/tools/verified-against.d.ts +15 -0
  329. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  330. package/dist/lib/detection/tools/verified-against.js +17 -1
  331. package/dist/lib/detection/version-probes.d.ts.map +1 -1
  332. package/dist/lib/detection/version-probes.js +14 -1
  333. package/dist/lib/session/tmux-session-surface.d.ts.map +1 -1
  334. package/dist/lib/session/tmux-session-surface.js +1 -1
  335. package/dist/server/locales/en/worktree.json +44 -14
  336. package/dist/server/locales/ja/worktree.json +44 -14
  337. package/dist/server/server.js +23 -0
  338. package/dist/server/src/config/cli-tool-timing-config.js +19 -1
  339. package/dist/server/src/config/detection-evidence-config.js +3 -0
  340. package/dist/server/src/config/schedule-config.js +55 -1
  341. package/dist/server/src/lib/auto-yes-poller.js +47 -4
  342. package/dist/server/src/lib/cli-tools/agent-mode-spec.js +54 -2
  343. package/dist/server/src/lib/cli-tools/base.js +6 -2
  344. package/dist/server/src/lib/cli-tools/command-code.js +55 -1
  345. package/dist/server/src/lib/cli-tools/composer-spec.js +10 -0
  346. package/dist/server/src/lib/cli-tools/copilot-executable.js +21 -5
  347. package/dist/server/src/lib/cli-tools/graceful-exit.js +15 -1
  348. package/dist/server/src/lib/cli-tools/index.js +3 -1
  349. package/dist/server/src/lib/cli-tools/install-hints.js +9 -3
  350. package/dist/server/src/lib/cli-tools/liveness-spec.js +19 -0
  351. package/dist/server/src/lib/cli-tools/manager.js +2 -0
  352. package/dist/server/src/lib/cli-tools/opencode-executable.js +179 -0
  353. package/dist/server/src/lib/cli-tools/opencode-v2.js +369 -0
  354. package/dist/server/src/lib/cli-tools/opencode.js +29 -5
  355. package/dist/server/src/lib/cli-tools/types.js +5 -1
  356. package/dist/server/src/lib/cmate-cli-tool-parser.js +65 -7
  357. package/dist/server/src/lib/cmate-parser.js +12 -0
  358. package/dist/server/src/lib/cmate-validator.js +13 -1
  359. package/dist/server/src/lib/detection/cli-patterns.js +78 -2
  360. package/dist/server/src/lib/detection/model-info-extractor.js +79 -7
  361. package/dist/server/src/lib/detection/status-detector.js +10 -1
  362. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +2 -1
  363. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +253 -0
  364. package/dist/server/src/lib/detection/tools/opencode-v2/dialog-title.js +48 -0
  365. package/dist/server/src/lib/detection/tools/registry.js +2 -0
  366. package/dist/server/src/lib/detection/tools/run-detection.js +9 -0
  367. package/dist/server/src/lib/detection/tools/verified-against.js +17 -1
  368. package/dist/server/src/lib/detection/upstream-faults.js +8 -0
  369. package/dist/server/src/lib/detection/version-probes.js +14 -1
  370. package/dist/server/src/lib/hooks/agent-session-telemetry.js +36 -1
  371. package/dist/server/src/lib/hooks/sources/opencode/log-diagnosis.js +105 -0
  372. package/dist/server/src/lib/hooks/sources/opencode/source.js +7 -1
  373. package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +422 -0
  374. package/dist/server/src/lib/hooks/sources/opencode-v2/decision-labels.js +24 -0
  375. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +421 -0
  376. package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +271 -0
  377. package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +165 -0
  378. package/dist/server/src/lib/hooks/sources/opencode-v2/payloads.js +351 -0
  379. package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +230 -0
  380. package/dist/server/src/lib/hooks/sources/opencode-v2/reattach.js +149 -0
  381. package/dist/server/src/lib/hooks/sources/opencode-v2/runtime.js +180 -0
  382. package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +182 -0
  383. package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +295 -0
  384. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +455 -0
  385. package/dist/server/src/lib/hooks/sources/opencode-v2/tool-id.js +18 -0
  386. package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +214 -0
  387. package/dist/server/src/lib/hooks/sources/registry.js +2 -0
  388. package/dist/server/src/lib/hooks/structured-decision-response.js +14 -5
  389. package/dist/server/src/lib/job-executor.js +2 -1
  390. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +15 -1
  391. package/dist/server/src/lib/polling/structured-history-gate.js +19 -5
  392. package/dist/server/src/lib/relay/relay-delivery.js +4 -1
  393. package/dist/server/src/lib/session/agent-event-state.js +24 -0
  394. package/dist/server/src/lib/session/claude-executor.js +184 -10
  395. package/dist/server/src/lib/session/current-output-builder.js +27 -3
  396. package/dist/server/src/lib/session/send-user-message.js +4 -0
  397. package/dist/server/src/lib/session/structured-prompt.js +54 -0
  398. package/dist/server/src/lib/session/tmux-session-surface.js +1 -1
  399. package/dist/server/src/lib/skills/compatibility-matrix.js +65 -0
  400. package/dist/server/src/lib/tmux/tmux.js +48 -2
  401. package/dist/server/src/lib/verification/env-clean-gate.js +87 -5
  402. package/dist/server/src/types/cli-tool-contracts.js +10 -2
  403. package/dist/types/cli-tool-contracts.d.ts +16 -5
  404. package/dist/types/cli-tool-contracts.d.ts.map +1 -1
  405. package/dist/types/cli-tool-contracts.js +10 -2
  406. package/package.json +2 -1
  407. package/release-notes/0.43.0.json +130 -0
  408. package/scripts/hooks/cmate-agent-event.sh +14 -0
  409. package/scripts/opencode-v2/launch.sh +226 -0
  410. package/.next/server/chunks/4443.js +0 -3
  411. package/.next/server/chunks/5164.js +0 -1
  412. package/.next/server/chunks/650.js +0 -1
  413. package/.next/static/chunks/5449-550bd273dccc3ae4.js +0 -1
  414. package/.next/static/chunks/7705-2a2936551b0cf9a3.js +0 -1
  415. package/.next/static/chunks/8165-934ee7ff3b4ddfd4.js +0 -1
  416. package/.next/static/chunks/app/review/page-30616daa1dc595c2.js +0 -1
  417. package/.next/static/chunks/app/skills/[skillId]/page-ab7e432b69fccb3b.js +0 -1
  418. package/.next/static/chunks/app/skills/page-56b4fa11223e0cbd.js +0 -1
  419. package/.next/static/chunks/app/worktrees/[id]/page-59f5337e031518c6.js +0 -1
  420. /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → BVkBYdceLRvMROqQIqeBx}/_buildManifest.js +0 -0
  421. /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → BVkBYdceLRvMROqQIqeBx}/_ssgManifest.js +0 -0
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+ /**
3
+ * Writing OpenCode V2's replies into conversation history (Issue #2940,
4
+ * Epic #2370 Phase 2's transcript, brought forward).
5
+ *
6
+ * Before this, the screen scraper was the only writer of an `opencode-v2`
7
+ * reply, and it never wrote one: its completion test is the home screen's
8
+ * composer placeholder (`Ask anything…`), which OpenCode V2 draws only before
9
+ * the first prompt. So History held the user's prompts and none of the
10
+ * answers.
11
+ *
12
+ * ## Pull on the turn's end, not a reassembled stream
13
+ *
14
+ * The SSE stream does carry the reply (`session.text.started|delta|ended`,
15
+ * `session.reasoning.*`, `session.tool.*`), but this reads it from
16
+ * `GET /api/session/{id}/message` instead, once the stream says the turn is
17
+ * over (`session.execution.succeeded` / `failed` / `interrupted`):
18
+ *
19
+ * - the document is the finished turn as the server stored it — no delta to
20
+ * reassemble, no frame whose loss corrupts a row, and nothing held in
21
+ * memory between frames;
22
+ * - it is idempotent by construction: every turn is keyed on its user
23
+ * message's id, so a repeated end-of-turn frame, a reconnect or two turns
24
+ * ending close together write each turn once;
25
+ * - and it recovers what the stream missed. A turn that ended while the
26
+ * connection was down is in the document the next time any turn of the
27
+ * session ends.
28
+ *
29
+ * ## One turn in the document
30
+ *
31
+ * Measured on 2.0.18 (`tests/fixtures/opencode-v2-history-2940`): messages are
32
+ * typed, and one turn is a `user` message, then one `assistant` message per
33
+ * model step (a tool-calling turn has several), then an `idle` message with the
34
+ * turn's `outcome`. Assistant messages carry no parent id, so the turn is
35
+ * recovered from the order alone: a turn opens at its `user` message and is
36
+ * closed by the `idle` that follows, or by the next `user` message. A turn that
37
+ * is still open is not written — the next end-of-turn reads it again.
38
+ *
39
+ * ## One row, one writer
40
+ *
41
+ * The row is `assistant` / `normal`, keyed `oc-turn:<user message id>` — the
42
+ * same key family v1's reader uses (`opencodeTurnRequestId`), so every surface
43
+ * that recognises an agent-authored turn recognises this one. The scraper
44
+ * stands down while the subscription is live
45
+ * (`isOpencodeV2StructuredHistoryLive`, via `lib/polling/structured-history-gate`).
46
+ *
47
+ * The body is rendered by v1's `renderOpencodeTurn` from the same part shape,
48
+ * so the text, the folded reasoning and the one-line tool summary look exactly
49
+ * like an OpenCode (v1) reply (#2041 / #2234 / #2272).
50
+ *
51
+ * ## The model that answered
52
+ *
53
+ * The same read also names the model of the newest assistant message
54
+ * (Issue #2964, {@link readLatestOpencodeV2AssistantModel}) and latches it
55
+ * where v1's hook-borne model goes, since no `session.*` frame carries one.
56
+ *
57
+ * ## Nothing here throws
58
+ *
59
+ * A failed fetch or write costs the row, never the subscription: the state the
60
+ * stream publishes is independent of it, and the scraper is no worse off than
61
+ * before. Database imports are dynamic for the reason v1's `./history` gives.
62
+ *
63
+ * @module lib/hooks/sources/opencode-v2/history
64
+ */
65
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
66
+ if (k2 === undefined) k2 = k;
67
+ var desc = Object.getOwnPropertyDescriptor(m, k);
68
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
69
+ desc = { enumerable: true, get: function() { return m[k]; } };
70
+ }
71
+ Object.defineProperty(o, k2, desc);
72
+ }) : (function(o, m, k, k2) {
73
+ if (k2 === undefined) k2 = k;
74
+ o[k2] = m[k];
75
+ }));
76
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
77
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
78
+ }) : function(o, v) {
79
+ o["default"] = v;
80
+ });
81
+ var __importStar = (this && this.__importStar) || (function () {
82
+ var ownKeys = function(o) {
83
+ ownKeys = Object.getOwnPropertyNames || function (o) {
84
+ var ar = [];
85
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
86
+ return ar;
87
+ };
88
+ return ownKeys(o);
89
+ };
90
+ return function (mod) {
91
+ if (mod && mod.__esModule) return mod;
92
+ var result = {};
93
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
94
+ __setModuleDefault(result, mod);
95
+ return result;
96
+ };
97
+ })();
98
+ Object.defineProperty(exports, "__esModule", { value: true });
99
+ exports.MAX_OPENCODE_V2_SYNCED_TURNS = exports.MAX_OPENCODE_V2_HISTORY_PAGES = exports.OPENCODE_V2_TURN_END_EVENT_TYPES = void 0;
100
+ exports.isOpencodeV2TurnEndEventType = isOpencodeV2TurnEndEventType;
101
+ exports.readOpencodeV2ContentPart = readOpencodeV2ContentPart;
102
+ exports.buildOpencodeV2TurnsFromMessages = buildOpencodeV2TurnsFromMessages;
103
+ exports.readLatestOpencodeV2AssistantModel = readLatestOpencodeV2AssistantModel;
104
+ exports.resetOpencodeV2HistoryQueue = resetOpencodeV2HistoryQueue;
105
+ exports.syncOpencodeV2History = syncOpencodeV2History;
106
+ const logger_1 = require("../../../../lib/logger");
107
+ const agent_event_state_1 = require("../../../../lib/session/agent-event-state");
108
+ const agent_transcript_1 = require("../../../../types/agent-transcript");
109
+ const event_mapper_1 = require("../event-mapper");
110
+ const transcript_1 = require("../opencode/transcript");
111
+ const client_1 = require("./client");
112
+ const secrets_1 = require("./secrets");
113
+ const tool_id_1 = require("./tool-id");
114
+ const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode-v2/history');
115
+ /** The stream events after which a turn's reply is read (Issue #2940). */
116
+ exports.OPENCODE_V2_TURN_END_EVENT_TYPES = [
117
+ 'session.execution.succeeded',
118
+ 'session.execution.failed',
119
+ 'session.execution.interrupted',
120
+ ];
121
+ /** Whether a frame `type` ends a turn. */
122
+ function isOpencodeV2TurnEndEventType(type) {
123
+ return type !== null && exports.OPENCODE_V2_TURN_END_EVENT_TYPES.includes(type);
124
+ }
125
+ /**
126
+ * Pages read, newest first, while looking for the newest turn's `user`
127
+ * message. A turn is one assistant message per model step, so one page of
128
+ * {@link OPENCODE_V2_MESSAGES_PAGE_SIZE} covers all but a very long tool loop;
129
+ * the bound keeps a session that never shows a `user` message from being read
130
+ * to the end.
131
+ */
132
+ exports.MAX_OPENCODE_V2_HISTORY_PAGES = 5;
133
+ /** Cap on turns one sync writes, newest kept. */
134
+ exports.MAX_OPENCODE_V2_SYNCED_TURNS = 50;
135
+ function readFiniteNumber(value) {
136
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
137
+ }
138
+ function createdAtOf(message) {
139
+ const time = (0, event_mapper_1.isPlainObject)(message.time) ? message.time : null;
140
+ return readFiniteNumber(time?.created) ?? 0;
141
+ }
142
+ /**
143
+ * One element of an assistant message's `content`, as v1's part shape.
144
+ *
145
+ * v2's content items have no id of their own (a tool item's `id` is the
146
+ * provider's call id), so the slot is `<message id>#<index>`, which is stable
147
+ * across re-reads of the same stored message.
148
+ */
149
+ function readOpencodeV2ContentPart(messageId, index, item) {
150
+ if (!(0, event_mapper_1.isPlainObject)(item))
151
+ return null;
152
+ const type = (0, event_mapper_1.readStringField)(item, 'type');
153
+ if (!type)
154
+ return null;
155
+ const state = (0, event_mapper_1.isPlainObject)(item.state) ? item.state : null;
156
+ return {
157
+ id: `${messageId}#${index}`,
158
+ messageId,
159
+ type,
160
+ text: typeof item.text === 'string' ? item.text : null,
161
+ tool: type === 'tool' ? (0, event_mapper_1.readStringField)(item, 'name') : null,
162
+ status: state ? (0, event_mapper_1.readStringField)(state, 'status') : null,
163
+ title: state ? (0, event_mapper_1.readStringField)(state, 'title') : null,
164
+ error: state
165
+ ? ((0, event_mapper_1.readStringField)(state, 'error') ?? (0, event_mapper_1.readNestedString)(state, ['error', 'message']))
166
+ : null,
167
+ };
168
+ }
169
+ /**
170
+ * Rebuild the turns of a session from `GET /api/session/{id}/message` entries.
171
+ *
172
+ * Order-agnostic: the entries are sorted oldest first by `time.created` (the
173
+ * id, which is time-ordered, breaks ties), so a desc page, an asc page or
174
+ * several pages concatenated give the same turns. Assistant messages before the
175
+ * first `user` message belong to a turn whose head is outside what was read,
176
+ * and are dropped rather than attached to nothing.
177
+ *
178
+ * Pure: no fetch, no database.
179
+ */
180
+ function buildOpencodeV2TurnsFromMessages(entries, sessionId) {
181
+ const messages = entries
182
+ .filter(event_mapper_1.isPlainObject)
183
+ .filter((message) => (0, event_mapper_1.readStringField)(message, 'id') !== null)
184
+ .map((message, index) => ({ message, index }))
185
+ .sort((a, b) => {
186
+ const byTime = createdAtOf(a.message) - createdAtOf(b.message);
187
+ if (byTime !== 0)
188
+ return byTime;
189
+ const aId = (0, event_mapper_1.readStringField)(a.message, 'id') ?? '';
190
+ const bId = (0, event_mapper_1.readStringField)(b.message, 'id') ?? '';
191
+ return aId < bId ? -1 : aId > bId ? 1 : a.index - b.index;
192
+ })
193
+ .map(({ message }) => message);
194
+ const turns = [];
195
+ let open = null;
196
+ const close = (closed) => {
197
+ if (open)
198
+ turns.push({ ...open, closed });
199
+ open = null;
200
+ };
201
+ for (const message of messages) {
202
+ const id = (0, event_mapper_1.readStringField)(message, 'id');
203
+ const type = (0, event_mapper_1.readStringField)(message, 'type');
204
+ if (type === 'user') {
205
+ close(true);
206
+ open = {
207
+ accumulator: (0, transcript_1.createOpencodeTurn)(sessionId, id, createdAtOf(message)),
208
+ completedAt: null,
209
+ };
210
+ continue;
211
+ }
212
+ if (!open)
213
+ continue;
214
+ const current = open;
215
+ if (type === 'idle') {
216
+ close(true);
217
+ continue;
218
+ }
219
+ if (type !== 'assistant')
220
+ continue;
221
+ current.accumulator.assistantMessageIds.add(id);
222
+ const content = Array.isArray(message.content) ? message.content : [];
223
+ content.forEach((item, index) => {
224
+ const part = readOpencodeV2ContentPart(id, index, item);
225
+ if (part)
226
+ (0, transcript_1.addOpencodePart)(current.accumulator, part);
227
+ });
228
+ const time = (0, event_mapper_1.isPlainObject)(message.time) ? message.time : null;
229
+ const finished = readFiniteNumber(time?.completed) ?? readFiniteNumber(time?.created);
230
+ if (finished !== null && finished > (current.completedAt ?? 0))
231
+ current.completedAt = finished;
232
+ }
233
+ close(false);
234
+ return turns;
235
+ }
236
+ /**
237
+ * The model the newest assistant message was answered by, or null
238
+ * (Issue #2964).
239
+ *
240
+ * `assistant.model` is `{ id, providerID }` (measured on 2.0.18,
241
+ * `tests/fixtures/opencode-v2-history-2940`). Only `id` is returned — v1's
242
+ * `frameModel` rule (#1783): every other tool reports the bare model, and
243
+ * `opencode/longcat-…` would make this one the odd one out.
244
+ *
245
+ * The reply, not the session's setting: Phase 0 saw a session created over the
246
+ * API run on a different model from the TUI's default, so the model worth
247
+ * showing is the one that actually answered. Newest by `time.created`, the id
248
+ * breaking ties, the order {@link buildOpencodeV2TurnsFromMessages} uses. An
249
+ * assistant message without a model id is skipped, not read as "unknown".
250
+ *
251
+ * Pure: no fetch, no state.
252
+ */
253
+ function readLatestOpencodeV2AssistantModel(entries) {
254
+ let latest = null;
255
+ for (const entry of entries) {
256
+ if (!(0, event_mapper_1.isPlainObject)(entry) || (0, event_mapper_1.readStringField)(entry, 'type') !== 'assistant')
257
+ continue;
258
+ const model = (0, event_mapper_1.readNestedString)(entry, ['model', 'id']);
259
+ if (model === null)
260
+ continue;
261
+ const at = createdAtOf(entry);
262
+ const id = (0, event_mapper_1.readStringField)(entry, 'id') ?? '';
263
+ if (latest === null || at > latest.at || (at === latest.at && id > latest.id)) {
264
+ latest = { at, id, model };
265
+ }
266
+ }
267
+ return latest?.model ?? null;
268
+ }
269
+ /**
270
+ * One sync at a time per instance, on `globalThis` for #1736's reason. Two turn
271
+ * ends close together would otherwise race the existence check and insert the
272
+ * same turn twice.
273
+ */
274
+ const queue = (globalThis.__opencodeV2HistoryQueue ??= new Map());
275
+ /** Forget queued syncs. Test seam. */
276
+ function resetOpencodeV2HistoryQueue() {
277
+ queue.clear();
278
+ }
279
+ function serialize(key, work) {
280
+ const previous = queue.get(key) ?? Promise.resolve();
281
+ const result = previous.then(work, work);
282
+ const settled = result.then(() => undefined, () => undefined);
283
+ queue.set(key, settled);
284
+ void settled.then(() => {
285
+ if (queue.get(key) === settled)
286
+ queue.delete(key);
287
+ });
288
+ return result;
289
+ }
290
+ /** Read newest-first pages until the newest turn's `user` message is in view. */
291
+ async function readRecentMessages(port, password, sessionId) {
292
+ const entries = [];
293
+ let cursor = null;
294
+ for (let page = 0; page < exports.MAX_OPENCODE_V2_HISTORY_PAGES; page += 1) {
295
+ const result = await (0, client_1.fetchOpencodeV2SessionMessagesPage)(port, password, sessionId, cursor);
296
+ if (result === null)
297
+ return page === 0 ? null : entries;
298
+ entries.push(...result.data);
299
+ const sawUser = result.data.some((entry) => (0, event_mapper_1.isPlainObject)(entry) && (0, event_mapper_1.readStringField)(entry, 'type') === 'user');
300
+ if (sawUser || result.next === null || result.data.length === 0)
301
+ break;
302
+ cursor = result.next;
303
+ }
304
+ return entries;
305
+ }
306
+ /**
307
+ * Write one rendered turn, unless its row is already there.
308
+ *
309
+ * @returns Whether a row was written
310
+ */
311
+ async function writeOpencodeV2Turn(target, rendered, timestampMs) {
312
+ const instanceId = target.instanceId ?? target.cliToolId;
313
+ if (rendered.body.length === 0) {
314
+ logger.info('opencode-v2-history-turn-empty', {
315
+ worktreeId: target.worktreeId,
316
+ instanceId,
317
+ sessionId: rendered.sessionId,
318
+ });
319
+ return false;
320
+ }
321
+ if (rendered.unknownPartTypes.length > 0) {
322
+ logger.info('opencode-v2-history-unknown-parts', {
323
+ worktreeId: target.worktreeId,
324
+ instanceId,
325
+ sessionId: rendered.sessionId,
326
+ partTypes: rendered.unknownPartTypes,
327
+ });
328
+ }
329
+ const requestId = (0, agent_transcript_1.opencodeTurnRequestId)(rendered.userMessageId);
330
+ const [{ getDbInstance }, { createMessage, findMessageByRequestId }, { broadcastMessage }] = await Promise.all([
331
+ Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
332
+ Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
333
+ Promise.resolve().then(() => __importStar(require('../../../../lib/ws-server'))),
334
+ ]);
335
+ const db = getDbInstance();
336
+ if (findMessageByRequestId(db, target.worktreeId, requestId))
337
+ return false;
338
+ const message = createMessage(db, {
339
+ worktreeId: target.worktreeId,
340
+ role: 'assistant',
341
+ content: rendered.body,
342
+ messageType: 'normal',
343
+ timestamp: new Date(timestampMs > 0 ? timestampMs : Date.now()),
344
+ cliToolId: target.cliToolId,
345
+ instanceId,
346
+ requestId,
347
+ });
348
+ broadcastMessage('message', { worktreeId: target.worktreeId, message });
349
+ logger.info('opencode-v2-history-turn-saved', {
350
+ worktreeId: target.worktreeId,
351
+ instanceId,
352
+ sessionId: rendered.sessionId,
353
+ requestId,
354
+ bodyLength: rendered.body.length,
355
+ textParts: rendered.textParts,
356
+ toolParts: rendered.toolParts,
357
+ });
358
+ return true;
359
+ }
360
+ /**
361
+ * Record every closed turn of a session that History does not have yet.
362
+ *
363
+ * Called when the instance's stream says a turn of `sessionId` ended. Never
364
+ * throws; a failure is logged and costs only the rows.
365
+ *
366
+ * @param target - The instance the stream belongs to
367
+ * @param port - Its server
368
+ * @param sessionId - `ses_…` from the end-of-turn frame
369
+ * @returns How many rows were written
370
+ */
371
+ function syncOpencodeV2History(target, port, sessionId) {
372
+ return serialize((0, secrets_1.opencodeV2KeyOf)(target), async () => {
373
+ const instanceId = target.instanceId ?? target.cliToolId;
374
+ try {
375
+ const password = (0, secrets_1.readOpencodeV2Password)(target);
376
+ if (password === null) {
377
+ logger.info('opencode-v2-history-unavailable', {
378
+ worktreeId: target.worktreeId,
379
+ instanceId,
380
+ reason: 'password-file-missing',
381
+ });
382
+ return 0;
383
+ }
384
+ const entries = await readRecentMessages(port, password, sessionId);
385
+ if (entries === null) {
386
+ logger.warn('opencode-v2-history-unavailable', {
387
+ worktreeId: target.worktreeId,
388
+ instanceId,
389
+ port,
390
+ sessionId,
391
+ reason: 'messages-unreadable',
392
+ });
393
+ return 0;
394
+ }
395
+ // Issue #2964: the model that answered, onto the hook latch the UI and
396
+ // `capture --json` read. Before the rows, so a failed write cannot cost it.
397
+ (0, agent_event_state_1.recordAgentReportedModel)(target.worktreeId, tool_id_1.OPENCODE_V2_CLI_TOOL_ID, target.instanceId ?? tool_id_1.OPENCODE_V2_CLI_TOOL_ID, readLatestOpencodeV2AssistantModel(entries));
398
+ const closed = buildOpencodeV2TurnsFromMessages(entries, sessionId).filter((turn) => turn.closed);
399
+ const kept = closed.slice(-exports.MAX_OPENCODE_V2_SYNCED_TURNS);
400
+ let written = 0;
401
+ // Oldest first, so the rows go in in conversation order.
402
+ for (const turn of kept) {
403
+ const rendered = (0, transcript_1.renderOpencodeTurn)(turn.accumulator);
404
+ const at = Math.max(turn.accumulator.startedAt, turn.completedAt ?? 0);
405
+ if (await writeOpencodeV2Turn(target, rendered, at))
406
+ written += 1;
407
+ }
408
+ return written;
409
+ }
410
+ catch (error) {
411
+ logger.error('opencode-v2-history-sync-failed', {
412
+ worktreeId: target.worktreeId,
413
+ instanceId,
414
+ port,
415
+ sessionId,
416
+ error: error instanceof Error ? error.message : String(error),
417
+ });
418
+ return 0;
419
+ }
420
+ });
421
+ }