commandmate 0.27.1 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (918) hide show
  1. package/.env.example +28 -0
  2. package/.next/BUILD_ID +1 -1
  3. package/.next/app-build-manifest.json +278 -248
  4. package/.next/app-path-routes-manifest.json +30 -26
  5. package/.next/build-manifest.json +2 -2
  6. package/.next/prerender-manifest.json +15 -15
  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/app/update/route.js +1 -1
  11. package/.next/server/app/api/app/update/route.js.nft.json +1 -1
  12. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/update-check/route.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/assistant/conversation/route.js +1 -1
  16. package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
  17. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/assistant/current-output/route.js +1 -1
  19. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  20. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/assistant/messages/route.js +1 -1
  22. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  23. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/assistant/session/route.js +1 -1
  25. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  26. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/assistant/start/route.js +32 -1
  28. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  29. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/assistant/terminal/route.js +34 -3
  31. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  32. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/assistant/tools/route.js +1 -1
  34. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  35. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/capabilities/route.js +1 -1
  40. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/daily-summary/route.js +1 -1
  42. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  43. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  45. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  46. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
  48. package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
  49. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/external-apps/[id]/route.js +1 -1
  51. package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/external-apps/route.js +1 -1
  54. package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
  55. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/fs/browse/route.js +1 -1
  57. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
  58. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/fs/recent-paths/route.js +1 -1
  60. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
  61. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/hooks/agent-event/route.js +1 -1
  63. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  64. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  66. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  67. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  69. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  70. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/metrics/vibe/route.js +1 -1
  72. package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
  73. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/push/escalation/route.js +1 -1
  76. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  77. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/push/subscriptions/route.js +7 -1
  79. package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
  80. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/push/vapid/route.js +1 -1
  82. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  83. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  85. package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  86. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  88. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js.nft.json +1 -1
  89. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  91. package/.next/server/app/api/repositories/[id]/todos/route.js.nft.json +1 -1
  92. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  94. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  95. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/repositories/clone/route.js +1 -1
  97. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  98. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/repositories/excluded/route.js +1 -1
  100. package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
  101. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/repositories/restore/route.js +1 -1
  103. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  104. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/repositories/route.js +1 -1
  106. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  107. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/repositories/scan/route.js +1 -1
  109. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  110. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/repositories/sync/route.js +1 -1
  112. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  113. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/repositories/validate-path/route.js +1 -1
  115. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  116. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/sidebar/group-order/route.js +1 -1
  118. package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
  119. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
  121. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/skills/installations/route.js +1 -1
  123. package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
  124. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/skills/operations/route.js +1 -1
  126. package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
  127. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/skills/reindex/route.js +1 -1
  129. package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
  130. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  132. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
  134. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/tasks/[taskId]/cancel/route.js +1 -1
  136. package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
  137. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  139. package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
  140. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/templates/[id]/route.js +2 -2
  142. package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
  143. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/templates/route.js +2 -2
  145. package/.next/server/app/api/templates/route.js.nft.json +1 -1
  146. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/todos/route.js +1 -1
  148. package/.next/server/app/api/todos/route.js.nft.json +1 -1
  149. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  151. package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
  152. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/verification/runs/route.js +1 -1
  154. package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
  155. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  158. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  161. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
  167. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
  169. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  170. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/current-output/route.js +2 -2
  172. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  173. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
  176. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
  179. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
  181. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  182. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  185. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  188. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  191. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  194. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  197. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  200. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  203. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  206. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  209. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  212. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  215. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  218. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  221. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  224. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  227. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  230. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  233. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  236. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  239. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  242. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  245. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  248. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  251. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  254. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -0
  256. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -0
  257. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -0
  258. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  260. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  263. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  266. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/logs/route.js +2 -2
  268. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  269. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +4 -4
  271. package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
  272. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  274. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
  275. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  276. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  277. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
  278. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  279. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  280. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
  281. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  282. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -0
  283. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -0
  284. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -0
  285. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -0
  286. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -0
  287. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -0
  288. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -0
  289. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -0
  290. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -0
  291. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  292. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  293. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  294. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  295. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
  296. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  297. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  298. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  299. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  300. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  301. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  302. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  303. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +5 -1
  304. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  305. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  306. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  307. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  308. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  309. package/.next/server/app/api/worktrees/[id]/schedules/route.js +6 -2
  310. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  311. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  312. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  313. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  314. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  315. package/.next/server/app/api/worktrees/[id]/send/route.js +7 -3
  316. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  317. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  318. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
  319. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  320. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  321. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  322. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  323. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  324. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  325. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  326. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  327. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  328. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  329. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  330. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  331. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  332. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  333. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
  334. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
  335. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  336. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  337. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
  338. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  339. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  340. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
  341. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  342. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  343. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  344. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  345. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  346. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  347. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  348. package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
  349. package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
  350. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  351. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  352. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
  353. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  354. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  355. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  356. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  357. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  358. package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
  359. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  360. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -3
  361. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  362. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  363. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  364. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  365. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  366. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  367. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  368. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  369. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  370. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  371. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  372. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  373. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  374. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  375. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  376. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  377. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  378. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  379. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  380. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  381. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  382. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
  383. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  384. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  385. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
  386. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  387. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  388. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
  389. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  390. package/.next/server/app/api/worktrees/route.js +1 -1
  391. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  392. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  393. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  394. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  395. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  396. package/.next/server/app/more/page.js +1 -1
  397. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  398. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  399. package/.next/server/app/page_client-reference-manifest.js +1 -1
  400. package/.next/server/app/proxy/[...path]/route.js +1 -1
  401. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
  402. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  403. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  404. package/.next/server/app/review/page.js +1 -1
  405. package/.next/server/app/review/page.js.nft.json +1 -1
  406. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  407. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  408. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  409. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  410. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  411. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
  412. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  413. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  414. package/.next/server/app/worktrees/[id]/page.js +15 -10
  415. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  416. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  417. package/.next/server/app/worktrees/[id]/terminal/page.js +2 -2
  418. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  419. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  420. package/.next/server/app-paths-manifest.json +30 -26
  421. package/.next/server/chunks/1058.js +1 -0
  422. package/.next/server/chunks/1068.js +1 -3
  423. package/.next/server/chunks/1191.js +13 -0
  424. package/.next/server/chunks/1296.js +1 -1
  425. package/.next/server/chunks/1601.js +2 -2
  426. package/.next/server/chunks/1714.js +7 -0
  427. package/.next/server/chunks/1886.js +5 -0
  428. package/.next/server/chunks/1944.js +1 -0
  429. package/.next/server/chunks/2119.js +1 -1
  430. package/.next/server/chunks/221.js +19 -0
  431. package/.next/server/chunks/222.js +1 -0
  432. package/.next/server/chunks/2328.js +1 -1
  433. package/.next/server/chunks/2366.js +1 -0
  434. package/.next/server/chunks/2404.js +1 -1
  435. package/.next/server/chunks/243.js +1 -0
  436. package/.next/server/chunks/2445.js +1 -1
  437. package/.next/server/chunks/2759.js +1 -1
  438. package/.next/server/chunks/3346.js +1 -1
  439. package/.next/server/chunks/3480.js +17 -1
  440. package/.next/server/chunks/3558.js +1 -0
  441. package/.next/server/chunks/4299.js +1 -0
  442. package/.next/server/chunks/4393.js +1 -1
  443. package/.next/server/chunks/5017.js +1 -1
  444. package/.next/server/chunks/5089.js +1 -1
  445. package/.next/server/chunks/5354.js +1 -1
  446. package/.next/server/chunks/5571.js +1 -1
  447. package/.next/server/chunks/6130.js +1 -1
  448. package/.next/server/chunks/6274.js +11 -10
  449. package/.next/server/chunks/6285.js +1 -1
  450. package/.next/server/chunks/6337.js +1 -0
  451. package/.next/server/chunks/6401.js +1 -1
  452. package/.next/server/chunks/663.js +78 -0
  453. package/.next/server/chunks/7472.js +1 -1
  454. package/.next/server/chunks/7824.js +1 -0
  455. package/.next/server/chunks/7905.js +1 -0
  456. package/.next/server/chunks/880.js +1 -1
  457. package/.next/server/chunks/8807.js +84 -18
  458. package/.next/server/chunks/9130.js +5 -0
  459. package/.next/server/chunks/9328.js +1 -1
  460. package/.next/server/chunks/9358.js +1 -1
  461. package/.next/server/chunks/9508.js +1 -1
  462. package/.next/server/chunks/9584.js +1 -0
  463. package/.next/server/chunks/9627.js +274 -0
  464. package/.next/server/chunks/9798.js +2 -0
  465. package/.next/server/chunks/9938.js +1 -1
  466. package/.next/server/middleware-manifest.json +5 -5
  467. package/.next/server/pages/500.html +1 -1
  468. package/.next/server/server-reference-manifest.json +1 -1
  469. package/.next/static/chunks/1188-8567ee5ecfef02ee.js +1 -0
  470. package/.next/static/chunks/3361-aa1b6e7c1d7eeeb4.js +1 -0
  471. package/.next/static/chunks/3968-8d8ca15657748bfb.js +1 -0
  472. package/.next/static/chunks/6381-d921ab728eda1191.js +1 -0
  473. package/.next/static/chunks/app/api/app/update/route-9247d6b9d647f750.js +1 -0
  474. package/.next/static/chunks/app/api/app/update-check/route-9247d6b9d647f750.js +1 -0
  475. package/.next/static/chunks/app/api/assistant/conversation/route-9247d6b9d647f750.js +1 -0
  476. package/.next/static/chunks/app/api/assistant/current-output/route-9247d6b9d647f750.js +1 -0
  477. package/.next/static/chunks/app/api/assistant/messages/route-9247d6b9d647f750.js +1 -0
  478. package/.next/static/chunks/app/api/assistant/session/route-9247d6b9d647f750.js +1 -0
  479. package/.next/static/chunks/app/api/assistant/start/route-9247d6b9d647f750.js +1 -0
  480. package/.next/static/chunks/app/api/assistant/terminal/route-9247d6b9d647f750.js +1 -0
  481. package/.next/static/chunks/app/api/assistant/tools/route-9247d6b9d647f750.js +1 -0
  482. package/.next/static/chunks/app/api/auth/login/route-9247d6b9d647f750.js +1 -0
  483. package/.next/static/chunks/app/api/auth/logout/route-9247d6b9d647f750.js +1 -0
  484. package/.next/static/chunks/app/api/auth/status/route-9247d6b9d647f750.js +1 -0
  485. package/.next/static/chunks/app/api/capabilities/route-9247d6b9d647f750.js +1 -0
  486. package/.next/static/chunks/app/api/daily-summary/route-9247d6b9d647f750.js +1 -0
  487. package/.next/static/chunks/app/api/daily-summary/status/route-9247d6b9d647f750.js +1 -0
  488. package/.next/static/chunks/app/api/external-apps/[id]/health/route-9247d6b9d647f750.js +1 -0
  489. package/.next/static/chunks/app/api/external-apps/[id]/route-9247d6b9d647f750.js +1 -0
  490. package/.next/static/chunks/app/api/external-apps/route-9247d6b9d647f750.js +1 -0
  491. package/.next/static/chunks/app/api/fs/browse/route-9247d6b9d647f750.js +1 -0
  492. package/.next/static/chunks/app/api/fs/recent-paths/route-9247d6b9d647f750.js +1 -0
  493. package/.next/static/chunks/app/api/hooks/agent-event/route-9247d6b9d647f750.js +1 -0
  494. package/.next/static/chunks/app/api/hooks/claude-done/route-9247d6b9d647f750.js +1 -0
  495. package/.next/static/chunks/app/api/hooks/permission-request/route-9247d6b9d647f750.js +1 -0
  496. package/.next/static/chunks/app/api/metrics/vibe/route-9247d6b9d647f750.js +1 -0
  497. package/.next/static/chunks/app/api/ollama/models/route-9247d6b9d647f750.js +1 -0
  498. package/.next/static/chunks/app/api/push/escalation/route-9247d6b9d647f750.js +1 -0
  499. package/.next/static/chunks/app/api/push/subscriptions/route-9247d6b9d647f750.js +1 -0
  500. package/.next/static/chunks/app/api/push/vapid/route-9247d6b9d647f750.js +1 -0
  501. package/.next/static/chunks/app/api/repositories/[id]/route-9247d6b9d647f750.js +1 -0
  502. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-9247d6b9d647f750.js +1 -0
  503. package/.next/static/chunks/app/api/repositories/[id]/todos/route-9247d6b9d647f750.js +1 -0
  504. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-9247d6b9d647f750.js +1 -0
  505. package/.next/static/chunks/app/api/repositories/clone/route-9247d6b9d647f750.js +1 -0
  506. package/.next/static/chunks/app/api/repositories/excluded/route-9247d6b9d647f750.js +1 -0
  507. package/.next/static/chunks/app/api/repositories/restore/route-9247d6b9d647f750.js +1 -0
  508. package/.next/static/chunks/app/api/repositories/route-9247d6b9d647f750.js +1 -0
  509. package/.next/static/chunks/app/api/repositories/scan/route-9247d6b9d647f750.js +1 -0
  510. package/.next/static/chunks/app/api/repositories/sync/route-9247d6b9d647f750.js +1 -0
  511. package/.next/static/chunks/app/api/repositories/validate-path/route-9247d6b9d647f750.js +1 -0
  512. package/.next/static/chunks/app/api/sidebar/group-order/route-9247d6b9d647f750.js +1 -0
  513. package/.next/static/chunks/app/api/skills/[id]/route-9247d6b9d647f750.js +1 -0
  514. package/.next/static/chunks/app/api/skills/installations/route-9247d6b9d647f750.js +1 -0
  515. package/.next/static/chunks/app/api/skills/operations/route-9247d6b9d647f750.js +1 -0
  516. package/.next/static/chunks/app/api/skills/reindex/route-9247d6b9d647f750.js +1 -0
  517. package/.next/static/chunks/app/api/skills/route-9247d6b9d647f750.js +1 -0
  518. package/.next/static/chunks/app/api/slash-commands/route-9247d6b9d647f750.js +1 -0
  519. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-9247d6b9d647f750.js +1 -0
  520. package/.next/static/chunks/app/api/tasks/[taskId]/route-9247d6b9d647f750.js +1 -0
  521. package/.next/static/chunks/app/api/templates/[id]/route-9247d6b9d647f750.js +1 -0
  522. package/.next/static/chunks/app/api/templates/route-9247d6b9d647f750.js +1 -0
  523. package/.next/static/chunks/app/api/todos/route-9247d6b9d647f750.js +1 -0
  524. package/.next/static/chunks/app/api/verification/runs/[runId]/route-9247d6b9d647f750.js +1 -0
  525. package/.next/static/chunks/app/api/verification/runs/route-9247d6b9d647f750.js +1 -0
  526. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-9247d6b9d647f750.js +1 -0
  527. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-9247d6b9d647f750.js +1 -0
  528. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-9247d6b9d647f750.js +1 -0
  529. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-9247d6b9d647f750.js +1 -0
  530. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-9247d6b9d647f750.js +1 -0
  531. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-9247d6b9d647f750.js +1 -0
  532. package/.next/static/chunks/app/api/worktrees/[id]/env/route-9247d6b9d647f750.js +1 -0
  533. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-9247d6b9d647f750.js +1 -0
  534. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-9247d6b9d647f750.js +1 -0
  535. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-9247d6b9d647f750.js +1 -0
  536. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-9247d6b9d647f750.js +1 -0
  537. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-9247d6b9d647f750.js +1 -0
  538. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-9247d6b9d647f750.js +1 -0
  539. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-9247d6b9d647f750.js +1 -0
  540. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-9247d6b9d647f750.js +1 -0
  541. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-9247d6b9d647f750.js +1 -0
  542. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-9247d6b9d647f750.js +1 -0
  543. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-9247d6b9d647f750.js +1 -0
  544. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-9247d6b9d647f750.js +1 -0
  545. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-9247d6b9d647f750.js +1 -0
  546. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-9247d6b9d647f750.js +1 -0
  547. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-9247d6b9d647f750.js +1 -0
  548. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-9247d6b9d647f750.js +1 -0
  549. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-9247d6b9d647f750.js +1 -0
  550. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-9247d6b9d647f750.js +1 -0
  551. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-9247d6b9d647f750.js +1 -0
  552. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-9247d6b9d647f750.js +1 -0
  553. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-9247d6b9d647f750.js +1 -0
  554. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-9247d6b9d647f750.js +1 -0
  555. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-9247d6b9d647f750.js +1 -0
  556. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-9247d6b9d647f750.js +1 -0
  557. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-9247d6b9d647f750.js +1 -0
  558. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-9247d6b9d647f750.js +1 -0
  559. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-9247d6b9d647f750.js +1 -0
  560. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-9247d6b9d647f750.js +1 -0
  561. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-9247d6b9d647f750.js +1 -0
  562. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-9247d6b9d647f750.js +1 -0
  563. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-9247d6b9d647f750.js +1 -0
  564. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-9247d6b9d647f750.js +1 -0
  565. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-9247d6b9d647f750.js +1 -0
  566. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-9247d6b9d647f750.js +1 -0
  567. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-9247d6b9d647f750.js +1 -0
  568. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-9247d6b9d647f750.js +1 -0
  569. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-9247d6b9d647f750.js +1 -0
  570. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-9247d6b9d647f750.js +1 -0
  571. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-9247d6b9d647f750.js +1 -0
  572. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-9247d6b9d647f750.js +1 -0
  573. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-9247d6b9d647f750.js +1 -0
  574. package/.next/static/chunks/app/api/worktrees/[id]/route-9247d6b9d647f750.js +1 -0
  575. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-9247d6b9d647f750.js +1 -0
  576. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-9247d6b9d647f750.js +1 -0
  577. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-9247d6b9d647f750.js +1 -0
  578. package/.next/static/chunks/app/api/worktrees/[id]/search/route-9247d6b9d647f750.js +1 -0
  579. package/.next/static/chunks/app/api/worktrees/[id]/send/route-9247d6b9d647f750.js +1 -0
  580. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-9247d6b9d647f750.js +1 -0
  581. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-9247d6b9d647f750.js +1 -0
  582. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-9247d6b9d647f750.js +1 -0
  583. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-9247d6b9d647f750.js +1 -0
  584. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-9247d6b9d647f750.js +1 -0
  585. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-9247d6b9d647f750.js +1 -0
  586. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-9247d6b9d647f750.js +1 -0
  587. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-9247d6b9d647f750.js +1 -0
  588. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-9247d6b9d647f750.js +1 -0
  589. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-9247d6b9d647f750.js +1 -0
  590. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-9247d6b9d647f750.js +1 -0
  591. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-9247d6b9d647f750.js +1 -0
  592. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-9247d6b9d647f750.js +1 -0
  593. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-9247d6b9d647f750.js +1 -0
  594. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-9247d6b9d647f750.js +1 -0
  595. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-9247d6b9d647f750.js +1 -0
  596. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-9247d6b9d647f750.js +1 -0
  597. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-9247d6b9d647f750.js +1 -0
  598. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-9247d6b9d647f750.js +1 -0
  599. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-9247d6b9d647f750.js +1 -0
  600. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-9247d6b9d647f750.js +1 -0
  601. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-9247d6b9d647f750.js +1 -0
  602. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-9247d6b9d647f750.js +1 -0
  603. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-9247d6b9d647f750.js +1 -0
  604. package/.next/static/chunks/app/api/worktrees/route-9247d6b9d647f750.js +1 -0
  605. package/.next/static/chunks/app/manifest.webmanifest/route-9247d6b9d647f750.js +1 -0
  606. package/.next/static/chunks/app/more/page-03867ab635d197c7.js +1 -0
  607. package/.next/static/chunks/app/proxy/[...path]/route-9247d6b9d647f750.js +1 -0
  608. package/.next/static/chunks/app/review/page-9a6d18ddcccbb63c.js +1 -0
  609. package/.next/static/chunks/app/worktrees/[id]/layout-9247d6b9d647f750.js +1 -0
  610. package/.next/static/chunks/app/worktrees/[id]/page-27b7cb2e77099eec.js +1 -0
  611. package/.next/static/chunks/app/worktrees/[id]/terminal/page-00ad5d9a62a71cab.js +1 -0
  612. package/.next/static/css/98722bc4152cedcc.css +1 -0
  613. package/.next/trace +13 -13
  614. package/.next/types/app/api/worktrees/[id]/instances/opencode/route.ts +347 -0
  615. package/.next/types/app/api/worktrees/[id]/opencode/diff/route.ts +347 -0
  616. package/.next/types/app/api/worktrees/[id]/opencode/session/route.ts +347 -0
  617. package/.next/types/app/api/worktrees/[id]/opencode/share/route.ts +347 -0
  618. package/.next/types/routes.d.ts +5 -1
  619. package/.next/types/validator.ts +36 -0
  620. package/README.md +9 -1
  621. package/dist/cli/commands/init.d.ts.map +1 -1
  622. package/dist/cli/commands/init.js +66 -0
  623. package/dist/cli/commands/instances.d.ts.map +1 -1
  624. package/dist/cli/commands/instances.js +46 -1
  625. package/dist/cli/commands/interrupt.d.ts +25 -0
  626. package/dist/cli/commands/interrupt.d.ts.map +1 -0
  627. package/dist/cli/commands/interrupt.js +146 -0
  628. package/dist/cli/commands/report.d.ts.map +1 -1
  629. package/dist/cli/commands/report.js +11 -4
  630. package/dist/cli/commands/respond.d.ts.map +1 -1
  631. package/dist/cli/commands/respond.js +146 -1
  632. package/dist/cli/commands/status.d.ts.map +1 -1
  633. package/dist/cli/commands/status.js +104 -0
  634. package/dist/cli/commands/wait.d.ts.map +1 -1
  635. package/dist/cli/commands/wait.js +39 -1
  636. package/dist/cli/config/agent-target-options.d.ts +12 -0
  637. package/dist/cli/config/agent-target-options.d.ts.map +1 -1
  638. package/dist/cli/config/agent-target-options.js +15 -1
  639. package/dist/cli/docs/agent-operations.d.ts +1 -1
  640. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  641. package/dist/cli/docs/agent-operations.js +34 -0
  642. package/dist/cli/program.d.ts.map +1 -1
  643. package/dist/cli/program.js +6 -0
  644. package/dist/cli/types/api-responses.d.ts +375 -0
  645. package/dist/cli/types/api-responses.d.ts.map +1 -1
  646. package/dist/cli/types/index.d.ts +63 -0
  647. package/dist/cli/types/index.d.ts.map +1 -1
  648. package/dist/cli/types/index.js +31 -1
  649. package/dist/cli/utils/daemon.d.ts.map +1 -1
  650. package/dist/cli/utils/daemon.js +3 -0
  651. package/dist/cli/utils/env-setup.d.ts +24 -0
  652. package/dist/cli/utils/env-setup.d.ts.map +1 -1
  653. package/dist/cli/utils/env-setup.js +70 -0
  654. package/dist/cli/utils/vapid-keygen.d.ts +74 -0
  655. package/dist/cli/utils/vapid-keygen.d.ts.map +1 -0
  656. package/dist/cli/utils/vapid-keygen.js +111 -0
  657. package/dist/lib/cli-tools/types.d.ts +11 -1
  658. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  659. package/dist/lib/detection/tools/verified-against.d.ts +14 -3
  660. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  661. package/dist/lib/detection/tools/verified-against.js +14 -3
  662. package/dist/lib/push/vapid.d.ts +178 -0
  663. package/dist/lib/push/vapid.d.ts.map +1 -0
  664. package/dist/lib/push/vapid.js +293 -0
  665. package/dist/lib/server/localhost-self-check.d.ts +203 -0
  666. package/dist/lib/server/localhost-self-check.d.ts.map +1 -0
  667. package/dist/lib/server/localhost-self-check.js +333 -0
  668. package/dist/server/locales/en/notifications.json +23 -1
  669. package/dist/server/locales/ja/notifications.json +23 -1
  670. package/dist/server/server.js +103 -0
  671. package/dist/server/src/config/image-extensions.js +244 -0
  672. package/dist/server/src/config/opencode-constants.js +69 -0
  673. package/dist/server/src/config/tmux-pane-config.js +100 -1
  674. package/dist/server/src/lib/cli-tools/base.js +33 -48
  675. package/dist/server/src/lib/cli-tools/opencode-config.js +12 -0
  676. package/dist/server/src/lib/cli-tools/opencode.js +435 -7
  677. package/dist/server/src/lib/cli-tools/start-availability.js +160 -0
  678. package/dist/server/src/lib/cmate-cli-tool-parser.js +328 -7
  679. package/dist/server/src/lib/cmate-parser.js +12 -0
  680. package/dist/server/src/lib/db/agent-instances-db.js +129 -0
  681. package/dist/server/src/lib/db/agent-session-cost-db.js +204 -0
  682. package/dist/server/src/lib/db/agent-session-cost-sampler.js +194 -0
  683. package/dist/server/src/lib/db/chat-db.js +33 -0
  684. package/dist/server/src/lib/db/db-instance.js +11 -0
  685. package/dist/server/src/lib/db/db.js +8 -3
  686. package/dist/server/src/lib/db/migrations/index.js +6 -0
  687. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  688. package/dist/server/src/lib/db/migrations/v57-push-subscription-defaults-notice.js +54 -0
  689. package/dist/server/src/lib/db/migrations/v58-agent-session-costs.js +100 -0
  690. package/dist/server/src/lib/db/migrations/v59-opencode-instance-settings.js +71 -0
  691. package/dist/server/src/lib/db/push-subscriptions-db.js +56 -5
  692. package/dist/server/src/lib/detection/cli-patterns.js +17 -6
  693. package/dist/server/src/lib/detection/excerpt.js +48 -0
  694. package/dist/server/src/lib/detection/model-info-extractor.js +26 -3
  695. package/dist/server/src/lib/detection/opencode-modal-overlay.js +400 -0
  696. package/dist/server/src/lib/detection/opencode-pane-obstruction.js +181 -0
  697. package/dist/server/src/lib/detection/status-detector.js +7 -0
  698. package/dist/server/src/lib/detection/status-reason.js +20 -0
  699. package/dist/server/src/lib/detection/terminal-columns.js +94 -0
  700. package/dist/server/src/lib/detection/tools/opencode/detect.js +43 -0
  701. package/dist/server/src/lib/detection/tools/opencode/prompt.js +20 -0
  702. package/dist/server/src/lib/detection/tools/verified-against.js +14 -3
  703. package/dist/server/src/lib/detection/upstream-faults.js +7 -22
  704. package/dist/server/src/lib/hooks/agent-session-telemetry.js +324 -0
  705. package/dist/server/src/lib/hooks/pending-decision-kind.js +72 -0
  706. package/dist/server/src/lib/hooks/sources/define-source.js +88 -0
  707. package/dist/server/src/lib/hooks/sources/opencode/client.js +907 -2
  708. package/dist/server/src/lib/hooks/sources/opencode/diff.js +336 -0
  709. package/dist/server/src/lib/hooks/sources/opencode/history.js +480 -0
  710. package/dist/server/src/lib/hooks/sources/opencode/ingest.js +76 -7
  711. package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +222 -0
  712. package/dist/server/src/lib/hooks/sources/opencode/mappers.js +31 -0
  713. package/dist/server/src/lib/hooks/sources/opencode/payloads.js +45 -0
  714. package/dist/server/src/lib/hooks/sources/opencode/ports.js +16 -0
  715. package/dist/server/src/lib/hooks/sources/opencode/push.js +307 -0
  716. package/dist/server/src/lib/hooks/sources/opencode/reattach.js +284 -0
  717. package/dist/server/src/lib/hooks/sources/opencode/runtime.js +165 -2
  718. package/dist/server/src/lib/hooks/sources/opencode/source.js +46 -2
  719. package/dist/server/src/lib/hooks/sources/opencode/subscription.js +407 -4
  720. package/dist/server/src/lib/hooks/sources/opencode/transcript.js +383 -0
  721. package/dist/server/src/lib/hooks/structured-decision-response.js +460 -0
  722. package/dist/server/src/lib/job-executor.js +43 -20
  723. package/dist/server/src/lib/polling/response-checker.js +43 -16
  724. package/dist/server/src/lib/polling/structured-history-gate.js +75 -0
  725. package/dist/server/src/lib/prompt-answer-sender.js +153 -2
  726. package/dist/server/src/lib/push/delivery-health.js +237 -0
  727. package/dist/server/src/lib/push/failure-push-notifier.js +109 -7
  728. package/dist/server/src/lib/push/index.js +25 -1
  729. package/dist/server/src/lib/push/prompt-card-state.js +254 -14
  730. package/dist/server/src/lib/push/push-sender.js +63 -12
  731. package/dist/server/src/lib/push/resolution-push-notifier.js +15 -3
  732. package/dist/server/src/lib/push/vapid.js +264 -5
  733. package/dist/server/src/lib/push/waiting-push-notifier.js +7 -0
  734. package/dist/server/src/lib/server/localhost-self-check.js +333 -0
  735. package/dist/server/src/lib/session/agent-event-state.js +169 -4
  736. package/dist/server/src/lib/session/claude-executor.js +152 -15
  737. package/dist/server/src/lib/session/current-output-builder.js +182 -15
  738. package/dist/server/src/lib/session/opencode-session-api.js +214 -0
  739. package/dist/server/src/lib/session/opencode-session-recall.js +168 -0
  740. package/dist/server/src/lib/session/opencode-session-store.js +274 -0
  741. package/dist/server/src/lib/session/provisional-turn.js +54 -1
  742. package/dist/server/src/lib/session/send-user-message.js +6 -5
  743. package/dist/server/src/lib/session/structured-prompt.js +53 -2
  744. package/dist/server/src/lib/skills/compatibility-matrix.js +50 -1
  745. package/dist/server/src/lib/tmux/tmux.js +74 -4
  746. package/dist/server/src/lib/verification/gate-runner.js +71 -8
  747. package/dist/server/src/types/agent-session.js +63 -0
  748. package/dist/server/src/types/agent-transcript.js +80 -0
  749. package/dist/server/src/types/opencode-export.js +228 -0
  750. package/dist/server/src/types/opencode-instance-settings.js +140 -0
  751. package/dist/server/src/types/opencode-share.js +111 -0
  752. package/dist/server/src/types/terminal-keys.js +69 -1
  753. package/dist/types/cli-tool-contracts.d.ts +48 -0
  754. package/dist/types/cli-tool-contracts.d.ts.map +1 -1
  755. package/dist/types/terminal-keys.d.ts +89 -0
  756. package/dist/types/terminal-keys.d.ts.map +1 -0
  757. package/dist/types/terminal-keys.js +105 -0
  758. package/package.json +1 -1
  759. package/.next/server/chunks/1029.js +0 -1
  760. package/.next/server/chunks/1239.js +0 -1
  761. package/.next/server/chunks/1538.js +0 -7
  762. package/.next/server/chunks/2546.js +0 -1
  763. package/.next/server/chunks/2689.js +0 -13
  764. package/.next/server/chunks/3292.js +0 -1
  765. package/.next/server/chunks/3417.js +0 -1
  766. package/.next/server/chunks/3736.js +0 -1
  767. package/.next/server/chunks/4423.js +0 -1
  768. package/.next/server/chunks/4444.js +0 -32
  769. package/.next/server/chunks/4565.js +0 -3
  770. package/.next/server/chunks/467.js +0 -1
  771. package/.next/server/chunks/4905.js +0 -5
  772. package/.next/server/chunks/552.js +0 -19
  773. package/.next/server/chunks/5998.js +0 -74
  774. package/.next/server/chunks/6919.js +0 -1
  775. package/.next/server/chunks/7970.js +0 -229
  776. package/.next/server/chunks/8536.js +0 -1
  777. package/.next/server/chunks/9284.js +0 -1
  778. package/.next/static/chunks/3361-5d6e93fba8a92bc1.js +0 -1
  779. package/.next/static/chunks/6381-8cfe50a5ca5425b1.js +0 -1
  780. package/.next/static/chunks/8521-c43994fb58501d13.js +0 -1
  781. package/.next/static/chunks/app/api/app/update/route-6add0d88e2828c23.js +0 -1
  782. package/.next/static/chunks/app/api/app/update-check/route-6add0d88e2828c23.js +0 -1
  783. package/.next/static/chunks/app/api/assistant/conversation/route-6add0d88e2828c23.js +0 -1
  784. package/.next/static/chunks/app/api/assistant/current-output/route-6add0d88e2828c23.js +0 -1
  785. package/.next/static/chunks/app/api/assistant/messages/route-6add0d88e2828c23.js +0 -1
  786. package/.next/static/chunks/app/api/assistant/session/route-6add0d88e2828c23.js +0 -1
  787. package/.next/static/chunks/app/api/assistant/start/route-6add0d88e2828c23.js +0 -1
  788. package/.next/static/chunks/app/api/assistant/terminal/route-6add0d88e2828c23.js +0 -1
  789. package/.next/static/chunks/app/api/assistant/tools/route-6add0d88e2828c23.js +0 -1
  790. package/.next/static/chunks/app/api/auth/login/route-6add0d88e2828c23.js +0 -1
  791. package/.next/static/chunks/app/api/auth/logout/route-6add0d88e2828c23.js +0 -1
  792. package/.next/static/chunks/app/api/auth/status/route-6add0d88e2828c23.js +0 -1
  793. package/.next/static/chunks/app/api/capabilities/route-6add0d88e2828c23.js +0 -1
  794. package/.next/static/chunks/app/api/daily-summary/route-6add0d88e2828c23.js +0 -1
  795. package/.next/static/chunks/app/api/daily-summary/status/route-6add0d88e2828c23.js +0 -1
  796. package/.next/static/chunks/app/api/external-apps/[id]/health/route-6add0d88e2828c23.js +0 -1
  797. package/.next/static/chunks/app/api/external-apps/[id]/route-6add0d88e2828c23.js +0 -1
  798. package/.next/static/chunks/app/api/external-apps/route-6add0d88e2828c23.js +0 -1
  799. package/.next/static/chunks/app/api/fs/browse/route-6add0d88e2828c23.js +0 -1
  800. package/.next/static/chunks/app/api/fs/recent-paths/route-6add0d88e2828c23.js +0 -1
  801. package/.next/static/chunks/app/api/hooks/agent-event/route-6add0d88e2828c23.js +0 -1
  802. package/.next/static/chunks/app/api/hooks/claude-done/route-6add0d88e2828c23.js +0 -1
  803. package/.next/static/chunks/app/api/hooks/permission-request/route-6add0d88e2828c23.js +0 -1
  804. package/.next/static/chunks/app/api/metrics/vibe/route-6add0d88e2828c23.js +0 -1
  805. package/.next/static/chunks/app/api/ollama/models/route-6add0d88e2828c23.js +0 -1
  806. package/.next/static/chunks/app/api/push/escalation/route-6add0d88e2828c23.js +0 -1
  807. package/.next/static/chunks/app/api/push/subscriptions/route-6add0d88e2828c23.js +0 -1
  808. package/.next/static/chunks/app/api/push/vapid/route-6add0d88e2828c23.js +0 -1
  809. package/.next/static/chunks/app/api/repositories/[id]/route-6add0d88e2828c23.js +0 -1
  810. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-6add0d88e2828c23.js +0 -1
  811. package/.next/static/chunks/app/api/repositories/[id]/todos/route-6add0d88e2828c23.js +0 -1
  812. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-6add0d88e2828c23.js +0 -1
  813. package/.next/static/chunks/app/api/repositories/clone/route-6add0d88e2828c23.js +0 -1
  814. package/.next/static/chunks/app/api/repositories/excluded/route-6add0d88e2828c23.js +0 -1
  815. package/.next/static/chunks/app/api/repositories/restore/route-6add0d88e2828c23.js +0 -1
  816. package/.next/static/chunks/app/api/repositories/route-6add0d88e2828c23.js +0 -1
  817. package/.next/static/chunks/app/api/repositories/scan/route-6add0d88e2828c23.js +0 -1
  818. package/.next/static/chunks/app/api/repositories/sync/route-6add0d88e2828c23.js +0 -1
  819. package/.next/static/chunks/app/api/repositories/validate-path/route-6add0d88e2828c23.js +0 -1
  820. package/.next/static/chunks/app/api/sidebar/group-order/route-6add0d88e2828c23.js +0 -1
  821. package/.next/static/chunks/app/api/skills/[id]/route-6add0d88e2828c23.js +0 -1
  822. package/.next/static/chunks/app/api/skills/installations/route-6add0d88e2828c23.js +0 -1
  823. package/.next/static/chunks/app/api/skills/operations/route-6add0d88e2828c23.js +0 -1
  824. package/.next/static/chunks/app/api/skills/reindex/route-6add0d88e2828c23.js +0 -1
  825. package/.next/static/chunks/app/api/skills/route-6add0d88e2828c23.js +0 -1
  826. package/.next/static/chunks/app/api/slash-commands/route-6add0d88e2828c23.js +0 -1
  827. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-6add0d88e2828c23.js +0 -1
  828. package/.next/static/chunks/app/api/tasks/[taskId]/route-6add0d88e2828c23.js +0 -1
  829. package/.next/static/chunks/app/api/templates/[id]/route-6add0d88e2828c23.js +0 -1
  830. package/.next/static/chunks/app/api/templates/route-6add0d88e2828c23.js +0 -1
  831. package/.next/static/chunks/app/api/todos/route-6add0d88e2828c23.js +0 -1
  832. package/.next/static/chunks/app/api/verification/runs/[runId]/route-6add0d88e2828c23.js +0 -1
  833. package/.next/static/chunks/app/api/verification/runs/route-6add0d88e2828c23.js +0 -1
  834. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-6add0d88e2828c23.js +0 -1
  835. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-6add0d88e2828c23.js +0 -1
  836. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-6add0d88e2828c23.js +0 -1
  837. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-6add0d88e2828c23.js +0 -1
  838. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-6add0d88e2828c23.js +0 -1
  839. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-6add0d88e2828c23.js +0 -1
  840. package/.next/static/chunks/app/api/worktrees/[id]/env/route-6add0d88e2828c23.js +0 -1
  841. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-6add0d88e2828c23.js +0 -1
  842. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-6add0d88e2828c23.js +0 -1
  843. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-6add0d88e2828c23.js +0 -1
  844. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-6add0d88e2828c23.js +0 -1
  845. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-6add0d88e2828c23.js +0 -1
  846. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-6add0d88e2828c23.js +0 -1
  847. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-6add0d88e2828c23.js +0 -1
  848. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-6add0d88e2828c23.js +0 -1
  849. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-6add0d88e2828c23.js +0 -1
  850. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-6add0d88e2828c23.js +0 -1
  851. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-6add0d88e2828c23.js +0 -1
  852. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-6add0d88e2828c23.js +0 -1
  853. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-6add0d88e2828c23.js +0 -1
  854. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-6add0d88e2828c23.js +0 -1
  855. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-6add0d88e2828c23.js +0 -1
  856. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-6add0d88e2828c23.js +0 -1
  857. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-6add0d88e2828c23.js +0 -1
  858. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-6add0d88e2828c23.js +0 -1
  859. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-6add0d88e2828c23.js +0 -1
  860. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-6add0d88e2828c23.js +0 -1
  861. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-6add0d88e2828c23.js +0 -1
  862. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-6add0d88e2828c23.js +0 -1
  863. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-6add0d88e2828c23.js +0 -1
  864. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-6add0d88e2828c23.js +0 -1
  865. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-6add0d88e2828c23.js +0 -1
  866. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-6add0d88e2828c23.js +0 -1
  867. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-6add0d88e2828c23.js +0 -1
  868. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-6add0d88e2828c23.js +0 -1
  869. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-6add0d88e2828c23.js +0 -1
  870. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-6add0d88e2828c23.js +0 -1
  871. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-6add0d88e2828c23.js +0 -1
  872. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-6add0d88e2828c23.js +0 -1
  873. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-6add0d88e2828c23.js +0 -1
  874. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-6add0d88e2828c23.js +0 -1
  875. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-6add0d88e2828c23.js +0 -1
  876. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-6add0d88e2828c23.js +0 -1
  877. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-6add0d88e2828c23.js +0 -1
  878. package/.next/static/chunks/app/api/worktrees/[id]/route-6add0d88e2828c23.js +0 -1
  879. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-6add0d88e2828c23.js +0 -1
  880. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-6add0d88e2828c23.js +0 -1
  881. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-6add0d88e2828c23.js +0 -1
  882. package/.next/static/chunks/app/api/worktrees/[id]/search/route-6add0d88e2828c23.js +0 -1
  883. package/.next/static/chunks/app/api/worktrees/[id]/send/route-6add0d88e2828c23.js +0 -1
  884. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-6add0d88e2828c23.js +0 -1
  885. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-6add0d88e2828c23.js +0 -1
  886. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-6add0d88e2828c23.js +0 -1
  887. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-6add0d88e2828c23.js +0 -1
  888. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-6add0d88e2828c23.js +0 -1
  889. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-6add0d88e2828c23.js +0 -1
  890. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-6add0d88e2828c23.js +0 -1
  891. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-6add0d88e2828c23.js +0 -1
  892. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-6add0d88e2828c23.js +0 -1
  893. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-6add0d88e2828c23.js +0 -1
  894. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-6add0d88e2828c23.js +0 -1
  895. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-6add0d88e2828c23.js +0 -1
  896. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-6add0d88e2828c23.js +0 -1
  897. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-6add0d88e2828c23.js +0 -1
  898. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-6add0d88e2828c23.js +0 -1
  899. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-6add0d88e2828c23.js +0 -1
  900. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-6add0d88e2828c23.js +0 -1
  901. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-6add0d88e2828c23.js +0 -1
  902. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-6add0d88e2828c23.js +0 -1
  903. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-6add0d88e2828c23.js +0 -1
  904. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-6add0d88e2828c23.js +0 -1
  905. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-6add0d88e2828c23.js +0 -1
  906. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-6add0d88e2828c23.js +0 -1
  907. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-6add0d88e2828c23.js +0 -1
  908. package/.next/static/chunks/app/api/worktrees/route-6add0d88e2828c23.js +0 -1
  909. package/.next/static/chunks/app/manifest.webmanifest/route-6add0d88e2828c23.js +0 -1
  910. package/.next/static/chunks/app/more/page-3266dfa945972649.js +0 -1
  911. package/.next/static/chunks/app/proxy/[...path]/route-6add0d88e2828c23.js +0 -1
  912. package/.next/static/chunks/app/review/page-8f63aff862fee421.js +0 -1
  913. package/.next/static/chunks/app/worktrees/[id]/layout-6add0d88e2828c23.js +0 -1
  914. package/.next/static/chunks/app/worktrees/[id]/page-f7b3dfbe757dc6b8.js +0 -1
  915. package/.next/static/chunks/app/worktrees/[id]/terminal/page-a75fe180a7233b2b.js +0 -1
  916. package/.next/static/css/928e5a8830fbf997.css +0 -1
  917. /package/.next/static/{9IXgWfBUtnEnRqnbmErTp → 0GHE2JGlFzqvSBZAcBFSt}/_buildManifest.js +0 -0
  918. /package/.next/static/{9IXgWfBUtnEnRqnbmErTp → 0GHE2JGlFzqvSBZAcBFSt}/_ssgManifest.js +0 -0
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ /**
3
+ * The opencode settings one instance is launched and prompted with (#2048).
4
+ *
5
+ * Issue #2048 adds three per-instance settings — persona, model and variant.
6
+ * The database holds them (`opencode_instance_settings`, migration v59) because
7
+ * they belong to a worktree and have to follow its renames and its deletion.
8
+ * This module is the **launcher's copy** of the same values, and it exists for
9
+ * the reason `../../../session/opencode-session-store` spells out for the resume
10
+ * flag, applied to a second value:
11
+ *
12
+ * 1. **The reader is the launcher.** `prepareOpencodeLaunch` builds a command
13
+ * line synchronously, from an `AgentLaunchContext` that five other tools
14
+ * share and that has nowhere to hand settings through; and
15
+ * `src/lib/cli-tools/opencode.ts` is deliberately outside `better-sqlite3`'s
16
+ * import graph. Reading the row here would either pull that graph into the
17
+ * launcher or make the launch path `await` a dynamic import — measured, that
18
+ * second option is not free: the three launch tests in
19
+ * `tests/unit/cli-tools/opencode.test.ts` drive `startSession` under fake
20
+ * timers, and a dynamic import does not resolve on the timer queue, so the
21
+ * command line was never composed at all.
22
+ * 2. **It is read on the send path too**, once per prompt, where an extra
23
+ * database round trip would sit in front of the operator's message.
24
+ *
25
+ * So: same shape as `./ports`, same `~/.commandmate` directory, same "never
26
+ * throws, a bad file means none" contract. `GET`/`PUT
27
+ * /api/worktrees/:id/instances/opencode` writes both — the row and this mirror —
28
+ * and the `GET` reconciles the mirror from the row, so opening the settings pane
29
+ * repairs a mirror that a worktree rename or a restored database left stale.
30
+ * The database is the source of truth; this is a cache with a file behind it.
31
+ *
32
+ * ## What the settings may and may not do
33
+ *
34
+ * Measured on opencode 1.18.22 (`docs/design/opencode-server-live-verification.md`
35
+ * §20): the TUI takes `--agent` and `-m provider/model` and has **no
36
+ * `--variant`** — passing one makes opencode print its usage and exit, so the
37
+ * pane would come up empty. {@link opencodeLaunchArguments} therefore never
38
+ * emits a variant, and the variant travels on the prompt instead
39
+ * ({@link opencodePromptSelection}), which is the one channel measured to apply
40
+ * it.
41
+ *
42
+ * @module lib/hooks/sources/opencode/launch-settings
43
+ */
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.getOpencodeLaunchSettingsFilePath = getOpencodeLaunchSettingsFilePath;
46
+ exports.readPersistedOpencodeLaunchSettings = readPersistedOpencodeLaunchSettings;
47
+ exports.getOpencodeLaunchSettings = getOpencodeLaunchSettings;
48
+ exports.rememberOpencodeLaunchSettings = rememberOpencodeLaunchSettings;
49
+ exports.forgetOpencodeLaunchSettings = forgetOpencodeLaunchSettings;
50
+ exports.resetOpencodeLaunchSettings = resetOpencodeLaunchSettings;
51
+ exports.opencodeLaunchArguments = opencodeLaunchArguments;
52
+ exports.opencodePromptSelection = opencodePromptSelection;
53
+ const fs_1 = require("fs");
54
+ const os_1 = require("os");
55
+ const path_1 = require("path");
56
+ const safe_directory_1 = require("../../../../config/safe-directory");
57
+ const auto_yes_state_1 = require("../../../../lib/auto-yes-state");
58
+ const logger_1 = require("../../../../lib/logger");
59
+ const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
60
+ const opencode_instance_settings_1 = require("../../../../types/opencode-instance-settings");
61
+ const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/launch-settings');
62
+ const cache = (globalThis.__opencodeLaunchSettings ??= new Map());
63
+ function keyOf(target) {
64
+ return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
65
+ }
66
+ /**
67
+ * Where the mirror lives. `CM_OPENCODE_LAUNCH_SETTINGS_FILE` overrides.
68
+ *
69
+ * Guarded exactly as `getOpencodePortFilePath` is (Issue #1774): the write below
70
+ * creates this file's directory with a recursive mkdir, and for a path inside
71
+ * `/proc`, `/sys` or `/dev` that call does not throw — it spins the event loop
72
+ * forever, so the `try/catch` around it never runs. `resolveSafeDirectory`
73
+ * refuses such an override and hands back the default.
74
+ */
75
+ function getOpencodeLaunchSettingsFilePath() {
76
+ const fallback = (0, path_1.join)((0, os_1.homedir)(), '.commandmate', 'opencode-launch-settings.json');
77
+ return (0, safe_directory_1.resolveSafeDirectory)(process.env.CM_OPENCODE_LAUNCH_SETTINGS_FILE, fallback, 'CM_OPENCODE_LAUNCH_SETTINGS_FILE');
78
+ }
79
+ /** Read the mirror. Never throws — a bad file means "nothing is configured". */
80
+ function readPersistedOpencodeLaunchSettings() {
81
+ try {
82
+ const parsed = JSON.parse((0, fs_1.readFileSync)(getOpencodeLaunchSettingsFilePath(), 'utf8'));
83
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
84
+ return {};
85
+ const result = {};
86
+ for (const [key, value] of Object.entries(parsed)) {
87
+ // Re-validated on the way out as well as in: this file is writable by
88
+ // anything running as the user, and `agent` / `model` end up on a shell
89
+ // command line.
90
+ const settings = (0, opencode_instance_settings_1.normalizeOpencodeInstanceSettings)(value);
91
+ if ((0, opencode_instance_settings_1.hasOpencodeInstanceSettings)(settings))
92
+ result[key] = settings;
93
+ }
94
+ return result;
95
+ }
96
+ catch {
97
+ // Absent on a first run, unreadable if somebody edited it. Both mean the
98
+ // same thing to a caller: nothing is configured.
99
+ return {};
100
+ }
101
+ }
102
+ /** Write the mirror back. Never throws — losing it costs one launch's flags. */
103
+ function writePersistedOpencodeLaunchSettings(all) {
104
+ const path = getOpencodeLaunchSettingsFilePath();
105
+ try {
106
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(path), { recursive: true });
107
+ (0, fs_1.writeFileSync)(path, `${JSON.stringify(all, null, 2)}\n`, { mode: 0o600 });
108
+ }
109
+ catch (error) {
110
+ logger.warn('opencode-launch-settings-write-failed', {
111
+ path,
112
+ error: error instanceof Error ? error.message : String(error),
113
+ });
114
+ }
115
+ }
116
+ /**
117
+ * The settings this instance should launch with.
118
+ *
119
+ * **Synchronous, and that is the requirement** — {@link prepareOpencodeLaunch}
120
+ * calls it while composing a command line. Memory first, then the file, then
121
+ * all-unset, which is the state every instance is in until somebody opens the
122
+ * settings pane.
123
+ */
124
+ function getOpencodeLaunchSettings(target) {
125
+ const key = keyOf(target);
126
+ const live = cache.get(key);
127
+ if (live)
128
+ return live;
129
+ const persisted = readPersistedOpencodeLaunchSettings()[key];
130
+ if (!persisted)
131
+ return { ...opencode_instance_settings_1.EMPTY_OPENCODE_INSTANCE_SETTINGS };
132
+ cache.set(key, persisted);
133
+ return persisted;
134
+ }
135
+ /**
136
+ * Record what this instance should launch with, in memory and on disk.
137
+ *
138
+ * An all-unset write **removes** the entry rather than storing four nulls: the
139
+ * two are indistinguishable to every reader, and the removal keeps the file to
140
+ * the instances somebody actually configured.
141
+ *
142
+ * @returns The normalised settings that were stored
143
+ */
144
+ function rememberOpencodeLaunchSettings(target, settings) {
145
+ const key = keyOf(target);
146
+ const normalized = (0, opencode_instance_settings_1.normalizeOpencodeInstanceSettings)(settings ?? {});
147
+ const all = readPersistedOpencodeLaunchSettings();
148
+ if (!(0, opencode_instance_settings_1.hasOpencodeInstanceSettings)(normalized)) {
149
+ cache.delete(key);
150
+ if (key in all) {
151
+ delete all[key];
152
+ writePersistedOpencodeLaunchSettings(all);
153
+ }
154
+ return normalized;
155
+ }
156
+ cache.set(key, normalized);
157
+ all[key] = normalized;
158
+ writePersistedOpencodeLaunchSettings(all);
159
+ return normalized;
160
+ }
161
+ /** Drop one instance's settings from memory and disk. */
162
+ function forgetOpencodeLaunchSettings(target) {
163
+ rememberOpencodeLaunchSettings(target, opencode_instance_settings_1.EMPTY_OPENCODE_INSTANCE_SETTINGS);
164
+ }
165
+ /** Drop every in-memory entry. Test seam; production only ever writes or forgets one. */
166
+ function resetOpencodeLaunchSettings() {
167
+ cache.clear();
168
+ }
169
+ /**
170
+ * The flags these settings add to an opencode launch line, or `''`.
171
+ *
172
+ * **`--variant` is deliberately absent and must stay absent.** The TUI does not
173
+ * declare it (`opencode --help`, 1.18.22): yargs answers an unknown option by
174
+ * printing the usage banner and exiting, so a launch line carrying it starts no
175
+ * agent at all — measured twice, once inside tmux and once directly (§20.3).
176
+ * `opencode run --variant` does exist, which is exactly the trap: the flag is
177
+ * real, on a different subcommand.
178
+ *
179
+ * Both values are shell-quoted even though {@link normalizeOpencodeInstanceSettings}
180
+ * has already refused everything with a metacharacter in it. The quoting is the
181
+ * second of two independent guards, and it is the cheaper one to keep.
182
+ *
183
+ * @param settings - The instance's settings; all-unset yields `''`
184
+ * @returns A string starting with a space, or `''` when nothing is configured
185
+ */
186
+ function opencodeLaunchArguments(settings) {
187
+ const normalized = (0, opencode_instance_settings_1.normalizeOpencodeInstanceSettings)(settings ?? {});
188
+ const parts = [];
189
+ if (normalized.agent)
190
+ parts.push(`--agent ${(0, hook_settings_generator_1.shellQuote)(normalized.agent)}`);
191
+ const model = (0, opencode_instance_settings_1.opencodeModelReference)(normalized);
192
+ if (model)
193
+ parts.push(`--model ${(0, hook_settings_generator_1.shellQuote)(model)}`);
194
+ return parts.length > 0 ? ` ${parts.join(' ')}` : '';
195
+ }
196
+ /**
197
+ * The `prompt_async` keys these settings contribute, or null.
198
+ *
199
+ * Null — send nothing extra — when nothing is configured, so an unconfigured
200
+ * instance's request body is byte-identical to the pre-#2048 one. That matters
201
+ * more than it looks: a body with **no** `agent` runs the turn as `build` even
202
+ * on a pane launched `--agent plan` (§20.5), so the choice between "omit" and
203
+ * "send" is a behavioural one and the omission is only correct while the
204
+ * operator has expressed no preference.
205
+ *
206
+ * The model is sent alongside the variant rather than left to the launch flag
207
+ * because the two have to agree: a variant names an entry in one model's own
208
+ * `variants` map, and sending `high` against whichever model the pane happens to
209
+ * be on would be asserting something about a model the operator did not choose.
210
+ */
211
+ function opencodePromptSelection(settings) {
212
+ const normalized = (0, opencode_instance_settings_1.normalizeOpencodeInstanceSettings)(settings ?? {});
213
+ const selection = {};
214
+ if (normalized.agent)
215
+ selection.agent = normalized.agent;
216
+ if (normalized.providerId && normalized.modelId) {
217
+ selection.model = { providerID: normalized.providerId, modelID: normalized.modelId };
218
+ }
219
+ if (normalized.variant)
220
+ selection.variant = normalized.variant;
221
+ return Object.keys(selection).length > 0 ? selection : null;
222
+ }
@@ -37,6 +37,7 @@ exports.OPENCODE_MAPPERS = exports.OPENCODE_ERROR_DETAIL = exports.OPENCODE_PERM
37
37
  exports.frameProperties = frameProperties;
38
38
  exports.frameSessionId = frameSessionId;
39
39
  exports.frameModel = frameModel;
40
+ exports.frameVariant = frameVariant;
40
41
  exports.partToolName = partToolName;
41
42
  exports.partCallId = partCallId;
42
43
  exports.repliedPermissionId = repliedPermissionId;
@@ -105,6 +106,36 @@ function frameModel(payload) {
105
106
  return null;
106
107
  return (0, event_mapper_1.readNestedString)(info, ['model', 'modelID']) ?? (0, event_mapper_1.readNestedString)(info, ['model', 'id']);
107
108
  }
109
+ /**
110
+ * The model **variant** this frame reports, or null (Issue #2048).
111
+ *
112
+ * Two spellings, for the same reason {@link frameModel} has two: the value sits
113
+ * in a different place on the two frames that carry it, and both were measured
114
+ * on 1.18.22 in an isolated `HOME`
115
+ * (`docs/design/opencode-server-live-verification.md` §20.4).
116
+ *
117
+ * - `session.updated` -> `properties.info.model.variant`, because
118
+ * `Session.model` is a `ModelRef` (`{ id, providerID, variant? }`);
119
+ * - `message.updated` -> `properties.info.variant`, because `AssistantMessage`
120
+ * declares it as a flat field of its own.
121
+ *
122
+ * **Absent is the ordinary answer, not an error.** The `variant` key is missing
123
+ * altogether from both frames when the session is on a model's default, and from
124
+ * the assistant message a turn opens with. `agent-event-state` latches this
125
+ * rather than assigning it, which is what makes a frame without one mean
126
+ * "unchanged" instead of "cleared".
127
+ *
128
+ * opencode calls it a variant; CommandMate publishes it as the reasoning
129
+ * *effort*, which is what it is — the catalogue entry for `high` is literally
130
+ * `{ effort: "high" }` (§20.1) — and is the field every other tool's level is
131
+ * already shown in.
132
+ */
133
+ function frameVariant(payload) {
134
+ const info = frameProperties(payload).info;
135
+ if (!(0, event_mapper_1.isPlainObject)(info))
136
+ return null;
137
+ return (0, event_mapper_1.readNestedString)(info, ['model', 'variant']) ?? (0, event_mapper_1.readNestedString)(info, ['variant']);
138
+ }
108
139
  /** `properties.part.state.status` — `pending` / `running` / `completed` / `error`. */
109
140
  function partStatus(payload) {
110
141
  return (0, event_mapper_1.readNestedString)(frameProperties(payload), ['part', 'state', 'status']);
@@ -37,6 +37,7 @@ exports.resetOpencodeToolCalls = resetOpencodeToolCalls;
37
37
  exports.parseOpencodePermissionRequest = parseOpencodePermissionRequest;
38
38
  exports.parseOpencodeQuestion = parseOpencodeQuestion;
39
39
  exports.toOpencodePendingPermission = toOpencodePendingPermission;
40
+ exports.readOpencodePermissionSubject = readOpencodePermissionSubject;
40
41
  exports.toOpencodePendingQuestion = toOpencodePendingQuestion;
41
42
  const ask_user_question_payload_1 = require("../../../../lib/hooks/ask-user-question-payload");
42
43
  const event_mapper_1 = require("../event-mapper");
@@ -171,6 +172,50 @@ function toOpencodePendingPermission(payload, askedAt) {
171
172
  askedAt,
172
173
  };
173
174
  }
175
+ /**
176
+ * What an approval is ABOUT, for the surfaces that have to show it
177
+ * (Issue #2031).
178
+ *
179
+ * Read back off {@link toOpencodePendingPermission} rather than re-parsed from
180
+ * the frame, and that is the point rather than an economy: the pending decision
181
+ * is what the adjudicator judges and what `Allow always` is delivered against,
182
+ * so a panel describing a *differently* parsed view of the same frame could
183
+ * tell the user one thing while the verdict did another. One parse, two
184
+ * readers.
185
+ *
186
+ * The tool name is the `message.part.updated` correlation
187
+ * ({@link lookupOpencodeToolName}) with the approval kind behind it, because
188
+ * `permission.asked` carries no tool name of its own (#1758 §5.4).
189
+ *
190
+ * `patterns` comes back as `toolInput.patterns`, which is NOT always the
191
+ * frame's top-level `properties.patterns`: `parseOpencodePermissionRequest`
192
+ * spreads `metadata` last, so an approval whose metadata carries its own
193
+ * `patterns` shadows the outer list. That is the behaviour to keep, not a wart
194
+ * to route around — the shadowed list is what the adjudicator judged and what
195
+ * `Allow always` is delivered against, and a panel showing the other one would
196
+ * describe a verdict nobody is about to take. Pinned in
197
+ * `opencode-permission-subject-2031`.
198
+ *
199
+ * `patterns` is left unbounded here on purpose. It is bounded where it is
200
+ * *retained* — `boundDecisionPatterns` in `lib/session/provisional-turn`,
201
+ * beside the bounds on `message` and `toolName` — so there is one place the
202
+ * footprint of a stored decision is decided, and a second bound here would be a
203
+ * second number to keep in step with it.
204
+ *
205
+ * @param payload - A `permission.asked` frame or a `GET /permission` entry
206
+ * @param askedAt - Epoch ms
207
+ * @returns The subject, or null when this is not an approval this server reads
208
+ */
209
+ function readOpencodePermissionSubject(payload, askedAt) {
210
+ const pending = toOpencodePendingPermission(payload, askedAt);
211
+ if (!pending || pending.subject.kind !== 'permission')
212
+ return null;
213
+ const patterns = pending.subject.toolInput.patterns;
214
+ return {
215
+ toolName: pending.subject.toolName,
216
+ patterns: Array.isArray(patterns) ? patterns : [],
217
+ };
218
+ }
174
219
  /** Turn a question into a {@link PendingDecision}. */
175
220
  function toOpencodePendingQuestion(payload, askedAt) {
176
221
  const properties = unwrap(payload);
@@ -47,6 +47,7 @@ exports.OPENCODE_PORT_PROBE_HOSTS = exports.OPENCODE_PORT_RANGE = void 0;
47
47
  exports.getOpencodePortFilePath = getOpencodePortFilePath;
48
48
  exports.readPersistedOpencodePorts = readPersistedOpencodePorts;
49
49
  exports.getAssignedOpencodePort = getAssignedOpencodePort;
50
+ exports.getAssignedOpencodeWorktreePath = getAssignedOpencodeWorktreePath;
50
51
  exports.rememberOpencodePort = rememberOpencodePort;
51
52
  exports.forgetOpencodePort = forgetOpencodePort;
52
53
  exports.isPortFree = isPortFree;
@@ -138,6 +139,21 @@ function writePersistedOpencodePorts(all) {
138
139
  function getAssignedOpencodePort(target) {
139
140
  return assignments.get(keyOf(target))?.port ?? null;
140
141
  }
142
+ /**
143
+ * The worktree an assignment was made for, in this process. Null when there is
144
+ * none (Issue #2038).
145
+ *
146
+ * Exists because `killSession` is handed `(worktreeId, instanceId)` and no
147
+ * path, and Issue #2038 has to answer "is the session opencode is about to
148
+ * forget rooted in THIS worktree?" at exactly that moment. The assignment is
149
+ * already the record of "this instance is running there" — `recoverOpencodePort`
150
+ * trusts the same field — so reading it is cheaper and more honest than
151
+ * re-deriving the path from the database inside a launcher that is deliberately
152
+ * kept out of the database's import graph.
153
+ */
154
+ function getAssignedOpencodeWorktreePath(target) {
155
+ return assignments.get(keyOf(target))?.worktreePath ?? null;
156
+ }
141
157
  /** Record an assignment in memory and on disk. */
142
158
  function rememberOpencodePort(target, port, worktreePath, at = Date.now()) {
143
159
  const key = keyOf(target);
@@ -0,0 +1,307 @@
1
+ "use strict";
2
+ /**
3
+ * The phone notifications opencode's own stream raises (Issue #2045).
4
+ *
5
+ * ## Why opencode gets a producer of its own
6
+ *
7
+ * Every other tool's prompt notification is raised from the *waiting edge*
8
+ * (`push/waiting-push-notifier`), and that edge is only ever observed by a
9
+ * status probe — `worktree-status-helper` on a list/detail API read, or
10
+ * `response-checker` while the poller happens to be running. So for the five
11
+ * scraped tools a wait notifies when somebody is looking, and the phone is the
12
+ * consolation prize for when nobody is.
13
+ *
14
+ * opencode is the one tool where that trade is unaffordable. Measured on
15
+ * 1.18.22 (`docs/design/opencode-server-live-verification.md` §17): after
16
+ * `question.asked` the session stays `busy` and **no `session.idle` ever
17
+ * arrives** — `GET /session/status` still read `{"…":{"type":"busy"}}` twenty
18
+ * seconds later, with nothing else on the stream. Nothing in this repository
19
+ * answers an opencode question either (`grep` for a question-reply producer
20
+ * finds only the manual `respond` path), so Auto-Yes cannot end the wait and
21
+ * the turn is stopped until a human acts. A notification that waits for a page
22
+ * view is exactly the wrong shape for that.
23
+ *
24
+ * ## Closed to opencode, on purpose
25
+ *
26
+ * The Issue's constraint, and it is the reason this is a module in
27
+ * `sources/opencode/` rather than a hook on `notification` / `error` in the
28
+ * shared receiver: the other five tools reach `recordAgentEvent` through
29
+ * `POST /api/hooks/agent-event`, which does not import this file, so their push
30
+ * counts cannot move. `tests/unit/hooks/sources/opencode-push-2045.test.ts`
31
+ * pins that as a test rather than as a comment.
32
+ *
33
+ * ## One notification per wait, across both producers
34
+ *
35
+ * The question push carries `waitingSince: <the frame's receivedAt>`, which
36
+ * routes it through `shouldSendWaitingPush` — the episode-scoped guard #1790
37
+ * built — keyed `${worktreeId}::${instanceId}`. That is the *same* key and the
38
+ * *same* value the waiting edge will later use, because
39
+ * `worktree-status-helper` opens the episode with
40
+ * `structuredSince = peekPromptWaiting().structured?.at`, and that `at` is the
41
+ * `receivedAt` this module is handed. So the status probe's own notification is
42
+ * suppressed as a repeat of this one, and the reader gets one card per wait
43
+ * however many producers saw it. Passing no `waitingSince` would have fallen
44
+ * back to the 30 s content hash, whose key is a different map — two cards.
45
+ *
46
+ * ## Nothing here throws
47
+ *
48
+ * The same contract `./ingest` declares, for the same reason: a notification is
49
+ * advisory and must never cost the event that raised it.
50
+ *
51
+ * @module lib/hooks/sources/opencode/push
52
+ */
53
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
54
+ if (k2 === undefined) k2 = k;
55
+ var desc = Object.getOwnPropertyDescriptor(m, k);
56
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
57
+ desc = { enumerable: true, get: function() { return m[k]; } };
58
+ }
59
+ Object.defineProperty(o, k2, desc);
60
+ }) : (function(o, m, k, k2) {
61
+ if (k2 === undefined) k2 = k;
62
+ o[k2] = m[k];
63
+ }));
64
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
65
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
66
+ }) : function(o, v) {
67
+ o["default"] = v;
68
+ });
69
+ var __importStar = (this && this.__importStar) || (function () {
70
+ var ownKeys = function(o) {
71
+ ownKeys = Object.getOwnPropertyNames || function (o) {
72
+ var ar = [];
73
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
74
+ return ar;
75
+ };
76
+ return ownKeys(o);
77
+ };
78
+ return function (mod) {
79
+ if (mod && mod.__esModule) return mod;
80
+ var result = {};
81
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
82
+ __setModuleDefault(result, mod);
83
+ return result;
84
+ };
85
+ })();
86
+ Object.defineProperty(exports, "__esModule", { value: true });
87
+ exports.OPENCODE_INTERRUPT_ERROR_NAME = exports.OPENCODE_PUSH_EXCERPT_LENGTH = void 0;
88
+ exports.notifyOpencodeQuestionPush = notifyOpencodeQuestionPush;
89
+ exports.notifyOpencodeSessionErrorPush = notifyOpencodeSessionErrorPush;
90
+ exports.notifyOpencodeUpdateAvailablePush = notifyOpencodeUpdateAvailablePush;
91
+ const logger_1 = require("../../../../lib/logger");
92
+ const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/push');
93
+ /**
94
+ * How much of the question / error text the notification body carries.
95
+ *
96
+ * 80, from the Issue, and narrower than `push-sender`'s own 120 default: this
97
+ * is applied at the producer so the truncation is the one the Issue specifies
98
+ * rather than whatever the fan-out happens to default to. The re-truncation
99
+ * inside `buildPushPayload` is then a no-op.
100
+ */
101
+ exports.OPENCODE_PUSH_EXCERPT_LENGTH = 80;
102
+ /**
103
+ * The one `session.error` name that is not a failure (measured, §17).
104
+ *
105
+ * `MessageAbortedError` is what a `POST /session/:id/abort` produces — the user
106
+ * pressed Escape, or CommandMate itself aborted the turn. Pushing "the agent
107
+ * stopped with an error" for a stop the reader just asked for would report
108
+ * their own action back to them as a fault. §5.3.2 of the design note already
109
+ * establishes the same reading for `wait`.
110
+ *
111
+ * The other seven names in opencode 1.18.22's `session.error` union
112
+ * (`APIError`, `ProviderAuthError`, `UnknownError`, `MessageOutputLengthError`,
113
+ * `StructuredOutputError`, `ContextOverflowError`, `ContentFilterError`) all
114
+ * describe a turn that ended badly, so the default is to notify: a name nobody
115
+ * enumerated here fails towards telling the human rather than towards silence.
116
+ */
117
+ exports.OPENCODE_INTERRUPT_ERROR_NAME = 'MessageAbortedError';
118
+ /**
119
+ * The worktree's display name, for the notification title.
120
+ *
121
+ * Dynamic import for the reason `./ingest` documents at length: `../registry`
122
+ * statically imports `./source`, so anything this module's graph reaches
123
+ * eagerly would put `better-sqlite3` (and, through `@/lib/push`, `web-push`)
124
+ * into every import of `@/lib/hooks/sources`.
125
+ *
126
+ * Falls back to the id rather than dropping the notification — the same call
127
+ * `push/waiting-push-notifier` makes, and for the same reason: a database that
128
+ * cannot answer is a reason to send a less readable title, not a reason to
129
+ * leave the human waiting in silence.
130
+ */
131
+ async function resolveWorktreeName(worktreeId) {
132
+ try {
133
+ const [{ getDbInstance }, { getWorktreeById }] = await Promise.all([
134
+ Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
135
+ Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
136
+ ]);
137
+ return getWorktreeById(getDbInstance(), worktreeId)?.name ?? worktreeId;
138
+ }
139
+ catch {
140
+ return worktreeId;
141
+ }
142
+ }
143
+ /**
144
+ * `@/lib/push/push-sender`, reached by module path rather than through the
145
+ * `@/lib/push` barrel.
146
+ *
147
+ * The barrel's own comments give the reason: a suite that stubs `@/lib/push`
148
+ * wholesale would leave the very path it is guarding undefined. Both existing
149
+ * producers (`waiting-push-notifier`, `failure-push-notifier`) import the
150
+ * concrete module for that reason, and this one follows.
151
+ */
152
+ async function loadPushSender() {
153
+ return Promise.resolve().then(() => __importStar(require('../../../../lib/push/push-sender')));
154
+ }
155
+ async function subjectOf(target, instanceId) {
156
+ return {
157
+ worktreeId: target.worktreeId,
158
+ worktreeName: await resolveWorktreeName(target.worktreeId),
159
+ instanceId,
160
+ };
161
+ }
162
+ /**
163
+ * Tell the human's phone that opencode is asking them a question.
164
+ *
165
+ * `kind: 'prompt'` — this is the acting bucket, and it is the truthful one: the
166
+ * turn does not continue until the question is answered.
167
+ *
168
+ * `waitingKind: 'prompt'` rather than `'menu'`, deliberately. The kind decides
169
+ * whether the body says "waiting for your reply" or "needs attention in the
170
+ * terminal", and an opencode question is answerable *from the app*: it arrives
171
+ * as structured choices (`recordAskUserQuestion` in `./ingest`), so the picker
172
+ * and `commandmate respond <n>` can both close it without a terminal.
173
+ *
174
+ * @param question - The question text, or null when the frame carried none
175
+ * @param askedAt - The frame's `receivedAt`; the wait's identity (see module doc)
176
+ */
177
+ async function notifyOpencodeQuestionPush(target, instanceId, question, askedAt) {
178
+ try {
179
+ const { notifyPushSubscribers, buildExcerpt } = await loadPushSender();
180
+ const subject = await subjectOf(target, instanceId);
181
+ await notifyPushSubscribers({
182
+ ...subject,
183
+ kind: 'prompt',
184
+ // Both halves of "worktree / instance" the Issue asks for: the title is
185
+ // `${worktreeName} (${agentName})`, so naming the instance here is what
186
+ // tells two panes of the same worktree apart.
187
+ agentName: instanceId,
188
+ waitingKind: 'prompt',
189
+ waitingSince: askedAt,
190
+ excerpt: buildExcerpt(question ?? undefined, exports.OPENCODE_PUSH_EXCERPT_LENGTH),
191
+ },
192
+ // The frame's clock, not a fresh reading: `askedAt` is when the human
193
+ // became blocked, and it is what the card's timestamp should say.
194
+ askedAt);
195
+ logger.info('opencode-question-push-sent', {
196
+ worktreeId: target.worktreeId,
197
+ instanceId,
198
+ hasQuestion: question !== null,
199
+ });
200
+ }
201
+ catch (error) {
202
+ logger.warn('opencode-question-push-failed', {
203
+ worktreeId: target.worktreeId,
204
+ instanceId,
205
+ error: error instanceof Error ? error.message : String(error),
206
+ });
207
+ }
208
+ }
209
+ /**
210
+ * Tell the human's phone that a turn ended in an error.
211
+ *
212
+ * `kind: 'failure'` (#2000), which shares the "you need to act" toggle with
213
+ * `prompt` but keeps its own Service Worker `tag`, so a failure never replaces
214
+ * the card for a question that is still open.
215
+ *
216
+ * The dedup content is the {@link FailureContext.signature}, not the excerpt:
217
+ * `error.data.message` for a retrying provider carries changing detail, while
218
+ * `(session, error name)` is the incident. Two *different* errors in one
219
+ * session therefore both notify, and a repeat of one does not.
220
+ *
221
+ * @param errorName - `properties.error.name`, or null
222
+ * @param message - The human-facing line `./ingest` already extracted
223
+ * (`error.data.message`, falling back to `error.name`)
224
+ * @param sessionId - The opencode session the error belongs to, for the signature
225
+ */
226
+ async function notifyOpencodeSessionErrorPush(target, instanceId, errorName, message, sessionId, at) {
227
+ if (errorName === exports.OPENCODE_INTERRUPT_ERROR_NAME) {
228
+ logger.info('opencode-error-push-skipped-interrupt', {
229
+ worktreeId: target.worktreeId,
230
+ instanceId,
231
+ errorName,
232
+ });
233
+ return;
234
+ }
235
+ try {
236
+ const { notifyPushSubscribers, buildExcerpt } = await loadPushSender();
237
+ const subject = await subjectOf(target, instanceId);
238
+ await notifyPushSubscribers({
239
+ ...subject,
240
+ kind: 'failure',
241
+ agentName: instanceId,
242
+ excerpt: buildExcerpt(message ?? undefined, exports.OPENCODE_PUSH_EXCERPT_LENGTH),
243
+ failure: {
244
+ reason: 'agent-session-error',
245
+ signature: `opencode:session-error:${sessionId ?? 'unknown'}:${errorName ?? 'unknown'}`,
246
+ },
247
+ }, at);
248
+ logger.info('opencode-error-push-sent', {
249
+ worktreeId: target.worktreeId,
250
+ instanceId,
251
+ errorName,
252
+ sessionId,
253
+ });
254
+ }
255
+ catch (error) {
256
+ logger.warn('opencode-error-push-failed', {
257
+ worktreeId: target.worktreeId,
258
+ instanceId,
259
+ error: error instanceof Error ? error.message : String(error),
260
+ });
261
+ }
262
+ }
263
+ /**
264
+ * Tell the human that a newer opencode exists.
265
+ *
266
+ * `kind: 'completion'` — the informational bucket. Nothing is blocked and
267
+ * nobody has to act, so this must not ride the toggle a waiting prompt and a
268
+ * failed run share; a reader who opted out of "for information" opted out of
269
+ * this too.
270
+ *
271
+ * The excerpt is the version rather than prose. It is never rendered — the body
272
+ * comes from `updateAvailable` — but `passesDedup` hashes it, so carrying the
273
+ * version there makes the fan-out's own 30 s guard key off *which* update this
274
+ * is instead of off an empty string it would share with a bare completion.
275
+ *
276
+ * Suppressing repeats is the caller's job (`./subscription` remembers the
277
+ * versions it has announced), not this module's: the frame carries **no
278
+ * `sessionID`** — measured against 1.18.22's `GET /doc`, where
279
+ * `EventInstallationUpdate-available.properties` is `{ version }` and nothing
280
+ * else — so "once per session" can only be answered by whoever holds the
281
+ * connection.
282
+ */
283
+ async function notifyOpencodeUpdateAvailablePush(target, instanceId, version, at) {
284
+ try {
285
+ const { notifyPushSubscribers } = await loadPushSender();
286
+ const subject = await subjectOf(target, instanceId);
287
+ await notifyPushSubscribers({
288
+ ...subject,
289
+ kind: 'completion',
290
+ agentName: instanceId,
291
+ excerpt: version,
292
+ updateAvailable: { agent: instanceId, version },
293
+ }, at);
294
+ logger.info('opencode-update-push-sent', {
295
+ worktreeId: target.worktreeId,
296
+ instanceId,
297
+ version,
298
+ });
299
+ }
300
+ catch (error) {
301
+ logger.warn('opencode-update-push-failed', {
302
+ worktreeId: target.worktreeId,
303
+ instanceId,
304
+ error: error instanceof Error ? error.message : String(error),
305
+ });
306
+ }
307
+ }