@surething/cockpit 1.0.275 → 1.0.276

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 (711) hide show
  1. package/.next-prod/BUILD_ID +1 -1
  2. package/.next-prod/app-path-routes-manifest.json +3 -1
  3. package/.next-prod/build-manifest.json +2 -2
  4. package/.next-prod/cockpit-build.json +1 -1
  5. package/.next-prod/prerender-manifest.json +4 -4
  6. package/.next-prod/routes-manifest.json +14 -0
  7. package/.next-prod/server/app/_global-error/page.js +2 -2
  8. package/.next-prod/server/app/_global-error/page.js.nft.json +1 -1
  9. package/.next-prod/server/app/_global-error/page_client-reference-manifest.js +1 -1
  10. package/.next-prod/server/app/_global-error.html +1 -1
  11. package/.next-prod/server/app/_global-error.rsc +1 -1
  12. package/.next-prod/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next-prod/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  14. package/.next-prod/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next-prod/server/app/_not-found/page.js +1 -1
  16. package/.next-prod/server/app/_not-found/page.js.nft.json +1 -1
  17. package/.next-prod/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next-prod/server/app/_not-found.html +2 -2
  19. package/.next-prod/server/app/_not-found.rsc +3 -3
  20. package/.next-prod/server/app/_not-found.segments/_full.segment.rsc +3 -3
  21. package/.next-prod/server/app/_not-found.segments/_index.segment.rsc +3 -3
  22. package/.next-prod/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  23. package/.next-prod/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  24. package/.next-prod/server/app/api/agent/test/route.js +1 -1
  25. package/.next-prod/server/app/api/agent/test/route.js.nft.json +1 -1
  26. package/.next-prod/server/app/api/bash/route.js +1 -1
  27. package/.next-prod/server/app/api/bash/route.js.nft.json +1 -1
  28. package/.next-prod/server/app/api/bots/[id]/route.js +1 -0
  29. package/.next-prod/server/app/api/bots/[id]/route.js.nft.json +1 -0
  30. package/.next-prod/server/app/api/bots/[id]/route_client-reference-manifest.js +1 -0
  31. package/.next-prod/server/app/api/bots/route.js +1 -0
  32. package/.next-prod/server/app/api/bots/route.js.nft.json +1 -0
  33. package/.next-prod/server/app/api/bots/route_client-reference-manifest.js +1 -0
  34. package/.next-prod/server/app/api/chat/codex/route.js +1 -1
  35. package/.next-prod/server/app/api/chat/codex/route.js.nft.json +1 -1
  36. package/.next-prod/server/app/api/chat/deepseek/route.js +1 -1
  37. package/.next-prod/server/app/api/chat/deepseek/route.js.nft.json +1 -1
  38. package/.next-prod/server/app/api/chat/glm/route.js +1 -1
  39. package/.next-prod/server/app/api/chat/glm/route.js.nft.json +1 -1
  40. package/.next-prod/server/app/api/chat/kimi/route.js +1 -1
  41. package/.next-prod/server/app/api/chat/kimi/route.js.nft.json +1 -1
  42. package/.next-prod/server/app/api/chat/ollama/route.js +1 -1
  43. package/.next-prod/server/app/api/chat/ollama/route.js.nft.json +1 -1
  44. package/.next-prod/server/app/api/chat/route.js +1 -1
  45. package/.next-prod/server/app/api/chat/route.js.nft.json +1 -1
  46. package/.next-prod/server/app/api/chat/stop/route.js +1 -1
  47. package/.next-prod/server/app/api/chat/stop/route.js.nft.json +1 -1
  48. package/.next-prod/server/app/api/claude-stats/route.js +1 -1
  49. package/.next-prod/server/app/api/claude-stats/route.js.nft.json +1 -1
  50. package/.next-prod/server/app/api/commands/route.js +1 -1
  51. package/.next-prod/server/app/api/commands/route.js.nft.json +1 -1
  52. package/.next-prod/server/app/api/comments/route.js +1 -1
  53. package/.next-prod/server/app/api/comments/route.js.nft.json +1 -1
  54. package/.next-prod/server/app/api/db/columns/route.js +2 -2
  55. package/.next-prod/server/app/api/db/columns/route.js.nft.json +1 -1
  56. package/.next-prod/server/app/api/db/connect/route.js +1 -1
  57. package/.next-prod/server/app/api/db/connect/route.js.nft.json +1 -1
  58. package/.next-prod/server/app/api/db/disconnect/route.js +1 -1
  59. package/.next-prod/server/app/api/db/disconnect/route.js.nft.json +1 -1
  60. package/.next-prod/server/app/api/db/export/route.js +1 -1
  61. package/.next-prod/server/app/api/db/export/route.js.nft.json +1 -1
  62. package/.next-prod/server/app/api/db/query/route.js +1 -1
  63. package/.next-prod/server/app/api/db/query/route.js.nft.json +1 -1
  64. package/.next-prod/server/app/api/db/schemas/route.js +1 -1
  65. package/.next-prod/server/app/api/db/schemas/route.js.nft.json +1 -1
  66. package/.next-prod/server/app/api/deepseek/balance/route.js +1 -1
  67. package/.next-prod/server/app/api/deepseek/balance/route.js.nft.json +1 -1
  68. package/.next-prod/server/app/api/deepseek/credentials/route.js +1 -1
  69. package/.next-prod/server/app/api/deepseek/credentials/route.js.nft.json +1 -1
  70. package/.next-prod/server/app/api/deepseek/models/route.js +1 -1
  71. package/.next-prod/server/app/api/deepseek/models/route.js.nft.json +1 -1
  72. package/.next-prod/server/app/api/dev/spans/route.js +1 -1
  73. package/.next-prod/server/app/api/dev/spans/route.js.nft.json +1 -1
  74. package/.next-prod/server/app/api/extension/version/route.js +1 -1
  75. package/.next-prod/server/app/api/extension/version/route.js.nft.json +1 -1
  76. package/.next-prod/server/app/api/file/route.js +1 -1
  77. package/.next-prod/server/app/api/file/route.js.nft.json +1 -1
  78. package/.next-prod/server/app/api/files/blame/route.js +1 -1
  79. package/.next-prod/server/app/api/files/blame/route.js.nft.json +1 -1
  80. package/.next-prod/server/app/api/files/clipboard/route.js +1 -1
  81. package/.next-prod/server/app/api/files/clipboard/route.js.nft.json +1 -1
  82. package/.next-prod/server/app/api/files/copy/route.js +1 -1
  83. package/.next-prod/server/app/api/files/copy/route.js.nft.json +1 -1
  84. package/.next-prod/server/app/api/files/delete/route.js +1 -1
  85. package/.next-prod/server/app/api/files/delete/route.js.nft.json +1 -1
  86. package/.next-prod/server/app/api/files/expanded/route.js +1 -1
  87. package/.next-prod/server/app/api/files/expanded/route.js.nft.json +1 -1
  88. package/.next-prod/server/app/api/files/index/route.js +1 -1
  89. package/.next-prod/server/app/api/files/index/route.js.nft.json +1 -1
  90. package/.next-prod/server/app/api/files/init/route.js +1 -1
  91. package/.next-prod/server/app/api/files/init/route.js.nft.json +1 -1
  92. package/.next-prod/server/app/api/files/paste/route.js +1 -1
  93. package/.next-prod/server/app/api/files/paste/route.js.nft.json +1 -1
  94. package/.next-prod/server/app/api/files/read/route.js +1 -1
  95. package/.next-prod/server/app/api/files/read/route.js.nft.json +1 -1
  96. package/.next-prod/server/app/api/files/readdir/route.js +1 -1
  97. package/.next-prod/server/app/api/files/readdir/route.js.nft.json +1 -1
  98. package/.next-prod/server/app/api/files/recent/route.js +1 -1
  99. package/.next-prod/server/app/api/files/recent/route.js.nft.json +1 -1
  100. package/.next-prod/server/app/api/files/save/route.js +1 -1
  101. package/.next-prod/server/app/api/files/save/route.js.nft.json +1 -1
  102. package/.next-prod/server/app/api/files/search/route.js +1 -1
  103. package/.next-prod/server/app/api/files/search/route.js.nft.json +1 -1
  104. package/.next-prod/server/app/api/files/stat/route.js +1 -1
  105. package/.next-prod/server/app/api/files/stat/route.js.nft.json +1 -1
  106. package/.next-prod/server/app/api/files/text/route.js +1 -1
  107. package/.next-prod/server/app/api/files/text/route.js.nft.json +1 -1
  108. package/.next-prod/server/app/api/git/blob/route.js +1 -1
  109. package/.next-prod/server/app/api/git/blob/route.js.nft.json +1 -1
  110. package/.next-prod/server/app/api/git/branch-diff/route.js +1 -1
  111. package/.next-prod/server/app/api/git/branch-diff/route.js.nft.json +1 -1
  112. package/.next-prod/server/app/api/git/branches/route.js +1 -1
  113. package/.next-prod/server/app/api/git/branches/route.js.nft.json +1 -1
  114. package/.next-prod/server/app/api/git/commit-diff/route.js +1 -1
  115. package/.next-prod/server/app/api/git/commit-diff/route.js.nft.json +1 -1
  116. package/.next-prod/server/app/api/git/commits/route.js +1 -1
  117. package/.next-prod/server/app/api/git/commits/route.js.nft.json +1 -1
  118. package/.next-prod/server/app/api/git/current-branch/route.js +1 -1
  119. package/.next-prod/server/app/api/git/current-branch/route.js.nft.json +1 -1
  120. package/.next-prod/server/app/api/git/diff/route.js +1 -1
  121. package/.next-prod/server/app/api/git/diff/route.js.nft.json +1 -1
  122. package/.next-prod/server/app/api/git/discard/route.js +1 -1
  123. package/.next-prod/server/app/api/git/discard/route.js.nft.json +1 -1
  124. package/.next-prod/server/app/api/git/stage/route.js +1 -1
  125. package/.next-prod/server/app/api/git/stage/route.js.nft.json +1 -1
  126. package/.next-prod/server/app/api/git/status/route.js +1 -1
  127. package/.next-prod/server/app/api/git/status/route.js.nft.json +1 -1
  128. package/.next-prod/server/app/api/git/unstage/route.js +1 -1
  129. package/.next-prod/server/app/api/git/unstage/route.js.nft.json +1 -1
  130. package/.next-prod/server/app/api/git/worktree/route.js +1 -1
  131. package/.next-prod/server/app/api/git/worktree/route.js.nft.json +1 -1
  132. package/.next-prod/server/app/api/glm/credentials/route.js +1 -1
  133. package/.next-prod/server/app/api/glm/credentials/route.js.nft.json +1 -1
  134. package/.next-prod/server/app/api/glm/models/route.js +1 -1
  135. package/.next-prod/server/app/api/glm/models/route.js.nft.json +1 -1
  136. package/.next-prod/server/app/api/glm/usage/route.js +1 -1
  137. package/.next-prod/server/app/api/glm/usage/route.js.nft.json +1 -1
  138. package/.next-prod/server/app/api/global-state/route.js +2 -2
  139. package/.next-prod/server/app/api/global-state/route.js.nft.json +1 -1
  140. package/.next-prod/server/app/api/health/route.js +1 -1
  141. package/.next-prod/server/app/api/health/route.js.nft.json +1 -1
  142. package/.next-prod/server/app/api/html-apps/[id]/route.js +1 -1
  143. package/.next-prod/server/app/api/html-apps/[id]/route.js.nft.json +1 -1
  144. package/.next-prod/server/app/api/html-apps/route.js +1 -1
  145. package/.next-prod/server/app/api/html-apps/route.js.nft.json +1 -1
  146. package/.next-prod/server/app/api/instructions/config/route.js +1 -1
  147. package/.next-prod/server/app/api/instructions/config/route.js.nft.json +1 -1
  148. package/.next-prod/server/app/api/kimi/credentials/route.js +1 -1
  149. package/.next-prod/server/app/api/kimi/credentials/route.js.nft.json +1 -1
  150. package/.next-prod/server/app/api/kimi/models/route.js +1 -1
  151. package/.next-prod/server/app/api/kimi/models/route.js.nft.json +1 -1
  152. package/.next-prod/server/app/api/kimi/usage/route.js +1 -1
  153. package/.next-prod/server/app/api/kimi/usage/route.js.nft.json +1 -1
  154. package/.next-prod/server/app/api/lsp/definition/route.js +1 -1
  155. package/.next-prod/server/app/api/lsp/definition/route.js.nft.json +1 -1
  156. package/.next-prod/server/app/api/lsp/hover/route.js +1 -1
  157. package/.next-prod/server/app/api/lsp/hover/route.js.nft.json +1 -1
  158. package/.next-prod/server/app/api/lsp/references/route.js +1 -1
  159. package/.next-prod/server/app/api/lsp/references/route.js.nft.json +1 -1
  160. package/.next-prod/server/app/api/lsp/status/route.js +1 -1
  161. package/.next-prod/server/app/api/lsp/status/route.js.nft.json +1 -1
  162. package/.next-prod/server/app/api/lsp/warmup/route.js +1 -1
  163. package/.next-prod/server/app/api/lsp/warmup/route.js.nft.json +1 -1
  164. package/.next-prod/server/app/api/mysql/columns/route.js +1 -1
  165. package/.next-prod/server/app/api/mysql/columns/route.js.nft.json +1 -1
  166. package/.next-prod/server/app/api/mysql/connect/route.js +1 -1
  167. package/.next-prod/server/app/api/mysql/connect/route.js.nft.json +1 -1
  168. package/.next-prod/server/app/api/mysql/disconnect/route.js +1 -1
  169. package/.next-prod/server/app/api/mysql/disconnect/route.js.nft.json +1 -1
  170. package/.next-prod/server/app/api/mysql/export/route.js +1 -1
  171. package/.next-prod/server/app/api/mysql/export/route.js.nft.json +1 -1
  172. package/.next-prod/server/app/api/mysql/query/route.js +1 -1
  173. package/.next-prod/server/app/api/mysql/query/route.js.nft.json +1 -1
  174. package/.next-prod/server/app/api/mysql/schemas/route.js +1 -1
  175. package/.next-prod/server/app/api/mysql/schemas/route.js.nft.json +1 -1
  176. package/.next-prod/server/app/api/neo4j/connect/route.js +1 -1
  177. package/.next-prod/server/app/api/neo4j/connect/route.js.nft.json +1 -1
  178. package/.next-prod/server/app/api/neo4j/disconnect/route.js +1 -1
  179. package/.next-prod/server/app/api/neo4j/disconnect/route.js.nft.json +1 -1
  180. package/.next-prod/server/app/api/neo4j/query/route.js +1 -1
  181. package/.next-prod/server/app/api/neo4j/query/route.js.nft.json +1 -1
  182. package/.next-prod/server/app/api/neo4j/schema/route.js +1 -1
  183. package/.next-prod/server/app/api/neo4j/schema/route.js.nft.json +1 -1
  184. package/.next-prod/server/app/api/note/route.js +1 -1
  185. package/.next-prod/server/app/api/note/route.js.nft.json +1 -1
  186. package/.next-prod/server/app/api/ollama/config/route.js +1 -1
  187. package/.next-prod/server/app/api/ollama/config/route.js.nft.json +1 -1
  188. package/.next-prod/server/app/api/ollama/models/route.js +1 -1
  189. package/.next-prod/server/app/api/ollama/models/route.js.nft.json +1 -1
  190. package/.next-prod/server/app/api/ollama/start/route.js +1 -1
  191. package/.next-prod/server/app/api/ollama/start/route.js.nft.json +1 -1
  192. package/.next-prod/server/app/api/open-cursor/route.js +1 -1
  193. package/.next-prod/server/app/api/open-cursor/route.js.nft.json +1 -1
  194. package/.next-prod/server/app/api/open-vscode/route.js +1 -1
  195. package/.next-prod/server/app/api/open-vscode/route.js.nft.json +1 -1
  196. package/.next-prod/server/app/api/pick-folder/route.js +1 -1
  197. package/.next-prod/server/app/api/pick-folder/route.js.nft.json +1 -1
  198. package/.next-prod/server/app/api/pinned-sessions/route.js +1 -1
  199. package/.next-prod/server/app/api/pinned-sessions/route.js.nft.json +1 -1
  200. package/.next-prod/server/app/api/project-settings/route.js +1 -1
  201. package/.next-prod/server/app/api/project-settings/route.js.nft.json +1 -1
  202. package/.next-prod/server/app/api/project-state/route.js +2 -2
  203. package/.next-prod/server/app/api/project-state/route.js.nft.json +1 -1
  204. package/.next-prod/server/app/api/projectGraph/affected/route.js +1 -1
  205. package/.next-prod/server/app/api/projectGraph/affected/route.js.nft.json +1 -1
  206. package/.next-prod/server/app/api/projectGraph/callees/route.js +1 -1
  207. package/.next-prod/server/app/api/projectGraph/callees/route.js.nft.json +1 -1
  208. package/.next-prod/server/app/api/projectGraph/callers/route.js +1 -1
  209. package/.next-prod/server/app/api/projectGraph/callers/route.js.nft.json +1 -1
  210. package/.next-prod/server/app/api/projectGraph/coedit/route.js +1 -1
  211. package/.next-prod/server/app/api/projectGraph/coedit/route.js.nft.json +1 -1
  212. package/.next-prod/server/app/api/projectGraph/context/route.js +1 -1
  213. package/.next-prod/server/app/api/projectGraph/context/route.js.nft.json +1 -1
  214. package/.next-prod/server/app/api/projectGraph/file/route.js +1 -1
  215. package/.next-prod/server/app/api/projectGraph/file/route.js.nft.json +1 -1
  216. package/.next-prod/server/app/api/projectGraph/file-functions/route.js +1 -1
  217. package/.next-prod/server/app/api/projectGraph/file-functions/route.js.nft.json +1 -1
  218. package/.next-prod/server/app/api/projectGraph/impact/route.js +1 -1
  219. package/.next-prod/server/app/api/projectGraph/impact/route.js.nft.json +1 -1
  220. package/.next-prod/server/app/api/projectGraph/related/route.js +1 -1
  221. package/.next-prod/server/app/api/projectGraph/related/route.js.nft.json +1 -1
  222. package/.next-prod/server/app/api/projectGraph/risk/route.js +1 -1
  223. package/.next-prod/server/app/api/projectGraph/risk/route.js.nft.json +1 -1
  224. package/.next-prod/server/app/api/projectGraph/search/route.js +1 -1
  225. package/.next-prod/server/app/api/projectGraph/search/route.js.nft.json +1 -1
  226. package/.next-prod/server/app/api/projects/route.js +1 -1
  227. package/.next-prod/server/app/api/projects/route.js.nft.json +1 -1
  228. package/.next-prod/server/app/api/push/public-key/route.js +1 -1
  229. package/.next-prod/server/app/api/push/public-key/route.js.nft.json +1 -1
  230. package/.next-prod/server/app/api/push/subscribe/route.js +1 -1
  231. package/.next-prod/server/app/api/push/subscribe/route.js.nft.json +1 -1
  232. package/.next-prod/server/app/api/push/unsubscribe/route.js +1 -1
  233. package/.next-prod/server/app/api/push/unsubscribe/route.js.nft.json +1 -1
  234. package/.next-prod/server/app/api/redis/command/route.js +1 -1
  235. package/.next-prod/server/app/api/redis/command/route.js.nft.json +1 -1
  236. package/.next-prod/server/app/api/redis/connect/route.js +1 -1
  237. package/.next-prod/server/app/api/redis/connect/route.js.nft.json +1 -1
  238. package/.next-prod/server/app/api/redis/delete/route.js +1 -1
  239. package/.next-prod/server/app/api/redis/delete/route.js.nft.json +1 -1
  240. package/.next-prod/server/app/api/redis/disconnect/route.js +1 -1
  241. package/.next-prod/server/app/api/redis/disconnect/route.js.nft.json +1 -1
  242. package/.next-prod/server/app/api/redis/get/route.js +1 -1
  243. package/.next-prod/server/app/api/redis/get/route.js.nft.json +1 -1
  244. package/.next-prod/server/app/api/redis/keys/route.js +1 -1
  245. package/.next-prod/server/app/api/redis/keys/route.js.nft.json +1 -1
  246. package/.next-prod/server/app/api/redis/set/route.js +1 -1
  247. package/.next-prod/server/app/api/redis/set/route.js.nft.json +1 -1
  248. package/.next-prod/server/app/api/restart/route.js +1 -1
  249. package/.next-prod/server/app/api/restart/route.js.nft.json +1 -1
  250. package/.next-prod/server/app/api/review/[id]/comments/route.js +1 -1
  251. package/.next-prod/server/app/api/review/[id]/comments/route.js.nft.json +1 -1
  252. package/.next-prod/server/app/api/review/[id]/replies/route.js +1 -1
  253. package/.next-prod/server/app/api/review/[id]/replies/route.js.nft.json +1 -1
  254. package/.next-prod/server/app/api/review/[id]/route.js +1 -1
  255. package/.next-prod/server/app/api/review/[id]/route.js.nft.json +1 -1
  256. package/.next-prod/server/app/api/review/identify/route.js +1 -1
  257. package/.next-prod/server/app/api/review/identify/route.js.nft.json +1 -1
  258. package/.next-prod/server/app/api/review/order/route.js +1 -1
  259. package/.next-prod/server/app/api/review/order/route.js.nft.json +1 -1
  260. package/.next-prod/server/app/api/review/route.js +1 -1
  261. package/.next-prod/server/app/api/review/route.js.nft.json +1 -1
  262. package/.next-prod/server/app/api/review/share-info/route.js +1 -1
  263. package/.next-prod/server/app/api/review/share-info/route.js.nft.json +1 -1
  264. package/.next-prod/server/app/api/review/users/route.js +1 -1
  265. package/.next-prod/server/app/api/review/users/route.js.nft.json +1 -1
  266. package/.next-prod/server/app/api/scheduled-tasks/route.js +2 -2
  267. package/.next-prod/server/app/api/scheduled-tasks/route.js.nft.json +1 -1
  268. package/.next-prod/server/app/api/services/config/route.js +1 -1
  269. package/.next-prod/server/app/api/services/config/route.js.nft.json +1 -1
  270. package/.next-prod/server/app/api/services/scripts/route.js +1 -1
  271. package/.next-prod/server/app/api/services/scripts/route.js.nft.json +1 -1
  272. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js +1 -1
  273. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js.nft.json +1 -1
  274. package/.next-prod/server/app/api/session/[sessionId]/history/route.js +1 -1
  275. package/.next-prod/server/app/api/session/[sessionId]/history/route.js.nft.json +1 -1
  276. package/.next-prod/server/app/api/session/[sessionId]/turn/route.js +2 -2
  277. package/.next-prod/server/app/api/session/[sessionId]/turn/route.js.nft.json +1 -1
  278. package/.next-prod/server/app/api/session/user-messages/route.js +1 -1
  279. package/.next-prod/server/app/api/session/user-messages/route.js.nft.json +1 -1
  280. package/.next-prod/server/app/api/session-by-path/route.js +1 -1
  281. package/.next-prod/server/app/api/session-by-path/route.js.nft.json +1 -1
  282. package/.next-prod/server/app/api/sessions/delegate/route.js +1 -1
  283. package/.next-prod/server/app/api/sessions/delegate/route.js.nft.json +1 -1
  284. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js +1 -1
  285. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js.nft.json +1 -1
  286. package/.next-prod/server/app/api/sessions/projects/route.js +1 -1
  287. package/.next-prod/server/app/api/sessions/projects/route.js.nft.json +1 -1
  288. package/.next-prod/server/app/api/sessions/route.js +1 -1
  289. package/.next-prod/server/app/api/sessions/route.js.nft.json +1 -1
  290. package/.next-prod/server/app/api/sessions/search/route.js +1 -1
  291. package/.next-prod/server/app/api/sessions/search/route.js.nft.json +1 -1
  292. package/.next-prod/server/app/api/sessions/status/route.js +1 -1
  293. package/.next-prod/server/app/api/sessions/status/route.js.nft.json +1 -1
  294. package/.next-prod/server/app/api/settings/route.js +1 -1
  295. package/.next-prod/server/app/api/settings/route.js.nft.json +1 -1
  296. package/.next-prod/server/app/api/shutdown/route.js +1 -1
  297. package/.next-prod/server/app/api/shutdown/route.js.nft.json +1 -1
  298. package/.next-prod/server/app/api/skills/[id]/route.js +1 -1
  299. package/.next-prod/server/app/api/skills/[id]/route.js.nft.json +1 -1
  300. package/.next-prod/server/app/api/skills/content/route.js +1 -1
  301. package/.next-prod/server/app/api/skills/content/route.js.nft.json +1 -1
  302. package/.next-prod/server/app/api/skills/route.js +1 -1
  303. package/.next-prod/server/app/api/skills/route.js.nft.json +1 -1
  304. package/.next-prod/server/app/api/snapshots/blob/route.js +1 -1
  305. package/.next-prod/server/app/api/snapshots/blob/route.js.nft.json +1 -1
  306. package/.next-prod/server/app/api/snapshots/diff/route.js +1 -1
  307. package/.next-prod/server/app/api/snapshots/diff/route.js.nft.json +1 -1
  308. package/.next-prod/server/app/api/snapshots/route.js +1 -1
  309. package/.next-prod/server/app/api/snapshots/route.js.nft.json +1 -1
  310. package/.next-prod/server/app/api/terminal/aliases/route.js +1 -1
  311. package/.next-prod/server/app/api/terminal/aliases/route.js.nft.json +1 -1
  312. package/.next-prod/server/app/api/terminal/autocomplete/route.js +1 -1
  313. package/.next-prod/server/app/api/terminal/autocomplete/route.js.nft.json +1 -1
  314. package/.next-prod/server/app/api/terminal/bubble-order/route.js +1 -1
  315. package/.next-prod/server/app/api/terminal/bubble-order/route.js.nft.json +1 -1
  316. package/.next-prod/server/app/api/terminal/env/route.js +1 -1
  317. package/.next-prod/server/app/api/terminal/env/route.js.nft.json +1 -1
  318. package/.next-prod/server/app/api/terminal/history/route.js +1 -1
  319. package/.next-prod/server/app/api/terminal/history/route.js.nft.json +1 -1
  320. package/.next-prod/server/app/api/update/route.js +1 -1
  321. package/.next-prod/server/app/api/update/route.js.nft.json +1 -1
  322. package/.next-prod/server/app/api/update-state/route.js +1 -1
  323. package/.next-prod/server/app/api/update-state/route.js.nft.json +1 -1
  324. package/.next-prod/server/app/api/version/route.js +1 -1
  325. package/.next-prod/server/app/api/version/route.js.nft.json +1 -1
  326. package/.next-prod/server/app/apps/[...path]/route.js +1 -1
  327. package/.next-prod/server/app/apps/[...path]/route.js.nft.json +1 -1
  328. package/.next-prod/server/app/favicon.ico/route.js +1 -1
  329. package/.next-prod/server/app/favicon.ico/route.js.nft.json +1 -1
  330. package/.next-prod/server/app/m/page.js +1 -1
  331. package/.next-prod/server/app/m/page.js.nft.json +1 -1
  332. package/.next-prod/server/app/m/page_client-reference-manifest.js +1 -1
  333. package/.next-prod/server/app/manifest.webmanifest/route.js +2 -2
  334. package/.next-prod/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  335. package/.next-prod/server/app/page.js +1 -1
  336. package/.next-prod/server/app/page.js.nft.json +1 -1
  337. package/.next-prod/server/app/page_client-reference-manifest.js +1 -1
  338. package/.next-prod/server/app/project/page.js +1 -1
  339. package/.next-prod/server/app/project/page.js.nft.json +1 -1
  340. package/.next-prod/server/app/project/page_client-reference-manifest.js +1 -1
  341. package/.next-prod/server/app/review/[id]/page.js +1 -1
  342. package/.next-prod/server/app/review/[id]/page.js.nft.json +1 -1
  343. package/.next-prod/server/app/review/[id]/page_client-reference-manifest.js +1 -1
  344. package/.next-prod/server/app-paths-manifest.json +3 -1
  345. package/.next-prod/server/chunks/2493.js +13 -9
  346. package/.next-prod/server/chunks/{7956.js → 3354.js} +2 -2
  347. package/.next-prod/server/chunks/6495.js +1 -1
  348. package/.next-prod/server/chunks/6548.js +1 -1
  349. package/.next-prod/server/chunks/7438.js +764 -0
  350. package/.next-prod/server/chunks/{1653.js → 8022.js} +2 -2
  351. package/.next-prod/server/middleware-build-manifest.js +1 -1
  352. package/.next-prod/server/pages/404.html +2 -2
  353. package/.next-prod/server/pages/500.html +1 -1
  354. package/.next-prod/server/server-reference-manifest.json +1 -1
  355. package/.next-prod/static/O8neHUIr3dQhe1jcOUsQ8/_buildManifest.js +1 -0
  356. package/.next-prod/static/chunks/{103-1f50be74a00f89af.js → 50015-b81552adf20a6a33.js} +2 -2
  357. package/.next-prod/static/chunks/72539-049ac78fc767d177.js +17 -0
  358. package/.next-prod/static/chunks/89656-d9dd3a8559041236.js +34 -0
  359. package/.next-prod/static/chunks/99092-5b836813f4b1d4b3.js +716 -0
  360. package/.next-prod/static/chunks/app/_global-error/{page-b56c0b18a3b4d026.js → page-e2f146f38bb4df42.js} +1 -1
  361. package/.next-prod/static/chunks/app/api/agent/test/{route-b56c0b18a3b4d026.js → route-e2f146f38bb4df42.js} +1 -1
  362. package/.next-prod/static/chunks/app/api/bash/{route-b56c0b18a3b4d026.js → route-e2f146f38bb4df42.js} +1 -1
  363. package/.next-prod/static/chunks/app/api/{chat/codex/route-b56c0b18a3b4d026.js → bots/[id]/route-e2f146f38bb4df42.js} +1 -1
  364. package/.next-prod/static/chunks/app/api/bots/route-e2f146f38bb4df42.js +1 -0
  365. package/.next-prod/static/chunks/app/api/chat/codex/route-e2f146f38bb4df42.js +1 -0
  366. package/.next-prod/static/chunks/app/api/chat/deepseek/route-e2f146f38bb4df42.js +1 -0
  367. package/.next-prod/static/chunks/app/api/chat/glm/route-e2f146f38bb4df42.js +1 -0
  368. package/.next-prod/static/chunks/app/api/chat/kimi/route-e2f146f38bb4df42.js +1 -0
  369. package/.next-prod/static/chunks/app/api/chat/ollama/route-e2f146f38bb4df42.js +1 -0
  370. package/.next-prod/static/chunks/app/api/chat/route-e2f146f38bb4df42.js +1 -0
  371. package/.next-prod/static/chunks/app/api/chat/stop/route-e2f146f38bb4df42.js +1 -0
  372. package/.next-prod/static/chunks/app/api/claude-stats/route-e2f146f38bb4df42.js +1 -0
  373. package/.next-prod/static/chunks/app/api/commands/route-e2f146f38bb4df42.js +1 -0
  374. package/.next-prod/static/chunks/app/api/comments/route-e2f146f38bb4df42.js +1 -0
  375. package/.next-prod/static/chunks/app/api/db/columns/route-e2f146f38bb4df42.js +1 -0
  376. package/.next-prod/static/chunks/app/api/db/connect/route-e2f146f38bb4df42.js +1 -0
  377. package/.next-prod/static/chunks/app/api/db/disconnect/route-e2f146f38bb4df42.js +1 -0
  378. package/.next-prod/static/chunks/app/api/db/export/route-e2f146f38bb4df42.js +1 -0
  379. package/.next-prod/static/chunks/app/api/db/query/route-e2f146f38bb4df42.js +1 -0
  380. package/.next-prod/static/chunks/app/api/db/schemas/route-e2f146f38bb4df42.js +1 -0
  381. package/.next-prod/static/chunks/app/api/deepseek/balance/route-e2f146f38bb4df42.js +1 -0
  382. package/.next-prod/static/chunks/app/api/deepseek/credentials/route-e2f146f38bb4df42.js +1 -0
  383. package/.next-prod/static/chunks/app/api/deepseek/models/route-e2f146f38bb4df42.js +1 -0
  384. package/.next-prod/static/chunks/app/api/dev/spans/route-e2f146f38bb4df42.js +1 -0
  385. package/.next-prod/static/chunks/app/api/extension/version/route-e2f146f38bb4df42.js +1 -0
  386. package/.next-prod/static/chunks/app/api/file/route-e2f146f38bb4df42.js +1 -0
  387. package/.next-prod/static/chunks/app/api/files/blame/route-e2f146f38bb4df42.js +1 -0
  388. package/.next-prod/static/chunks/app/api/files/clipboard/route-e2f146f38bb4df42.js +1 -0
  389. package/.next-prod/static/chunks/app/api/files/copy/route-e2f146f38bb4df42.js +1 -0
  390. package/.next-prod/static/chunks/app/api/files/delete/route-e2f146f38bb4df42.js +1 -0
  391. package/.next-prod/static/chunks/app/api/files/expanded/route-e2f146f38bb4df42.js +1 -0
  392. package/.next-prod/static/chunks/app/api/files/index/route-e2f146f38bb4df42.js +1 -0
  393. package/.next-prod/static/chunks/app/api/files/init/route-e2f146f38bb4df42.js +1 -0
  394. package/.next-prod/static/chunks/app/api/files/paste/route-e2f146f38bb4df42.js +1 -0
  395. package/.next-prod/static/chunks/app/api/files/read/route-e2f146f38bb4df42.js +1 -0
  396. package/.next-prod/static/chunks/app/api/files/readdir/route-e2f146f38bb4df42.js +1 -0
  397. package/.next-prod/static/chunks/app/api/files/recent/route-e2f146f38bb4df42.js +1 -0
  398. package/.next-prod/static/chunks/app/api/files/save/route-e2f146f38bb4df42.js +1 -0
  399. package/.next-prod/static/chunks/app/api/files/search/route-e2f146f38bb4df42.js +1 -0
  400. package/.next-prod/static/chunks/app/api/files/stat/route-e2f146f38bb4df42.js +1 -0
  401. package/.next-prod/static/chunks/app/api/files/text/route-e2f146f38bb4df42.js +1 -0
  402. package/.next-prod/static/chunks/app/api/git/blob/route-e2f146f38bb4df42.js +1 -0
  403. package/.next-prod/static/chunks/app/api/git/branch-diff/route-e2f146f38bb4df42.js +1 -0
  404. package/.next-prod/static/chunks/app/api/git/branches/route-e2f146f38bb4df42.js +1 -0
  405. package/.next-prod/static/chunks/app/api/git/commit-diff/route-e2f146f38bb4df42.js +1 -0
  406. package/.next-prod/static/chunks/app/api/git/commits/route-e2f146f38bb4df42.js +1 -0
  407. package/.next-prod/static/chunks/app/api/git/current-branch/route-e2f146f38bb4df42.js +1 -0
  408. package/.next-prod/static/chunks/app/api/git/diff/route-e2f146f38bb4df42.js +1 -0
  409. package/.next-prod/static/chunks/app/api/git/discard/route-e2f146f38bb4df42.js +1 -0
  410. package/.next-prod/static/chunks/app/api/git/stage/route-e2f146f38bb4df42.js +1 -0
  411. package/.next-prod/static/chunks/app/api/git/status/route-e2f146f38bb4df42.js +1 -0
  412. package/.next-prod/static/chunks/app/api/git/unstage/route-e2f146f38bb4df42.js +1 -0
  413. package/.next-prod/static/chunks/app/api/git/worktree/route-e2f146f38bb4df42.js +1 -0
  414. package/.next-prod/static/chunks/app/api/glm/credentials/route-e2f146f38bb4df42.js +1 -0
  415. package/.next-prod/static/chunks/app/api/glm/models/route-e2f146f38bb4df42.js +1 -0
  416. package/.next-prod/static/chunks/app/api/glm/usage/route-e2f146f38bb4df42.js +1 -0
  417. package/.next-prod/static/chunks/app/api/global-state/route-e2f146f38bb4df42.js +1 -0
  418. package/.next-prod/static/chunks/app/api/health/route-e2f146f38bb4df42.js +1 -0
  419. package/.next-prod/static/chunks/app/api/html-apps/[id]/route-e2f146f38bb4df42.js +1 -0
  420. package/.next-prod/static/chunks/app/api/html-apps/route-e2f146f38bb4df42.js +1 -0
  421. package/.next-prod/static/chunks/app/api/instructions/config/route-e2f146f38bb4df42.js +1 -0
  422. package/.next-prod/static/chunks/app/api/kimi/credentials/route-e2f146f38bb4df42.js +1 -0
  423. package/.next-prod/static/chunks/app/api/kimi/models/route-e2f146f38bb4df42.js +1 -0
  424. package/.next-prod/static/chunks/app/api/kimi/usage/route-e2f146f38bb4df42.js +1 -0
  425. package/.next-prod/static/chunks/app/api/lsp/definition/route-e2f146f38bb4df42.js +1 -0
  426. package/.next-prod/static/chunks/app/api/lsp/hover/route-e2f146f38bb4df42.js +1 -0
  427. package/.next-prod/static/chunks/app/api/lsp/references/route-e2f146f38bb4df42.js +1 -0
  428. package/.next-prod/static/chunks/app/api/lsp/status/route-e2f146f38bb4df42.js +1 -0
  429. package/.next-prod/static/chunks/app/api/lsp/warmup/route-e2f146f38bb4df42.js +1 -0
  430. package/.next-prod/static/chunks/app/api/mysql/columns/route-e2f146f38bb4df42.js +1 -0
  431. package/.next-prod/static/chunks/app/api/mysql/connect/route-e2f146f38bb4df42.js +1 -0
  432. package/.next-prod/static/chunks/app/api/mysql/disconnect/route-e2f146f38bb4df42.js +1 -0
  433. package/.next-prod/static/chunks/app/api/mysql/export/route-e2f146f38bb4df42.js +1 -0
  434. package/.next-prod/static/chunks/app/api/mysql/query/route-e2f146f38bb4df42.js +1 -0
  435. package/.next-prod/static/chunks/app/api/mysql/schemas/route-e2f146f38bb4df42.js +1 -0
  436. package/.next-prod/static/chunks/app/api/neo4j/connect/route-e2f146f38bb4df42.js +1 -0
  437. package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-e2f146f38bb4df42.js +1 -0
  438. package/.next-prod/static/chunks/app/api/neo4j/query/route-e2f146f38bb4df42.js +1 -0
  439. package/.next-prod/static/chunks/app/api/neo4j/schema/route-e2f146f38bb4df42.js +1 -0
  440. package/.next-prod/static/chunks/app/api/note/route-e2f146f38bb4df42.js +1 -0
  441. package/.next-prod/static/chunks/app/api/ollama/config/route-e2f146f38bb4df42.js +1 -0
  442. package/.next-prod/static/chunks/app/api/ollama/models/route-e2f146f38bb4df42.js +1 -0
  443. package/.next-prod/static/chunks/app/api/ollama/start/route-e2f146f38bb4df42.js +1 -0
  444. package/.next-prod/static/chunks/app/api/open-cursor/route-e2f146f38bb4df42.js +1 -0
  445. package/.next-prod/static/chunks/app/api/open-vscode/route-e2f146f38bb4df42.js +1 -0
  446. package/.next-prod/static/chunks/app/api/pick-folder/route-e2f146f38bb4df42.js +1 -0
  447. package/.next-prod/static/chunks/app/api/pinned-sessions/route-e2f146f38bb4df42.js +1 -0
  448. package/.next-prod/static/chunks/app/api/project-settings/route-e2f146f38bb4df42.js +1 -0
  449. package/.next-prod/static/chunks/app/api/project-state/route-e2f146f38bb4df42.js +1 -0
  450. package/.next-prod/static/chunks/app/api/projectGraph/affected/route-e2f146f38bb4df42.js +1 -0
  451. package/.next-prod/static/chunks/app/api/projectGraph/callees/route-e2f146f38bb4df42.js +1 -0
  452. package/.next-prod/static/chunks/app/api/projectGraph/callers/route-e2f146f38bb4df42.js +1 -0
  453. package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-e2f146f38bb4df42.js +1 -0
  454. package/.next-prod/static/chunks/app/api/projectGraph/context/route-e2f146f38bb4df42.js +1 -0
  455. package/.next-prod/static/chunks/app/api/projectGraph/file/route-e2f146f38bb4df42.js +1 -0
  456. package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-e2f146f38bb4df42.js +1 -0
  457. package/.next-prod/static/chunks/app/api/projectGraph/impact/route-e2f146f38bb4df42.js +1 -0
  458. package/.next-prod/static/chunks/app/api/projectGraph/related/route-e2f146f38bb4df42.js +1 -0
  459. package/.next-prod/static/chunks/app/api/projectGraph/risk/route-e2f146f38bb4df42.js +1 -0
  460. package/.next-prod/static/chunks/app/api/projectGraph/search/route-e2f146f38bb4df42.js +1 -0
  461. package/.next-prod/static/chunks/app/api/projects/route-e2f146f38bb4df42.js +1 -0
  462. package/.next-prod/static/chunks/app/api/push/public-key/route-e2f146f38bb4df42.js +1 -0
  463. package/.next-prod/static/chunks/app/api/push/subscribe/route-e2f146f38bb4df42.js +1 -0
  464. package/.next-prod/static/chunks/app/api/push/unsubscribe/route-e2f146f38bb4df42.js +1 -0
  465. package/.next-prod/static/chunks/app/api/redis/command/route-e2f146f38bb4df42.js +1 -0
  466. package/.next-prod/static/chunks/app/api/redis/connect/route-e2f146f38bb4df42.js +1 -0
  467. package/.next-prod/static/chunks/app/api/redis/delete/route-e2f146f38bb4df42.js +1 -0
  468. package/.next-prod/static/chunks/app/api/redis/disconnect/route-e2f146f38bb4df42.js +1 -0
  469. package/.next-prod/static/chunks/app/api/redis/get/route-e2f146f38bb4df42.js +1 -0
  470. package/.next-prod/static/chunks/app/api/redis/keys/route-e2f146f38bb4df42.js +1 -0
  471. package/.next-prod/static/chunks/app/api/redis/set/route-e2f146f38bb4df42.js +1 -0
  472. package/.next-prod/static/chunks/app/api/restart/route-e2f146f38bb4df42.js +1 -0
  473. package/.next-prod/static/chunks/app/api/review/[id]/comments/route-e2f146f38bb4df42.js +1 -0
  474. package/.next-prod/static/chunks/app/api/review/[id]/replies/route-e2f146f38bb4df42.js +1 -0
  475. package/.next-prod/static/chunks/app/api/review/[id]/route-e2f146f38bb4df42.js +1 -0
  476. package/.next-prod/static/chunks/app/api/review/identify/route-e2f146f38bb4df42.js +1 -0
  477. package/.next-prod/static/chunks/app/api/review/order/route-e2f146f38bb4df42.js +1 -0
  478. package/.next-prod/static/chunks/app/api/review/route-e2f146f38bb4df42.js +1 -0
  479. package/.next-prod/static/chunks/app/api/review/share-info/route-e2f146f38bb4df42.js +1 -0
  480. package/.next-prod/static/chunks/app/api/review/users/route-e2f146f38bb4df42.js +1 -0
  481. package/.next-prod/static/chunks/app/api/scheduled-tasks/route-e2f146f38bb4df42.js +1 -0
  482. package/.next-prod/static/chunks/app/api/services/config/route-e2f146f38bb4df42.js +1 -0
  483. package/.next-prod/static/chunks/app/api/services/scripts/route-e2f146f38bb4df42.js +1 -0
  484. package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-e2f146f38bb4df42.js +1 -0
  485. package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-e2f146f38bb4df42.js +1 -0
  486. package/.next-prod/static/chunks/app/api/session/[sessionId]/turn/route-e2f146f38bb4df42.js +1 -0
  487. package/.next-prod/static/chunks/app/api/session/user-messages/route-e2f146f38bb4df42.js +1 -0
  488. package/.next-prod/static/chunks/app/api/session-by-path/route-e2f146f38bb4df42.js +1 -0
  489. package/.next-prod/static/chunks/app/api/sessions/delegate/route-e2f146f38bb4df42.js +1 -0
  490. package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-e2f146f38bb4df42.js +1 -0
  491. package/.next-prod/static/chunks/app/api/sessions/projects/route-e2f146f38bb4df42.js +1 -0
  492. package/.next-prod/static/chunks/app/api/sessions/route-e2f146f38bb4df42.js +1 -0
  493. package/.next-prod/static/chunks/app/api/sessions/search/route-e2f146f38bb4df42.js +1 -0
  494. package/.next-prod/static/chunks/app/api/sessions/status/route-e2f146f38bb4df42.js +1 -0
  495. package/.next-prod/static/chunks/app/api/settings/route-e2f146f38bb4df42.js +1 -0
  496. package/.next-prod/static/chunks/app/api/shutdown/route-e2f146f38bb4df42.js +1 -0
  497. package/.next-prod/static/chunks/app/api/skills/[id]/route-e2f146f38bb4df42.js +1 -0
  498. package/.next-prod/static/chunks/app/api/skills/content/route-e2f146f38bb4df42.js +1 -0
  499. package/.next-prod/static/chunks/app/api/skills/route-e2f146f38bb4df42.js +1 -0
  500. package/.next-prod/static/chunks/app/api/snapshots/blob/route-e2f146f38bb4df42.js +1 -0
  501. package/.next-prod/static/chunks/app/api/snapshots/diff/route-e2f146f38bb4df42.js +1 -0
  502. package/.next-prod/static/chunks/app/api/snapshots/route-e2f146f38bb4df42.js +1 -0
  503. package/.next-prod/static/chunks/app/api/terminal/aliases/route-e2f146f38bb4df42.js +1 -0
  504. package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-e2f146f38bb4df42.js +1 -0
  505. package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-e2f146f38bb4df42.js +1 -0
  506. package/.next-prod/static/chunks/app/api/terminal/env/route-e2f146f38bb4df42.js +1 -0
  507. package/.next-prod/static/chunks/app/api/terminal/history/route-e2f146f38bb4df42.js +1 -0
  508. package/.next-prod/static/chunks/app/api/update/route-e2f146f38bb4df42.js +1 -0
  509. package/.next-prod/static/chunks/app/api/update-state/route-e2f146f38bb4df42.js +1 -0
  510. package/.next-prod/static/chunks/app/api/version/route-e2f146f38bb4df42.js +1 -0
  511. package/.next-prod/static/chunks/app/apps/[...path]/route-e2f146f38bb4df42.js +1 -0
  512. package/.next-prod/static/chunks/app/layout-347ca1b3228d5b23.js +1 -0
  513. package/.next-prod/static/chunks/app/manifest.webmanifest/route-e2f146f38bb4df42.js +1 -0
  514. package/.next-prod/static/chunks/app/page-2ade7ecd21636624.js +1 -0
  515. package/.next-prod/static/chunks/app/project/page-2ade7ecd21636624.js +1 -0
  516. package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-e2f146f38bb4df42.js +1 -0
  517. package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-e2f146f38bb4df42.js +1 -0
  518. package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-e2f146f38bb4df42.js +1 -0
  519. package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-e2f146f38bb4df42.js +1 -0
  520. package/.next-prod/static/css/7a02a222d1299650.css +1 -0
  521. package/.next-prod/trace +15 -15
  522. package/.next-prod/trace-build +1 -1
  523. package/.next-prod/types/app/api/bots/[id]/route.ts +353 -0
  524. package/.next-prod/types/app/api/bots/route.ts +353 -0
  525. package/.next-prod/types/routes.d.ts +3 -1
  526. package/.next-prod/types/validator.ts +18 -0
  527. package/README.md +13 -0
  528. package/README.zh.md +13 -0
  529. package/bots/README.md +86 -0
  530. package/bots/cockpit-helper/BOT.md +95 -0
  531. package/bots/cockpit-helper/commitments/active.md +3 -0
  532. package/bots/cockpit-helper/evidence/refs.md +3 -0
  533. package/bots/cockpit-helper/identity/persona.md +25 -0
  534. package/bots/cockpit-helper/identity/principles.md +49 -0
  535. package/bots/cockpit-helper/memory/facts.md +3 -0
  536. package/bots/cockpit-helper/relationships/user.md +3 -0
  537. package/dist/{chunk-JJWVBF6H.mjs → chunk-BCWVTDEZ.mjs} +648 -140
  538. package/dist/{chunk-6R4AHIIV.mjs → chunk-QY2K7YIF.mjs} +1 -1
  539. package/dist/httpApi.mjs +2 -2
  540. package/dist/scheduledTasks.mjs +80 -14
  541. package/dist/wsServer.mjs +2 -2
  542. package/package.json +2 -1
  543. package/skills/README.md +18 -2
  544. package/skills/bot/SKILL.md +155 -0
  545. package/skills/bot-run/SKILL.md +214 -0
  546. package/skills/bot-turn/SKILL.md +99 -0
  547. package/skills/bot-turn/attach.md +45 -0
  548. package/skills/bot-turn/export.md +113 -0
  549. package/skills/bot-turn/review.md +101 -0
  550. package/skills/bot-turn/writing.md +110 -0
  551. package/.next-prod/server/chunks/5750.js +0 -762
  552. package/.next-prod/static/chunks/72539-7e4ca2de5c9f3f90.js +0 -17
  553. package/.next-prod/static/chunks/89656-bc48af1f9ee9c312.js +0 -32
  554. package/.next-prod/static/chunks/99092-36ee2c49e4c4c059.js +0 -716
  555. package/.next-prod/static/chunks/app/api/chat/deepseek/route-b56c0b18a3b4d026.js +0 -1
  556. package/.next-prod/static/chunks/app/api/chat/glm/route-b56c0b18a3b4d026.js +0 -1
  557. package/.next-prod/static/chunks/app/api/chat/kimi/route-b56c0b18a3b4d026.js +0 -1
  558. package/.next-prod/static/chunks/app/api/chat/ollama/route-b56c0b18a3b4d026.js +0 -1
  559. package/.next-prod/static/chunks/app/api/chat/route-b56c0b18a3b4d026.js +0 -1
  560. package/.next-prod/static/chunks/app/api/chat/stop/route-b56c0b18a3b4d026.js +0 -1
  561. package/.next-prod/static/chunks/app/api/claude-stats/route-b56c0b18a3b4d026.js +0 -1
  562. package/.next-prod/static/chunks/app/api/commands/route-b56c0b18a3b4d026.js +0 -1
  563. package/.next-prod/static/chunks/app/api/comments/route-b56c0b18a3b4d026.js +0 -1
  564. package/.next-prod/static/chunks/app/api/db/columns/route-b56c0b18a3b4d026.js +0 -1
  565. package/.next-prod/static/chunks/app/api/db/connect/route-b56c0b18a3b4d026.js +0 -1
  566. package/.next-prod/static/chunks/app/api/db/disconnect/route-b56c0b18a3b4d026.js +0 -1
  567. package/.next-prod/static/chunks/app/api/db/export/route-b56c0b18a3b4d026.js +0 -1
  568. package/.next-prod/static/chunks/app/api/db/query/route-b56c0b18a3b4d026.js +0 -1
  569. package/.next-prod/static/chunks/app/api/db/schemas/route-b56c0b18a3b4d026.js +0 -1
  570. package/.next-prod/static/chunks/app/api/deepseek/balance/route-b56c0b18a3b4d026.js +0 -1
  571. package/.next-prod/static/chunks/app/api/deepseek/credentials/route-b56c0b18a3b4d026.js +0 -1
  572. package/.next-prod/static/chunks/app/api/deepseek/models/route-b56c0b18a3b4d026.js +0 -1
  573. package/.next-prod/static/chunks/app/api/dev/spans/route-b56c0b18a3b4d026.js +0 -1
  574. package/.next-prod/static/chunks/app/api/extension/version/route-b56c0b18a3b4d026.js +0 -1
  575. package/.next-prod/static/chunks/app/api/file/route-b56c0b18a3b4d026.js +0 -1
  576. package/.next-prod/static/chunks/app/api/files/blame/route-b56c0b18a3b4d026.js +0 -1
  577. package/.next-prod/static/chunks/app/api/files/clipboard/route-b56c0b18a3b4d026.js +0 -1
  578. package/.next-prod/static/chunks/app/api/files/copy/route-b56c0b18a3b4d026.js +0 -1
  579. package/.next-prod/static/chunks/app/api/files/delete/route-b56c0b18a3b4d026.js +0 -1
  580. package/.next-prod/static/chunks/app/api/files/expanded/route-b56c0b18a3b4d026.js +0 -1
  581. package/.next-prod/static/chunks/app/api/files/index/route-b56c0b18a3b4d026.js +0 -1
  582. package/.next-prod/static/chunks/app/api/files/init/route-b56c0b18a3b4d026.js +0 -1
  583. package/.next-prod/static/chunks/app/api/files/paste/route-b56c0b18a3b4d026.js +0 -1
  584. package/.next-prod/static/chunks/app/api/files/read/route-b56c0b18a3b4d026.js +0 -1
  585. package/.next-prod/static/chunks/app/api/files/readdir/route-b56c0b18a3b4d026.js +0 -1
  586. package/.next-prod/static/chunks/app/api/files/recent/route-b56c0b18a3b4d026.js +0 -1
  587. package/.next-prod/static/chunks/app/api/files/save/route-b56c0b18a3b4d026.js +0 -1
  588. package/.next-prod/static/chunks/app/api/files/search/route-b56c0b18a3b4d026.js +0 -1
  589. package/.next-prod/static/chunks/app/api/files/stat/route-b56c0b18a3b4d026.js +0 -1
  590. package/.next-prod/static/chunks/app/api/files/text/route-b56c0b18a3b4d026.js +0 -1
  591. package/.next-prod/static/chunks/app/api/git/blob/route-b56c0b18a3b4d026.js +0 -1
  592. package/.next-prod/static/chunks/app/api/git/branch-diff/route-b56c0b18a3b4d026.js +0 -1
  593. package/.next-prod/static/chunks/app/api/git/branches/route-b56c0b18a3b4d026.js +0 -1
  594. package/.next-prod/static/chunks/app/api/git/commit-diff/route-b56c0b18a3b4d026.js +0 -1
  595. package/.next-prod/static/chunks/app/api/git/commits/route-b56c0b18a3b4d026.js +0 -1
  596. package/.next-prod/static/chunks/app/api/git/current-branch/route-b56c0b18a3b4d026.js +0 -1
  597. package/.next-prod/static/chunks/app/api/git/diff/route-b56c0b18a3b4d026.js +0 -1
  598. package/.next-prod/static/chunks/app/api/git/discard/route-b56c0b18a3b4d026.js +0 -1
  599. package/.next-prod/static/chunks/app/api/git/stage/route-b56c0b18a3b4d026.js +0 -1
  600. package/.next-prod/static/chunks/app/api/git/status/route-b56c0b18a3b4d026.js +0 -1
  601. package/.next-prod/static/chunks/app/api/git/unstage/route-b56c0b18a3b4d026.js +0 -1
  602. package/.next-prod/static/chunks/app/api/git/worktree/route-b56c0b18a3b4d026.js +0 -1
  603. package/.next-prod/static/chunks/app/api/glm/credentials/route-b56c0b18a3b4d026.js +0 -1
  604. package/.next-prod/static/chunks/app/api/glm/models/route-b56c0b18a3b4d026.js +0 -1
  605. package/.next-prod/static/chunks/app/api/glm/usage/route-b56c0b18a3b4d026.js +0 -1
  606. package/.next-prod/static/chunks/app/api/global-state/route-b56c0b18a3b4d026.js +0 -1
  607. package/.next-prod/static/chunks/app/api/health/route-b56c0b18a3b4d026.js +0 -1
  608. package/.next-prod/static/chunks/app/api/html-apps/[id]/route-b56c0b18a3b4d026.js +0 -1
  609. package/.next-prod/static/chunks/app/api/html-apps/route-b56c0b18a3b4d026.js +0 -1
  610. package/.next-prod/static/chunks/app/api/instructions/config/route-b56c0b18a3b4d026.js +0 -1
  611. package/.next-prod/static/chunks/app/api/kimi/credentials/route-b56c0b18a3b4d026.js +0 -1
  612. package/.next-prod/static/chunks/app/api/kimi/models/route-b56c0b18a3b4d026.js +0 -1
  613. package/.next-prod/static/chunks/app/api/kimi/usage/route-b56c0b18a3b4d026.js +0 -1
  614. package/.next-prod/static/chunks/app/api/lsp/definition/route-b56c0b18a3b4d026.js +0 -1
  615. package/.next-prod/static/chunks/app/api/lsp/hover/route-b56c0b18a3b4d026.js +0 -1
  616. package/.next-prod/static/chunks/app/api/lsp/references/route-b56c0b18a3b4d026.js +0 -1
  617. package/.next-prod/static/chunks/app/api/lsp/status/route-b56c0b18a3b4d026.js +0 -1
  618. package/.next-prod/static/chunks/app/api/lsp/warmup/route-b56c0b18a3b4d026.js +0 -1
  619. package/.next-prod/static/chunks/app/api/mysql/columns/route-b56c0b18a3b4d026.js +0 -1
  620. package/.next-prod/static/chunks/app/api/mysql/connect/route-b56c0b18a3b4d026.js +0 -1
  621. package/.next-prod/static/chunks/app/api/mysql/disconnect/route-b56c0b18a3b4d026.js +0 -1
  622. package/.next-prod/static/chunks/app/api/mysql/export/route-b56c0b18a3b4d026.js +0 -1
  623. package/.next-prod/static/chunks/app/api/mysql/query/route-b56c0b18a3b4d026.js +0 -1
  624. package/.next-prod/static/chunks/app/api/mysql/schemas/route-b56c0b18a3b4d026.js +0 -1
  625. package/.next-prod/static/chunks/app/api/neo4j/connect/route-b56c0b18a3b4d026.js +0 -1
  626. package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-b56c0b18a3b4d026.js +0 -1
  627. package/.next-prod/static/chunks/app/api/neo4j/query/route-b56c0b18a3b4d026.js +0 -1
  628. package/.next-prod/static/chunks/app/api/neo4j/schema/route-b56c0b18a3b4d026.js +0 -1
  629. package/.next-prod/static/chunks/app/api/note/route-b56c0b18a3b4d026.js +0 -1
  630. package/.next-prod/static/chunks/app/api/ollama/config/route-b56c0b18a3b4d026.js +0 -1
  631. package/.next-prod/static/chunks/app/api/ollama/models/route-b56c0b18a3b4d026.js +0 -1
  632. package/.next-prod/static/chunks/app/api/ollama/start/route-b56c0b18a3b4d026.js +0 -1
  633. package/.next-prod/static/chunks/app/api/open-cursor/route-b56c0b18a3b4d026.js +0 -1
  634. package/.next-prod/static/chunks/app/api/open-vscode/route-b56c0b18a3b4d026.js +0 -1
  635. package/.next-prod/static/chunks/app/api/pick-folder/route-b56c0b18a3b4d026.js +0 -1
  636. package/.next-prod/static/chunks/app/api/pinned-sessions/route-b56c0b18a3b4d026.js +0 -1
  637. package/.next-prod/static/chunks/app/api/project-settings/route-b56c0b18a3b4d026.js +0 -1
  638. package/.next-prod/static/chunks/app/api/project-state/route-b56c0b18a3b4d026.js +0 -1
  639. package/.next-prod/static/chunks/app/api/projectGraph/affected/route-b56c0b18a3b4d026.js +0 -1
  640. package/.next-prod/static/chunks/app/api/projectGraph/callees/route-b56c0b18a3b4d026.js +0 -1
  641. package/.next-prod/static/chunks/app/api/projectGraph/callers/route-b56c0b18a3b4d026.js +0 -1
  642. package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-b56c0b18a3b4d026.js +0 -1
  643. package/.next-prod/static/chunks/app/api/projectGraph/context/route-b56c0b18a3b4d026.js +0 -1
  644. package/.next-prod/static/chunks/app/api/projectGraph/file/route-b56c0b18a3b4d026.js +0 -1
  645. package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-b56c0b18a3b4d026.js +0 -1
  646. package/.next-prod/static/chunks/app/api/projectGraph/impact/route-b56c0b18a3b4d026.js +0 -1
  647. package/.next-prod/static/chunks/app/api/projectGraph/related/route-b56c0b18a3b4d026.js +0 -1
  648. package/.next-prod/static/chunks/app/api/projectGraph/risk/route-b56c0b18a3b4d026.js +0 -1
  649. package/.next-prod/static/chunks/app/api/projectGraph/search/route-b56c0b18a3b4d026.js +0 -1
  650. package/.next-prod/static/chunks/app/api/projects/route-b56c0b18a3b4d026.js +0 -1
  651. package/.next-prod/static/chunks/app/api/push/public-key/route-b56c0b18a3b4d026.js +0 -1
  652. package/.next-prod/static/chunks/app/api/push/subscribe/route-b56c0b18a3b4d026.js +0 -1
  653. package/.next-prod/static/chunks/app/api/push/unsubscribe/route-b56c0b18a3b4d026.js +0 -1
  654. package/.next-prod/static/chunks/app/api/redis/command/route-b56c0b18a3b4d026.js +0 -1
  655. package/.next-prod/static/chunks/app/api/redis/connect/route-b56c0b18a3b4d026.js +0 -1
  656. package/.next-prod/static/chunks/app/api/redis/delete/route-b56c0b18a3b4d026.js +0 -1
  657. package/.next-prod/static/chunks/app/api/redis/disconnect/route-b56c0b18a3b4d026.js +0 -1
  658. package/.next-prod/static/chunks/app/api/redis/get/route-b56c0b18a3b4d026.js +0 -1
  659. package/.next-prod/static/chunks/app/api/redis/keys/route-b56c0b18a3b4d026.js +0 -1
  660. package/.next-prod/static/chunks/app/api/redis/set/route-b56c0b18a3b4d026.js +0 -1
  661. package/.next-prod/static/chunks/app/api/restart/route-b56c0b18a3b4d026.js +0 -1
  662. package/.next-prod/static/chunks/app/api/review/[id]/comments/route-b56c0b18a3b4d026.js +0 -1
  663. package/.next-prod/static/chunks/app/api/review/[id]/replies/route-b56c0b18a3b4d026.js +0 -1
  664. package/.next-prod/static/chunks/app/api/review/[id]/route-b56c0b18a3b4d026.js +0 -1
  665. package/.next-prod/static/chunks/app/api/review/identify/route-b56c0b18a3b4d026.js +0 -1
  666. package/.next-prod/static/chunks/app/api/review/order/route-b56c0b18a3b4d026.js +0 -1
  667. package/.next-prod/static/chunks/app/api/review/route-b56c0b18a3b4d026.js +0 -1
  668. package/.next-prod/static/chunks/app/api/review/share-info/route-b56c0b18a3b4d026.js +0 -1
  669. package/.next-prod/static/chunks/app/api/review/users/route-b56c0b18a3b4d026.js +0 -1
  670. package/.next-prod/static/chunks/app/api/scheduled-tasks/route-b56c0b18a3b4d026.js +0 -1
  671. package/.next-prod/static/chunks/app/api/services/config/route-b56c0b18a3b4d026.js +0 -1
  672. package/.next-prod/static/chunks/app/api/services/scripts/route-b56c0b18a3b4d026.js +0 -1
  673. package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-b56c0b18a3b4d026.js +0 -1
  674. package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-b56c0b18a3b4d026.js +0 -1
  675. package/.next-prod/static/chunks/app/api/session/[sessionId]/turn/route-b56c0b18a3b4d026.js +0 -1
  676. package/.next-prod/static/chunks/app/api/session/user-messages/route-b56c0b18a3b4d026.js +0 -1
  677. package/.next-prod/static/chunks/app/api/session-by-path/route-b56c0b18a3b4d026.js +0 -1
  678. package/.next-prod/static/chunks/app/api/sessions/delegate/route-b56c0b18a3b4d026.js +0 -1
  679. package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-b56c0b18a3b4d026.js +0 -1
  680. package/.next-prod/static/chunks/app/api/sessions/projects/route-b56c0b18a3b4d026.js +0 -1
  681. package/.next-prod/static/chunks/app/api/sessions/route-b56c0b18a3b4d026.js +0 -1
  682. package/.next-prod/static/chunks/app/api/sessions/search/route-b56c0b18a3b4d026.js +0 -1
  683. package/.next-prod/static/chunks/app/api/sessions/status/route-b56c0b18a3b4d026.js +0 -1
  684. package/.next-prod/static/chunks/app/api/settings/route-b56c0b18a3b4d026.js +0 -1
  685. package/.next-prod/static/chunks/app/api/shutdown/route-b56c0b18a3b4d026.js +0 -1
  686. package/.next-prod/static/chunks/app/api/skills/[id]/route-b56c0b18a3b4d026.js +0 -1
  687. package/.next-prod/static/chunks/app/api/skills/content/route-b56c0b18a3b4d026.js +0 -1
  688. package/.next-prod/static/chunks/app/api/skills/route-b56c0b18a3b4d026.js +0 -1
  689. package/.next-prod/static/chunks/app/api/snapshots/blob/route-b56c0b18a3b4d026.js +0 -1
  690. package/.next-prod/static/chunks/app/api/snapshots/diff/route-b56c0b18a3b4d026.js +0 -1
  691. package/.next-prod/static/chunks/app/api/snapshots/route-b56c0b18a3b4d026.js +0 -1
  692. package/.next-prod/static/chunks/app/api/terminal/aliases/route-b56c0b18a3b4d026.js +0 -1
  693. package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-b56c0b18a3b4d026.js +0 -1
  694. package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-b56c0b18a3b4d026.js +0 -1
  695. package/.next-prod/static/chunks/app/api/terminal/env/route-b56c0b18a3b4d026.js +0 -1
  696. package/.next-prod/static/chunks/app/api/terminal/history/route-b56c0b18a3b4d026.js +0 -1
  697. package/.next-prod/static/chunks/app/api/update/route-b56c0b18a3b4d026.js +0 -1
  698. package/.next-prod/static/chunks/app/api/update-state/route-b56c0b18a3b4d026.js +0 -1
  699. package/.next-prod/static/chunks/app/api/version/route-b56c0b18a3b4d026.js +0 -1
  700. package/.next-prod/static/chunks/app/apps/[...path]/route-b56c0b18a3b4d026.js +0 -1
  701. package/.next-prod/static/chunks/app/layout-5e8ca15dabb4d8c2.js +0 -1
  702. package/.next-prod/static/chunks/app/manifest.webmanifest/route-b56c0b18a3b4d026.js +0 -1
  703. package/.next-prod/static/chunks/app/page-eb7a11e6dd6a9e94.js +0 -1
  704. package/.next-prod/static/chunks/app/project/page-eb7a11e6dd6a9e94.js +0 -1
  705. package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-b56c0b18a3b4d026.js +0 -1
  706. package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-b56c0b18a3b4d026.js +0 -1
  707. package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-b56c0b18a3b4d026.js +0 -1
  708. package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-b56c0b18a3b4d026.js +0 -1
  709. package/.next-prod/static/css/08c892de6d5e2335.css +0 -1
  710. package/.next-prod/static/mTTTlFslhC7zzHMDXGNOW/_buildManifest.js +0 -1
  711. /package/.next-prod/static/{mTTTlFslhC7zzHMDXGNOW → O8neHUIr3dQhe1jcOUsQ8}/_ssgManifest.js +0 -0
@@ -6912,67 +6912,67 @@ var Or = (self, that) => {
6912
6912
  });
6913
6913
  return error48;
6914
6914
  };
6915
- var InvalidData = (path2, message, options = {
6915
+ var InvalidData = (path5, message, options = {
6916
6916
  pathDelim: "."
6917
6917
  }) => {
6918
6918
  const error48 = Object.create(proto2);
6919
6919
  error48._op = OP_INVALID_DATA;
6920
- error48.path = path2;
6920
+ error48.path = path5;
6921
6921
  error48.message = message;
6922
6922
  Object.defineProperty(error48, "toString", {
6923
6923
  enumerable: false,
6924
6924
  value() {
6925
- const path3 = pipe(this.path, join(options.pathDelim));
6926
- return `(Invalid data at ${path3}: "${this.message}")`;
6925
+ const path6 = pipe(this.path, join(options.pathDelim));
6926
+ return `(Invalid data at ${path6}: "${this.message}")`;
6927
6927
  }
6928
6928
  });
6929
6929
  return error48;
6930
6930
  };
6931
- var MissingData = (path2, message, options = {
6931
+ var MissingData = (path5, message, options = {
6932
6932
  pathDelim: "."
6933
6933
  }) => {
6934
6934
  const error48 = Object.create(proto2);
6935
6935
  error48._op = OP_MISSING_DATA;
6936
- error48.path = path2;
6936
+ error48.path = path5;
6937
6937
  error48.message = message;
6938
6938
  Object.defineProperty(error48, "toString", {
6939
6939
  enumerable: false,
6940
6940
  value() {
6941
- const path3 = pipe(this.path, join(options.pathDelim));
6942
- return `(Missing data at ${path3}: "${this.message}")`;
6941
+ const path6 = pipe(this.path, join(options.pathDelim));
6942
+ return `(Missing data at ${path6}: "${this.message}")`;
6943
6943
  }
6944
6944
  });
6945
6945
  return error48;
6946
6946
  };
6947
- var SourceUnavailable = (path2, message, cause3, options = {
6947
+ var SourceUnavailable = (path5, message, cause3, options = {
6948
6948
  pathDelim: "."
6949
6949
  }) => {
6950
6950
  const error48 = Object.create(proto2);
6951
6951
  error48._op = OP_SOURCE_UNAVAILABLE;
6952
- error48.path = path2;
6952
+ error48.path = path5;
6953
6953
  error48.message = message;
6954
6954
  error48.cause = cause3;
6955
6955
  Object.defineProperty(error48, "toString", {
6956
6956
  enumerable: false,
6957
6957
  value() {
6958
- const path3 = pipe(this.path, join(options.pathDelim));
6959
- return `(Source unavailable at ${path3}: "${this.message}")`;
6958
+ const path6 = pipe(this.path, join(options.pathDelim));
6959
+ return `(Source unavailable at ${path6}: "${this.message}")`;
6960
6960
  }
6961
6961
  });
6962
6962
  return error48;
6963
6963
  };
6964
- var Unsupported = (path2, message, options = {
6964
+ var Unsupported = (path5, message, options = {
6965
6965
  pathDelim: "."
6966
6966
  }) => {
6967
6967
  const error48 = Object.create(proto2);
6968
6968
  error48._op = OP_UNSUPPORTED;
6969
- error48.path = path2;
6969
+ error48.path = path5;
6970
6970
  error48.message = message;
6971
6971
  Object.defineProperty(error48, "toString", {
6972
6972
  enumerable: false,
6973
6973
  value() {
6974
- const path3 = pipe(this.path, join(options.pathDelim));
6975
- return `(Unsupported operation at ${path3}: "${this.message}")`;
6974
+ const path6 = pipe(this.path, join(options.pathDelim));
6975
+ return `(Unsupported operation at ${path6}: "${this.message}")`;
6976
6976
  }
6977
6977
  });
6978
6978
  return error48;
@@ -7087,9 +7087,9 @@ var isMissingDataOnly = (self) => reduceWithContext2(self, void 0, IsMissingData
7087
7087
  var empty17 = {
7088
7088
  _tag: "Empty"
7089
7089
  };
7090
- var patch5 = /* @__PURE__ */ dual(2, (path2, patch9) => {
7090
+ var patch5 = /* @__PURE__ */ dual(2, (path5, patch9) => {
7091
7091
  let input = of3(patch9);
7092
- let output = path2;
7092
+ let output = path5;
7093
7093
  while (isCons(input)) {
7094
7094
  const patch10 = input.head;
7095
7095
  switch (patch10._tag) {
@@ -7156,7 +7156,7 @@ var make20 = (options) => ({
7156
7156
  var makeFlat = (options) => ({
7157
7157
  [FlatConfigProviderTypeId]: FlatConfigProviderTypeId,
7158
7158
  patch: options.patch,
7159
- load: (path2, config3, split3 = true) => options.load(path2, config3, split3),
7159
+ load: (path5, config3, split3 = true) => options.load(path5, config3, split3),
7160
7160
  enumerateChildren: options.enumerateChildren
7161
7161
  });
7162
7162
  var fromFlat = (flat) => make20({
@@ -7174,29 +7174,29 @@ var fromEnv = (options) => {
7174
7174
  pathDelim: "_",
7175
7175
  seqDelim: ","
7176
7176
  }, options);
7177
- const makePathString = (path2) => pipe(path2, join(pathDelim));
7177
+ const makePathString = (path5) => pipe(path5, join(pathDelim));
7178
7178
  const unmakePathString = (pathString) => pathString.split(pathDelim);
7179
7179
  const getEnv = () => typeof process !== "undefined" && "env" in process && typeof process.env === "object" ? process.env : {};
7180
- const load = (path2, primitive3, split3 = true) => {
7181
- const pathString = makePathString(path2);
7180
+ const load = (path5, primitive3, split3 = true) => {
7181
+ const pathString = makePathString(path5);
7182
7182
  const current2 = getEnv();
7183
7183
  const valueOpt = pathString in current2 ? some2(current2[pathString]) : none2();
7184
- return pipe(valueOpt, mapError(() => MissingData(path2, `Expected ${pathString} to exist in the process context`)), flatMap9((value) => parsePrimitive(value, path2, primitive3, seqDelim, split3)));
7184
+ return pipe(valueOpt, mapError(() => MissingData(path5, `Expected ${pathString} to exist in the process context`)), flatMap9((value) => parsePrimitive(value, path5, primitive3, seqDelim, split3)));
7185
7185
  };
7186
- const enumerateChildren = (path2) => sync(() => {
7186
+ const enumerateChildren = (path5) => sync(() => {
7187
7187
  const current2 = getEnv();
7188
7188
  const keys5 = Object.keys(current2);
7189
7189
  const keyPaths = keys5.map((value) => unmakePathString(value.toUpperCase()));
7190
7190
  const filteredKeyPaths = keyPaths.filter((keyPath) => {
7191
- for (let i = 0; i < path2.length; i++) {
7192
- const pathComponent = pipe(path2, unsafeGet(i));
7191
+ for (let i = 0; i < path5.length; i++) {
7192
+ const pathComponent = pipe(path5, unsafeGet(i));
7193
7193
  const currentElement = keyPath[i];
7194
7194
  if (currentElement === void 0 || pathComponent !== currentElement) {
7195
7195
  return false;
7196
7196
  }
7197
7197
  }
7198
7198
  return true;
7199
- }).flatMap((keyPath) => keyPath.slice(path2.length, path2.length + 1));
7199
+ }).flatMap((keyPath) => keyPath.slice(path5.length, path5.length + 1));
7200
7200
  return fromIterable6(filteredKeyPaths);
7201
7201
  });
7202
7202
  return fromFlat(makeFlat({
@@ -7212,17 +7212,17 @@ var extend = (leftDef, rightDef, left3, right3) => {
7212
7212
  const rightExtension = concat(right3, rightPad);
7213
7213
  return [leftExtension, rightExtension];
7214
7214
  };
7215
- var appendConfigPath = (path2, config3) => {
7215
+ var appendConfigPath = (path5, config3) => {
7216
7216
  let op = config3;
7217
7217
  if (op._tag === "Nested") {
7218
- const out = path2.slice();
7218
+ const out = path5.slice();
7219
7219
  while (op._tag === "Nested") {
7220
7220
  out.push(op.name);
7221
7221
  op = op.config;
7222
7222
  }
7223
7223
  return out;
7224
7224
  }
7225
- return path2;
7225
+ return path5;
7226
7226
  };
7227
7227
  var fromFlatLoop = (flat, prefix, config3, split3) => {
7228
7228
  const op = config3;
@@ -7298,8 +7298,8 @@ var fromFlatLoop = (flat, prefix, config3, split3) => {
7298
7298
  return fail2(right3.left);
7299
7299
  }
7300
7300
  if (isRight2(left3) && isRight2(right3)) {
7301
- const path2 = pipe(prefix, join("."));
7302
- const fail20 = fromFlatLoopFail(prefix, path2);
7301
+ const path5 = pipe(prefix, join("."));
7302
+ const fail20 = fromFlatLoopFail(prefix, path5);
7303
7303
  const [lefts, rights] = extend(fail20, fail20, pipe(left3.right, map3(right2)), pipe(right3.right, map3(right2)));
7304
7304
  return pipe(lefts, zip(rights), forEachSequential(([left4, right4]) => pipe(zip2(left4, right4), map10(([left5, right5]) => op.zip(left5, right5)))));
7305
7305
  }
@@ -7308,19 +7308,19 @@ var fromFlatLoop = (flat, prefix, config3, split3) => {
7308
7308
  }
7309
7309
  }
7310
7310
  };
7311
- var fromFlatLoopFail = (prefix, path2) => (index) => left2(MissingData(prefix, `The element at index ${index} in a sequence at path "${path2}" was missing`));
7311
+ var fromFlatLoopFail = (prefix, path5) => (index) => left2(MissingData(prefix, `The element at index ${index} in a sequence at path "${path5}" was missing`));
7312
7312
  var splitPathString = (text, delim) => {
7313
7313
  const split3 = text.split(new RegExp(`\\s*${escape(delim)}\\s*`));
7314
7314
  return split3;
7315
7315
  };
7316
- var parsePrimitive = (text, path2, primitive3, delimiter2, split3) => {
7316
+ var parsePrimitive = (text, path5, primitive3, delimiter2, split3) => {
7317
7317
  if (!split3) {
7318
7318
  return pipe(primitive3.parse(text), mapBoth2({
7319
- onFailure: prefixed(path2),
7319
+ onFailure: prefixed(path5),
7320
7320
  onSuccess: of
7321
7321
  }));
7322
7322
  }
7323
- return pipe(splitPathString(text, delimiter2), forEachSequential((char) => primitive3.parse(char.trim())), mapError(prefixed(path2)));
7323
+ return pipe(splitPathString(text, delimiter2), forEachSequential((char) => primitive3.parse(char.trim())), mapError(prefixed(path5)));
7324
7324
  };
7325
7325
  var transpose = (array7) => {
7326
7326
  return Object.keys(array7[0]).map((column) => array7.map((row) => row[column]));
@@ -28645,14 +28645,14 @@ import { execSync } from "child_process";
28645
28645
 
28646
28646
  // packages/shared/utils/src/encodePath.ts
28647
28647
  var CLAUDE_ENCODED_MAX_LEN = 200;
28648
- function claudePathHash(path2) {
28648
+ function claudePathHash(path5) {
28649
28649
  let h = 0;
28650
- for (let i = 0; i < path2.length; i++) h = (h << 5) - h + path2.charCodeAt(i) | 0;
28650
+ for (let i = 0; i < path5.length; i++) h = (h << 5) - h + path5.charCodeAt(i) | 0;
28651
28651
  return Math.abs(h).toString(36);
28652
28652
  }
28653
- function encodePath(path2) {
28654
- const encoded = path2.replace(/[^a-zA-Z0-9]/g, "-");
28655
- return encoded.length <= CLAUDE_ENCODED_MAX_LEN ? encoded : `${encoded.slice(0, CLAUDE_ENCODED_MAX_LEN)}-${claudePathHash(path2)}`;
28653
+ function encodePath(path5) {
28654
+ const encoded = path5.replace(/[^a-zA-Z0-9]/g, "-");
28655
+ return encoded.length <= CLAUDE_ENCODED_MAX_LEN ? encoded : `${encoded.slice(0, CLAUDE_ENCODED_MAX_LEN)}-${claudePathHash(path5)}`;
28656
28656
  }
28657
28657
 
28658
28658
  // packages/shared/utils/src/homePath.ts
@@ -28675,12 +28675,15 @@ var NOTE_FILE = join4(COCKPIT_DIR, "note.md");
28675
28675
  var SCHEDULED_TASKS_FILE = join4(COCKPIT_DIR, "scheduled-tasks.json");
28676
28676
  var SETTINGS_FILE = join4(COCKPIT_DIR, "settings.json");
28677
28677
  var SKILLS_FILE = join4(COCKPIT_DIR, "skills.json");
28678
+ var BOTS_FILE = join4(COCKPIT_DIR, "bot.json");
28679
+ var BOTS_DIR = join4(COCKPIT_DIR, "bots");
28678
28680
  var CODEX_SESSION_INDEX_FILE = join4(COCKPIT_DIR, "codex-session-index.json");
28679
28681
  var HTML_APPS_FILE = join4(COCKPIT_DIR, "html.json");
28680
28682
  var REVIEW_DIR = join4(COCKPIT_DIR, "review");
28681
28683
  var REVIEW_SIGNAL_FILE = join4(REVIEW_DIR, "_signal");
28682
28684
  var APPS_DIR = join4(process.env.COCKPIT_ROOT || process.cwd(), "apps");
28683
28685
  var BUILTIN_SKILLS_SRC_DIR = join4(process.env.COCKPIT_ROOT || process.cwd(), "skills");
28686
+ var BUILTIN_BOTS_SRC_DIR = join4(process.env.COCKPIT_ROOT || process.cwd(), "bots");
28684
28687
  var CLAUDE_DIR = join4(HOME_DIR, ".claude");
28685
28688
  var CLAUDE_PROJECTS_DIR = join4(CLAUDE_DIR, "projects");
28686
28689
  var DEEPSEEK_DIR = join4(COCKPIT_DIR, "deepseek");
@@ -28938,6 +28941,22 @@ async function readJsonFile(filePath, defaultValue) {
28938
28941
  return defaultValue;
28939
28942
  }
28940
28943
  }
28944
+ async function readJsonFileForUpdate(filePath, defaultValue) {
28945
+ let content;
28946
+ try {
28947
+ content = await readFile(filePath, "utf-8");
28948
+ } catch (err) {
28949
+ if (err?.code === "ENOENT") return defaultValue;
28950
+ throw err;
28951
+ }
28952
+ try {
28953
+ return JSON.parse(content);
28954
+ } catch (err) {
28955
+ throw new Error(
28956
+ `${filePath} is not valid JSON, refusing to overwrite it: ${err instanceof Error ? err.message : String(err)}`
28957
+ );
28958
+ }
28959
+ }
28941
28960
  async function writeJsonFile(filePath, data) {
28942
28961
  await ensureParentDir(filePath);
28943
28962
  await writeFile(filePath, JSON.stringify(data, null, 2), "utf-8");
@@ -28960,7 +28979,7 @@ function withFileLock(filePath, fn2) {
28960
28979
  }
28961
28980
  function mutateJsonFile(filePath, defaultValue, mutate5) {
28962
28981
  return withFileLock(filePath, async () => {
28963
- const current2 = await readJsonFile(filePath, defaultValue);
28982
+ const current2 = await readJsonFileForUpdate(filePath, defaultValue);
28964
28983
  const next4 = await mutate5(current2);
28965
28984
  await writeJsonFile(filePath, next4);
28966
28985
  return next4;
@@ -29145,12 +29164,16 @@ var NEXT_INJECTED_ENV_KEYS = [
29145
29164
  "NEXT_DEPLOYMENT_ID",
29146
29165
  "TURBOPACK"
29147
29166
  ];
29167
+ var HOST_ONLY_ENV_KEYS = [
29168
+ ...NEXT_INJECTED_ENV_KEYS,
29169
+ "PORT"
29170
+ ];
29148
29171
  function sanitizedSpawnEnv(overrides = {}, base = process.env) {
29149
29172
  const out = {};
29150
29173
  for (const [key, value] of Object.entries(base)) {
29151
29174
  if (value !== void 0) out[key] = value;
29152
29175
  }
29153
- for (const key of NEXT_INJECTED_ENV_KEYS) delete out[key];
29176
+ for (const key of HOST_ONLY_ENV_KEYS) delete out[key];
29154
29177
  for (const [key, value] of Object.entries(overrides)) {
29155
29178
  if (value === void 0) delete out[key];
29156
29179
  else out[key] = value;
@@ -29305,8 +29328,8 @@ var CLAUDE_STYLE_PATHS = [
29305
29328
  ];
29306
29329
  function findClaudeStylePath(cwd, sessionId) {
29307
29330
  for (const resolve3 of CLAUDE_STYLE_PATHS) {
29308
- const path2 = resolve3(cwd, sessionId);
29309
- if (existsSync2(path2)) return path2;
29331
+ const path5 = resolve3(cwd, sessionId);
29332
+ if (existsSync2(path5)) return path5;
29310
29333
  }
29311
29334
  return null;
29312
29335
  }
@@ -30084,6 +30107,11 @@ var DelegationService = Context_exports.GenericTag(
30084
30107
  "@cockpit/DelegationService"
30085
30108
  );
30086
30109
 
30110
+ // packages/shared/effect-services/src/botRegistry.ts
30111
+ var BotRegistryService = Context_exports.GenericTag(
30112
+ "@cockpit/BotRegistryService"
30113
+ );
30114
+
30087
30115
  // packages/feature/console/src/effect/pgLive.ts
30088
30116
  var { Pool } = pg;
30089
30117
  var handleAsync = (op, f) => Effect_exports.tryPromise({
@@ -30526,10 +30554,10 @@ function serializeValue(val) {
30526
30554
  };
30527
30555
  }
30528
30556
  if (val && typeof val === "object" && "segments" in val) {
30529
- const path2 = val;
30557
+ const path5 = val;
30530
30558
  return {
30531
30559
  _type: "path",
30532
- segments: path2.segments.map((s) => ({
30560
+ segments: path5.segments.map((s) => ({
30533
30561
  start: serializeValue(s.start),
30534
30562
  relationship: serializeValue(s.relationship),
30535
30563
  end: serializeValue(s.end)
@@ -31281,10 +31309,10 @@ var snapshotOnce = (snapshotsRoot, maxFileBytes, trigger, kind) => Effect_export
31281
31309
  const addPaths = [];
31282
31310
  const rmPaths = [];
31283
31311
  for (const e of entries2) {
31284
- const path2 = e.slice(3);
31285
- if (!path2) continue;
31286
- if (e[0] === "D" || e[1] === "D") rmPaths.push(path2);
31287
- else addPaths.push(path2);
31312
+ const path5 = e.slice(3);
31313
+ if (!path5) continue;
31314
+ if (e[0] === "D" || e[1] === "D") rmPaths.push(path5);
31315
+ else addPaths.push(path5);
31288
31316
  }
31289
31317
  const sizes = yield* Effect_exports.all(
31290
31318
  addPaths.map(
@@ -31386,15 +31414,15 @@ var listByToolIdsImpl = (snapshotsRoot, cwd, toolIds, sessionKey) => Effect_expo
31386
31414
  (c) => !!c && !!c.toolId && wanted.has(c.toolId) && (!sessionKey || c.sessionKey === sessionKey)
31387
31415
  );
31388
31416
  }).pipe(Effect_exports.withSpan("snapshot.listByToolIds", { attributes: { cwd } }));
31389
- var showFile = (repoDir, cwd, rev, path2) => runGit(repoDir, cwd, ["show", `${rev}:${path2}`]).pipe(
31417
+ var showFile = (repoDir, cwd, rev, path5) => runGit(repoDir, cwd, ["show", `${rev}:${path5}`]).pipe(
31390
31418
  Effect_exports.map((r) => r.code === 0 ? r.stdout : null),
31391
31419
  Effect_exports.orElseSucceed(() => null)
31392
31420
  );
31393
- var gitShowBytes = (repoDir, cwd, rev, path2) => Effect_exports.tryPromise({
31421
+ var gitShowBytes = (repoDir, cwd, rev, path5) => Effect_exports.tryPromise({
31394
31422
  try: () => new Promise((resolve3, reject) => {
31395
31423
  execFile(
31396
31424
  "git",
31397
- ["show", `${rev}:${path2}`],
31425
+ ["show", `${rev}:${path5}`],
31398
31426
  {
31399
31427
  env: {
31400
31428
  ...process.env,
@@ -31414,7 +31442,7 @@ var gitShowBytes = (repoDir, cwd, rev, path2) => Effect_exports.tryPromise({
31414
31442
  );
31415
31443
  }),
31416
31444
  // A miss is ordinary: the path simply doesn't exist at that revision.
31417
- catch: () => new NotFoundError({ resource: "snapshot-blob", id: `${rev}:${path2}` })
31445
+ catch: () => new NotFoundError({ resource: "snapshot-blob", id: `${rev}:${path5}` })
31418
31446
  });
31419
31447
  var blobImpl = (snapshotsRoot, cwd, rev, file2) => Effect_exports.gen(function* () {
31420
31448
  if (!/^[0-9a-f]{6,40}$/i.test(rev)) {
@@ -31486,23 +31514,23 @@ var diffImpl = (snapshotsRoot, cwd, commitHash) => Effect_exports.gen(function*
31486
31514
  const files = [];
31487
31515
  for (let i = 0; i + 1 < tokens.length && files.length < MAX_DIFF_FILES; i += 2) {
31488
31516
  const st = tokens[i];
31489
- const path2 = tokens[i + 1];
31517
+ const path5 = tokens[i + 1];
31490
31518
  const status3 = st === "A" ? "added" : st === "D" ? "deleted" : "modified";
31491
- const binary = binarySet.has(path2);
31519
+ const binary = binarySet.has(path5);
31492
31520
  let oldContent = null;
31493
31521
  let newContent = null;
31494
31522
  if (!binary) {
31495
- if (status3 !== "added") oldContent = yield* showFile(repoDir, cwd, base, path2);
31496
- if (status3 !== "deleted") newContent = yield* showFile(repoDir, cwd, commit3.hash, path2);
31523
+ if (status3 !== "added") oldContent = yield* showFile(repoDir, cwd, base, path5);
31524
+ if (status3 !== "deleted") newContent = yield* showFile(repoDir, cwd, commit3.hash, path5);
31497
31525
  if ((oldContent?.length ?? 0) > MAX_DIFF_CONTENT_BYTES || (newContent?.length ?? 0) > MAX_DIFF_CONTENT_BYTES) {
31498
31526
  oldContent = null;
31499
31527
  newContent = null;
31500
31528
  }
31501
31529
  }
31502
- const stats = lineStats.get(path2);
31503
- const isImage = binary && isImagePath(path2);
31530
+ const stats = lineStats.get(path5);
31531
+ const isImage = binary && isImagePath(path5);
31504
31532
  files.push({
31505
- path: path2,
31533
+ path: path5,
31506
31534
  status: status3,
31507
31535
  binary,
31508
31536
  additions: stats?.additions ?? 0,
@@ -32410,7 +32438,7 @@ var patchChanges = (item) => {
32410
32438
  if (Array.isArray(raw)) {
32411
32439
  return raw.map((c) => ({ path: c?.path || "", kind: kindOf(c) }));
32412
32440
  }
32413
- return Object.entries(raw).map(([path2, v]) => ({ path: path2, kind: kindOf(v) }));
32441
+ return Object.entries(raw).map(([path5, v]) => ({ path: path5, kind: kindOf(v) }));
32414
32442
  };
32415
32443
  var patchResultText = (item) => {
32416
32444
  const cs = patchChanges(item);
@@ -33064,7 +33092,7 @@ var groupMatches = (matches, terms) => {
33064
33092
  }
33065
33093
  return byFile;
33066
33094
  };
33067
- var fsTry3 = (path2, op, fn2) => Effect_exports.tryPromise({ try: fn2, catch: (cause3) => new FSError({ path: path2, op, cause: cause3 }) });
33095
+ var fsTry3 = (path5, op, fn2) => Effect_exports.tryPromise({ try: fn2, catch: (cause3) => new FSError({ path: path5, op, cause: cause3 }) });
33068
33096
  var readJsonOr = (file2, fallback) => fsTry3(file2, "read", () => readFile4(file2, "utf8")).pipe(
33069
33097
  Effect_exports.flatMap((raw) => Effect_exports.try(() => JSON.parse(raw))),
33070
33098
  Effect_exports.orElseSucceed(() => fallback)
@@ -33568,16 +33596,16 @@ function planPermission(toolName, input, opts) {
33568
33596
  };
33569
33597
  }
33570
33598
  if (PLAN_EDIT_TOOLS.has(toolName)) {
33571
- const path2 = [input.file_path, input.notebook_path, input.path, opts?.blockedPath].find(
33599
+ const path5 = [input.file_path, input.notebook_path, input.path, opts?.blockedPath].find(
33572
33600
  (v) => typeof v === "string"
33573
33601
  );
33574
- if (path2 && isPlanFilePath(path2)) {
33602
+ if (path5 && isPlanFilePath(path5)) {
33575
33603
  return { behavior: "allow", updatedInput: input };
33576
33604
  }
33577
33605
  return {
33578
33606
  behavior: "deny",
33579
33607
  // (C) read-only plan mode, no dialog → feedback instead of silent drop
33580
- message: `Plan mode is read-only and this environment has no approval dialog, so "${toolName}"${path2 ? ` on ${path2}` : ""} can't run. Only writes under .claude/plans/ are allowed. Capture the intended changes in your plan instead of editing files now.`
33608
+ message: `Plan mode is read-only and this environment has no approval dialog, so "${toolName}"${path5 ? ` on ${path5}` : ""} can't run. Only writes under .claude/plans/ are allowed. Capture the intended changes in your plan instead of editing files now.`
33581
33609
  };
33582
33610
  }
33583
33611
  return { behavior: "allow", updatedInput: input };
@@ -33614,8 +33642,10 @@ function buildClaudeOptions(ctx, independent) {
33614
33642
  abortController: abort,
33615
33643
  // env is ALWAYS passed: without it the SDK inherits process.env verbatim,
33616
33644
  // handing the agent this server's NODE_ENV=production. See sanitizedSpawnEnv.
33617
- // COCKPIT_RUN_ID lets a skill's curl identify the session it runs in (delegation parent).
33618
- env: sanitizedSpawnEnv({ COCKPIT_RUN_ID: ctx.currentKey() })
33645
+ // COCKPIT_RUN_ID lets a skill's curl identify the session it runs in (delegation parent);
33646
+ // COCKPIT_CWD is the session's own working directory, which `pwd` stops being the moment
33647
+ // the agent cd's somewhere (see spawnEnv.ts).
33648
+ env: sanitizedSpawnEnv({ COCKPIT_RUN_ID: ctx.currentKey(), COCKPIT_CWD: ctx.cwd || void 0 })
33619
33649
  });
33620
33650
  }
33621
33651
  var claudeSpec = {
@@ -33732,9 +33762,9 @@ function getSessionPath(root, cwd, sessionId) {
33732
33762
  return join9(getSessionDir(root, cwd), `${sessionId}.jsonl`);
33733
33763
  }
33734
33764
  function readSessionMessages(root, cwd, sessionId) {
33735
- const path2 = getSessionPath(root, cwd, sessionId);
33736
- if (!existsSync4(path2)) return [];
33737
- const lines = readFileSync3(path2, "utf-8").split("\n").filter(Boolean);
33765
+ const path5 = getSessionPath(root, cwd, sessionId);
33766
+ if (!existsSync4(path5)) return [];
33767
+ const lines = readFileSync3(path5, "utf-8").split("\n").filter(Boolean);
33738
33768
  const transcriptEntries = [];
33739
33769
  for (const line of lines) {
33740
33770
  try {
@@ -33834,8 +33864,8 @@ function readSessionMessages(root, cwd, sessionId) {
33834
33864
  function appendSessionLine(root, cwd, sessionId, line) {
33835
33865
  const dir = getSessionDir(root, cwd);
33836
33866
  mkdirSync3(dir, { recursive: true });
33837
- const path2 = getSessionPath(root, cwd, sessionId);
33838
- appendFileSync(path2, JSON.stringify(line) + "\n", "utf-8");
33867
+ const path5 = getSessionPath(root, cwd, sessionId);
33868
+ appendFileSync(path5, JSON.stringify(line) + "\n", "utf-8");
33839
33869
  }
33840
33870
  function appendUserText(root, cwd, sessionId, text, opts) {
33841
33871
  appendSessionLine(root, cwd, sessionId, {
@@ -34644,10 +34674,10 @@ function mergeDefs(...defs) {
34644
34674
  function cloneDef(schema) {
34645
34675
  return mergeDefs(schema._zod.def);
34646
34676
  }
34647
- function getElementAtPath(obj, path2) {
34648
- if (!path2)
34677
+ function getElementAtPath(obj, path5) {
34678
+ if (!path5)
34649
34679
  return obj;
34650
- return path2.reduce((acc, key) => acc?.[key], obj);
34680
+ return path5.reduce((acc, key) => acc?.[key], obj);
34651
34681
  }
34652
34682
  function promiseAllObject(promisesObj) {
34653
34683
  const keys5 = Object.keys(promisesObj);
@@ -35030,11 +35060,11 @@ function aborted(x, startIndex = 0) {
35030
35060
  }
35031
35061
  return false;
35032
35062
  }
35033
- function prefixIssues(path2, issues) {
35063
+ function prefixIssues(path5, issues) {
35034
35064
  return issues.map((iss) => {
35035
35065
  var _a2;
35036
35066
  (_a2 = iss).path ?? (_a2.path = []);
35037
- iss.path.unshift(path2);
35067
+ iss.path.unshift(path5);
35038
35068
  return iss;
35039
35069
  });
35040
35070
  }
@@ -35217,7 +35247,7 @@ function formatError(error48, mapper = (issue2) => issue2.message) {
35217
35247
  }
35218
35248
  function treeifyError(error48, mapper = (issue2) => issue2.message) {
35219
35249
  const result = { errors: [] };
35220
- const processError = (error49, path2 = []) => {
35250
+ const processError = (error49, path5 = []) => {
35221
35251
  var _a2, _b;
35222
35252
  for (const issue2 of error49.issues) {
35223
35253
  if (issue2.code === "invalid_union" && issue2.errors.length) {
@@ -35227,7 +35257,7 @@ function treeifyError(error48, mapper = (issue2) => issue2.message) {
35227
35257
  } else if (issue2.code === "invalid_element") {
35228
35258
  processError({ issues: issue2.issues }, issue2.path);
35229
35259
  } else {
35230
- const fullpath = [...path2, ...issue2.path];
35260
+ const fullpath = [...path5, ...issue2.path];
35231
35261
  if (fullpath.length === 0) {
35232
35262
  result.errors.push(mapper(issue2));
35233
35263
  continue;
@@ -35259,8 +35289,8 @@ function treeifyError(error48, mapper = (issue2) => issue2.message) {
35259
35289
  }
35260
35290
  function toDotPath(_path) {
35261
35291
  const segs = [];
35262
- const path2 = _path.map((seg) => typeof seg === "object" ? seg.key : seg);
35263
- for (const seg of path2) {
35292
+ const path5 = _path.map((seg) => typeof seg === "object" ? seg.key : seg);
35293
+ for (const seg of path5) {
35264
35294
  if (typeof seg === "number")
35265
35295
  segs.push(`[${seg}]`);
35266
35296
  else if (typeof seg === "symbol")
@@ -47237,13 +47267,13 @@ function resolveRef(ref, ctx) {
47237
47267
  if (!ref.startsWith("#")) {
47238
47268
  throw new Error("External $ref is not supported, only local refs (#/...) are allowed");
47239
47269
  }
47240
- const path2 = ref.slice(1).split("/").filter(Boolean);
47241
- if (path2.length === 0) {
47270
+ const path5 = ref.slice(1).split("/").filter(Boolean);
47271
+ if (path5.length === 0) {
47242
47272
  return ctx.rootSchema;
47243
47273
  }
47244
47274
  const defsKey = ctx.version === "draft-2020-12" ? "$defs" : "definitions";
47245
- if (path2[0] === defsKey) {
47246
- const key = path2[1];
47275
+ if (path5[0] === defsKey) {
47276
+ const key = path5[1];
47247
47277
  if (!key || !ctx.defs[key]) {
47248
47278
  throw new Error(`Reference not found: ${ref}`);
47249
47279
  }
@@ -47824,7 +47854,14 @@ function createTools(context7) {
47824
47854
  encoding: "utf-8",
47825
47855
  timeout: timeout5 ?? 6e4,
47826
47856
  maxBuffer: 10 * 1024 * 1024,
47827
- env: sanitizedSpawnEnv({ FORCE_COLOR: "0", CI: "1", COCKPIT_RUN_ID: context7.runId })
47857
+ env: sanitizedSpawnEnv({
47858
+ FORCE_COLOR: "0",
47859
+ CI: "1",
47860
+ COCKPIT_RUN_ID: context7.runId,
47861
+ // The session's own cwd, which survives a `cd` in an earlier command
47862
+ // the way `pwd` does not (see spawnEnv.ts).
47863
+ COCKPIT_CWD: context7.cwd || void 0
47864
+ })
47828
47865
  });
47829
47866
  if (stdout.length === 0) {
47830
47867
  if (stderr.length === 0) {
@@ -47890,14 +47927,14 @@ ${stderrCapped}`;
47890
47927
  ),
47891
47928
  execute: async ({
47892
47929
  pattern,
47893
- path: path2,
47930
+ path: path5,
47894
47931
  ignore_case,
47895
47932
  output_mode,
47896
47933
  "-n": showLineNumbers
47897
47934
  }) => {
47898
47935
  try {
47899
- if (path2 && !isAbsolute2(path2)) return "Error: path must be an absolute path.";
47900
- const target = path2 || context7.cwd;
47936
+ if (path5 && !isAbsolute2(path5)) return "Error: path must be an absolute path.";
47937
+ const target = path5 || context7.cwd;
47901
47938
  const args2 = [
47902
47939
  "--no-heading",
47903
47940
  "--color",
@@ -49133,9 +49170,9 @@ function createCodexEventAdapter(ctx) {
49133
49170
  rolloutPath = null;
49134
49171
  }
49135
49172
  }
49136
- const bindRollout = (path2) => {
49137
- if (!path2 || path2 === rolloutPath) return;
49138
- rolloutPath = path2;
49173
+ const bindRollout = (path5) => {
49174
+ if (!path5 || path5 === rolloutPath) return;
49175
+ rolloutPath = path5;
49139
49176
  basesReady = false;
49140
49177
  initBases();
49141
49178
  };
@@ -49153,8 +49190,8 @@ function createCodexEventAdapter(ctx) {
49153
49190
  };
49154
49191
  const emitSpawn = (item) => {
49155
49192
  const agentIds = item.receiver_thread_ids ?? [];
49156
- const path2 = rolloutPath;
49157
- const entry = path2 ? resolveCodexSpawnCall(readRollout(path2).spawn, spawnBase + spawnSeen, agentIds[0]) : null;
49193
+ const path5 = rolloutPath;
49194
+ const entry = path5 ? resolveCodexSpawnCall(readRollout(path5).spawn, spawnBase + spawnSeen, agentIds[0]) : null;
49158
49195
  spawnSeen += 1;
49159
49196
  const toolUseId = toolUseIdFor(item);
49160
49197
  if (spawnEmitted.has(toolUseId)) return;
@@ -49167,9 +49204,9 @@ function createCodexEventAdapter(ctx) {
49167
49204
  emitSpawnBubble(toolUseId, input, entry?.agentPath);
49168
49205
  };
49169
49206
  const syncSubAgents = (flushPending = false) => {
49170
- const path2 = rolloutPath;
49171
- if (!path2) return;
49172
- const { spawn: spawn2, reports } = readRollout(path2);
49207
+ const path5 = rolloutPath;
49208
+ if (!path5) return;
49209
+ const { spawn: spawn2, reports } = readRollout(path5);
49173
49210
  for (let i = spawnBase; i < spawn2.length; i += 1) {
49174
49211
  const s = spawn2[i];
49175
49212
  if (!s.callId || spawnEmitted.has(s.callId)) continue;
@@ -49326,7 +49363,7 @@ function cleanupImageFiles(imageFiles) {
49326
49363
  function codexTurnInput(prompt, imageFiles) {
49327
49364
  return [
49328
49365
  { type: "text", text: imageFiles.length > 0 ? prompt || CODEX_IMAGE_ONLY_TEXT : prompt },
49329
- ...imageFiles.map((path2) => ({ type: "localImage", path: path2 }))
49366
+ ...imageFiles.map((path5) => ({ type: "localImage", path: path5 }))
49330
49367
  ];
49331
49368
  }
49332
49369
  function codexThreadParams(ctx) {
@@ -49393,8 +49430,9 @@ async function runCodexAppServer(ctx) {
49393
49430
  let client;
49394
49431
  try {
49395
49432
  client = CodexAppServerClient.start({
49396
- // COCKPIT_RUN_ID lets a skill's curl identify the session it runs in (delegation parent).
49397
- env: sanitizedSpawnEnv({ COCKPIT_RUN_ID: ctx.currentKey() }),
49433
+ // COCKPIT_RUN_ID lets a skill's curl identify the session it runs in (delegation parent);
49434
+ // COCKPIT_CWD is the session's own working directory (see spawnEnv.ts).
49435
+ env: sanitizedSpawnEnv({ COCKPIT_RUN_ID: ctx.currentKey(), COCKPIT_CWD: ctx.cwd || void 0 }),
49398
49436
  ...ctx.cwd ? { cwd: ctx.cwd } : {},
49399
49437
  onNotification,
49400
49438
  // Permitted `console.error` under EFFECT.md §0 (subprocess IPC adapter gateway).
@@ -49811,6 +49849,388 @@ var DelegationServiceLive = Layer_exports.effect(
49811
49849
  })
49812
49850
  );
49813
49851
 
49852
+ // packages/feature/agent/src/effect/botRegistryLive.ts
49853
+ import { randomUUID as randomUUID5 } from "crypto";
49854
+ import { readFileSync as readFileSync7, realpathSync as realpathSync3 } from "fs";
49855
+ import path3 from "path";
49856
+
49857
+ // packages/feature/agent/src/shared/bots.ts
49858
+ import yaml from "js-yaml";
49859
+ var BOT_MANIFEST_FILE = "BOT.md";
49860
+ var BOT_NAME = /^[a-z0-9][a-z0-9-]{0,63}$/;
49861
+ var isBotName = (name) => BOT_NAME.test(name);
49862
+ var isManifestPath = (path5, target) => path5.basename(target).toLowerCase() === BOT_MANIFEST_FILE.toLowerCase();
49863
+ var botPaths = (path5, target) => {
49864
+ const dir = isManifestPath(path5, target) ? path5.dirname(target) : path5.join(target);
49865
+ return { dir, manifest: path5.join(dir, BOT_MANIFEST_FILE) };
49866
+ };
49867
+ var parseBotDocument = (path5, content, dir) => {
49868
+ const match21 = content.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/);
49869
+ let fields = {};
49870
+ if (match21) {
49871
+ const raw = yaml.load(match21[1]);
49872
+ if (raw !== void 0 && raw !== null) {
49873
+ if (typeof raw !== "object" || Array.isArray(raw)) throw new Error("BOT.md frontmatter must be a mapping");
49874
+ fields = raw;
49875
+ }
49876
+ }
49877
+ const fallback = path5.basename(dir).toLowerCase();
49878
+ const name = typeof fields.name === "string" && fields.name.trim() ? fields.name.trim() : fallback;
49879
+ if (!isBotName(name)) throw new Error(`Bot name "${name}" must match [a-z0-9][a-z0-9-]*`);
49880
+ const description = typeof fields.description === "string" ? fields.description.trim() : "";
49881
+ return { name, description };
49882
+ };
49883
+ var messageOf = (cause3) => cause3 instanceof Error ? cause3.message : String(cause3);
49884
+ var resolveBot = (path5, record2, read) => {
49885
+ const { dir, manifest } = botPaths(path5, record2.path);
49886
+ try {
49887
+ return { ...record2, valid: true, ...parseBotDocument(path5, read(manifest), dir) };
49888
+ } catch (cause3) {
49889
+ return { ...record2, valid: false, name: path5.basename(dir), error: messageOf(cause3) };
49890
+ }
49891
+ };
49892
+ var mentionableBots = (path5, bots) => {
49893
+ const out = /* @__PURE__ */ new Map();
49894
+ for (const bot of bots) {
49895
+ if (bot.valid && !out.has(bot.name)) out.set(bot.name, botPaths(path5, bot.path).manifest);
49896
+ }
49897
+ return out;
49898
+ };
49899
+ var findNameClash = (bots, name, dir) => bots.find((bot) => bot.valid && bot.name === name && bot.path !== dir);
49900
+
49901
+ // packages/feature/agent/src/server/lib/builtinBots.ts
49902
+ import { createHash as createHash2 } from "crypto";
49903
+ import {
49904
+ cpSync,
49905
+ existsSync as existsSync8,
49906
+ mkdirSync as mkdirSync6,
49907
+ readFileSync as readFileSync6,
49908
+ readdirSync as readdirSync4,
49909
+ realpathSync as realpathSync2,
49910
+ renameSync as renameSync4,
49911
+ rmdirSync,
49912
+ rmSync,
49913
+ statSync as statSync5,
49914
+ writeFileSync as writeFileSync6
49915
+ } from "fs";
49916
+ import path2, { join as join14 } from "path";
49917
+ var BUILTIN_BOT_ID_PREFIX = "builtin:";
49918
+ var isBuiltinBotId = (id3) => id3.startsWith(BUILTIN_BOT_ID_PREFIX);
49919
+ var builtinBotNameFromId = (id3) => isBuiltinBotId(id3) ? id3.slice(BUILTIN_BOT_ID_PREFIX.length) : "";
49920
+ var builtinBotSeedDir = (name) => join14(BUILTIN_BOTS_SRC_DIR, name);
49921
+ var builtinBotUserDir = (name) => join14(BOTS_DIR, name);
49922
+ var hasManifest = (dir) => {
49923
+ try {
49924
+ return statSync5(join14(dir, BOT_MANIFEST_FILE)).isFile();
49925
+ } catch {
49926
+ return false;
49927
+ }
49928
+ };
49929
+ var INSTALL_STATE_FILE = join14(BOTS_DIR, ".builtin-installs.json");
49930
+ var readInstallState = () => {
49931
+ try {
49932
+ const raw = JSON.parse(readFileSync6(INSTALL_STATE_FILE, "utf-8"));
49933
+ return raw && typeof raw === "object" && !Array.isArray(raw) ? raw : {};
49934
+ } catch {
49935
+ return {};
49936
+ }
49937
+ };
49938
+ var writeInstallState = (state) => {
49939
+ try {
49940
+ mkdirSync6(BOTS_DIR, { recursive: true });
49941
+ const tmp = `${INSTALL_STATE_FILE}.${process.pid}.tmp`;
49942
+ writeFileSync6(tmp, `${JSON.stringify(state, null, 2)}
49943
+ `);
49944
+ renameSync4(tmp, INSTALL_STATE_FILE);
49945
+ } catch (err) {
49946
+ console.error(`[bots] cannot record builtin Bot installs in ${INSTALL_STATE_FILE}:`, err);
49947
+ }
49948
+ };
49949
+ var hashFile = (file2) => createHash2("sha256").update(readFileSync6(file2)).digest("hex");
49950
+ function fileHashes(dir) {
49951
+ const out = /* @__PURE__ */ new Map();
49952
+ const walk = (rel) => {
49953
+ for (const entry of readdirSync4(join14(dir, rel), { withFileTypes: true })) {
49954
+ const child = rel ? `${rel}/${entry.name}` : entry.name;
49955
+ if (entry.isDirectory()) walk(child);
49956
+ else if (entry.isFile()) out.set(child, hashFile(join14(dir, child)));
49957
+ }
49958
+ };
49959
+ walk("");
49960
+ return out;
49961
+ }
49962
+ var treeHash = (files) => {
49963
+ const hash3 = createHash2("sha256");
49964
+ for (const rel of [...files.keys()].sort()) hash3.update(`${rel}\0${files.get(rel)}\0`);
49965
+ return hash3.digest("hex");
49966
+ };
49967
+ function swapIn(staging, dest) {
49968
+ const retired = `${staging}.old`;
49969
+ let moved = false;
49970
+ try {
49971
+ try {
49972
+ renameSync4(dest, retired);
49973
+ moved = true;
49974
+ } catch (err) {
49975
+ if (err?.code !== "ENOENT") throw err;
49976
+ }
49977
+ renameSync4(staging, dest);
49978
+ if (moved) rmSync(retired, { recursive: true, force: true });
49979
+ } catch (err) {
49980
+ if (moved && !existsSync8(dest)) renameSync4(retired, dest);
49981
+ throw err;
49982
+ } finally {
49983
+ rmSync(staging, { recursive: true, force: true });
49984
+ }
49985
+ }
49986
+ var stagingDir = (label) => {
49987
+ const staging = join14(BOTS_DIR, `.${label}.installing-${process.pid}-${Date.now()}`);
49988
+ mkdirSync6(BOTS_DIR, { recursive: true });
49989
+ rmSync(staging, { recursive: true, force: true });
49990
+ return staging;
49991
+ };
49992
+ function removeAndPrune(root, rel) {
49993
+ rmSync(join14(root, rel), { force: true });
49994
+ for (let dir = path2.dirname(rel); dir && dir !== "."; dir = path2.dirname(dir)) {
49995
+ try {
49996
+ if (readdirSync4(join14(root, dir)).length > 0) return;
49997
+ rmdirSync(join14(root, dir));
49998
+ } catch {
49999
+ return;
50000
+ }
50001
+ }
50002
+ }
50003
+ function refreshInstalled(name, dest, installed) {
50004
+ const seed = builtinBotSeedDir(name);
50005
+ const seedFiles = fileHashes(seed);
50006
+ const copyFiles = fileHashes(dest);
50007
+ const next4 = { ...installed };
50008
+ const writes = [];
50009
+ const deletes = [];
50010
+ for (const rel of /* @__PURE__ */ new Set([...Object.keys(installed), ...seedFiles.keys()])) {
50011
+ const ours = installed[rel];
50012
+ const shipped = seedFiles.get(rel);
50013
+ const current2 = copyFiles.get(rel);
50014
+ if (ours === void 0) {
50015
+ if (shipped !== void 0 && current2 === void 0) {
50016
+ writes.push(rel);
50017
+ next4[rel] = shipped;
50018
+ }
50019
+ continue;
50020
+ }
50021
+ if (current2 !== ours) continue;
50022
+ if (shipped === void 0) {
50023
+ deletes.push(rel);
50024
+ delete next4[rel];
50025
+ } else if (shipped !== ours) {
50026
+ writes.push(rel);
50027
+ next4[rel] = shipped;
50028
+ }
50029
+ }
50030
+ if (writes.length === 0 && deletes.length === 0) return next4;
50031
+ const staging = stagingDir(name);
50032
+ try {
50033
+ cpSync(dest, staging, { recursive: true });
50034
+ for (const rel of deletes) removeAndPrune(staging, rel);
50035
+ for (const rel of writes) {
50036
+ mkdirSync6(join14(staging, path2.dirname(rel)), { recursive: true });
50037
+ cpSync(join14(seed, rel), join14(staging, rel));
50038
+ }
50039
+ swapIn(staging, dest);
50040
+ } catch (err) {
50041
+ rmSync(staging, { recursive: true, force: true });
50042
+ throw err;
50043
+ }
50044
+ return next4;
50045
+ }
50046
+ function syncBuiltinBot(name, state) {
50047
+ if (!isBotName(name)) throw new Error(`"${name}" is not a valid built-in Bot name`);
50048
+ const dest = builtinBotUserDir(name);
50049
+ const seed = builtinBotSeedDir(name);
50050
+ if (!hasManifest(seed)) throw new Error(`no built-in Bot named "${name}"`);
50051
+ if (!hasManifest(dest)) {
50052
+ const seedFiles = fileHashes(seed);
50053
+ const staging = stagingDir(name);
50054
+ try {
50055
+ cpSync(seed, staging, { recursive: true });
50056
+ swapIn(staging, dest);
50057
+ } catch (err) {
50058
+ if (!hasManifest(dest)) throw err;
50059
+ }
50060
+ state[name] = { seed: treeHash(seedFiles), files: Object.fromEntries(seedFiles) };
50061
+ return { dir: dest, changed: true };
50062
+ }
50063
+ const record2 = state[name];
50064
+ if (!record2?.files) return { dir: dest, changed: false };
50065
+ const seedHash = treeHash(fileHashes(seed));
50066
+ if (record2.seed === seedHash) return { dir: dest, changed: false };
50067
+ if (existsSync8(join14(dest, ".locks", "write"))) return { dir: dest, changed: false };
50068
+ state[name] = { seed: seedHash, files: refreshInstalled(name, dest, record2.files) };
50069
+ return { dir: dest, changed: true };
50070
+ }
50071
+ var messageOf2 = (cause3) => cause3 instanceof Error ? cause3.message : String(cause3);
50072
+ function parseManifestIn(dir) {
50073
+ try {
50074
+ const content = readFileSync6(join14(dir, BOT_MANIFEST_FILE), "utf-8");
50075
+ return { ok: true, ...parseBotDocument(path2, content, dir) };
50076
+ } catch (err) {
50077
+ return { ok: false, error: messageOf2(err) };
50078
+ }
50079
+ }
50080
+ function builtinBotHome(name, state) {
50081
+ try {
50082
+ return { ...syncBuiltinBot(name, state), installed: true };
50083
+ } catch (err) {
50084
+ console.error(`[bots] cannot install builtin Bot "${name}" into ${BOTS_DIR} \u2014 using the read-only copy:`, err);
50085
+ return { dir: builtinBotSeedDir(name), installed: false, changed: false };
50086
+ }
50087
+ }
50088
+ function listBuiltinBots() {
50089
+ let dirs;
50090
+ try {
50091
+ dirs = readdirSync4(BUILTIN_BOTS_SRC_DIR, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name).sort();
50092
+ } catch (err) {
50093
+ const code = err?.code;
50094
+ if (code !== "ENOENT") {
50095
+ console.error(
50096
+ `[bots] cannot read builtin bots dir ${BUILTIN_BOTS_SRC_DIR} \u2014 all builtin Bots are unavailable:`,
50097
+ err
50098
+ );
50099
+ }
50100
+ return [];
50101
+ }
50102
+ const state = readInstallState();
50103
+ let stateChanged = false;
50104
+ const bots = [];
50105
+ for (const dir of dirs) {
50106
+ if (!hasManifest(builtinBotSeedDir(dir))) continue;
50107
+ if (!isBotName(dir)) {
50108
+ console.error(`[bots] builtin Bot directory "${dir}" is not a usable Bot name and was skipped`);
50109
+ continue;
50110
+ }
50111
+ if (!hasManifest(builtinBotUserDir(dir))) {
50112
+ const seed = parseManifestIn(builtinBotSeedDir(dir));
50113
+ if (!seed.ok) {
50114
+ console.error(`[bots] builtin Bot "${dir}" is not usable and was skipped: ${seed.error}`);
50115
+ continue;
50116
+ }
50117
+ }
50118
+ const { dir: home, installed, changed } = builtinBotHome(dir, state);
50119
+ stateChanged ||= changed;
50120
+ const manifest = parseManifestIn(home);
50121
+ const base = { id: `${BUILTIN_BOT_ID_PREFIX}${dir}`, path: home, addedAt: "", builtin: true };
50122
+ if (manifest.ok) {
50123
+ bots.push({ ...base, valid: true, name: manifest.name, description: manifest.description });
50124
+ } else if (installed) {
50125
+ bots.push({ ...base, valid: false, name: dir, error: manifest.error });
50126
+ } else {
50127
+ console.error(`[bots] builtin Bot "${dir}" became unreadable and was skipped: ${manifest.error}`);
50128
+ }
50129
+ }
50130
+ if (stateChanged) writeInstallState(state);
50131
+ return bots;
50132
+ }
50133
+ var realpathOr = (target) => {
50134
+ try {
50135
+ return realpathSync2.native(target);
50136
+ } catch {
50137
+ return target;
50138
+ }
50139
+ };
50140
+ function findBuiltinBotByPath(dir) {
50141
+ const target = realpathOr(dir);
50142
+ return listBuiltinBots().find((bot) => {
50143
+ const candidates = [bot.path, builtinBotSeedDir(builtinBotNameFromId(bot.id))];
50144
+ return candidates.some((candidate) => candidate === dir || realpathOr(candidate) === target);
50145
+ });
50146
+ }
50147
+
50148
+ // packages/feature/agent/src/effect/botRegistryLive.ts
50149
+ var EMPTY_REGISTRY = { bots: [] };
50150
+ var readRegistry = () => readJsonFileForUpdate(BOTS_FILE, EMPTY_REGISTRY);
50151
+ var readManifest = (manifestPath) => readFileSync7(manifestPath, "utf8");
50152
+ var resolveRegisteredBots = (registry3) => registry3.bots.map((record2) => resolveBot(path3, record2, readManifest));
50153
+ var invalidPath = (reason) => new ValidationError({ field: "path", reason });
50154
+ var fsReason = (what, target, cause3) => {
50155
+ const code = cause3?.code;
50156
+ if (!code || code === "ENOENT") return invalidPath(`${what} not found: ${target}`);
50157
+ const detail = cause3 instanceof Error ? cause3.message : String(cause3);
50158
+ return invalidPath(`cannot read ${target} (${code}): ${detail}`);
50159
+ };
50160
+ var mergeBuiltins = (registered) => {
50161
+ const builtins = listBuiltinBots();
50162
+ const builtinPaths = new Set(
50163
+ builtins.flatMap((bot) => [bot.path, builtinBotSeedDir(builtinBotNameFromId(bot.id))])
50164
+ );
50165
+ return [...builtins, ...registered.filter((bot) => !builtinPaths.has(bot.path))];
50166
+ };
50167
+ var listBots = Effect_exports.tryPromise({
50168
+ try: async () => mergeBuiltins(resolveRegisteredBots(await readRegistry())),
50169
+ catch: (cause3) => new FSError({ path: BOTS_FILE, op: "read", cause: cause3 })
50170
+ });
50171
+ var addBot = (inputPath) => Effect_exports.gen(function* () {
50172
+ const trimmed = inputPath.trim();
50173
+ if (!trimmed) return yield* Effect_exports.fail(invalidPath("missing"));
50174
+ if (!path3.isAbsolute(trimmed)) return yield* Effect_exports.fail(invalidPath("must be absolute"));
50175
+ const requested = botPaths(path3, trimmed).dir;
50176
+ const dir = yield* Effect_exports.try({
50177
+ try: () => realpathSync3.native(requested),
50178
+ catch: (cause3) => fsReason("directory", requested, cause3)
50179
+ });
50180
+ const builtin = findBuiltinBotByPath(dir);
50181
+ if (builtin) return { ...builtin, alreadyExists: true };
50182
+ const manifestPath = botPaths(path3, dir).manifest;
50183
+ const content = yield* Effect_exports.try({
50184
+ try: () => readManifest(manifestPath),
50185
+ catch: (cause3) => fsReason("BOT.md", manifestPath, cause3)
50186
+ });
50187
+ const manifest = yield* Effect_exports.try({
50188
+ try: () => parseBotDocument(path3, content, dir),
50189
+ catch: (cause3) => invalidPath(cause3 instanceof Error ? cause3.message : String(cause3))
50190
+ });
50191
+ const outcome = yield* Effect_exports.tryPromise({
50192
+ try: () => withFileLock(BOTS_FILE, async () => {
50193
+ const registry3 = await readRegistry();
50194
+ const existing = registry3.bots.find((bot) => bot.path === dir);
50195
+ if (existing) return { kind: "existing", bot: resolveBot(path3, existing, readManifest) };
50196
+ const clash = findNameClash(mergeBuiltins(resolveRegisteredBots(registry3)), manifest.name, dir);
50197
+ if (clash) return { kind: "clash", bot: clash };
50198
+ const record2 = { id: `bot-${randomUUID5()}`, path: dir, addedAt: (/* @__PURE__ */ new Date()).toISOString() };
50199
+ await writeJsonFile(BOTS_FILE, { bots: [...registry3.bots, record2] });
50200
+ return { kind: "added", record: record2 };
50201
+ }),
50202
+ catch: (cause3) => new FSError({ path: BOTS_FILE, op: "write", cause: cause3 })
50203
+ });
50204
+ switch (outcome.kind) {
50205
+ case "existing":
50206
+ return { ...outcome.bot, alreadyExists: true };
50207
+ case "clash":
50208
+ return yield* Effect_exports.fail(invalidPath(`@${manifest.name} is already registered at ${outcome.bot.path}`));
50209
+ case "added":
50210
+ return { ...outcome.record, valid: true, ...manifest, alreadyExists: false };
50211
+ }
50212
+ });
50213
+ var removeBot = (id3) => Effect_exports.gen(function* () {
50214
+ if (isBuiltinBotId(id3)) {
50215
+ return yield* Effect_exports.fail(new ValidationError({ field: "id", reason: "built-in Bots cannot be removed" }));
50216
+ }
50217
+ const removed = yield* Effect_exports.tryPromise({
50218
+ try: () => withFileLock(BOTS_FILE, async () => {
50219
+ const registry3 = await readRegistry();
50220
+ if (!registry3.bots.some((bot) => bot.id === id3)) return false;
50221
+ await writeJsonFile(BOTS_FILE, { bots: registry3.bots.filter((bot) => bot.id !== id3) });
50222
+ return true;
50223
+ }),
50224
+ catch: (cause3) => new FSError({ path: BOTS_FILE, op: "write", cause: cause3 })
50225
+ });
50226
+ if (!removed) return yield* Effect_exports.fail(new NotFoundError({ resource: "bot", id: id3 }));
50227
+ });
50228
+ var BotRegistryServiceLive = Layer_exports.succeed(BotRegistryService, {
50229
+ list: listBots,
50230
+ add: addBot,
50231
+ remove: removeBot
50232
+ });
50233
+
49814
50234
  // packages/shared/effect-runtime/src/server/runtime.ts
49815
50235
  var isDev = process.env.COCKPIT_ENV === "dev";
49816
50236
  var ServerBaseLayer = Layer_exports.unwrapEffect(
@@ -49840,7 +50260,9 @@ var AppLayer = Layer_exports.mergeAll(
49840
50260
  // Cross-project session search (/api/sessions/search)
49841
50261
  SessionSearchServiceLive,
49842
50262
  // Fire-and-forget sub-task sessions + session status (/api/sessions/delegate, /status)
49843
- DelegationServiceLive
50263
+ DelegationServiceLive,
50264
+ // User-registered Bot directories (bot.json)
50265
+ BotRegistryServiceLive
49844
50266
  );
49845
50267
  var AppRuntime = ManagedRuntime_exports.make(AppLayer);
49846
50268
 
@@ -49947,16 +50369,16 @@ function snapshotOnRunEvent(cwd, sessionKey, provider, event) {
49947
50369
  }
49948
50370
 
49949
50371
  // packages/feature/agent/src/server/lib/slashCommands.ts
49950
- import { mkdirSync as mkdirSync6, writeFileSync as writeFileSync6, readFileSync as readFileSync7 } from "fs";
49951
- import { join as join15 } from "path";
50372
+ import { mkdirSync as mkdirSync7, writeFileSync as writeFileSync7, readFileSync as readFileSync9 } from "fs";
50373
+ import path4, { join as join16 } from "path";
49952
50374
 
49953
50375
  // packages/feature/agent/src/server/lib/builtinSkills.ts
49954
- import { readFileSync as readFileSync6, readdirSync as readdirSync4, statSync as statSync5 } from "fs";
49955
- import { join as join14 } from "path";
50376
+ import { readFileSync as readFileSync8, readdirSync as readdirSync5, statSync as statSync6 } from "fs";
50377
+ import { join as join15 } from "path";
49956
50378
  function listBuiltinSkillNames() {
49957
50379
  let entries2;
49958
50380
  try {
49959
- entries2 = readdirSync4(BUILTIN_SKILLS_SRC_DIR, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
50381
+ entries2 = readdirSync5(BUILTIN_SKILLS_SRC_DIR, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
49960
50382
  } catch (err) {
49961
50383
  console.error(
49962
50384
  `[skills] cannot read builtin skills dir ${BUILTIN_SKILLS_SRC_DIR} \u2014 all builtin slash commands are unavailable:`,
@@ -49966,18 +50388,32 @@ function listBuiltinSkillNames() {
49966
50388
  }
49967
50389
  return entries2.filter((name) => {
49968
50390
  try {
49969
- return statSync5(builtinSkillPath(name)).isFile();
50391
+ return statSync6(builtinSkillPath(name)).isFile();
49970
50392
  } catch {
49971
50393
  return false;
49972
50394
  }
49973
50395
  }).sort();
49974
50396
  }
49975
50397
  function builtinSkillPath(name) {
49976
- return join14(BUILTIN_SKILLS_SRC_DIR, name, "SKILL.md");
50398
+ return join15(BUILTIN_SKILLS_SRC_DIR, name, "SKILL.md");
50399
+ }
50400
+ function listBuiltinSkillExtras(name) {
50401
+ try {
50402
+ return readdirSync5(join15(BUILTIN_SKILLS_SRC_DIR, name), { withFileTypes: true }).filter((e) => e.isFile() && e.name.endsWith(".md") && e.name !== "SKILL.md").map((e) => e.name).sort();
50403
+ } catch {
50404
+ return [];
50405
+ }
50406
+ }
50407
+ function readBuiltinSkillExtra(name, file2) {
50408
+ try {
50409
+ return readFileSync8(join15(BUILTIN_SKILLS_SRC_DIR, name, file2), "utf-8");
50410
+ } catch {
50411
+ return null;
50412
+ }
49977
50413
  }
49978
50414
  function readBuiltinSkill(name) {
49979
50415
  try {
49980
- return readFileSync6(builtinSkillPath(name), "utf-8");
50416
+ return readFileSync8(builtinSkillPath(name), "utf-8");
49981
50417
  } catch {
49982
50418
  return null;
49983
50419
  }
@@ -49990,27 +50426,39 @@ function readFrontmatterField(text, field) {
49990
50426
  }
49991
50427
 
49992
50428
  // packages/feature/agent/src/server/lib/slashCommands.ts
49993
- var BUILTIN_SKILLS_OUT_DIR = join15(COCKPIT_DIR, "skills");
50429
+ var BUILTIN_SKILLS_OUT_DIR = join16(COCKPIT_DIR, "skills");
49994
50430
  function deriveBaseUrl() {
49995
50431
  const port3 = process.env.COCKPIT_PORT || process.env.PORT || "3457";
49996
50432
  return `http://localhost:${port3}`;
49997
50433
  }
49998
- var COMMAND_LINE_RE = /^\s*([/@])(\S+?)(?:\s+|$)/;
50434
+ var COMMAND_LINE_RE = /^\s*(\/@|\/|@)(\S+?)(?:\s+|$)/;
49999
50435
  function resolveCommandPrompt(prompt, language = "en", _req) {
50000
50436
  const lang = language.startsWith("zh") ? "zh" : "en";
50001
50437
  const userSkills = listUserSkills();
50002
50438
  const builtins = new Set(listBuiltinSkillNames());
50003
- const isKnown = (cmd) => builtins.has(cmd) || userSkills.some((s) => s.name === cmd);
50439
+ const { bots, corrupt: registryCorrupt } = listRegisteredBots();
50440
+ const isKnown = (marker, cmd) => marker === "@" ? bots.has(cmd) : builtins.has(cmd) || userSkills.some((s) => s.name === cmd);
50441
+ const unresolved = [];
50004
50442
  const lines = prompt.split("\n");
50005
50443
  const cmds = [];
50006
50444
  lines.forEach((line, i) => {
50007
50445
  const m = line.match(COMMAND_LINE_RE);
50008
- if (m && isKnown(m[2])) {
50009
- cmds.push({ i, marker: m[1], cmd: m[2], rest: line.slice(m[0].length).trim() });
50446
+ if (!m) return;
50447
+ const marker = m[1];
50448
+ if (isKnown(marker, m[2])) {
50449
+ cmds.push({ i, marker, cmd: m[2], rest: line.slice(m[0].length).trim() });
50450
+ return;
50451
+ }
50452
+ if (marker !== "@") return;
50453
+ if (builtins.has(m[2]) || userSkills.some((s) => s.name === m[2])) {
50454
+ console.warn(`[skills] "@${m[2]}" is not a registered Bot; the subagent form is now "/@${m[2]}" \u2014 left as plain text`);
50455
+ unresolved.push(`@${m[2]} \u2192 the subagent form for a skill is now /@${m[2]}`);
50456
+ } else if (registryCorrupt) {
50457
+ unresolved.push(`@${m[2]} \u2192 could not be resolved: ${BOTS_FILE} does not parse`);
50010
50458
  }
50011
50459
  });
50012
- if (cmds.length === 0) return prompt;
50013
- const showLocus = cmds.length >= 2 || cmds.some((c) => c.marker === "@");
50460
+ if (cmds.length === 0) return appendUnresolvedNote(prompt, unresolved, lang);
50461
+ const showLocus = cmds.length >= 2 || cmds.some((c) => c.marker !== "/");
50014
50462
  const baseUrl = deriveBaseUrl();
50015
50463
  const rendered = /* @__PURE__ */ new Map();
50016
50464
  const consumed = /* @__PURE__ */ new Set();
@@ -50025,29 +50473,58 @@ function resolveCommandPrompt(prompt, language = "en", _req) {
50025
50473
  bodyLines.push(lines[j].trim());
50026
50474
  consumed.add(j);
50027
50475
  }
50028
- const ref = resolveSkillRef(c.cmd, baseUrl, userSkills);
50476
+ const ref = c.marker === "@" ? { name: `@${c.cmd}`, path: bots.get(c.cmd), content: null } : resolveSkillRef(c.cmd, baseUrl, userSkills);
50029
50477
  rendered.set(c.i, renderCommandLine(c.marker, ref, bodyLines.join("\n"), lang, showLocus));
50030
50478
  if (ref.path && !seen.has(ref.name)) {
50031
50479
  seen.add(ref.name);
50032
- listed.push({ name: ref.name, path: ref.path });
50480
+ listed.push({ name: ref.name, path: ref.path, kind: c.marker === "@" ? "handoff" : "read" });
50033
50481
  }
50034
50482
  });
50483
+ let botRunInline = null;
50484
+ if (cmds.some((c) => c.marker === "@")) {
50485
+ const run6 = resolveSkillRef("bot-run", baseUrl, userSkills);
50486
+ if (run6.path && !seen.has(run6.name)) {
50487
+ seen.add(run6.name);
50488
+ listed.push({ name: run6.name, path: run6.path, kind: "read" });
50489
+ } else if (!run6.path) {
50490
+ botRunInline = run6.content;
50491
+ }
50492
+ const turn = resolveSkillRef("bot-turn", baseUrl, userSkills);
50493
+ if (turn.path && !seen.has(turn.name)) {
50494
+ seen.add(turn.name);
50495
+ listed.unshift({ name: turn.name, path: turn.path, kind: "handoff" });
50496
+ }
50497
+ }
50035
50498
  const out = [];
50036
50499
  for (let i = 0; i < lines.length; i++) {
50037
50500
  if (consumed.has(i)) continue;
50038
50501
  out.push(rendered.get(i) ?? lines[i]);
50039
50502
  }
50040
50503
  let result = out.join("\n");
50041
- if (listed.length > 0) {
50042
- const header = lang === "zh" ? "\u8BF7\u5148\u8BFB\u53D6\u4EE5\u4E0B skill \u6587\u4EF6\uFF0C\u518D\u636E\u6B64\u6267\u884C\uFF1A" : "Read these skill files first, then act accordingly:";
50504
+ const block = (kind, header) => {
50505
+ const items = listed.filter((s) => s.kind === kind);
50506
+ if (items.length === 0) return null;
50043
50507
  const sep2 = lang === "zh" ? "\uFF1A" : ": ";
50044
- const entries2 = listed.map((s) => `- ${s.name}${sep2}${s.path}`).join("\n");
50045
- result = `${result}
50508
+ return `${header}
50509
+ ${items.map((s) => `- ${s.name}${sep2}${s.path}`).join("\n")}`;
50510
+ };
50511
+ const blocks = [
50512
+ block("read", lang === "zh" ? "\u8BF7\u5148\u8BFB\u53D6\u4EE5\u4E0B skill \u6587\u4EF6\uFF0C\u518D\u636E\u6B64\u6267\u884C\uFF1A" : "Read these skill files first, then act accordingly:"),
50513
+ block("handoff", lang === "zh" ? "\u4EE5\u4E0B\u6587\u4EF6\u4EA4\u7ED9\u4F60\u6D3E\u53D1\u7684\u5B50\u4F1A\u8BDD\u53BB\u8BFB\uFF0C\u4F60\u53EA\u8F6C\u4EA4\u8DEF\u5F84\uFF0C\u4E0D\u8981\u81EA\u5DF1\u6253\u5F00\uFF1A" : "These files are for the session you delegate to. Pass the paths along; do not open them yourself:"),
50514
+ botRunInline
50515
+ ].filter((b) => b !== null);
50516
+ if (blocks.length > 0) result = `${result}
50517
+
50518
+ ${blocks.join("\n\n")}`;
50519
+ return appendUnresolvedNote(result, unresolved, lang);
50520
+ }
50521
+ function appendUnresolvedNote(result, unresolved, lang) {
50522
+ if (unresolved.length === 0) return result;
50523
+ const header = lang === "zh" ? "\u4EE5\u4E0B @ \u5F00\u5934\u7684\u884C\u6CA1\u6709\u88AB\u8BC6\u522B\uFF0C\u5DF2\u6309\u666E\u901A\u6587\u672C\u5904\u7406\uFF0C\u8BF7\u544A\u77E5\u7528\u6237\uFF1A" : "These @ lines were not recognised and were left as plain text. Tell the user:";
50524
+ return `${result}
50046
50525
 
50047
50526
  ${header}
50048
- ${entries2}`;
50049
- }
50050
- return result;
50527
+ ${unresolved.map((u) => `- ${u}`).join("\n")}`;
50051
50528
  }
50052
50529
  function renderCommandLine(marker, ref, body, lang, showLocus) {
50053
50530
  if (ref.path) {
@@ -50059,7 +50536,7 @@ function renderCommandLine(marker, ref, body, lang, showLocus) {
50059
50536
  return `${locus}${ref.content ?? ""}${then}`;
50060
50537
  }
50061
50538
  function locusWord(marker, lang) {
50062
- if (marker === "@") return "subagent";
50539
+ if (marker !== "/") return "subagent";
50063
50540
  return lang === "zh" ? "\u4E3B\u4F1A\u8BDD" : "main session";
50064
50541
  }
50065
50542
  function resolveSkillRef(cmd, baseUrl, userSkills) {
@@ -50070,13 +50547,13 @@ function resolveSkillRef(cmd, baseUrl, userSkills) {
50070
50547
  console.error(`[skills] builtin "${cmd}" disappeared while resolving it`);
50071
50548
  return { name: cmd, path: null, content: null };
50072
50549
  }
50073
- const content = source.replaceAll("{{BASE_URL}}", baseUrl);
50074
- const skillPath = writeBuiltinSkill(cmd, content);
50550
+ const content = substitute(source, baseUrl);
50551
+ const skillPath = writeBuiltinSkill(cmd, content, baseUrl);
50075
50552
  return skillPath ? { name: cmd, path: skillPath, content: null } : { name: cmd, path: null, content };
50076
50553
  }
50077
50554
  function listUserSkills() {
50078
50555
  try {
50079
- const data = JSON.parse(readFileSync7(SKILLS_FILE, "utf-8"));
50556
+ const data = JSON.parse(readFileSync9(SKILLS_FILE, "utf-8"));
50080
50557
  const out = [];
50081
50558
  for (const s of data.skills ?? []) {
50082
50559
  const name = readSkillName(s.path);
@@ -50087,28 +50564,58 @@ function listUserSkills() {
50087
50564
  return [];
50088
50565
  }
50089
50566
  }
50090
- function readSkillName(path2) {
50567
+ function listRegisteredBots() {
50568
+ const builtins = listBuiltinBots();
50569
+ const withBuiltins = (registered) => mentionableBots(path4, [...builtins, ...registered]);
50570
+ let raw;
50091
50571
  try {
50092
- return readFrontmatterField(readFileSync7(path2, "utf-8"), "name");
50572
+ raw = readFileSync9(BOTS_FILE, "utf-8");
50573
+ } catch {
50574
+ return { bots: withBuiltins([]), corrupt: false };
50575
+ }
50576
+ try {
50577
+ const data = JSON.parse(raw);
50578
+ const read = (manifest) => readFileSync9(manifest, "utf-8");
50579
+ return { bots: withBuiltins((data.bots ?? []).map((r) => resolveBot(path4, r, read))), corrupt: false };
50580
+ } catch (err) {
50581
+ console.error(`[skills] ${BOTS_FILE} does not parse \u2014 every registered @bot line is left as plain text:`, err);
50582
+ return { bots: withBuiltins([]), corrupt: true };
50583
+ }
50584
+ }
50585
+ function readSkillName(path5) {
50586
+ try {
50587
+ return readFrontmatterField(readFileSync9(path5, "utf-8"), "name");
50093
50588
  } catch {
50094
50589
  return null;
50095
50590
  }
50096
50591
  }
50097
- function writeBuiltinSkill(cmd, content) {
50592
+ function writeBuiltinSkill(cmd, content, baseUrl) {
50098
50593
  try {
50099
- const dir = join15(BUILTIN_SKILLS_OUT_DIR, cmd);
50100
- mkdirSync6(dir, { recursive: true });
50101
- const filePath = join15(dir, "SKILL.md");
50102
- writeFileSync6(filePath, content.endsWith("\n") ? content : `${content}
50594
+ const dir = join16(BUILTIN_SKILLS_OUT_DIR, cmd);
50595
+ mkdirSync7(dir, { recursive: true });
50596
+ const filePath = join16(dir, "SKILL.md");
50597
+ writeFileSync7(filePath, content.endsWith("\n") ? content : `${content}
50103
50598
  `, "utf-8");
50599
+ for (const file2 of listBuiltinSkillExtras(cmd)) {
50600
+ const extra = readBuiltinSkillExtra(cmd, file2);
50601
+ if (extra === null) continue;
50602
+ try {
50603
+ writeFileSync7(join16(dir, file2), substitute(extra, baseUrl), "utf-8");
50604
+ } catch (err) {
50605
+ console.error(`[skills] builtin "${cmd}": cannot write reference file ${file2}:`, err);
50606
+ }
50607
+ }
50104
50608
  return filePath;
50105
50609
  } catch {
50106
50610
  return null;
50107
50611
  }
50108
50612
  }
50613
+ function substitute(text, baseUrl) {
50614
+ return text.replaceAll("{{BASE_URL}}", baseUrl).replaceAll("{{COCKPIT_DIR}}", COCKPIT_DIR);
50615
+ }
50109
50616
 
50110
50617
  // packages/feature/agent/src/server/engines/orchestrator.ts
50111
- import { randomUUID as randomUUID5 } from "crypto";
50618
+ import { randomUUID as randomUUID6 } from "crypto";
50112
50619
  async function dispatchChat2(spec, body, request2) {
50113
50620
  const { sessionId, images, cwd, language } = body;
50114
50621
  if (sessionId && isRunActive(sessionId)) {
@@ -50126,7 +50633,7 @@ async function dispatchChat2(spec, body, request2) {
50126
50633
  }
50127
50634
  const promptText = typeof prompt === "string" ? prompt : void 0;
50128
50635
  const abort = new AbortController();
50129
- const runId = typeof body.runId === "string" && body.runId || randomUUID5();
50636
+ const runId = typeof body.runId === "string" && body.runId || randomUUID6();
50130
50637
  let currentKey = sessionId || runId;
50131
50638
  let actualSessionId = sessionId;
50132
50639
  let isClosed = false;
@@ -50231,6 +50738,7 @@ export {
50231
50738
  findCodexSessionPath,
50232
50739
  ensureParentDir,
50233
50740
  readJsonFile,
50741
+ readJsonFileForUpdate,
50234
50742
  writeJsonFile,
50235
50743
  withFileLock,
50236
50744
  mutateJsonFile,