commandmate 0.44.0 → 0.44.2

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 (372) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +331 -335
  3. package/.next/app-path-routes-manifest.json +35 -35
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +15 -15
  6. package/.next/react-loadable-manifest.json +3 -3
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/capabilities/route.js +1 -1
  18. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  27. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  28. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  30. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  31. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  33. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  34. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  41. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  42. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/relays/route.js +1 -1
  44. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  45. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/remote/pair/route.js +2 -2
  47. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  50. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  51. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/repositories/clone/route.js +1 -1
  53. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  54. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/repositories/restore/route.js +1 -1
  57. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  58. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/repositories/route.js +1 -1
  60. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  61. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/scan/route.js +1 -1
  63. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/sync/route.js +1 -1
  66. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  70. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  71. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  87. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  88. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  90. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  91. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  94. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  100. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  103. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  134. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  137. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  140. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -2
  149. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  150. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -2
  152. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  153. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  156. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  160. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  163. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  170. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
  172. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  173. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  188. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  189. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/route.js +1 -1
  210. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  213. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  215. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  216. package/.next/server/app/page_client-reference-manifest.js +1 -1
  217. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  219. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  220. package/.next/server/app/sessions/page.js +1 -1
  221. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  222. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  223. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  224. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  225. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  226. package/.next/server/app/worktrees/[id]/page.js +7 -7
  227. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  228. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  229. package/.next/server/app-paths-manifest.json +35 -35
  230. package/.next/server/chunks/1068.js +1 -1
  231. package/.next/server/chunks/1210.js +1 -1
  232. package/.next/server/chunks/2119.js +1 -1
  233. package/.next/server/chunks/2404.js +1 -1
  234. package/.next/server/chunks/2445.js +1 -1
  235. package/.next/server/chunks/2460.js +1 -0
  236. package/.next/server/chunks/2816.js +1 -1
  237. package/.next/server/chunks/2908.js +1 -0
  238. package/.next/server/chunks/4372.js +5 -0
  239. package/.next/server/chunks/5595.js +1 -0
  240. package/.next/server/chunks/5845.js +1 -0
  241. package/.next/server/chunks/6130.js +1 -1
  242. package/.next/server/chunks/6401.js +1 -1
  243. package/.next/server/chunks/6474.js +3 -3
  244. package/.next/server/chunks/7685.js +1 -1
  245. package/.next/server/chunks/7905.js +1 -1
  246. package/.next/server/chunks/850.js +1 -0
  247. package/.next/server/chunks/8543.js +1 -1
  248. package/.next/server/chunks/8581.js +2 -2
  249. package/.next/server/chunks/8728.js +2 -2
  250. package/.next/server/chunks/9130.js +1 -5
  251. package/.next/server/chunks/9390.js +1 -2
  252. package/.next/server/chunks/9627.js +1 -1
  253. package/.next/server/chunks/967.js +1 -1
  254. package/.next/server/chunks/9731.js +3 -3
  255. package/.next/server/chunks/9798.js +2 -0
  256. package/.next/server/chunks/9882.js +3 -3
  257. package/.next/server/middleware-build-manifest.js +1 -1
  258. package/.next/server/middleware-manifest.json +5 -5
  259. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  260. package/.next/server/pages/500.html +1 -1
  261. package/.next/server/pages-manifest.json +1 -1
  262. package/.next/server/server-reference-manifest.json +1 -1
  263. package/.next/static/chunks/{2407-340774f1a24f2b45.js → 2407-051f6f84226a9f2c.js} +1 -1
  264. package/.next/static/chunks/344-e1cefd00787060e4.js +1 -0
  265. package/.next/static/chunks/3922.f45dcfc1e7da552a.js +1 -0
  266. package/.next/static/chunks/591-539fec878c9dec5e.js +1 -0
  267. package/.next/static/chunks/6654-ac431270fac1a283.js +1 -0
  268. package/.next/static/chunks/{9619-84aced0846cbe3ac.js → 9619-6c17a271f7f98fbb.js} +1 -1
  269. package/.next/static/chunks/998-2eb5883186abd0bd.js +1 -0
  270. package/.next/static/chunks/app/layout-9da1ab602bcb3051.js +1 -0
  271. package/.next/static/chunks/app/more/{page-30057cf1e0762ad2.js → page-87c84987b2765213.js} +1 -1
  272. package/.next/static/chunks/app/{page-8483ba400af011f5.js → page-1b820c421db48c2c.js} +1 -1
  273. package/.next/static/chunks/app/review/page-95f749caae382f46.js +1 -0
  274. package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +1 -0
  275. package/.next/static/chunks/app/worktrees/[id]/page-2a81397e60f17e63.js +1 -0
  276. package/.next/static/chunks/{webpack-49ade0526854dd4e.js → webpack-021f0741f22dd16a.js} +1 -1
  277. package/.next/trace +13 -13
  278. package/README.md +72 -25
  279. package/dist/cli/commands/capture.d.ts.map +1 -1
  280. package/dist/cli/commands/capture.js +7 -8
  281. package/dist/cli/commands/remote.d.ts +10 -0
  282. package/dist/cli/commands/remote.d.ts.map +1 -1
  283. package/dist/cli/commands/remote.js +17 -1
  284. package/dist/cli/commands/wait.d.ts.map +1 -1
  285. package/dist/cli/commands/wait.js +47 -2
  286. package/dist/cli/docs/setup-guide.d.ts +1 -1
  287. package/dist/cli/docs/setup-guide.d.ts.map +1 -1
  288. package/dist/cli/docs/setup-guide.js +2 -0
  289. package/dist/cli/types/api-responses.d.ts +25 -0
  290. package/dist/cli/types/api-responses.d.ts.map +1 -1
  291. package/dist/lib/detection/status-reason.d.ts +17 -0
  292. package/dist/lib/detection/status-reason.d.ts.map +1 -1
  293. package/dist/lib/detection/status-reason.js +17 -0
  294. package/dist/lib/session/prompt-view.d.ts +205 -0
  295. package/dist/lib/session/prompt-view.d.ts.map +1 -0
  296. package/dist/lib/session/prompt-view.js +267 -0
  297. package/dist/server/locales/en/worktree.json +13 -1
  298. package/dist/server/locales/ja/worktree.json +13 -1
  299. package/dist/server/server.js +5 -3
  300. package/dist/server/src/config/session-starting-config.js +75 -0
  301. package/dist/server/src/lib/auto-yes-lifecycle.js +133 -0
  302. package/dist/server/src/lib/auto-yes-poller.js +19 -4
  303. package/dist/server/src/lib/cli-tools/antigravity.js +3 -2
  304. package/dist/server/src/lib/cli-tools/base.js +15 -1
  305. package/dist/server/src/lib/cli-tools/codex.js +3 -2
  306. package/dist/server/src/lib/cli-tools/command-code.js +3 -2
  307. package/dist/server/src/lib/cli-tools/copilot.js +2 -1
  308. package/dist/server/src/lib/cli-tools/gemini.js +2 -1
  309. package/dist/server/src/lib/cli-tools/liveness-spec.js +27 -9
  310. package/dist/server/src/lib/cli-tools/opencode-v2.js +2 -1
  311. package/dist/server/src/lib/cli-tools/opencode.js +2 -1
  312. package/dist/server/src/lib/cli-tools/vibe-local.js +2 -1
  313. package/dist/server/src/lib/detection/cli-patterns.js +38 -20
  314. package/dist/server/src/lib/detection/status-detector.js +1 -1
  315. package/dist/server/src/lib/detection/status-reason.js +17 -0
  316. package/dist/server/src/lib/detection/tool-liveness.js +3 -1
  317. package/dist/server/src/lib/detection/tools/antigravity/detect.js +7 -31
  318. package/dist/server/src/lib/detection/tools/antigravity/live-region.js +39 -0
  319. package/dist/server/src/lib/detection/tools/claude/detect.js +8 -3
  320. package/dist/server/src/lib/detection/tools/claude/live-region.js +26 -0
  321. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +1 -1
  322. package/dist/server/src/lib/detection/tools/codex/detect.js +26 -46
  323. package/dist/server/src/lib/detection/tools/codex/live-region.js +73 -0
  324. package/dist/server/src/lib/detection/tools/command-code/detect.js +11 -0
  325. package/dist/server/src/lib/detection/tools/command-code/live-region.js +36 -0
  326. package/dist/server/src/lib/detection/tools/copilot/detect.js +3 -0
  327. package/dist/server/src/lib/detection/tools/copilot/live-region.js +52 -0
  328. package/dist/server/src/lib/detection/tools/frame.js +36 -2
  329. package/dist/server/src/lib/detection/tools/live-region-specs.js +31 -0
  330. package/dist/server/src/lib/detection/tools/live-region.js +204 -0
  331. package/dist/server/src/lib/detection/tools/opencode/detect.js +3 -0
  332. package/dist/server/src/lib/detection/tools/opencode/live-region.js +24 -0
  333. package/dist/server/src/lib/detection/tools/opencode-gutter-live-region.js +72 -0
  334. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +3 -0
  335. package/dist/server/src/lib/detection/tools/opencode-v2/live-region.js +24 -0
  336. package/dist/server/src/lib/detection/tools/run-detection.js +25 -3
  337. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +16 -4
  338. package/dist/server/src/lib/polling/response-checker.js +25 -20
  339. package/dist/server/src/lib/prompt-answer-sender.js +1 -1
  340. package/dist/server/src/lib/realtime/terminal-broadcast.js +8 -0
  341. package/dist/server/src/lib/relay/relay-delivery.js +3 -0
  342. package/dist/server/src/lib/relay/relay-triggers.js +9 -0
  343. package/dist/server/src/lib/resource-cleanup.js +6 -4
  344. package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -0
  345. package/dist/server/src/lib/session/claude-session.js +7 -1
  346. package/dist/server/src/lib/session/current-output-builder.js +53 -21
  347. package/dist/server/src/lib/session/launch-screen.js +57 -0
  348. package/dist/server/src/lib/session/prompt-view.js +267 -0
  349. package/dist/server/src/lib/session/prompt-waiting-composition.js +34 -0
  350. package/dist/server/src/lib/session/session-starting-state.js +236 -0
  351. package/dist/server/src/lib/session/waiting-kind.js +3 -0
  352. package/dist/server/src/lib/session-cleanup.js +5 -3
  353. package/package.json +1 -1
  354. package/release-notes/0.44.1.json +54 -0
  355. package/release-notes/0.44.2.json +33 -0
  356. package/.next/server/chunks/434.js +0 -1
  357. package/.next/server/chunks/5775.js +0 -1
  358. package/.next/server/chunks/650.js +0 -1
  359. package/.next/server/chunks/6661.js +0 -1
  360. package/.next/server/chunks/8583.js +0 -1
  361. package/.next/server/chunks/964.js +0 -1
  362. package/.next/static/chunks/344-6f9fc1f38f01a839.js +0 -1
  363. package/.next/static/chunks/3922.8e79fc89f593280b.js +0 -1
  364. package/.next/static/chunks/5449-6cb80bab2bd06b79.js +0 -1
  365. package/.next/static/chunks/591-0a45801e83f26f24.js +0 -1
  366. package/.next/static/chunks/6966-bb854d1145783a64.js +0 -1
  367. package/.next/static/chunks/app/layout-0fc249fb7de75a27.js +0 -1
  368. package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +0 -1
  369. package/.next/static/chunks/app/sessions/page-55297155e7bf01b9.js +0 -1
  370. package/.next/static/chunks/app/worktrees/[id]/page-d2103e0c25be83c8.js +0 -1
  371. /package/.next/static/{wu7SUiHTirFcrpo5teyZ3 → QlCqLjorauDDBXPa-C7TK}/_buildManifest.js +0 -0
  372. /package/.next/static/{wu7SUiHTirFcrpo5teyZ3 → QlCqLjorauDDBXPa-C7TK}/_ssgManifest.js +0 -0
@@ -22,6 +22,7 @@ exports.stopResourceCleanup = stopResourceCleanup;
22
22
  const child_process_1 = require("child_process");
23
23
  const fs_1 = require("fs");
24
24
  const auto_yes_manager_1 = require("./polling/auto-yes-manager");
25
+ const auto_yes_lifecycle_1 = require("./auto-yes-lifecycle");
25
26
  const path_validator_1 = require("./security/path-validator");
26
27
  const schedule_manager_1 = require("./schedule-manager");
27
28
  const timer_manager_1 = require("./timer-manager");
@@ -174,18 +175,19 @@ function cleanupOrphanedMapEntries() {
174
175
  // If DB query returned nothing, skip cleanup to avoid false positives
175
176
  return result;
176
177
  }
177
- // Cleanup autoYesStates (Issue #525: composite keys)
178
+ // Cleanup autoYesStates (Issue #525: composite keys). Issue #3184: through the
179
+ // `orphan-swept` row of the Auto-Yes lifecycle table.
178
180
  const autoYesStateKeys = (0, auto_yes_manager_1.getAutoYesStateCompositeKeys)();
179
181
  for (const compositeKey of autoYesStateKeys) {
180
182
  const worktreeId = (0, auto_yes_manager_1.extractWorktreeId)(compositeKey);
181
183
  // [SEC4-MF-001] Validate extracted worktreeId
182
184
  if (!(0, path_validator_1.isValidWorktreeId)(worktreeId)) {
183
- (0, auto_yes_manager_1.deleteAutoYesState)(compositeKey);
185
+ (0, auto_yes_lifecycle_1.applyAutoYesStateRule)('orphan-swept', { scope: 'key', compositeKey });
184
186
  result.deletedAutoYesStateIds.push(compositeKey);
185
187
  continue;
186
188
  }
187
189
  if (!validWorktreeIds.has(worktreeId)) {
188
- (0, auto_yes_manager_1.deleteAutoYesState)(compositeKey);
190
+ (0, auto_yes_lifecycle_1.applyAutoYesStateRule)('orphan-swept', { scope: 'key', compositeKey });
189
191
  result.deletedAutoYesStateIds.push(compositeKey);
190
192
  }
191
193
  }
@@ -194,7 +196,7 @@ function cleanupOrphanedMapEntries() {
194
196
  for (const compositeKey of autoYesPollerKeys) {
195
197
  const worktreeId = (0, auto_yes_manager_1.extractWorktreeId)(compositeKey);
196
198
  if (!(0, path_validator_1.isValidWorktreeId)(worktreeId) || !validWorktreeIds.has(worktreeId)) {
197
- (0, auto_yes_manager_1.stopAutoYesPolling)(compositeKey);
199
+ (0, auto_yes_lifecycle_1.stopAutoYesPollersFor)('orphan-swept', { scope: 'key', compositeKey });
198
200
  result.deletedAutoYesPollerIds.push(compositeKey);
199
201
  }
200
202
  }
@@ -43,6 +43,7 @@ exports.buildAgentLaunchCommandLine = buildAgentLaunchCommandLine;
43
43
  const sources_1 = require("../../lib/hooks/sources");
44
44
  const agent_event_state_1 = require("../../lib/session/agent-event-state");
45
45
  const session_generation_archive_1 = require("../../lib/session/session-generation-archive");
46
+ const session_starting_state_1 = require("../../lib/session/session-starting-state");
46
47
  const logger_1 = require("../../lib/logger");
47
48
  const logger = (0, logger_1.createLogger)('lib/session/agent-session-lifecycle');
48
49
  /**
@@ -66,6 +67,16 @@ const logger = (0, logger_1.createLogger)('lib/session/agent-session-lifecycle')
66
67
  * @param at - Epoch ms; defaults to now
67
68
  */
68
69
  function beginAgentSession(target, at = Date.now()) {
70
+ // Issue #3179: the launch is in progress from here until
71
+ // `BaseCLITool.startSession` returns or throws (it clears the record in a
72
+ // `finally`). First, so the screen stops reading the about-to-be-created pane
73
+ // as a running agent before anything else here can fail.
74
+ // Issue #3195: the record is written under the token `startSession` is
75
+ // running the launch with (an `AsyncLocalStorage`, read inside
76
+ // `markSessionStarting`), which is how that `finally` knows the record is
77
+ // its own. A second call from the same launch (codex's
78
+ // `relaunchIntoSamePane`) rewrites the same launch's record.
79
+ (0, session_starting_state_1.markSessionStarting)(target.worktreeId, target.cliToolId, target.instanceId, at);
69
80
  const before = (0, agent_event_state_1.getAgentEventDropCounts)(target.worktreeId, target.cliToolId, target.instanceId).decisionEvicted;
70
81
  (0, agent_event_state_1.beginAgentEventGeneration)(target.worktreeId, target.cliToolId, target.instanceId, at);
71
82
  const after = (0, agent_event_state_1.getAgentEventDropCounts)(target.worktreeId, target.cliToolId, target.instanceId).decisionEvicted;
@@ -36,6 +36,7 @@ const cmate_cli_tool_parser_1 = require("../../lib/cmate-cli-tool-parser");
36
36
  const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
37
37
  const agent_event_state_1 = require("../../lib/session/agent-event-state");
38
38
  const session_start_error_1 = require("../../lib/session/session-start-error");
39
+ const launch_screen_1 = require("../../lib/session/launch-screen");
39
40
  const logger = (0, logger_1.createLogger)('claude-session');
40
41
  const execAsync = (0, util_1.promisify)(child_process_1.exec);
41
42
  // ----- Helper Functions -----
@@ -429,6 +430,11 @@ function findSessionErrorPattern(cleanOutput) {
429
430
  * reading as a zsh prompt. What changed is that six other tools can now be
430
431
  * asked the same question; see `lib/cli-tools/liveness-spec`.
431
432
  *
433
+ * Issue #3191: a `user@host …` prompt of 40 characters or more is now read as
434
+ * the shell too (claude's spec takes `SHELL_PROMPT_LINE_PATTERNS`), so a claude
435
+ * that was `/exit`ed into a long zsh / bash prompt is reported unhealthy and
436
+ * relaunched instead of timing out the next send.
437
+ *
432
438
  * @param sessionName - tmux session name
433
439
  * @returns HealthCheckResult with healthy status and optional reason
434
440
  */
@@ -674,7 +680,7 @@ async function startClaudeSession(options) {
674
680
  // and the operator's `~/.claude/settings.json` (measured on 2.1.278).
675
681
  const launchCommand = model === undefined ? baseLaunchCommand : `${baseLaunchCommand} --model ${(0, hook_settings_generator_1.shellQuote)(model)}`;
676
682
  // Start Claude CLI in interactive mode using dynamically resolved path
677
- await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
683
+ await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
678
684
  // Wait for Claude to initialize with dynamic detection (OCP-001)
679
685
  // Use constants instead of hardcoded values
680
686
  const maxWaitTime = exports.CLAUDE_INIT_TIMEOUT;
@@ -55,6 +55,7 @@ const db_1 = require("../../lib/db");
55
55
  // when this instance was last handed a prompt.
56
56
  const chat_db_1 = require("../../lib/db/chat-db");
57
57
  const unclassified_frame_tracker_1 = require("../../lib/detection/unclassified-frame-tracker");
58
+ const session_starting_state_1 = require("../../lib/session/session-starting-state");
58
59
  const composer_text_1 = require("../../lib/detection/composer-text");
59
60
  const upstream_faults_1 = require("../../lib/detection/upstream-faults");
60
61
  const opencode_pane_obstruction_1 = require("../../lib/detection/opencode-pane-obstruction");
@@ -85,6 +86,7 @@ const prompt_waiting_composition_1 = require("../../lib/session/prompt-waiting-c
85
86
  const provisional_turn_1 = require("../../lib/session/provisional-turn");
86
87
  const status_evidence_1 = require("../../lib/session/status-evidence");
87
88
  const ask_user_question_prompt_1 = require("../../lib/session/ask-user-question-prompt");
89
+ const prompt_view_1 = require("../../lib/session/prompt-view");
88
90
  const auto_yes_dialog_gate_1 = require("../../lib/polling/auto-yes-dialog-gate");
89
91
  const layer_disagreement_1 = require("../../lib/session/layer-disagreement");
90
92
  const structured_prompt_1 = require("../../lib/session/structured-prompt");
@@ -608,7 +610,8 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId, resolut
608
610
  // surface is actually being watched at, which is exactly the property the
609
611
  // terminal snapshot already has. Gated on the merged verdict (`'running'`, not
610
612
  // the tmux-session-exists `isRunning`) so an idle pane reads no transcript.
611
- if (payload.isRunning && payload.sessionStatus === 'running') {
613
+ // Issue #3179: not during a launch — there is no turn to publish yet.
614
+ if (payload.isRunning && payload.sessionStatus === 'running' && payload.startingSince == null) {
612
615
  // Issue #2248 made this an `await`, and it buys less than it looks like: the
613
616
  // expensive half — the transcript read and the broadcast — is detached
614
617
  // inside, so what is waited for is a worktree row and a Map lookup. What it
@@ -750,6 +753,10 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
750
753
  (0, status_evidence_1.forgetLastKnownStatus)((0, auto_yes_manager_1.buildCompositeKey)(worktreeId, cliToolId, instanceId));
751
754
  return {
752
755
  isRunning: false,
756
+ // Issue #3179: `beginAgentSession` runs before the pane is created, so a
757
+ // launch can be in progress with no tmux session yet. Read-only here —
758
+ // there is no frame to judge a dialog on.
759
+ startingSince: (0, session_starting_state_1.getSessionStartingSince)(worktreeId, cliToolId, instanceId),
753
760
  sessionName,
754
761
  content: '',
755
762
  lineCount: 0,
@@ -828,7 +835,17 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
828
835
  const compositeKey = (0, auto_yes_manager_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
829
836
  const lastServerResponseTimestamp = (0, auto_yes_manager_1.getLastServerResponseTimestamp)(compositeKey);
830
837
  const lastOutputTimestamp = lastServerResponseTimestamp ? new Date(lastServerResponseTimestamp) : undefined;
831
- const statusResult = (0, status_detector_1.detectSessionStatus)(output, cliToolId, lastOutputTimestamp);
838
+ const rawStatusResult = (0, status_detector_1.detectSessionStatus)(output, cliToolId, lastOutputTimestamp);
839
+ // Issue #3179: a launch in progress. The frame is a shell prompt and the
840
+ // launch line, or a dialog the launch is about to answer, and none of the
841
+ // flags below may be read off it: the floor verdict raised the Navigate pad,
842
+ // the trust dialog raised the selection list / prompt sheet. A dialog that
843
+ // outstays the launch's own answer releases the record (a login, an unknown
844
+ // dialog), and from then on this is the ordinary verdict again.
845
+ const startingSince = (0, session_starting_state_1.observeSessionStartingFrame)(worktreeId, cliToolId, instanceId, rawStatusResult.status === 'waiting' || rawStatusResult.hasActivePrompt);
846
+ const statusResult = startingSince === null
847
+ ? rawStatusResult
848
+ : (0, session_starting_state_1.startingStatusResult)(rawStatusResult);
832
849
  // Issue #1912: every `running` reason that means "the agent is producing
833
850
  // output", not just `thinking_indicator`. opencode answers
834
851
  // `opencode_processing_indicator` for its `esc interrupt` footer, which is
@@ -946,7 +963,9 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
946
963
  // the guard cannot disagree about whether a prompt is open. What they are
947
964
  // still allowed to differ on is what to DO about it — see `blocksSend`, which
948
965
  // bounds the structured layer's veto over sends and leaves this flag alone.
949
- const isPromptWaiting = promptResolution.waiting;
966
+ // Issue #3179: not while a launch is in progress. The scraper half is already
967
+ // neutralised above; this also drops a structured wait the launch inherited.
968
+ const isPromptWaiting = startingSince === null && promptResolution.waiting;
950
969
  // Issue #1726: the agent's own account of what it asked. It contributes only
951
970
  // where some other layer has already established that a dialog is on screen —
952
971
  // this record decides no status of its own, because Claude emits nothing at
@@ -1033,13 +1052,15 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
1033
1052
  // instead of by coincidence.)
1034
1053
  patterns: decisionOptions !== null ? promptWaiting.patterns : null,
1035
1054
  };
1036
- const promptData = scraperPromptWaiting
1037
- ? correctedPromptData ??
1038
- scraperPromptData ??
1039
- (structuredFacts ? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts) : null)
1040
- : structuredFacts
1041
- ? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts)
1042
- : null;
1055
+ const promptData = startingSince !== null
1056
+ ? null
1057
+ : scraperPromptWaiting
1058
+ ? correctedPromptData ??
1059
+ scraperPromptData ??
1060
+ (structuredFacts ? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts) : null)
1061
+ : structuredFacts
1062
+ ? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts)
1063
+ : null;
1043
1064
  // Issue #2870: whether `/prompt-response` would answer the prompt published
1044
1065
  // above, read by the SAME function it re-verifies with. In #2868 `promptData`
1045
1066
  // came off the generic parser alone, the route refused it, and the UI's Send
@@ -1111,7 +1132,9 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
1111
1132
  // and the 60 seconds — start afresh if the frame is still unreadable once the
1112
1133
  // decision is gone (answered, expired, or the source dropped).
1113
1134
  const answerableOverAgentApi = (0, structured_prompt_1.hasApiAnswerableDecision)(eventSource.capabilities.eventIdentity, structuredEvents.pendingDecisions ?? []);
1114
- const unclassifiedVerdict = (0, unclassified_frame_tracker_1.observeUnclassifiedFrame)(compositeKey, merged.isUnclassifiedActive && !answerableOverAgentApi);
1135
+ // Issue #3179: a launch in progress is not a detection failure — its frame is
1136
+ // the shell and the launch line — so no row, and the run starts afresh after.
1137
+ const unclassifiedVerdict = (0, unclassified_frame_tracker_1.observeUnclassifiedFrame)(compositeKey, merged.isUnclassifiedActive && !answerableOverAgentApi && startingSince === null);
1115
1138
  if (unclassifiedVerdict.shouldRecord) {
1116
1139
  recordUnclassifiedFrame(db, {
1117
1140
  worktreeId,
@@ -1197,32 +1220,40 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
1197
1220
  // `sessionStatus` it sat next to one poll earlier. Observed before it is read
1198
1221
  // so a positive poll reports itself, which is what keeps the field from
1199
1222
  // looking stale on a healthy session.
1223
+ // Issue #3179: the structured layer cannot override a launch in progress
1224
+ // either — a `waiting` it inherited would put the answer sheet back.
1225
+ const published = startingSince === null
1226
+ ? merged
1227
+ : { ...merged, status: 'running', reason: status_detector_1.STATUS_REASON.STARTING, thinking: false };
1200
1228
  (0, status_evidence_1.observeStatusEvidence)(compositeKey, {
1201
- status: merged.status,
1202
- reason: merged.reason,
1203
- evidence: merged.evidence,
1229
+ status: published.status,
1230
+ reason: published.reason,
1231
+ evidence: published.evidence,
1204
1232
  });
1205
1233
  const lastKnown = (0, status_evidence_1.getLastKnownStatus)(compositeKey);
1206
1234
  return {
1207
1235
  isRunning: true,
1208
1236
  sessionName,
1209
1237
  cliToolId,
1210
- sessionStatus: merged.status,
1211
- sessionStatusReason: merged.reason,
1238
+ sessionStatus: published.status,
1239
+ sessionStatusReason: published.reason,
1212
1240
  content: newContent,
1213
1241
  fullOutput: output,
1214
1242
  realtimeSnippet,
1215
1243
  lineCount: totalLines,
1216
1244
  lastCapturedLine,
1217
1245
  isComplete: isPromptWaiting,
1218
- isGenerating: merged.thinking,
1219
- thinking: merged.thinking,
1246
+ isGenerating: published.thinking,
1247
+ thinking: published.thinking,
1220
1248
  // Issue #2607: named after the tool actually running. A fixed "Claude" was
1221
1249
  // published for every agent, and `capture --json` readers took it at its word.
1222
- thinkingMessage: merged.thinking ? `${(0, types_2.getCliToolDisplayName)(cliToolId)} is thinking...` : null,
1250
+ thinkingMessage: published.thinking ? `${(0, types_2.getCliToolDisplayName)(cliToolId)} is thinking...` : null,
1223
1251
  isPromptWaiting,
1224
1252
  promptData,
1225
1253
  ...(promptAnswerable !== undefined ? { promptAnswerable } : {}),
1254
+ // Issue #3184: appended next to the value it is derived from, not at the end
1255
+ // — it is a reading of `promptData`, and only of it.
1256
+ promptView: (0, prompt_view_1.derivePromptView)(promptData),
1226
1257
  autoYes: {
1227
1258
  enabled: autoYesState?.enabled ?? false,
1228
1259
  expiresAt: autoYesState?.enabled ? autoYesState.expiresAt : null,
@@ -1235,11 +1266,12 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
1235
1266
  isSelectionListActive,
1236
1267
  isPagerActive,
1237
1268
  isDismissablePanelActive,
1238
- isUnclassifiedActive: merged.isUnclassifiedActive,
1269
+ isUnclassifiedActive: startingSince === null && merged.isUnclassifiedActive,
1270
+ startingSince,
1239
1271
  // Issue #1926: the same fact `isUnclassifiedActive` carries, named the way
1240
1272
  // §4 D1 names it. Published from the merged verdict so the two cannot
1241
1273
  // disagree on the wire.
1242
- statusEvidence: merged.evidence,
1274
+ statusEvidence: published.evidence,
1243
1275
  lastKnownStatus: lastKnown?.status ?? null,
1244
1276
  lastKnownStatusAt: lastKnown?.at ?? null,
1245
1277
  lastServerResponseTimestamp,
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * Keep the launch line off the pane (Issue #3180).
4
+ *
5
+ * Every `startSession` types its launch line into the pane's login shell —
6
+ * `CM_HOOK_URL='…' CM_PERMISSION_HOOK_URL='…' CM_PORT='3000' 'agy'` — and the
7
+ * shell echoes it. A tool that repaints the whole screen hides the echo once it
8
+ * draws; agy and codex draw inline, so the line, with its internal URL, port
9
+ * and worktree ID, stayed in the scrollback for the life of the session.
10
+ *
11
+ * `clear` runs in the same shell, before the agent, so the echo is wiped before
12
+ * the agent paints. The shell stays the agent's parent exactly as before, which
13
+ * is what keeps exit detection (`judgeToolLiveness`, `relaunchIfToolExited`)
14
+ * unchanged: when the agent quits, the pane falls back to the same shell prompt.
15
+ *
16
+ * `clear` alone only empties the visible screen. tmux 3.4+ defaults to
17
+ * `scroll-on-clear on`, which moves what `clear` wiped INTO the scrollback, and
18
+ * CommandMate's capture reads the scrollback: in the 2026-10-04 UAT (tmux 3.5a)
19
+ * codex, antigravity, Command Code and gemini still had the launch line twice in
20
+ * `tmux capture-pane -p -J -S -` (two `CM_HOOK_URL` hits), and it surfaced in the
21
+ * UI terminal and in codex's trust-dialog sheet. So `printf '\033[3J'` follows
22
+ * `clear`: ESC [3J (Erase Saved Lines) drops the scrollback, the echo included.
23
+ * `tmux clear-history` would also work but depends on the pane having a tmux
24
+ * binary and `TMUX` set, so it is not used. `printf` is a builtin in zsh, bash,
25
+ * dash and fish, and each reads `\033` in the format as octal ESC; the single
26
+ * quotes keep the backslash for printf in all of them.
27
+ *
28
+ * Joined with `;`, not `&&`, and with `clear`'s stderr dropped: a pane whose
29
+ * `clear` is missing or fails (unknown `TERM`, no ncurses), or whose `printf`
30
+ * fails, must still start the agent — a launch line left on screen is a
31
+ * cosmetic leak, a session that never starts is not — and must not print the
32
+ * failure in the line's place.
33
+ *
34
+ * Applied at the `sendKeys` call site, AFTER any flags a tool appends
35
+ * (`--model`, `-s <id>`, Command Code's launch flags): `buildAgentLaunchCommandLine`
36
+ * stays `NAME='value' … command`, and an appended flag lands on the agent, not
37
+ * on `clear`.
38
+ *
39
+ * Deliberately not in a module the session suites mock wholesale
40
+ * (`agent-session-lifecycle`, `tmux`), so those suites see the real prefix.
41
+ *
42
+ * @module lib/session/launch-screen
43
+ */
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.LAUNCH_SCREEN_CLEAR_PREFIX = void 0;
46
+ exports.withLaunchScreenCleared = withLaunchScreenCleared;
47
+ /** The prefix every launch line is typed with. */
48
+ exports.LAUNCH_SCREEN_CLEAR_PREFIX = "clear 2>/dev/null; printf '\\033[3J'; ";
49
+ /**
50
+ * The line to type into the pane: clear the screen and the scrollback, then launch.
51
+ *
52
+ * @param launchCommand - The rendered launch line, flags included
53
+ * @returns `clear 2>/dev/null; printf '\033[3J'; <launchCommand>`
54
+ */
55
+ function withLaunchScreenCleared(launchCommand) {
56
+ return `${exports.LAUNCH_SCREEN_CLEAR_PREFIX}${launchCommand}`;
57
+ }
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ /**
3
+ * How a waiting prompt is shown and answered, decided once (Issue #3184).
4
+ *
5
+ * Before this module every reader of a prompt payload re-derived the same three
6
+ * facts for itself — "can it be answered?", "where are the choices?", "is the
7
+ * answer a keystroke or an API call?" — from `type`, `options`,
8
+ * `decisionOptions`, `decisionId` and `askUserQuestion`. The panel, the phone
9
+ * sheet, the chat surface, Auto-Yes and `wait` each combined them a little
10
+ * differently, and a fix to one surface kept missing the others (#2775 →
11
+ * #2810 → #2822, #3181). {@link derivePromptView} is the one combination; a
12
+ * reader takes its {@link PromptView} and does not look at the raw fields to
13
+ * decide what to show.
14
+ *
15
+ * ## No imports, on purpose
16
+ *
17
+ * The CLI (`tsconfig.cli.json`) compiles with `"paths": {}`, so it can reach a
18
+ * module under `src/lib` by a relative path only when nothing in that module's
19
+ * graph uses the `@/` alias. `types/models` and `session/structured-prompt` both
20
+ * do. The input is therefore a structural type ({@link PromptViewSource}) that
21
+ * every existing prompt shape — `LivePromptData`, `StoredPromptData`, the CLI's
22
+ * own `PromptData` mirror — satisfies without a cast, and this file stays
23
+ * importable from a client component, the server and the CLI alike.
24
+ *
25
+ * ## What it does not replace
26
+ *
27
+ * `isAnswerablePromptData()` (`types/models`) stays: it narrows to the closed
28
+ * `PromptData` union (#1725) for the code that builds an answer body. The two
29
+ * agree by construction — `derivePromptView(x)?.kind === 'screen-choices'`
30
+ * exactly when `isAnswerablePromptData(x)` — and
31
+ * `tests/unit/session/prompt-view-3184.test.ts` holds that over every fixture.
32
+ *
33
+ * @module lib/session/prompt-view
34
+ */
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TYPED_TEXT_FIELD_LABEL_PATTERNS = exports.UNCLASSIFIED_PROMPT_VIEW_TYPE = void 0;
37
+ exports.promptHeadingMessage = promptHeadingMessage;
38
+ exports.optionTakesTypedText = optionTakesTypedText;
39
+ exports.readDecisionId = readDecisionId;
40
+ exports.readQuestionChoices = readQuestionChoices;
41
+ exports.readDecisionHeading = readDecisionHeading;
42
+ exports.derivePromptView = derivePromptView;
43
+ exports.readPromptView = readPromptView;
44
+ /**
45
+ * `promptData.type` for a frame nothing could classify. Same value as
46
+ * `UNCLASSIFIED_PROMPT_TYPE` in `types/models`, restated because this module may
47
+ * not import it (see the module note); the test asserts the two are equal.
48
+ */
49
+ exports.UNCLASSIFIED_PROMPT_VIEW_TYPE = 'unclassified';
50
+ function promptHeadingMessage(heading) {
51
+ switch (heading.kind) {
52
+ case 'question':
53
+ return { text: heading.text };
54
+ case 'approval':
55
+ return heading.toolName
56
+ ? { key: 'structuredApprovalTitle', values: { toolName: heading.toolName } }
57
+ : { key: 'structuredApprovalTitleNoTool' };
58
+ case 'agent-question':
59
+ return { key: 'structuredQuestionTitle' };
60
+ case 'unreadable':
61
+ return { key: 'unclassifiedTitle' };
62
+ }
63
+ }
64
+ // =============================================================================
65
+ // Field readers (moved from components/worktree/prompt-decision-id, #1932/#2039/#3181)
66
+ // =============================================================================
67
+ /**
68
+ * The option labels measured to be a text field on screen (Issue #2573).
69
+ * Restated from `TYPED_TEXT_FIELD_LABEL_PATTERNS` in
70
+ * `lib/detection/prompt-detect-multiple-choice`, whose graph reaches `fs`.
71
+ */
72
+ exports.TYPED_TEXT_FIELD_LABEL_PATTERNS = [
73
+ /^[^\S\n]*type\s+something\b/i,
74
+ ];
75
+ /**
76
+ * Whether an option is a text field on screen, so its answer is the typed TEXT
77
+ * rather than its number (Issue #2573). `requiresTextInput` alone is also true
78
+ * for a menu row such as `No, tell Command Code what to do differently`.
79
+ */
80
+ function optionTakesTypedText(option) {
81
+ return option.requiresTextInput === true
82
+ && exports.TYPED_TEXT_FIELD_LABEL_PATTERNS.some((pattern) => pattern.test(option.label));
83
+ }
84
+ /**
85
+ * The decision id a payload names, or null (Issue #1932). A validating read:
86
+ * absent, empty or not a string is "no addressable decision".
87
+ */
88
+ function readDecisionId(source) {
89
+ if (!source)
90
+ return null;
91
+ const candidate = source.decisionId;
92
+ return typeof candidate === 'string' && candidate !== '' ? candidate : null;
93
+ }
94
+ function hasDecisionOptions(source) {
95
+ return Array.isArray(source.decisionOptions) && source.decisionOptions.length > 0;
96
+ }
97
+ /**
98
+ * The choices a question offers when it may be answered over the API, or null
99
+ * (Issue #2039). All three must hold: a decision id, exactly one question with
100
+ * a complete label list, and NO approval verdicts on the same payload.
101
+ */
102
+ function readQuestionChoices(source) {
103
+ if (!source || readDecisionId(source) === null)
104
+ return null;
105
+ if (hasDecisionOptions(source))
106
+ return null;
107
+ const asked = source.askUserQuestion;
108
+ if (!asked || typeof asked.question !== 'string' || asked.question === '')
109
+ return null;
110
+ if (!Array.isArray(asked.labels) || asked.labels.length === 0)
111
+ return null;
112
+ const labels = asked.labels.filter((label) => typeof label === 'string' && label !== '');
113
+ // Partial is worse than none: the numbers are positions in this list.
114
+ if (labels.length !== asked.labels.length)
115
+ return null;
116
+ const questionCount = typeof asked.questionCount === 'number' ? asked.questionCount : 1;
117
+ if (questionCount !== 1)
118
+ return null;
119
+ return {
120
+ question: asked.question,
121
+ labels,
122
+ questionCount,
123
+ ...(asked.custom === true ? { custom: true } : {}),
124
+ };
125
+ }
126
+ /** The heading for addressable choices, or null when there is nothing to click (#3181). */
127
+ function readDecisionHeading(source) {
128
+ if (!source || readDecisionId(source) === null)
129
+ return null;
130
+ if (hasDecisionOptions(source)) {
131
+ return {
132
+ kind: 'approval',
133
+ toolName: typeof source.toolName === 'string' && source.toolName ? source.toolName : null,
134
+ };
135
+ }
136
+ return readQuestionChoices(source) ? { kind: 'question' } : null;
137
+ }
138
+ // =============================================================================
139
+ // The view
140
+ // =============================================================================
141
+ function screenChoices(source) {
142
+ const options = Array.isArray(source.options) ? source.options : [];
143
+ const choices = [];
144
+ for (const option of options) {
145
+ if (typeof option === 'string') {
146
+ // yes_no: `['yes', 'no']`, answered by the word itself.
147
+ choices.push({
148
+ answer: option,
149
+ label: option,
150
+ isDefault: source.defaultOption === option,
151
+ takesText: false,
152
+ });
153
+ continue;
154
+ }
155
+ if (!option || typeof option !== 'object')
156
+ continue;
157
+ const o = option;
158
+ if (typeof o.number !== 'number' || typeof o.label !== 'string')
159
+ continue;
160
+ choices.push({
161
+ answer: String(o.number),
162
+ label: o.label,
163
+ isDefault: o.isDefault === true,
164
+ takesText: optionTakesTypedText({ label: o.label, requiresTextInput: o.requiresTextInput === true }),
165
+ ...(typeof o.description === 'string' ? { description: o.description } : {}),
166
+ });
167
+ }
168
+ return choices;
169
+ }
170
+ function decisionChoices(decisionOptions) {
171
+ if (!Array.isArray(decisionOptions))
172
+ return [];
173
+ const choices = [];
174
+ for (const option of decisionOptions) {
175
+ const o = option;
176
+ if (!o || typeof o.number !== 'number' || typeof o.label !== 'string')
177
+ continue;
178
+ choices.push({ answer: String(o.number), label: o.label, isDefault: false, takesText: false });
179
+ }
180
+ return choices;
181
+ }
182
+ const UNREADABLE_VIEW = {
183
+ kind: 'unreadable',
184
+ heading: { kind: 'unreadable' },
185
+ choices: [],
186
+ multiSelect: false,
187
+ freeText: null,
188
+ decisionId: null,
189
+ apiTarget: null,
190
+ };
191
+ /**
192
+ * Decide how a prompt payload is shown and answered (Issue #3184).
193
+ *
194
+ * Evaluated in this order (design §2.3):
195
+ * 1. any `type` but the unclassified sentinel → `screen-choices`;
196
+ * 2. unclassified + decision id + approval verdicts → `api-choices` (approval);
197
+ * 3. unclassified + decision id + one complete question → `api-choices` (question);
198
+ * 4. every other unclassified payload — no id, #1932's options-without-id half
199
+ * state, and both stored history records — → `unreadable`.
200
+ *
201
+ * @param source - A live or stored prompt payload, or null
202
+ * @returns The view, or null when there is no prompt
203
+ */
204
+ function derivePromptView(source) {
205
+ if (source == null)
206
+ return null;
207
+ if (source.type !== exports.UNCLASSIFIED_PROMPT_VIEW_TYPE) {
208
+ const choices = screenChoices(source);
209
+ return {
210
+ kind: 'screen-choices',
211
+ heading: { kind: 'question', text: typeof source.question === 'string' ? source.question : '' },
212
+ choices,
213
+ multiSelect: source.multiSelect === true,
214
+ freeText: choices.some((choice) => choice.takesText) ? { via: 'screen' } : null,
215
+ decisionId: null,
216
+ apiTarget: null,
217
+ };
218
+ }
219
+ const decisionId = readDecisionId(source);
220
+ if (decisionId !== null && hasDecisionOptions(source)) {
221
+ const choices = decisionChoices(source.decisionOptions);
222
+ if (choices.length > 0) {
223
+ return {
224
+ kind: 'api-choices',
225
+ heading: {
226
+ kind: 'approval',
227
+ toolName: typeof source.toolName === 'string' && source.toolName ? source.toolName : null,
228
+ },
229
+ choices,
230
+ multiSelect: false,
231
+ freeText: null,
232
+ decisionId,
233
+ apiTarget: 'approval',
234
+ };
235
+ }
236
+ }
237
+ const question = readQuestionChoices(source);
238
+ if (decisionId !== null && question !== null) {
239
+ return {
240
+ kind: 'api-choices',
241
+ heading: { kind: 'agent-question', text: question.question },
242
+ choices: question.labels.map((label, index) => ({
243
+ answer: String(index + 1),
244
+ label,
245
+ isDefault: false,
246
+ takesText: false,
247
+ })),
248
+ multiSelect: false,
249
+ freeText: question.custom === true ? { via: 'api' } : null,
250
+ decisionId,
251
+ apiTarget: 'question',
252
+ };
253
+ }
254
+ return UNREADABLE_VIEW;
255
+ }
256
+ /**
257
+ * The view a `current-output` payload carries, falling back to deriving it.
258
+ *
259
+ * `??`, not `||`: a server from before #3184 sends no `promptView`, and its
260
+ * absence means "this daemon does not publish the field" — the same function
261
+ * then decides from `promptData`, so old and new servers reach the same answer.
262
+ */
263
+ function readPromptView(payload) {
264
+ if (!payload)
265
+ return null;
266
+ return payload.promptView ?? derivePromptView(payload.promptData);
267
+ }
@@ -33,11 +33,45 @@
33
33
  */
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
35
  exports.STRUCTURED_SEND_GUARD_ENV = exports.STRUCTURED_SEND_BLOCK_MAX_AGE_MS = void 0;
36
+ exports.isApiAnswerableStructuredWait = isApiAnswerableStructuredWait;
37
+ exports.isApiAnswerableWaitNow = isApiAnswerableWaitNow;
36
38
  exports.structuredWaitingReason = structuredWaitingReason;
37
39
  exports.resolvePromptWaiting = resolvePromptWaiting;
38
40
  exports.peekPromptWaiting = peekPromptWaiting;
39
41
  const agent_event_state_1 = require("../../lib/session/agent-event-state");
40
42
  const status_mapping_1 = require("../../lib/session/status-mapping");
43
+ const structured_prompt_1 = require("../../lib/session/structured-prompt");
44
+ /**
45
+ * Whether a structured wait is one the app answers over the agent's own API
46
+ * (Issue #3184, design §6-2).
47
+ *
48
+ * The same three conjuncts `current-output-builder` requires before it
49
+ * publishes a `decisionId` on the live payload (its `addressableDecisionId`):
50
+ * the record came from `Notification(permission_prompt)` rather than being a
51
+ * `permission-request` forecast, the tool's event source names each decision
52
+ * by id (`eventIdentity: 'permission-id'`), and the record carries such an id.
53
+ * That is exactly when `derivePromptView` reads the payload as `api-choices` —
54
+ * an approval or a question the panel draws buttons for — so the waiting kind
55
+ * published beside it says `prompt` too, instead of the scraper's `menu` /
56
+ * `unclassified` and the push body's "check the terminal".
57
+ *
58
+ * @param structured - The structured record, or null
59
+ * @param eventIdentity - `capabilities.eventIdentity` of the tool's event source
60
+ */
61
+ function isApiAnswerableStructuredWait(structured, eventIdentity) {
62
+ return (structured !== null &&
63
+ structured.source === 'notification' &&
64
+ eventIdentity === 'permission-id' &&
65
+ (0, structured_prompt_1.isAddressableDecision)(structured.decisionId));
66
+ }
67
+ /**
68
+ * {@link isApiAnswerableStructuredWait} for the record as it stands now — a
69
+ * read, like {@link peekPromptWaiting}: nothing is released or corroborated.
70
+ * Kept here so the structured record is still read in this one module (#1737).
71
+ */
72
+ function isApiAnswerableWaitNow(worktreeId, cliToolId, instanceId, eventIdentity) {
73
+ return isApiAnswerableStructuredWait((0, agent_event_state_1.getStructuredPromptWaiting)(worktreeId, cliToolId, instanceId), eventIdentity);
74
+ }
41
75
  /**
42
76
  * How long a structured-only dialog may keep refusing sends (Issue #1737).
43
77
  *