commandmate 0.49.3 → 0.50.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 (877) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +454 -408
  3. package/.next/app-path-routes-manifest.json +19 -13
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/react-loadable-manifest.json +1 -1
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/routes-manifest.json +32 -0
  9. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/capabilities/route.js +1 -1
  19. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/daily-summary/route.js +1 -1
  21. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  22. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  24. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  25. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/hooks/agent-event/route.js +1 -103
  32. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  33. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  35. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  36. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  38. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  39. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/push/escalation/route.js +1 -1
  43. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  44. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  46. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/push/vapid/route.js +1 -1
  48. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  49. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  51. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  52. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/relays/[relayId]/resolve/route.js +1 -1
  54. package/.next/server/app/api/relays/[relayId]/resolve/route.js.nft.json +1 -1
  55. package/.next/server/app/api/relays/[relayId]/resolve/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/relays/[relayId]/route.js +1 -1
  57. package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/relays/route.js +1 -1
  59. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  60. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/remote/pair/route.js +2 -2
  62. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/repositories/[id]/role-defaults/route.js +1 -0
  64. package/.next/server/app/api/repositories/[id]/role-defaults/route.js.nft.json +1 -0
  65. package/.next/server/app/api/repositories/[id]/role-defaults/route_client-reference-manifest.js +1 -0
  66. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  68. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  69. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/repositories/clone/route.js +1 -1
  71. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  72. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/repositories/restore/route.js +1 -1
  75. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  76. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/repositories/route.js +1 -1
  78. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  79. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/repositories/scan/route.js +1 -1
  81. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  82. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/repositories/sync/route.js +1 -1
  84. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  85. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/repositories/validate-path/route.js +1 -1
  87. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/roles/[id]/route.js +1 -0
  89. package/.next/server/app/api/roles/[id]/route.js.nft.json +1 -0
  90. package/.next/server/app/api/roles/[id]/route_client-reference-manifest.js +1 -0
  91. package/.next/server/app/api/roles/route.js +1 -0
  92. package/.next/server/app/api/roles/route.js.nft.json +1 -0
  93. package/.next/server/app/api/roles/route_client-reference-manifest.js +1 -0
  94. package/.next/server/app/api/settings/agent-role-defaults/route.js +1 -0
  95. package/.next/server/app/api/settings/agent-role-defaults/route.js.nft.json +1 -0
  96. package/.next/server/app/api/settings/agent-role-defaults/route_client-reference-manifest.js +1 -0
  97. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  98. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  99. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/slash-commands/route.js +1 -1
  108. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  111. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  115. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/verification/runs/route.js +1 -1
  117. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  120. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  123. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  126. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -3
  132. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  133. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  136. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  139. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
  145. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  146. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  198. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/instances/roles/route.js +1 -0
  200. package/.next/server/app/api/worktrees/[id]/instances/roles/route.js.nft.json +1 -0
  201. package/.next/server/app/api/worktrees/[id]/instances/roles/route_client-reference-manifest.js +1 -0
  202. package/.next/server/app/api/worktrees/[id]/instances/roles/settle/route.js +1 -0
  203. package/.next/server/app/api/worktrees/[id]/instances/roles/settle/route.js.nft.json +1 -0
  204. package/.next/server/app/api/worktrees/[id]/instances/roles/settle/route_client-reference-manifest.js +1 -0
  205. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +2 -2
  209. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  210. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  224. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  227. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  230. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  233. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  238. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  243. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  244. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
  246. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  247. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
  249. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  250. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  254. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -104
  256. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  257. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  260. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  263. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  266. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  268. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  269. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
  271. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
  272. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  274. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
  275. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  276. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  277. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  279. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  280. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  281. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  282. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  283. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  284. package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
  285. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
  286. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  287. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
  288. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  289. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  290. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  291. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  292. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  293. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  294. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  295. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  296. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  297. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  298. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  299. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  300. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  301. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  302. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  303. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  304. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  305. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  306. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  307. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  308. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  309. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  310. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  311. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  312. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  313. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  314. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  315. package/.next/server/app/api/worktrees/route.js +1 -1
  316. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  317. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  318. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  319. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  320. package/.next/server/app/more/page.js +1 -1
  321. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  322. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  323. package/.next/server/app/page_client-reference-manifest.js +1 -1
  324. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  325. package/.next/server/app/repositories/page.js +2 -2
  326. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  327. package/.next/server/app/review/page.js +1 -1
  328. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  329. package/.next/server/app/sessions/page.js +1 -1
  330. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  331. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  332. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  333. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  334. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  335. package/.next/server/app/worktrees/[id]/page.js +11 -11
  336. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  337. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  338. package/.next/server/app-paths-manifest.json +19 -13
  339. package/.next/server/chunks/1184.js +5 -0
  340. package/.next/server/chunks/1501.js +5 -5
  341. package/.next/server/chunks/1656.js +2 -2
  342. package/.next/server/chunks/1957.js +2 -2
  343. package/.next/server/chunks/1990.js +103 -0
  344. package/.next/server/chunks/2119.js +1 -1
  345. package/.next/server/chunks/2404.js +1 -1
  346. package/.next/server/chunks/2445.js +1 -1
  347. package/.next/server/chunks/2819.js +1 -0
  348. package/.next/server/chunks/2897.js +1 -1
  349. package/.next/server/chunks/3042.js +2 -0
  350. package/.next/server/chunks/3241.js +1 -1
  351. package/.next/server/chunks/3294.js +3 -0
  352. package/.next/server/chunks/3417.js +1 -1
  353. package/.next/server/chunks/3480.js +1 -1
  354. package/.next/server/chunks/3505.js +2 -6
  355. package/.next/server/chunks/3543.js +1 -1
  356. package/.next/server/chunks/3801.js +2 -2
  357. package/.next/server/chunks/3945.js +1 -1
  358. package/.next/server/chunks/4207.js +1 -1
  359. package/.next/server/chunks/454.js +1 -0
  360. package/.next/server/chunks/4645.js +1 -0
  361. package/.next/server/chunks/4911.js +1 -1
  362. package/.next/server/chunks/5350.js +6 -2
  363. package/.next/server/chunks/5354.js +1 -1
  364. package/.next/server/chunks/5571.js +1 -1
  365. package/.next/server/chunks/6009.js +12 -0
  366. package/.next/server/chunks/6130.js +1 -1
  367. package/.next/server/chunks/6285.js +1 -1
  368. package/.next/server/chunks/6401.js +1 -1
  369. package/.next/server/chunks/6486.js +2 -2
  370. package/.next/server/chunks/6569.js +1 -0
  371. package/.next/server/chunks/6781.js +1 -1
  372. package/.next/server/chunks/6793.js +4 -4
  373. package/.next/server/chunks/696.js +3 -0
  374. package/.next/server/chunks/7023.js +3 -3
  375. package/.next/server/chunks/{9702.js → 7083.js} +1 -1
  376. package/.next/server/chunks/741.js +1 -0
  377. package/.next/server/chunks/7662.js +1 -0
  378. package/.next/server/chunks/7905.js +1 -1
  379. package/.next/server/chunks/8143.js +33 -0
  380. package/.next/server/chunks/8581.js +6 -6
  381. package/.next/server/chunks/8728.js +2 -2
  382. package/.next/server/chunks/8782.js +1 -1
  383. package/.next/server/chunks/8807.js +97 -10
  384. package/.next/server/chunks/8918.js +3 -105
  385. package/.next/server/chunks/8955.js +1 -0
  386. package/.next/server/chunks/923.js +1 -0
  387. package/.next/server/chunks/9390.js +2 -2
  388. package/.next/server/chunks/9627.js +5 -5
  389. package/.next/server/chunks/973.js +1 -0
  390. package/.next/server/chunks/9731.js +3 -3
  391. package/.next/server/middleware-build-manifest.js +1 -1
  392. package/.next/server/middleware-manifest.json +5 -5
  393. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  394. package/.next/server/pages/500.html +1 -1
  395. package/.next/server/server-reference-manifest.json +1 -1
  396. package/.next/static/chunks/2314-2c9d587a27e8f731.js +1 -0
  397. package/.next/static/chunks/2407-ee881c99e218975b.js +1 -0
  398. package/.next/static/chunks/3931-24d7e245a93feb25.js +1 -0
  399. package/.next/static/chunks/4548-9afa02fd18afa6c7.js +1 -0
  400. package/.next/static/chunks/{5794-7975b8e51e731b19.js → 5794-38b3b504b3d97e04.js} +1 -1
  401. package/.next/static/chunks/{6966-d8dc6032410ffaba.js → 6966-dbfa4a43397f8c6d.js} +1 -1
  402. package/.next/static/chunks/7090-28e83f5a0efdb3b4.js +1 -0
  403. package/.next/static/chunks/7229.016d007c467a3600.js +1 -0
  404. package/.next/static/chunks/{8407-35bbfc84793d7004.js → 8407-dd6a8062fc449899.js} +1 -1
  405. package/.next/static/chunks/app/api/agents/update/route-476063c3571b81dd.js +1 -0
  406. package/.next/static/chunks/app/api/agents/versions/route-476063c3571b81dd.js +1 -0
  407. package/.next/static/chunks/app/api/app/release-notes/route-476063c3571b81dd.js +1 -0
  408. package/.next/static/chunks/app/api/app/update/route-476063c3571b81dd.js +1 -0
  409. package/.next/static/chunks/app/api/app/update-check/route-476063c3571b81dd.js +1 -0
  410. package/.next/static/chunks/app/api/auth/login/route-476063c3571b81dd.js +1 -0
  411. package/.next/static/chunks/app/api/auth/logout/route-476063c3571b81dd.js +1 -0
  412. package/.next/static/chunks/app/api/auth/status/route-476063c3571b81dd.js +1 -0
  413. package/.next/static/chunks/app/api/capabilities/route-476063c3571b81dd.js +1 -0
  414. package/.next/static/chunks/app/api/daily-summary/route-476063c3571b81dd.js +1 -0
  415. package/.next/static/chunks/app/api/daily-summary/status/route-476063c3571b81dd.js +1 -0
  416. package/.next/static/chunks/app/api/external-apps/[id]/health/route-476063c3571b81dd.js +1 -0
  417. package/.next/static/chunks/app/api/external-apps/[id]/route-476063c3571b81dd.js +1 -0
  418. package/.next/static/chunks/app/api/external-apps/route-476063c3571b81dd.js +1 -0
  419. package/.next/static/chunks/app/api/fs/browse/route-476063c3571b81dd.js +1 -0
  420. package/.next/static/chunks/app/api/fs/recent-paths/route-476063c3571b81dd.js +1 -0
  421. package/.next/static/chunks/app/api/hooks/agent-event/route-476063c3571b81dd.js +1 -0
  422. package/.next/static/chunks/app/api/hooks/claude-done/route-476063c3571b81dd.js +1 -0
  423. package/.next/static/chunks/app/api/hooks/permission-request/route-476063c3571b81dd.js +1 -0
  424. package/.next/static/chunks/app/api/metrics/vibe/route-476063c3571b81dd.js +1 -0
  425. package/.next/static/chunks/app/api/ollama/models/route-476063c3571b81dd.js +1 -0
  426. package/.next/static/chunks/app/api/push/escalation/route-476063c3571b81dd.js +1 -0
  427. package/.next/static/chunks/app/api/push/subscriptions/route-476063c3571b81dd.js +1 -0
  428. package/.next/static/chunks/app/api/push/vapid/route-476063c3571b81dd.js +1 -0
  429. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-476063c3571b81dd.js +1 -0
  430. package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-476063c3571b81dd.js +1 -0
  431. package/.next/static/chunks/app/api/relays/[relayId]/route-476063c3571b81dd.js +1 -0
  432. package/.next/static/chunks/app/api/relays/route-476063c3571b81dd.js +1 -0
  433. package/.next/static/chunks/app/api/remote/pair/route-476063c3571b81dd.js +1 -0
  434. package/.next/static/chunks/app/api/repositories/[id]/role-defaults/route-476063c3571b81dd.js +1 -0
  435. package/.next/static/chunks/app/api/repositories/[id]/route-476063c3571b81dd.js +1 -0
  436. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-476063c3571b81dd.js +1 -0
  437. package/.next/static/chunks/app/api/repositories/clone/route-476063c3571b81dd.js +1 -0
  438. package/.next/static/chunks/app/api/repositories/excluded/route-476063c3571b81dd.js +1 -0
  439. package/.next/static/chunks/app/api/repositories/restore/route-476063c3571b81dd.js +1 -0
  440. package/.next/static/chunks/app/api/repositories/route-476063c3571b81dd.js +1 -0
  441. package/.next/static/chunks/app/api/repositories/scan/route-476063c3571b81dd.js +1 -0
  442. package/.next/static/chunks/app/api/repositories/sync/route-476063c3571b81dd.js +1 -0
  443. package/.next/static/chunks/app/api/repositories/validate-path/route-476063c3571b81dd.js +1 -0
  444. package/.next/static/chunks/app/api/roles/[id]/route-476063c3571b81dd.js +1 -0
  445. package/.next/static/chunks/app/api/roles/route-476063c3571b81dd.js +1 -0
  446. package/.next/static/chunks/app/api/settings/agent-role-defaults/route-476063c3571b81dd.js +1 -0
  447. package/.next/static/chunks/app/api/settings/default-agents/route-476063c3571b81dd.js +1 -0
  448. package/.next/static/chunks/app/api/settings/default-surface-mode/route-476063c3571b81dd.js +1 -0
  449. package/.next/static/chunks/app/api/sidebar/group-order/route-476063c3571b81dd.js +1 -0
  450. package/.next/static/chunks/app/api/skills/[id]/route-476063c3571b81dd.js +1 -0
  451. package/.next/static/chunks/app/api/skills/installations/route-476063c3571b81dd.js +1 -0
  452. package/.next/static/chunks/app/api/skills/operations/route-476063c3571b81dd.js +1 -0
  453. package/.next/static/chunks/app/api/skills/reindex/route-476063c3571b81dd.js +1 -0
  454. package/.next/static/chunks/app/api/skills/route-476063c3571b81dd.js +1 -0
  455. package/.next/static/chunks/app/api/slash-commands/route-476063c3571b81dd.js +1 -0
  456. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-476063c3571b81dd.js +1 -0
  457. package/.next/static/chunks/app/api/tasks/[taskId]/route-476063c3571b81dd.js +1 -0
  458. package/.next/static/chunks/app/api/templates/[id]/route-476063c3571b81dd.js +1 -0
  459. package/.next/static/chunks/app/api/templates/route-476063c3571b81dd.js +1 -0
  460. package/.next/static/chunks/app/api/verification/runs/[runId]/route-476063c3571b81dd.js +1 -0
  461. package/.next/static/chunks/app/api/verification/runs/route-476063c3571b81dd.js +1 -0
  462. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-476063c3571b81dd.js +1 -0
  463. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-476063c3571b81dd.js +1 -0
  464. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-476063c3571b81dd.js +1 -0
  465. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-476063c3571b81dd.js +1 -0
  466. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-476063c3571b81dd.js +1 -0
  467. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-476063c3571b81dd.js +1 -0
  468. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-476063c3571b81dd.js +1 -0
  469. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-476063c3571b81dd.js +1 -0
  470. package/.next/static/chunks/app/api/worktrees/[id]/env/route-476063c3571b81dd.js +1 -0
  471. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-476063c3571b81dd.js +1 -0
  472. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-476063c3571b81dd.js +1 -0
  473. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-476063c3571b81dd.js +1 -0
  474. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-476063c3571b81dd.js +1 -0
  475. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-476063c3571b81dd.js +1 -0
  476. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-476063c3571b81dd.js +1 -0
  477. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-476063c3571b81dd.js +1 -0
  478. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-476063c3571b81dd.js +1 -0
  479. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-476063c3571b81dd.js +1 -0
  480. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-476063c3571b81dd.js +1 -0
  481. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-476063c3571b81dd.js +1 -0
  482. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-476063c3571b81dd.js +1 -0
  483. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-476063c3571b81dd.js +1 -0
  484. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-476063c3571b81dd.js +1 -0
  485. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-476063c3571b81dd.js +1 -0
  486. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-476063c3571b81dd.js +1 -0
  487. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-476063c3571b81dd.js +1 -0
  488. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-476063c3571b81dd.js +1 -0
  489. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-476063c3571b81dd.js +1 -0
  490. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-476063c3571b81dd.js +1 -0
  491. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-476063c3571b81dd.js +1 -0
  492. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-476063c3571b81dd.js +1 -0
  493. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-476063c3571b81dd.js +1 -0
  494. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-476063c3571b81dd.js +1 -0
  495. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-476063c3571b81dd.js +1 -0
  496. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-476063c3571b81dd.js +1 -0
  497. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-476063c3571b81dd.js +1 -0
  498. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-476063c3571b81dd.js +1 -0
  499. package/.next/static/chunks/app/api/worktrees/[id]/instances/roles/route-476063c3571b81dd.js +1 -0
  500. package/.next/static/chunks/app/api/worktrees/[id]/instances/roles/settle/route-476063c3571b81dd.js +1 -0
  501. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-476063c3571b81dd.js +1 -0
  502. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-476063c3571b81dd.js +1 -0
  503. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-476063c3571b81dd.js +1 -0
  504. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-476063c3571b81dd.js +1 -0
  505. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-476063c3571b81dd.js +1 -0
  506. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-476063c3571b81dd.js +1 -0
  507. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-476063c3571b81dd.js +1 -0
  508. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-476063c3571b81dd.js +1 -0
  509. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-476063c3571b81dd.js +1 -0
  510. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-476063c3571b81dd.js +1 -0
  511. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-476063c3571b81dd.js +1 -0
  512. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-476063c3571b81dd.js +1 -0
  513. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-476063c3571b81dd.js +1 -0
  514. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-476063c3571b81dd.js +1 -0
  515. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-476063c3571b81dd.js +1 -0
  516. package/.next/static/chunks/app/api/worktrees/[id]/route-476063c3571b81dd.js +1 -0
  517. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-476063c3571b81dd.js +1 -0
  518. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-476063c3571b81dd.js +1 -0
  519. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-476063c3571b81dd.js +1 -0
  520. package/.next/static/chunks/app/api/worktrees/[id]/search/route-476063c3571b81dd.js +1 -0
  521. package/.next/static/chunks/app/api/worktrees/[id]/send/route-476063c3571b81dd.js +1 -0
  522. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-476063c3571b81dd.js +1 -0
  523. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-476063c3571b81dd.js +1 -0
  524. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-476063c3571b81dd.js +1 -0
  525. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-476063c3571b81dd.js +1 -0
  526. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-476063c3571b81dd.js +1 -0
  527. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-476063c3571b81dd.js +1 -0
  528. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-476063c3571b81dd.js +1 -0
  529. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-476063c3571b81dd.js +1 -0
  530. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-476063c3571b81dd.js +1 -0
  531. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-476063c3571b81dd.js +1 -0
  532. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-476063c3571b81dd.js +1 -0
  533. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-476063c3571b81dd.js +1 -0
  534. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-476063c3571b81dd.js +1 -0
  535. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-476063c3571b81dd.js +1 -0
  536. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-476063c3571b81dd.js +1 -0
  537. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-476063c3571b81dd.js +1 -0
  538. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-476063c3571b81dd.js +1 -0
  539. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-476063c3571b81dd.js +1 -0
  540. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-476063c3571b81dd.js +1 -0
  541. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-476063c3571b81dd.js +1 -0
  542. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-476063c3571b81dd.js +1 -0
  543. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-476063c3571b81dd.js +1 -0
  544. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-476063c3571b81dd.js +1 -0
  545. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-476063c3571b81dd.js +1 -0
  546. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-476063c3571b81dd.js +1 -0
  547. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-476063c3571b81dd.js +1 -0
  548. package/.next/static/chunks/app/api/worktrees/route-476063c3571b81dd.js +1 -0
  549. package/.next/static/chunks/app/layout-7bf800fcc5e025b1.js +1 -0
  550. package/.next/static/chunks/app/manifest.webmanifest/route-476063c3571b81dd.js +1 -0
  551. package/.next/static/chunks/app/more/{page-ff5af5ca48774c89.js → page-e8f5780f6e4fb657.js} +1 -1
  552. package/.next/static/chunks/app/{page-b4863bfe0452e09d.js → page-869f353a4ac4e15b.js} +1 -1
  553. package/.next/static/chunks/app/proxy/[...path]/route-476063c3571b81dd.js +1 -0
  554. package/.next/static/chunks/app/repositories/page-bedb505687010f18.js +1 -0
  555. package/.next/static/chunks/app/review/page-87c4a9b0de50fa80.js +1 -0
  556. package/.next/static/chunks/app/sessions/{page-c6eb7c02db2f4c80.js → page-82ca46793789fce4.js} +1 -1
  557. package/.next/static/chunks/app/worktrees/[id]/layout-476063c3571b81dd.js +1 -0
  558. package/.next/static/chunks/app/worktrees/[id]/page-570eb79fbbd1a934.js +1 -0
  559. package/.next/static/chunks/{webpack-838df0273b03af19.js → webpack-16b1a3143fa42ca0.js} +1 -1
  560. package/.next/static/css/d4f2c9522cf1b449.css +1 -0
  561. package/.next/static/z4d8-5MaLkoD-4EhueZwk/_buildManifest.js +1 -0
  562. package/.next/trace +14 -13
  563. package/.next/types/app/api/repositories/[id]/role-defaults/route.ts +347 -0
  564. package/.next/types/app/api/roles/[id]/route.ts +347 -0
  565. package/.next/types/app/api/roles/route.ts +347 -0
  566. package/.next/types/app/api/settings/agent-role-defaults/route.ts +347 -0
  567. package/.next/types/app/api/worktrees/[id]/instances/roles/route.ts +347 -0
  568. package/.next/types/app/api/worktrees/[id]/instances/roles/settle/route.ts +347 -0
  569. package/.next/types/routes.d.ts +7 -1
  570. package/.next/types/validator.ts +54 -0
  571. package/dist/cli/commands/instances.d.ts +1 -0
  572. package/dist/cli/commands/instances.d.ts.map +1 -1
  573. package/dist/cli/commands/instances.js +290 -33
  574. package/dist/cli/commands/message-dispatch.d.ts +25 -3
  575. package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
  576. package/dist/cli/commands/message-dispatch.js +26 -6
  577. package/dist/cli/commands/relays.d.ts +5 -0
  578. package/dist/cli/commands/relays.d.ts.map +1 -1
  579. package/dist/cli/commands/relays.js +37 -1
  580. package/dist/cli/commands/roles.d.ts +11 -0
  581. package/dist/cli/commands/roles.d.ts.map +1 -0
  582. package/dist/cli/commands/roles.js +392 -0
  583. package/dist/cli/commands/send.d.ts.map +1 -1
  584. package/dist/cli/commands/send.js +526 -38
  585. package/dist/cli/docs/agent-operations.d.ts +1 -1
  586. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  587. package/dist/cli/docs/agent-operations.js +91 -3
  588. package/dist/cli/index.d.ts +4 -0
  589. package/dist/cli/index.d.ts.map +1 -1
  590. package/dist/cli/index.js +6 -0
  591. package/dist/cli/types/api-responses.d.ts +54 -0
  592. package/dist/cli/types/api-responses.d.ts.map +1 -1
  593. package/dist/cli/types/index.d.ts +38 -0
  594. package/dist/cli/types/index.d.ts.map +1 -1
  595. package/dist/cli/types/index.js +15 -1
  596. package/dist/cli/utils/agent-instances.d.ts +29 -1
  597. package/dist/cli/utils/agent-instances.d.ts.map +1 -1
  598. package/dist/cli/utils/agent-instances.js +67 -7
  599. package/dist/cli/utils/agent-roles.d.ts +75 -0
  600. package/dist/cli/utils/agent-roles.d.ts.map +1 -0
  601. package/dist/cli/utils/agent-roles.js +238 -0
  602. package/dist/cli/utils/api-client-errors.d.ts +23 -1
  603. package/dist/cli/utils/api-client-errors.d.ts.map +1 -1
  604. package/dist/cli/utils/api-client-errors.js +14 -2
  605. package/dist/cli/utils/api-client.d.ts +8 -0
  606. package/dist/cli/utils/api-client.d.ts.map +1 -1
  607. package/dist/cli/utils/api-client.js +13 -1
  608. package/dist/cli/utils/role-failure.d.ts +31 -0
  609. package/dist/cli/utils/role-failure.d.ts.map +1 -0
  610. package/dist/cli/utils/role-failure.js +90 -0
  611. package/dist/cli/utils/role-input.d.ts +16 -0
  612. package/dist/cli/utils/role-input.d.ts.map +1 -0
  613. package/dist/cli/utils/role-input.js +78 -0
  614. package/dist/cli/utils/security-logger.d.ts +17 -0
  615. package/dist/cli/utils/security-logger.d.ts.map +1 -1
  616. package/dist/cli/utils/security-logger.js +44 -5
  617. package/dist/lib/detection/tools/verified-against.d.ts +16 -0
  618. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  619. package/dist/lib/detection/tools/verified-against.js +16 -0
  620. package/dist/lib/session/send-attempt-types.d.ts +4 -0
  621. package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
  622. package/dist/lib/verification/verify-config.d.ts +22 -0
  623. package/dist/lib/verification/verify-config.d.ts.map +1 -1
  624. package/dist/lib/verification/verify-config.js +32 -2
  625. package/dist/server/locales/en/worktree.json +25 -6
  626. package/dist/server/locales/ja/worktree.json +25 -6
  627. package/dist/server/src/config/safe-directory.js +30 -0
  628. package/dist/server/src/lib/agent-roles/adapters.js +174 -0
  629. package/dist/server/src/lib/agent-roles/artifacts.js +638 -0
  630. package/dist/server/src/lib/agent-roles/composition.js +222 -0
  631. package/dist/server/src/lib/agent-roles/fingerprint.js +21 -0
  632. package/dist/server/src/lib/agent-roles/jsonc.js +85 -0
  633. package/dist/server/src/lib/agent-roles/launch-errors.js +58 -0
  634. package/dist/server/src/lib/agent-roles/pane-env.js +63 -0
  635. package/dist/server/src/lib/agent-roles/resolve.js +375 -0
  636. package/dist/server/src/lib/agent-roles/toml-basic.js +140 -0
  637. package/dist/server/src/lib/agent-roles/unicode.js +16 -0
  638. package/dist/server/src/lib/agent-roles/validation.js +61 -0
  639. package/dist/server/src/lib/cli-tools/antigravity.js +39 -6
  640. package/dist/server/src/lib/cli-tools/base.js +63 -5
  641. package/dist/server/src/lib/cli-tools/claude-auto-default-nudge.js +141 -0
  642. package/dist/server/src/lib/cli-tools/claude.js +7 -1
  643. package/dist/server/src/lib/cli-tools/codex.js +134 -21
  644. package/dist/server/src/lib/cli-tools/command-code.js +24 -1
  645. package/dist/server/src/lib/cli-tools/copilot.js +36 -7
  646. package/dist/server/src/lib/cli-tools/gemini.js +37 -3
  647. package/dist/server/src/lib/cli-tools/launch-answer-skips.js +76 -0
  648. package/dist/server/src/lib/cli-tools/opencode-v2.js +10 -0
  649. package/dist/server/src/lib/cli-tools/opencode.js +58 -7
  650. package/dist/server/src/lib/cli-tools/submit-composer-read.js +24 -4
  651. package/dist/server/src/lib/cli-tools/vibe-local.js +25 -1
  652. package/dist/server/src/lib/db/agent-instances-db.js +53 -0
  653. package/dist/server/src/lib/db/agent-roles-db.js +409 -0
  654. package/dist/server/src/lib/db/agent-session-cost-sampler.js +3 -2
  655. package/dist/server/src/lib/db/db-instance.js +7 -37
  656. package/dist/server/src/lib/db/migrations/index.js +4 -0
  657. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  658. package/dist/server/src/lib/db/migrations/v64-agent-roles.js +123 -0
  659. package/dist/server/src/lib/db/migrations/v65-agent-instance-creation-keys.js +42 -0
  660. package/dist/server/src/lib/db/relay-db.js +35 -0
  661. package/dist/server/src/lib/detection/cli-patterns.js +13 -3
  662. package/dist/server/src/lib/detection/model-info-extractor.js +1 -1
  663. package/dist/server/src/lib/detection/tools/claude/patterns.js +76 -0
  664. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +5 -0
  665. package/dist/server/src/lib/detection/tools/codex/detect.js +5 -1
  666. package/dist/server/src/lib/detection/tools/codex/patterns.js +52 -2
  667. package/dist/server/src/lib/detection/tools/codex/prompt.js +23 -3
  668. package/dist/server/src/lib/detection/tools/opencode/detect.js +30 -15
  669. package/dist/server/src/lib/detection/tools/opencode/patterns.js +268 -7
  670. package/dist/server/src/lib/detection/tools/opencode/readiness.js +16 -7
  671. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +51 -15
  672. package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +195 -11
  673. package/dist/server/src/lib/detection/tools/run-detection.js +5 -2
  674. package/dist/server/src/lib/detection/tools/verified-against.js +16 -0
  675. package/dist/server/src/lib/detection/tools/vibe-local/readiness.js +22 -0
  676. package/dist/server/src/lib/git/git-common-dir.js +192 -0
  677. package/dist/server/src/lib/hooks/hook-settings-generator.js +8 -2
  678. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +31 -1
  679. package/dist/server/src/lib/hooks/sources/launch-command.js +31 -8
  680. package/dist/server/src/lib/hooks/sources/opencode/client.js +20 -0
  681. package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +24 -0
  682. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +208 -35
  683. package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +7 -1
  684. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +117 -2
  685. package/dist/server/src/lib/job-executor.js +18 -1
  686. package/dist/server/src/lib/polling/response-checker-extraction-steps.js +58 -4
  687. package/dist/server/src/lib/polling/response-checker.js +32 -7
  688. package/dist/server/src/lib/relay/relay-delivery-block.js +150 -0
  689. package/dist/server/src/lib/relay/relay-delivery.js +59 -2
  690. package/dist/server/src/lib/response-cleaner.js +13 -3
  691. package/dist/server/src/lib/response-extractor.js +38 -3
  692. package/dist/server/src/lib/session/agent-session-lifecycle.js +9 -1
  693. package/dist/server/src/lib/session/claude-executor.js +13 -1
  694. package/dist/server/src/lib/session/claude-session.js +109 -13
  695. package/dist/server/src/lib/session/instance-input-lock.js +93 -4
  696. package/dist/server/src/lib/session/role-launch.js +722 -0
  697. package/dist/server/src/lib/session/send-attempt-state.js +7 -0
  698. package/dist/server/src/lib/session/send-user-message.js +6 -0
  699. package/dist/server/src/lib/session/session-generation-archive.js +7 -8
  700. package/dist/server/src/lib/session/session-launch-flight.js +33 -1
  701. package/dist/server/src/lib/session/worktree-session-reconcile.js +5 -0
  702. package/dist/server/src/lib/test-run-detection.js +53 -0
  703. package/dist/server/src/lib/tmux/read-mode.js +4 -0
  704. package/dist/server/src/lib/tmux/session-hook-scripts.js +36 -4
  705. package/dist/server/src/lib/tui-accumulator.js +14 -5
  706. package/dist/server/src/lib/verification/env-clean-gate.js +117 -12
  707. package/dist/server/src/lib/verification/gate-runner.js +9 -8
  708. package/dist/server/src/lib/verification/verify-config.js +32 -2
  709. package/dist/server/src/types/agent-roles.js +56 -0
  710. package/dist/types/agent-roles.d.ts +351 -0
  711. package/dist/types/agent-roles.d.ts.map +1 -0
  712. package/dist/types/agent-roles.js +56 -0
  713. package/docs/en/user-guide/webapp-guide.md +16 -0
  714. package/package.json +2 -1
  715. package/release-notes/0.50.0.json +113 -0
  716. package/.next/server/chunks/1308.js +0 -1
  717. package/.next/server/chunks/4490.js +0 -1
  718. package/.next/server/chunks/4936.js +0 -1
  719. package/.next/server/chunks/610.js +0 -1
  720. package/.next/server/chunks/6119.js +0 -1
  721. package/.next/server/chunks/7491.js +0 -3
  722. package/.next/server/chunks/7926.js +0 -1
  723. package/.next/server/chunks/9360.js +0 -2
  724. package/.next/server/chunks/9584.js +0 -1
  725. package/.next/static/LNfVZiq6FZwKsV7L9Mi6M/_buildManifest.js +0 -1
  726. package/.next/static/chunks/2407-87ec01332344ec2b.js +0 -1
  727. package/.next/static/chunks/344-e1cefd00787060e4.js +0 -1
  728. package/.next/static/chunks/3931-3ef48b8d97357282.js +0 -1
  729. package/.next/static/chunks/7229.7f0f5a7032b612b4.js +0 -1
  730. package/.next/static/chunks/8165-263172c17ae8e8c3.js +0 -1
  731. package/.next/static/chunks/app/api/agents/update/route-96fc12d400b49b13.js +0 -1
  732. package/.next/static/chunks/app/api/agents/versions/route-96fc12d400b49b13.js +0 -1
  733. package/.next/static/chunks/app/api/app/release-notes/route-96fc12d400b49b13.js +0 -1
  734. package/.next/static/chunks/app/api/app/update/route-96fc12d400b49b13.js +0 -1
  735. package/.next/static/chunks/app/api/app/update-check/route-96fc12d400b49b13.js +0 -1
  736. package/.next/static/chunks/app/api/auth/login/route-96fc12d400b49b13.js +0 -1
  737. package/.next/static/chunks/app/api/auth/logout/route-96fc12d400b49b13.js +0 -1
  738. package/.next/static/chunks/app/api/auth/status/route-96fc12d400b49b13.js +0 -1
  739. package/.next/static/chunks/app/api/capabilities/route-96fc12d400b49b13.js +0 -1
  740. package/.next/static/chunks/app/api/daily-summary/route-96fc12d400b49b13.js +0 -1
  741. package/.next/static/chunks/app/api/daily-summary/status/route-96fc12d400b49b13.js +0 -1
  742. package/.next/static/chunks/app/api/external-apps/[id]/health/route-96fc12d400b49b13.js +0 -1
  743. package/.next/static/chunks/app/api/external-apps/[id]/route-96fc12d400b49b13.js +0 -1
  744. package/.next/static/chunks/app/api/external-apps/route-96fc12d400b49b13.js +0 -1
  745. package/.next/static/chunks/app/api/fs/browse/route-96fc12d400b49b13.js +0 -1
  746. package/.next/static/chunks/app/api/fs/recent-paths/route-96fc12d400b49b13.js +0 -1
  747. package/.next/static/chunks/app/api/hooks/agent-event/route-96fc12d400b49b13.js +0 -1
  748. package/.next/static/chunks/app/api/hooks/claude-done/route-96fc12d400b49b13.js +0 -1
  749. package/.next/static/chunks/app/api/hooks/permission-request/route-96fc12d400b49b13.js +0 -1
  750. package/.next/static/chunks/app/api/metrics/vibe/route-96fc12d400b49b13.js +0 -1
  751. package/.next/static/chunks/app/api/ollama/models/route-96fc12d400b49b13.js +0 -1
  752. package/.next/static/chunks/app/api/push/escalation/route-96fc12d400b49b13.js +0 -1
  753. package/.next/static/chunks/app/api/push/subscriptions/route-96fc12d400b49b13.js +0 -1
  754. package/.next/static/chunks/app/api/push/vapid/route-96fc12d400b49b13.js +0 -1
  755. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-96fc12d400b49b13.js +0 -1
  756. package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-96fc12d400b49b13.js +0 -1
  757. package/.next/static/chunks/app/api/relays/[relayId]/route-96fc12d400b49b13.js +0 -1
  758. package/.next/static/chunks/app/api/relays/route-96fc12d400b49b13.js +0 -1
  759. package/.next/static/chunks/app/api/remote/pair/route-96fc12d400b49b13.js +0 -1
  760. package/.next/static/chunks/app/api/repositories/[id]/route-96fc12d400b49b13.js +0 -1
  761. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-96fc12d400b49b13.js +0 -1
  762. package/.next/static/chunks/app/api/repositories/clone/route-96fc12d400b49b13.js +0 -1
  763. package/.next/static/chunks/app/api/repositories/excluded/route-96fc12d400b49b13.js +0 -1
  764. package/.next/static/chunks/app/api/repositories/restore/route-96fc12d400b49b13.js +0 -1
  765. package/.next/static/chunks/app/api/repositories/route-96fc12d400b49b13.js +0 -1
  766. package/.next/static/chunks/app/api/repositories/scan/route-96fc12d400b49b13.js +0 -1
  767. package/.next/static/chunks/app/api/repositories/sync/route-96fc12d400b49b13.js +0 -1
  768. package/.next/static/chunks/app/api/repositories/validate-path/route-96fc12d400b49b13.js +0 -1
  769. package/.next/static/chunks/app/api/settings/default-agents/route-96fc12d400b49b13.js +0 -1
  770. package/.next/static/chunks/app/api/settings/default-surface-mode/route-96fc12d400b49b13.js +0 -1
  771. package/.next/static/chunks/app/api/sidebar/group-order/route-96fc12d400b49b13.js +0 -1
  772. package/.next/static/chunks/app/api/skills/[id]/route-96fc12d400b49b13.js +0 -1
  773. package/.next/static/chunks/app/api/skills/installations/route-96fc12d400b49b13.js +0 -1
  774. package/.next/static/chunks/app/api/skills/operations/route-96fc12d400b49b13.js +0 -1
  775. package/.next/static/chunks/app/api/skills/reindex/route-96fc12d400b49b13.js +0 -1
  776. package/.next/static/chunks/app/api/skills/route-96fc12d400b49b13.js +0 -1
  777. package/.next/static/chunks/app/api/slash-commands/route-96fc12d400b49b13.js +0 -1
  778. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-96fc12d400b49b13.js +0 -1
  779. package/.next/static/chunks/app/api/tasks/[taskId]/route-96fc12d400b49b13.js +0 -1
  780. package/.next/static/chunks/app/api/templates/[id]/route-96fc12d400b49b13.js +0 -1
  781. package/.next/static/chunks/app/api/templates/route-96fc12d400b49b13.js +0 -1
  782. package/.next/static/chunks/app/api/verification/runs/[runId]/route-96fc12d400b49b13.js +0 -1
  783. package/.next/static/chunks/app/api/verification/runs/route-96fc12d400b49b13.js +0 -1
  784. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-96fc12d400b49b13.js +0 -1
  785. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-96fc12d400b49b13.js +0 -1
  786. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-96fc12d400b49b13.js +0 -1
  787. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-96fc12d400b49b13.js +0 -1
  788. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-96fc12d400b49b13.js +0 -1
  789. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-96fc12d400b49b13.js +0 -1
  790. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-96fc12d400b49b13.js +0 -1
  791. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-96fc12d400b49b13.js +0 -1
  792. package/.next/static/chunks/app/api/worktrees/[id]/env/route-96fc12d400b49b13.js +0 -1
  793. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-96fc12d400b49b13.js +0 -1
  794. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-96fc12d400b49b13.js +0 -1
  795. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-96fc12d400b49b13.js +0 -1
  796. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-96fc12d400b49b13.js +0 -1
  797. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-96fc12d400b49b13.js +0 -1
  798. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-96fc12d400b49b13.js +0 -1
  799. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-96fc12d400b49b13.js +0 -1
  800. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-96fc12d400b49b13.js +0 -1
  801. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-96fc12d400b49b13.js +0 -1
  802. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-96fc12d400b49b13.js +0 -1
  803. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-96fc12d400b49b13.js +0 -1
  804. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-96fc12d400b49b13.js +0 -1
  805. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-96fc12d400b49b13.js +0 -1
  806. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-96fc12d400b49b13.js +0 -1
  807. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-96fc12d400b49b13.js +0 -1
  808. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-96fc12d400b49b13.js +0 -1
  809. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-96fc12d400b49b13.js +0 -1
  810. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-96fc12d400b49b13.js +0 -1
  811. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-96fc12d400b49b13.js +0 -1
  812. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-96fc12d400b49b13.js +0 -1
  813. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-96fc12d400b49b13.js +0 -1
  814. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-96fc12d400b49b13.js +0 -1
  815. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-96fc12d400b49b13.js +0 -1
  816. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-96fc12d400b49b13.js +0 -1
  817. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-96fc12d400b49b13.js +0 -1
  818. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-96fc12d400b49b13.js +0 -1
  819. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-96fc12d400b49b13.js +0 -1
  820. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-96fc12d400b49b13.js +0 -1
  821. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-96fc12d400b49b13.js +0 -1
  822. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-96fc12d400b49b13.js +0 -1
  823. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-96fc12d400b49b13.js +0 -1
  824. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-96fc12d400b49b13.js +0 -1
  825. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-96fc12d400b49b13.js +0 -1
  826. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-96fc12d400b49b13.js +0 -1
  827. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-96fc12d400b49b13.js +0 -1
  828. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-96fc12d400b49b13.js +0 -1
  829. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-96fc12d400b49b13.js +0 -1
  830. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-96fc12d400b49b13.js +0 -1
  831. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-96fc12d400b49b13.js +0 -1
  832. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-96fc12d400b49b13.js +0 -1
  833. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-96fc12d400b49b13.js +0 -1
  834. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-96fc12d400b49b13.js +0 -1
  835. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-96fc12d400b49b13.js +0 -1
  836. package/.next/static/chunks/app/api/worktrees/[id]/route-96fc12d400b49b13.js +0 -1
  837. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-96fc12d400b49b13.js +0 -1
  838. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-96fc12d400b49b13.js +0 -1
  839. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-96fc12d400b49b13.js +0 -1
  840. package/.next/static/chunks/app/api/worktrees/[id]/search/route-96fc12d400b49b13.js +0 -1
  841. package/.next/static/chunks/app/api/worktrees/[id]/send/route-96fc12d400b49b13.js +0 -1
  842. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-96fc12d400b49b13.js +0 -1
  843. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-96fc12d400b49b13.js +0 -1
  844. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-96fc12d400b49b13.js +0 -1
  845. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-96fc12d400b49b13.js +0 -1
  846. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-96fc12d400b49b13.js +0 -1
  847. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-96fc12d400b49b13.js +0 -1
  848. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-96fc12d400b49b13.js +0 -1
  849. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-96fc12d400b49b13.js +0 -1
  850. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-96fc12d400b49b13.js +0 -1
  851. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-96fc12d400b49b13.js +0 -1
  852. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-96fc12d400b49b13.js +0 -1
  853. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-96fc12d400b49b13.js +0 -1
  854. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-96fc12d400b49b13.js +0 -1
  855. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-96fc12d400b49b13.js +0 -1
  856. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-96fc12d400b49b13.js +0 -1
  857. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-96fc12d400b49b13.js +0 -1
  858. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-96fc12d400b49b13.js +0 -1
  859. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-96fc12d400b49b13.js +0 -1
  860. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-96fc12d400b49b13.js +0 -1
  861. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-96fc12d400b49b13.js +0 -1
  862. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-96fc12d400b49b13.js +0 -1
  863. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-96fc12d400b49b13.js +0 -1
  864. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-96fc12d400b49b13.js +0 -1
  865. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-96fc12d400b49b13.js +0 -1
  866. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-96fc12d400b49b13.js +0 -1
  867. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-96fc12d400b49b13.js +0 -1
  868. package/.next/static/chunks/app/api/worktrees/route-96fc12d400b49b13.js +0 -1
  869. package/.next/static/chunks/app/layout-b9d8aef70e4f17b2.js +0 -1
  870. package/.next/static/chunks/app/manifest.webmanifest/route-96fc12d400b49b13.js +0 -1
  871. package/.next/static/chunks/app/proxy/[...path]/route-96fc12d400b49b13.js +0 -1
  872. package/.next/static/chunks/app/repositories/page-71f5a5ac29b0370d.js +0 -1
  873. package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +0 -1
  874. package/.next/static/chunks/app/worktrees/[id]/layout-96fc12d400b49b13.js +0 -1
  875. package/.next/static/chunks/app/worktrees/[id]/page-f6a151304860b549.js +0 -1
  876. package/.next/static/css/c1e307d05daf93b6.css +0 -1
  877. /package/.next/static/{LNfVZiq6FZwKsV7L9Mi6M → z4d8-5MaLkoD-4EhueZwk}/_ssgManifest.js +0 -0
@@ -45,6 +45,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
45
45
  exports.OPENCODE_SHARE_REQUEST_TIMEOUT_MS = exports.MAX_OPENCODE_DIFF_PATCH_CHARS = exports.MAX_OPENCODE_DIFF_FILES = exports.OPENCODE_CONTEXT_MESSAGE_WINDOW = exports.MAX_OPENCODE_SESSION_MESSAGES = exports.MAX_OPENCODE_SSE_FRAME_CHARS = exports.MAX_OPENCODE_SESSION_STATUSES = exports.OPENCODE_EVENT_CONTENT_TYPE = exports.OPENCODE_JSON_CONTENT_TYPE = exports.OPENCODE_FETCH_REDIRECT = exports.OPENCODE_REQUEST_TIMEOUT_MS = exports.OPENCODE_SERVER_HOST = void 0;
46
46
  exports.opencodeBaseUrl = opencodeBaseUrl;
47
47
  exports.probeOpencodeHealth = probeOpencodeHealth;
48
+ exports.fetchOpencodeConfig = fetchOpencodeConfig;
48
49
  exports.fetchOpencodeHealth = fetchOpencodeHealth;
49
50
  exports.fetchOpencodePendingPermissions = fetchOpencodePendingPermissions;
50
51
  exports.fetchOpencodePendingQuestions = fetchOpencodePendingQuestions;
@@ -242,6 +243,25 @@ async function probeOpencodeHealth(port) {
242
243
  health: { healthy: true, version: typeof body.version === 'string' ? body.version : null },
243
244
  };
244
245
  }
246
+ /**
247
+ * The resolved config, for the role's evidence (Issue #4115, §14). May hold secrets,
248
+ * so the caller compares it and keeps none of it. Null when nothing answered.
249
+ */
250
+ async function fetchOpencodeConfig(port) {
251
+ try {
252
+ const response = await loopbackFetch(`${opencodeBaseUrl(port)}/config`, {
253
+ signal: AbortSignal.timeout(5000),
254
+ });
255
+ if (response.status !== 200) {
256
+ await response.body?.cancel().catch(() => { });
257
+ return null;
258
+ }
259
+ return await response.json();
260
+ }
261
+ catch {
262
+ return null;
263
+ }
264
+ }
245
265
  /**
246
266
  * Ask whether an opencode server is listening on this port.
247
267
  *
@@ -32,6 +32,7 @@ exports.OPENCODE_V2_CONTEXT_MESSAGE_WINDOW = exports.MAX_OPENCODE_V2_DECISION_BO
32
32
  exports.opencodeV2BaseUrl = opencodeV2BaseUrl;
33
33
  exports.opencodeV2AuthorizationHeader = opencodeV2AuthorizationHeader;
34
34
  exports.probeOpencodeV2Server = probeOpencodeV2Server;
35
+ exports.fetchOpencodeV2Config = fetchOpencodeV2Config;
35
36
  exports.createOpencodeV2SseParser = createOpencodeV2SseParser;
36
37
  exports.parseOpencodeV2Frame = parseOpencodeV2Frame;
37
38
  exports.openOpencodeV2EventStream = openOpencodeV2EventStream;
@@ -92,6 +93,29 @@ async function probeOpencodeV2Server(port, password) {
92
93
  return { kind: 'unreachable' };
93
94
  }
94
95
  }
96
+ /**
97
+ * The config sources, for the role's evidence (Issue #4115, §14): on 2.0.18 an array
98
+ * in order of strength, not one merged object. Holds the role's text and possibly
99
+ * secrets, so the caller compares it and keeps none of it. Null when the server did
100
+ * not answer.
101
+ */
102
+ async function fetchOpencodeV2Config(port, password, directory) {
103
+ try {
104
+ const response = await fetch(`${opencodeV2BaseUrl(port)}/api/config?directory=${encodeURIComponent(directory)}`, {
105
+ headers: { Authorization: opencodeV2AuthorizationHeader(password) },
106
+ redirect: 'error',
107
+ signal: AbortSignal.timeout(exports.OPENCODE_V2_PROBE_TIMEOUT_MS),
108
+ });
109
+ if (response.status !== 200) {
110
+ await response.body?.cancel().catch(() => { });
111
+ return null;
112
+ }
113
+ return await response.json();
114
+ }
115
+ catch {
116
+ return null;
117
+ }
118
+ }
95
119
  /** A fresh {@link OpencodeV2SseParser}. */
96
120
  function createOpencodeV2SseParser() {
97
121
  let buffer = '';
@@ -24,7 +24,15 @@
24
24
  * ending close together write each turn once;
25
25
  * - and it recovers what the stream missed. A turn that ended while the
26
26
  * connection was down is in the document the next time any turn of the
27
- * session ends.
27
+ * session ends — and, since Issue #4187, when the stream reconnects
28
+ * ({@link recoverOpencodeV2History}, which reads back past the newest
29
+ * `user` message, to the page cap).
30
+ *
31
+ * The screen scraper never writes a V2 reply (Issue #4187's decision): the turns
32
+ * of a stream that is not live are this module's to write, later, under their
33
+ * `oc-turn:` key — a scraped row cannot carry that key, so both writing would
34
+ * double the turn. A pane with no subscription at all (`--standalone`) or one
35
+ * whose subscription ended on its own is not recorded.
28
36
  *
29
37
  * ## One turn in the document
30
38
  *
@@ -103,6 +111,7 @@ exports.buildOpencodeV2TurnsFromMessages = buildOpencodeV2TurnsFromMessages;
103
111
  exports.readLatestOpencodeV2AssistantModel = readLatestOpencodeV2AssistantModel;
104
112
  exports.resetOpencodeV2HistoryQueue = resetOpencodeV2HistoryQueue;
105
113
  exports.syncOpencodeV2History = syncOpencodeV2History;
114
+ exports.recoverOpencodeV2History = recoverOpencodeV2History;
106
115
  const logger_1 = require("../../../../lib/logger");
107
116
  const agent_event_state_1 = require("../../../../lib/session/agent-event-state");
108
117
  const agent_transcript_1 = require("../../../../types/agent-transcript");
@@ -167,19 +176,9 @@ function readOpencodeV2ContentPart(messageId, index, item) {
167
176
  : null,
168
177
  };
169
178
  }
170
- /**
171
- * Rebuild the turns of a session from `GET /api/session/{id}/message` entries.
172
- *
173
- * Order-agnostic: the entries are sorted oldest first by `time.created` (the
174
- * id, which is time-ordered, breaks ties), so a desc page, an asc page or
175
- * several pages concatenated give the same turns. Assistant messages before the
176
- * first `user` message belong to a turn whose head is outside what was read,
177
- * and are dropped rather than attached to nothing.
178
- *
179
- * Pure: no fetch, no database.
180
- */
181
- function buildOpencodeV2TurnsFromMessages(entries, sessionId) {
182
- const messages = entries
179
+ /** `entries`' messages oldest first, as {@link buildOpencodeV2TurnsFromMessages} orders them. */
180
+ function sortOpencodeV2MessagesOldestFirst(entries) {
181
+ return entries
183
182
  .filter(event_mapper_1.isPlainObject)
184
183
  .filter((message) => (0, event_mapper_1.readStringField)(message, 'id') !== null)
185
184
  .map((message, index) => ({ message, index }))
@@ -192,6 +191,20 @@ function buildOpencodeV2TurnsFromMessages(entries, sessionId) {
192
191
  return aId < bId ? -1 : aId > bId ? 1 : a.index - b.index;
193
192
  })
194
193
  .map(({ message }) => message);
194
+ }
195
+ /**
196
+ * Rebuild the turns of a session from `GET /api/session/{id}/message` entries.
197
+ *
198
+ * Order-agnostic: the entries are sorted oldest first by `time.created` (the
199
+ * id, which is time-ordered, breaks ties), so a desc page, an asc page or
200
+ * several pages concatenated give the same turns. Assistant messages before the
201
+ * first `user` message belong to a turn whose head is outside what was read,
202
+ * and are dropped rather than attached to nothing.
203
+ *
204
+ * Pure: no fetch, no database.
205
+ */
206
+ function buildOpencodeV2TurnsFromMessages(entries, sessionId) {
207
+ const messages = sortOpencodeV2MessagesOldestFirst(entries);
195
208
  const turns = [];
196
209
  let open = null;
197
210
  const close = (closed) => {
@@ -304,6 +317,78 @@ async function readRecentMessages(port, password, sessionId) {
304
317
  }
305
318
  return entries;
306
319
  }
320
+ /** Whether History already holds the turn opened by this user message. */
321
+ async function isOpencodeV2TurnSaved(target, userMessageId) {
322
+ const [{ getDbInstance }, { findMessageByRequestId }] = await Promise.all([
323
+ Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
324
+ Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
325
+ ]);
326
+ return (findMessageByRequestId(getDbInstance(), target.worktreeId, (0, agent_transcript_1.opencodeTurnRequestId)(userMessageId)) !==
327
+ null);
328
+ }
329
+ /**
330
+ * Read newest-first pages up to {@link MAX_OPENCODE_V2_HISTORY_PAGES} (or the
331
+ * document's end) for the recovery sync (Issue #4187, C6).
332
+ *
333
+ * The ordinary read ({@link readRecentMessages}) stops at the first page with a
334
+ * `user` message, so a turn that closed while the stream was down and is a page
335
+ * further back is never read. This one does not stop at a turn History already
336
+ * has either: no such turn marks the gap's edge for sure — an ordinary sync can
337
+ * write a newer turn before the loss is noticed, and V2's times are another
338
+ * clock — so it reads the whole cap, and the rows' keys (`oc-turn:<id>`) and
339
+ * the per-instance queue keep a turn from being written twice.
340
+ */
341
+ async function readMessagesToCap(target, port, password, sessionId) {
342
+ const entries = [];
343
+ let cursor = null;
344
+ for (let page = 0; page < exports.MAX_OPENCODE_V2_HISTORY_PAGES; page += 1) {
345
+ const result = await (0, client_1.fetchOpencodeV2SessionMessagesPage)(port, password, sessionId, cursor);
346
+ if (result === null)
347
+ return { entries, unreadable: true, pages: page, truncated: false };
348
+ entries.push(...result.data);
349
+ if (result.next === null || result.data.length === 0) {
350
+ return { entries, unreadable: false, pages: page + 1, truncated: false };
351
+ }
352
+ if (page === exports.MAX_OPENCODE_V2_HISTORY_PAGES - 1) {
353
+ return {
354
+ entries,
355
+ unreadable: false,
356
+ pages: page + 1,
357
+ truncated: headUnread(entries) || (await holdsUnsavedTurn(target, result.data)),
358
+ };
359
+ }
360
+ cursor = result.next;
361
+ }
362
+ return { entries, unreadable: false, pages: exports.MAX_OPENCODE_V2_HISTORY_PAGES, truncated: false };
363
+ }
364
+ /**
365
+ * Whether the oldest turn read has messages but not its head: an `assistant`
366
+ * older than every `user` read. Its `user` is beyond the cap, so the turn
367
+ * cannot be built (or told saved) from what was read — a turn longer than the
368
+ * pages read included. Counted as possibly missing: without its `user` id
369
+ * there is no way to ask History.
370
+ */
371
+ function headUnread(entries) {
372
+ for (const message of sortOpencodeV2MessagesOldestFirst(entries)) {
373
+ const type = (0, event_mapper_1.readStringField)(message, 'type');
374
+ if (type === 'user')
375
+ return false;
376
+ if (type === 'assistant')
377
+ return true;
378
+ }
379
+ return false;
380
+ }
381
+ /** Whether `page` has a `user` message whose turn History does not have. */
382
+ async function holdsUnsavedTurn(target, page) {
383
+ for (const entry of page) {
384
+ if (!(0, event_mapper_1.isPlainObject)(entry) || (0, event_mapper_1.readStringField)(entry, 'type') !== 'user')
385
+ continue;
386
+ const id = (0, event_mapper_1.readStringField)(entry, 'id');
387
+ if (id !== null && !(await isOpencodeV2TurnSaved(target, id)))
388
+ return true;
389
+ }
390
+ return false;
391
+ }
307
392
  /**
308
393
  * Write one rendered turn, unless its row is already there.
309
394
  *
@@ -358,6 +443,43 @@ async function writeOpencodeV2Turn(target, rendered, timestampMs) {
358
443
  });
359
444
  return true;
360
445
  }
446
+ /**
447
+ * Latch the answering model, then write the closed turns of `entries` that
448
+ * History does not have, oldest first. Shared by the ordinary sync and the
449
+ * recovery sync (Issue #4187).
450
+ *
451
+ * @returns How many rows were written, and how many turns History does not
452
+ * have the newest-kept cap dropped
453
+ */
454
+ async function writeOpencodeV2Turns(target, sessionId, entries, isCurrent) {
455
+ // Issue #2964: the model that answered, onto the hook latch the UI and
456
+ // `capture --json` read. Before the rows, so a failed write cannot cost it.
457
+ // Issue #3733: not for a subscription closed or replaced during the read —
458
+ // a restarted or stopped session would show the old model, and its change
459
+ // broadcast and Push (#2357) would fire for a session that is not there.
460
+ // Issue #4187 (C5): the subscription's `isCurrent` also asks that the session
461
+ // read is still the one it is following, so a late sync of the previous
462
+ // session does not put that session's model back on the display.
463
+ if (isCurrent()) {
464
+ (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));
465
+ }
466
+ const closed = buildOpencodeV2TurnsFromMessages(entries, sessionId).filter((turn) => turn.closed);
467
+ const kept = closed.slice(-exports.MAX_OPENCODE_V2_SYNCED_TURNS);
468
+ let droppedUnsaved = 0;
469
+ for (const turn of closed.slice(0, closed.length - kept.length)) {
470
+ if (!(await isOpencodeV2TurnSaved(target, turn.accumulator.userMessageId)))
471
+ droppedUnsaved += 1;
472
+ }
473
+ let written = 0;
474
+ // Oldest first, so the rows go in in conversation order.
475
+ for (const turn of kept) {
476
+ const rendered = (0, transcript_1.renderOpencodeTurn)(turn.accumulator);
477
+ const at = Math.max(turn.accumulator.startedAt, turn.completedAt ?? 0);
478
+ if (await writeOpencodeV2Turn(target, rendered, at))
479
+ written += 1;
480
+ }
481
+ return { written, droppedUnsaved };
482
+ }
361
483
  /**
362
484
  * Record every closed turn of a session that History does not have yet.
363
485
  *
@@ -368,9 +490,10 @@ async function writeOpencodeV2Turn(target, rendered, timestampMs) {
368
490
  * @param port - Its server
369
491
  * @param sessionId - `ses_…` from the end-of-turn frame
370
492
  * @param isCurrent - Whether the subscription that asked is still the
371
- * instance's (Issue #3733); checked after the read, right before the model
372
- * is latched. False skips only the latch: the rows are still written (the
373
- * turn did happen, and `requestId` keeps a later sync from doubling them)
493
+ * instance's (Issue #3733) and still following `sessionId` (Issue #4187);
494
+ * checked after the read, right before the model is latched. False skips
495
+ * only the latch: the rows are still written (the turn did happen, and
496
+ * `requestId` keeps a later sync from doubling them)
374
497
  * @returns How many rows were written
375
498
  */
376
499
  function syncOpencodeV2History(target, port, sessionId, isCurrent = () => true) {
@@ -397,25 +520,74 @@ function syncOpencodeV2History(target, port, sessionId, isCurrent = () => true)
397
520
  });
398
521
  return 0;
399
522
  }
400
- // Issue #2964: the model that answered, onto the hook latch the UI and
401
- // `capture --json` read. Before the rows, so a failed write cannot cost it.
402
- // Issue #3733: not for a subscription closed or replaced during the read —
403
- // a restarted or stopped session would show the old model, and its change
404
- // broadcast and Push (#2357) would fire for a session that is not there.
405
- if (isCurrent()) {
406
- (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));
523
+ return (await writeOpencodeV2Turns(target, sessionId, entries, isCurrent)).written;
524
+ }
525
+ catch (error) {
526
+ logger.error('opencode-v2-history-sync-failed', {
527
+ worktreeId: target.worktreeId,
528
+ instanceId,
529
+ port,
530
+ sessionId,
531
+ error: error instanceof Error ? error.message : String(error),
532
+ });
533
+ return 0;
534
+ }
535
+ });
536
+ }
537
+ /**
538
+ * Record the closed turns of a session that ended while the instance's stream
539
+ * was not live (Issue #4187, the recovery sync on reconnect).
540
+ *
541
+ * The same rows, keys and queue as {@link syncOpencodeV2History} — a recovery
542
+ * and an ordinary sync that overlap still write each turn once (C8) — but read
543
+ * {@link MAX_OPENCODE_V2_HISTORY_PAGES} pages (or to the document's end)
544
+ * instead of to the newest `user` message (C6), never stopping early at a turn
545
+ * History has. A warn (`opencode-v2-history-recovery-truncated`) says only that
546
+ * turns History does not have may lie beyond the cap: the oldest page read held
547
+ * one, the oldest turn read has no `user` in what was read, or
548
+ * {@link MAX_OPENCODE_V2_SYNCED_TURNS} dropped one. Guaranteed: the
549
+ * closed, unsaved turns within those pages, whatever order rows were written in
550
+ * and whatever the clocks say — not every turn ever.
551
+ *
552
+ * Never throws.
553
+ */
554
+ function recoverOpencodeV2History(target, port, sessionId, options = {}) {
555
+ const isCurrent = options.isCurrent ?? (() => true);
556
+ return serialize((0, secrets_1.opencodeV2KeyOf)(target), async () => {
557
+ const instanceId = target.instanceId ?? target.cliToolId;
558
+ try {
559
+ const password = (0, secrets_1.readOpencodeV2Password)(target);
560
+ if (password === null) {
561
+ // The subscription ends on this too; nothing to try again for.
562
+ logger.info('opencode-v2-history-unavailable', {
563
+ worktreeId: target.worktreeId,
564
+ instanceId,
565
+ reason: 'password-file-missing',
566
+ });
567
+ return { written: 0, unreadable: false };
568
+ }
569
+ const read = await readMessagesToCap(target, port, password, sessionId);
570
+ if (read.unreadable && read.entries.length === 0) {
571
+ logger.warn('opencode-v2-history-unavailable', {
572
+ worktreeId: target.worktreeId,
573
+ instanceId,
574
+ port,
575
+ sessionId,
576
+ reason: 'messages-unreadable',
577
+ });
578
+ return { written: 0, unreadable: true };
407
579
  }
408
- const closed = buildOpencodeV2TurnsFromMessages(entries, sessionId).filter((turn) => turn.closed);
409
- const kept = closed.slice(-exports.MAX_OPENCODE_V2_SYNCED_TURNS);
410
- let written = 0;
411
- // Oldest first, so the rows go in in conversation order.
412
- for (const turn of kept) {
413
- const rendered = (0, transcript_1.renderOpencodeTurn)(turn.accumulator);
414
- const at = Math.max(turn.accumulator.startedAt, turn.completedAt ?? 0);
415
- if (await writeOpencodeV2Turn(target, rendered, at))
416
- written += 1;
580
+ const { written, droppedUnsaved } = await writeOpencodeV2Turns(target, sessionId, read.entries, isCurrent);
581
+ if (read.truncated || droppedUnsaved > 0) {
582
+ logger.warn('opencode-v2-history-recovery-truncated', {
583
+ worktreeId: target.worktreeId,
584
+ instanceId,
585
+ sessionId,
586
+ pages: read.pages,
587
+ droppedTurns: droppedUnsaved,
588
+ });
417
589
  }
418
- return written;
590
+ return { written, unreadable: read.unreadable };
419
591
  }
420
592
  catch (error) {
421
593
  logger.error('opencode-v2-history-sync-failed', {
@@ -423,9 +595,10 @@ function syncOpencodeV2History(target, port, sessionId, isCurrent = () => true)
423
595
  instanceId,
424
596
  port,
425
597
  sessionId,
598
+ recovery: true,
426
599
  error: error instanceof Error ? error.message : String(error),
427
600
  });
428
- return 0;
601
+ return { written: 0, unreadable: true };
429
602
  }
430
603
  });
431
604
  }
@@ -65,10 +65,16 @@ exports.OPENCODE_V2_PASSWORD_SUFFIX = '.pw';
65
65
  *
66
66
  * `~/.commandmate/opencode-v2`, or `$CM_OPENCODE_V2_DIR`. Resolved on every call
67
67
  * so a test that points `HOME` or the variable somewhere else is honoured.
68
+ *
69
+ * Issue #4210: absolute, because a path under it leaves this process. The
70
+ * launch line hands `--password-file <file>` to `scripts/opencode-v2/launch.sh`
71
+ * (`./source.ts` `prepareOpencodeV2Launch`), which runs in the worktree
72
+ * (`cli-tools/base.ts` `createLaunchPane`) and would otherwise read another
73
+ * file than the one written here, or none.
68
74
  */
69
75
  function getOpencodeV2StateDir() {
70
76
  const fallback = (0, path_1.join)((0, os_1.homedir)(), '.commandmate', 'opencode-v2');
71
- return (0, safe_directory_1.resolveSafeDirectory)(process.env[exports.OPENCODE_V2_DIR_ENV], fallback, exports.OPENCODE_V2_DIR_ENV);
77
+ return (0, safe_directory_1.resolveSafeAbsoluteDirectory)(process.env[exports.OPENCODE_V2_DIR_ENV], fallback, exports.OPENCODE_V2_DIR_ENV);
72
78
  }
73
79
  /**
74
80
  * Create the state directory with owner-only access.
@@ -29,11 +29,18 @@
29
29
  * And (Issue #2981) `session.usage.updated` and the end of a turn have
30
30
  * `./usage` refresh the session's spend and context, which the subscription
31
31
  * drops again when it closes or ends — the place v1 drops them.
32
+ * And (Issue #4187) a reconnect — a successful connection after an earlier
33
+ * successful one — has `./history` read the sessions the stream was following
34
+ * when it was lost, once, after the pending resync
35
+ * ({@link recoverOpencodeV2History}), so a turn that closed while the stream
36
+ * was down is written even when no later turn of that session ends. The screen
37
+ * scraper never writes a V2 reply, live or not.
32
38
  *
33
39
  * @module lib/hooks/sources/opencode-v2/subscription
34
40
  */
35
41
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.OPENCODE_V2_MAX_RESYNCED_DECISIONS = exports.OPENCODE_V2_MAX_REJECTED_PROBES = exports.OPENCODE_V2_RECONNECT_BACKOFF_MS = exports.OPENCODE_V2_HEARTBEAT_TIMEOUT_MS = void 0;
42
+ exports.OPENCODE_V2_HISTORY_RECOVERY_RETRY_MS = exports.OPENCODE_V2_MAX_RESYNCED_DECISIONS = exports.OPENCODE_V2_MAX_REJECTED_PROBES = exports.OPENCODE_V2_RECONNECT_BACKOFF_MS = exports.OPENCODE_V2_HEARTBEAT_TIMEOUT_MS = void 0;
43
+ exports.setOpencodeV2HistoryRecoveryRetryDelaysForTests = setOpencodeV2HistoryRecoveryRetryDelaysForTests;
37
44
  exports.isOpencodeV2Subscribed = isOpencodeV2Subscribed;
38
45
  exports.getOpencodeV2Liveness = getOpencodeV2Liveness;
39
46
  exports.isOpencodeV2StructuredHistoryLive = isOpencodeV2StructuredHistoryLive;
@@ -72,6 +79,17 @@ exports.OPENCODE_V2_MAX_REJECTED_PROBES = 3;
72
79
  * off a server CommandMate does not police.
73
80
  */
74
81
  exports.OPENCODE_V2_MAX_RESYNCED_DECISIONS = 50;
82
+ /**
83
+ * Waits before retrying a recovery sync whose document could not be read
84
+ * (Issue #4187, C7). Three retries, then the session is given up with a warn;
85
+ * its next turn end still has the ordinary sync read the newest turns.
86
+ */
87
+ exports.OPENCODE_V2_HISTORY_RECOVERY_RETRY_MS = [2_000, 5_000, 15_000];
88
+ let recoveryRetryDelays = exports.OPENCODE_V2_HISTORY_RECOVERY_RETRY_MS;
89
+ /** Shorten the recovery retries. Test seam; null restores the defaults. */
90
+ function setOpencodeV2HistoryRecoveryRetryDelaysForTests(delays) {
91
+ recoveryRetryDelays = delays ?? exports.OPENCODE_V2_HISTORY_RECOVERY_RETRY_MS;
92
+ }
75
93
  const subscriptions = (0, global_state_1.getOrInitGlobal)('__opencodeV2Subscriptions', () => new Map());
76
94
  /** The last liveness of a subscription that ended on its own, for `liveness()`. */
77
95
  const endedLiveness = (0, global_state_1.getOrInitGlobal)('__opencodeV2EndedLiveness', () => new Map());
@@ -132,6 +150,10 @@ function openOpencodeV2Subscription(target, port, onEvent, normalize) {
132
150
  liveness: { state: 'unknown' },
133
151
  closed: false,
134
152
  watchdog: null,
153
+ connectedOnce: false,
154
+ currentSessionId: null,
155
+ recoverySessions: new Map(),
156
+ recoveryController: new AbortController(),
135
157
  };
136
158
  subscriptions.set(key, state);
137
159
  logger.info('opencode-v2-subscription-opened', {
@@ -172,6 +194,7 @@ function stop(state) {
172
194
  clearWatchdog(state);
173
195
  state.streamController.abort();
174
196
  state.lifetimeController.abort();
197
+ state.recoveryController.abort();
175
198
  }
176
199
  /** End a subscription from inside its own loop, remembering why. */
177
200
  function endSubscription(state, reason) {
@@ -263,6 +286,10 @@ async function runStream(state) {
263
286
  else {
264
287
  rejected = 0;
265
288
  const items = await (0, client_1.openOpencodeV2EventStream)(state.port, password, state.streamController.signal);
289
+ // Issue #4187 (C1): read before it is set, so only a success after an
290
+ // earlier success counts as a reconnect.
291
+ const reconnected = state.connectedOnce;
292
+ state.connectedOnce = true;
266
293
  markAlive(state);
267
294
  attempt = 0;
268
295
  // Issue #2951: before the first live frame, so an approval raised while
@@ -270,6 +297,12 @@ async function runStream(state) {
270
297
  // one. A frame for the same id on the new stream is then a duplicate by
271
298
  // identity, not a second approval.
272
299
  await resyncOpencodeV2Pending(state.target, state.port, password, (frame) => deliver(state, frame));
300
+ // Issue #4187 (C2, C3): once per reconnect, after the resync, and only
301
+ // for a subscription still the instance's. Started before the first
302
+ // live frame, so it is queued in `./history` ahead of any ordinary sync
303
+ // this connection's frames trigger.
304
+ if (reconnected && isCurrentSubscription(state))
305
+ startHistoryRecovery(state);
273
306
  for await (const item of items) {
274
307
  if (state.closed)
275
308
  break;
@@ -288,6 +321,15 @@ async function runStream(state) {
288
321
  if (state.closed)
289
322
  return;
290
323
  state.liveness = { state: 'lost', since: Date.now(), reason };
324
+ // Issue #4187 (C4): the session followed when the stream was lost is what a
325
+ // reconnect recovers, whatever session the resync then names. A new entry
326
+ // per loss, so a recovery read already running cannot take this loss out
327
+ // with its own success; that recovery stops here and the next reconnect
328
+ // starts anew.
329
+ state.recoveryController.abort();
330
+ if (state.currentSessionId !== null) {
331
+ state.recoverySessions.set(state.currentSessionId, { lostAt: state.liveness.since });
332
+ }
291
333
  logger.info('opencode-v2-subscription-disconnected', {
292
334
  worktreeId: state.target.worktreeId,
293
335
  instanceId: state.target.instanceId ?? state.target.cliToolId,
@@ -374,7 +416,74 @@ function deliverOpencodeV2Frame(frame, normalize, onEvent, receivedAt = Date.now
374
416
  onEvent(event);
375
417
  return true;
376
418
  }
419
+ /**
420
+ * The recovery sync of one reconnect (Issue #4187, C2〜C8).
421
+ *
422
+ * Reads each session in `recoverySessions` back to the page cap; a
423
+ * session whose read succeeded leaves the set, one that could not be read stays
424
+ * and is retried after {@link OPENCODE_V2_HISTORY_RECOVERY_RETRY_MS}, three
425
+ * times at most, then is given up with a warn. A newer reconnect aborts this one
426
+ * and takes the set over (one recovery per reconnect); a loss of the stream,
427
+ * closing or ending the subscription aborts it too. A read already under way
428
+ * still writes its rows, but takes its session out of the set only if no loss
429
+ * replaced the entry it began on. Never throws.
430
+ */
431
+ function startHistoryRecovery(state) {
432
+ state.recoveryController.abort();
433
+ const controller = new AbortController();
434
+ state.recoveryController = controller;
435
+ void runHistoryRecovery(state, controller.signal).catch((error) => {
436
+ logger.warn('opencode-v2-history-recovery-failed', {
437
+ worktreeId: state.target.worktreeId,
438
+ instanceId: state.target.instanceId ?? state.target.cliToolId,
439
+ error: error instanceof Error ? error.message : String(error),
440
+ });
441
+ });
442
+ }
443
+ async function runHistoryRecovery(state, signal) {
444
+ const stillOurs = () => !signal.aborted && isCurrentSubscription(state);
445
+ for (let retry = 0;; retry += 1) {
446
+ if (!stillOurs())
447
+ return;
448
+ const pending = [...state.recoverySessions];
449
+ if (pending.length === 0)
450
+ return;
451
+ for (const [sessionId, entry] of pending) {
452
+ if (!stillOurs())
453
+ return;
454
+ const result = await (0, history_1.recoverOpencodeV2History)(state.target, state.port, sessionId, {
455
+ isCurrent: () => isFollowing(state, sessionId),
456
+ });
457
+ // Only the entry this read began on: a loss during the read replaced it.
458
+ if (!result.unreadable && state.recoverySessions.get(sessionId) === entry) {
459
+ state.recoverySessions.delete(sessionId);
460
+ }
461
+ }
462
+ if (state.recoverySessions.size === 0 || !stillOurs())
463
+ return;
464
+ const delays = recoveryRetryDelays;
465
+ if (retry >= delays.length) {
466
+ const givenUp = [...state.recoverySessions].filter(([, entry]) => pending.some(([, read]) => read === entry));
467
+ logger.warn('opencode-v2-history-recovery-failed', {
468
+ worktreeId: state.target.worktreeId,
469
+ instanceId: state.target.instanceId ?? state.target.cliToolId,
470
+ port: state.port,
471
+ sessionIds: givenUp.map(([sessionId]) => sessionId),
472
+ attempts: retry + 1,
473
+ });
474
+ for (const [sessionId] of givenUp)
475
+ state.recoverySessions.delete(sessionId);
476
+ return;
477
+ }
478
+ await waitUnlessAborted(delays[retry], signal);
479
+ }
480
+ }
377
481
  function deliver(state, frame) {
482
+ // Issue #4187 (C4): every frame naming a session moves the current one,
483
+ // resync frames included.
484
+ const sessionId = (0, mappers_1.frameSessionId)(frame);
485
+ if (sessionId !== null)
486
+ state.currentSessionId = sessionId;
378
487
  try {
379
488
  deliverOpencodeV2Frame(frame, state.normalize, state.onEvent);
380
489
  }
@@ -386,12 +495,18 @@ function deliver(state, frame) {
386
495
  error: error instanceof Error ? error.message : String(error),
387
496
  });
388
497
  }
389
- void recordOpencodeV2TurnEnd(state.target, state.port, frame, () => isCurrentSubscription(state));
498
+ // Issue #4187 (C5): latch only while this subscription still follows the
499
+ // session the frame ended a turn of.
500
+ void recordOpencodeV2TurnEnd(state.target, state.port, frame, () => sessionId !== null && isFollowing(state, sessionId));
390
501
  void refreshOpencodeV2UsageOnFrame(state.target, state.port, frame, () => isCurrentSubscription(state));
391
502
  }
392
503
  function isCurrentSubscription(state) {
393
504
  return !state.closed && subscriptions.get(state.key) === state;
394
505
  }
506
+ /** Still the instance's subscription, and still following `sessionId` (C5). */
507
+ function isFollowing(state, sessionId) {
508
+ return isCurrentSubscription(state) && state.currentSessionId === sessionId;
509
+ }
395
510
  /**
396
511
  * Have `./usage` re-read the session's spend and context when this frame says
397
512
  * they moved (Issue #2981): `session.usage.updated`, or the end of a turn.
@@ -23,6 +23,8 @@ exports.resolveScheduleExecuteOptions = resolveScheduleExecuteOptions;
23
23
  exports.executeSchedule = executeSchedule;
24
24
  const crypto_1 = require("crypto");
25
25
  const claude_executor_1 = require("./session/claude-executor");
26
+ const role_launch_1 = require("./session/role-launch");
27
+ const env_sanitizer_1 = require("../lib/security/env-sanitizer");
26
28
  const cmate_cli_tool_parser_1 = require("../lib/cmate-cli-tool-parser");
27
29
  const logger_1 = require("../lib/logger");
28
30
  const logger = (0, logger_1.createLogger)('job-executor');
@@ -191,7 +193,22 @@ async function executeSchedule(state) {
191
193
  }
192
194
  // Resolve the CLI options via the centralized helper (DR1-004, #2044)
193
195
  const options = resolveScheduleExecuteOptions(state.entry, worktree);
194
- const result = await (0, claude_executor_1.executeClaudeCommand)(state.entry.message, worktree.path, state.entry.cliToolId, state.entry.permission, options);
196
+ // Issue #4115: the defaults for this worktree and tool, resolved here and not in
197
+ // `executeClaudeCommand`, which the daily summary shares (D2). A role that cannot
198
+ // be applied fails the run: it must not go ahead without one.
199
+ const scheduleRole = await (0, role_launch_1.resolveScheduleRole)(db, {
200
+ worktreeId: state.worktreeId,
201
+ cliToolId: state.entry.cliToolId,
202
+ worktreePath: worktree.path,
203
+ explicitAgent: options?.agent,
204
+ env: (0, env_sanitizer_1.sanitizeEnvForChildProcess)(),
205
+ });
206
+ if (scheduleRole.kind === 'refused') {
207
+ updateExecutionLog(logId, 'failed', scheduleRole.refusal.message, null);
208
+ logger.warn('execution:role-refused', { name: state.entry.name, reason: scheduleRole.refusal.reason });
209
+ return;
210
+ }
211
+ const result = await (0, claude_executor_1.executeClaudeCommand)(state.entry.message, worktree.path, state.entry.cliToolId, state.entry.permission, scheduleRole.kind === 'role' ? { ...options, role: scheduleRole.role } : options);
195
212
  // Issue #2253: `result.status` is not always "did the process exit 0".
196
213
  // command-code writes a `{"type":"result","subtype":…}` line even on a
197
214
  // non-zero exit and can pair `subtype: "success"` with exit 9, so