commandmate 0.47.0 → 0.48.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 (696) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +501 -501
  3. package/.next/app-path-routes-manifest.json +34 -34
  4. package/.next/build-manifest.json +8 -8
  5. package/.next/diagnostics/framework.json +1 -1
  6. package/.next/next-minimal-server.js.nft.json +1 -1
  7. package/.next/next-server.js.nft.json +1 -1
  8. package/.next/prerender-manifest.json +12 -12
  9. package/.next/react-loadable-manifest.json +1 -1
  10. package/.next/required-server-files.json +1 -1
  11. package/.next/server/app/_not-found/page.js +2 -2
  12. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  13. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/agents/update/route.js +2 -2
  15. package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
  16. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/agents/versions/route.js +1 -1
  18. package/.next/server/app/api/agents/versions/route.js.nft.json +1 -1
  19. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/app/release-notes/route.js +1 -1
  21. package/.next/server/app/api/app/release-notes/route.js.nft.json +1 -1
  22. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/app/update/route.js +5 -5
  24. package/.next/server/app/api/app/update/route.js.nft.json +1 -1
  25. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/app/update-check/route.js +1 -1
  27. package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
  28. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/auth/login/route.js +1 -1
  30. package/.next/server/app/api/auth/login/route.js.nft.json +1 -1
  31. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/auth/logout/route.js +1 -1
  33. package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  34. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/auth/status/route.js +1 -1
  36. package/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  37. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/capabilities/route.js +1 -1
  39. package/.next/server/app/api/capabilities/route.js.nft.json +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 +2 -2
  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 +2 -2
  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.js +1 -1
  75. package/.next/server/app/api/ollama/models/route.js.nft.json +1 -1
  76. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/push/escalation/route.js +1 -1
  78. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  79. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  81. package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
  82. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/push/vapid/route.js +1 -1
  84. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  85. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  87. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  88. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/relays/route.js +1 -1
  90. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  91. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/remote/pair/route.js +2 -2
  93. package/.next/server/app/api/remote/pair/route.js.nft.json +1 -1
  94. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  96. package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  97. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  99. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  100. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/repositories/clone/route.js +1 -1
  102. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  103. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/repositories/excluded/route.js +1 -1
  105. package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
  106. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/repositories/restore/route.js +1 -1
  108. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  109. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/repositories/route.js +1 -1
  111. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  112. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/repositories/scan/route.js +1 -1
  114. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  115. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/repositories/sync/route.js +1 -1
  117. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  118. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/repositories/validate-path/route.js +1 -1
  120. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  121. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  123. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  124. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/settings/default-surface-mode/route.js +1 -1
  126. package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -1
  127. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/sidebar/group-order/route.js +1 -1
  129. package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
  130. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/skills/[id]/route.js +1 -1
  132. package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
  133. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/skills/installations/route.js +1 -1
  135. package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
  136. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/skills/operations/route.js +2 -2
  138. package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
  139. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/skills/reindex/route.js +1 -1
  141. package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
  142. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/skills/route.js +1 -1
  144. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  145. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/slash-commands/route.js +1 -1
  147. package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
  148. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/tasks/[taskId]/cancel/route.js +1 -1
  150. package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
  151. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  153. package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
  154. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/templates/[id]/route.js +1 -1
  156. package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
  157. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/templates/route.js +1 -1
  159. package/.next/server/app/api/templates/route.js.nft.json +1 -1
  160. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  162. package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
  163. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/verification/runs/route.js +1 -1
  165. package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
  166. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  169. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  172. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  175. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
  181. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +7 -7
  183. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/env/route.js +2 -2
  192. package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -3
  198. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  205. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  208. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  214. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  217. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  229. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  235. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  238. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  244. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  247. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  250. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  253. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  256. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  259. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  262. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  265. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  268. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  271. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js.nft.json +1 -1
  274. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  275. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  276. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  277. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  279. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  280. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  281. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  282. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  283. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  284. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  285. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  286. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  287. package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
  288. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  289. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  290. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +3 -3
  291. package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
  292. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  293. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  294. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
  295. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  296. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  297. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
  298. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  299. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  300. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
  301. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  302. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  303. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
  304. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  305. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  306. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  307. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  308. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  309. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  310. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  311. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  312. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  313. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  314. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  315. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  316. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  317. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  318. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
  319. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  320. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  321. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  322. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  323. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  324. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  325. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  326. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  327. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  328. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  329. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  330. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  331. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  332. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  333. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  334. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  335. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  336. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  337. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  338. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  339. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  340. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  341. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +5 -5
  342. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  343. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  344. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  345. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  346. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  347. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  348. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  349. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  350. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  351. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  352. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  353. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  354. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  355. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  356. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
  357. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
  358. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  359. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  360. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
  361. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  362. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  363. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
  364. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  365. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  366. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  367. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  368. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  369. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  370. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  371. package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
  372. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
  373. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  374. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
  375. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  376. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  377. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  378. package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
  379. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  380. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  381. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  382. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  383. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  384. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  385. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  386. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  387. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  388. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  389. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  390. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  391. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  392. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  393. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  394. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  395. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  396. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  397. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  398. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +2 -2
  399. package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -1
  400. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  401. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  402. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  403. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  404. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  405. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  406. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  407. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  408. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
  409. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  410. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  411. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
  412. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  413. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  414. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
  415. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  416. package/.next/server/app/api/worktrees/apply-default-agents/route.js +1 -1
  417. package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +1 -1
  418. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  419. package/.next/server/app/api/worktrees/route.js +1 -1
  420. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  421. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  422. package/.next/server/app/apple-icon.png/route.js +1 -1
  423. package/.next/server/app/apple-icon.png/route.js.nft.json +1 -1
  424. package/.next/server/app/apple-icon.png.meta +1 -1
  425. package/.next/server/app/icon.png/route.js +1 -1
  426. package/.next/server/app/icon.png/route.js.nft.json +1 -1
  427. package/.next/server/app/icon.png.meta +1 -1
  428. package/.next/server/app/icon1.png/route.js +1 -1
  429. package/.next/server/app/icon1.png/route.js.nft.json +1 -1
  430. package/.next/server/app/icon1.png.meta +1 -1
  431. package/.next/server/app/icon2.png/route.js +1 -1
  432. package/.next/server/app/icon2.png/route.js.nft.json +1 -1
  433. package/.next/server/app/icon2.png.meta +1 -1
  434. package/.next/server/app/login/page.js +2 -2
  435. package/.next/server/app/login/page.js.nft.json +1 -1
  436. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  437. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  438. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  439. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  440. package/.next/server/app/manifest.webmanifest.meta +1 -1
  441. package/.next/server/app/more/page.js +2 -2
  442. package/.next/server/app/more/page.js.nft.json +1 -1
  443. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  444. package/.next/server/app/offline/page.js +2 -2
  445. package/.next/server/app/offline/page.js.nft.json +1 -1
  446. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  447. package/.next/server/app/page.js +2 -2
  448. package/.next/server/app/page.js.nft.json +1 -1
  449. package/.next/server/app/page_client-reference-manifest.js +1 -1
  450. package/.next/server/app/proxy/[...path]/route.js +1 -1
  451. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
  452. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  453. package/.next/server/app/repositories/page.js +2 -2
  454. package/.next/server/app/repositories/page.js.nft.json +1 -1
  455. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  456. package/.next/server/app/review/page.js +2 -2
  457. package/.next/server/app/review/page.js.nft.json +1 -1
  458. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  459. package/.next/server/app/sessions/page.js +2 -2
  460. package/.next/server/app/sessions/page.js.nft.json +1 -1
  461. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  462. package/.next/server/app/skills/[skillId]/page.js +2 -2
  463. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  464. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  465. package/.next/server/app/skills/installed/page.js +2 -2
  466. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  467. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  468. package/.next/server/app/skills/page.js +2 -2
  469. package/.next/server/app/skills/page.js.nft.json +1 -1
  470. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  471. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  472. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  473. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  474. package/.next/server/app/worktrees/[id]/page.js +12 -12
  475. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  476. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  477. package/.next/server/app/worktrees/[id]/terminal/page.js +3 -3
  478. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  479. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  480. package/.next/server/app-paths-manifest.json +34 -34
  481. package/.next/server/chunks/{5048.js → 1185.js} +1 -1
  482. package/.next/server/chunks/1191.js +11 -4
  483. package/.next/server/chunks/1501.js +1 -1
  484. package/.next/server/chunks/1601.js +2 -2
  485. package/.next/server/chunks/1656.js +19 -0
  486. package/.next/server/chunks/1945.js +3 -3
  487. package/.next/server/chunks/1990.js +103 -0
  488. package/.next/server/chunks/2119.js +1 -1
  489. package/.next/server/chunks/2404.js +1 -1
  490. package/.next/server/chunks/2422.js +1 -1
  491. package/.next/server/chunks/2445.js +1 -1
  492. package/.next/server/chunks/2534.js +1 -1
  493. package/.next/server/chunks/255.js +1 -0
  494. package/.next/server/chunks/3241.js +1 -1
  495. package/.next/server/chunks/3505.js +7 -0
  496. package/.next/server/chunks/3897.js +22 -0
  497. package/.next/server/chunks/4072.js +5 -5
  498. package/.next/server/chunks/4248.js +1 -1
  499. package/.next/server/chunks/4280.js +1 -0
  500. package/.next/server/chunks/463.js +1 -0
  501. package/.next/server/chunks/5209.js +1 -1
  502. package/.next/server/chunks/5611.js +1 -1
  503. package/.next/server/chunks/6119.js +1 -0
  504. package/.next/server/chunks/6130.js +1 -1
  505. package/.next/server/chunks/6345.js +1 -1
  506. package/.next/server/chunks/6401.js +1 -1
  507. package/.next/server/chunks/6486.js +9 -8
  508. package/.next/server/chunks/6781.js +1 -1
  509. package/.next/server/chunks/6784.js +1 -0
  510. package/.next/server/chunks/720.js +103 -0
  511. package/.next/server/chunks/7604.js +2 -0
  512. package/.next/server/chunks/7905.js +1 -1
  513. package/.next/server/chunks/8581.js +7 -7
  514. package/.next/server/chunks/8728.js +3 -3
  515. package/.next/server/chunks/8791.js +1 -1
  516. package/.next/server/chunks/8807.js +19 -18
  517. package/.next/server/chunks/8918.js +2 -104
  518. package/.next/server/chunks/9130.js +1 -1
  519. package/.next/server/chunks/936.js +1 -1
  520. package/.next/server/chunks/9390.js +1 -1
  521. package/.next/server/chunks/9540.js +1 -1
  522. package/.next/server/chunks/9627.js +4 -4
  523. package/.next/server/chunks/9731.js +3 -3
  524. package/.next/server/middleware-build-manifest.js +1 -1
  525. package/.next/server/middleware-manifest.json +5 -5
  526. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  527. package/.next/server/pages/500.html +1 -1
  528. package/.next/server/pages/_document.js.nft.json +1 -1
  529. package/.next/server/pages/_error.js +3 -3
  530. package/.next/server/pages/_error.js.nft.json +1 -1
  531. package/.next/server/server-reference-manifest.json +1 -1
  532. package/.next/server/src/middleware.js.map +1 -1
  533. package/.next/static/chunks/{1111.5ab4f0ffb0d944e5.js → 1111.1b653d4a9816a0a7.js} +8 -8
  534. package/.next/static/chunks/{1255-7e5873f06b25e129.js → 1255-a85690d352f4f8fd.js} +1 -1
  535. package/.next/static/chunks/2099-c3e0ab70a1b95dd3.js +1 -0
  536. package/.next/static/chunks/{2407-b2f524f99f7fc353.js → 2407-26139a8a2f1adbe8.js} +1 -1
  537. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  538. package/.next/static/chunks/{2863-6a07ec82fb52f4dd.js → 2863-f0121af1cbbedb3b.js} +1 -1
  539. package/.next/static/chunks/{8165-263172c17ae8e8c3.js → 8165-c68b3dc844210e6a.js} +1 -1
  540. package/.next/static/chunks/8407-35bbfc84793d7004.js +1 -0
  541. package/.next/static/chunks/9079-406b84d3cc891a87.js +1 -0
  542. package/.next/static/chunks/9465-b59bb255b376c813.js +1 -0
  543. package/.next/static/chunks/app/{layout-419eaf7de340f4ab.js → layout-46b4cbf07520d9b6.js} +1 -1
  544. package/.next/static/chunks/app/sessions/page-fb241bed579c67aa.js +1 -0
  545. package/.next/static/chunks/app/worktrees/[id]/page-cbc7749a33450cc5.js +1 -0
  546. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  547. package/.next/static/chunks/main-37ca13e38030fe8b.js +1 -0
  548. package/.next/static/chunks/{webpack-468b7b33030234b3.js → webpack-838df0273b03af19.js} +1 -1
  549. package/.next/trace +13 -13
  550. package/dist/cli/commands/auto-yes.d.ts +24 -0
  551. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  552. package/dist/cli/commands/auto-yes.js +73 -3
  553. package/dist/cli/commands/instances.d.ts.map +1 -1
  554. package/dist/cli/commands/instances.js +10 -1
  555. package/dist/cli/commands/prompt.d.ts.map +1 -1
  556. package/dist/cli/commands/prompt.js +28 -14
  557. package/dist/cli/commands/send.d.ts.map +1 -1
  558. package/dist/cli/commands/send.js +15 -0
  559. package/dist/cli/commands/wait.d.ts.map +1 -1
  560. package/dist/cli/commands/wait.js +108 -14
  561. package/dist/cli/docs/agent-operations.d.ts +2 -2
  562. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  563. package/dist/cli/docs/agent-operations.js +27 -0
  564. package/dist/cli/types/api-responses.d.ts +131 -4
  565. package/dist/cli/types/api-responses.d.ts.map +1 -1
  566. package/dist/cli/types/index.d.ts +4 -0
  567. package/dist/cli/types/index.d.ts.map +1 -1
  568. package/dist/cli/utils/resource-resolvers.d.ts +0 -18
  569. package/dist/cli/utils/resource-resolvers.d.ts.map +1 -1
  570. package/dist/cli/utils/resource-resolvers.js +1 -51
  571. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +65 -2
  572. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
  573. package/dist/lib/polling/auto-yes-suppression-reason.js +36 -2
  574. package/dist/lib/prompt-observation/types.d.ts +13 -0
  575. package/dist/lib/prompt-observation/types.d.ts.map +1 -1
  576. package/dist/server/locales/en/worktree.json +2 -1
  577. package/dist/server/locales/ja/worktree.json +2 -1
  578. package/dist/server/src/lib/auto-yes-poller-answer-target.js +38 -0
  579. package/dist/server/src/lib/auto-yes-poller-keys.js +35 -0
  580. package/dist/server/src/lib/auto-yes-poller-session-presence.js +26 -0
  581. package/dist/server/src/lib/auto-yes-poller-tick.js +233 -0
  582. package/dist/server/src/lib/auto-yes-poller.js +468 -792
  583. package/dist/server/src/lib/auto-yes-state.js +50 -2
  584. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +107 -14
  585. package/dist/server/src/lib/db/chat-db.js +5 -1
  586. package/dist/server/src/lib/db/verification-db.js +23 -2
  587. package/dist/server/src/lib/detection/option-recommendation.js +120 -0
  588. package/dist/server/src/lib/detection/prompt-detect-multiple-choice-approval-context.js +290 -0
  589. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +396 -268
  590. package/dist/server/src/lib/detection/prompt-detector.js +92 -21
  591. package/dist/server/src/lib/detection/prompt-screen-key.js +60 -0
  592. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +158 -35
  593. package/dist/server/src/lib/detection/tools/claude/detect.js +111 -10
  594. package/dist/server/src/lib/detection/tools/command-code/dialog.js +67 -0
  595. package/dist/server/src/lib/detection/tools/dialog-block.js +16 -0
  596. package/dist/server/src/lib/detection/waiting-screen-reading.js +98 -0
  597. package/dist/server/src/lib/hooks/permission-adjudication.js +26 -0
  598. package/dist/server/src/lib/hooks/permission-decision-service.js +49 -4
  599. package/dist/server/src/lib/hooks/permission-request-payload.js +20 -0
  600. package/dist/server/src/lib/hooks/sources/antigravity/source.js +21 -0
  601. package/dist/server/src/lib/hooks/sources/claude/source.js +3 -0
  602. package/dist/server/src/lib/hooks/sources/codex/source.js +2 -0
  603. package/dist/server/src/lib/hooks/sources/command-code/source.js +2 -0
  604. package/dist/server/src/lib/hooks/sources/copilot/source.js +2 -0
  605. package/dist/server/src/lib/hooks/sources/gemini/source.js +2 -0
  606. package/dist/server/src/lib/hooks/sources/legacy-relay.js +2 -0
  607. package/dist/server/src/lib/hooks/sources/opencode/ingest.js +6 -0
  608. package/dist/server/src/lib/hooks/sources/opencode/source.js +2 -0
  609. package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +6 -0
  610. package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +2 -0
  611. package/dist/server/src/lib/hooks/sources/pending-decisions.js +14 -2
  612. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +14 -3
  613. package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +21 -1
  614. package/dist/server/src/lib/polling/auto-yes-confirm-page.js +2 -2
  615. package/dist/server/src/lib/polling/auto-yes-confirmation-ledger-types.js +117 -0
  616. package/dist/server/src/lib/polling/auto-yes-confirmation-ledger.js +1091 -0
  617. package/dist/server/src/lib/polling/auto-yes-decision-state.js +195 -0
  618. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +139 -10
  619. package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +14 -0
  620. package/dist/server/src/lib/polling/auto-yes-ledger-records.js +143 -0
  621. package/dist/server/src/lib/polling/auto-yes-manual-answer.js +122 -0
  622. package/dist/server/src/lib/polling/auto-yes-option-effect.js +157 -0
  623. package/dist/server/src/lib/polling/auto-yes-policy.js +46 -11
  624. package/dist/server/src/lib/polling/auto-yes-poller-capture.js +63 -0
  625. package/dist/server/src/lib/polling/auto-yes-poller-enter-fallback.js +37 -0
  626. package/dist/server/src/lib/polling/auto-yes-poller-generation.js +192 -0
  627. package/dist/server/src/lib/polling/auto-yes-poller-receipt-log.js +324 -0
  628. package/dist/server/src/lib/polling/auto-yes-poller-state.js +193 -26
  629. package/dist/server/src/lib/polling/auto-yes-poller-steps.js +279 -0
  630. package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +13 -2
  631. package/dist/server/src/lib/polling/auto-yes-question-choice.js +57 -0
  632. package/dist/server/src/lib/polling/auto-yes-resolver.js +117 -22
  633. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +36 -2
  634. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +25 -1
  635. package/dist/server/src/lib/polling/prompt-screen-reading.js +232 -0
  636. package/dist/server/src/lib/polling/response-checker-blank-response.js +30 -0
  637. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +39 -0
  638. package/dist/server/src/lib/polling/response-checker.js +138 -53
  639. package/dist/server/src/lib/prompt-answer-sender.js +104 -10
  640. package/dist/server/src/lib/prompt-observation/appearance.js +165 -0
  641. package/dist/server/src/lib/push/notification-dedup.js +15 -2
  642. package/dist/server/src/lib/push/prompt-card-state.js +140 -19
  643. package/dist/server/src/lib/push/prompt-push-gate.js +158 -12
  644. package/dist/server/src/lib/push/push-sender.js +23 -3
  645. package/dist/server/src/lib/push/resolution-push-notifier.js +14 -0
  646. package/dist/server/src/lib/push/waiting-push-notifier.js +139 -17
  647. package/dist/server/src/lib/realtime/terminal-broadcast.js +16 -0
  648. package/dist/server/src/lib/session/agent-event-state.js +25 -5
  649. package/dist/server/src/lib/session/agent-event-turn.js +140 -46
  650. package/dist/server/src/lib/session/cli-session.js +21 -2
  651. package/dist/server/src/lib/session/current-output-builder.js +64 -11
  652. package/dist/server/src/lib/session/send-attempt-state.js +23 -7
  653. package/dist/server/src/lib/session/waiting-episode-binding-observation.js +289 -0
  654. package/dist/server/src/lib/session/waiting-episode-binding-resolve.js +38 -0
  655. package/dist/server/src/lib/session/waiting-episode-binding.js +276 -0
  656. package/dist/server/src/lib/session/waiting-episode-state.js +307 -17
  657. package/dist/server/src/lib/session/waiting-episode-verdict.js +174 -0
  658. package/dist/server/src/lib/tmux/tmux-capture-cache.js +76 -11
  659. package/dist/server/src/lib/tmux/tmux.js +54 -9
  660. package/dist/server/src/lib/verification/gate-runner.js +162 -13
  661. package/dist/server/src/lib/verification/machine-lock.js +5 -0
  662. package/dist/server/src/lib/ws-server.js +18 -3
  663. package/dist/server/src/types/auto-yes-answer-mode.js +38 -0
  664. package/dist/server/src/types/auto-yes-decision.js +61 -0
  665. package/dist/server/src/types/auto-yes.js +6 -0
  666. package/dist/server/src/types/prompt-reading.js +32 -0
  667. package/dist/types/auto-yes-answer-mode.d.ts +35 -0
  668. package/dist/types/auto-yes-answer-mode.d.ts.map +1 -0
  669. package/dist/types/auto-yes-answer-mode.js +38 -0
  670. package/docs/en/user-guide/webapp-guide.md +33 -4
  671. package/package.json +2 -2
  672. package/public/sw.js +76 -4
  673. package/release-notes/0.47.1.json +20 -0
  674. package/release-notes/0.47.2.json +20 -0
  675. package/release-notes/0.48.0.json +57 -0
  676. package/scripts/hooks/cmate-agent-event.sh +22 -0
  677. package/.next/server/chunks/1331.js +0 -22
  678. package/.next/server/chunks/1559.js +0 -2
  679. package/.next/server/chunks/1836.js +0 -1
  680. package/.next/server/chunks/1944.js +0 -1
  681. package/.next/server/chunks/2328.js +0 -1
  682. package/.next/server/chunks/2460.js +0 -1
  683. package/.next/server/chunks/5292.js +0 -7
  684. package/.next/server/chunks/5595.js +0 -1
  685. package/.next/server/chunks/7166.js +0 -19
  686. package/.next/server/chunks/9051.js +0 -1
  687. package/.next/server/chunks/9199.js +0 -1
  688. package/.next/static/chunks/602-1c1488959215e140.js +0 -1
  689. package/.next/static/chunks/8407-155f84e5ba05f1d5.js +0 -1
  690. package/.next/static/chunks/9079-24f9fa549ed298f1.js +0 -1
  691. package/.next/static/chunks/9465-e5a351baa941f31b.js +0 -1
  692. package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +0 -1
  693. package/.next/static/chunks/app/worktrees/[id]/page-45294052ee3032f1.js +0 -1
  694. package/.next/static/chunks/main-ac91ed6e71380841.js +0 -1
  695. /package/.next/static/{b5BiQC9F6r_XFPdA9cuSj → PTlAswXLq8PAe2vUJ8dVP}/_buildManifest.js +0 -0
  696. /package/.next/static/{b5BiQC9F6r_XFPdA9cuSj → PTlAswXLq8PAe2vUJ8dVP}/_ssgManifest.js +0 -0
@@ -0,0 +1,1091 @@
1
+ "use strict";
2
+ /**
3
+ * The Auto-Yes confirmation ledger (Issue #3820): one record per confirmation —
4
+ * what Auto-Yes decided about it, each send and how it came back, how it went
5
+ * away — and the intervals Auto-Yes left it alone, written as structured log
6
+ * lines for agent-health's daily count (design
7
+ * `docs/design/auto-yes-measurement-3820.md`; PR 1: the screen path, PR 2: the
8
+ * hook route, the API adjudication and `/prompt-response`, PR 3: agy's call).
9
+ *
10
+ * ## Records, never decides
11
+ *
12
+ * Nothing in the poller reads this to choose what to do: every entry point is
13
+ * called after the poller decided, and none of them can throw. A failure here —
14
+ * the ledger's own or its logger's — is counted (`ledgerErrors` on the hourly
15
+ * `alive` line) and swallowed; the `catch` calls nothing that can throw in turn
16
+ * (design §8.1). What is promised is "an exception in the ledger never fails an
17
+ * answer", not that writing a line costs nothing: the logger writes to the
18
+ * console synchronously.
19
+ *
20
+ * ## Two axes (design §2.2)
21
+ *
22
+ * A confirmation is `present` or `unobservable` (the poller stopped: Auto-Yes
23
+ * off, expired, …) while it is open; it closes when a tick that read the screen
24
+ * did not see it (`gone`), or when the session it was on ended (`abandoned`).
25
+ * Whether Auto-Yes may answer it is the other axis: a withheld interval opens
26
+ * at the first withholding and runs, through reason changes, until an `ok`
27
+ * send, the confirmation going away, or the poller stopping. agy's receipt
28
+ * window flips the gated reading to `isPrompt: false` while the dialog stays
29
+ * up; the poller observes it from the ungated reading instead, so it stays one
30
+ * confirmation and one interval.
31
+ *
32
+ * ## The hook, the API and `/prompt-response` (design §2.3, §2.4, PR 2)
33
+ *
34
+ * A hook request is its own record, opened by the hook route only (the API
35
+ * adjudication never makes one) and closed when the reply is written; it holds
36
+ * no waiting time. An `allow` on a source whose allow draws no dialog is also
37
+ * the confirmation, opened and closed with the request. A screen confirmation
38
+ * opened soon after a request on the same instance carries that fact
39
+ * (`afterHookAllow` / `afterHookAbstain`), never the claim that it is the same
40
+ * call. An opencode approval is a confirmation keyed by its decision id, open
41
+ * until the reply settles it. A `/prompt-response` answer is a confirmation of
42
+ * its own, opened and closed with the request.
43
+ *
44
+ * ## agy's call (design §2.4, PR 3)
45
+ *
46
+ * agy's `PreToolUse` names its call (`callId`, `<conversationId>:<stepIdx>`).
47
+ * Its allow still draws the dialog, so the request opens no confirmation; the
48
+ * screen's confirmation is tied to the call when the receipt that let it
49
+ * through named one, and carries the request's id. It closes on whichever comes
50
+ * first: gone from the screen, or the call's `PostToolUse`. A call that ends
51
+ * with no confirmation ever tied to it gets a `dialogUnobserved` line on its
52
+ * request — not observed, never "no dialog". A "No" sends no `PostToolUse`, so
53
+ * that confirmation closes only by going from the screen.
54
+ *
55
+ * ## State
56
+ *
57
+ * One `globalThis` object (`bootId`, the entries, the counters, the clock), so
58
+ * a second bundle or a hot reload continues the same `bootId` and the same
59
+ * sequence; only a new process starts another (design §3.3, recommendation 7).
60
+ * The hourly clock (`alive` and `checkpoint` lines on the UTC hour grid) is
61
+ * armed the first time the ledger is used — `server.ts` is not touched — and is
62
+ * `unref`ed so it never holds the process open.
63
+ *
64
+ * Server only (logger, `node:crypto`). Must not import `auto-yes-poller.ts`.
65
+ *
66
+ * @module lib/polling/auto-yes-confirmation-ledger
67
+ */
68
+ Object.defineProperty(exports, "__esModule", { value: true });
69
+ exports.AUTO_YES_LEDGER_UNOBSERVABLE_TIMEOUT_MS = exports.AUTO_YES_LEDGER_RECORDED_PATHS = exports.AUTO_YES_LEDGER_MAX_OPEN_TOTAL = exports.AUTO_YES_LEDGER_MAX_OPEN_PER_INSTANCE = exports.AUTO_YES_LEDGER_HOOK_LINK_WINDOW_MS = exports.AUTO_YES_LEDGER_CLOCK_MS = void 0;
70
+ exports.beginLedgerTick = beginLedgerTick;
71
+ exports.endLedgerTick = endLedgerTick;
72
+ exports.observeLedgerScreen = observeLedgerScreen;
73
+ exports.withholdLedgerConfirmation = withholdLedgerConfirmation;
74
+ exports.beginLedgerAttempt = beginLedgerAttempt;
75
+ exports.settleLedgerAttempt = settleLedgerAttempt;
76
+ exports.noteLedgerPollerStopped = noteLedgerPollerStopped;
77
+ exports.noteLedgerWorktreeStopped = noteLedgerWorktreeStopped;
78
+ exports.beginLedgerHookRequest = beginLedgerHookRequest;
79
+ exports.decideLedgerHookRequest = decideLedgerHookRequest;
80
+ exports.closeLedgerHookRequest = closeLedgerHookRequest;
81
+ exports.noteLedgerToolCallEnded = noteLedgerToolCallEnded;
82
+ exports.observeLedgerCliMode = observeLedgerCliMode;
83
+ exports.recordLedgerApiAdjudication = recordLedgerApiAdjudication;
84
+ exports.beginLedgerApiAdjudication = beginLedgerApiAdjudication;
85
+ exports.settleLedgerApiAdjudication = settleLedgerApiAdjudication;
86
+ exports.noteLedgerApiDecisionReplied = noteLedgerApiDecisionReplied;
87
+ exports.recordLedgerPromptResponse = recordLedgerPromptResponse;
88
+ exports.runAutoYesLedgerHourForTests = runAutoYesLedgerHourForTests;
89
+ exports.resetAutoYesConfirmationLedgerForTests = resetAutoYesConfirmationLedgerForTests;
90
+ exports.setAutoYesLedgerFaultForTests = setAutoYesLedgerFaultForTests;
91
+ exports.setAutoYesLedgerClockTimersForTests = setAutoYesLedgerClockTimersForTests;
92
+ exports.getAutoYesLedgerErrorCountForTests = getAutoYesLedgerErrorCountForTests;
93
+ const node_crypto_1 = require("node:crypto");
94
+ const auto_yes_state_1 = require("../auto-yes-state");
95
+ const global_state_1 = require("../global-state");
96
+ const auto_yes_enter_fallback_state_1 = require("./auto-yes-enter-fallback-state");
97
+ const auto_yes_confirmation_ledger_types_1 = require("./auto-yes-confirmation-ledger-types");
98
+ const auto_yes_ledger_records_1 = require("./auto-yes-ledger-records");
99
+ Object.defineProperty(exports, "AUTO_YES_LEDGER_CLOCK_MS", { enumerable: true, get: function () { return auto_yes_ledger_records_1.AUTO_YES_LEDGER_CLOCK_MS; } });
100
+ Object.defineProperty(exports, "AUTO_YES_LEDGER_HOOK_LINK_WINDOW_MS", { enumerable: true, get: function () { return auto_yes_ledger_records_1.AUTO_YES_LEDGER_HOOK_LINK_WINDOW_MS; } });
101
+ Object.defineProperty(exports, "AUTO_YES_LEDGER_MAX_OPEN_PER_INSTANCE", { enumerable: true, get: function () { return auto_yes_ledger_records_1.AUTO_YES_LEDGER_MAX_OPEN_PER_INSTANCE; } });
102
+ Object.defineProperty(exports, "AUTO_YES_LEDGER_MAX_OPEN_TOTAL", { enumerable: true, get: function () { return auto_yes_ledger_records_1.AUTO_YES_LEDGER_MAX_OPEN_TOTAL; } });
103
+ Object.defineProperty(exports, "AUTO_YES_LEDGER_RECORDED_PATHS", { enumerable: true, get: function () { return auto_yes_ledger_records_1.AUTO_YES_LEDGER_RECORDED_PATHS; } });
104
+ Object.defineProperty(exports, "AUTO_YES_LEDGER_UNOBSERVABLE_TIMEOUT_MS", { enumerable: true, get: function () { return auto_yes_ledger_records_1.AUTO_YES_LEDGER_UNOBSERVABLE_TIMEOUT_MS; } });
105
+ /**
106
+ * The clock's timers, taken when the module loads. The hourly clock is not one
107
+ * of the poller's timers, so a test that fakes timers around the poller (and
108
+ * counts them) neither sees nor runs it. Tests of the clock itself replace them
109
+ * with {@link setAutoYesLedgerClockTimersForTests}.
110
+ */
111
+ const loadedClockTimers = {
112
+ setTimeout: globalThis.setTimeout.bind(globalThis),
113
+ clearTimeout: globalThis.clearTimeout.bind(globalThis),
114
+ };
115
+ let clockTimers = loadedClockTimers;
116
+ /** Test seam: when set, every entry point fails as if its body had thrown. */
117
+ let injectedFault = null;
118
+ function ledgerState() {
119
+ const existing = globalThis.__autoYesConfirmationLedger;
120
+ if (existing !== undefined)
121
+ return existing;
122
+ const state = (0, global_state_1.getOrInitGlobal)('__autoYesConfirmationLedger', () => {
123
+ const startedAt = Date.now();
124
+ return {
125
+ bootId: (0, node_crypto_1.randomUUID)().slice(0, 8),
126
+ startedAt,
127
+ nextConfirmation: 0,
128
+ entries: new Map(),
129
+ apiDecisions: new Map(),
130
+ nextHookRequest: 0,
131
+ hookRequests: new Map(),
132
+ lastHookRequest: new Map(),
133
+ cliModes: new Map(),
134
+ current: new Map(),
135
+ ticks: new Map(),
136
+ nextTick: 0,
137
+ pending: new Map(),
138
+ calls: new Map(),
139
+ endedCalls: new Map(),
140
+ errors: 0,
141
+ lastAliveAt: null,
142
+ clock: null,
143
+ };
144
+ });
145
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.started, {
146
+ atMs: state.startedAt,
147
+ logLevel: (0, auto_yes_ledger_records_1.currentLogLevel)(),
148
+ paths: [...auto_yes_ledger_records_1.AUTO_YES_LEDGER_RECORDED_PATHS],
149
+ });
150
+ return state;
151
+ }
152
+ /**
153
+ * Run `body` on the ledger's state, arming the clock first. Whatever throws —
154
+ * the body, the state, the clock — is counted and `fallback` returned; the
155
+ * counting itself cannot throw.
156
+ */
157
+ function guarded(fallback, body) {
158
+ try {
159
+ if (injectedFault !== null)
160
+ throw injectedFault;
161
+ const state = ledgerState();
162
+ ensureClock(state);
163
+ return body(state, Date.now());
164
+ }
165
+ catch {
166
+ const state = globalThis.__autoYesConfirmationLedger;
167
+ if (state !== undefined)
168
+ state.errors += 1;
169
+ return fallback;
170
+ }
171
+ }
172
+ // =============================================================================
173
+ // The clock: `alive` and `checkpoint` lines on the UTC hour grid (design §4.3, §4.4)
174
+ // =============================================================================
175
+ function ensureClock(state) {
176
+ if (state.clock !== null)
177
+ return;
178
+ scheduleClock(state, Date.now());
179
+ }
180
+ function scheduleClock(state, now) {
181
+ const dueAt = (Math.floor(now / auto_yes_ledger_records_1.AUTO_YES_LEDGER_CLOCK_MS) + 1) * auto_yes_ledger_records_1.AUTO_YES_LEDGER_CLOCK_MS;
182
+ const clock = { timer: null, dueAt };
183
+ state.clock = clock;
184
+ const timer = clockTimers.setTimeout(() => onClock(clock), Math.max(0, dueAt - now));
185
+ timer.unref?.();
186
+ clock.timer = timer;
187
+ }
188
+ function onClock(clock) {
189
+ const state = globalThis.__autoYesConfirmationLedger;
190
+ // A reset (tests) or a newer clock replaced this one.
191
+ if (state === undefined || state.clock !== clock)
192
+ return;
193
+ state.clock = null;
194
+ try {
195
+ if (injectedFault !== null)
196
+ throw injectedFault;
197
+ runHour(state, clock.dueAt);
198
+ }
199
+ catch {
200
+ state.errors += 1;
201
+ }
202
+ try {
203
+ scheduleClock(state, Date.now());
204
+ }
205
+ catch {
206
+ state.errors += 1;
207
+ }
208
+ }
209
+ /**
210
+ * One hour boundary: let go of confirmations unobservable for too long, then
211
+ * the `alive` line and a `checkpoint` per open confirmation, all stamped `at`.
212
+ */
213
+ function runHour(state, at) {
214
+ for (const entry of [...state.entries.values()]) {
215
+ if (entry.presence === 'unobservable' &&
216
+ entry.unobservableSince !== null &&
217
+ at - entry.unobservableSince >= auto_yes_ledger_records_1.AUTO_YES_LEDGER_UNOBSERVABLE_TIMEOUT_MS) {
218
+ closeEntry(state, entry, at, { kind: 'abandoned', reason: 'unobservable-timeout' });
219
+ }
220
+ }
221
+ const segmentStart = state.lastAliveAt ?? state.startedAt;
222
+ state.lastAliveAt = at;
223
+ let openIntervals = 0;
224
+ for (const entry of state.entries.values())
225
+ if (entry.interval !== null)
226
+ openIntervals += 1;
227
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.alive, {
228
+ atMs: at,
229
+ logLevel: (0, auto_yes_ledger_records_1.currentLogLevel)(),
230
+ segments: auto_yes_ledger_records_1.AUTO_YES_LEDGER_RECORDED_PATHS.map((path) => ({ path, startMs: segmentStart, endMs: at })),
231
+ openConfirmations: state.entries.size,
232
+ openIntervals,
233
+ ledgerErrors: state.errors,
234
+ });
235
+ for (const entry of state.entries.values()) {
236
+ const interval = entry.interval;
237
+ const intervalMs = interval === null ? 0 : Math.max(0, at - interval.startedAt);
238
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.checkpoint, {
239
+ atMs: at,
240
+ confirmationId: entry.id,
241
+ cliToolId: entry.cliToolId,
242
+ source: entry.source,
243
+ presence: entry.presence,
244
+ answerability: interval === null ? 'answerable' : 'withheld',
245
+ withheldMsTotal: entry.withheldMsClosed + intervalMs,
246
+ // Issue #3863: the mode of the open interval, else of the last decision.
247
+ ...answerModeField(interval?.answerMode ?? entry.answerMode),
248
+ ...(interval !== null
249
+ ? { intervalId: interval.id, reason: interval.reason, intervalStartedAtMs: interval.startedAt, intervalMs }
250
+ : {}),
251
+ });
252
+ }
253
+ }
254
+ // =============================================================================
255
+ // Intervals and closing
256
+ // =============================================================================
257
+ /** Issue #3863: `{ answerMode }` when there is one, else nothing (the line keeps its old shape). */
258
+ function answerModeField(answerMode) {
259
+ return answerMode === undefined ? {} : { answerMode };
260
+ }
261
+ function withhold(state, entry, reason, now, answerMode = entry.answerMode) {
262
+ const interval = entry.interval;
263
+ if (interval === null) {
264
+ entry.intervals += 1;
265
+ const opened = {
266
+ id: `${entry.id}#${entry.intervals}`,
267
+ startedAt: now,
268
+ reason,
269
+ ...answerModeField(answerMode),
270
+ };
271
+ entry.interval = opened;
272
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.withholdStarted, {
273
+ atMs: now,
274
+ confirmationId: entry.id,
275
+ intervalId: opened.id,
276
+ cliToolId: entry.cliToolId,
277
+ source: entry.source,
278
+ reason,
279
+ startedAtMs: now,
280
+ ...answerModeField(answerMode),
281
+ });
282
+ return;
283
+ }
284
+ if (interval.reason === reason)
285
+ return;
286
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.withholdReasonChanged, {
287
+ atMs: now,
288
+ confirmationId: entry.id,
289
+ intervalId: interval.id,
290
+ cliToolId: entry.cliToolId,
291
+ source: entry.source,
292
+ from: interval.reason,
293
+ to: reason,
294
+ });
295
+ interval.reason = reason;
296
+ }
297
+ function endInterval(state, entry, end, now) {
298
+ const interval = entry.interval;
299
+ if (interval === null)
300
+ return;
301
+ entry.interval = null;
302
+ const withheldMs = Math.max(0, now - interval.startedAt);
303
+ entry.withheldMsClosed += withheldMs;
304
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.withholdEnded, {
305
+ atMs: now,
306
+ confirmationId: entry.id,
307
+ intervalId: interval.id,
308
+ cliToolId: entry.cliToolId,
309
+ source: entry.source,
310
+ startedAtMs: interval.startedAt,
311
+ endedAtMs: now,
312
+ withheldMs,
313
+ end,
314
+ lastReason: interval.reason,
315
+ ...answerModeField(interval.answerMode),
316
+ });
317
+ }
318
+ function closeEntry(state, entry, now, how) {
319
+ const wasUnobservable = entry.presence === 'unobservable';
320
+ if (wasUnobservable && entry.unobservableSince !== null) {
321
+ entry.unobservableMs += Math.max(0, now - entry.unobservableSince);
322
+ }
323
+ // Withheld only by the duplicate guard after an `ok`: the answer was landing.
324
+ const waitingForAnswer = entry.answered && entry.interval?.reason === 'answered-recently';
325
+ const withheldAtClose = entry.interval !== null && !waitingForAnswer;
326
+ endInterval(state, entry, how.kind === 'abandoned' ? 'abandoned' : 'gone', now);
327
+ let attemptsPending = 0;
328
+ for (const pending of state.pending.values())
329
+ if (pending.confirmationId === entry.id)
330
+ attemptsPending += 1;
331
+ const sent = entry.nextAttempt > 0;
332
+ let resolution;
333
+ if (how.kind === 'abandoned') {
334
+ resolution = sent ? 'unresolved-after-send' : 'abandoned';
335
+ }
336
+ else if (how.kind === 'reply') {
337
+ resolution = 'resolved-by-reply';
338
+ }
339
+ else if (wasUnobservable) {
340
+ resolution = 'gone-while-unobservable';
341
+ }
342
+ else if (withheldAtClose) {
343
+ resolution = 'resolved-while-withheld';
344
+ }
345
+ else if (entry.answered) {
346
+ resolution = 'resolved-after-answer';
347
+ }
348
+ else if (entry.intervals > 0) {
349
+ // Answered never, withheld once and since answerable again.
350
+ resolution = 'resolved-while-withheld';
351
+ }
352
+ else {
353
+ resolution = 'resolved-before-decision';
354
+ }
355
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.closed, {
356
+ atMs: now,
357
+ confirmationId: entry.id,
358
+ worktreeId: entry.worktreeId,
359
+ cliToolId: entry.cliToolId,
360
+ instanceId: entry.instanceId,
361
+ source: entry.source,
362
+ promptType: entry.promptType,
363
+ decision: entry.decision,
364
+ basis: entry.basis,
365
+ attempts: { ...entry.attempts },
366
+ attemptsPending,
367
+ answeredAtClose: entry.answered,
368
+ resolution,
369
+ // The screen path cannot tell Auto-Yes's keys from a human's; only a
370
+ // delivered reply that released it is known to be Auto-Yes's (design §2.6).
371
+ resolvedBy: how.kind === 'reply' ? 'auto' : how.kind === 'gone' ? (how.resolvedBy ?? 'unknown') : 'unknown',
372
+ // Issue #3863: the mode the last decision about it was made under, and
373
+ // the mode of the send that answered it (which a later decision does not move).
374
+ ...answerModeField(entry.answerMode),
375
+ ...(entry.answeredAnswerMode !== undefined ? { answeredAnswerMode: entry.answeredAnswerMode } : {}),
376
+ openMs: Math.max(0, now - entry.openedAt),
377
+ withheldMsTotal: entry.withheldMsClosed,
378
+ unobservableMs: entry.unobservableMs,
379
+ intervals: entry.intervals,
380
+ ...(how.kind === 'abandoned' ? { abandonReason: how.reason } : {}),
381
+ });
382
+ state.entries.delete(entry.id);
383
+ if (state.current.get(entry.compositeKey) === entry.id)
384
+ state.current.delete(entry.compositeKey);
385
+ if (entry.decisionKey !== undefined)
386
+ state.apiDecisions.delete(entry.decisionKey);
387
+ }
388
+ /** Open a confirmation and write its `opened` line; the caller indexes it. */
389
+ function openEntry(state, scope, compositeKey, fields, now, link = {}) {
390
+ makeRoom(state, compositeKey, now);
391
+ state.nextConfirmation += 1;
392
+ const opened = {
393
+ id: `${state.bootId}-${state.nextConfirmation}`,
394
+ compositeKey,
395
+ worktreeId: scope.worktreeId,
396
+ cliToolId: scope.cliToolId,
397
+ instanceId: scope.instanceId ?? scope.cliToolId,
398
+ source: fields.source,
399
+ screenKey: fields.screenKey,
400
+ ...(fields.decisionKey !== undefined ? { decisionKey: fields.decisionKey } : {}),
401
+ ...(link.callId !== undefined ? { callId: link.callId } : {}),
402
+ epoch: (0, auto_yes_enter_fallback_state_1.getEnterFallbackSessionEpoch)(compositeKey),
403
+ promptType: fields.promptType,
404
+ openedAt: now,
405
+ presence: 'present',
406
+ unobservableSince: null,
407
+ unobservableMs: 0,
408
+ decision: 'none',
409
+ basis: null,
410
+ interval: null,
411
+ intervals: 0,
412
+ withheldMsClosed: 0,
413
+ attempts: { ok: 0, partial: 0, noKeysSent: 0, failed: 0 },
414
+ nextAttempt: 0,
415
+ answered: false,
416
+ autoYesStopped: false,
417
+ observedTick: state.ticks.get(compositeKey) ?? 0,
418
+ };
419
+ state.entries.set(opened.id, opened);
420
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.opened, {
421
+ atMs: now,
422
+ confirmationId: opened.id,
423
+ worktreeId: opened.worktreeId,
424
+ cliToolId: opened.cliToolId,
425
+ instanceId: opened.instanceId,
426
+ source: opened.source,
427
+ promptType: opened.promptType,
428
+ ...link,
429
+ });
430
+ return opened;
431
+ }
432
+ function makeRoom(state, compositeKey, now) {
433
+ const ofInstance = [...state.entries.values()].filter((entry) => entry.compositeKey === compositeKey);
434
+ if (ofInstance.length >= auto_yes_ledger_records_1.AUTO_YES_LEDGER_MAX_OPEN_PER_INSTANCE) {
435
+ closeEntry(state, ofInstance[0], now, { kind: 'abandoned', reason: 'capacity' });
436
+ }
437
+ if (state.entries.size >= auto_yes_ledger_records_1.AUTO_YES_LEDGER_MAX_OPEN_TOTAL) {
438
+ const oldest = state.entries.values().next().value;
439
+ if (oldest !== undefined)
440
+ closeEntry(state, oldest, now, { kind: 'abandoned', reason: 'capacity' });
441
+ }
442
+ }
443
+ // =============================================================================
444
+ // The screen path (the poller)
445
+ // =============================================================================
446
+ /**
447
+ * A poller tick that has read the screen begins. A confirmation from another
448
+ * session of this instance (a relaunch the poller outlived) is abandoned.
449
+ *
450
+ * @returns The tick's token, for {@link endLedgerTick}
451
+ */
452
+ function beginLedgerTick(scope) {
453
+ return guarded(0, (state, now) => {
454
+ const compositeKey = (0, auto_yes_ledger_records_1.keyOf)(scope);
455
+ state.nextTick += 1;
456
+ const tick = state.nextTick;
457
+ state.ticks.set(compositeKey, tick);
458
+ const entry = (0, auto_yes_ledger_records_1.currentEntry)(state, compositeKey);
459
+ if (entry !== undefined && entry.epoch !== (0, auto_yes_enter_fallback_state_1.getEnterFallbackSessionEpoch)(compositeKey)) {
460
+ closeEntry(state, entry, now, { kind: 'abandoned', reason: 'session-epoch-changed' });
461
+ }
462
+ return tick;
463
+ });
464
+ }
465
+ /**
466
+ * The tick is over: when it read the screen and saw no confirmation there —
467
+ * neither the gated reading nor the ungated one — the open one is `gone`. A
468
+ * newer tick for the same instance (a poller restarted meanwhile) decides
469
+ * instead.
470
+ */
471
+ function endLedgerTick(scope, tick) {
472
+ guarded(undefined, (state, now) => {
473
+ const compositeKey = (0, auto_yes_ledger_records_1.keyOf)(scope);
474
+ if (tick === 0 || state.ticks.get(compositeKey) !== tick)
475
+ return;
476
+ state.ticks.delete(compositeKey);
477
+ const entry = (0, auto_yes_ledger_records_1.currentEntry)(state, compositeKey);
478
+ if (entry !== undefined && entry.observedTick !== tick)
479
+ closeEntry(state, entry, now, { kind: 'gone' });
480
+ // A tick that read the screen and did not see the dialog of a call that
481
+ // ended: it is off the screen now, and the next sighting is a new one.
482
+ const ended = (0, auto_yes_ledger_records_1.endedCallsOf)(state).get(compositeKey);
483
+ if (ended !== undefined && ended.seenTick !== tick)
484
+ (0, auto_yes_ledger_records_1.endedCallsOf)(state).delete(compositeKey);
485
+ });
486
+ }
487
+ /**
488
+ * The tick sees a confirmation on screen. The same screen key in the same
489
+ * session continues the open one (back to `present` if it was unobservable);
490
+ * anything else closes it as gone and opens a new one.
491
+ *
492
+ * agy (PR 3, design §2.1・§2.4): `options.callId` is the call the receipt that
493
+ * let the dialog through asked about. The hook's identity comes before the
494
+ * screen's: a different call is another confirmation even under the same
495
+ * screen key (the same command asked twice, no clear read between). A
496
+ * confirmation with no call yet takes this one. The dialog of a call whose
497
+ * `PostToolUse` already closed it is not reopened while it is still read.
498
+ *
499
+ * @param screenKey - `partialAnswerScreenKey` of the prompt (kept in memory, never logged)
500
+ */
501
+ function observeLedgerScreen(scope, screenKey, promptType, options = {}) {
502
+ guarded(undefined, (state, now) => {
503
+ const compositeKey = (0, auto_yes_ledger_records_1.keyOf)(scope);
504
+ const epoch = (0, auto_yes_enter_fallback_state_1.getEnterFallbackSessionEpoch)(compositeKey);
505
+ const tick = state.ticks.get(compositeKey) ?? 0;
506
+ const callId = options.callId;
507
+ let entry = (0, auto_yes_ledger_records_1.currentEntry)(state, compositeKey);
508
+ const otherCall = entry !== undefined && callId !== undefined && entry.callId !== undefined && entry.callId !== callId;
509
+ if (entry !== undefined && (entry.screenKey !== screenKey || entry.epoch !== epoch || otherCall)) {
510
+ closeEntry(state, entry, now, entry.epoch !== epoch ? { kind: 'abandoned', reason: 'session-epoch-changed' } : { kind: 'gone' });
511
+ entry = undefined;
512
+ }
513
+ if (entry === undefined) {
514
+ const ended = (0, auto_yes_ledger_records_1.endedCallsOf)(state).get(compositeKey);
515
+ if (ended !== undefined &&
516
+ ended.epoch === epoch &&
517
+ ended.screenKey === screenKey &&
518
+ (callId === undefined || callId === ended.callId)) {
519
+ ended.seenTick = tick;
520
+ return;
521
+ }
522
+ (0, auto_yes_ledger_records_1.endedCallsOf)(state).delete(compositeKey);
523
+ const opened = openEntry(state, scope, compositeKey, { source: 'screen', screenKey, promptType }, now, { ...hookLink(state, compositeKey, now), ...callLink(state, compositeKey, callId) });
524
+ state.current.set(compositeKey, opened.id);
525
+ return;
526
+ }
527
+ if (callId !== undefined && entry.callId === undefined) {
528
+ // Seen before the receipt was judged for it; tied now, so its call's
529
+ // `PostToolUse` closes it and the request is not "unobserved".
530
+ entry.callId = callId;
531
+ callLink(state, compositeKey, callId);
532
+ }
533
+ if (entry.presence === 'unobservable') {
534
+ if (entry.unobservableSince !== null)
535
+ entry.unobservableMs += Math.max(0, now - entry.unobservableSince);
536
+ entry.presence = 'present';
537
+ entry.unobservableSince = null;
538
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.presenceChanged, {
539
+ atMs: now,
540
+ confirmationId: entry.id,
541
+ from: 'unobservable',
542
+ to: 'present',
543
+ cause: 'observed',
544
+ });
545
+ }
546
+ entry.observedTick = tick;
547
+ });
548
+ }
549
+ /**
550
+ * Tie a screen confirmation to agy's call: marks the call observed and gives
551
+ * the `opened` line its `callId` and the request's id (PR 3).
552
+ */
553
+ function callLink(state, compositeKey, callId) {
554
+ if (callId === undefined)
555
+ return {};
556
+ const call = (0, auto_yes_ledger_records_1.callsOf)(state).get((0, auto_yes_ledger_records_1.callKey)(compositeKey, callId));
557
+ if (call === undefined)
558
+ return { callId };
559
+ call.observed = true;
560
+ return { callId, hookRequestId: call.hookRequestId };
561
+ }
562
+ /**
563
+ * Auto-Yes leaves the instance's current confirmation alone for `reason`:
564
+ * opens a withheld interval, or records the reason changing inside one.
565
+ */
566
+ function withholdLedgerConfirmation(scope, reason) {
567
+ guarded(undefined, (state, now) => {
568
+ const entry = (0, auto_yes_ledger_records_1.currentEntry)(state, (0, auto_yes_ledger_records_1.keyOf)(scope));
569
+ if (entry === undefined || entry.presence !== 'present')
570
+ return;
571
+ entry.decision = 'withhold';
572
+ if (scope.answerMode !== undefined)
573
+ entry.answerMode = scope.answerMode;
574
+ withhold(state, entry, reason, now);
575
+ });
576
+ }
577
+ /**
578
+ * A send to the instance's current confirmation is about to begin. Called
579
+ * before its first await; the handle goes with the send.
580
+ *
581
+ * @returns The handle, or null when there is no confirmation (or the ledger failed)
582
+ */
583
+ function beginLedgerAttempt(scope, basis, options = {}) {
584
+ return guarded(null, (state) => {
585
+ const entry = (0, auto_yes_ledger_records_1.currentEntry)(state, (0, auto_yes_ledger_records_1.keyOf)(scope));
586
+ if (entry === undefined)
587
+ return null;
588
+ if (scope.answerMode !== undefined)
589
+ entry.answerMode = scope.answerMode;
590
+ return beginAttempt(state, entry, basis, options.receiptAccepted === true);
591
+ });
592
+ }
593
+ function beginAttempt(state, entry, basis, receiptAccepted) {
594
+ entry.nextAttempt += 1;
595
+ entry.decision = 'answer';
596
+ entry.basis = basis;
597
+ const handle = { confirmationId: entry.id, attemptId: `${entry.id}.${entry.nextAttempt}` };
598
+ if (state.pending.size >= auto_yes_ledger_records_1.MAX_PENDING_ATTEMPTS) {
599
+ const oldest = state.pending.keys().next().value;
600
+ if (oldest !== undefined)
601
+ state.pending.delete(oldest);
602
+ }
603
+ state.pending.set(handle.attemptId, {
604
+ confirmationId: entry.id,
605
+ cliToolId: entry.cliToolId,
606
+ basis,
607
+ receiptAccepted,
608
+ ...answerModeField(entry.answerMode),
609
+ });
610
+ return handle;
611
+ }
612
+ const WITHHOLD_REASON_OF_RESULT = {
613
+ partial: 'partial-answer',
614
+ 'no-keys-sent': 'send-no-keys',
615
+ failed: 'send-failed',
616
+ };
617
+ /**
618
+ * A send came back. Its line belongs to the confirmation it was begun for,
619
+ * open or not: one that closed meanwhile gets a `late` line and nothing else —
620
+ * it is not reopened, and its resolution and intervals stay as they were
621
+ * (design §2.5, N1). A second call for the same send does nothing.
622
+ *
623
+ * @param options.expired - The poller's send record had expired (#3713)
624
+ */
625
+ function settleLedgerAttempt(handle, result, options = {}) {
626
+ if (handle === null || handle === undefined)
627
+ return;
628
+ guarded(undefined, (state, now) => settleAttempt(state, handle, result, options.expired === true, now));
629
+ }
630
+ function settleAttempt(state, handle, result, expired, now, options = {}) {
631
+ const pending = state.pending.get(handle.attemptId);
632
+ if (pending === undefined)
633
+ return;
634
+ state.pending.delete(handle.attemptId);
635
+ const entry = state.entries.get(handle.confirmationId);
636
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.attemptSettled, {
637
+ atMs: now,
638
+ confirmationId: handle.confirmationId,
639
+ attemptId: handle.attemptId,
640
+ cliToolId: pending.cliToolId,
641
+ basis: pending.basis,
642
+ result,
643
+ late: entry === undefined,
644
+ expired,
645
+ ...(pending.receiptAccepted ? { receiptAccepted: true } : {}),
646
+ ...answerModeField(pending.answerMode),
647
+ });
648
+ if (entry === undefined)
649
+ return;
650
+ if (result === 'ok') {
651
+ entry.attempts.ok += 1;
652
+ // Issue #3863: the first send that answered it says which mode answered it.
653
+ if (!entry.answered && pending.answerMode !== undefined)
654
+ entry.answeredAnswerMode = pending.answerMode;
655
+ entry.answered = true;
656
+ endInterval(state, entry, 'answered', now);
657
+ return;
658
+ }
659
+ if (result === 'partial')
660
+ entry.attempts.partial += 1;
661
+ else if (result === 'no-keys-sent')
662
+ entry.attempts.noKeysSent += 1;
663
+ else
664
+ entry.attempts.failed += 1;
665
+ if (entry.presence === 'present' && !entry.autoYesStopped && options.withholdOnFailure !== false) {
666
+ withhold(state, entry, WITHHOLD_REASON_OF_RESULT[result], now);
667
+ }
668
+ }
669
+ /**
670
+ * The instance's poller stopped (design §4.2). A stop that ends the session or
671
+ * hands the key over abandons its confirmations; any other (off, expired, the
672
+ * stop pattern, errors, a shutdown) only stops looking — they turn
673
+ * `unobservable`, their withheld interval ends, and the same confirmation is
674
+ * continued if the next poller sees it again.
675
+ */
676
+ function noteLedgerPollerStopped(compositeKey, reason) {
677
+ guarded(undefined, (state, now) => {
678
+ state.ticks.delete(compositeKey);
679
+ // The session is over: no frame of it is read again, the next sighting is new.
680
+ if (auto_yes_ledger_records_1.SESSION_ENDING_STOP_REASONS.has(reason))
681
+ (0, auto_yes_ledger_records_1.endedCallsOf)(state).delete(compositeKey);
682
+ for (const entry of [...state.entries.values()]) {
683
+ if (entry.compositeKey === compositeKey)
684
+ noteEntryStopped(state, entry, reason, now);
685
+ }
686
+ });
687
+ }
688
+ /**
689
+ * Every poller of a worktree stopped, or the worktree went: the same as
690
+ * {@link noteLedgerPollerStopped} for each confirmation the worktree holds,
691
+ * whether or not a poller was running for its instance (design §4.2). An API
692
+ * approval is opened with Auto-Yes off too, so the keys of the running pollers
693
+ * do not name every instance with an open confirmation.
694
+ */
695
+ function noteLedgerWorktreeStopped(worktreeId, reason) {
696
+ guarded(undefined, (state, now) => {
697
+ if (auto_yes_ledger_records_1.SESSION_ENDING_STOP_REASONS.has(reason)) {
698
+ const endedCalls = (0, auto_yes_ledger_records_1.endedCallsOf)(state);
699
+ for (const [compositeKey, ended] of [...endedCalls]) {
700
+ if (ended.worktreeId === worktreeId)
701
+ endedCalls.delete(compositeKey);
702
+ }
703
+ }
704
+ for (const entry of [...state.entries.values()]) {
705
+ if (entry.worktreeId !== worktreeId)
706
+ continue;
707
+ state.ticks.delete(entry.compositeKey);
708
+ noteEntryStopped(state, entry, reason, now);
709
+ }
710
+ });
711
+ }
712
+ function noteEntryStopped(state, entry, reason, now) {
713
+ if (auto_yes_ledger_records_1.ABANDONING_STOP_REASONS.has(reason)) {
714
+ closeEntry(state, entry, now, { kind: 'abandoned', reason });
715
+ return;
716
+ }
717
+ if (entry.source !== 'screen') {
718
+ // An API approval is not read off the screen: the poller stopping does not
719
+ // stop it being seen (its reply still settles it), so it stays open and
720
+ // `present`. Auto-Yes stopped answering it, though, so a withheld interval
721
+ // ends here: the time it is off is nobody's withheld time.
722
+ endInterval(state, entry, 'stopped', now);
723
+ entry.autoYesStopped = true;
724
+ return;
725
+ }
726
+ if (entry.presence === 'unobservable')
727
+ return;
728
+ endInterval(state, entry, 'unobservable', now);
729
+ entry.presence = 'unobservable';
730
+ entry.unobservableSince = now;
731
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.presenceChanged, {
732
+ atMs: now,
733
+ confirmationId: entry.id,
734
+ from: 'present',
735
+ to: 'unobservable',
736
+ cause: reason,
737
+ });
738
+ }
739
+ /** `afterHookAllow` / `afterHookAbstain` for a screen confirmation opened `now` (design §2.3). */
740
+ function hookLink(state, compositeKey, now) {
741
+ const recent = state.lastHookRequest.get(compositeKey);
742
+ if (recent === undefined || now - recent.at > auto_yes_ledger_records_1.AUTO_YES_LEDGER_HOOK_LINK_WINDOW_MS)
743
+ return {};
744
+ return recent.outcome === 'allow' ? { afterHookAllow: true } : { afterHookAbstain: recent.abstainReason ?? 'unknown' };
745
+ }
746
+ // =============================================================================
747
+ // The hook path (the hook route and the adjudication it calls, PR 2)
748
+ // =============================================================================
749
+ /**
750
+ * A hook request arrived. **Only the hook route calls this** (design §2.3,
751
+ * N2): the API adjudication shares the adjudicator but makes no hook request.
752
+ *
753
+ * @returns The request's id, for {@link decideLedgerHookRequest} and
754
+ * {@link closeLedgerHookRequest}; null when the ledger failed
755
+ */
756
+ function beginLedgerHookRequest(scope, receivedAtMs) {
757
+ return guarded(null, (state) => {
758
+ state.nextHookRequest += 1;
759
+ const id = `${state.bootId}-h${state.nextHookRequest}`;
760
+ const instanceId = scope.instanceId ?? scope.cliToolId;
761
+ (0, auto_yes_ledger_records_1.rememberBounded)(state.hookRequests, id, {
762
+ id,
763
+ compositeKey: scope.worktreeId === null ? null : (0, auto_yes_state_1.buildCompositeKey)(scope.worktreeId, scope.cliToolId, instanceId),
764
+ worktreeId: scope.worktreeId,
765
+ cliToolId: scope.cliToolId,
766
+ instanceId,
767
+ receivedAt: receivedAtMs,
768
+ decision: null,
769
+ confirmation: null,
770
+ }, auto_yes_ledger_records_1.MAX_OPEN_HOOK_REQUESTS);
771
+ return id;
772
+ });
773
+ }
774
+ /**
775
+ * The adjudicator decided about a hook request. An `allow` on a source whose
776
+ * allow draws no dialog makes the request the confirmation (design §2.3): it
777
+ * is opened here and closed with the request. Any other outcome opens nothing —
778
+ * a dialog that follows is the screen's confirmation, which alone holds the
779
+ * waiting time (the rule against counting it twice).
780
+ */
781
+ function decideLedgerHookRequest(hookRequestId, decision) {
782
+ if (hookRequestId === null || hookRequestId === undefined)
783
+ return;
784
+ guarded(undefined, (state, now) => {
785
+ const request = state.hookRequests.get(hookRequestId);
786
+ if (request === undefined)
787
+ return;
788
+ request.decision = { ...decision };
789
+ if (decision.outcome !== 'allow' || !decision.allowSuppressesDialog || request.worktreeId === null)
790
+ return;
791
+ if (request.confirmation !== null)
792
+ return;
793
+ state.nextConfirmation += 1;
794
+ const confirmation = { id: `${state.bootId}-${state.nextConfirmation}`, openedAt: now, promptType: decision.promptType };
795
+ request.confirmation = confirmation;
796
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.opened, {
797
+ atMs: now,
798
+ confirmationId: confirmation.id,
799
+ worktreeId: request.worktreeId,
800
+ cliToolId: request.cliToolId,
801
+ instanceId: request.instanceId,
802
+ source: 'hook',
803
+ promptType: confirmation.promptType,
804
+ hookRequestId,
805
+ });
806
+ });
807
+ }
808
+ /**
809
+ * The confirmation a hook request was closes with the request: its one send
810
+ * settles and it closes answered, or unanswered when the reply did not leave.
811
+ */
812
+ function settleHookConfirmation(state, now, request, worktreeId, confirmation, ok, failure) {
813
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.attemptSettled, {
814
+ atMs: now,
815
+ confirmationId: confirmation.id,
816
+ attemptId: `${confirmation.id}.1`,
817
+ cliToolId: request.cliToolId,
818
+ basis: 'L1',
819
+ result: ok ? 'ok' : 'failed',
820
+ late: false,
821
+ expired: false,
822
+ });
823
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.closed, {
824
+ atMs: now,
825
+ confirmationId: confirmation.id,
826
+ worktreeId,
827
+ cliToolId: request.cliToolId,
828
+ instanceId: request.instanceId,
829
+ source: 'hook',
830
+ promptType: confirmation.promptType,
831
+ decision: 'answer',
832
+ basis: 'L1',
833
+ attempts: { ok: ok ? 1 : 0, partial: 0, noKeysSent: 0, failed: ok ? 0 : 1 },
834
+ attemptsPending: 0,
835
+ answeredAtClose: ok,
836
+ resolution: ok ? 'resolved-by-reply' : 'unresolved-after-send',
837
+ resolvedBy: ok ? 'auto' : 'unknown',
838
+ openMs: Math.max(0, now - confirmation.openedAt),
839
+ withheldMsTotal: 0,
840
+ unobservableMs: 0,
841
+ intervals: 0,
842
+ ...(ok ? {} : { abandonReason: failure }),
843
+ });
844
+ }
845
+ /**
846
+ * The hook route wrote its reply. `delivered: false` is a verdict that did not
847
+ * leave — the route's catch-all, or a delivery whose receipt said so: whatever
848
+ * had been decided, the agent got an abstention, so the request is closed
849
+ * `abstained` (`failure`, `error` when omitted) and a confirmation it was is
850
+ * closed unanswered, its send `failed`.
851
+ */
852
+ function closeLedgerHookRequest(hookRequestId, reply) {
853
+ if (hookRequestId === null || hookRequestId === undefined)
854
+ return;
855
+ guarded(undefined, (state, now) => {
856
+ const request = state.hookRequests.get(hookRequestId);
857
+ if (request === undefined)
858
+ return;
859
+ state.hookRequests.delete(hookRequestId);
860
+ const decision = request.decision;
861
+ const outcome = reply.delivered && decision !== null ? decision.outcome : 'abstained';
862
+ const failure = reply.failure ?? 'error';
863
+ const abstainReason = !reply.delivered ? failure : decision === null ? 'undecided' : decision.abstainReason;
864
+ const confirmation = request.confirmation;
865
+ if (confirmation !== null && request.worktreeId !== null) {
866
+ settleHookConfirmation(state, now, request, request.worktreeId, confirmation, reply.delivered, failure);
867
+ }
868
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.hookRequestClosed, {
869
+ atMs: now,
870
+ hookRequestId,
871
+ cliToolId: request.cliToolId,
872
+ outcome,
873
+ ...(outcome === 'abstained' && abstainReason !== undefined ? { abstainReason } : {}),
874
+ allowSuppressesDialog: decision?.allowSuppressesDialog ?? false,
875
+ replyMs: Math.max(0, now - request.receivedAt),
876
+ ...(decision?.callId !== undefined ? { callId: decision.callId } : {}),
877
+ });
878
+ // PR 3: a call the request opened no confirmation for waits for the
879
+ // screen's confirmation to be tied to it, or for its `PostToolUse`.
880
+ if (request.compositeKey !== null && decision?.callId !== undefined && confirmation === null) {
881
+ (0, auto_yes_ledger_records_1.rememberBounded)((0, auto_yes_ledger_records_1.callsOf)(state), (0, auto_yes_ledger_records_1.callKey)(request.compositeKey, decision.callId), { hookRequestId, cliToolId: request.cliToolId, observed: false }, auto_yes_ledger_records_1.MAX_REMEMBERED_CALLS);
882
+ }
883
+ if (request.compositeKey !== null) {
884
+ (0, auto_yes_ledger_records_1.rememberBounded)(state.lastHookRequest, request.compositeKey, { at: now, outcome, ...(outcome === 'abstained' && abstainReason !== undefined ? { abstainReason } : {}) }, auto_yes_ledger_records_1.MAX_REMEMBERED_INSTANCES);
885
+ }
886
+ });
887
+ }
888
+ /**
889
+ * agy's call `callId` ended: its `PostToolUse` came (design §2.4, §2.6, PR 3).
890
+ * The screen confirmation tied to it closes as gone, if it had not gone from
891
+ * the screen first (who answered is not known: `unknown`). A call no
892
+ * confirmation was ever tied to writes `dialogUnobserved` on its hook request
893
+ * — and opens nothing. A call this ledger never heard asked about (a restart
894
+ * in between, a body without `stepIdx`) writes nothing; so does a second
895
+ * `PostToolUse` for the same call.
896
+ */
897
+ function noteLedgerToolCallEnded(scope, callId) {
898
+ if (callId === null || callId === undefined)
899
+ return;
900
+ guarded(undefined, (state, now) => {
901
+ const compositeKey = (0, auto_yes_ledger_records_1.keyOf)(scope);
902
+ for (const entry of [...state.entries.values()]) {
903
+ if (entry.compositeKey !== compositeKey || entry.callId !== callId)
904
+ continue;
905
+ const wasCurrent = state.current.get(compositeKey) === entry.id;
906
+ closeEntry(state, entry, now, { kind: 'gone' });
907
+ if (wasCurrent) {
908
+ (0, auto_yes_ledger_records_1.rememberBounded)((0, auto_yes_ledger_records_1.endedCallsOf)(state), compositeKey, {
909
+ callId,
910
+ screenKey: entry.screenKey,
911
+ worktreeId: entry.worktreeId,
912
+ epoch: entry.epoch,
913
+ seenTick: state.ticks.get(compositeKey) ?? 0,
914
+ }, auto_yes_ledger_records_1.MAX_REMEMBERED_INSTANCES);
915
+ }
916
+ }
917
+ const key = (0, auto_yes_ledger_records_1.callKey)(compositeKey, callId);
918
+ const call = (0, auto_yes_ledger_records_1.callsOf)(state).get(key);
919
+ if (call === undefined)
920
+ return;
921
+ (0, auto_yes_ledger_records_1.callsOf)(state).delete(key);
922
+ if (call.observed)
923
+ return;
924
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.hookRequestDialogUnobserved, {
925
+ atMs: now,
926
+ hookRequestId: call.hookRequestId,
927
+ cliToolId: call.cliToolId,
928
+ callId,
929
+ dialogUnobserved: true,
930
+ });
931
+ });
932
+ }
933
+ /**
934
+ * The CLI's own permission mode, as a `PermissionRequest` stated it (design
935
+ * §3.4). A line the first time an instance's session shows one and whenever it
936
+ * changes; a new session forgets it. Instances that never show one write
937
+ * nothing — the count reads them as unknown, never as zero.
938
+ */
939
+ function observeLedgerCliMode(scope, mode) {
940
+ guarded(undefined, (state, now) => {
941
+ const compositeKey = (0, auto_yes_ledger_records_1.keyOf)(scope);
942
+ const epoch = (0, auto_yes_enter_fallback_state_1.getEnterFallbackSessionEpoch)(compositeKey);
943
+ const word = auto_yes_ledger_records_1.CLI_MODE_WORD.test(mode) ? mode : '(other)';
944
+ const seen = state.cliModes.get(compositeKey);
945
+ const sameSession = seen !== undefined && seen.epoch === epoch;
946
+ if (sameSession && seen.mode === word)
947
+ return;
948
+ (0, auto_yes_ledger_records_1.rememberBounded)(state.cliModes, compositeKey, { epoch, mode: word }, auto_yes_ledger_records_1.MAX_REMEMBERED_INSTANCES);
949
+ (0, auto_yes_ledger_records_1.emit)(state, auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_EVENTS.cliModeObserved, {
950
+ atMs: now,
951
+ worktreeId: scope.worktreeId,
952
+ cliToolId: scope.cliToolId,
953
+ instanceId: scope.instanceId ?? scope.cliToolId,
954
+ sessionEpoch: epoch,
955
+ mode: word,
956
+ change: sameSession ? 'changed' : 'first',
957
+ });
958
+ });
959
+ }
960
+ /**
961
+ * One adjudication of the approval `decisionId` (design §2.4), in one call.
962
+ * The same as {@link beginLedgerApiAdjudication} followed at once by
963
+ * {@link settleLedgerApiAdjudication}; a caller that awaits the delivery in
964
+ * between uses the two.
965
+ */
966
+ function recordLedgerApiAdjudication(scope, decisionId, adjudication) {
967
+ settleLedgerApiAdjudication(beginLedgerApiAdjudication(scope, decisionId, adjudication), adjudication);
968
+ }
969
+ /**
970
+ * An adjudication of the approval `decisionId` decided, and its verdict is
971
+ * about to be delivered (design §2.4). Called before the delivery's first
972
+ * await, as the screen path takes its handle (§2.5): the first adjudication
973
+ * opens the confirmation, a re-adjudication (re-connect, Auto-Yes switched on)
974
+ * continues it, a policy's abstention withholds it. An `allow` is a send,
975
+ * begun here.
976
+ *
977
+ * @returns The send's handle, for {@link settleLedgerApiAdjudication}; null for
978
+ * an abstention (or when the ledger failed)
979
+ */
980
+ function beginLedgerApiAdjudication(scope, decisionId, verdict) {
981
+ return guarded(null, (state, now) => {
982
+ const compositeKey = (0, auto_yes_ledger_records_1.keyOf)(scope);
983
+ const decisionKey = `${compositeKey}\u0000${decisionId}`;
984
+ const knownId = state.apiDecisions.get(decisionKey);
985
+ let entry = knownId === undefined ? undefined : state.entries.get(knownId);
986
+ if (entry === undefined) {
987
+ entry = openEntry(state, scope, compositeKey, {
988
+ source: 'api',
989
+ screenKey: '',
990
+ promptType: verdict.promptType,
991
+ decisionKey,
992
+ }, now);
993
+ state.apiDecisions.set(decisionKey, entry.id);
994
+ }
995
+ // Adjudicated again with Auto-Yes on (an allow, or a policy's withholding):
996
+ // its intervals are this period's.
997
+ if (verdict.outcome === 'allow' || verdict.withholdReason !== undefined)
998
+ entry.autoYesStopped = false;
999
+ if (verdict.outcome === 'allow')
1000
+ return beginAttempt(state, entry, 'L1', false);
1001
+ if (verdict.withholdReason !== undefined) {
1002
+ entry.decision = 'withhold';
1003
+ withhold(state, entry, verdict.withholdReason, now);
1004
+ }
1005
+ return null;
1006
+ });
1007
+ }
1008
+ /**
1009
+ * The delivery of an `allow` came back: `delivered` is the send's result, and
1010
+ * a settled reply closes the confirmation, answered by Auto-Yes. The result
1011
+ * belongs to the confirmation the send was begun for — one that closed
1012
+ * meanwhile (a session killed during the delivery) gets a `late` line and is
1013
+ * neither reopened nor closed again (design §2.5, N1).
1014
+ */
1015
+ function settleLedgerApiAdjudication(handle, delivery) {
1016
+ if (handle === null || handle === undefined)
1017
+ return;
1018
+ guarded(undefined, (state, now) => {
1019
+ settleAttempt(state, handle, delivery.delivered ? 'ok' : 'failed', false, now);
1020
+ const entry = state.entries.get(handle.confirmationId);
1021
+ if (entry !== undefined && delivery.delivered && delivery.settled)
1022
+ closeEntry(state, entry, now, { kind: 'reply' });
1023
+ });
1024
+ }
1025
+ /**
1026
+ * The agent said the approval `decisionId` was answered (opencode's
1027
+ * `permission.replied`) — by this server, another client or a human at the
1028
+ * terminal. An open confirmation closes as gone; who answered is not known.
1029
+ */
1030
+ function noteLedgerApiDecisionReplied(scope, decisionId) {
1031
+ guarded(undefined, (state, now) => {
1032
+ const knownId = state.apiDecisions.get(`${(0, auto_yes_ledger_records_1.keyOf)(scope)}\u0000${decisionId}`);
1033
+ const entry = knownId === undefined ? undefined : state.entries.get(knownId);
1034
+ if (entry !== undefined)
1035
+ closeEntry(state, entry, now, { kind: 'gone' });
1036
+ });
1037
+ }
1038
+ /**
1039
+ * A `/prompt-response` answer: a confirmation of its own, opened and closed
1040
+ * with the request, with its one send. A failure is never an answer. Only a
1041
+ * human's successful answer names who resolved it (`human-ui`, design §2.6).
1042
+ */
1043
+ function recordLedgerPromptResponse(scope, response) {
1044
+ guarded(undefined, (state, now) => {
1045
+ const entry = openEntry(state, scope, (0, auto_yes_ledger_records_1.keyOf)(scope), {
1046
+ source: 'prompt-response',
1047
+ screenKey: '',
1048
+ promptType: response.promptType,
1049
+ }, now);
1050
+ const handle = beginAttempt(state, entry, response.basis, false);
1051
+ if (response.basis === 'human')
1052
+ entry.decision = 'none';
1053
+ // Closed in the same call, so a failure opens no withheld interval.
1054
+ settleAttempt(state, handle, response.result, false, now, { withholdOnFailure: false });
1055
+ if (response.result === 'ok') {
1056
+ closeEntry(state, entry, now, { kind: 'gone', resolvedBy: response.basis === 'human' ? 'human-ui' : 'unknown' });
1057
+ return;
1058
+ }
1059
+ closeEntry(state, entry, now, { kind: 'abandoned', reason: 'send-failed' });
1060
+ });
1061
+ }
1062
+ // =============================================================================
1063
+ // Test seams
1064
+ // =============================================================================
1065
+ /**
1066
+ * One hour boundary's lines, stamped `atMs`, as the clock writes them.
1067
+ * @internal Exported for tests.
1068
+ */
1069
+ function runAutoYesLedgerHourForTests(atMs) {
1070
+ guarded(undefined, (state) => runHour(state, atMs));
1071
+ }
1072
+ /** Drop the state (and its clock). @internal Exported for tests. */
1073
+ function resetAutoYesConfirmationLedgerForTests() {
1074
+ const state = globalThis.__autoYesConfirmationLedger;
1075
+ if (state?.clock?.timer)
1076
+ clockTimers.clearTimeout(state.clock.timer);
1077
+ globalThis.__autoYesConfirmationLedger = undefined;
1078
+ injectedFault = null;
1079
+ }
1080
+ /** Make every entry point fail as if it had thrown; null restores. @internal Exported for tests. */
1081
+ function setAutoYesLedgerFaultForTests(fault) {
1082
+ injectedFault = fault;
1083
+ }
1084
+ /** Replace the clock's timers; null restores the ones taken at load. @internal Exported for tests. */
1085
+ function setAutoYesLedgerClockTimersForTests(timers) {
1086
+ clockTimers = timers ?? loadedClockTimers;
1087
+ }
1088
+ /** The swallowed-exception count of this process (`ledgerErrors`). @internal Exported for tests. */
1089
+ function getAutoYesLedgerErrorCountForTests() {
1090
+ return globalThis.__autoYesConfirmationLedger?.errors ?? 0;
1091
+ }