agent-log-viewer 0.11.6 → 1.0.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 (517) hide show
  1. package/README.md +220 -30
  2. package/bin/cli.mjs +32 -12
  3. package/bin/mcp-server.mjs +129 -0
  4. package/bin/mcp-server.test.ts +264 -0
  5. package/bin/server-runtime.mjs +57 -0
  6. package/bin/server-runtime.test.ts +122 -0
  7. package/bin/tailscale-credential-isolation.test.ts +56 -0
  8. package/bin/tailscale.mjs +6 -4
  9. package/dist/mcp-server.mjs +42361 -0
  10. package/dist/standalone/.next/BUILD_ID +1 -1
  11. package/dist/standalone/.next/app-path-routes-manifest.json +69 -12
  12. package/dist/standalone/.next/build-manifest.json +6 -6
  13. package/dist/standalone/.next/prerender-manifest.json +3 -3
  14. package/dist/standalone/.next/react-loadable-manifest.json +70 -0
  15. package/dist/standalone/.next/required-server-files.json +9 -2
  16. package/dist/standalone/.next/routes-manifest.json +360 -0
  17. package/dist/standalone/.next/server/app/_global-error/page.js +3 -3
  18. package/dist/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  19. package/dist/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  20. package/dist/standalone/.next/server/app/_global-error.html +1 -1
  21. package/dist/standalone/.next/server/app/_global-error.rsc +1 -1
  22. package/dist/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  23. package/dist/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  24. package/dist/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  25. package/dist/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  26. package/dist/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  27. package/dist/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  28. package/dist/standalone/.next/server/app/_not-found/page.js +2 -2
  29. package/dist/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  30. package/dist/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  31. package/dist/standalone/.next/server/app/_not-found.html +1 -1
  32. package/dist/standalone/.next/server/app/_not-found.rsc +3 -3
  33. package/dist/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  34. package/dist/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  35. package/dist/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  36. package/dist/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  37. package/dist/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  38. package/dist/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  39. package/dist/standalone/.next/server/app/api/access/route.js +1 -1
  40. package/dist/standalone/.next/server/app/api/access/route.js.nft.json +1 -1
  41. package/dist/standalone/.next/server/app/api/account-migrations/[intentId]/route.js +1 -0
  42. package/dist/standalone/.next/server/app/api/account-migrations/[intentId]/route.js.nft.json +1 -0
  43. package/dist/standalone/.next/server/app/api/account-migrations/[intentId]/route_client-reference-manifest.js +1 -0
  44. package/dist/standalone/.next/server/app/api/accounts/claude/[id]/status/route.js +1 -0
  45. package/dist/standalone/.next/server/app/api/accounts/claude/[id]/status/route.js.nft.json +1 -0
  46. package/dist/standalone/.next/server/app/api/accounts/claude/[id]/status/route_client-reference-manifest.js +1 -0
  47. package/dist/standalone/.next/server/app/api/accounts/claude/active/route.js +1 -0
  48. package/dist/standalone/.next/server/app/api/accounts/claude/active/route.js.nft.json +1 -0
  49. package/dist/standalone/.next/server/app/api/accounts/claude/active/route_client-reference-manifest.js +1 -0
  50. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/input/route.js +1 -0
  51. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/input/route.js.nft.json +1 -0
  52. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/input/route_client-reference-manifest.js +1 -0
  53. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/route.js +1 -0
  54. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/route.js.nft.json +1 -0
  55. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/route_client-reference-manifest.js +1 -0
  56. package/dist/standalone/.next/server/app/api/accounts/claude/policy/route.js +1 -0
  57. package/dist/standalone/.next/server/app/api/accounts/claude/policy/route.js.nft.json +1 -0
  58. package/dist/standalone/.next/server/app/api/accounts/claude/policy/route_client-reference-manifest.js +1 -0
  59. package/dist/standalone/.next/server/app/api/accounts/claude/route.js +1 -0
  60. package/dist/standalone/.next/server/app/api/accounts/claude/route.js.nft.json +1 -0
  61. package/dist/standalone/.next/server/app/api/accounts/claude/route_client-reference-manifest.js +1 -0
  62. package/dist/standalone/.next/server/app/api/accounts/claude/terminal/route.js +1 -0
  63. package/dist/standalone/.next/server/app/api/accounts/claude/terminal/route.js.nft.json +1 -0
  64. package/dist/standalone/.next/server/app/api/accounts/claude/terminal/route_client-reference-manifest.js +1 -0
  65. package/dist/standalone/.next/server/app/api/accounts/codex/active/route.js +1 -0
  66. package/dist/standalone/.next/server/app/api/accounts/codex/active/route.js.nft.json +1 -0
  67. package/dist/standalone/.next/server/app/api/accounts/codex/active/route_client-reference-manifest.js +1 -0
  68. package/dist/standalone/.next/server/app/api/accounts/codex/policy/route.js +1 -0
  69. package/dist/standalone/.next/server/app/api/accounts/codex/policy/route.js.nft.json +1 -0
  70. package/dist/standalone/.next/server/app/api/accounts/codex/policy/route_client-reference-manifest.js +1 -0
  71. package/dist/standalone/.next/server/app/api/accounts/codex/route.js +1 -0
  72. package/dist/standalone/.next/server/app/api/accounts/codex/route.js.nft.json +1 -0
  73. package/dist/standalone/.next/server/app/api/accounts/codex/route_client-reference-manifest.js +1 -0
  74. package/dist/standalone/.next/server/app/api/accounts/codex/terminal/route.js +1 -0
  75. package/dist/standalone/.next/server/app/api/accounts/codex/terminal/route.js.nft.json +1 -0
  76. package/dist/standalone/.next/server/app/api/accounts/codex/terminal/route_client-reference-manifest.js +1 -0
  77. package/dist/standalone/.next/server/app/api/accounts/route.js +1 -0
  78. package/dist/standalone/.next/server/app/api/accounts/route.js.nft.json +1 -0
  79. package/dist/standalone/.next/server/app/api/accounts/route_client-reference-manifest.js +1 -0
  80. package/dist/standalone/.next/server/app/api/agent/route.js +1 -0
  81. package/dist/standalone/.next/server/app/api/agent/route.js.nft.json +1 -0
  82. package/dist/standalone/.next/server/app/api/agent/route_client-reference-manifest.js +1 -0
  83. package/dist/standalone/.next/server/app/api/agent/snapshot/route.js +1 -0
  84. package/dist/standalone/.next/server/app/api/agent/snapshot/route.js.nft.json +1 -0
  85. package/dist/standalone/.next/server/app/api/agent/snapshot/route_client-reference-manifest.js +1 -0
  86. package/dist/standalone/.next/server/app/api/answer/route.js +1 -1
  87. package/dist/standalone/.next/server/app/api/answer/route.js.nft.json +1 -1
  88. package/dist/standalone/.next/server/app/api/attach-command/route.js +1 -0
  89. package/dist/standalone/.next/server/app/api/attach-command/route.js.nft.json +1 -0
  90. package/dist/standalone/.next/server/app/api/attach-command/route_client-reference-manifest.js +1 -0
  91. package/dist/standalone/.next/server/app/api/attention/[id]/route.js +1 -0
  92. package/dist/standalone/.next/server/app/api/attention/[id]/route.js.nft.json +1 -0
  93. package/dist/standalone/.next/server/app/api/attention/[id]/route_client-reference-manifest.js +1 -0
  94. package/dist/standalone/.next/server/app/api/attention/route.js +1 -0
  95. package/dist/standalone/.next/server/app/api/attention/route.js.nft.json +1 -0
  96. package/dist/standalone/.next/server/app/api/attention/route_client-reference-manifest.js +1 -0
  97. package/dist/standalone/.next/server/app/api/board/route.js +1 -0
  98. package/dist/standalone/.next/server/app/api/board/route.js.nft.json +1 -0
  99. package/dist/standalone/.next/server/app/api/board/route_client-reference-manifest.js +1 -0
  100. package/dist/standalone/.next/server/app/api/bridge/route.js +2 -0
  101. package/dist/standalone/.next/server/app/api/bridge/route.js.nft.json +1 -0
  102. package/dist/standalone/.next/server/app/api/bridge/route_client-reference-manifest.js +1 -0
  103. package/dist/standalone/.next/server/app/api/conversations/[conversationId]/migration/route.js +1 -0
  104. package/dist/standalone/.next/server/app/api/conversations/[conversationId]/migration/route.js.nft.json +1 -0
  105. package/dist/standalone/.next/server/app/api/conversations/[conversationId]/migration/route_client-reference-manifest.js +1 -0
  106. package/dist/standalone/.next/server/app/api/conversations/route.js +1 -0
  107. package/dist/standalone/.next/server/app/api/conversations/route.js.nft.json +1 -0
  108. package/dist/standalone/.next/server/app/api/conversations/route_client-reference-manifest.js +1 -0
  109. package/dist/standalone/.next/server/app/api/files/route.js +2 -1
  110. package/dist/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  111. package/dist/standalone/.next/server/app/api/flows/[id]/route.js +1 -1
  112. package/dist/standalone/.next/server/app/api/flows/[id]/route.js.nft.json +1 -1
  113. package/dist/standalone/.next/server/app/api/flows/route.js +1 -1
  114. package/dist/standalone/.next/server/app/api/flows/route.js.nft.json +1 -1
  115. package/dist/standalone/.next/server/app/api/image/route.js +1 -1
  116. package/dist/standalone/.next/server/app/api/image/route.js.nft.json +1 -1
  117. package/dist/standalone/.next/server/app/api/inbox/route.js +2 -2
  118. package/dist/standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  119. package/dist/standalone/.next/server/app/api/lifecycle/reaper/route.js +1 -0
  120. package/dist/standalone/.next/server/app/api/lifecycle/reaper/route.js.nft.json +1 -0
  121. package/dist/standalone/.next/server/app/api/lifecycle/reaper/route_client-reference-manifest.js +1 -0
  122. package/dist/standalone/.next/server/app/api/limits/history/route.js +1 -0
  123. package/dist/standalone/.next/server/app/api/limits/history/route.js.nft.json +1 -0
  124. package/dist/standalone/.next/server/app/api/limits/history/route_client-reference-manifest.js +1 -0
  125. package/dist/standalone/.next/server/app/api/limits/route.js +1 -2
  126. package/dist/standalone/.next/server/app/api/limits/route.js.nft.json +1 -1
  127. package/dist/standalone/.next/server/app/api/log/preflight/route.js +1 -0
  128. package/dist/standalone/.next/server/app/api/log/preflight/route.js.nft.json +1 -0
  129. package/dist/standalone/.next/server/app/api/log/preflight/route_client-reference-manifest.js +1 -0
  130. package/dist/standalone/.next/server/app/api/log/project-delete/route.js +1 -0
  131. package/dist/standalone/.next/server/app/api/log/project-delete/route.js.nft.json +1 -0
  132. package/dist/standalone/.next/server/app/api/log/project-delete/route_client-reference-manifest.js +1 -0
  133. package/dist/standalone/.next/server/app/api/log/route.js +1 -1
  134. package/dist/standalone/.next/server/app/api/log/route.js.nft.json +1 -1
  135. package/dist/standalone/.next/server/app/api/logs/route.js +1 -1
  136. package/dist/standalone/.next/server/app/api/logs/route.js.nft.json +1 -1
  137. package/dist/standalone/.next/server/app/api/logs/stream/route.js +4 -4
  138. package/dist/standalone/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
  139. package/dist/standalone/.next/server/app/api/monitor/lock/route.js +3 -0
  140. package/dist/standalone/.next/server/app/api/monitor/lock/route.js.nft.json +1 -0
  141. package/dist/standalone/.next/server/app/api/monitor/lock/route_client-reference-manifest.js +1 -0
  142. package/dist/standalone/.next/server/app/api/monitor/runs/route.js +3 -0
  143. package/dist/standalone/.next/server/app/api/monitor/runs/route.js.nft.json +1 -0
  144. package/dist/standalone/.next/server/app/api/monitor/runs/route_client-reference-manifest.js +1 -0
  145. package/dist/standalone/.next/server/app/api/orchestrator/rotate/route.js +1 -0
  146. package/dist/standalone/.next/server/app/api/orchestrator/rotate/route.js.nft.json +1 -0
  147. package/dist/standalone/.next/server/app/api/orchestrator/rotate/route_client-reference-manifest.js +1 -0
  148. package/dist/standalone/.next/server/app/api/orchestrator/route.js +1 -0
  149. package/dist/standalone/.next/server/app/api/orchestrator/route.js.nft.json +1 -0
  150. package/dist/standalone/.next/server/app/api/orchestrator/route_client-reference-manifest.js +1 -0
  151. package/dist/standalone/.next/server/app/api/orchestrator/seat/route.js +1 -0
  152. package/dist/standalone/.next/server/app/api/orchestrator/seat/route.js.nft.json +1 -0
  153. package/dist/standalone/.next/server/app/api/orchestrator/seat/route_client-reference-manifest.js +1 -0
  154. package/dist/standalone/.next/server/app/api/pipelines/[id]/route.js +1 -0
  155. package/dist/standalone/.next/server/app/api/pipelines/[id]/route.js.nft.json +1 -0
  156. package/dist/standalone/.next/server/app/api/pipelines/[id]/route_client-reference-manifest.js +1 -0
  157. package/dist/standalone/.next/server/app/api/pipelines/preflight/route.js +1 -0
  158. package/dist/standalone/.next/server/app/api/pipelines/preflight/route.js.nft.json +1 -0
  159. package/dist/standalone/.next/server/app/api/pipelines/preflight/route_client-reference-manifest.js +1 -0
  160. package/dist/standalone/.next/server/app/api/pipelines/route.js +2 -0
  161. package/dist/standalone/.next/server/app/api/pipelines/route.js.nft.json +1 -0
  162. package/dist/standalone/.next/server/app/api/pipelines/route_client-reference-manifest.js +1 -0
  163. package/dist/standalone/.next/server/app/api/pipelines/tick/route.js +2 -0
  164. package/dist/standalone/.next/server/app/api/pipelines/tick/route.js.nft.json +1 -0
  165. package/dist/standalone/.next/server/app/api/pipelines/tick/route_client-reference-manifest.js +1 -0
  166. package/dist/standalone/.next/server/app/api/proc/route.js +1 -1
  167. package/dist/standalone/.next/server/app/api/proc/route.js.nft.json +1 -1
  168. package/dist/standalone/.next/server/app/api/push/route.js +2 -1
  169. package/dist/standalone/.next/server/app/api/push/route.js.nft.json +1 -1
  170. package/dist/standalone/.next/server/app/api/resources/route.js +1 -1
  171. package/dist/standalone/.next/server/app/api/resources/route.js.nft.json +1 -1
  172. package/dist/standalone/.next/server/app/api/roles/route.js +2 -0
  173. package/dist/standalone/.next/server/app/api/roles/route.js.nft.json +1 -0
  174. package/dist/standalone/.next/server/app/api/roles/route_client-reference-manifest.js +1 -0
  175. package/dist/standalone/.next/server/app/api/runtime/answer/route.js +1 -0
  176. package/dist/standalone/.next/server/app/api/runtime/answer/route.js.nft.json +1 -0
  177. package/dist/standalone/.next/server/app/api/runtime/answer/route_client-reference-manifest.js +1 -0
  178. package/dist/standalone/.next/server/app/api/runtime/deployments/[deploymentId]/route.js +1 -0
  179. package/dist/standalone/.next/server/app/api/runtime/deployments/[deploymentId]/route.js.nft.json +1 -0
  180. package/dist/standalone/.next/server/app/api/runtime/deployments/[deploymentId]/route_client-reference-manifest.js +1 -0
  181. package/dist/standalone/.next/server/app/api/runtime/deployments/capabilities/v1/route.js +1 -0
  182. package/dist/standalone/.next/server/app/api/runtime/deployments/capabilities/v1/route.js.nft.json +1 -0
  183. package/dist/standalone/.next/server/app/api/runtime/deployments/capabilities/v1/route_client-reference-manifest.js +1 -0
  184. package/dist/standalone/.next/server/app/api/runtime/deployments/route.js +1 -0
  185. package/dist/standalone/.next/server/app/api/runtime/deployments/route.js.nft.json +1 -0
  186. package/dist/standalone/.next/server/app/api/runtime/deployments/route_client-reference-manifest.js +1 -0
  187. package/dist/standalone/.next/server/app/api/runtime/interrupt/route.js +1 -0
  188. package/dist/standalone/.next/server/app/api/runtime/interrupt/route.js.nft.json +1 -0
  189. package/dist/standalone/.next/server/app/api/runtime/interrupt/route_client-reference-manifest.js +1 -0
  190. package/dist/standalone/.next/server/app/api/runtime/operations/[operationId]/route.js +1 -0
  191. package/dist/standalone/.next/server/app/api/runtime/operations/[operationId]/route.js.nft.json +1 -0
  192. package/dist/standalone/.next/server/app/api/runtime/operations/[operationId]/route_client-reference-manifest.js +1 -0
  193. package/dist/standalone/.next/server/app/api/runtime/operations/route.js +1 -0
  194. package/dist/standalone/.next/server/app/api/runtime/operations/route.js.nft.json +1 -0
  195. package/dist/standalone/.next/server/app/api/runtime/operations/route_client-reference-manifest.js +1 -0
  196. package/dist/standalone/.next/server/app/api/runtime/realtime/route.js +1 -0
  197. package/dist/standalone/.next/server/app/api/runtime/realtime/route.js.nft.json +1 -0
  198. package/dist/standalone/.next/server/app/api/runtime/realtime/route_client-reference-manifest.js +1 -0
  199. package/dist/standalone/.next/server/app/api/runtime/send/route.js +1 -0
  200. package/dist/standalone/.next/server/app/api/runtime/send/route.js.nft.json +1 -0
  201. package/dist/standalone/.next/server/app/api/runtime/send/route_client-reference-manifest.js +1 -0
  202. package/dist/standalone/.next/server/app/api/runtime/snapshot/route.js +1 -0
  203. package/dist/standalone/.next/server/app/api/runtime/snapshot/route.js.nft.json +1 -0
  204. package/dist/standalone/.next/server/app/api/runtime/snapshot/route_client-reference-manifest.js +1 -0
  205. package/dist/standalone/.next/server/app/api/runtime/spawn/route.js +1 -0
  206. package/dist/standalone/.next/server/app/api/runtime/spawn/route.js.nft.json +1 -0
  207. package/dist/standalone/.next/server/app/api/runtime/spawn/route_client-reference-manifest.js +1 -0
  208. package/dist/standalone/.next/server/app/api/runtime/steer/route.js +1 -0
  209. package/dist/standalone/.next/server/app/api/runtime/steer/route.js.nft.json +1 -0
  210. package/dist/standalone/.next/server/app/api/runtime/steer/route_client-reference-manifest.js +1 -0
  211. package/dist/standalone/.next/server/app/api/runtime/stream/route.js +8 -0
  212. package/dist/standalone/.next/server/app/api/runtime/stream/route.js.nft.json +1 -0
  213. package/dist/standalone/.next/server/app/api/runtime/stream/route_client-reference-manifest.js +1 -0
  214. package/dist/standalone/.next/server/app/api/session/route.js +1 -1
  215. package/dist/standalone/.next/server/app/api/session/route.js.nft.json +1 -1
  216. package/dist/standalone/.next/server/app/api/session/supersedence/route.js +1 -0
  217. package/dist/standalone/.next/server/app/api/session/supersedence/route.js.nft.json +1 -0
  218. package/dist/standalone/.next/server/app/api/session/supersedence/route_client-reference-manifest.js +1 -0
  219. package/dist/standalone/.next/server/app/api/session/title/route.js +1 -0
  220. package/dist/standalone/.next/server/app/api/session/title/route.js.nft.json +1 -0
  221. package/dist/standalone/.next/server/app/api/session/title/route_client-reference-manifest.js +1 -0
  222. package/dist/standalone/.next/server/app/api/spawn/policy/route.js +3 -0
  223. package/dist/standalone/.next/server/app/api/spawn/policy/route.js.nft.json +1 -0
  224. package/dist/standalone/.next/server/app/api/spawn/policy/route_client-reference-manifest.js +1 -0
  225. package/dist/standalone/.next/server/app/api/spawn/route.js +2 -1
  226. package/dist/standalone/.next/server/app/api/spawn/route.js.nft.json +1 -1
  227. package/dist/standalone/.next/server/app/api/staging/route.js +2 -0
  228. package/dist/standalone/.next/server/app/api/staging/route.js.nft.json +1 -0
  229. package/dist/standalone/.next/server/app/api/staging/route_client-reference-manifest.js +1 -0
  230. package/dist/standalone/.next/server/app/api/task-attachments/route.js +2 -0
  231. package/dist/standalone/.next/server/app/api/task-attachments/route.js.nft.json +1 -0
  232. package/dist/standalone/.next/server/app/api/task-attachments/route_client-reference-manifest.js +1 -0
  233. package/dist/standalone/.next/server/app/api/tasks/[id]/assignment/route.js +1 -2
  234. package/dist/standalone/.next/server/app/api/tasks/[id]/assignment/route.js.nft.json +1 -1
  235. package/dist/standalone/.next/server/app/api/tasks/[id]/route.js +1 -2
  236. package/dist/standalone/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
  237. package/dist/standalone/.next/server/app/api/tasks/[id]/send/route.js +1 -1
  238. package/dist/standalone/.next/server/app/api/tasks/[id]/send/route.js.nft.json +1 -1
  239. package/dist/standalone/.next/server/app/api/tasks/[id]/spawn/route.js +1 -1
  240. package/dist/standalone/.next/server/app/api/tasks/[id]/spawn/route.js.nft.json +1 -1
  241. package/dist/standalone/.next/server/app/api/tasks/curator/route.js +1 -1
  242. package/dist/standalone/.next/server/app/api/tasks/curator/route.js.nft.json +1 -1
  243. package/dist/standalone/.next/server/app/api/tasks/route.js +11 -2
  244. package/dist/standalone/.next/server/app/api/tasks/route.js.nft.json +1 -1
  245. package/dist/standalone/.next/server/app/api/timeline/route.js +1 -1
  246. package/dist/standalone/.next/server/app/api/timeline/route.js.nft.json +1 -1
  247. package/dist/standalone/.next/server/app/api/tmux/route.js +1 -1
  248. package/dist/standalone/.next/server/app/api/tmux/route.js.nft.json +1 -1
  249. package/dist/standalone/.next/server/app/api/tmux/targets/route.js +1 -1
  250. package/dist/standalone/.next/server/app/api/tmux/targets/route.js.nft.json +1 -1
  251. package/dist/standalone/.next/server/app/api/transcribe/backend/route.js +2 -2
  252. package/dist/standalone/.next/server/app/api/transcribe/backend/route.js.nft.json +1 -1
  253. package/dist/standalone/.next/server/app/api/transcribe/route.js +2 -2
  254. package/dist/standalone/.next/server/app/api/transcribe/route.js.nft.json +1 -1
  255. package/dist/standalone/.next/server/app/api/transcribe/token/route.js +2 -2
  256. package/dist/standalone/.next/server/app/api/transcribe/token/route.js.nft.json +1 -1
  257. package/dist/standalone/.next/server/app/api/tts/backend/route.js +1 -0
  258. package/dist/standalone/.next/server/app/api/tts/backend/route.js.nft.json +1 -0
  259. package/dist/standalone/.next/server/app/api/tts/backend/route_client-reference-manifest.js +1 -0
  260. package/dist/standalone/.next/server/app/api/tts/route.js +3 -0
  261. package/dist/standalone/.next/server/app/api/tts/route.js.nft.json +1 -0
  262. package/dist/standalone/.next/server/app/api/tts/route_client-reference-manifest.js +1 -0
  263. package/dist/standalone/.next/server/app/api/view/presence/route.js +2 -0
  264. package/dist/standalone/.next/server/app/api/view/presence/route.js.nft.json +1 -0
  265. package/dist/standalone/.next/server/app/api/view/presence/route_client-reference-manifest.js +1 -0
  266. package/dist/standalone/.next/server/app/api/workflows/[id]/route.js +1 -1
  267. package/dist/standalone/.next/server/app/api/workflows/[id]/route.js.nft.json +1 -1
  268. package/dist/standalone/.next/server/app/api/workflows/route.js +1 -1
  269. package/dist/standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  270. package/dist/standalone/.next/server/app/favicon.ico/route.js +1 -1
  271. package/dist/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  272. package/dist/standalone/.next/server/app/index.html +1 -1
  273. package/dist/standalone/.next/server/app/index.rsc +4 -4
  274. package/dist/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  275. package/dist/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  276. package/dist/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  277. package/dist/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  278. package/dist/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  279. package/dist/standalone/.next/server/app/page.js +57 -3
  280. package/dist/standalone/.next/server/app/page.js.nft.json +1 -1
  281. package/dist/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  282. package/dist/standalone/.next/server/app-paths-manifest.json +69 -12
  283. package/dist/standalone/.next/server/chunks/1068.js +1 -0
  284. package/dist/standalone/.next/server/chunks/1097.js +1 -0
  285. package/dist/standalone/.next/server/chunks/156.js +2 -0
  286. package/dist/standalone/.next/server/chunks/1699.js +1 -0
  287. package/dist/standalone/.next/server/chunks/1813.js +1 -0
  288. package/dist/standalone/.next/server/chunks/1911.js +1 -0
  289. package/dist/standalone/.next/server/chunks/1918.js +1 -0
  290. package/dist/standalone/.next/server/chunks/1920.js +27 -0
  291. package/dist/standalone/.next/server/chunks/2190.js +1 -0
  292. package/dist/standalone/.next/server/chunks/2596.js +1 -0
  293. package/dist/standalone/.next/server/chunks/2977.js +1 -0
  294. package/dist/standalone/.next/server/chunks/306.js +3 -0
  295. package/dist/standalone/.next/server/chunks/3313.js +1 -0
  296. package/dist/standalone/.next/server/chunks/3336.js +1 -0
  297. package/dist/standalone/.next/server/chunks/3438.js +2 -0
  298. package/dist/standalone/.next/server/chunks/3558.js +1 -0
  299. package/dist/standalone/.next/server/chunks/3587.js +1 -0
  300. package/dist/standalone/.next/server/chunks/3669.js +1 -0
  301. package/dist/standalone/.next/server/chunks/3817.js +1 -0
  302. package/dist/standalone/.next/server/chunks/3886.js +1 -0
  303. package/dist/standalone/.next/server/chunks/3944.js +1 -0
  304. package/dist/standalone/.next/server/chunks/4012.js +4 -0
  305. package/dist/standalone/.next/server/chunks/4127.js +1 -0
  306. package/dist/standalone/.next/server/chunks/4191.js +1 -0
  307. package/dist/standalone/.next/server/chunks/4260.js +2 -0
  308. package/dist/standalone/.next/server/chunks/4509.js +1 -0
  309. package/dist/standalone/.next/server/chunks/{741.js → 4741.js} +1 -1
  310. package/dist/standalone/.next/server/chunks/4792.js +101 -0
  311. package/dist/standalone/.next/server/chunks/4968.js +1 -0
  312. package/dist/standalone/.next/server/chunks/4972.js +2 -0
  313. package/dist/standalone/.next/server/chunks/5622.js +2 -0
  314. package/dist/standalone/.next/server/chunks/616.js +42 -0
  315. package/dist/standalone/.next/server/chunks/620.js +1 -0
  316. package/dist/standalone/.next/server/chunks/6299.js +4 -0
  317. package/dist/standalone/.next/server/chunks/6389.js +1 -0
  318. package/dist/standalone/.next/server/chunks/640.js +1 -0
  319. package/dist/standalone/.next/server/chunks/6826.js +2 -0
  320. package/dist/standalone/.next/server/chunks/6850.js +1 -0
  321. package/dist/standalone/.next/server/chunks/7471.js +85 -0
  322. package/dist/standalone/.next/server/chunks/7563.js +1 -0
  323. package/dist/standalone/.next/server/chunks/7722.js +1 -0
  324. package/dist/standalone/.next/server/chunks/8140.js +1 -0
  325. package/dist/standalone/.next/server/chunks/8176.js +1 -0
  326. package/dist/standalone/.next/server/chunks/8444.js +1 -0
  327. package/dist/standalone/.next/server/chunks/8576.js +1 -0
  328. package/dist/standalone/.next/server/chunks/8797.js +1 -0
  329. package/dist/standalone/.next/server/chunks/8966.js +2 -0
  330. package/dist/standalone/.next/server/chunks/9411.js +14 -0
  331. package/dist/standalone/.next/server/chunks/9598.js +1 -0
  332. package/dist/standalone/.next/server/chunks/9733.js +39 -0
  333. package/dist/standalone/.next/server/chunks/9936.js +6 -0
  334. package/dist/standalone/.next/server/chunks/9998.js +1 -0
  335. package/dist/standalone/.next/server/file-scanner-worker.js +4 -0
  336. package/dist/standalone/.next/server/files-response-worker.js +13 -0
  337. package/dist/standalone/.next/server/functions-config-manifest.json +57 -0
  338. package/dist/standalone/.next/server/instrumentation.js +1 -0
  339. package/dist/standalone/.next/server/middleware-build-manifest.js +1 -1
  340. package/dist/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  341. package/dist/standalone/.next/server/middleware.js +2 -2
  342. package/dist/standalone/.next/server/pages/404.html +1 -1
  343. package/dist/standalone/.next/server/pages/500.html +1 -1
  344. package/dist/standalone/.next/server/resource-collector-worker.js +1 -0
  345. package/dist/standalone/.next/server/server-reference-manifest.json +1 -1
  346. package/dist/standalone/.next/server/webpack-runtime.js +1 -1
  347. package/dist/standalone/.next/static/5aZdjqUDNxpxX8nVsuO2S/_buildManifest.js +1 -0
  348. package/dist/standalone/.next/static/chunks/1783.662e4b7044e5db2f.js +1 -0
  349. package/dist/standalone/.next/static/chunks/2345.c09668c2640f24ad.js +1 -0
  350. package/dist/standalone/.next/static/chunks/2462.217e83e51ac07519.js +1 -0
  351. package/dist/standalone/.next/static/chunks/3015.f61f117dd9ccb747.js +1 -0
  352. package/dist/standalone/.next/static/chunks/{794-0fc36bf1952fbc29.js → 3794-a205959ce301b5c6.js} +1 -1
  353. package/dist/standalone/.next/static/chunks/4bd1b696-c2f6e0877b6c10aa.js +1 -0
  354. package/dist/standalone/.next/static/chunks/6370.4f217a9379f47764.js +1 -0
  355. package/dist/standalone/.next/static/chunks/7067.f02e8d0616800bac.js +1 -0
  356. package/dist/standalone/.next/static/chunks/7297.aaa457b2a2939f7b.js +1 -0
  357. package/dist/standalone/.next/static/chunks/7774.cca1e546ab5623e0.js +1 -0
  358. package/dist/standalone/.next/static/chunks/8327.33abd84515b38836.js +1 -0
  359. package/dist/standalone/.next/static/chunks/858.302d545082b159c6.js +1 -0
  360. package/dist/standalone/.next/static/chunks/9260-0e7e550c65609f11.js +1 -0
  361. package/dist/standalone/.next/static/chunks/9583.b999fb5de3a3494a.js +1 -0
  362. package/dist/standalone/.next/static/chunks/app/_global-error/page-483eb859fba02a43.js +1 -0
  363. package/dist/standalone/.next/static/chunks/app/_not-found/page-9e7648417ae57bf7.js +1 -0
  364. package/dist/standalone/.next/static/chunks/app/api/access/route-483eb859fba02a43.js +1 -0
  365. package/dist/standalone/.next/static/chunks/app/api/account-migrations/[intentId]/route-483eb859fba02a43.js +1 -0
  366. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/[id]/status/route-483eb859fba02a43.js +1 -0
  367. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/active/route-483eb859fba02a43.js +1 -0
  368. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/login/[operationId]/input/route-483eb859fba02a43.js +1 -0
  369. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/login/[operationId]/route-483eb859fba02a43.js +1 -0
  370. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/policy/route-483eb859fba02a43.js +1 -0
  371. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/route-483eb859fba02a43.js +1 -0
  372. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/terminal/route-483eb859fba02a43.js +1 -0
  373. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/active/route-483eb859fba02a43.js +1 -0
  374. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/policy/route-483eb859fba02a43.js +1 -0
  375. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/route-483eb859fba02a43.js +1 -0
  376. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/terminal/route-483eb859fba02a43.js +1 -0
  377. package/dist/standalone/.next/static/chunks/app/api/accounts/route-483eb859fba02a43.js +1 -0
  378. package/dist/standalone/.next/static/chunks/app/api/agent/route-483eb859fba02a43.js +1 -0
  379. package/dist/standalone/.next/static/chunks/app/api/agent/snapshot/route-483eb859fba02a43.js +1 -0
  380. package/dist/standalone/.next/static/chunks/app/api/answer/route-483eb859fba02a43.js +1 -0
  381. package/dist/standalone/.next/static/chunks/app/api/attach-command/route-483eb859fba02a43.js +1 -0
  382. package/dist/standalone/.next/static/chunks/app/api/attention/[id]/route-483eb859fba02a43.js +1 -0
  383. package/dist/standalone/.next/static/chunks/app/api/attention/route-483eb859fba02a43.js +1 -0
  384. package/dist/standalone/.next/static/chunks/app/api/board/route-483eb859fba02a43.js +1 -0
  385. package/dist/standalone/.next/static/chunks/app/api/bridge/route-483eb859fba02a43.js +1 -0
  386. package/dist/standalone/.next/static/chunks/app/api/conversations/[conversationId]/migration/route-483eb859fba02a43.js +1 -0
  387. package/dist/standalone/.next/static/chunks/app/api/conversations/route-483eb859fba02a43.js +1 -0
  388. package/dist/standalone/.next/static/chunks/app/api/files/route-483eb859fba02a43.js +1 -0
  389. package/dist/standalone/.next/static/chunks/app/api/flows/[id]/route-483eb859fba02a43.js +1 -0
  390. package/dist/standalone/.next/static/chunks/app/api/flows/route-483eb859fba02a43.js +1 -0
  391. package/dist/standalone/.next/static/chunks/app/api/image/route-483eb859fba02a43.js +1 -0
  392. package/dist/standalone/.next/static/chunks/app/api/inbox/route-483eb859fba02a43.js +1 -0
  393. package/dist/standalone/.next/static/chunks/app/api/lifecycle/reaper/route-483eb859fba02a43.js +1 -0
  394. package/dist/standalone/.next/static/chunks/app/api/limits/history/route-483eb859fba02a43.js +1 -0
  395. package/dist/standalone/.next/static/chunks/app/api/limits/route-483eb859fba02a43.js +1 -0
  396. package/dist/standalone/.next/static/chunks/app/api/log/preflight/route-483eb859fba02a43.js +1 -0
  397. package/dist/standalone/.next/static/chunks/app/api/log/project-delete/route-483eb859fba02a43.js +1 -0
  398. package/dist/standalone/.next/static/chunks/app/api/log/route-483eb859fba02a43.js +1 -0
  399. package/dist/standalone/.next/static/chunks/app/api/logs/route-483eb859fba02a43.js +1 -0
  400. package/dist/standalone/.next/static/chunks/app/api/logs/stream/route-483eb859fba02a43.js +1 -0
  401. package/dist/standalone/.next/static/chunks/app/api/monitor/lock/route-483eb859fba02a43.js +1 -0
  402. package/dist/standalone/.next/static/chunks/app/api/monitor/runs/route-483eb859fba02a43.js +1 -0
  403. package/dist/standalone/.next/static/chunks/app/api/orchestrator/rotate/route-483eb859fba02a43.js +1 -0
  404. package/dist/standalone/.next/static/chunks/app/api/orchestrator/route-483eb859fba02a43.js +1 -0
  405. package/dist/standalone/.next/static/chunks/app/api/orchestrator/seat/route-483eb859fba02a43.js +1 -0
  406. package/dist/standalone/.next/static/chunks/app/api/pipelines/[id]/route-483eb859fba02a43.js +1 -0
  407. package/dist/standalone/.next/static/chunks/app/api/pipelines/preflight/route-483eb859fba02a43.js +1 -0
  408. package/dist/standalone/.next/static/chunks/app/api/pipelines/route-483eb859fba02a43.js +1 -0
  409. package/dist/standalone/.next/static/chunks/app/api/pipelines/tick/route-483eb859fba02a43.js +1 -0
  410. package/dist/standalone/.next/static/chunks/app/api/proc/route-483eb859fba02a43.js +1 -0
  411. package/dist/standalone/.next/static/chunks/app/api/push/route-483eb859fba02a43.js +1 -0
  412. package/dist/standalone/.next/static/chunks/app/api/resources/route-483eb859fba02a43.js +1 -0
  413. package/dist/standalone/.next/static/chunks/app/api/roles/route-483eb859fba02a43.js +1 -0
  414. package/dist/standalone/.next/static/chunks/app/api/runtime/answer/route-483eb859fba02a43.js +1 -0
  415. package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/[deploymentId]/route-483eb859fba02a43.js +1 -0
  416. package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/capabilities/v1/route-483eb859fba02a43.js +1 -0
  417. package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/route-483eb859fba02a43.js +1 -0
  418. package/dist/standalone/.next/static/chunks/app/api/runtime/interrupt/route-483eb859fba02a43.js +1 -0
  419. package/dist/standalone/.next/static/chunks/app/api/runtime/operations/[operationId]/route-483eb859fba02a43.js +1 -0
  420. package/dist/standalone/.next/static/chunks/app/api/runtime/operations/route-483eb859fba02a43.js +1 -0
  421. package/dist/standalone/.next/static/chunks/app/api/runtime/realtime/route-483eb859fba02a43.js +1 -0
  422. package/dist/standalone/.next/static/chunks/app/api/runtime/send/route-483eb859fba02a43.js +1 -0
  423. package/dist/standalone/.next/static/chunks/app/api/runtime/snapshot/route-483eb859fba02a43.js +1 -0
  424. package/dist/standalone/.next/static/chunks/app/api/runtime/spawn/route-483eb859fba02a43.js +1 -0
  425. package/dist/standalone/.next/static/chunks/app/api/runtime/steer/route-483eb859fba02a43.js +1 -0
  426. package/dist/standalone/.next/static/chunks/app/api/runtime/stream/route-483eb859fba02a43.js +1 -0
  427. package/dist/standalone/.next/static/chunks/app/api/session/route-483eb859fba02a43.js +1 -0
  428. package/dist/standalone/.next/static/chunks/app/api/session/supersedence/route-483eb859fba02a43.js +1 -0
  429. package/dist/standalone/.next/static/chunks/app/api/session/title/route-483eb859fba02a43.js +1 -0
  430. package/dist/standalone/.next/static/chunks/app/api/spawn/policy/route-483eb859fba02a43.js +1 -0
  431. package/dist/standalone/.next/static/chunks/app/api/spawn/route-483eb859fba02a43.js +1 -0
  432. package/dist/standalone/.next/static/chunks/app/api/staging/route-483eb859fba02a43.js +1 -0
  433. package/dist/standalone/.next/static/chunks/app/api/task-attachments/route-483eb859fba02a43.js +1 -0
  434. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/assignment/route-483eb859fba02a43.js +1 -0
  435. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/route-483eb859fba02a43.js +1 -0
  436. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/send/route-483eb859fba02a43.js +1 -0
  437. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/spawn/route-483eb859fba02a43.js +1 -0
  438. package/dist/standalone/.next/static/chunks/app/api/tasks/curator/route-483eb859fba02a43.js +1 -0
  439. package/dist/standalone/.next/static/chunks/app/api/tasks/route-483eb859fba02a43.js +1 -0
  440. package/dist/standalone/.next/static/chunks/app/api/timeline/route-483eb859fba02a43.js +1 -0
  441. package/dist/standalone/.next/static/chunks/app/api/tmux/route-483eb859fba02a43.js +1 -0
  442. package/dist/standalone/.next/static/chunks/app/api/tmux/targets/route-483eb859fba02a43.js +1 -0
  443. package/dist/standalone/.next/static/chunks/app/api/transcribe/backend/route-483eb859fba02a43.js +1 -0
  444. package/dist/standalone/.next/static/chunks/app/api/transcribe/route-483eb859fba02a43.js +1 -0
  445. package/dist/standalone/.next/static/chunks/app/api/transcribe/token/route-483eb859fba02a43.js +1 -0
  446. package/dist/standalone/.next/static/chunks/app/api/tts/backend/route-483eb859fba02a43.js +1 -0
  447. package/dist/standalone/.next/static/chunks/app/api/tts/route-483eb859fba02a43.js +1 -0
  448. package/dist/standalone/.next/static/chunks/app/api/view/presence/route-483eb859fba02a43.js +1 -0
  449. package/dist/standalone/.next/static/chunks/app/api/workflows/[id]/route-483eb859fba02a43.js +1 -0
  450. package/dist/standalone/.next/static/chunks/app/api/workflows/route-483eb859fba02a43.js +1 -0
  451. package/dist/standalone/.next/static/chunks/app/layout-c8390ace9b222dd6.js +1 -0
  452. package/dist/standalone/.next/static/chunks/app/page-45fd788b5dbb86eb.js +57 -0
  453. package/dist/standalone/.next/static/chunks/framework-d1de002210ddaaef.js +1 -0
  454. package/dist/standalone/.next/static/chunks/{main-3cec32f88450e0e3.js → main-343fc547124ab6ff.js} +2 -2
  455. package/dist/standalone/.next/static/chunks/main-app-63e09a6ca85925cd.js +1 -0
  456. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-483eb859fba02a43.js +1 -0
  457. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-483eb859fba02a43.js +1 -0
  458. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-a07ea5db82382b93.js +1 -0
  459. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-483eb859fba02a43.js +1 -0
  460. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-483eb859fba02a43.js +1 -0
  461. package/dist/standalone/.next/static/chunks/webpack-46c1a0323c2ca312.js +1 -0
  462. package/dist/standalone/.next/static/css/b5b2fbc52caf460a.css +1 -0
  463. package/dist/standalone/package.json +24 -5
  464. package/dist/standalone/server.js +1 -1
  465. package/package.json +24 -5
  466. package/dist/standalone/.next/server/chunks/628.js +0 -2
  467. package/dist/standalone/.next/server/chunks/747.js +0 -4
  468. package/dist/standalone/.next/server/chunks/813.js +0 -1
  469. package/dist/standalone/.next/server/chunks/918.js +0 -1
  470. package/dist/standalone/.next/server/chunks/998.js +0 -1
  471. package/dist/standalone/.next/static/1zBZBxWRgFSxgBSMGbD40/_buildManifest.js +0 -1
  472. package/dist/standalone/.next/static/chunks/4bd1b696-215e5051988c3dde.js +0 -1
  473. package/dist/standalone/.next/static/chunks/647-0b14204033b8658c.js +0 -1
  474. package/dist/standalone/.next/static/chunks/app/_global-error/page-d0de276a8c0b264e.js +0 -1
  475. package/dist/standalone/.next/static/chunks/app/_not-found/page-811f7dc4ec7ef451.js +0 -1
  476. package/dist/standalone/.next/static/chunks/app/api/access/route-d0de276a8c0b264e.js +0 -1
  477. package/dist/standalone/.next/static/chunks/app/api/answer/route-d0de276a8c0b264e.js +0 -1
  478. package/dist/standalone/.next/static/chunks/app/api/files/route-d0de276a8c0b264e.js +0 -1
  479. package/dist/standalone/.next/static/chunks/app/api/flows/[id]/route-d0de276a8c0b264e.js +0 -1
  480. package/dist/standalone/.next/static/chunks/app/api/flows/route-d0de276a8c0b264e.js +0 -1
  481. package/dist/standalone/.next/static/chunks/app/api/image/route-d0de276a8c0b264e.js +0 -1
  482. package/dist/standalone/.next/static/chunks/app/api/inbox/route-d0de276a8c0b264e.js +0 -1
  483. package/dist/standalone/.next/static/chunks/app/api/limits/route-d0de276a8c0b264e.js +0 -1
  484. package/dist/standalone/.next/static/chunks/app/api/log/route-d0de276a8c0b264e.js +0 -1
  485. package/dist/standalone/.next/static/chunks/app/api/logs/route-d0de276a8c0b264e.js +0 -1
  486. package/dist/standalone/.next/static/chunks/app/api/logs/stream/route-d0de276a8c0b264e.js +0 -1
  487. package/dist/standalone/.next/static/chunks/app/api/proc/route-d0de276a8c0b264e.js +0 -1
  488. package/dist/standalone/.next/static/chunks/app/api/push/route-d0de276a8c0b264e.js +0 -1
  489. package/dist/standalone/.next/static/chunks/app/api/resources/route-d0de276a8c0b264e.js +0 -1
  490. package/dist/standalone/.next/static/chunks/app/api/session/route-d0de276a8c0b264e.js +0 -1
  491. package/dist/standalone/.next/static/chunks/app/api/spawn/route-d0de276a8c0b264e.js +0 -1
  492. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/assignment/route-d0de276a8c0b264e.js +0 -1
  493. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/route-d0de276a8c0b264e.js +0 -1
  494. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/send/route-d0de276a8c0b264e.js +0 -1
  495. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/spawn/route-d0de276a8c0b264e.js +0 -1
  496. package/dist/standalone/.next/static/chunks/app/api/tasks/curator/route-d0de276a8c0b264e.js +0 -1
  497. package/dist/standalone/.next/static/chunks/app/api/tasks/route-d0de276a8c0b264e.js +0 -1
  498. package/dist/standalone/.next/static/chunks/app/api/timeline/route-d0de276a8c0b264e.js +0 -1
  499. package/dist/standalone/.next/static/chunks/app/api/tmux/route-d0de276a8c0b264e.js +0 -1
  500. package/dist/standalone/.next/static/chunks/app/api/tmux/targets/route-d0de276a8c0b264e.js +0 -1
  501. package/dist/standalone/.next/static/chunks/app/api/transcribe/backend/route-d0de276a8c0b264e.js +0 -1
  502. package/dist/standalone/.next/static/chunks/app/api/transcribe/route-d0de276a8c0b264e.js +0 -1
  503. package/dist/standalone/.next/static/chunks/app/api/transcribe/token/route-d0de276a8c0b264e.js +0 -1
  504. package/dist/standalone/.next/static/chunks/app/api/workflows/[id]/route-d0de276a8c0b264e.js +0 -1
  505. package/dist/standalone/.next/static/chunks/app/api/workflows/route-d0de276a8c0b264e.js +0 -1
  506. package/dist/standalone/.next/static/chunks/app/layout-22e93960d4e3259a.js +0 -1
  507. package/dist/standalone/.next/static/chunks/app/page-366d38b70e7c65be.js +0 -2
  508. package/dist/standalone/.next/static/chunks/framework-93cda6578f6c76ec.js +0 -1
  509. package/dist/standalone/.next/static/chunks/main-app-e6ff5fbff7d5b38f.js +0 -1
  510. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d0de276a8c0b264e.js +0 -1
  511. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d0de276a8c0b264e.js +0 -1
  512. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-2b3b5eea82b805ca.js +0 -1
  513. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d0de276a8c0b264e.js +0 -1
  514. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d0de276a8c0b264e.js +0 -1
  515. package/dist/standalone/.next/static/chunks/webpack-7dc14fd5ff1227ce.js +0 -1
  516. package/dist/standalone/.next/static/css/f00940d29be5c41d.css +0 -1
  517. /package/dist/standalone/.next/static/{1zBZBxWRgFSxgBSMGbD40 → 5aZdjqUDNxpxX8nVsuO2S}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -1,30 +1,66 @@
1
- # Live Log Viewer
1
+ # Agent Log Viewer
2
2
 
3
3
  `agent-log-viewer` is a local web UI that turns raw Codex / Claude Code agent
4
4
  logs into a readable, live-updating chat feed. It discovers every session,
5
5
  subagent and background shell task on your machine, links them into a
6
6
  parent→child tree, and tails the selected one in real time.
7
7
 
8
- Everything runs locally against files already on disk. There is no database and
9
- no external service — the app reads `~/.claude` and `~/.codex` and renders what
10
- it finds.
8
+ ![From the overview board into a session and its live tail](docs/media/board-to-live-tail.gif)
9
+
10
+ The default setup runs locally against files already on disk. The app uses no
11
+ database; it reads `~/.claude` and `~/.codex` and renders what it finds.
12
+ Optional outbound integrations stay disabled until you configure them:
13
+
14
+ ```bash
15
+ bunx agent-log-viewer # or: npx agent-log-viewer
16
+ ```
17
+
18
+ See [WakaTime activity integration](docs/wakatime.md) for opt-in activity
19
+ export, its disclosure boundary, and disablement steps.
20
+
21
+ Prefer video? A 45-second cut of the full flow lives at
22
+ [docs/media/demo.mp4](docs/media/demo.mp4).
23
+
24
+ ## The tour
25
+
26
+ ### Read any session as a chat
27
+
28
+ User bubbles, assistant prose, tool-call cards with ✓/✗ statuses, expandable
29
+ command output and diffs — for **Claude Code** sessions and their subagents
30
+ (`~/.claude/projects/**/*.jsonl`), **Codex CLI** rollouts
31
+ (`~/.codex/sessions/**/rollout-*.jsonl`) with command cards, patches and
32
+ service events, and **background shell tasks** (recovered from the transcript
33
+ and shown above the terminal output).
11
34
 
12
35
  ![The chat feed: user bubbles, assistant prose, and tool-call cards with
13
36
  statuses and expandable output](docs/media/chat-feed.png)
14
37
 
15
- ## What it shows
38
+ ### Spawn agents from the board
39
+
40
+ Each project is a pannable, zoomable scheme — root conversations on top,
41
+ spawned agents one generation below, arrows colored by engine. Draft a new
42
+ agent right on the board: pick Claude or Codex, a model and reasoning effort,
43
+ type the first prompt, and it launches into tmux.
16
44
 
17
- - **Claude Code sessions** (`~/.claude/projects/**/*.jsonl`) and their
18
- subagents, rendered as a chat: user bubbles, assistant prose, tool-call
19
- cards with ✓/✗ statuses and expandable output.
20
- - **Codex CLI sessions** (`~/.codex/sessions/**/rollout-*.jsonl`) with command
21
- cards, patches and service events.
22
- - **Background shell tasks** (`claude-<uid>/**/tasks/*.output` under the OS
23
- temp dir — `/tmp` on Linux, `$TMPDIR` on macOS) — the originating Bash
24
- command is recovered from the session transcript and shown above the
25
- terminal output.
45
+ ![Drafting and configuring a new agent on the project board](docs/media/spawn-agent.gif)
26
46
 
27
- ## Highlights
47
+ ### Run implement → review loops
48
+
49
+ The viewer orchestrates review cycles: a long-lived implementer in tmux, a
50
+ fresh read-only reviewer each round over the full diff, findings relayed
51
+ automatically, and a verdict deck in the scheme view.
52
+
53
+ ![A review loop: round 1 requested changes, round 2 re-checks live](docs/media/review-loop.gif)
54
+
55
+ ### Answer a blocked agent from the browser
56
+
57
+ When an agent stops on an `AskUserQuestion`, the question surfaces as a card
58
+ with clickable options. The answer is delivered into the agent's tmux pane and
59
+ confirmed against the transcript — the agent just keeps going.
60
+
61
+ ![Answering a pending AskUserQuestion from the feed](docs/media/pending-question.gif)
62
+
63
+ ### And everything around it
28
64
 
29
65
  - **Parentage tree**: session → subagents → rollouts → background tasks, built
30
66
  server-side by scanning transcripts (append-only incremental,
@@ -33,15 +69,10 @@ statuses and expandable output](docs/media/chat-feed.png)
33
69
  it is mid-turn and *done* once the final assistant message lands.
34
70
  - **Deep links**: every selection is reflected in the URL (`#f=<path>`), so a
35
71
  link opens that exact log.
36
- - **Project scheme**: each project is a pannable, zoomable diagram — the root
37
- conversation on top, spawned agents one generation below, arrows colored by
38
- engine. Quiet branches and tasks collapse under their nearest ancestor.
39
- - **English or Ukrainian UI**, model chips (`fable-5`, `gpt-5.5`, `sonnet`…),
72
+ - **English or Ukrainian UI**, model chips (`opus`, `gpt-5.6-sol`, `sonnet`…),
40
73
  collapsible tree with persisted state, follow-mode autoscroll, service-event
41
74
  toggle, and a line filter.
42
75
 
43
- ## Screenshots
44
-
45
76
  The session parentage tree, wiring root conversations to their spawned agents:
46
77
 
47
78
  ![Session parentage tree](docs/media/session-tree.png)
@@ -50,9 +81,12 @@ The session parentage tree, wiring root conversations to their spawned agents:
50
81
  | --- | --- |
51
82
  | ![Codex session with command cards and patches](docs/media/codex-session.png) | ![Overview board across projects](docs/media/overview-board.png) |
52
83
 
84
+ All media above is regenerated deterministically from a synthetic fixture —
85
+ see [docs/media/README.md](docs/media/README.md).
86
+
53
87
  ## Run
54
88
 
55
- The package is published to npm, so the quickstart needs no clone:
89
+ The package is published to npm, so the quickstart above needs no clone:
56
90
 
57
91
  ```bash
58
92
  bunx agent-log-viewer
@@ -69,7 +103,7 @@ With bun:
69
103
  ```bash
70
104
  bun install
71
105
  bun run build
72
- bun start --port 8898 --hostname 127.0.0.1
106
+ bun --bun node_modules/.bin/next start --port 8898 --hostname 127.0.0.1
73
107
  # open http://127.0.0.1:8898/
74
108
  ```
75
109
 
@@ -85,24 +119,173 @@ npm start -- --port 8898 --hostname 127.0.0.1
85
119
  development, `bun dev` runs the app with hot reload (it needs a high OS
86
120
  file-watch limit for large home directories).
87
121
 
122
+ The gated SQLite registry modes require the Viewer server to run on Bun.
123
+ Structured host mode requires Bun too — the runtime journal runs on `bun:sqlite`,
124
+ and on macOS process ownership uses the kernel's microsecond start token. Since
125
+ structured hosting is on by default, the Docker runtime and `agent-log-viewer`
126
+ CLI select Bun unless `LLV_STRUCTURED_HOSTS=0` rolls it back and
127
+ `LLV_AGENT_REGISTRY_SQLITE` is off. Local source checkouts should use the
128
+ explicit `bun --bun` command above.
129
+
130
+ ### Spawn transport
131
+
132
+ Agents launch through a structured runtime host — no tmux pane between the
133
+ Viewer and the agent — wherever a deployment can serve one. The transport is
134
+ chosen by capability: a deployment that declares `LLV_RUNTIME_HOST_SOCKET`
135
+ spawns structured, and one without a host still spawns through tmux instead of
136
+ failing. Structured hosting itself is on by default; `LLV_STRUCTURED_HOSTS=0`,
137
+ `LLV_RUNTIME_EVENTS=0`, and `NEXT_PUBLIC_RUNTIME_UI=0` are rollback switches.
138
+ Each of the three sends the implicit choice back to tmux, so reaching for one
139
+ during an incident never costs the ability to spawn. They accept the spellings
140
+ an env file actually produces — `0`, `" 0 "`, `'0'`, `false`, `off`, `no` — and
141
+ an unset variable means the default is on.
142
+
143
+ `LLV_SPAWN_TRANSPORT=tmux|structured` overrides the choice. An explicit
144
+ `structured` without a reachable host returns a gap naming what is missing
145
+ rather than quietly downgrading the request.
146
+
147
+ ### Connect an orchestrator through MCP
148
+
149
+ The package includes `agent-log-viewer-mcp`, a local stdio MCP server. It
150
+ invokes Viewer services in-process and shares their durable stores, locks, and
151
+ idempotency rules. Keep the Viewer package and the MCP process under the same
152
+ OS user so they resolve the same state directory.
153
+
154
+ For an installed package, add this server to the orchestrator's standard MCP
155
+ configuration:
156
+
157
+ ```json
158
+ {
159
+ "mcpServers": {
160
+ "viewer": {
161
+ "command": "agent-log-viewer-mcp"
162
+ }
163
+ }
164
+ }
165
+ ```
166
+
167
+ For a local clone, point the client at the launcher:
168
+
169
+ ```json
170
+ {
171
+ "mcpServers": {
172
+ "viewer": {
173
+ "command": "bun",
174
+ "args": ["/absolute/path/to/live-log-viewer-next/bin/mcp-server.mjs"]
175
+ }
176
+ }
177
+ }
178
+ ```
179
+
180
+ Quick install from the CLI:
181
+
182
+ ```bash
183
+ # Claude Code (user scope)
184
+ claude mcp add viewer -s user -- bun /absolute/path/to/live-log-viewer-next/bin/mcp-server.mjs
185
+
186
+ # Codex — append to ~/.codex/config.toml
187
+ [mcp_servers.viewer]
188
+ command = "bun"
189
+ args = ["/absolute/path/to/live-log-viewer-next/bin/mcp-server.mjs"]
190
+ ```
191
+
192
+ To register the server everywhere at once — the operator's Claude Code and
193
+ Codex configs plus every Viewer-managed account under
194
+ `~/.config/agent-log-viewer/accounts` (their spawned agents each run with
195
+ their own `CLAUDE_CONFIG_DIR`/`CODEX_HOME`, so each account needs its own
196
+ registration) — run the idempotent installer and re-run it after adding
197
+ accounts:
198
+
199
+ ```bash
200
+ scripts/install-mcp.sh # uses the managed stable launcher when present
201
+ LLV_MCP_BIN=/path/to/mcp-server.mjs \
202
+ scripts/install-mcp.sh # select an explicit launcher
203
+ ```
204
+
205
+ Exact deployments keep the managed executable at
206
+ `~/.agents/tools/llv-mcp-runtime/bin/mcp-server.mjs`. Existing Claude and
207
+ Codex registrations retain that path. Each fresh MCP process reads the atomic
208
+ Viewer release target and starts the runtime bundle staged from the same
209
+ revision. Deployment receipts expose the staged runtime digest plus durable
210
+ activation or restore evidence.
211
+
212
+ The server name must stay `viewer` (or another `isViewerMcpServer()` match:
213
+ `viewer-*`, `agent-log-viewer*`) — transcript calls attributed to other names
214
+ do not render as Viewer cards.
215
+
216
+ The MCP surface includes:
217
+
218
+ - conversations and the board: `board_snapshot`, `list_conversations`,
219
+ `get_conversation`, `send_message`, and `conversation_action` for
220
+ `interrupt`, `kill`, `resume`, `compact`, and `dialog-key`;
221
+ - review flows: `list_flows`, `get_flow`, and `flow_action`;
222
+ - pipelines: `create_pipeline`, `list_pipelines`, `get_pipeline`,
223
+ `pipeline_action`, and `link_task_to_pipeline`;
224
+ - tasks: `create_task`, `list_tasks`, `get_task`, and `update_task`;
225
+ - operator/runtime reads: `operator_snapshot`, `deployment_status`, and
226
+ `resources`;
227
+ - agent liveness and lifecycle: `agent_activity` for the per-conversation
228
+ `{lastRecordAt, turnState, host alive/gone, stalledForMs}` stall snapshot, and
229
+ `lifecycle_events` for the durable lifecycle journal (`mode: "query"`, by
230
+ project/pipeline/conversation and cursor) and its bounded relay digest
231
+ (`mode: "digest"`, terminal events immediately, routine progress coalesced and
232
+ rate-limited to one per five minutes per subscriber);
233
+ - agent/runtime mutations: `spawn_agent`, `conversation_migration`, and
234
+ `deploy_exact_sha`;
235
+ - the operator's attention: `request_attention`, which offers to move their
236
+ Viewer to a target and waits for their answer. It only asks — nothing moves
237
+ until they agree on a device, and the request names the root agent by an
238
+ identity the server resolves, never one the caller supplies.
239
+
240
+ Every call requires a stable `clientRequestId`. Reusing that id with the same
241
+ arguments returns the durable result as a replay. Reusing it with different
242
+ arguments returns an idempotency conflict. Read tools are inert, bounded, and
243
+ secret-redacted. Mutating tools return stable operation receipts, and their
244
+ durable MCP receipt prevents a replay from applying the action twice.
245
+ `deploy_exact_sha` accepts a full 40-character commit SHA and requires
246
+ `confirm: "deploy"`.
247
+
248
+ The package exposes the MCP launcher as `agent-log-viewer/mcp-server` in
249
+ addition to the `agent-log-viewer-mcp` executable.
250
+
251
+ Tool results contain the durable entity identifiers available for that action,
252
+ including conversation ids, transcript paths, pipeline ids, task ids, and
253
+ runtime operation ids. Viewer transcripts render calls attributed to the `viewer` MCP
254
+ server as live cards and turn those identifiers into navigation chips.
255
+
88
256
  **Prerequisites:** Node ≥ 20.9, and bun or npm/pnpm. `tmux` is optional — see
89
257
  [Platform support](#platform-support).
90
258
 
91
259
  ### Docker (reproducible runtime)
92
260
 
93
261
  For a pinned, reproducible deployment the repo ships a `Dockerfile` and
94
- `docker-compose.yml` that build `.next` inside the image and run the viewer
95
- with host parity (the container reuses your real `tmux`, `claude`, `codex` and
96
- home directory). This is how the maintainer's own prod instance runs.
262
+ `docker-compose.yml` that build `.next` inside the image and run the Viewer
263
+ with host parity. The container reuses your real `tmux`, `claude`, `codex`, and
264
+ home directory. Runtime-host owns production releases and the listener.
265
+ Complete the [bootstrap listener migration](docs/docker.md#bootstrap-listener-ownership)
266
+ before the first runtime-host activation.
97
267
 
98
268
  ```bash
99
- docker compose up -d viewer # prod on 127.0.0.1:8898, restarts on reboot
269
+ export LLV_DOCKER_GID="$(stat -c %g /var/run/docker.sock)"
270
+ LLV_RUNTIME_EVENTS=1 LLV_VIEWER_DEPLOYMENTS=1 docker compose --profile runtime-host up -d runtime-host
271
+ scripts/rebuild.sh
100
272
  LLV_TEST_PORT=8901 docker compose --profile test up -d viewer-test
101
273
  ```
102
274
 
103
275
  See [docs/docker.md](docs/docker.md) for the parity model, the nsenter shims,
104
276
  and volume/port details.
105
277
 
278
+ ### Attach to a live tmux pane
279
+
280
+ The Viewer resolves and copies a complete command for each live pane. Paste that command into a normal shell; it selects the supervisor endpoint and the current pane coordinate. The read-only variant adds `-r`.
281
+
282
+ ```bash
283
+ TMUX_TMPDIR='/run/user/1000/agent-log-viewer' tmux attach-session -t 'agents:2.0'
284
+ TMUX_TMPDIR='/run/user/1000/agent-log-viewer' tmux attach-session -r -t 'agents:2.0'
285
+ ```
286
+
287
+ Detach with `Ctrl-b d` and the agent keeps running. An unqualified tmux command may use a different server. Refresh and copy again after a stale-pane or restarted-server message; the fresh command accounts for window renumbering. See [the Docker guide](docs/docker.md#attach-to-a-viewer-pane) for the supervisor migration context.
288
+
106
289
  ### CLI options
107
290
 
108
291
  ```
@@ -167,7 +350,9 @@ The viewer orchestrates implement→review cycles: a long-lived implementer
167
350
  agent in tmux, a fresh read-only reviewer per round over the full diff,
168
351
  automatic relay of findings, and a verdict deck in the scheme view. Start one
169
352
  from the **Flow** chip above a conversation pane; presets pair engines and
170
- reasoning efforts per role (e.g. `Codex high → Fable`).
353
+ reasoning efforts per role (e.g. `Terra high → Sol xhigh`). New Codex agents
354
+ also expose explicit GPT-5.6-Sol and GPT-5.6-Terra choices beside effort and
355
+ speed.
171
356
 
172
357
  See [docs/review-loop.md](docs/review-loop.md) for the round protocol,
173
358
  presets, the HTTP automation API, and troubleshooting. A Claude Code skill
@@ -230,6 +415,10 @@ All optional. Transcription variables are documented in full in
230
415
  | `LLV_WHISPER_VENV` | Path to the whisper virtualenv (default `~/.cache/agent-log-viewer/whisper-venv`). |
231
416
  | `LLV_ELEVENLABS_STT_MODEL` | ElevenLabs batch model override. |
232
417
  | `ELEVENLABS_API_KEY` | ElevenLabs API key for the ElevenLabs backend. |
418
+ | `LLV_REAPER_ENABLED` | `1` enables verified pane and detached-reviewer process cleanup by the deterministic agent reaper. Unset keeps dry-run mode and exposes its latest report at `GET /api/lifecycle/reaper`. |
419
+ | `LLV_SCHEME_PROJECT_CAP` | Number of most-recent projects rendered by the scheme feed (default `10`). List and search remain complete. |
420
+ | `LLV_SCHEME_CARDS_PER_PROJECT` | Maximum scanner entries rendered per scheme project (default `80`). List and search remain complete. |
421
+ | `LLV_HEADLESS_REAPER_THRESHOLD_MS` | Minimum age in milliseconds for the always-active leaked Codex/MCP safety reaper (default `7200000`, two hours; minimum accepted value `60000`). |
233
422
  | `LLV_DOCKER_NSENTER_SHIMS` | `1` makes the agent CLI resolver prefer the container's `/usr/local/bin` nsenter shims for host CLIs. Set automatically by the Docker image; leave unset on a host runtime. See [docs/docker.md](docs/docker.md). |
234
423
 
235
424
  ## Config paths
@@ -242,8 +431,9 @@ package:
242
431
  - `~/.cache/agent-log-viewer/whisper-venv` — the local transcription
243
432
  virtualenv.
244
433
 
245
- Legacy `live-log-viewer` paths are still honored as read-only fallbacks, so
246
- existing setups keep working without changes.
434
+ Legacy `live-log-viewer` paths remain valid fallbacks. When a legacy config or
435
+ cache file is the resolved existing file, subsequent updates keep using that
436
+ same path so existing setups continue without a forced move.
247
437
 
248
438
  ## Architecture
249
439
 
package/bin/cli.mjs CHANGED
@@ -8,6 +8,14 @@ import { dirname, join } from "node:path";
8
8
  import { fileURLToPath } from "node:url";
9
9
 
10
10
  import { detectTailscale, getToken, readStatus, serve as serveTailscale, TailscaleError } from "./tailscale.mjs";
11
+ import {
12
+ discardWakatimeEnvironmentCredential,
13
+ viewerChildProcessOptions,
14
+ viewerServerBunRuntime,
15
+ withoutWakatimeCredential,
16
+ } from "./server-runtime.mjs";
17
+
18
+ discardWakatimeEnvironmentCredential();
11
19
 
12
20
  const DEFAULT_PORT = 8898;
13
21
  const DEFAULT_HOSTNAME = "127.0.0.1";
@@ -44,6 +52,7 @@ Options:
44
52
  --tailscale Access over Tailscale
45
53
  --no-open Don't open the browser
46
54
  --new-token Create a new access key
55
+ --new-operator-token Rotate the operator spawn capability
47
56
  -v, --version Show the version
48
57
  -h, --help Show this help`,
49
58
  badPort: (value) => `Invalid port: ${value}`,
@@ -74,6 +83,7 @@ Options:
74
83
  --tailscale Доступ через Tailscale
75
84
  --no-open Не відкривати браузер
76
85
  --new-token Створити новий ключ доступу
86
+ --new-operator-token Оновити операторський ключ запуску агентів
77
87
  -v, --version Показати версію
78
88
  -h, --help Показати довідку`,
79
89
  badPort: (value) => `Некоректний порт: ${value}`,
@@ -131,6 +141,7 @@ function parseArgs(args) {
131
141
  tailscale: false,
132
142
  noOpen: false,
133
143
  newToken: false,
144
+ newOperatorToken: false,
134
145
  help: false,
135
146
  version: false,
136
147
  };
@@ -159,6 +170,8 @@ function parseArgs(args) {
159
170
  options.noOpen = true;
160
171
  } else if (arg === "--new-token") {
161
172
  options.newToken = true;
173
+ } else if (arg === "--new-operator-token") {
174
+ options.newOperatorToken = true;
162
175
  } else if (arg === "-v" || arg === "--version") {
163
176
  options.version = true;
164
177
  } else if (arg === "-h" || arg === "--help") {
@@ -206,11 +219,15 @@ function readPackageJson(packageRoot) {
206
219
  }
207
220
 
208
221
  function resolveServer(packageRoot) {
222
+ const bunRuntime = viewerServerBunRuntime();
223
+ const commandFor = (command, args, bunEntry = command, bunArgs = args) => bunRuntime
224
+ ? { command: bunRuntime, args: ["--bun", bunEntry, ...bunArgs] }
225
+ : { command, args };
209
226
  const publishedStandalone = join(packageRoot, "dist", "standalone", "server.js");
210
227
  if (existsSync(publishedStandalone)) {
228
+ const launch = commandFor(process.execPath, [publishedStandalone], publishedStandalone, []);
211
229
  return {
212
- command: process.execPath,
213
- args: [publishedStandalone],
230
+ ...launch,
214
231
  cwd: join(packageRoot, "dist", "standalone"),
215
232
  label: "server.js",
216
233
  };
@@ -218,9 +235,9 @@ function resolveServer(packageRoot) {
218
235
 
219
236
  const repoStandalone = join(packageRoot, ".next", "standalone", "server.js");
220
237
  if (existsSync(repoStandalone)) {
238
+ const launch = commandFor(process.execPath, [repoStandalone], repoStandalone, []);
221
239
  return {
222
- command: process.execPath,
223
- args: [repoStandalone],
240
+ ...launch,
224
241
  cwd: join(packageRoot, ".next", "standalone"),
225
242
  label: "server.js",
226
243
  };
@@ -232,8 +249,7 @@ function resolveServer(packageRoot) {
232
249
  }
233
250
 
234
251
  return {
235
- command: nextBin,
236
- args: ["start"],
252
+ ...commandFor(nextBin, ["start"]),
237
253
  cwd: packageRoot,
238
254
  label: "next start",
239
255
  };
@@ -241,7 +257,7 @@ function resolveServer(packageRoot) {
241
257
 
242
258
  function buildChildEnv(options, runtime) {
243
259
  const env = {
244
- ...process.env,
260
+ ...withoutWakatimeCredential(process.env),
245
261
  PORT: String(options.port),
246
262
  // zsh exports HOSTNAME with the machine name on this user's machine; setting it here keeps standalone bound to the requested address.
247
263
  HOSTNAME: options.hostname,
@@ -259,15 +275,19 @@ function buildChildEnv(options, runtime) {
259
275
  env.LLV_TS_URL = runtime.tailnetUrl;
260
276
  }
261
277
 
278
+ if (options.newOperatorToken) {
279
+ env.LLV_ROTATE_OPERATOR_SPAWN_CAPABILITY = "1";
280
+ }
281
+
262
282
  return env;
263
283
  }
264
284
 
265
285
  function startServer(server, options, runtime, tailscaleProcessRef) {
266
- const child = spawn(server.command, server.args, {
286
+ const child = spawn(server.command, server.args, viewerChildProcessOptions({
267
287
  cwd: server.cwd,
268
288
  env: buildChildEnv(options, runtime),
269
289
  stdio: ["ignore", "inherit", "pipe"],
270
- });
290
+ }));
271
291
 
272
292
  const state = {
273
293
  sawAddressInUse: false,
@@ -368,7 +388,7 @@ function localUrl(options) {
368
388
  }
369
389
 
370
390
  function printBanner(version, options) {
371
- console.log(` ✳ Live Log Viewer v${version}`);
391
+ console.log(` ✳ Agent Log Viewer v${version}`);
372
392
  console.log(m.bannerOpened(localUrl(options)));
373
393
  console.log(m.bannerReads());
374
394
  console.log(m.bannerStop());
@@ -400,10 +420,10 @@ function openBrowser(url) {
400
420
  return;
401
421
  }
402
422
 
403
- const child = spawn(opener, [url], {
423
+ const child = spawn(opener, [url], viewerChildProcessOptions({
404
424
  stdio: "ignore",
405
425
  detached: true,
406
- });
426
+ }));
407
427
  child.unref();
408
428
  }
409
429
 
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawn } from "node:child_process";
4
+ import { createHash } from "node:crypto";
5
+ import { existsSync, fstatSync, readFileSync } from "node:fs";
6
+ import { dirname, join } from "node:path";
7
+ import { fileURLToPath, pathToFileURL } from "node:url";
8
+
9
+ import {
10
+ discardWakatimeEnvironmentCredential,
11
+ viewerChildProcessOptions,
12
+ viewerServerBunRuntime,
13
+ } from "./server-runtime.mjs";
14
+
15
+ discardWakatimeEnvironmentCredential();
16
+
17
+ const packageRoot = join(dirname(fileURLToPath(import.meta.url)), "..");
18
+
19
+ function deployedPackageRoot() {
20
+ const configRoot = process.env.XDG_CONFIG_HOME || join(process.env.HOME || "/home/user", ".config");
21
+ const stateDir = process.env.LLV_STATE_DIR || join(configRoot, "agent-log-viewer", "state");
22
+ const targetFile = process.env.LLV_VIEWER_DEPLOY_TARGET || join(stateDir, "viewer-release.json");
23
+ let target;
24
+ try {
25
+ target = JSON.parse(readFileSync(targetFile, "utf8"));
26
+ } catch (error) {
27
+ if (error?.code === "ENOENT") return packageRoot;
28
+ throw new Error(`Could not read the Viewer release target: ${error instanceof Error ? error.message : String(error)}`);
29
+ }
30
+ if (!target
31
+ || typeof target !== "object"
32
+ || Array.isArray(target)
33
+ || typeof target.image !== "string"
34
+ || typeof target.container !== "string"
35
+ || typeof target.endpoint !== "string"
36
+ || typeof target.revision !== "string"
37
+ || !/^[0-9a-f]{40}$/.test(target.revision)) {
38
+ throw new Error("The active Viewer release target is invalid.");
39
+ }
40
+ const runtime = target.mcpRuntime;
41
+ if (runtime === undefined) return packageRoot;
42
+ if (!runtime
43
+ || typeof runtime !== "object"
44
+ || runtime.source !== "managed"
45
+ || typeof runtime.releaseId !== "string"
46
+ || !/^[a-z0-9-]+$/.test(runtime.releaseId)
47
+ || typeof runtime.revision !== "string"
48
+ || runtime.revision !== target.revision
49
+ || !/^[0-9a-f]{40}$/.test(runtime.revision)
50
+ || typeof runtime.artifactDigest !== "string"
51
+ || !/^[0-9a-f]{64}$/.test(runtime.artifactDigest)
52
+ || typeof runtime.stagedAt !== "string") {
53
+ throw new Error("The active Viewer release has an invalid MCP runtime identity.");
54
+ }
55
+ const releasesRoot = join(stateDir, "mcp-runtime", "releases");
56
+ const releaseRoot = join(releasesRoot, runtime.releaseId);
57
+ const bundle = join(releaseRoot, "dist", "mcp-server.mjs");
58
+ let bundled;
59
+ try {
60
+ bundled = readFileSync(bundle);
61
+ } catch (error) {
62
+ /* Same policy as an absent release target: a runtime the deployment never
63
+ published (or already retired) falls back to this image's own bundle
64
+ instead of leaving the operator with no MCP server at all. */
65
+ if (error?.code === "ENOENT") return packageRoot;
66
+ throw new Error(`Could not read the published MCP runtime bundle: ${error instanceof Error ? error.message : String(error)}`);
67
+ }
68
+ const artifactDigest = createHash("sha256").update(bundled).digest("hex");
69
+ if (artifactDigest !== runtime.artifactDigest) {
70
+ throw new Error("MCP runtime bundle digest does not match the active release.");
71
+ }
72
+ return releaseRoot;
73
+ }
74
+
75
+ const selectedPackageRoot = deployedPackageRoot();
76
+ const bundled = join(selectedPackageRoot, "dist", "mcp-server.mjs");
77
+ const source = join(selectedPackageRoot, "src", "lib", "mcp", "entry.ts");
78
+
79
+ async function runChild(runtime, entry) {
80
+ let admissionChannel = false;
81
+ try {
82
+ admissionChannel = fstatSync(3).isSocket();
83
+ } catch {
84
+ admissionChannel = false;
85
+ }
86
+ const child = spawn(runtime, [entry], viewerChildProcessOptions({
87
+ cwd: selectedPackageRoot,
88
+ stdio: admissionChannel ? [0, 1, 2, 3] : [0, 1, 2, "ignore"],
89
+ }));
90
+ let childExited = false;
91
+ const forwardInterrupt = () => {
92
+ if (!childExited) child.kill("SIGINT");
93
+ };
94
+ const forwardTermination = () => {
95
+ if (!childExited) child.kill("SIGTERM");
96
+ };
97
+ process.on("SIGINT", forwardInterrupt);
98
+ process.on("SIGTERM", forwardTermination);
99
+ await new Promise((resolve) => {
100
+ let settled = false;
101
+ const finish = (exitCode) => {
102
+ if (settled) return;
103
+ settled = true;
104
+ childExited = true;
105
+ process.removeListener("SIGINT", forwardInterrupt);
106
+ process.removeListener("SIGTERM", forwardTermination);
107
+ process.exitCode = exitCode;
108
+ resolve();
109
+ };
110
+ child.once("error", (error) => {
111
+ console.error(`Could not start the Viewer MCP server: ${error.message}`);
112
+ finish(1);
113
+ });
114
+ child.once("exit", (code, signal) => {
115
+ finish(code ?? (signal ? 1 : 0));
116
+ });
117
+ });
118
+ }
119
+
120
+ if (existsSync(bundled)) {
121
+ const bunRuntime = viewerServerBunRuntime();
122
+ if (bunRuntime && !process.versions.bun) await runChild(bunRuntime, bundled);
123
+ else await import(pathToFileURL(bundled).href);
124
+ } else if (process.versions.bun) {
125
+ await import(pathToFileURL(source).href);
126
+ } else {
127
+ const bun = process.env.LLV_BUN_EXECUTABLE || "bun";
128
+ await runChild(bun, source);
129
+ }