@surething/cockpit 1.0.273 → 1.0.274

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 (700) hide show
  1. package/.next-prod/BUILD_ID +1 -1
  2. package/.next-prod/app-path-routes-manifest.json +5 -4
  3. package/.next-prod/build-manifest.json +3 -3
  4. package/.next-prod/cockpit-build.json +1 -1
  5. package/.next-prod/prerender-manifest.json +4 -4
  6. package/.next-prod/react-loadable-manifest.json +0 -12
  7. package/.next-prod/routes-manifest.json +14 -6
  8. package/.next-prod/server/app/_global-error/page.js +1 -1
  9. package/.next-prod/server/app/_global-error/page.js.nft.json +1 -1
  10. package/.next-prod/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next-prod/server/app/_global-error.html +1 -1
  12. package/.next-prod/server/app/_global-error.rsc +1 -1
  13. package/.next-prod/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/.next-prod/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/.next-prod/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next-prod/server/app/_not-found/page.js +1 -1
  17. package/.next-prod/server/app/_not-found/page.js.nft.json +1 -1
  18. package/.next-prod/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/.next-prod/server/app/_not-found.html +2 -2
  20. package/.next-prod/server/app/_not-found.rsc +3 -3
  21. package/.next-prod/server/app/_not-found.segments/_full.segment.rsc +3 -3
  22. package/.next-prod/server/app/_not-found.segments/_index.segment.rsc +3 -3
  23. package/.next-prod/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  24. package/.next-prod/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  25. package/.next-prod/server/app/api/agent/test/route.js +1 -1
  26. package/.next-prod/server/app/api/agent/test/route.js.nft.json +1 -1
  27. package/.next-prod/server/app/api/bash/route.js +1 -1
  28. package/.next-prod/server/app/api/bash/route.js.nft.json +1 -1
  29. package/.next-prod/server/app/api/chat/codex/route.js +1 -1
  30. package/.next-prod/server/app/api/chat/codex/route.js.nft.json +1 -1
  31. package/.next-prod/server/app/api/chat/deepseek/route.js +1 -1
  32. package/.next-prod/server/app/api/chat/deepseek/route.js.nft.json +1 -1
  33. package/.next-prod/server/app/api/chat/glm/route.js +1 -1
  34. package/.next-prod/server/app/api/chat/glm/route.js.nft.json +1 -1
  35. package/.next-prod/server/app/api/chat/kimi/route.js +1 -1
  36. package/.next-prod/server/app/api/chat/kimi/route.js.nft.json +1 -1
  37. package/.next-prod/server/app/api/chat/ollama/route.js +1 -1
  38. package/.next-prod/server/app/api/chat/ollama/route.js.nft.json +1 -1
  39. package/.next-prod/server/app/api/chat/route.js +1 -1
  40. package/.next-prod/server/app/api/chat/route.js.nft.json +1 -1
  41. package/.next-prod/server/app/api/chat/stop/route.js +1 -1
  42. package/.next-prod/server/app/api/chat/stop/route.js.nft.json +1 -1
  43. package/.next-prod/server/app/api/claude-stats/route.js +1 -1
  44. package/.next-prod/server/app/api/claude-stats/route.js.nft.json +1 -1
  45. package/.next-prod/server/app/api/commands/route.js +1 -1
  46. package/.next-prod/server/app/api/commands/route.js.nft.json +1 -1
  47. package/.next-prod/server/app/api/comments/route.js +1 -1
  48. package/.next-prod/server/app/api/comments/route.js.nft.json +1 -1
  49. package/.next-prod/server/app/api/db/columns/route.js +1 -1
  50. package/.next-prod/server/app/api/db/columns/route.js.nft.json +1 -1
  51. package/.next-prod/server/app/api/db/connect/route.js +2 -2
  52. package/.next-prod/server/app/api/db/connect/route.js.nft.json +1 -1
  53. package/.next-prod/server/app/api/db/disconnect/route.js +1 -1
  54. package/.next-prod/server/app/api/db/disconnect/route.js.nft.json +1 -1
  55. package/.next-prod/server/app/api/db/export/route.js +1 -1
  56. package/.next-prod/server/app/api/db/export/route.js.nft.json +1 -1
  57. package/.next-prod/server/app/api/db/query/route.js +1 -1
  58. package/.next-prod/server/app/api/db/query/route.js.nft.json +1 -1
  59. package/.next-prod/server/app/api/db/schemas/route.js +2 -2
  60. package/.next-prod/server/app/api/db/schemas/route.js.nft.json +1 -1
  61. package/.next-prod/server/app/api/deepseek/balance/route.js +1 -1
  62. package/.next-prod/server/app/api/deepseek/balance/route.js.nft.json +1 -1
  63. package/.next-prod/server/app/api/deepseek/credentials/route.js +1 -1
  64. package/.next-prod/server/app/api/deepseek/credentials/route.js.nft.json +1 -1
  65. package/.next-prod/server/app/api/deepseek/models/route.js +1 -1
  66. package/.next-prod/server/app/api/deepseek/models/route.js.nft.json +1 -1
  67. package/.next-prod/server/app/api/dev/spans/route.js +1 -1
  68. package/.next-prod/server/app/api/dev/spans/route.js.nft.json +1 -1
  69. package/.next-prod/server/app/api/extension/version/route.js +1 -1
  70. package/.next-prod/server/app/api/extension/version/route.js.nft.json +1 -1
  71. package/.next-prod/server/app/api/file/route.js +1 -1
  72. package/.next-prod/server/app/api/file/route.js.nft.json +1 -1
  73. package/.next-prod/server/app/api/files/blame/route.js +1 -1
  74. package/.next-prod/server/app/api/files/blame/route.js.nft.json +1 -1
  75. package/.next-prod/server/app/api/files/clipboard/route.js +1 -1
  76. package/.next-prod/server/app/api/files/clipboard/route.js.nft.json +1 -1
  77. package/.next-prod/server/app/api/files/copy/route.js +1 -1
  78. package/.next-prod/server/app/api/files/copy/route.js.nft.json +1 -1
  79. package/.next-prod/server/app/api/files/delete/route.js +1 -1
  80. package/.next-prod/server/app/api/files/delete/route.js.nft.json +1 -1
  81. package/.next-prod/server/app/api/files/expanded/route.js +1 -1
  82. package/.next-prod/server/app/api/files/expanded/route.js.nft.json +1 -1
  83. package/.next-prod/server/app/api/files/index/route.js +1 -1
  84. package/.next-prod/server/app/api/files/index/route.js.nft.json +1 -1
  85. package/.next-prod/server/app/api/files/init/route.js +1 -1
  86. package/.next-prod/server/app/api/files/init/route.js.nft.json +1 -1
  87. package/.next-prod/server/app/api/files/paste/route.js +1 -1
  88. package/.next-prod/server/app/api/files/paste/route.js.nft.json +1 -1
  89. package/.next-prod/server/app/api/files/read/route.js +1 -1
  90. package/.next-prod/server/app/api/files/read/route.js.nft.json +1 -1
  91. package/.next-prod/server/app/api/files/readdir/route.js +1 -1
  92. package/.next-prod/server/app/api/files/readdir/route.js.nft.json +1 -1
  93. package/.next-prod/server/app/api/files/recent/route.js +1 -1
  94. package/.next-prod/server/app/api/files/recent/route.js.nft.json +1 -1
  95. package/.next-prod/server/app/api/files/save/route.js +1 -1
  96. package/.next-prod/server/app/api/files/save/route.js.nft.json +1 -1
  97. package/.next-prod/server/app/api/files/search/route.js +1 -1
  98. package/.next-prod/server/app/api/files/search/route.js.nft.json +1 -1
  99. package/.next-prod/server/app/api/files/stat/route.js +1 -1
  100. package/.next-prod/server/app/api/files/stat/route.js.nft.json +1 -1
  101. package/.next-prod/server/app/api/files/text/route.js +1 -1
  102. package/.next-prod/server/app/api/files/text/route.js.nft.json +1 -1
  103. package/.next-prod/server/app/api/git/blob/route.js +1 -1
  104. package/.next-prod/server/app/api/git/blob/route.js.nft.json +1 -1
  105. package/.next-prod/server/app/api/git/branch-diff/route.js +1 -1
  106. package/.next-prod/server/app/api/git/branch-diff/route.js.nft.json +1 -1
  107. package/.next-prod/server/app/api/git/branches/route.js +1 -1
  108. package/.next-prod/server/app/api/git/branches/route.js.nft.json +1 -1
  109. package/.next-prod/server/app/api/git/commit-diff/route.js +1 -1
  110. package/.next-prod/server/app/api/git/commit-diff/route.js.nft.json +1 -1
  111. package/.next-prod/server/app/api/git/commits/route.js +1 -1
  112. package/.next-prod/server/app/api/git/commits/route.js.nft.json +1 -1
  113. package/.next-prod/server/app/api/git/current-branch/route.js +1 -1
  114. package/.next-prod/server/app/api/git/current-branch/route.js.nft.json +1 -1
  115. package/.next-prod/server/app/api/git/diff/route.js +1 -1
  116. package/.next-prod/server/app/api/git/diff/route.js.nft.json +1 -1
  117. package/.next-prod/server/app/api/git/discard/route.js +1 -1
  118. package/.next-prod/server/app/api/git/discard/route.js.nft.json +1 -1
  119. package/.next-prod/server/app/api/git/stage/route.js +1 -1
  120. package/.next-prod/server/app/api/git/stage/route.js.nft.json +1 -1
  121. package/.next-prod/server/app/api/git/status/route.js +1 -1
  122. package/.next-prod/server/app/api/git/status/route.js.nft.json +1 -1
  123. package/.next-prod/server/app/api/git/unstage/route.js +1 -1
  124. package/.next-prod/server/app/api/git/unstage/route.js.nft.json +1 -1
  125. package/.next-prod/server/app/api/git/worktree/route.js +1 -1
  126. package/.next-prod/server/app/api/git/worktree/route.js.nft.json +1 -1
  127. package/.next-prod/server/app/api/glm/credentials/route.js +1 -1
  128. package/.next-prod/server/app/api/glm/credentials/route.js.nft.json +1 -1
  129. package/.next-prod/server/app/api/glm/models/route.js +1 -1
  130. package/.next-prod/server/app/api/glm/models/route.js.nft.json +1 -1
  131. package/.next-prod/server/app/api/glm/usage/route.js +1 -1
  132. package/.next-prod/server/app/api/glm/usage/route.js.nft.json +1 -1
  133. package/.next-prod/server/app/api/global-state/route.js +1 -1
  134. package/.next-prod/server/app/api/global-state/route.js.nft.json +1 -1
  135. package/.next-prod/server/app/api/health/route.js +1 -1
  136. package/.next-prod/server/app/api/health/route.js.nft.json +1 -1
  137. package/.next-prod/server/app/api/html-apps/[id]/route.js +1 -1
  138. package/.next-prod/server/app/api/html-apps/[id]/route.js.nft.json +1 -1
  139. package/.next-prod/server/app/api/html-apps/route.js +1 -1
  140. package/.next-prod/server/app/api/html-apps/route.js.nft.json +1 -1
  141. package/.next-prod/server/app/api/instructions/config/route.js +1 -0
  142. package/.next-prod/server/app/api/{prompts → instructions}/config/route.js.nft.json +1 -1
  143. package/.next-prod/server/app/api/instructions/config/route_client-reference-manifest.js +1 -0
  144. package/.next-prod/server/app/api/kimi/credentials/route.js +1 -1
  145. package/.next-prod/server/app/api/kimi/credentials/route.js.nft.json +1 -1
  146. package/.next-prod/server/app/api/kimi/models/route.js +1 -1
  147. package/.next-prod/server/app/api/kimi/models/route.js.nft.json +1 -1
  148. package/.next-prod/server/app/api/kimi/usage/route.js +1 -1
  149. package/.next-prod/server/app/api/kimi/usage/route.js.nft.json +1 -1
  150. package/.next-prod/server/app/api/lsp/definition/route.js +1 -1
  151. package/.next-prod/server/app/api/lsp/definition/route.js.nft.json +1 -1
  152. package/.next-prod/server/app/api/lsp/hover/route.js +1 -1
  153. package/.next-prod/server/app/api/lsp/hover/route.js.nft.json +1 -1
  154. package/.next-prod/server/app/api/lsp/references/route.js +1 -1
  155. package/.next-prod/server/app/api/lsp/references/route.js.nft.json +1 -1
  156. package/.next-prod/server/app/api/lsp/status/route.js +1 -1
  157. package/.next-prod/server/app/api/lsp/status/route.js.nft.json +1 -1
  158. package/.next-prod/server/app/api/lsp/warmup/route.js +1 -1
  159. package/.next-prod/server/app/api/lsp/warmup/route.js.nft.json +1 -1
  160. package/.next-prod/server/app/api/mysql/columns/route.js +2 -2
  161. package/.next-prod/server/app/api/mysql/columns/route.js.nft.json +1 -1
  162. package/.next-prod/server/app/api/mysql/connect/route.js +1 -1
  163. package/.next-prod/server/app/api/mysql/connect/route.js.nft.json +1 -1
  164. package/.next-prod/server/app/api/mysql/disconnect/route.js +1 -1
  165. package/.next-prod/server/app/api/mysql/disconnect/route.js.nft.json +1 -1
  166. package/.next-prod/server/app/api/mysql/export/route.js +1 -1
  167. package/.next-prod/server/app/api/mysql/export/route.js.nft.json +1 -1
  168. package/.next-prod/server/app/api/mysql/query/route.js +1 -1
  169. package/.next-prod/server/app/api/mysql/query/route.js.nft.json +1 -1
  170. package/.next-prod/server/app/api/mysql/schemas/route.js +2 -2
  171. package/.next-prod/server/app/api/mysql/schemas/route.js.nft.json +1 -1
  172. package/.next-prod/server/app/api/neo4j/connect/route.js +1 -1
  173. package/.next-prod/server/app/api/neo4j/connect/route.js.nft.json +1 -1
  174. package/.next-prod/server/app/api/neo4j/disconnect/route.js +1 -1
  175. package/.next-prod/server/app/api/neo4j/disconnect/route.js.nft.json +1 -1
  176. package/.next-prod/server/app/api/neo4j/query/route.js +1 -1
  177. package/.next-prod/server/app/api/neo4j/query/route.js.nft.json +1 -1
  178. package/.next-prod/server/app/api/neo4j/schema/route.js +1 -1
  179. package/.next-prod/server/app/api/neo4j/schema/route.js.nft.json +1 -1
  180. package/.next-prod/server/app/api/note/route.js +1 -1
  181. package/.next-prod/server/app/api/note/route.js.nft.json +1 -1
  182. package/.next-prod/server/app/api/ollama/config/route.js +1 -1
  183. package/.next-prod/server/app/api/ollama/config/route.js.nft.json +1 -1
  184. package/.next-prod/server/app/api/ollama/models/route.js +1 -1
  185. package/.next-prod/server/app/api/ollama/models/route.js.nft.json +1 -1
  186. package/.next-prod/server/app/api/ollama/start/route.js +1 -1
  187. package/.next-prod/server/app/api/ollama/start/route.js.nft.json +1 -1
  188. package/.next-prod/server/app/api/open-cursor/route.js +1 -1
  189. package/.next-prod/server/app/api/open-cursor/route.js.nft.json +1 -1
  190. package/.next-prod/server/app/api/open-vscode/route.js +1 -1
  191. package/.next-prod/server/app/api/open-vscode/route.js.nft.json +1 -1
  192. package/.next-prod/server/app/api/pick-folder/route.js +1 -1
  193. package/.next-prod/server/app/api/pick-folder/route.js.nft.json +1 -1
  194. package/.next-prod/server/app/api/pinned-sessions/route.js +1 -1
  195. package/.next-prod/server/app/api/pinned-sessions/route.js.nft.json +1 -1
  196. package/.next-prod/server/app/api/project-settings/route.js +1 -1
  197. package/.next-prod/server/app/api/project-settings/route.js.nft.json +1 -1
  198. package/.next-prod/server/app/api/project-state/route.js +2 -2
  199. package/.next-prod/server/app/api/project-state/route.js.nft.json +1 -1
  200. package/.next-prod/server/app/api/projectGraph/affected/route.js +1 -1
  201. package/.next-prod/server/app/api/projectGraph/affected/route.js.nft.json +1 -1
  202. package/.next-prod/server/app/api/projectGraph/callees/route.js +1 -1
  203. package/.next-prod/server/app/api/projectGraph/callees/route.js.nft.json +1 -1
  204. package/.next-prod/server/app/api/projectGraph/callers/route.js +1 -1
  205. package/.next-prod/server/app/api/projectGraph/callers/route.js.nft.json +1 -1
  206. package/.next-prod/server/app/api/projectGraph/coedit/route.js +1 -1
  207. package/.next-prod/server/app/api/projectGraph/coedit/route.js.nft.json +1 -1
  208. package/.next-prod/server/app/api/projectGraph/context/route.js +1 -1
  209. package/.next-prod/server/app/api/projectGraph/context/route.js.nft.json +1 -1
  210. package/.next-prod/server/app/api/projectGraph/file/route.js +1 -1
  211. package/.next-prod/server/app/api/projectGraph/file/route.js.nft.json +1 -1
  212. package/.next-prod/server/app/api/projectGraph/file-functions/route.js +1 -1
  213. package/.next-prod/server/app/api/projectGraph/file-functions/route.js.nft.json +1 -1
  214. package/.next-prod/server/app/api/projectGraph/impact/route.js +1 -1
  215. package/.next-prod/server/app/api/projectGraph/impact/route.js.nft.json +1 -1
  216. package/.next-prod/server/app/api/projectGraph/related/route.js +1 -1
  217. package/.next-prod/server/app/api/projectGraph/related/route.js.nft.json +1 -1
  218. package/.next-prod/server/app/api/projectGraph/risk/route.js +1 -1
  219. package/.next-prod/server/app/api/projectGraph/risk/route.js.nft.json +1 -1
  220. package/.next-prod/server/app/api/projectGraph/search/route.js +1 -1
  221. package/.next-prod/server/app/api/projectGraph/search/route.js.nft.json +1 -1
  222. package/.next-prod/server/app/api/projects/route.js +1 -1
  223. package/.next-prod/server/app/api/projects/route.js.nft.json +1 -1
  224. package/.next-prod/server/app/api/push/public-key/route.js +1 -1
  225. package/.next-prod/server/app/api/push/public-key/route.js.nft.json +1 -1
  226. package/.next-prod/server/app/api/push/subscribe/route.js +1 -1
  227. package/.next-prod/server/app/api/push/subscribe/route.js.nft.json +1 -1
  228. package/.next-prod/server/app/api/push/unsubscribe/route.js +1 -1
  229. package/.next-prod/server/app/api/push/unsubscribe/route.js.nft.json +1 -1
  230. package/.next-prod/server/app/api/redis/command/route.js +1 -1
  231. package/.next-prod/server/app/api/redis/command/route.js.nft.json +1 -1
  232. package/.next-prod/server/app/api/redis/connect/route.js +1 -1
  233. package/.next-prod/server/app/api/redis/connect/route.js.nft.json +1 -1
  234. package/.next-prod/server/app/api/redis/delete/route.js +1 -1
  235. package/.next-prod/server/app/api/redis/delete/route.js.nft.json +1 -1
  236. package/.next-prod/server/app/api/redis/disconnect/route.js +1 -1
  237. package/.next-prod/server/app/api/redis/disconnect/route.js.nft.json +1 -1
  238. package/.next-prod/server/app/api/redis/get/route.js +1 -1
  239. package/.next-prod/server/app/api/redis/get/route.js.nft.json +1 -1
  240. package/.next-prod/server/app/api/redis/keys/route.js +1 -1
  241. package/.next-prod/server/app/api/redis/keys/route.js.nft.json +1 -1
  242. package/.next-prod/server/app/api/redis/set/route.js +1 -1
  243. package/.next-prod/server/app/api/redis/set/route.js.nft.json +1 -1
  244. package/.next-prod/server/app/api/restart/route.js +1 -1
  245. package/.next-prod/server/app/api/restart/route.js.nft.json +1 -1
  246. package/.next-prod/server/app/api/review/[id]/comments/route.js +1 -1
  247. package/.next-prod/server/app/api/review/[id]/comments/route.js.nft.json +1 -1
  248. package/.next-prod/server/app/api/review/[id]/replies/route.js +1 -1
  249. package/.next-prod/server/app/api/review/[id]/replies/route.js.nft.json +1 -1
  250. package/.next-prod/server/app/api/review/[id]/route.js +1 -1
  251. package/.next-prod/server/app/api/review/[id]/route.js.nft.json +1 -1
  252. package/.next-prod/server/app/api/review/identify/route.js +1 -1
  253. package/.next-prod/server/app/api/review/identify/route.js.nft.json +1 -1
  254. package/.next-prod/server/app/api/review/order/route.js +1 -1
  255. package/.next-prod/server/app/api/review/order/route.js.nft.json +1 -1
  256. package/.next-prod/server/app/api/review/route.js +1 -1
  257. package/.next-prod/server/app/api/review/route.js.nft.json +1 -1
  258. package/.next-prod/server/app/api/review/share-info/route.js +1 -1
  259. package/.next-prod/server/app/api/review/share-info/route.js.nft.json +1 -1
  260. package/.next-prod/server/app/api/review/users/route.js +1 -1
  261. package/.next-prod/server/app/api/review/users/route.js.nft.json +1 -1
  262. package/.next-prod/server/app/api/scheduled-tasks/route.js +2 -2
  263. package/.next-prod/server/app/api/scheduled-tasks/route.js.nft.json +1 -1
  264. package/.next-prod/server/app/api/services/config/route.js +1 -1
  265. package/.next-prod/server/app/api/services/config/route.js.nft.json +1 -1
  266. package/.next-prod/server/app/api/services/scripts/route.js +1 -1
  267. package/.next-prod/server/app/api/services/scripts/route.js.nft.json +1 -1
  268. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js +1 -1
  269. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js.nft.json +1 -1
  270. package/.next-prod/server/app/api/session/[sessionId]/history/route.js +1 -1
  271. package/.next-prod/server/app/api/session/[sessionId]/history/route.js.nft.json +1 -1
  272. package/.next-prod/server/app/api/session/[sessionId]/turn/route.js +2 -0
  273. package/.next-prod/server/app/api/session/[sessionId]/turn/route.js.nft.json +1 -0
  274. package/.next-prod/server/app/api/session/[sessionId]/turn/route_client-reference-manifest.js +1 -0
  275. package/.next-prod/server/app/api/session/user-messages/route.js +1 -1
  276. package/.next-prod/server/app/api/session/user-messages/route.js.nft.json +1 -1
  277. package/.next-prod/server/app/api/session-by-path/route.js +1 -1
  278. package/.next-prod/server/app/api/session-by-path/route.js.nft.json +1 -1
  279. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js +1 -1
  280. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js.nft.json +1 -1
  281. package/.next-prod/server/app/api/sessions/projects/route.js +1 -1
  282. package/.next-prod/server/app/api/sessions/projects/route.js.nft.json +1 -1
  283. package/.next-prod/server/app/api/sessions/route.js +1 -1
  284. package/.next-prod/server/app/api/sessions/route.js.nft.json +1 -1
  285. package/.next-prod/server/app/api/settings/route.js +1 -1
  286. package/.next-prod/server/app/api/settings/route.js.nft.json +1 -1
  287. package/.next-prod/server/app/api/shutdown/route.js +1 -1
  288. package/.next-prod/server/app/api/shutdown/route.js.nft.json +1 -1
  289. package/.next-prod/server/app/api/skills/[id]/route.js +1 -1
  290. package/.next-prod/server/app/api/skills/[id]/route.js.nft.json +1 -1
  291. package/.next-prod/server/app/api/skills/content/route.js +1 -1
  292. package/.next-prod/server/app/api/skills/content/route.js.nft.json +1 -1
  293. package/.next-prod/server/app/api/skills/route.js +1 -1
  294. package/.next-prod/server/app/api/skills/route.js.nft.json +1 -1
  295. package/.next-prod/server/app/api/snapshots/blob/route.js +1 -1
  296. package/.next-prod/server/app/api/snapshots/blob/route.js.nft.json +1 -1
  297. package/.next-prod/server/app/api/snapshots/diff/route.js +1 -1
  298. package/.next-prod/server/app/api/snapshots/diff/route.js.nft.json +1 -1
  299. package/.next-prod/server/app/api/snapshots/route.js +1 -1
  300. package/.next-prod/server/app/api/snapshots/route.js.nft.json +1 -1
  301. package/.next-prod/server/app/api/terminal/aliases/route.js +1 -1
  302. package/.next-prod/server/app/api/terminal/aliases/route.js.nft.json +1 -1
  303. package/.next-prod/server/app/api/terminal/autocomplete/route.js +1 -1
  304. package/.next-prod/server/app/api/terminal/autocomplete/route.js.nft.json +1 -1
  305. package/.next-prod/server/app/api/terminal/bubble-order/route.js +1 -1
  306. package/.next-prod/server/app/api/terminal/bubble-order/route.js.nft.json +1 -1
  307. package/.next-prod/server/app/api/terminal/env/route.js +1 -1
  308. package/.next-prod/server/app/api/terminal/env/route.js.nft.json +1 -1
  309. package/.next-prod/server/app/api/terminal/history/route.js +1 -1
  310. package/.next-prod/server/app/api/terminal/history/route.js.nft.json +1 -1
  311. package/.next-prod/server/app/api/update/route.js +1 -1
  312. package/.next-prod/server/app/api/update/route.js.nft.json +1 -1
  313. package/.next-prod/server/app/api/update-state/route.js +1 -1
  314. package/.next-prod/server/app/api/update-state/route.js.nft.json +1 -1
  315. package/.next-prod/server/app/api/version/route.js +1 -1
  316. package/.next-prod/server/app/api/version/route.js.nft.json +1 -1
  317. package/.next-prod/server/app/apps/[...path]/route.js +1 -1
  318. package/.next-prod/server/app/apps/[...path]/route.js.nft.json +1 -1
  319. package/.next-prod/server/app/favicon.ico/route.js +1 -1
  320. package/.next-prod/server/app/favicon.ico/route.js.nft.json +1 -1
  321. package/.next-prod/server/app/m/page.js +1 -1
  322. package/.next-prod/server/app/m/page.js.nft.json +1 -1
  323. package/.next-prod/server/app/m/page_client-reference-manifest.js +1 -1
  324. package/.next-prod/server/app/manifest.webmanifest/route.js +2 -2
  325. package/.next-prod/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  326. package/.next-prod/server/app/page.js +1 -1
  327. package/.next-prod/server/app/page.js.nft.json +1 -1
  328. package/.next-prod/server/app/page_client-reference-manifest.js +1 -1
  329. package/.next-prod/server/app/project/page.js +1 -1
  330. package/.next-prod/server/app/project/page.js.nft.json +1 -1
  331. package/.next-prod/server/app/project/page_client-reference-manifest.js +1 -1
  332. package/.next-prod/server/app/review/[id]/page.js +1 -1
  333. package/.next-prod/server/app/review/[id]/page.js.nft.json +1 -1
  334. package/.next-prod/server/app/review/[id]/page_client-reference-manifest.js +1 -1
  335. package/.next-prod/server/app-paths-manifest.json +5 -4
  336. package/.next-prod/server/chunks/2493.js +3 -3
  337. package/.next-prod/server/chunks/3286.js +1 -1
  338. package/.next-prod/server/chunks/516.js +1 -1
  339. package/.next-prod/server/chunks/5750.js +19 -19
  340. package/.next-prod/server/chunks/6495.js +1 -1
  341. package/.next-prod/server/chunks/6548.js +1 -1
  342. package/.next-prod/server/chunks/{5433.js → 7956.js} +9 -10
  343. package/.next-prod/server/chunks/8616.js +1 -1
  344. package/.next-prod/server/chunks/9830.js +1 -1
  345. package/.next-prod/server/chunks/9891.js +7 -0
  346. package/.next-prod/server/functions-config-manifest.json +1 -1
  347. package/.next-prod/server/middleware-build-manifest.js +1 -1
  348. package/.next-prod/server/middleware-react-loadable-manifest.js +1 -1
  349. package/.next-prod/server/pages/404.html +2 -2
  350. package/.next-prod/server/pages/500.html +1 -1
  351. package/.next-prod/server/server-reference-manifest.json +1 -1
  352. package/.next-prod/static/{qoIca6xp2OKAJtDEvMaXC → Ltfbusd381Du6etTab1ug}/_buildManifest.js +1 -1
  353. package/.next-prod/static/chunks/{4137-7d6f2498d03b184d.js → 103-1788abe4fb625136.js} +7 -7
  354. package/.next-prod/static/chunks/{1332-e26fddaef359ce51.js → 1332-e51496c0bf36be06.js} +5 -5
  355. package/.next-prod/static/chunks/{2032-8326efdf5830d58c.js → 2032-c4d080bb65101d4c.js} +1 -1
  356. package/.next-prod/static/chunks/2539-52ea8019220fc163.js +17 -0
  357. package/.next-prod/static/chunks/{7570-ebe01cce6f28a79f.js → 8707-60c93d98f9ca9be7.js} +2 -2
  358. package/.next-prod/static/chunks/9092-9c01b3ae176018c5.js +716 -0
  359. package/.next-prod/static/chunks/9656-da407fc0921ddc52.js +32 -0
  360. package/.next-prod/static/chunks/96c8525a-b50f9758924ea57d.js +1 -0
  361. package/.next-prod/static/chunks/app/_global-error/page-dd925381ab99e37b.js +1 -0
  362. package/.next-prod/static/chunks/app/api/agent/test/route-dd925381ab99e37b.js +1 -0
  363. package/.next-prod/static/chunks/app/api/bash/route-dd925381ab99e37b.js +1 -0
  364. package/.next-prod/static/chunks/app/api/chat/codex/route-dd925381ab99e37b.js +1 -0
  365. package/.next-prod/static/chunks/app/api/chat/deepseek/route-dd925381ab99e37b.js +1 -0
  366. package/.next-prod/static/chunks/app/api/chat/glm/route-dd925381ab99e37b.js +1 -0
  367. package/.next-prod/static/chunks/app/api/chat/kimi/route-dd925381ab99e37b.js +1 -0
  368. package/.next-prod/static/chunks/app/api/chat/ollama/route-dd925381ab99e37b.js +1 -0
  369. package/.next-prod/static/chunks/app/api/chat/route-dd925381ab99e37b.js +1 -0
  370. package/.next-prod/static/chunks/app/api/chat/stop/route-dd925381ab99e37b.js +1 -0
  371. package/.next-prod/static/chunks/app/api/claude-stats/route-dd925381ab99e37b.js +1 -0
  372. package/.next-prod/static/chunks/app/api/commands/route-dd925381ab99e37b.js +1 -0
  373. package/.next-prod/static/chunks/app/api/comments/route-dd925381ab99e37b.js +1 -0
  374. package/.next-prod/static/chunks/app/api/db/columns/route-dd925381ab99e37b.js +1 -0
  375. package/.next-prod/static/chunks/app/api/db/connect/route-dd925381ab99e37b.js +1 -0
  376. package/.next-prod/static/chunks/app/api/db/disconnect/route-dd925381ab99e37b.js +1 -0
  377. package/.next-prod/static/chunks/app/api/db/export/route-dd925381ab99e37b.js +1 -0
  378. package/.next-prod/static/chunks/app/api/db/query/route-dd925381ab99e37b.js +1 -0
  379. package/.next-prod/static/chunks/app/api/db/schemas/route-dd925381ab99e37b.js +1 -0
  380. package/.next-prod/static/chunks/app/api/deepseek/balance/route-dd925381ab99e37b.js +1 -0
  381. package/.next-prod/static/chunks/app/api/deepseek/credentials/route-dd925381ab99e37b.js +1 -0
  382. package/.next-prod/static/chunks/app/api/deepseek/models/route-dd925381ab99e37b.js +1 -0
  383. package/.next-prod/static/chunks/app/api/dev/spans/route-dd925381ab99e37b.js +1 -0
  384. package/.next-prod/static/chunks/app/api/extension/version/route-dd925381ab99e37b.js +1 -0
  385. package/.next-prod/static/chunks/app/api/file/route-dd925381ab99e37b.js +1 -0
  386. package/.next-prod/static/chunks/app/api/files/blame/route-dd925381ab99e37b.js +1 -0
  387. package/.next-prod/static/chunks/app/api/files/clipboard/route-dd925381ab99e37b.js +1 -0
  388. package/.next-prod/static/chunks/app/api/files/copy/route-dd925381ab99e37b.js +1 -0
  389. package/.next-prod/static/chunks/app/api/files/delete/route-dd925381ab99e37b.js +1 -0
  390. package/.next-prod/static/chunks/app/api/files/expanded/route-dd925381ab99e37b.js +1 -0
  391. package/.next-prod/static/chunks/app/api/files/index/route-dd925381ab99e37b.js +1 -0
  392. package/.next-prod/static/chunks/app/api/files/init/route-dd925381ab99e37b.js +1 -0
  393. package/.next-prod/static/chunks/app/api/files/paste/route-dd925381ab99e37b.js +1 -0
  394. package/.next-prod/static/chunks/app/api/files/read/route-dd925381ab99e37b.js +1 -0
  395. package/.next-prod/static/chunks/app/api/files/readdir/route-dd925381ab99e37b.js +1 -0
  396. package/.next-prod/static/chunks/app/api/files/recent/route-dd925381ab99e37b.js +1 -0
  397. package/.next-prod/static/chunks/app/api/files/save/route-dd925381ab99e37b.js +1 -0
  398. package/.next-prod/static/chunks/app/api/files/search/route-dd925381ab99e37b.js +1 -0
  399. package/.next-prod/static/chunks/app/api/files/stat/route-dd925381ab99e37b.js +1 -0
  400. package/.next-prod/static/chunks/app/api/files/text/route-dd925381ab99e37b.js +1 -0
  401. package/.next-prod/static/chunks/app/api/git/blob/route-dd925381ab99e37b.js +1 -0
  402. package/.next-prod/static/chunks/app/api/git/branch-diff/route-dd925381ab99e37b.js +1 -0
  403. package/.next-prod/static/chunks/app/api/git/branches/route-dd925381ab99e37b.js +1 -0
  404. package/.next-prod/static/chunks/app/api/git/commit-diff/route-dd925381ab99e37b.js +1 -0
  405. package/.next-prod/static/chunks/app/api/git/commits/route-dd925381ab99e37b.js +1 -0
  406. package/.next-prod/static/chunks/app/api/git/current-branch/route-dd925381ab99e37b.js +1 -0
  407. package/.next-prod/static/chunks/app/api/git/diff/route-dd925381ab99e37b.js +1 -0
  408. package/.next-prod/static/chunks/app/api/git/discard/route-dd925381ab99e37b.js +1 -0
  409. package/.next-prod/static/chunks/app/api/git/stage/route-dd925381ab99e37b.js +1 -0
  410. package/.next-prod/static/chunks/app/api/git/status/route-dd925381ab99e37b.js +1 -0
  411. package/.next-prod/static/chunks/app/api/git/unstage/route-dd925381ab99e37b.js +1 -0
  412. package/.next-prod/static/chunks/app/api/git/worktree/route-dd925381ab99e37b.js +1 -0
  413. package/.next-prod/static/chunks/app/api/glm/credentials/route-dd925381ab99e37b.js +1 -0
  414. package/.next-prod/static/chunks/app/api/glm/models/route-dd925381ab99e37b.js +1 -0
  415. package/.next-prod/static/chunks/app/api/glm/usage/route-dd925381ab99e37b.js +1 -0
  416. package/.next-prod/static/chunks/app/api/global-state/route-dd925381ab99e37b.js +1 -0
  417. package/.next-prod/static/chunks/app/api/health/route-dd925381ab99e37b.js +1 -0
  418. package/.next-prod/static/chunks/app/api/html-apps/[id]/route-dd925381ab99e37b.js +1 -0
  419. package/.next-prod/static/chunks/app/api/html-apps/route-dd925381ab99e37b.js +1 -0
  420. package/.next-prod/static/chunks/app/api/instructions/config/route-dd925381ab99e37b.js +1 -0
  421. package/.next-prod/static/chunks/app/api/kimi/credentials/route-dd925381ab99e37b.js +1 -0
  422. package/.next-prod/static/chunks/app/api/kimi/models/route-dd925381ab99e37b.js +1 -0
  423. package/.next-prod/static/chunks/app/api/kimi/usage/route-dd925381ab99e37b.js +1 -0
  424. package/.next-prod/static/chunks/app/api/lsp/definition/route-dd925381ab99e37b.js +1 -0
  425. package/.next-prod/static/chunks/app/api/lsp/hover/route-dd925381ab99e37b.js +1 -0
  426. package/.next-prod/static/chunks/app/api/lsp/references/route-dd925381ab99e37b.js +1 -0
  427. package/.next-prod/static/chunks/app/api/lsp/status/route-dd925381ab99e37b.js +1 -0
  428. package/.next-prod/static/chunks/app/api/lsp/warmup/route-dd925381ab99e37b.js +1 -0
  429. package/.next-prod/static/chunks/app/api/mysql/columns/route-dd925381ab99e37b.js +1 -0
  430. package/.next-prod/static/chunks/app/api/mysql/connect/route-dd925381ab99e37b.js +1 -0
  431. package/.next-prod/static/chunks/app/api/mysql/disconnect/route-dd925381ab99e37b.js +1 -0
  432. package/.next-prod/static/chunks/app/api/mysql/export/route-dd925381ab99e37b.js +1 -0
  433. package/.next-prod/static/chunks/app/api/mysql/query/route-dd925381ab99e37b.js +1 -0
  434. package/.next-prod/static/chunks/app/api/mysql/schemas/route-dd925381ab99e37b.js +1 -0
  435. package/.next-prod/static/chunks/app/api/neo4j/connect/route-dd925381ab99e37b.js +1 -0
  436. package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-dd925381ab99e37b.js +1 -0
  437. package/.next-prod/static/chunks/app/api/neo4j/query/route-dd925381ab99e37b.js +1 -0
  438. package/.next-prod/static/chunks/app/api/neo4j/schema/route-dd925381ab99e37b.js +1 -0
  439. package/.next-prod/static/chunks/app/api/note/route-dd925381ab99e37b.js +1 -0
  440. package/.next-prod/static/chunks/app/api/ollama/config/route-dd925381ab99e37b.js +1 -0
  441. package/.next-prod/static/chunks/app/api/ollama/models/route-dd925381ab99e37b.js +1 -0
  442. package/.next-prod/static/chunks/app/api/ollama/start/route-dd925381ab99e37b.js +1 -0
  443. package/.next-prod/static/chunks/app/api/open-cursor/route-dd925381ab99e37b.js +1 -0
  444. package/.next-prod/static/chunks/app/api/open-vscode/route-dd925381ab99e37b.js +1 -0
  445. package/.next-prod/static/chunks/app/api/pick-folder/route-dd925381ab99e37b.js +1 -0
  446. package/.next-prod/static/chunks/app/api/pinned-sessions/route-dd925381ab99e37b.js +1 -0
  447. package/.next-prod/static/chunks/app/api/project-settings/route-dd925381ab99e37b.js +1 -0
  448. package/.next-prod/static/chunks/app/api/project-state/route-dd925381ab99e37b.js +1 -0
  449. package/.next-prod/static/chunks/app/api/projectGraph/affected/route-dd925381ab99e37b.js +1 -0
  450. package/.next-prod/static/chunks/app/api/projectGraph/callees/route-dd925381ab99e37b.js +1 -0
  451. package/.next-prod/static/chunks/app/api/projectGraph/callers/route-dd925381ab99e37b.js +1 -0
  452. package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-dd925381ab99e37b.js +1 -0
  453. package/.next-prod/static/chunks/app/api/projectGraph/context/route-dd925381ab99e37b.js +1 -0
  454. package/.next-prod/static/chunks/app/api/projectGraph/file/route-dd925381ab99e37b.js +1 -0
  455. package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-dd925381ab99e37b.js +1 -0
  456. package/.next-prod/static/chunks/app/api/projectGraph/impact/route-dd925381ab99e37b.js +1 -0
  457. package/.next-prod/static/chunks/app/api/projectGraph/related/route-dd925381ab99e37b.js +1 -0
  458. package/.next-prod/static/chunks/app/api/projectGraph/risk/route-dd925381ab99e37b.js +1 -0
  459. package/.next-prod/static/chunks/app/api/projectGraph/search/route-dd925381ab99e37b.js +1 -0
  460. package/.next-prod/static/chunks/app/api/projects/route-dd925381ab99e37b.js +1 -0
  461. package/.next-prod/static/chunks/app/api/push/public-key/route-dd925381ab99e37b.js +1 -0
  462. package/.next-prod/static/chunks/app/api/push/subscribe/route-dd925381ab99e37b.js +1 -0
  463. package/.next-prod/static/chunks/app/api/push/unsubscribe/route-dd925381ab99e37b.js +1 -0
  464. package/.next-prod/static/chunks/app/api/redis/command/route-dd925381ab99e37b.js +1 -0
  465. package/.next-prod/static/chunks/app/api/redis/connect/route-dd925381ab99e37b.js +1 -0
  466. package/.next-prod/static/chunks/app/api/redis/delete/route-dd925381ab99e37b.js +1 -0
  467. package/.next-prod/static/chunks/app/api/redis/disconnect/route-dd925381ab99e37b.js +1 -0
  468. package/.next-prod/static/chunks/app/api/redis/get/route-dd925381ab99e37b.js +1 -0
  469. package/.next-prod/static/chunks/app/api/redis/keys/route-dd925381ab99e37b.js +1 -0
  470. package/.next-prod/static/chunks/app/api/redis/set/route-dd925381ab99e37b.js +1 -0
  471. package/.next-prod/static/chunks/app/api/restart/route-dd925381ab99e37b.js +1 -0
  472. package/.next-prod/static/chunks/app/api/review/[id]/comments/route-dd925381ab99e37b.js +1 -0
  473. package/.next-prod/static/chunks/app/api/review/[id]/replies/route-dd925381ab99e37b.js +1 -0
  474. package/.next-prod/static/chunks/app/api/review/[id]/route-dd925381ab99e37b.js +1 -0
  475. package/.next-prod/static/chunks/app/api/review/identify/route-dd925381ab99e37b.js +1 -0
  476. package/.next-prod/static/chunks/app/api/review/order/route-dd925381ab99e37b.js +1 -0
  477. package/.next-prod/static/chunks/app/api/review/route-dd925381ab99e37b.js +1 -0
  478. package/.next-prod/static/chunks/app/api/review/share-info/route-dd925381ab99e37b.js +1 -0
  479. package/.next-prod/static/chunks/app/api/review/users/route-dd925381ab99e37b.js +1 -0
  480. package/.next-prod/static/chunks/app/api/scheduled-tasks/route-dd925381ab99e37b.js +1 -0
  481. package/.next-prod/static/chunks/app/api/services/config/route-dd925381ab99e37b.js +1 -0
  482. package/.next-prod/static/chunks/app/api/services/scripts/route-dd925381ab99e37b.js +1 -0
  483. package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-dd925381ab99e37b.js +1 -0
  484. package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-dd925381ab99e37b.js +1 -0
  485. package/.next-prod/static/chunks/app/api/session/[sessionId]/turn/route-dd925381ab99e37b.js +1 -0
  486. package/.next-prod/static/chunks/app/api/session/user-messages/route-dd925381ab99e37b.js +1 -0
  487. package/.next-prod/static/chunks/app/api/session-by-path/route-dd925381ab99e37b.js +1 -0
  488. package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-dd925381ab99e37b.js +1 -0
  489. package/.next-prod/static/chunks/app/api/sessions/projects/route-dd925381ab99e37b.js +1 -0
  490. package/.next-prod/static/chunks/app/api/sessions/route-dd925381ab99e37b.js +1 -0
  491. package/.next-prod/static/chunks/app/api/settings/route-dd925381ab99e37b.js +1 -0
  492. package/.next-prod/static/chunks/app/api/shutdown/route-dd925381ab99e37b.js +1 -0
  493. package/.next-prod/static/chunks/app/api/skills/[id]/route-dd925381ab99e37b.js +1 -0
  494. package/.next-prod/static/chunks/app/api/skills/content/route-dd925381ab99e37b.js +1 -0
  495. package/.next-prod/static/chunks/app/api/skills/route-dd925381ab99e37b.js +1 -0
  496. package/.next-prod/static/chunks/app/api/snapshots/blob/route-dd925381ab99e37b.js +1 -0
  497. package/.next-prod/static/chunks/app/api/snapshots/diff/route-dd925381ab99e37b.js +1 -0
  498. package/.next-prod/static/chunks/app/api/snapshots/route-dd925381ab99e37b.js +1 -0
  499. package/.next-prod/static/chunks/app/api/terminal/aliases/route-dd925381ab99e37b.js +1 -0
  500. package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-dd925381ab99e37b.js +1 -0
  501. package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-dd925381ab99e37b.js +1 -0
  502. package/.next-prod/static/chunks/app/api/terminal/env/route-dd925381ab99e37b.js +1 -0
  503. package/.next-prod/static/chunks/app/api/terminal/history/route-dd925381ab99e37b.js +1 -0
  504. package/.next-prod/static/chunks/app/api/update/route-dd925381ab99e37b.js +1 -0
  505. package/.next-prod/static/chunks/app/api/update-state/route-dd925381ab99e37b.js +1 -0
  506. package/.next-prod/static/chunks/app/api/version/route-dd925381ab99e37b.js +1 -0
  507. package/.next-prod/static/chunks/app/apps/[...path]/route-dd925381ab99e37b.js +1 -0
  508. package/.next-prod/static/chunks/app/{layout-915635f208cba4b3.js → layout-c78a23d9fb720698.js} +1 -1
  509. package/.next-prod/static/chunks/app/m/page-54ed2c27ba82b757.js +1 -0
  510. package/.next-prod/static/chunks/app/manifest.webmanifest/route-dd925381ab99e37b.js +1 -0
  511. package/.next-prod/static/chunks/app/{page-48dc2d6146301fd7.js → page-7219de792c309861.js} +1 -1
  512. package/.next-prod/static/chunks/app/project/{page-48dc2d6146301fd7.js → page-7219de792c309861.js} +1 -1
  513. package/.next-prod/static/chunks/app/review/[id]/{page-1fe42d46b22c6482.js → page-70fc17b48dfdf8d3.js} +1 -1
  514. package/.next-prod/static/chunks/bc21e3dd-86c39ec41fe6001c.js +1 -0
  515. package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-dd925381ab99e37b.js +1 -0
  516. package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-dd925381ab99e37b.js +1 -0
  517. package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-dd925381ab99e37b.js +1 -0
  518. package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-dd925381ab99e37b.js +1 -0
  519. package/.next-prod/static/chunks/{webpack-82f9e372d672c6bc.js → webpack-9a02cd12ee150c50.js} +1 -1
  520. package/.next-prod/static/css/08c892de6d5e2335.css +1 -0
  521. package/.next-prod/trace +14 -14
  522. package/.next-prod/trace-build +1 -1
  523. package/.next-prod/types/app/api/{prompts → instructions}/config/route.ts +3 -3
  524. package/.next-prod/types/app/api/session/[sessionId]/turn/route.ts +353 -0
  525. package/.next-prod/types/routes.d.ts +3 -2
  526. package/.next-prod/types/validator.ts +18 -9
  527. package/dist/{chunk-TOA52B2X.mjs → chunk-OFFSCRWY.mjs} +18 -13
  528. package/dist/{chunk-PB4GBZQO.mjs → chunk-OO4ODUAC.mjs} +1 -1
  529. package/dist/{chunk-4EU4KZIO.mjs → chunk-SJ7VM26B.mjs} +4 -14
  530. package/dist/httpApi.mjs +2 -2
  531. package/dist/scheduledTasks.mjs +834 -508
  532. package/dist/wsServer.mjs +3 -3
  533. package/package.json +3 -3
  534. package/.next-prod/server/app/api/prompts/config/route.js +0 -1
  535. package/.next-prod/server/app/api/prompts/config/route_client-reference-manifest.js +0 -1
  536. package/.next-prod/server/chunks/2728.js +0 -1
  537. package/.next-prod/server/chunks/3718.js +0 -1
  538. package/.next-prod/server/chunks/9312.js +0 -1
  539. package/.next-prod/server/chunks/9352.js +0 -6
  540. package/.next-prod/static/chunks/5390-e2c2386e8288a254.js +0 -32
  541. package/.next-prod/static/chunks/7184-8b7ad4ccea8b15a3.js +0 -17
  542. package/.next-prod/static/chunks/7562.8fdc3abdd45c77ab.js +0 -1
  543. package/.next-prod/static/chunks/9012.6ed079104670001d.js +0 -1
  544. package/.next-prod/static/chunks/9092-a942df8114966b59.js +0 -716
  545. package/.next-prod/static/chunks/96c8525a-f1e0653013503d49.js +0 -2
  546. package/.next-prod/static/chunks/app/_global-error/page-0bc5d188dc4650ab.js +0 -1
  547. package/.next-prod/static/chunks/app/api/agent/test/route-0bc5d188dc4650ab.js +0 -1
  548. package/.next-prod/static/chunks/app/api/bash/route-0bc5d188dc4650ab.js +0 -1
  549. package/.next-prod/static/chunks/app/api/chat/codex/route-0bc5d188dc4650ab.js +0 -1
  550. package/.next-prod/static/chunks/app/api/chat/deepseek/route-0bc5d188dc4650ab.js +0 -1
  551. package/.next-prod/static/chunks/app/api/chat/glm/route-0bc5d188dc4650ab.js +0 -1
  552. package/.next-prod/static/chunks/app/api/chat/kimi/route-0bc5d188dc4650ab.js +0 -1
  553. package/.next-prod/static/chunks/app/api/chat/ollama/route-0bc5d188dc4650ab.js +0 -1
  554. package/.next-prod/static/chunks/app/api/chat/route-0bc5d188dc4650ab.js +0 -1
  555. package/.next-prod/static/chunks/app/api/chat/stop/route-0bc5d188dc4650ab.js +0 -1
  556. package/.next-prod/static/chunks/app/api/claude-stats/route-0bc5d188dc4650ab.js +0 -1
  557. package/.next-prod/static/chunks/app/api/commands/route-0bc5d188dc4650ab.js +0 -1
  558. package/.next-prod/static/chunks/app/api/comments/route-0bc5d188dc4650ab.js +0 -1
  559. package/.next-prod/static/chunks/app/api/db/columns/route-0bc5d188dc4650ab.js +0 -1
  560. package/.next-prod/static/chunks/app/api/db/connect/route-0bc5d188dc4650ab.js +0 -1
  561. package/.next-prod/static/chunks/app/api/db/disconnect/route-0bc5d188dc4650ab.js +0 -1
  562. package/.next-prod/static/chunks/app/api/db/export/route-0bc5d188dc4650ab.js +0 -1
  563. package/.next-prod/static/chunks/app/api/db/query/route-0bc5d188dc4650ab.js +0 -1
  564. package/.next-prod/static/chunks/app/api/db/schemas/route-0bc5d188dc4650ab.js +0 -1
  565. package/.next-prod/static/chunks/app/api/deepseek/balance/route-0bc5d188dc4650ab.js +0 -1
  566. package/.next-prod/static/chunks/app/api/deepseek/credentials/route-0bc5d188dc4650ab.js +0 -1
  567. package/.next-prod/static/chunks/app/api/deepseek/models/route-0bc5d188dc4650ab.js +0 -1
  568. package/.next-prod/static/chunks/app/api/dev/spans/route-0bc5d188dc4650ab.js +0 -1
  569. package/.next-prod/static/chunks/app/api/extension/version/route-0bc5d188dc4650ab.js +0 -1
  570. package/.next-prod/static/chunks/app/api/file/route-0bc5d188dc4650ab.js +0 -1
  571. package/.next-prod/static/chunks/app/api/files/blame/route-0bc5d188dc4650ab.js +0 -1
  572. package/.next-prod/static/chunks/app/api/files/clipboard/route-0bc5d188dc4650ab.js +0 -1
  573. package/.next-prod/static/chunks/app/api/files/copy/route-0bc5d188dc4650ab.js +0 -1
  574. package/.next-prod/static/chunks/app/api/files/delete/route-0bc5d188dc4650ab.js +0 -1
  575. package/.next-prod/static/chunks/app/api/files/expanded/route-0bc5d188dc4650ab.js +0 -1
  576. package/.next-prod/static/chunks/app/api/files/index/route-0bc5d188dc4650ab.js +0 -1
  577. package/.next-prod/static/chunks/app/api/files/init/route-0bc5d188dc4650ab.js +0 -1
  578. package/.next-prod/static/chunks/app/api/files/paste/route-0bc5d188dc4650ab.js +0 -1
  579. package/.next-prod/static/chunks/app/api/files/read/route-0bc5d188dc4650ab.js +0 -1
  580. package/.next-prod/static/chunks/app/api/files/readdir/route-0bc5d188dc4650ab.js +0 -1
  581. package/.next-prod/static/chunks/app/api/files/recent/route-0bc5d188dc4650ab.js +0 -1
  582. package/.next-prod/static/chunks/app/api/files/save/route-0bc5d188dc4650ab.js +0 -1
  583. package/.next-prod/static/chunks/app/api/files/search/route-0bc5d188dc4650ab.js +0 -1
  584. package/.next-prod/static/chunks/app/api/files/stat/route-0bc5d188dc4650ab.js +0 -1
  585. package/.next-prod/static/chunks/app/api/files/text/route-0bc5d188dc4650ab.js +0 -1
  586. package/.next-prod/static/chunks/app/api/git/blob/route-0bc5d188dc4650ab.js +0 -1
  587. package/.next-prod/static/chunks/app/api/git/branch-diff/route-0bc5d188dc4650ab.js +0 -1
  588. package/.next-prod/static/chunks/app/api/git/branches/route-0bc5d188dc4650ab.js +0 -1
  589. package/.next-prod/static/chunks/app/api/git/commit-diff/route-0bc5d188dc4650ab.js +0 -1
  590. package/.next-prod/static/chunks/app/api/git/commits/route-0bc5d188dc4650ab.js +0 -1
  591. package/.next-prod/static/chunks/app/api/git/current-branch/route-0bc5d188dc4650ab.js +0 -1
  592. package/.next-prod/static/chunks/app/api/git/diff/route-0bc5d188dc4650ab.js +0 -1
  593. package/.next-prod/static/chunks/app/api/git/discard/route-0bc5d188dc4650ab.js +0 -1
  594. package/.next-prod/static/chunks/app/api/git/stage/route-0bc5d188dc4650ab.js +0 -1
  595. package/.next-prod/static/chunks/app/api/git/status/route-0bc5d188dc4650ab.js +0 -1
  596. package/.next-prod/static/chunks/app/api/git/unstage/route-0bc5d188dc4650ab.js +0 -1
  597. package/.next-prod/static/chunks/app/api/git/worktree/route-0bc5d188dc4650ab.js +0 -1
  598. package/.next-prod/static/chunks/app/api/glm/credentials/route-0bc5d188dc4650ab.js +0 -1
  599. package/.next-prod/static/chunks/app/api/glm/models/route-0bc5d188dc4650ab.js +0 -1
  600. package/.next-prod/static/chunks/app/api/glm/usage/route-0bc5d188dc4650ab.js +0 -1
  601. package/.next-prod/static/chunks/app/api/global-state/route-0bc5d188dc4650ab.js +0 -1
  602. package/.next-prod/static/chunks/app/api/health/route-0bc5d188dc4650ab.js +0 -1
  603. package/.next-prod/static/chunks/app/api/html-apps/[id]/route-0bc5d188dc4650ab.js +0 -1
  604. package/.next-prod/static/chunks/app/api/html-apps/route-0bc5d188dc4650ab.js +0 -1
  605. package/.next-prod/static/chunks/app/api/kimi/credentials/route-0bc5d188dc4650ab.js +0 -1
  606. package/.next-prod/static/chunks/app/api/kimi/models/route-0bc5d188dc4650ab.js +0 -1
  607. package/.next-prod/static/chunks/app/api/kimi/usage/route-0bc5d188dc4650ab.js +0 -1
  608. package/.next-prod/static/chunks/app/api/lsp/definition/route-0bc5d188dc4650ab.js +0 -1
  609. package/.next-prod/static/chunks/app/api/lsp/hover/route-0bc5d188dc4650ab.js +0 -1
  610. package/.next-prod/static/chunks/app/api/lsp/references/route-0bc5d188dc4650ab.js +0 -1
  611. package/.next-prod/static/chunks/app/api/lsp/status/route-0bc5d188dc4650ab.js +0 -1
  612. package/.next-prod/static/chunks/app/api/lsp/warmup/route-0bc5d188dc4650ab.js +0 -1
  613. package/.next-prod/static/chunks/app/api/mysql/columns/route-0bc5d188dc4650ab.js +0 -1
  614. package/.next-prod/static/chunks/app/api/mysql/connect/route-0bc5d188dc4650ab.js +0 -1
  615. package/.next-prod/static/chunks/app/api/mysql/disconnect/route-0bc5d188dc4650ab.js +0 -1
  616. package/.next-prod/static/chunks/app/api/mysql/export/route-0bc5d188dc4650ab.js +0 -1
  617. package/.next-prod/static/chunks/app/api/mysql/query/route-0bc5d188dc4650ab.js +0 -1
  618. package/.next-prod/static/chunks/app/api/mysql/schemas/route-0bc5d188dc4650ab.js +0 -1
  619. package/.next-prod/static/chunks/app/api/neo4j/connect/route-0bc5d188dc4650ab.js +0 -1
  620. package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-0bc5d188dc4650ab.js +0 -1
  621. package/.next-prod/static/chunks/app/api/neo4j/query/route-0bc5d188dc4650ab.js +0 -1
  622. package/.next-prod/static/chunks/app/api/neo4j/schema/route-0bc5d188dc4650ab.js +0 -1
  623. package/.next-prod/static/chunks/app/api/note/route-0bc5d188dc4650ab.js +0 -1
  624. package/.next-prod/static/chunks/app/api/ollama/config/route-0bc5d188dc4650ab.js +0 -1
  625. package/.next-prod/static/chunks/app/api/ollama/models/route-0bc5d188dc4650ab.js +0 -1
  626. package/.next-prod/static/chunks/app/api/ollama/start/route-0bc5d188dc4650ab.js +0 -1
  627. package/.next-prod/static/chunks/app/api/open-cursor/route-0bc5d188dc4650ab.js +0 -1
  628. package/.next-prod/static/chunks/app/api/open-vscode/route-0bc5d188dc4650ab.js +0 -1
  629. package/.next-prod/static/chunks/app/api/pick-folder/route-0bc5d188dc4650ab.js +0 -1
  630. package/.next-prod/static/chunks/app/api/pinned-sessions/route-0bc5d188dc4650ab.js +0 -1
  631. package/.next-prod/static/chunks/app/api/project-settings/route-0bc5d188dc4650ab.js +0 -1
  632. package/.next-prod/static/chunks/app/api/project-state/route-0bc5d188dc4650ab.js +0 -1
  633. package/.next-prod/static/chunks/app/api/projectGraph/affected/route-0bc5d188dc4650ab.js +0 -1
  634. package/.next-prod/static/chunks/app/api/projectGraph/callees/route-0bc5d188dc4650ab.js +0 -1
  635. package/.next-prod/static/chunks/app/api/projectGraph/callers/route-0bc5d188dc4650ab.js +0 -1
  636. package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-0bc5d188dc4650ab.js +0 -1
  637. package/.next-prod/static/chunks/app/api/projectGraph/context/route-0bc5d188dc4650ab.js +0 -1
  638. package/.next-prod/static/chunks/app/api/projectGraph/file/route-0bc5d188dc4650ab.js +0 -1
  639. package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-0bc5d188dc4650ab.js +0 -1
  640. package/.next-prod/static/chunks/app/api/projectGraph/impact/route-0bc5d188dc4650ab.js +0 -1
  641. package/.next-prod/static/chunks/app/api/projectGraph/related/route-0bc5d188dc4650ab.js +0 -1
  642. package/.next-prod/static/chunks/app/api/projectGraph/risk/route-0bc5d188dc4650ab.js +0 -1
  643. package/.next-prod/static/chunks/app/api/projectGraph/search/route-0bc5d188dc4650ab.js +0 -1
  644. package/.next-prod/static/chunks/app/api/projects/route-0bc5d188dc4650ab.js +0 -1
  645. package/.next-prod/static/chunks/app/api/prompts/config/route-0bc5d188dc4650ab.js +0 -1
  646. package/.next-prod/static/chunks/app/api/push/public-key/route-0bc5d188dc4650ab.js +0 -1
  647. package/.next-prod/static/chunks/app/api/push/subscribe/route-0bc5d188dc4650ab.js +0 -1
  648. package/.next-prod/static/chunks/app/api/push/unsubscribe/route-0bc5d188dc4650ab.js +0 -1
  649. package/.next-prod/static/chunks/app/api/redis/command/route-0bc5d188dc4650ab.js +0 -1
  650. package/.next-prod/static/chunks/app/api/redis/connect/route-0bc5d188dc4650ab.js +0 -1
  651. package/.next-prod/static/chunks/app/api/redis/delete/route-0bc5d188dc4650ab.js +0 -1
  652. package/.next-prod/static/chunks/app/api/redis/disconnect/route-0bc5d188dc4650ab.js +0 -1
  653. package/.next-prod/static/chunks/app/api/redis/get/route-0bc5d188dc4650ab.js +0 -1
  654. package/.next-prod/static/chunks/app/api/redis/keys/route-0bc5d188dc4650ab.js +0 -1
  655. package/.next-prod/static/chunks/app/api/redis/set/route-0bc5d188dc4650ab.js +0 -1
  656. package/.next-prod/static/chunks/app/api/restart/route-0bc5d188dc4650ab.js +0 -1
  657. package/.next-prod/static/chunks/app/api/review/[id]/comments/route-0bc5d188dc4650ab.js +0 -1
  658. package/.next-prod/static/chunks/app/api/review/[id]/replies/route-0bc5d188dc4650ab.js +0 -1
  659. package/.next-prod/static/chunks/app/api/review/[id]/route-0bc5d188dc4650ab.js +0 -1
  660. package/.next-prod/static/chunks/app/api/review/identify/route-0bc5d188dc4650ab.js +0 -1
  661. package/.next-prod/static/chunks/app/api/review/order/route-0bc5d188dc4650ab.js +0 -1
  662. package/.next-prod/static/chunks/app/api/review/route-0bc5d188dc4650ab.js +0 -1
  663. package/.next-prod/static/chunks/app/api/review/share-info/route-0bc5d188dc4650ab.js +0 -1
  664. package/.next-prod/static/chunks/app/api/review/users/route-0bc5d188dc4650ab.js +0 -1
  665. package/.next-prod/static/chunks/app/api/scheduled-tasks/route-0bc5d188dc4650ab.js +0 -1
  666. package/.next-prod/static/chunks/app/api/services/config/route-0bc5d188dc4650ab.js +0 -1
  667. package/.next-prod/static/chunks/app/api/services/scripts/route-0bc5d188dc4650ab.js +0 -1
  668. package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-0bc5d188dc4650ab.js +0 -1
  669. package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-0bc5d188dc4650ab.js +0 -1
  670. package/.next-prod/static/chunks/app/api/session/user-messages/route-0bc5d188dc4650ab.js +0 -1
  671. package/.next-prod/static/chunks/app/api/session-by-path/route-0bc5d188dc4650ab.js +0 -1
  672. package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-0bc5d188dc4650ab.js +0 -1
  673. package/.next-prod/static/chunks/app/api/sessions/projects/route-0bc5d188dc4650ab.js +0 -1
  674. package/.next-prod/static/chunks/app/api/sessions/route-0bc5d188dc4650ab.js +0 -1
  675. package/.next-prod/static/chunks/app/api/settings/route-0bc5d188dc4650ab.js +0 -1
  676. package/.next-prod/static/chunks/app/api/shutdown/route-0bc5d188dc4650ab.js +0 -1
  677. package/.next-prod/static/chunks/app/api/skills/[id]/route-0bc5d188dc4650ab.js +0 -1
  678. package/.next-prod/static/chunks/app/api/skills/content/route-0bc5d188dc4650ab.js +0 -1
  679. package/.next-prod/static/chunks/app/api/skills/route-0bc5d188dc4650ab.js +0 -1
  680. package/.next-prod/static/chunks/app/api/snapshots/blob/route-0bc5d188dc4650ab.js +0 -1
  681. package/.next-prod/static/chunks/app/api/snapshots/diff/route-0bc5d188dc4650ab.js +0 -1
  682. package/.next-prod/static/chunks/app/api/snapshots/route-0bc5d188dc4650ab.js +0 -1
  683. package/.next-prod/static/chunks/app/api/terminal/aliases/route-0bc5d188dc4650ab.js +0 -1
  684. package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-0bc5d188dc4650ab.js +0 -1
  685. package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-0bc5d188dc4650ab.js +0 -1
  686. package/.next-prod/static/chunks/app/api/terminal/env/route-0bc5d188dc4650ab.js +0 -1
  687. package/.next-prod/static/chunks/app/api/terminal/history/route-0bc5d188dc4650ab.js +0 -1
  688. package/.next-prod/static/chunks/app/api/update/route-0bc5d188dc4650ab.js +0 -1
  689. package/.next-prod/static/chunks/app/api/update-state/route-0bc5d188dc4650ab.js +0 -1
  690. package/.next-prod/static/chunks/app/api/version/route-0bc5d188dc4650ab.js +0 -1
  691. package/.next-prod/static/chunks/app/apps/[...path]/route-0bc5d188dc4650ab.js +0 -1
  692. package/.next-prod/static/chunks/app/m/page-8442a2605d0feb3f.js +0 -1
  693. package/.next-prod/static/chunks/app/manifest.webmanifest/route-0bc5d188dc4650ab.js +0 -1
  694. package/.next-prod/static/chunks/bc21e3dd-a78364524623b9b0.js +0 -1
  695. package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-0bc5d188dc4650ab.js +0 -1
  696. package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-0bc5d188dc4650ab.js +0 -1
  697. package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-0bc5d188dc4650ab.js +0 -1
  698. package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-0bc5d188dc4650ab.js +0 -1
  699. package/.next-prod/static/css/ec2765469545dfce.css +0 -1
  700. /package/.next-prod/static/{qoIca6xp2OKAJtDEvMaXC → Ltfbusd381Du6etTab1ug}/_ssgManifest.js +0 -0
@@ -15,7 +15,7 @@ import {
15
15
  stashCodexRollout,
16
16
  stashTranscript,
17
17
  updateGlobalState
18
- } from "./chunk-TOA52B2X.mjs";
18
+ } from "./chunk-OFFSCRWY.mjs";
19
19
  import {
20
20
  AgentError,
21
21
  AppRuntime,
@@ -46,7 +46,7 @@ import {
46
46
  settlePendingRecord,
47
47
  withFileLock,
48
48
  writeJsonFile
49
- } from "./chunk-4EU4KZIO.mjs";
49
+ } from "./chunk-SJ7VM26B.mjs";
50
50
  import {
51
51
  __export
52
52
  } from "./chunk-7P6ASYW6.mjs";
@@ -124,13 +124,13 @@ var forkSnapshot = (effect) => {
124
124
  )
125
125
  );
126
126
  };
127
- function snapshotOnRunStart(cwd, sessionKey, provider, runId) {
127
+ function snapshotOnRunStart(cwd, sessionKey, provider) {
128
128
  if (!cwd) return;
129
129
  forkSnapshot(
130
- Effect_exports.flatMap(SnapshotService, (svc) => svc.baseline(cwd, sessionKey, provider, runId))
130
+ Effect_exports.flatMap(SnapshotService, (svc) => svc.baseline(cwd, sessionKey, provider))
131
131
  );
132
132
  }
133
- function snapshotOnRunEvent(cwd, sessionKey, provider, event, runId) {
133
+ function snapshotOnRunEvent(cwd, sessionKey, provider, event) {
134
134
  if (!cwd) return;
135
135
  if (event.type === "assistant") {
136
136
  for (const b of contentBlocks(event)) {
@@ -160,7 +160,6 @@ function snapshotOnRunEvent(cwd, sessionKey, provider, event, runId) {
160
160
  (svc) => svc.record({
161
161
  cwd,
162
162
  sessionKey,
163
- runId,
164
163
  provider,
165
164
  toolId,
166
165
  toolName: meta3?.name ?? "tool",
@@ -410,7 +409,7 @@ async function dispatchChat(spec, body, request) {
410
409
  updateGlobalState(cwd, sessionId, "loading", void 0, promptText, spec.name).catch(() => {
411
410
  });
412
411
  }
413
- snapshotOnRunStart(cwd || "", currentKey, spec.name, runId);
412
+ snapshotOnRunStart(cwd || "", currentKey, spec.name);
414
413
  const ctx = {
415
414
  prompt: promptText,
416
415
  images,
@@ -421,7 +420,7 @@ async function dispatchChat(spec, body, request) {
421
420
  emit(event) {
422
421
  if (isClosed) return;
423
422
  appendRun(currentKey, event);
424
- snapshotOnRunEvent(cwd || "", currentKey, spec.name, event, runId);
423
+ snapshotOnRunEvent(cwd || "", currentKey, spec.name, event);
425
424
  },
426
425
  rekey(realSessionId) {
427
426
  if (!realSessionId) return;
@@ -2501,8 +2500,8 @@ function emoji() {
2501
2500
  }
2502
2501
  var ipv4 = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;
2503
2502
  var ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/;
2504
- var mac = (delimiter) => {
2505
- const escapedDelim = escapeRegex(delimiter ?? ":");
2503
+ var mac = (delimiter2) => {
2504
+ const escapedDelim = escapeRegex(delimiter2 ?? ":");
2506
2505
  return new RegExp(`^(?:[0-9A-F]{2}${escapedDelim}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${escapedDelim}){5}[0-9a-f]{2}$`);
2507
2506
  };
2508
2507
  var cidrv4 = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/;
@@ -15426,11 +15425,454 @@ var glmProvider = {
15426
15425
  };
15427
15426
  var glmSpec = makeAnthropicCompatSpec(glmProvider);
15428
15427
 
15428
+ // packages/feature/agent/src/server/engines/codexAppServer/client.ts
15429
+ import { spawn } from "child_process";
15430
+ import { StringDecoder } from "string_decoder";
15431
+
15432
+ // packages/feature/agent/src/server/engines/codexAppServer/binary.ts
15433
+ import { statSync as statSync2 } from "fs";
15434
+ import { join as join5, delimiter } from "path";
15435
+ var CODEX_NPM_NAME = "@openai/codex";
15436
+ var PLATFORM_PACKAGE_BY_TARGET = {
15437
+ "x86_64-unknown-linux-musl": "@openai/codex-linux-x64",
15438
+ "aarch64-unknown-linux-musl": "@openai/codex-linux-arm64",
15439
+ "x86_64-apple-darwin": "@openai/codex-darwin-x64",
15440
+ "aarch64-apple-darwin": "@openai/codex-darwin-arm64",
15441
+ "x86_64-pc-windows-msvc": "@openai/codex-win32-x64",
15442
+ "aarch64-pc-windows-msvc": "@openai/codex-win32-arm64"
15443
+ };
15444
+ function codexTargetTriple(platform = process.platform, arch = process.arch) {
15445
+ switch (platform) {
15446
+ // Android ships the musl build, matching the upstream launcher.
15447
+ case "linux":
15448
+ case "android":
15449
+ if (arch === "x64") return "x86_64-unknown-linux-musl";
15450
+ if (arch === "arm64") return "aarch64-unknown-linux-musl";
15451
+ return null;
15452
+ case "darwin":
15453
+ if (arch === "x64") return "x86_64-apple-darwin";
15454
+ if (arch === "arm64") return "aarch64-apple-darwin";
15455
+ return null;
15456
+ case "win32":
15457
+ if (arch === "x64") return "x86_64-pc-windows-msvc";
15458
+ if (arch === "arm64") return "aarch64-pc-windows-msvc";
15459
+ return null;
15460
+ default:
15461
+ return null;
15462
+ }
15463
+ }
15464
+ var isFile = (p) => {
15465
+ try {
15466
+ return statSync2(p).isFile();
15467
+ } catch {
15468
+ return false;
15469
+ }
15470
+ };
15471
+ function platformPackageRoots(cockpitRoot, platformPackage) {
15472
+ const parts = platformPackage.split("/");
15473
+ return [
15474
+ join5(cockpitRoot, "node_modules", ...parts),
15475
+ join5(cockpitRoot, "node_modules", CODEX_NPM_NAME, "node_modules", ...parts)
15476
+ ];
15477
+ }
15478
+ function resolveCodexBinary() {
15479
+ const triple = codexTargetTriple();
15480
+ if (!triple) {
15481
+ throw new Error(`Codex: unsupported platform ${process.platform} (${process.arch})`);
15482
+ }
15483
+ const platformPackage = PLATFORM_PACKAGE_BY_TARGET[triple];
15484
+ const cockpitRoot = process.env.COCKPIT_ROOT || process.cwd();
15485
+ const binaryName = process.platform === "win32" ? "codex.exe" : "codex";
15486
+ for (const packageRootBase of platformPackageRoots(cockpitRoot, platformPackage)) {
15487
+ const packageRoot = join5(packageRootBase, "vendor", triple);
15488
+ const current = join5(packageRoot, "bin", binaryName);
15489
+ if (isFile(current) && isFile(join5(packageRoot, "codex-package.json"))) {
15490
+ return { executablePath: current, pathDirs: existingDirs(join5(packageRoot, "codex-path")) };
15491
+ }
15492
+ const legacy = join5(packageRoot, "codex", binaryName);
15493
+ if (isFile(legacy)) {
15494
+ return { executablePath: legacy, pathDirs: existingDirs(join5(packageRoot, "path")) };
15495
+ }
15496
+ }
15497
+ throw new Error(
15498
+ `Codex: cannot locate ${platformPackage} under ${cockpitRoot}. Reinstall so npm fetches optional dependencies, or run: cockpit update`
15499
+ );
15500
+ }
15501
+ function existingDirs(...dirs) {
15502
+ return dirs.filter((d) => {
15503
+ try {
15504
+ return statSync2(d).isDirectory();
15505
+ } catch {
15506
+ return false;
15507
+ }
15508
+ });
15509
+ }
15510
+ function codexPathEnvKey(env, platform = process.platform) {
15511
+ if (platform !== "win32") return "PATH";
15512
+ const matching = Object.keys(env).filter((k) => k.toLowerCase() === "path");
15513
+ if (matching.includes("Path")) return "Path";
15514
+ return matching[matching.length - 1] ?? "PATH";
15515
+ }
15516
+ function applyCodexPathDirs(env, pathDirs, platform = process.platform) {
15517
+ if (pathDirs.length === 0) return;
15518
+ const key = codexPathEnvKey(env, platform);
15519
+ if (platform === "win32") {
15520
+ for (const k of Object.keys(env)) {
15521
+ if (k.toLowerCase() === "path" && k !== key) delete env[k];
15522
+ }
15523
+ }
15524
+ const existing = (env[key] ?? "").split(delimiter).filter((entry) => entry.length > 0 && !pathDirs.includes(entry));
15525
+ env[key] = [...pathDirs, ...existing].join(delimiter);
15526
+ }
15527
+
15528
+ // packages/feature/agent/src/server/engines/codexAppServer/client.ts
15529
+ var CodexAppServerAborted = class extends Error {
15530
+ constructor(message) {
15531
+ super(message);
15532
+ this.name = "CodexAppServerAborted";
15533
+ }
15534
+ };
15535
+ var CodexAppServerError = class extends Error {
15536
+ constructor(message, code, data) {
15537
+ super(message);
15538
+ this.code = code;
15539
+ this.data = data;
15540
+ this.name = "CodexAppServerError";
15541
+ }
15542
+ };
15543
+ var CodexAppServerClient = class _CodexAppServerClient {
15544
+ constructor(child, opts) {
15545
+ this.opts = opts;
15546
+ this.pending = /* @__PURE__ */ new Map();
15547
+ this.nextId = 1;
15548
+ this.closed = false;
15549
+ this.exitReason = null;
15550
+ this.child = child;
15551
+ readLines(child.stdout, (line) => this.onLine(line));
15552
+ readLines(child.stderr, (line) => {
15553
+ if (line.trim()) opts.onStderr?.(line);
15554
+ });
15555
+ child.on("error", (err) => this.fail(err));
15556
+ for (const pipe2 of [child.stdin, child.stdout, child.stderr]) {
15557
+ pipe2.on("error", (err) => this.fail(err));
15558
+ }
15559
+ child.on("exit", (code, signal) => {
15560
+ this.fail(
15561
+ new CodexAppServerError(
15562
+ `codex app-server exited (${signal ? `signal ${signal}` : `code ${code ?? "null"}`})`
15563
+ )
15564
+ );
15565
+ });
15566
+ }
15567
+ static start(opts) {
15568
+ const bin = resolveCodexBinary();
15569
+ const env = { ...opts.env };
15570
+ applyCodexPathDirs(env, bin.pathDirs);
15571
+ const child = spawn(bin.executablePath, ["app-server"], {
15572
+ cwd: opts.cwd,
15573
+ env,
15574
+ stdio: ["pipe", "pipe", "pipe"]
15575
+ });
15576
+ return new _CodexAppServerClient(child, opts);
15577
+ }
15578
+ /**
15579
+ * Settle every in-flight request when the transport dies. Without this a
15580
+ * crashed child leaves the turn awaiting a reply that can never arrive, and
15581
+ * the run hangs rather than reporting an error.
15582
+ */
15583
+ fail(err) {
15584
+ if (this.exitReason) return;
15585
+ this.exitReason = err;
15586
+ for (const [, p] of this.pending) p.reject(err);
15587
+ this.pending.clear();
15588
+ this.opts.onClosed?.(err);
15589
+ }
15590
+ onLine(line) {
15591
+ if (!line.trim()) return;
15592
+ let msg;
15593
+ try {
15594
+ msg = JSON.parse(line);
15595
+ } catch {
15596
+ return;
15597
+ }
15598
+ const id = msg.id;
15599
+ if (typeof id === "number" && typeof msg.method === "string") {
15600
+ this.write({ id, error: { code: -32601, message: `Unhandled server request: ${msg.method}` } });
15601
+ return;
15602
+ }
15603
+ if (typeof id === "number") {
15604
+ const p = this.pending.get(id);
15605
+ if (!p) return;
15606
+ this.pending.delete(id);
15607
+ const err = msg.error;
15608
+ if (err) p.reject(new CodexAppServerError(err.message ?? "codex app-server error", err.code, err.data));
15609
+ else p.resolve(msg.result ?? {});
15610
+ return;
15611
+ }
15612
+ if (typeof msg.method === "string") {
15613
+ try {
15614
+ this.opts.onNotification({
15615
+ method: msg.method,
15616
+ params: msg.params ?? {}
15617
+ });
15618
+ } catch (cause) {
15619
+ this.fail(cause instanceof Error ? cause : new CodexAppServerError(String(cause)));
15620
+ }
15621
+ }
15622
+ }
15623
+ write(payload) {
15624
+ if (this.closed) return;
15625
+ this.child.stdin.write(`${JSON.stringify(payload)}
15626
+ `);
15627
+ }
15628
+ request(method, params) {
15629
+ if (this.exitReason) return Promise.reject(this.exitReason);
15630
+ const id = this.nextId++;
15631
+ return new Promise((resolve, reject) => {
15632
+ this.pending.set(id, { resolve, reject });
15633
+ this.write({ id, method, ...params !== void 0 ? { params } : {} });
15634
+ });
15635
+ }
15636
+ notify(method, params) {
15637
+ this.write({ method, ...params !== void 0 ? { params } : {} });
15638
+ }
15639
+ dispose(aborted2 = false) {
15640
+ if (this.closed) return;
15641
+ this.closed = true;
15642
+ this.fail(new CodexAppServerAborted(aborted2 ? "codex run aborted" : "codex app-server client disposed"));
15643
+ killTree(this.child);
15644
+ }
15645
+ };
15646
+ function readLines(stream, onLine) {
15647
+ const decoder = new StringDecoder("utf8");
15648
+ let carry = "";
15649
+ stream.on("data", (chunk) => {
15650
+ carry += decoder.write(chunk);
15651
+ let index = carry.indexOf("\n");
15652
+ while (index !== -1) {
15653
+ onLine(carry.slice(0, index).replace(/\r$/, ""));
15654
+ carry = carry.slice(index + 1);
15655
+ index = carry.indexOf("\n");
15656
+ }
15657
+ });
15658
+ stream.on("end", () => {
15659
+ carry += decoder.end();
15660
+ if (carry) onLine(carry.replace(/\r$/, ""));
15661
+ carry = "";
15662
+ });
15663
+ }
15664
+ function killTree(child) {
15665
+ if (child.pid === void 0) return;
15666
+ if (process.platform === "win32") {
15667
+ try {
15668
+ spawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], { stdio: "ignore" });
15669
+ return;
15670
+ } catch {
15671
+ }
15672
+ }
15673
+ try {
15674
+ child.kill();
15675
+ } catch {
15676
+ }
15677
+ }
15678
+
15679
+ // packages/feature/agent/src/server/engines/codexAppServer/events.ts
15680
+ var camelToSnake = (key) => key.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase();
15681
+ var OPAQUE_VALUE_KEYS = /* @__PURE__ */ new Set([
15682
+ "arguments",
15683
+ // an MCP tool's own input object
15684
+ "structuredContent",
15685
+ // an MCP tool's own result payload
15686
+ "result",
15687
+ "agentsStates",
15688
+ // keyed by agent thread id
15689
+ "input"
15690
+ ]);
15691
+ function snakeCaseKeys(value) {
15692
+ if (Array.isArray(value)) return value.map(snakeCaseKeys);
15693
+ if (value === null || typeof value !== "object") return value;
15694
+ const out = {};
15695
+ for (const [k, v] of Object.entries(value)) {
15696
+ out[camelToSnake(k)] = OPAQUE_VALUE_KEYS.has(k) ? v : snakeCaseKeys(v);
15697
+ }
15698
+ return out;
15699
+ }
15700
+ function normalizeItem(raw) {
15701
+ if (!raw || typeof raw !== "object") return void 0;
15702
+ const item = snakeCaseKeys(raw);
15703
+ if (typeof item.type === "string") item.type = camelToSnake(item.type);
15704
+ if (item.type === "collab_agent_tool_call") item.type = "collab_tool_call";
15705
+ if (item.type === "collab_tool_call" && typeof item.tool === "string") {
15706
+ item.tool = camelToSnake(item.tool);
15707
+ }
15708
+ if (item.type === "file_change" && Array.isArray(item.changes)) {
15709
+ item.changes = item.changes.map((change) => {
15710
+ const kind = change.kind;
15711
+ if (kind && typeof kind === "object" && typeof kind.type === "string") {
15712
+ return { ...change, kind: kind.type };
15713
+ }
15714
+ return change;
15715
+ });
15716
+ }
15717
+ return item;
15718
+ }
15719
+ var CodexEventShim = class {
15720
+ constructor() {
15721
+ this.threadId = null;
15722
+ this.planSeq = 0;
15723
+ /**
15724
+ * Turns in flight, by thread. Recorded for EVERY thread including the
15725
+ * sub-agents this shim otherwise filters out, because interrupting a run
15726
+ * needs their ids: a parent's `turn/interrupt` does not cascade — measured,
15727
+ * the children kept working for the twelve seconds the probe watched.
15728
+ */
15729
+ this.liveTurns = /* @__PURE__ */ new Map();
15730
+ }
15731
+ /** The turn this connection started. Its own `turn/started` arrives too, but
15732
+ * a stop must work even if it has not yet. */
15733
+ noteOwnTurn(threadId, turnId) {
15734
+ this.liveTurns.set(threadId, turnId);
15735
+ }
15736
+ /** Threads with a turn in flight, children first: a parent interrupted while
15737
+ * its children still run leaves them orphaned. */
15738
+ activeTurns() {
15739
+ const out = [];
15740
+ for (const [threadId, turnId] of this.liveTurns) {
15741
+ if (threadId !== this.threadId) out.push({ threadId, turnId });
15742
+ }
15743
+ const own = this.threadId && this.liveTurns.get(this.threadId);
15744
+ if (this.threadId && own) out.push({ threadId: this.threadId, turnId: own });
15745
+ return out;
15746
+ }
15747
+ /**
15748
+ * Name the thread this turn belongs to. Everything from any other thread is
15749
+ * dropped — see `handle`.
15750
+ */
15751
+ bindThread(threadId) {
15752
+ this.threadId = threadId;
15753
+ }
15754
+ handle(n) {
15755
+ const from = n.params.threadId;
15756
+ if (typeof from === "string") {
15757
+ if (n.method === "turn/started") {
15758
+ const turnId = n.params.turn?.id;
15759
+ if (turnId) this.liveTurns.set(from, turnId);
15760
+ } else if (n.method === "turn/completed") {
15761
+ this.liveTurns.delete(from);
15762
+ }
15763
+ }
15764
+ if (this.threadId !== null && typeof from === "string" && from !== this.threadId) return [];
15765
+ switch (n.method) {
15766
+ case "item/agentMessage/delta": {
15767
+ const text = typeof n.params.delta === "string" ? n.params.delta : "";
15768
+ return text ? [{ kind: "text-delta", text }] : [];
15769
+ }
15770
+ case "item/started":
15771
+ case "item/completed": {
15772
+ const item = normalizeItem(n.params.item);
15773
+ if (!item) return [];
15774
+ if (item.type === "user_message") return [];
15775
+ if (item.type === "agent_message") return [];
15776
+ return [
15777
+ {
15778
+ kind: "event",
15779
+ event: {
15780
+ type: n.method === "item/started" ? "item.started" : "item.completed",
15781
+ ...typeof n.params.threadId === "string" ? { thread_id: n.params.threadId } : {},
15782
+ item
15783
+ }
15784
+ }
15785
+ ];
15786
+ }
15787
+ /**
15788
+ * The plan. There is no `todoList` item type in this protocol — the
15789
+ * bubble the adapter still knows how to draw is fed by a notification
15790
+ * instead, so without this a Codex turn simply loses its todo list.
15791
+ *
15792
+ * A fresh id per update mirrors what the exec transport did (one item per
15793
+ * plan revision, one bubble each) rather than inventing an update-in-place
15794
+ * the renderer has no path for.
15795
+ */
15796
+ case "turn/plan/updated": {
15797
+ const plan = n.params.plan;
15798
+ if (!plan?.length) return [];
15799
+ this.planSeq += 1;
15800
+ const turnId = typeof n.params.turnId === "string" ? n.params.turnId : "turn";
15801
+ return [
15802
+ {
15803
+ kind: "event",
15804
+ event: {
15805
+ type: "item.completed",
15806
+ item: {
15807
+ type: "todo_list",
15808
+ id: `plan-${turnId}-${this.planSeq}`,
15809
+ // Three states, carried through: the checklist renders
15810
+ // in-progress differently from not-yet-started.
15811
+ items: plan.map((s) => ({
15812
+ text: s.step ?? "",
15813
+ status: camelToSnake(s.status ?? "pending")
15814
+ }))
15815
+ }
15816
+ }
15817
+ }
15818
+ ];
15819
+ }
15820
+ case "thread/tokenUsage/updated": {
15821
+ const usage = n.params.tokenUsage?.total;
15822
+ if (usage) {
15823
+ this.lastUsage = {
15824
+ input_tokens: usage.inputTokens ?? 0,
15825
+ output_tokens: usage.outputTokens ?? 0,
15826
+ cached_input_tokens: usage.cachedInputTokens ?? 0,
15827
+ cache_write_input_tokens: usage.cacheWriteInputTokens ?? 0
15828
+ };
15829
+ }
15830
+ return [];
15831
+ }
15832
+ /**
15833
+ * There is no `turn/failed` notification — the protocol has exactly one
15834
+ * terminal, and failure rides on it as `turn.status`. Reading only the
15835
+ * method name (as this did) reports a failed or interrupted turn as a
15836
+ * clean success: the run ends, the spinner stops, and nothing anywhere
15837
+ * says why.
15838
+ */
15839
+ case "turn/completed": {
15840
+ const turn = n.params.turn;
15841
+ const status = turn?.status;
15842
+ if (status === "failed") {
15843
+ const detail = turn?.error?.additionalDetails;
15844
+ const message = [turn?.error?.message, detail].filter(Boolean).join(" \u2014 ") || "Codex turn failed";
15845
+ return [{ kind: "event", event: { type: "turn.failed", error: { message } } }];
15846
+ }
15847
+ return [{ kind: "event", event: { type: "turn.completed", ...this.lastUsage ? { usage: this.lastUsage } : {} } }];
15848
+ }
15849
+ /**
15850
+ * `{ error: { message, additionalDetails }, willRetry }` — the message is
15851
+ * NESTED, and reading a top-level `message` (as this did) always fell
15852
+ * through to a generic string.
15853
+ *
15854
+ * `willRetry` is the load-bearing half: the server is about to try again,
15855
+ * so surfacing this as an error would both lie to the user and — because
15856
+ * the adapter latches `terminated` on an error — go deaf to the retry's
15857
+ * events, leaving the turn to hang until it is aborted by hand.
15858
+ */
15859
+ case "error": {
15860
+ if (n.params.willRetry === true) return [];
15861
+ const error48 = n.params.error;
15862
+ const message = [error48?.message, error48?.additionalDetails].filter(Boolean).join(" \u2014 ") || "Codex error";
15863
+ return [{ kind: "event", event: { type: "error", message } }];
15864
+ }
15865
+ default:
15866
+ return [];
15867
+ }
15868
+ }
15869
+ };
15870
+
15429
15871
  // packages/feature/agent/src/server/engines/codex.ts
15430
15872
  import { randomUUID as randomUUID3 } from "crypto";
15431
- import { writeFileSync as writeFileSync3, unlinkSync, mkdirSync as mkdirSync3, existsSync as existsSync2, statSync as statSync2, openSync, readSync, closeSync } from "fs";
15432
- import { StringDecoder } from "string_decoder";
15433
- import { join as join5 } from "path";
15873
+ import { writeFileSync as writeFileSync3, unlinkSync, mkdirSync as mkdirSync3, existsSync as existsSync2, statSync as statSync3, openSync, readSync, closeSync } from "fs";
15874
+ import { StringDecoder as StringDecoder2 } from "string_decoder";
15875
+ import { join as join6 } from "path";
15434
15876
  import { tmpdir as tmpdir2 } from "os";
15435
15877
 
15436
15878
  // packages/feature/agent/src/server/api/session/codexTools.ts
@@ -15445,7 +15887,9 @@ var CODEX_TOOL_NAMES = {
15445
15887
  /** `update_plan` / live `todo_list` → the checklist MessageBubble already renders. */
15446
15888
  todo: "TodoWrite",
15447
15889
  webSearch: "WebSearch",
15448
- webFetch: "WebFetch"
15890
+ webFetch: "WebFetch",
15891
+ /** `image_generation` writes a file, so it reads as a Write in the timeline. */
15892
+ imageGeneration: "Write"
15449
15893
  };
15450
15894
  var CODEX_MCP_NAMESPACE_PREFIX = "mcp__";
15451
15895
  var codexMcpToolName = (server, tool2) => `${CODEX_MCP_NAMESPACE_PREFIX}${server}__${tool2}`;
@@ -15453,12 +15897,10 @@ var CODEX_SPAWN_FN_NAME = "spawn_agent";
15453
15897
  var CODEX_SUB_AGENT_ACTIVITY_TYPE = "sub_agent_activity";
15454
15898
  var CODEX_SUB_AGENT_ACTIVITY_ITEM_TYPE = "SubAgentActivity";
15455
15899
  var CODEX_AGENT_MESSAGE_TYPE = "agent_message";
15456
- var CODEX_PATCH_FN_NAME = "apply_patch";
15457
- var CODEX_EXEC_SCRIPT_FN_NAME = "exec";
15458
15900
  function codexTodoInput(items) {
15459
15901
  return {
15460
15902
  todos: (items ?? []).flatMap(
15461
- (i) => typeof i?.text === "string" ? [{ content: i.text, status: i.completed ? "completed" : "pending" }] : []
15903
+ (i) => typeof i?.text === "string" ? [{ content: i.text, status: i.status || (i.completed ? "completed" : "pending") }] : []
15462
15904
  )
15463
15905
  };
15464
15906
  }
@@ -15475,196 +15917,32 @@ function codexWebSearchCall(query2, action) {
15475
15917
  return {
15476
15918
  name: CODEX_TOOL_NAMES.webSearch,
15477
15919
  input: { query: q },
15478
- // codex reports the queries it ran but never the hits; showing the queries beats
15479
- // an empty result, which would leave the bubble looking unfinished.
15920
+ /**
15921
+ * The queries, not the hits deliberately.
15922
+ *
15923
+ * A web_search item does carry `results`, but the protocol types it as
15924
+ * `Array<Unknown>` and says why: "These stay as opaque JSON at the
15925
+ * extension/app-server boundary so new result fields and result types can
15926
+ * pass through without a Codex release." Rendering it would mean inventing
15927
+ * a shape upstream has explicitly refused to fix, and finding out it moved
15928
+ * the way every other spelling mismatch here has been found — by a bubble
15929
+ * silently going blank.
15930
+ *
15931
+ * Showing the queries beats an empty result, which reads as unfinished.
15932
+ */
15480
15933
  result: queries.join("\n")
15481
15934
  };
15482
15935
  }
15483
15936
  function codexMcpResultText(item) {
15484
15937
  if (item.error?.message) return item.error.message;
15485
15938
  if (item.result === null || item.result === void 0) return "";
15486
- return typeof item.result === "string" ? item.result : JSON.stringify(item.result, null, 2);
15487
- }
15488
- var JS_STRING_LITERAL_RE = /"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\])*`/g;
15489
- var JS_SIMPLE_ESCAPES = {
15490
- n: "\n",
15491
- r: "\r",
15492
- t: " ",
15493
- b: "\b",
15494
- f: "\f",
15495
- v: "\v",
15496
- "0": "\0"
15497
- };
15498
- function decodeJsStringLiteral(literal2) {
15499
- if (literal2.startsWith('"')) {
15500
- try {
15501
- return JSON.parse(literal2);
15502
- } catch {
15503
- }
15939
+ if (typeof item.result === "string") return item.result;
15940
+ const content = item.result.content;
15941
+ if (Array.isArray(content)) {
15942
+ const text = content.filter((b) => !!b && typeof b === "object").filter((b) => typeof b.text === "string").map((b) => b.text).join("");
15943
+ if (text) return text;
15504
15944
  }
15505
- return literal2.slice(1, -1).replace(
15506
- /\\(u\{[0-9a-fA-F]+\}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{2}|[\s\S])/g,
15507
- (_full, esc2) => {
15508
- if (esc2.startsWith("u{")) return String.fromCodePoint(parseInt(esc2.slice(2, -1), 16));
15509
- if (esc2.startsWith("u") || esc2.startsWith("x")) return String.fromCharCode(parseInt(esc2.slice(1), 16));
15510
- return JS_SIMPLE_ESCAPES[esc2] ?? esc2;
15511
- }
15512
- );
15513
- }
15514
- function extractPatchLiteral(script) {
15515
- JS_STRING_LITERAL_RE.lastIndex = 0;
15516
- let m;
15517
- while (m = JS_STRING_LITERAL_RE.exec(script)) {
15518
- const value = decodeJsStringLiteral(m[0]);
15519
- if (value.includes("*** Begin Patch")) return value;
15520
- }
15521
- return null;
15522
- }
15523
- var JS_IDENT_RE = /^[A-Za-z_$][A-Za-z0-9_$]*/;
15524
- var JS_SCALAR_RE = /^(-?\d[\d_]*(?:\.\d*)?(?:[eE][+-]?\d+)?|true|false|null|undefined)/;
15525
- var skipJsWs = (c) => {
15526
- while (c.i < c.s.length && /\s/.test(c.s[c.i])) c.i++;
15527
- };
15528
- function readJsString(c) {
15529
- const q = c.s[c.i];
15530
- if (q !== '"' && q !== "'" && q !== "`") return null;
15531
- const start = c.i;
15532
- c.i++;
15533
- while (c.i < c.s.length) {
15534
- const ch = c.s[c.i];
15535
- if (ch === "\\") {
15536
- c.i += 2;
15537
- continue;
15538
- }
15539
- if (ch === q) {
15540
- c.i++;
15541
- return decodeJsStringLiteral(c.s.slice(start, c.i));
15542
- }
15543
- c.i++;
15544
- }
15545
- return null;
15546
- }
15547
- function readJsValue(c) {
15548
- skipJsWs(c);
15549
- const ch = c.s[c.i];
15550
- if (ch === void 0) return null;
15551
- if (ch === '"' || ch === "'" || ch === "`") {
15552
- const str = readJsString(c);
15553
- return str === null ? null : { v: str };
15554
- }
15555
- if (ch === "{") return readJsObject(c);
15556
- if (ch === "[") return readJsArray(c);
15557
- const m = JS_SCALAR_RE.exec(c.s.slice(c.i));
15558
- if (!m) return null;
15559
- c.i += m[0].length;
15560
- const raw = m[0];
15561
- if (raw === "true") return { v: true };
15562
- if (raw === "false") return { v: false };
15563
- if (raw === "null" || raw === "undefined") return { v: null };
15564
- const n = Number(raw.replace(/_/g, ""));
15565
- return Number.isNaN(n) ? null : { v: n };
15566
- }
15567
- function readJsArray(c) {
15568
- if (c.s[c.i] !== "[") return null;
15569
- c.i++;
15570
- const out = [];
15571
- for (; ; ) {
15572
- skipJsWs(c);
15573
- if (c.s[c.i] === "]") {
15574
- c.i++;
15575
- return { v: out };
15576
- }
15577
- if (c.i >= c.s.length) return null;
15578
- const item = readJsValue(c);
15579
- if (!item) return null;
15580
- out.push(item.v);
15581
- skipJsWs(c);
15582
- if (c.s[c.i] === ",") {
15583
- c.i++;
15584
- continue;
15585
- }
15586
- if (c.s[c.i] === "]") {
15587
- c.i++;
15588
- return { v: out };
15589
- }
15590
- return null;
15591
- }
15592
- }
15593
- function readJsObject(c) {
15594
- if (c.s[c.i] !== "{") return null;
15595
- c.i++;
15596
- const out = {};
15597
- for (; ; ) {
15598
- skipJsWs(c);
15599
- if (c.s[c.i] === "}") {
15600
- c.i++;
15601
- return { v: out };
15602
- }
15603
- if (c.i >= c.s.length) return null;
15604
- let key = null;
15605
- const ch = c.s[c.i];
15606
- if (ch === '"' || ch === "'" || ch === "`") {
15607
- key = readJsString(c);
15608
- } else {
15609
- const m = JS_IDENT_RE.exec(c.s.slice(c.i));
15610
- if (m) {
15611
- key = m[0];
15612
- c.i += m[0].length;
15613
- }
15614
- }
15615
- if (key === null) return null;
15616
- skipJsWs(c);
15617
- if (c.s[c.i] !== ":") return null;
15618
- c.i++;
15619
- const val = readJsValue(c);
15620
- if (!val) return null;
15621
- out[key] = val.v;
15622
- skipJsWs(c);
15623
- if (c.s[c.i] === ",") {
15624
- c.i++;
15625
- continue;
15626
- }
15627
- if (c.s[c.i] === "}") {
15628
- c.i++;
15629
- return { v: out };
15630
- }
15631
- return null;
15632
- }
15633
- }
15634
- function readToolArgsAt(script, from) {
15635
- const open = script.indexOf("{", from);
15636
- if (open === -1) return null;
15637
- const read = readJsObject({ s: script, i: open });
15638
- if (!read || !read.v || typeof read.v !== "object") return null;
15639
- return read.v;
15640
- }
15641
- function extractExecArgs(script) {
15642
- const call = script.indexOf("tools.exec_command(");
15643
- if (call === -1) return null;
15644
- return readToolArgsAt(script, call);
15645
- }
15646
- var TOOL_CALL_RE = /tools\.([A-Za-z_$][A-Za-z0-9_$]*)\s*\(/g;
15647
- function extractOtherToolCall(script) {
15648
- TOOL_CALL_RE.lastIndex = 0;
15649
- let m;
15650
- while (m = TOOL_CALL_RE.exec(script)) {
15651
- const tool2 = m[1];
15652
- if (tool2 === "exec_command" || tool2 === "apply_patch") continue;
15653
- const args = readToolArgsAt(script, m.index);
15654
- if (args) return { tool: tool2, args };
15655
- }
15656
- return null;
15657
- }
15658
- function parseCodexExecScript(script) {
15659
- const patch = extractPatchLiteral(script);
15660
- if (patch) return { kind: "patch", patch };
15661
- const args = extractExecArgs(script);
15662
- if (args) {
15663
- return { kind: "exec", command: typeof args.cmd === "string" ? args.cmd : "", args };
15664
- }
15665
- const other = extractOtherToolCall(script);
15666
- if (other) return { kind: "other", tool: other.tool, args: other.args };
15667
- return { kind: "unknown" };
15945
+ return JSON.stringify(item.result, null, 2);
15668
15946
  }
15669
15947
  var CODEX_AGENT_DONE = /* @__PURE__ */ new Set(["completed", "errored", "interrupted", "not_found", "failed"]);
15670
15948
  function parseCodexSpawnInput(args, extra) {
@@ -15755,6 +16033,110 @@ function parseCodexAgentsStates(states) {
15755
16033
  function codexAgentResultText(state) {
15756
16034
  return state.message || `(agent ${state.status})`;
15757
16035
  }
16036
+ function codexItemToolUseId(item) {
16037
+ return item.call_id || item.id || "";
16038
+ }
16039
+ function codexItemKind(type) {
16040
+ if (!type) return "";
16041
+ return type.replace(/^([A-Z])/, (c) => c.toLowerCase()).replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase();
16042
+ }
16043
+ function codexCommandText(command) {
16044
+ if (typeof command === "string") return command;
16045
+ if (!Array.isArray(command)) return "";
16046
+ return command.map((a) => {
16047
+ const arg = String(a);
16048
+ return /[\s"'$`\\|&;<>()]/.test(arg) ? `'${arg.replace(/'/g, `'\\''`)}'` : arg;
16049
+ }).join(" ");
16050
+ }
16051
+ var patchChanges = (item) => {
16052
+ const raw = item.changes;
16053
+ if (!raw) return [];
16054
+ const kindOf = (v) => {
16055
+ if (typeof v === "string") return v;
16056
+ const o = v;
16057
+ const tag = (o?.kind && typeof o.kind === "object" ? o.kind.type : o?.kind) ?? o?.type;
16058
+ return typeof tag === "string" ? tag : "update";
16059
+ };
16060
+ if (Array.isArray(raw)) {
16061
+ return raw.map((c) => ({ path: c?.path || "", kind: kindOf(c) }));
16062
+ }
16063
+ return Object.entries(raw).map(([path, v]) => ({ path, kind: kindOf(v) }));
16064
+ };
16065
+ var patchResultText = (item) => {
16066
+ const cs = patchChanges(item);
16067
+ if (cs.length === 0) return "apply_patch";
16068
+ return cs.map((c) => `${c.kind} ${c.path}`.trim()).join("\n");
16069
+ };
16070
+ function codexItemBubble(item) {
16071
+ const id = codexItemToolUseId(item);
16072
+ if (!id) return null;
16073
+ switch (codexItemKind(item.type)) {
16074
+ case "command_execution":
16075
+ return {
16076
+ id,
16077
+ name: CODEX_TOOL_NAMES.bash,
16078
+ input: { command: codexCommandText(item.command) },
16079
+ // An empty result spins forever in the UI, so a bare exit code stands
16080
+ // in for a command that printed nothing.
16081
+ result: item.aggregated_output || `(exit code: ${item.exit_code ?? "unknown"})`
16082
+ };
16083
+ case "file_change":
16084
+ return {
16085
+ id,
16086
+ name: CODEX_TOOL_NAMES.applyPatch,
16087
+ input: { changes: patchChanges(item) },
16088
+ result: patchResultText(item)
16089
+ };
16090
+ case "mcp_tool_call":
16091
+ return {
16092
+ id,
16093
+ name: codexMcpToolName(item.server || "mcp", item.tool || "tool"),
16094
+ input: item.arguments || {},
16095
+ result: codexMcpResultText(item) || `(${item.status || "completed"})`
16096
+ };
16097
+ case "web_search": {
16098
+ const { name, input, result } = codexWebSearchCall(item.query, item.action);
16099
+ return { id, name, input, result };
16100
+ }
16101
+ case "todo_list": {
16102
+ const input = codexTodoInput(item.items);
16103
+ return { id, name: CODEX_TOOL_NAMES.todo, input, result: codexTodoResultText(input.todos) };
16104
+ }
16105
+ // Reading an image back. The result is deliberately the placeholder and not
16106
+ // the image: inlining a screenshot's data URL used to push ~600KB of base64
16107
+ // through the API, React state and the DOM for one bubble.
16108
+ case "image_view":
16109
+ return {
16110
+ id,
16111
+ name: CODEX_TOOL_NAMES.read,
16112
+ input: { file_path: item.path || "" },
16113
+ result: CODEX_IMAGE_ONLY_TEXT
16114
+ };
16115
+ /**
16116
+ * Generating an image. It writes a file, so it belongs in the timeline like
16117
+ * any other write — it was grouped with `sleep` and the review-mode markers
16118
+ * by mistake, which left a generated image invisible on both sides.
16119
+ */
16120
+ case "image_generation":
16121
+ return {
16122
+ id,
16123
+ name: CODEX_TOOL_NAMES.imageGeneration,
16124
+ input: { file_path: item.savedPath || "", ...item.revisedPrompt ? { prompt: item.revisedPrompt } : {} },
16125
+ result: item.savedPath || `(${item.status || "completed"})`
16126
+ };
16127
+ // A tool reached through codex's dynamic namespace rather than a fixed one.
16128
+ // Named like an MCP call because that is what it is from the reader's side.
16129
+ case "dynamic_tool_call":
16130
+ return {
16131
+ id,
16132
+ name: codexMcpToolName(item.namespace || "tool", item.tool || "call"),
16133
+ input: item.arguments || {},
16134
+ result: codexMcpResultText(item) || `(${item.status || "completed"})`
16135
+ };
16136
+ default:
16137
+ return null;
16138
+ }
16139
+ }
15758
16140
 
15759
16141
  // packages/feature/agent/src/server/engines/codex.ts
15760
16142
  var MEDIA_EXT = {
@@ -15764,11 +16146,11 @@ var MEDIA_EXT = {
15764
16146
  "image/gif": ".gif"
15765
16147
  };
15766
16148
  function writeImagesToTemp(images) {
15767
- const dir = join5(tmpdir2(), "cockpit-codex-images");
16149
+ const dir = join6(tmpdir2(), "cockpit-codex-images");
15768
16150
  if (!existsSync2(dir)) mkdirSync3(dir, { recursive: true });
15769
16151
  return images.map((img, i) => {
15770
16152
  const ext = MEDIA_EXT[img.media_type] || ".png";
15771
- const filePath = join5(dir, `img-${Date.now()}-${i}${ext}`);
16153
+ const filePath = join6(dir, `img-${Date.now()}-${i}${ext}`);
15772
16154
  writeFileSync3(filePath, Buffer.from(img.data, "base64"));
15773
16155
  return filePath;
15774
16156
  });
@@ -15776,15 +16158,7 @@ function writeImagesToTemp(images) {
15776
16158
  function codexToolUseId(item) {
15777
16159
  return item.call_id || item.id || `tool-${randomUUID3()}`;
15778
16160
  }
15779
- var CODEX_EXEC_FN_NAMES = /* @__PURE__ */ new Set(["exec_command", "shell_command", "local_shell"]);
15780
- function parsePatchFiles(input) {
15781
- const files = [];
15782
- const re = /^\*\*\* (?:Add|Update|Delete) File: (.+)$/gm;
15783
- let m;
15784
- while (m = re.exec(input)) files.push(m[1].trim());
15785
- return files;
15786
- }
15787
- function parseCallLines(text, exec2, patch, spawns, mcps, reports) {
16161
+ function parseCallLines(text, spawns, reports) {
15788
16162
  for (const line of text.split("\n")) {
15789
16163
  if (!line.trim()) continue;
15790
16164
  let entry;
@@ -15795,26 +16169,7 @@ function parseCallLines(text, exec2, patch, spawns, mcps, reports) {
15795
16169
  }
15796
16170
  const p = entry.payload;
15797
16171
  if (!p) continue;
15798
- if (p.type === "function_call" && p.name && CODEX_EXEC_FN_NAMES.has(p.name)) {
15799
- let cmd = "";
15800
- try {
15801
- cmd = String(JSON.parse(p.arguments || "{}").cmd || "");
15802
- } catch {
15803
- }
15804
- exec2.push({ callId: p.call_id, cmd });
15805
- } else if (p.type === "custom_tool_call" && p.name === CODEX_PATCH_FN_NAME) {
15806
- patch.push({ callId: p.call_id, files: parsePatchFiles(p.input || "") });
15807
- } else if (p.type === "custom_tool_call" && p.name === CODEX_EXEC_SCRIPT_FN_NAME) {
15808
- const script = parseCodexExecScript(p.input || "");
15809
- if (script.kind === "exec") exec2.push({ callId: p.call_id, cmd: script.command });
15810
- else if (script.kind === "patch") patch.push({ callId: p.call_id, files: parsePatchFiles(script.patch) });
15811
- } else if (p.type === "function_call" && p.name && p.namespace?.startsWith(CODEX_MCP_NAMESPACE_PREFIX)) {
15812
- mcps.push({
15813
- callId: p.call_id,
15814
- server: p.namespace.slice(CODEX_MCP_NAMESPACE_PREFIX.length),
15815
- tool: p.name
15816
- });
15817
- } else if (p.type === "function_call" && p.name === CODEX_SPAWN_FN_NAME) {
16172
+ if (p.type === "function_call" && p.name === CODEX_SPAWN_FN_NAME) {
15818
16173
  let args = {};
15819
16174
  try {
15820
16175
  args = JSON.parse(p.arguments || "{}");
@@ -15849,29 +16204,23 @@ function createRolloutCallReader() {
15849
16204
  let boundPath = null;
15850
16205
  let offset = 0;
15851
16206
  let carry = "";
15852
- let decoder = new StringDecoder("utf8");
15853
- const exec2 = [];
15854
- const patch = [];
16207
+ let decoder = new StringDecoder2("utf8");
15855
16208
  const spawns = [];
15856
- const mcps = [];
15857
16209
  const reports = [];
15858
- const snapshot = () => ({ exec: exec2, patch, spawn: spawns, mcp: mcps, reports });
16210
+ const snapshot = () => ({ spawn: spawns, reports });
15859
16211
  const reset = (p) => {
15860
16212
  boundPath = p;
15861
16213
  offset = 0;
15862
16214
  carry = "";
15863
- decoder = new StringDecoder("utf8");
15864
- exec2.length = 0;
15865
- patch.length = 0;
16215
+ decoder = new StringDecoder2("utf8");
15866
16216
  spawns.length = 0;
15867
- mcps.length = 0;
15868
16217
  reports.length = 0;
15869
16218
  };
15870
16219
  return (rolloutPath) => {
15871
16220
  if (rolloutPath !== boundPath) reset(rolloutPath);
15872
16221
  let size = 0;
15873
16222
  try {
15874
- size = statSync2(rolloutPath).size;
16223
+ size = statSync3(rolloutPath).size;
15875
16224
  } catch {
15876
16225
  return snapshot();
15877
16226
  }
@@ -15899,38 +16248,10 @@ function createRolloutCallReader() {
15899
16248
  return snapshot();
15900
16249
  }
15901
16250
  carry = data.slice(lastNl + 1);
15902
- parseCallLines(data.slice(0, lastNl), exec2, patch, spawns, mcps, reports);
16251
+ parseCallLines(data.slice(0, lastNl), spawns, reports);
15903
16252
  return snapshot();
15904
16253
  };
15905
16254
  }
15906
- var basename = (p) => p.replace(/[/\\]+$/, "").split(/[/\\]/).pop() || p;
15907
- function unwrapShellCommand(command) {
15908
- const m = command.match(/^\/bin\/\S+ -lc (['"])([\s\S]*)\1\s*$/);
15909
- return m ? m[2] : command;
15910
- }
15911
- function normalizeCmd(s) {
15912
- return s.replace(/\s+/g, " ").trim();
15913
- }
15914
- var SHELL_WRAPPER_SLACK = 32;
15915
- function resolveCodexCallId(execCalls, index, liveCommand) {
15916
- const target = execCalls[index];
15917
- if (!target?.callId) return null;
15918
- const persisted = normalizeCmd(target.cmd);
15919
- const live = normalizeCmd(unwrapShellCommand(liveCommand || ""));
15920
- const liveRaw = normalizeCmd(liveCommand || "");
15921
- if (!live || live === persisted || persisted.startsWith(live) || live.startsWith(persisted) || !!persisted && liveRaw.includes(persisted) && liveRaw.length - persisted.length <= SHELL_WRAPPER_SLACK) {
15922
- return target.callId;
15923
- }
15924
- return null;
15925
- }
15926
- function resolveCodexPatchCallId(patchCalls, index, changePaths) {
15927
- const target = patchCalls[index];
15928
- if (!target?.callId) return null;
15929
- if (target.files.length === 0 || changePaths.length === 0) return target.callId;
15930
- const wanted = new Set(target.files.map(basename));
15931
- if (changePaths.some((p) => wanted.has(basename(p)))) return target.callId;
15932
- return null;
15933
- }
15934
16255
  function resolveCodexSpawnCall(spawnCalls, index, agentId) {
15935
16256
  if (agentId) {
15936
16257
  const exact = spawnCalls.find((s) => s.agentId === agentId);
@@ -15939,12 +16260,6 @@ function resolveCodexSpawnCall(spawnCalls, index, agentId) {
15939
16260
  const byOrder = spawnCalls[index];
15940
16261
  return byOrder?.callId ? byOrder : null;
15941
16262
  }
15942
- function resolveCodexMcpCallId(mcpCalls, index, server, tool2) {
15943
- const target = mcpCalls[index];
15944
- if (!target?.callId) return null;
15945
- if (server && tool2 && (target.server !== server || target.tool !== tool2)) return null;
15946
- return target.callId;
15947
- }
15948
16263
  function createCodexEventAdapter(ctx) {
15949
16264
  const { sessionId } = ctx;
15950
16265
  let terminated = false;
@@ -15953,30 +16268,17 @@ function createCodexEventAdapter(ctx) {
15953
16268
  const pendingToolCalls = /* @__PURE__ */ new Map();
15954
16269
  const progressItems = /* @__PURE__ */ new Set();
15955
16270
  let rolloutPath = null;
15956
- let execBase = 0;
15957
- let patchBase = 0;
15958
- let execSeen = 0;
15959
- let patchSeen = 0;
15960
16271
  let spawnBase = 0;
15961
16272
  let spawnSeen = 0;
15962
- let mcpBase = 0;
15963
- let mcpSeen = 0;
15964
16273
  let reportBase = 0;
15965
16274
  const agentToolUseIds = /* @__PURE__ */ new Map();
15966
- let codexThreadId = sessionId || null;
15967
- let rolloutLookups = 0;
15968
- const MAX_ROLLOUT_LOOKUPS = 8;
15969
- const resolvedToolUseIds = /* @__PURE__ */ new Map();
15970
16275
  const readRollout = createRolloutCallReader();
15971
16276
  let basesReady = false;
15972
16277
  const initBases = () => {
15973
16278
  if (basesReady || !rolloutPath) return;
15974
16279
  basesReady = true;
15975
16280
  const c = readRollout(rolloutPath);
15976
- execBase = c.exec.length;
15977
- patchBase = c.patch.length;
15978
16281
  spawnBase = c.spawn.length;
15979
- mcpBase = c.mcp.length;
15980
16282
  reportBase = c.reports.length;
15981
16283
  };
15982
16284
  if (sessionId) {
@@ -15987,53 +16289,13 @@ function createCodexEventAdapter(ctx) {
15987
16289
  rolloutPath = null;
15988
16290
  }
15989
16291
  }
15990
- const ensureRolloutPath = () => {
15991
- if (rolloutPath || !codexThreadId || rolloutLookups >= MAX_ROLLOUT_LOOKUPS) return rolloutPath;
15992
- rolloutLookups += 1;
15993
- try {
15994
- rolloutPath = findCodexSessionPath(codexThreadId);
15995
- } catch {
15996
- rolloutPath = null;
15997
- }
15998
- return rolloutPath;
15999
- };
16000
- const resolveExecToolUseId = (item) => {
16001
- const key = item.id || item.call_id || `codex-${randomUUID3()}`;
16002
- const cached2 = resolvedToolUseIds.get(key);
16003
- if (cached2) return cached2;
16004
- let toolUseId = codexToolUseId(item);
16005
- const path = ensureRolloutPath();
16006
- if (!item.call_id && path) {
16007
- const callId = resolveCodexCallId(readRollout(path).exec, execBase + execSeen, item.command || "");
16008
- if (callId) toolUseId = callId;
16009
- }
16010
- resolvedToolUseIds.set(key, toolUseId);
16011
- execSeen += 1;
16012
- return toolUseId;
16013
- };
16014
- const resolvePatchToolUseId = (item) => {
16015
- const key = item.id || item.call_id || `codex-${randomUUID3()}`;
16016
- const cached2 = resolvedToolUseIds.get(key);
16017
- if (cached2) return cached2;
16018
- let toolUseId = codexToolUseId(item);
16019
- const path = ensureRolloutPath();
16020
- if (!item.call_id && path) {
16021
- const paths = (item.changes || []).map((c) => c.path || "").filter(Boolean);
16022
- const callId = resolveCodexPatchCallId(readRollout(path).patch, patchBase + patchSeen, paths);
16023
- if (callId) toolUseId = callId;
16024
- }
16025
- resolvedToolUseIds.set(key, toolUseId);
16026
- patchSeen += 1;
16027
- return toolUseId;
16028
- };
16029
- const patchInput = (item) => ({
16030
- changes: (item.changes || []).map((c) => ({ path: c.path || "", kind: c.kind || "update" }))
16031
- });
16032
- const patchResultText = (item) => {
16033
- const cs = item.changes || [];
16034
- if (cs.length === 0) return "apply_patch";
16035
- return cs.map((c) => `${c.kind || "update"} ${c.path || ""}`.trim()).join("\n");
16292
+ const bindRollout = (path) => {
16293
+ if (!path || path === rolloutPath) return;
16294
+ rolloutPath = path;
16295
+ basesReady = false;
16296
+ initBases();
16036
16297
  };
16298
+ const toolUseIdFor = codexToolUseId;
16037
16299
  const spawnEmitted = /* @__PURE__ */ new Set();
16038
16300
  const agentPathToolUseIds = /* @__PURE__ */ new Map();
16039
16301
  const emitSpawnBubble = (toolUseId, input, agentPath) => {
@@ -16047,10 +16309,10 @@ function createCodexEventAdapter(ctx) {
16047
16309
  };
16048
16310
  const emitSpawn = (item) => {
16049
16311
  const agentIds = item.receiver_thread_ids ?? [];
16050
- const path = ensureRolloutPath();
16312
+ const path = rolloutPath;
16051
16313
  const entry = path ? resolveCodexSpawnCall(readRollout(path).spawn, spawnBase + spawnSeen, agentIds[0]) : null;
16052
16314
  spawnSeen += 1;
16053
- const toolUseId = entry?.callId || codexToolUseId(item);
16315
+ const toolUseId = toolUseIdFor(item);
16054
16316
  if (spawnEmitted.has(toolUseId)) return;
16055
16317
  const args = entry?.args && Object.keys(entry.args).length > 0 ? entry.args : { message: item.prompt || "" };
16056
16318
  const input = parseCodexSpawnInput(args, {
@@ -16061,11 +16323,11 @@ function createCodexEventAdapter(ctx) {
16061
16323
  emitSpawnBubble(toolUseId, input, entry?.agentPath);
16062
16324
  };
16063
16325
  const syncSubAgents = (flushPending = false) => {
16064
- const path = ensureRolloutPath();
16326
+ const path = rolloutPath;
16065
16327
  if (!path) return;
16066
- const { spawn, reports } = readRollout(path);
16067
- for (let i = spawnBase; i < spawn.length; i += 1) {
16068
- const s = spawn[i];
16328
+ const { spawn: spawn2, reports } = readRollout(path);
16329
+ for (let i = spawnBase; i < spawn2.length; i += 1) {
16330
+ const s = spawn2[i];
16069
16331
  if (!s.callId || spawnEmitted.has(s.callId)) continue;
16070
16332
  if (!s.agentId && !flushPending) continue;
16071
16333
  emitSpawnBubble(
@@ -16096,58 +16358,6 @@ function createCodexEventAdapter(ctx) {
16096
16358
  agentToolUseIds.delete(state.agentId);
16097
16359
  }
16098
16360
  };
16099
- const resolveMcpToolUseId = (item) => {
16100
- const key = item.id || `codex-${randomUUID3()}`;
16101
- const cached2 = resolvedToolUseIds.get(key);
16102
- if (cached2) return cached2;
16103
- let toolUseId = codexToolUseId(item);
16104
- const path = ensureRolloutPath();
16105
- if (!item.call_id && path) {
16106
- const callId = resolveCodexMcpCallId(readRollout(path).mcp, mcpBase + mcpSeen, item.server, item.tool);
16107
- if (callId) toolUseId = callId;
16108
- }
16109
- resolvedToolUseIds.set(key, toolUseId);
16110
- mcpSeen += 1;
16111
- return toolUseId;
16112
- };
16113
- const emitMcpCall = (item, done) => {
16114
- const toolUseId = resolveMcpToolUseId(item);
16115
- const name = codexMcpToolName(item.server || "mcp", item.tool || "tool");
16116
- if (!pendingToolCalls.has(toolUseId)) {
16117
- pendingToolCalls.set(toolUseId, toolUseId);
16118
- ctx.emit({
16119
- type: "assistant",
16120
- message: { content: [{ type: "tool_use", id: toolUseId, name, input: item.arguments || {} }] }
16121
- });
16122
- }
16123
- if (!done) return;
16124
- ctx.emit({
16125
- type: "user",
16126
- message: { content: [{ tool_use_id: toolUseId, content: codexMcpResultText(item) || `(${item.status || "completed"})` }] }
16127
- });
16128
- pendingToolCalls.delete(toolUseId);
16129
- };
16130
- const emitWebSearch = (item) => {
16131
- const toolUseId = codexToolUseId(item);
16132
- const { name, input, result } = codexWebSearchCall(item.query, item.action);
16133
- ctx.emit({
16134
- type: "assistant",
16135
- message: { content: [{ type: "tool_use", id: toolUseId, name, input }] }
16136
- });
16137
- ctx.emit({ type: "user", message: { content: [{ tool_use_id: toolUseId, content: result }] } });
16138
- };
16139
- const emitTodoList = (item) => {
16140
- const toolUseId = codexToolUseId(item);
16141
- const input = codexTodoInput(item.items);
16142
- ctx.emit({
16143
- type: "assistant",
16144
- message: { content: [{ type: "tool_use", id: toolUseId, name: CODEX_TOOL_NAMES.todo, input }] }
16145
- });
16146
- ctx.emit({
16147
- type: "user",
16148
- message: { content: [{ tool_use_id: toolUseId, content: codexTodoResultText(input.todos) }] }
16149
- });
16150
- };
16151
16361
  const handleCollabItem = (item) => {
16152
16362
  if (item.tool === CODEX_SPAWN_FN_NAME) {
16153
16363
  emitSpawn(item);
@@ -16169,24 +16379,13 @@ function createCodexEventAdapter(ctx) {
16169
16379
  switch (event.type) {
16170
16380
  case "thread.started": {
16171
16381
  const threadId = event.thread_id || `codex-${randomUUID3()}`;
16172
- if (event.thread_id) codexThreadId = event.thread_id;
16173
16382
  ctx.rekey(threadId);
16174
16383
  ctx.emit({ type: "system", subtype: "init", session_id: threadId });
16175
- ensureRolloutPath();
16176
- if (sessionId) initBases();
16177
16384
  break;
16178
16385
  }
16179
16386
  case "item.completed": {
16180
16387
  const item = event.item;
16181
16388
  if (!item) break;
16182
- if (item.type === "agent_message" && item.text) {
16183
- emitOutputProgress(item.text);
16184
- ctx.emit({ type: "assistant", message: { content: [{ type: "text", text: item.text }] } });
16185
- }
16186
- if (item.type === "error" && (item.message || item.text)) {
16187
- emitOutputProgress(item.message || item.text || "");
16188
- ctx.emit({ type: "error", error: item.message || item.text });
16189
- }
16190
16389
  if (item.type === "reasoning" && item.text) {
16191
16390
  emitOutputProgress(item.text);
16192
16391
  ctx.emit({
@@ -16198,73 +16397,37 @@ ${item.text}
16198
16397
  </details>` }] }
16199
16398
  });
16200
16399
  }
16201
- if (item.type === "command_execution") {
16202
- const toolUseId = resolveExecToolUseId(item);
16203
- if (!pendingToolCalls.has(toolUseId)) {
16204
- emitOutputProgress(item.command || CODEX_TOOL_NAMES.bash, `command-start:${toolUseId}`);
16400
+ const bubble = codexItemBubble(item);
16401
+ if (bubble) {
16402
+ if (!pendingToolCalls.has(bubble.id)) {
16403
+ emitOutputProgress(bubble.input.command || bubble.name, `tool-start:${bubble.id}`);
16205
16404
  ctx.emit({
16206
16405
  type: "assistant",
16207
- message: { content: [{ type: "tool_use", id: toolUseId, name: CODEX_TOOL_NAMES.bash, input: { command: item.command || "" } }] }
16406
+ message: { content: [{ type: "tool_use", id: bubble.id, name: bubble.name, input: bubble.input }] }
16208
16407
  });
16209
16408
  }
16210
- emitOutputProgress(item.aggregated_output || `(exit code: ${item.exit_code ?? "unknown"})`, `command-result:${toolUseId}`);
16409
+ emitOutputProgress(bubble.result, `tool-result:${bubble.id}`);
16211
16410
  ctx.emit({
16212
16411
  type: "user",
16213
- message: { content: [{ tool_use_id: toolUseId, content: item.aggregated_output || `(exit code: ${item.exit_code ?? "unknown"})` }] }
16412
+ message: { content: [{ tool_use_id: bubble.id, content: bubble.result }] }
16214
16413
  });
16215
- pendingToolCalls.delete(toolUseId);
16414
+ pendingToolCalls.delete(bubble.id);
16216
16415
  }
16217
16416
  if (item.type === "collab_tool_call") handleCollabItem(item);
16218
- if (item.type === "mcp_tool_call") {
16219
- emitOutputProgress(`${item.server || "mcp"} ${item.tool || ""} ${JSON.stringify(item.result ?? item.error ?? "")}`);
16220
- emitMcpCall(item, true);
16221
- }
16222
- if (item.type === "web_search") {
16223
- emitOutputProgress(JSON.stringify(item.action || item.query || "web_search"));
16224
- emitWebSearch(item);
16225
- }
16226
- if (item.type === "todo_list") {
16227
- emitOutputProgress(JSON.stringify(item.items || []));
16228
- emitTodoList(item);
16229
- }
16230
- if (item.type === "file_change") {
16231
- const toolUseId = resolvePatchToolUseId(item);
16232
- if (!pendingToolCalls.has(toolUseId)) {
16233
- emitOutputProgress(patchResultText(item), `patch-start:${toolUseId}`);
16234
- ctx.emit({
16235
- type: "assistant",
16236
- message: { content: [{ type: "tool_use", id: toolUseId, name: CODEX_TOOL_NAMES.applyPatch, input: patchInput(item) }] }
16237
- });
16238
- }
16239
- emitOutputProgress(patchResultText(item), `patch-result:${toolUseId}`);
16240
- ctx.emit({
16241
- type: "user",
16242
- message: { content: [{ tool_use_id: toolUseId, content: patchResultText(item) }] }
16243
- });
16244
- pendingToolCalls.delete(toolUseId);
16245
- }
16246
16417
  break;
16247
16418
  }
16248
16419
  case "item.started": {
16249
16420
  const item = event.item;
16250
- if (item?.type === "mcp_tool_call") emitMcpCall(item, false);
16251
- if (item?.type === "command_execution" && item.command) {
16252
- const toolUseId = resolveExecToolUseId(item);
16253
- pendingToolCalls.set(toolUseId, toolUseId);
16254
- emitOutputProgress(item.command, `command-start:${toolUseId}`);
16255
- ctx.emit({
16256
- type: "assistant",
16257
- message: { content: [{ type: "tool_use", id: toolUseId, name: CODEX_TOOL_NAMES.bash, input: { command: item.command } }] }
16258
- });
16259
- }
16260
- if (item?.type === "file_change" && (item.changes?.length ?? 0) > 0) {
16261
- const toolUseId = resolvePatchToolUseId(item);
16262
- pendingToolCalls.set(toolUseId, toolUseId);
16263
- emitOutputProgress(patchResultText(item), `patch-start:${toolUseId}`);
16264
- ctx.emit({
16265
- type: "assistant",
16266
- message: { content: [{ type: "tool_use", id: toolUseId, name: CODEX_TOOL_NAMES.applyPatch, input: patchInput(item) }] }
16267
- });
16421
+ if (item) {
16422
+ const started = codexItemBubble(item);
16423
+ if (started && !pendingToolCalls.has(started.id)) {
16424
+ pendingToolCalls.set(started.id, started.id);
16425
+ emitOutputProgress(started.input.command || started.name, `tool-start:${started.id}`);
16426
+ ctx.emit({
16427
+ type: "assistant",
16428
+ message: { content: [{ type: "tool_use", id: started.id, name: started.name, input: started.input }] }
16429
+ });
16430
+ }
16268
16431
  }
16269
16432
  break;
16270
16433
  }
@@ -16298,6 +16461,11 @@ ${item.text}
16298
16461
  };
16299
16462
  return {
16300
16463
  handle,
16464
+ bindRollout,
16465
+ noteAssistantText(text) {
16466
+ if (terminated) return;
16467
+ emitOutputProgress(text);
16468
+ },
16301
16469
  assertSuccess() {
16302
16470
  if (failure) throw failure;
16303
16471
  }
@@ -16311,22 +16479,20 @@ function cleanupImageFiles(imageFiles) {
16311
16479
  }
16312
16480
  }
16313
16481
  }
16314
- function codexSdkInput(prompt, imageFiles) {
16315
- if (imageFiles.length === 0) return prompt;
16482
+ function codexTurnInput(prompt, imageFiles) {
16316
16483
  return [
16317
- { type: "text", text: prompt || CODEX_IMAGE_ONLY_TEXT },
16318
- ...imageFiles.map((path) => ({ type: "local_image", path }))
16484
+ { type: "text", text: imageFiles.length > 0 ? prompt || CODEX_IMAGE_ONLY_TEXT : prompt },
16485
+ ...imageFiles.map((path) => ({ type: "localImage", path }))
16319
16486
  ];
16320
16487
  }
16321
- function codexThreadOptions(ctx) {
16488
+ function codexThreadParams(ctx) {
16322
16489
  const effort = resolveCodexReasoningEffort(ctx.params.codexReasoningEffort);
16323
16490
  return {
16324
16491
  ...ctx.params.model ? { model: ctx.params.model } : {},
16325
- ...effort ? { modelReasoningEffort: effort } : {},
16326
- ...ctx.cwd ? { workingDirectory: ctx.cwd } : {},
16327
- sandboxMode: "danger-full-access",
16328
- approvalPolicy: "never",
16329
- skipGitRepoCheck: true
16492
+ ...effort ? { effort } : {},
16493
+ ...ctx.cwd ? { cwd: ctx.cwd } : {},
16494
+ sandbox: "danger-full-access",
16495
+ approvalPolicy: "never"
16330
16496
  };
16331
16497
  }
16332
16498
  function resolveCodexReasoningEffort(value) {
@@ -16343,28 +16509,116 @@ function resolveCodexReasoningEffort(value) {
16343
16509
  return void 0;
16344
16510
  }
16345
16511
  }
16346
- async function runCodexSdk(ctx) {
16512
+ var INTERRUPT_TIMEOUT_MS = 3e3;
16513
+ async function interruptTurns(client, shim) {
16514
+ const turns = shim.activeTurns();
16515
+ if (turns.length === 0) return;
16516
+ await Promise.race([
16517
+ Promise.allSettled(
16518
+ turns.map((t) => client.request("turn/interrupt", { threadId: t.threadId, turnId: t.turnId }))
16519
+ ),
16520
+ new Promise((resolve) => setTimeout(resolve, INTERRUPT_TIMEOUT_MS))
16521
+ ]);
16522
+ }
16523
+ async function runCodexAppServer(ctx) {
16347
16524
  const imageFiles = ctx.images && ctx.images.length > 0 ? writeImagesToTemp(ctx.images) : [];
16348
16525
  const adapter = createCodexEventAdapter(ctx);
16526
+ const shim = new CodexEventShim();
16527
+ let terminal = null;
16528
+ let settle = null;
16529
+ const finished = new Promise((resolve) => {
16530
+ settle = resolve;
16531
+ });
16532
+ const onNotification = (n) => {
16533
+ for (const out of shim.handle(n)) {
16534
+ if (out.kind === "text-delta") {
16535
+ adapter.noteAssistantText(out.text);
16536
+ ctx.emit({
16537
+ type: "stream_event",
16538
+ event: { type: "content_block_delta", delta: { type: "text_delta", text: out.text } }
16539
+ });
16540
+ continue;
16541
+ }
16542
+ adapter.handle(out.event);
16543
+ if (out.event.type === "turn.completed") terminal = "completed";
16544
+ if (out.event.type === "turn.failed") terminal = "failed";
16545
+ }
16546
+ if (terminal) settle?.();
16547
+ };
16548
+ let closedReason = null;
16549
+ let client;
16349
16550
  try {
16350
- const { Codex } = await import("@openai/codex-sdk");
16351
- const env = sanitizedSpawnEnv({});
16352
- let codex;
16353
- try {
16354
- codex = new Codex({ env });
16355
- } catch (error48) {
16356
- const message = error48 instanceof Error ? error48.message : "";
16357
- if (!message.includes("Unable to locate Codex CLI binaries")) throw error48;
16358
- console.error(
16359
- "[codex] bundled CLI binary is missing \u2014 falling back to `codex` on PATH. That build is not the version this SDK was pinned against. Repair with: cockpit update"
16360
- );
16361
- codex = new Codex({ codexPathOverride: "codex", env });
16551
+ client = CodexAppServerClient.start({
16552
+ env: sanitizedSpawnEnv({}),
16553
+ ...ctx.cwd ? { cwd: ctx.cwd } : {},
16554
+ onNotification,
16555
+ // Permitted `console.error` under EFFECT.md §0 (subprocess IPC adapter gateway).
16556
+ onStderr: (line) => console.error(`[codex app-server] ${line}`),
16557
+ onClosed: (err) => {
16558
+ closedReason = err;
16559
+ settle?.();
16560
+ }
16561
+ });
16562
+ } catch (error48) {
16563
+ cleanupImageFiles(imageFiles);
16564
+ throw error48;
16565
+ }
16566
+ try {
16567
+ await client.request("initialize", {
16568
+ clientInfo: { name: "cockpit", title: "Cockpit", version: "1" },
16569
+ capabilities: { experimentalApi: true }
16570
+ });
16571
+ client.notify("initialized");
16572
+ const params = codexThreadParams(ctx);
16573
+ let opened;
16574
+ let resumeFailure = null;
16575
+ if (ctx.sessionId) {
16576
+ try {
16577
+ opened = await client.request("thread/resume", { threadId: ctx.sessionId, ...params });
16578
+ } catch (error48) {
16579
+ resumeFailure = error48 instanceof Error ? error48.message : String(error48);
16580
+ console.error(
16581
+ `[codex app-server] thread/resume failed for ${ctx.sessionId} \u2014 starting a fresh thread (history not carried over): ${resumeFailure}`
16582
+ );
16583
+ opened = await client.request("thread/start", params);
16584
+ }
16585
+ } else {
16586
+ opened = await client.request("thread/start", params);
16587
+ }
16588
+ const thread = opened.thread;
16589
+ const threadId = thread?.id;
16590
+ if (!threadId) throw new Error("codex app-server returned no thread id");
16591
+ adapter.bindRollout(thread?.path);
16592
+ shim.bindThread(threadId);
16593
+ adapter.handle({ type: "thread.started", thread_id: threadId });
16594
+ if (resumeFailure) {
16595
+ ctx.emit({
16596
+ type: "system",
16597
+ subtype: "notice",
16598
+ notice: "codex_resume_failed",
16599
+ previous_session_id: ctx.sessionId,
16600
+ session_id: threadId,
16601
+ error: resumeFailure
16602
+ });
16362
16603
  }
16363
- const thread = ctx.sessionId ? codex.resumeThread(ctx.sessionId, codexThreadOptions(ctx)) : codex.startThread(codexThreadOptions(ctx));
16364
- const { events } = await thread.runStreamed(codexSdkInput(ctx.prompt ?? "", imageFiles), { signal: ctx.signal });
16365
- for await (const event of events) adapter.handle(event);
16604
+ const startedTurn = await client.request("turn/start", {
16605
+ threadId,
16606
+ input: codexTurnInput(ctx.prompt ?? "", imageFiles)
16607
+ });
16608
+ const turnId = startedTurn.turn?.id;
16609
+ if (turnId) shim.noteOwnTurn(threadId, turnId);
16610
+ await Promise.race([
16611
+ finished,
16612
+ new Promise((resolve) => {
16613
+ if (ctx.signal.aborted) return resolve();
16614
+ ctx.signal.addEventListener("abort", () => resolve(), { once: true });
16615
+ })
16616
+ ]);
16617
+ if (ctx.signal.aborted) await interruptTurns(client, shim);
16366
16618
  adapter.assertSuccess();
16619
+ if (closedReason && !ctx.signal.aborted && !terminal) throw closedReason;
16367
16620
  } finally {
16621
+ client.dispose();
16368
16622
  cleanupImageFiles(imageFiles);
16369
16623
  }
16370
16624
  }
@@ -16374,13 +16628,13 @@ var codexSpec = {
16374
16628
  runner: {
16375
16629
  async run(ctx) {
16376
16630
  if (ctx.params.noHistory !== true || !ctx.sessionId) {
16377
- await runCodexSdk(ctx);
16631
+ await runCodexAppServer(ctx);
16378
16632
  return;
16379
16633
  }
16380
16634
  const sessionPath = findCodexSessionPath(ctx.sessionId);
16381
16635
  const stashed = sessionPath ? stashCodexRollout(sessionPath) : false;
16382
16636
  try {
16383
- await runCodexSdk(ctx);
16637
+ await runCodexAppServer(ctx);
16384
16638
  } finally {
16385
16639
  if (stashed && sessionPath) mergeStashedCodexRollout(sessionPath);
16386
16640
  }
@@ -16550,6 +16804,8 @@ var en_default2 = {
16550
16804
  sendToPeerFailed: "Failed to send to the other pane",
16551
16805
  forkFailed: "Failed to fork session",
16552
16806
  excerptFailed: "Failed to excerpt this turn",
16807
+ turnDeleted: "Turn deleted",
16808
+ deleteTurnFailed: "Failed to delete this turn",
16553
16809
  copiedUrl: "URL copied",
16554
16810
  copiedOutput: "Output copied",
16555
16811
  copiedCmd: "Command copied",
@@ -16929,17 +17185,34 @@ var en_default2 = {
16929
17185
  jumpToLatest: "Jump to latest",
16930
17186
  jumpToPrevUserMessage: "Previous user message",
16931
17187
  jumpToNextUserMessage: "Next user message",
17188
+ recentUserMessages: "Recent user messages",
17189
+ moreUserMessages: "More",
17190
+ userMessage: "User message",
17191
+ recentUserMessageNumber: "Recent user message {{index}} of {{total}}",
17192
+ imageMessage: "Image message",
16932
17193
  copyMessage: "Copy message",
16933
17194
  copyImage: "Copy image",
16934
17195
  copiedImage: "Image copied",
16935
17196
  forkSession: "Fork session from here",
16936
17197
  excerptTurn: "Excerpt this turn to a new session",
17198
+ newSession: "New session",
17199
+ continueFromHere: "Continue from here",
17200
+ continueFromHereDesc: "Keep all context through this turn",
17201
+ onlyThisTurn: "Only this turn",
17202
+ onlyThisTurnDesc: "Keep only this question and answer",
17203
+ deleteTurn: "Delete turn",
17204
+ deletingTurn: "Deleting\u2026",
17205
+ deleteTurnConfirm: "Delete this question, answer, and its tool records? This cannot be undone.",
17206
+ deleteTurnConfirmAction: "Delete turn",
17207
+ deleteTurnWhileRunning: "A turn cannot be deleted while the session is running",
16937
17208
  sendToPeerPane: "Send this message to the other pane",
16938
17209
  imageN: "Image {{index}}",
16939
17210
  imagePreview: "Image preview",
16940
17211
  toolCalls: "{{count}} tool calls",
16941
17212
  collapse: "\u25B2 Collapse",
16942
17213
  expand: "\u25BC Expand",
17214
+ showMore: "Show more",
17215
+ showLess: "Show less",
16943
17216
  subagent: "Subagent",
16944
17217
  subagentEmpty: "No subagent transcript found",
16945
17218
  subagentViewTitle: "View subagent transcript",
@@ -16954,6 +17227,9 @@ var en_default2 = {
16954
17227
  requestFailed: "Request failed",
16955
17228
  cannotReadStream: "Cannot read response stream",
16956
17229
  errorRetry: "An error occurred, please retry",
17230
+ codexResumeFailed: "Previous session is in use by another Codex client \u2014 started a new session; history was not carried over",
17231
+ codexResumeFailedPrevious: "Previous session",
17232
+ codexResumeFailedNew: "New session",
16957
17233
  placeholder: "Type a message, Enter to send (Shift+Enter for new line, paste images; start a line with / (main session) or @ (subagent) for commands, multiple allowed)",
16958
17234
  placeholderDisabled: "Generating... you can keep typing (ESC to cancel; if stuck, cancel and resend 'continue')",
16959
17235
  imageSizeLimit: "Image size exceeds limit (max 5MB), current: {{size}}MB",
@@ -16962,13 +17238,25 @@ var en_default2 = {
16962
17238
  userMessages: "User messages",
16963
17239
  projectNotes: "Project Notes",
16964
17240
  scheduledTasks: "Scheduled Tasks",
16965
- quickPrompts: "Quick Prompts",
16966
- globalPrompts: "Global Prompts",
16967
- projectPrompts: "Project Prompts",
16968
- noQuickPrompts: "No quick prompts yet",
16969
- addQuickPrompt: "Add quick prompt",
16970
- quickPromptPlaceholder: "One-line prompt \u2014 Enter to save, Esc to cancel",
16971
- insertQuickPrompt: "Insert into input (without sending)",
17241
+ quickInstructions: "Quick Instructions",
17242
+ globalInstructions: "Global Instructions",
17243
+ projectInstructions: "Project Instructions",
17244
+ noQuickInstructions: "No quick instructions yet",
17245
+ addQuickInstruction: "Add quick instruction",
17246
+ quickInstructionPlaceholder: "One-line instruction \u2014 Enter to save, Esc to cancel",
17247
+ insertQuickInstruction: "Insert into input (without sending)",
17248
+ addInstructionGroup: "New group",
17249
+ instructionGroupNamePlaceholder: "Group name \u2014 Enter to save, Esc to cancel",
17250
+ instructionGroupLabel: "Group",
17251
+ instructionGroupNone: "No group",
17252
+ deleteInstructionGroupConfirm: 'Deleting "{{name}}" also deletes the {{count}} instruction(s) inside it. Continue?',
17253
+ editGlobalInstructions: "Edit global instructions",
17254
+ editProjectInstructions: "Edit project instructions",
17255
+ quickInstructionsMarkdownHint: "One top-level entry per line. Add lines beginning with \u201C- \u201D after a group name for its instructions.",
17256
+ quickInstructionsMarkdownPlaceholder: "Continue\nDraw with text\n- Draw a login flow\n- Draw a system architecture",
17257
+ quickInstructionsMarkdownError: "Invalid format on line {{line}}.",
17258
+ savingQuickInstructions: "Saving...",
17259
+ saveQuickInstructionsFailed: "Could not save. Your edits are still here; please try again.",
16972
17260
  context: "Context",
16973
17261
  output: "Output",
16974
17262
  copiedCommandTooltip: "Copied!",
@@ -16989,17 +17277,19 @@ var en_default2 = {
16989
17277
  quotaResetAt: "Resets {{time}}",
16990
17278
  openProviderConsole: "Open the provider console",
16991
17279
  planMode: "Plan mode",
16992
- planModeDesc: "read-only \xB7 plan first, no edits",
17280
+ planModeDesc: "read-only, plans first without edits",
16993
17281
  planModeOn: "Plan mode on \u2014 read-only; send a task to get a plan",
16994
17282
  planModeOff: "Plan mode off",
16995
17283
  planModeHint: "Plan mode: read-only exploration that produces a plan without editing. Uncheck and resend to implement.",
16996
- noHistory: "Independent task",
16997
- noHistoryDesc: "no history sent",
16998
- noHistoryHint: "Independent task: each message is sent to the model on its own, with no prior conversation. The transcript above still records everything.",
17284
+ noHistory: "No history context",
17285
+ noHistoryDesc: "each prompt is independent",
17286
+ noHistoryHint: "No history context: each message is sent to the model on its own, with no prior conversation. The transcript above still records everything.",
16999
17287
  planTitle: "Plan (awaiting your review)",
17000
17288
  approvePlan: "Approve & run",
17001
17289
  planApproveHint: "No approval dialog here \u2014 click to exit plan mode and execute",
17002
17290
  approvePlanPrompt: "Approved \u2014 proceed with the plan above.",
17291
+ maximizePane: "Maximize this pane",
17292
+ restorePane: "Restore both panes",
17003
17293
  closePane: "Close this pane",
17004
17294
  singlePane: "Single pane",
17005
17295
  splitPane: "Split into two panes"
@@ -17829,6 +18119,8 @@ var zh_default = {
17829
18119
  sendToPeerFailed: "\u53D1\u9001\u5230\u53E6\u4E00\u680F\u5931\u8D25",
17830
18120
  forkFailed: "\u5206\u53C9\u4F1A\u8BDD\u5931\u8D25",
17831
18121
  excerptFailed: "\u6458\u5F55\u672C\u8F6E\u5931\u8D25",
18122
+ turnDeleted: "\u5DF2\u5220\u9664\u672C\u8F6E",
18123
+ deleteTurnFailed: "\u5220\u9664\u672C\u8F6E\u5931\u8D25",
17832
18124
  copiedUrl: "\u5DF2\u590D\u5236\u7F51\u5740",
17833
18125
  copiedOutput: "\u5DF2\u590D\u5236\u8F93\u51FA",
17834
18126
  copiedCmd: "\u5DF2\u590D\u5236\u547D\u4EE4",
@@ -18208,17 +18500,34 @@ var zh_default = {
18208
18500
  jumpToLatest: "\u8DF3\u8F6C\u5230\u6700\u65B0",
18209
18501
  jumpToPrevUserMessage: "\u4E0A\u4E00\u6761\u7528\u6237\u6D88\u606F",
18210
18502
  jumpToNextUserMessage: "\u4E0B\u4E00\u6761\u7528\u6237\u6D88\u606F",
18503
+ recentUserMessages: "\u6700\u8FD1\u7684\u7528\u6237\u6D88\u606F",
18504
+ moreUserMessages: "\u66F4\u591A",
18505
+ userMessage: "\u7528\u6237\u6D88\u606F",
18506
+ recentUserMessageNumber: "\u6700\u8FD1\u7528\u6237\u6D88\u606F {{index}}/{{total}}",
18507
+ imageMessage: "\u56FE\u7247\u6D88\u606F",
18211
18508
  copyMessage: "\u590D\u5236\u6D88\u606F",
18212
18509
  copyImage: "\u590D\u5236\u56FE\u7247",
18213
18510
  copiedImage: "\u5DF2\u590D\u5236\u56FE\u7247",
18214
18511
  forkSession: "\u4ECE\u6B64\u5904\u5206\u53C9\u4F1A\u8BDD",
18215
18512
  excerptTurn: "\u6458\u5F55\u672C\u8F6E\u5230\u65B0\u4F1A\u8BDD",
18513
+ newSession: "\u65B0\u5EFA\u4F1A\u8BDD",
18514
+ continueFromHere: "\u5EF6\u7EED\u5230\u6B64\u5904",
18515
+ continueFromHereDesc: "\u4FDD\u7559\u622A\u81F3\u672C\u8F6E\u7684\u5168\u90E8\u4E0A\u4E0B\u6587",
18516
+ onlyThisTurn: "\u4EC5\u63D0\u53D6\u672C\u8F6E",
18517
+ onlyThisTurnDesc: "\u53EA\u5E26\u8FD9\u4E00\u8F6E\u95EE\u7B54",
18518
+ deleteTurn: "\u5220\u9664\u672C\u8F6E",
18519
+ deletingTurn: "\u6B63\u5728\u5220\u9664\u2026",
18520
+ deleteTurnConfirm: "\u786E\u5B9A\u5220\u9664\u8FD9\u4E00\u8F6E\u7684\u95EE\u9898\u3001\u56DE\u7B54\u53CA\u5DE5\u5177\u8BB0\u5F55\u5417\uFF1F\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002",
18521
+ deleteTurnConfirmAction: "\u5220\u9664\u672C\u8F6E",
18522
+ deleteTurnWhileRunning: "\u4F1A\u8BDD\u8FD0\u884C\u671F\u95F4\u4E0D\u80FD\u5220\u9664",
18216
18523
  sendToPeerPane: "\u53D1\u9001\u672C\u6761\u6D88\u606F\u5230\u53E6\u4E00\u680F",
18217
18524
  imageN: "\u56FE\u7247 {{index}}",
18218
18525
  imagePreview: "\u56FE\u7247\u9884\u89C8",
18219
18526
  toolCalls: "{{count}} \u4E2A\u5DE5\u5177\u8C03\u7528",
18220
18527
  collapse: "\u25B2 \u6536\u8D77",
18221
18528
  expand: "\u25BC \u5C55\u5F00",
18529
+ showMore: "\u663E\u793A\u66F4\u591A",
18530
+ showLess: "\u6536\u8D77",
18222
18531
  subagent: "\u5B50\u4EE3\u7406",
18223
18532
  subagentEmpty: "\u672A\u627E\u5230\u5B50\u4EE3\u7406\u6D88\u606F\u8BB0\u5F55",
18224
18533
  subagentViewTitle: "\u67E5\u770B\u5B50\u4EE3\u7406\u6267\u884C\u8FC7\u7A0B",
@@ -18233,6 +18542,9 @@ var zh_default = {
18233
18542
  requestFailed: "\u8BF7\u6C42\u5931\u8D25",
18234
18543
  cannotReadStream: "\u65E0\u6CD5\u8BFB\u53D6\u54CD\u5E94\u6D41",
18235
18544
  errorRetry: "\u53D1\u751F\u9519\u8BEF\uFF0C\u8BF7\u91CD\u8BD5",
18545
+ codexResumeFailed: "\u539F\u4F1A\u8BDD\u88AB\u5176\u4ED6 Codex \u5BA2\u6237\u7AEF\u5360\u7528\uFF0C\u5DF2\u65B0\u5EFA\u4F1A\u8BDD\uFF0C\u5386\u53F2\u672A\u7EE7\u627F",
18546
+ codexResumeFailedPrevious: "\u539F\u4F1A\u8BDD",
18547
+ codexResumeFailedNew: "\u65B0\u4F1A\u8BDD",
18236
18548
  placeholder: "\u8F93\u5165\u6D88\u606F\uFF0CEnter \u53D1\u9001\uFF08Shift+Enter \u6362\u884C\uFF0C\u53EF\u7C98\u8D34\u56FE\u7247\uFF1B\u884C\u9996 /\uFF08\u4E3B\u4F1A\u8BDD\uFF09\u6216 @\uFF08\u5B50\u4EE3\u7406\uFF09\u5524\u8D77\u547D\u4EE4\uFF0C\u652F\u6301\u591A\u884C\u591A\u547D\u4EE4\uFF09",
18237
18549
  placeholderDisabled: "\u751F\u6210\u4E2D... \u53EF\u7EE7\u7EED\u8F93\u5165 (ESC \u53D6\u6D88;\u5361\u4F4F\u592A\u4E45\u53EF\u53D6\u6D88\u540E\u91CD\u53D1\u300C\u7EE7\u7EED\u300D)",
18238
18550
  imageSizeLimit: "\u56FE\u7247\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 5MB\uFF09\uFF0C\u5F53\u524D\u5927\u5C0F: {{size}}MB",
@@ -18241,13 +18553,25 @@ var zh_default = {
18241
18553
  userMessages: "\u7528\u6237\u6D88\u606F\u5217\u8868",
18242
18554
  projectNotes: "\u9879\u76EE\u7B14\u8BB0",
18243
18555
  scheduledTasks: "\u5B9A\u65F6\u4EFB\u52A1",
18244
- quickPrompts: "\u5FEB\u6377 Prompt",
18245
- globalPrompts: "\u5168\u5C40 Prompt",
18246
- projectPrompts: "\u9879\u76EE Prompt",
18247
- noQuickPrompts: "\u6682\u65E0\u5FEB\u6377 Prompt",
18248
- addQuickPrompt: "\u65B0\u589E\u5FEB\u6377 Prompt",
18249
- quickPromptPlaceholder: "\u8F93\u5165\u4E00\u53E5\u8BDD Prompt\uFF0CEnter \u4FDD\u5B58\uFF0CEsc \u53D6\u6D88",
18250
- insertQuickPrompt: "\u586B\u5165\u8F93\u5165\u6846\uFF08\u4E0D\u53D1\u9001\uFF09",
18556
+ quickInstructions: "\u5FEB\u6377\u6307\u4EE4",
18557
+ globalInstructions: "\u5168\u5C40\u6307\u4EE4",
18558
+ projectInstructions: "\u9879\u76EE\u6307\u4EE4",
18559
+ noQuickInstructions: "\u6682\u65E0\u5FEB\u6377\u6307\u4EE4",
18560
+ addQuickInstruction: "\u65B0\u589E\u5FEB\u6377\u6307\u4EE4",
18561
+ quickInstructionPlaceholder: "\u8F93\u5165\u4E00\u53E5\u8BDD\u6307\u4EE4\uFF0CEnter \u4FDD\u5B58\uFF0CEsc \u53D6\u6D88",
18562
+ insertQuickInstruction: "\u586B\u5165\u8F93\u5165\u6846\uFF08\u4E0D\u53D1\u9001\uFF09",
18563
+ addInstructionGroup: "\u65B0\u589E\u5206\u7EC4",
18564
+ instructionGroupNamePlaceholder: "\u8F93\u5165\u5206\u7EC4\u540D\uFF0CEnter \u4FDD\u5B58\uFF0CEsc \u53D6\u6D88",
18565
+ instructionGroupLabel: "\u6240\u5C5E\u5206\u7EC4",
18566
+ instructionGroupNone: "\u4E0D\u5206\u7EC4",
18567
+ deleteInstructionGroupConfirm: "\u5220\u9664\u5206\u7EC4\u300C{{name}}\u300D\u4F1A\u540C\u65F6\u5220\u9664\u7EC4\u5185 {{count}} \u6761\u6307\u4EE4\uFF0C\u786E\u5B9A\u7EE7\u7EED\uFF1F",
18568
+ editGlobalInstructions: "\u7F16\u8F91\u5168\u5C40\u6307\u4EE4",
18569
+ editProjectInstructions: "\u7F16\u8F91\u9879\u76EE\u6307\u4EE4",
18570
+ quickInstructionsMarkdownHint: "\u4E00\u7EA7\u5185\u5BB9\u6BCF\u884C\u4E00\u6761\uFF1B\u5206\u7EC4\u540D\u79F0\u540E\u7684\u300C- \u300D\u5F00\u5934\u884C\u662F\u8BE5\u5206\u7EC4\u7684\u5B50\u547D\u4EE4\u3002",
18571
+ quickInstructionsMarkdownPlaceholder: "\u6309\u63A8\u8350\u5B9E\u65BD\n\u7528\u6587\u672C\u753B\u56FE\n- \u753B\u4E00\u4E2A\u767B\u5F55\u6D41\u7A0B\n- \u753B\u4E00\u4E2A\u7CFB\u7EDF\u67B6\u6784",
18572
+ quickInstructionsMarkdownError: "\u7B2C {{line}} \u884C\u683C\u5F0F\u4E0D\u6B63\u786E\u3002",
18573
+ savingQuickInstructions: "\u4FDD\u5B58\u4E2D...",
18574
+ saveQuickInstructionsFailed: "\u4FDD\u5B58\u5931\u8D25\uFF0C\u4FEE\u6539\u4ECD\u7136\u4FDD\u7559\uFF0C\u8BF7\u91CD\u8BD5\u3002",
18251
18575
  context: "\u4E0A\u4E0B\u6587",
18252
18576
  output: "\u8F93\u51FA",
18253
18577
  copiedCommandTooltip: "\u5DF2\u590D\u5236!",
@@ -18268,17 +18592,19 @@ var zh_default = {
18268
18592
  quotaResetAt: "{{time}} \u91CD\u7F6E",
18269
18593
  openProviderConsole: "\u6253\u5F00\u670D\u52A1\u5546\u63A7\u5236\u53F0",
18270
18594
  planMode: "\u8BA1\u5212\u6A21\u5F0F",
18271
- planModeDesc: "\u53EA\u8BFB\xB7\u5148\u51FA\u8BA1\u5212\u4E0D\u6539\u4EE3\u7801",
18595
+ planModeDesc: "\u53EA\u8BFB\uFF0C\u5148\u51FA\u8BA1\u5212\u4E0D\u6539\u4EE3\u7801",
18272
18596
  planModeOn: "\u5DF2\u5F00\u542F\u8BA1\u5212\u6A21\u5F0F\u2014\u2014\u53EA\u8BFB;\u53D1\u4E00\u4E2A\u4EFB\u52A1\u5373\u53EF\u62FF\u5230\u8BA1\u5212",
18273
18597
  planModeOff: "\u5DF2\u5173\u95ED\u8BA1\u5212\u6A21\u5F0F",
18274
18598
  planModeHint: "\u8BA1\u5212\u6A21\u5F0F\uFF1A\u53EA\u8BFB\u63A2\u7D22\u3001\u4EA7\u51FA\u8BA1\u5212\u4F46\u4E0D\u6539\u6587\u4EF6\u3002\u53D6\u6D88\u52FE\u9009\u540E\u91CD\u53D1\u624D\u4F1A\u5B9E\u73B0\u3002",
18275
- noHistory: "\u72EC\u7ACB\u4EFB\u52A1",
18276
- noHistoryDesc: "\u4E0D\u53D1\u9001\u5386\u53F2",
18277
- noHistoryHint: "\u72EC\u7ACB\u4EFB\u52A1\uFF1A\u6BCF\u6761\u6D88\u606F\u5355\u72EC\u53D1\u7ED9\u6A21\u578B\uFF0C\u4E0D\u5E26\u4E4B\u524D\u7684\u5BF9\u8BDD\u3002\u4E0A\u65B9\u7684\u4F1A\u8BDD\u8BB0\u5F55\u7167\u5E38\u4FDD\u7559\u3002",
18599
+ noHistory: "\u4E0D\u5E26\u5386\u53F2\u4E0A\u4E0B\u6587",
18600
+ noHistoryDesc: "\u6BCF\u6B21\u63D0\u95EE\u5747\u72EC\u7ACB",
18601
+ noHistoryHint: "\u4E0D\u5E26\u5386\u53F2\u4E0A\u4E0B\u6587\uFF1A\u6BCF\u6761\u6D88\u606F\u5355\u72EC\u53D1\u7ED9\u6A21\u578B\uFF0C\u4E0D\u5E26\u4E4B\u524D\u7684\u5BF9\u8BDD\u3002\u4E0A\u65B9\u7684\u4F1A\u8BDD\u8BB0\u5F55\u7167\u5E38\u4FDD\u7559\u3002",
18278
18602
  planTitle: "\u8BA1\u5212\uFF08\u5F85\u4F60\u786E\u8BA4\uFF09",
18279
18603
  approvePlan: "\u6279\u51C6\u5E76\u6267\u884C",
18280
18604
  planApproveHint: "\u672C\u73AF\u5883\u65E0\u5BA1\u6279\u5F39\u7A97\uFF0C\u70B9\u6B64\u9000\u51FA\u8BA1\u5212\u6A21\u5F0F\u5E76\u6267\u884C",
18281
18605
  approvePlanPrompt: "\u5DF2\u6279\u51C6\uFF0C\u6309\u4E0A\u8FF0\u8BA1\u5212\u5F00\u59CB\u6267\u884C\u3002",
18606
+ maximizePane: "\u653E\u5927\u672C\u680F",
18607
+ restorePane: "\u8FD8\u539F\u53CC\u680F",
18282
18608
  closePane: "\u5173\u95ED\u672C\u680F",
18283
18609
  singlePane: "\u5207\u56DE\u5355\u680F",
18284
18610
  splitPane: "\u5E76\u6392\u53CC\u680F"